diff --git a/bin/docs/assets/v0.63.6/app-dist/share.js b/bin/docs/assets/v0.63.6/app-dist/share.js new file mode 100644 index 000000000..03ad92515 --- /dev/null +++ b/bin/docs/assets/v0.63.6/app-dist/share.js @@ -0,0 +1,23 @@ +/** + * Fetch note with given ID from backend + * + * @param noteId of the given note to be fetched. If false, fetches current note. + */ +async function fetchNote(noteId = null) { + if (!noteId) { + noteId = document.body.getAttribute("data-note-id"); + } + + const resp = await fetch(`api/notes/${noteId}`); + + return await resp.json(); +} + +document.addEventListener('DOMContentLoaded', () => { + const toggleMenuButton = document.getElementById('toggleMenuButton'); + const layout = document.getElementById('layout'); + + if (toggleMenuButton && layout) { + toggleMenuButton.addEventListener('click', () => layout.classList.toggle('showMenu')); + } +}, false); diff --git a/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css b/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css new file mode 100644 index 000000000..47274e5f4 --- /dev/null +++ b/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css @@ -0,0 +1,551 @@ +/* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */ + +.printed-content .ck-widget__selection-handle, .printed-content .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */ + display: none; +} + +/* + * CKEditor 5 (v41.0.0) content styles. + * Generated on Fri, 26 Jan 2024 10:23:49 GMT. + * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html + */ + +:root { + --ck-color-image-caption-background: hsl(0, 0%, 97%); + --ck-color-image-caption-text: hsl(0, 0%, 20%); + --ck-color-mention-background: hsla(341, 100%, 30%, 0.1); + --ck-color-mention-text: hsl(341, 100%, 30%); + --ck-color-selector-caption-background: hsl(0, 0%, 97%); + --ck-color-selector-caption-text: hsl(0, 0%, 20%); + --ck-highlight-marker-blue: hsl(201, 97%, 72%); + --ck-highlight-marker-green: hsl(120, 93%, 68%); + --ck-highlight-marker-pink: hsl(345, 96%, 73%); + --ck-highlight-marker-yellow: hsl(60, 97%, 73%); + --ck-highlight-pen-green: hsl(112, 100%, 27%); + --ck-highlight-pen-red: hsl(0, 85%, 49%); + --ck-image-style-spacing: 1.5em; + --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2); + --ck-todo-list-checkmark-size: 16px; +} + +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table .ck-table-resized { + table-layout: fixed; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table table { + overflow: hidden; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table td, +.ck-content .table th { + overflow-wrap: break-word; + position: relative; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table { + margin: 0.9em auto; + display: table; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table { + border-collapse: collapse; + border-spacing: 0; + width: 100%; + height: 100%; + border: 1px double hsl(0, 0%, 70%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table td, +.ck-content .table table th { + min-width: 2em; + padding: .4em; + border: 1px solid hsl(0, 0%, 75%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table th { + font-weight: bold; + background: hsla(0, 0%, 0%, 5%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content[dir="rtl"] .table th { + text-align: right; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content[dir="ltr"] .table th { + text-align: left; +} +/* @ckeditor/ckeditor5-table/theme/tablecaption.css */ +.ck-content .table > figcaption { + display: table-caption; + caption-side: top; + word-break: break-word; + text-align: center; + color: var(--ck-color-selector-caption-text); + background-color: var(--ck-color-selector-caption-background); + padding: .6em; + font-size: .75em; + outline-offset: -1px; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break { + position: relative; + clear: both; + padding: 5px 0; + display: flex; + align-items: center; + justify-content: center; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break::after { + content: ''; + position: absolute; + border-bottom: 2px dashed hsl(0, 0%, 77%); + width: 100%; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break__label { + position: relative; + z-index: 1; + padding: .3em .6em; + display: block; + text-transform: uppercase; + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif; + font-size: 0.75em; + font-weight: bold; + color: hsl(0, 0%, 20%); + background: hsl(0, 0%, 100%); + box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */ +.ck-content .media { + clear: both; + margin: 0.9em 0; + display: block; + min-width: 15em; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list { + list-style: none; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li { + position: relative; + margin-bottom: 5px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li .todo-list { + margin-top: 5px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input { + -webkit-appearance: none; + display: inline-block; + position: relative; + width: var(--ck-todo-list-checkmark-size); + height: var(--ck-todo-list-checkmark-size); + vertical-align: middle; + border: 0; + left: -25px; + margin-right: -15px; + right: 0; + margin-left: 0; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content[dir=rtl] .todo-list .todo-list__label > input { + left: 0; + margin-right: 0; + right: -25px; + margin-left: -15px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::before { + display: block; + position: absolute; + box-sizing: border-box; + content: ''; + width: 100%; + height: 100%; + border: 1px solid hsl(0, 0%, 20%); + border-radius: 2px; + transition: 250ms ease-in-out box-shadow; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::after { + display: block; + position: absolute; + box-sizing: content-box; + pointer-events: none; + content: ''; + left: calc( var(--ck-todo-list-checkmark-size) / 3 ); + top: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + width: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + height: calc( var(--ck-todo-list-checkmark-size) / 2.6 ); + border-style: solid; + border-color: transparent; + border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0; + transform: rotate(45deg); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::before { + background: hsl(126, 64%, 41%); + border-color: hsl(126, 64%, 41%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::after { + border-color: hsl(0, 0%, 100%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label .todo-list__label__description { + vertical-align: middle; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] { + position: absolute; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > input, +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input { + cursor: pointer; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > input:hover::before, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input:hover::before { + box-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input { + -webkit-appearance: none; + display: inline-block; + position: relative; + width: var(--ck-todo-list-checkmark-size); + height: var(--ck-todo-list-checkmark-size); + vertical-align: middle; + border: 0; + left: -25px; + margin-right: -15px; + right: 0; + margin-left: 0; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label > span[contenteditable=false] > input { + left: 0; + margin-right: 0; + right: -25px; + margin-left: -15px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::before { + display: block; + position: absolute; + box-sizing: border-box; + content: ''; + width: 100%; + height: 100%; + border: 1px solid hsl(0, 0%, 20%); + border-radius: 2px; + transition: 250ms ease-in-out box-shadow; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::after { + display: block; + position: absolute; + box-sizing: content-box; + pointer-events: none; + content: ''; + left: calc( var(--ck-todo-list-checkmark-size) / 3 ); + top: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + width: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + height: calc( var(--ck-todo-list-checkmark-size) / 2.6 ); + border-style: solid; + border-color: transparent; + border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0; + transform: rotate(45deg); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::before { + background: hsl(126, 64%, 41%); + border-color: hsl(126, 64%, 41%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::after { + border-color: hsl(0, 0%, 100%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] { + position: absolute; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol { + list-style-type: decimal; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol { + list-style-type: lower-latin; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol { + list-style-type: lower-roman; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol ol { + list-style-type: upper-latin; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol ol ol { + list-style-type: upper-roman; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul { + list-style-type: disc; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul { + list-style-type: circle; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul ul { + list-style-type: square; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul ul ul { + list-style-type: square; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image { + display: table; + clear: both; + text-align: center; + margin: 0.9em auto; + min-width: 50px; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image img { + display: block; + margin: 0 auto; + max-width: 100%; + min-width: 100%; + height: auto; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline { + /* + * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).; + * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root. + * This strange behavior does not happen with inline-flex. + */ + display: inline-flex; + max-width: 100%; + align-items: flex-start; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline picture { + display: flex; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline picture, +.ck-content .image-inline img { + flex-grow: 1; + flex-shrink: 1; + max-width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content img.image_resized { + height: auto; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized { + max-width: 100%; + display: block; + box-sizing: border-box; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized img { + width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized > figcaption { + display: block; +} +/* @ckeditor/ckeditor5-image/theme/imagecaption.css */ +.ck-content .image > figcaption { + display: table-caption; + caption-side: bottom; + word-break: break-word; + color: var(--ck-color-image-caption-text); + background-color: var(--ck-color-image-caption-background); + padding: .6em; + font-size: .75em; + outline-offset: -1px; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-left, +.ck-content .image-style-block-align-right { + max-width: calc(100% - var(--ck-image-style-spacing)); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left, +.ck-content .image-style-align-right { + clear: none; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-side { + float: right; + margin-left: var(--ck-image-style-spacing); + max-width: 50%; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left { + float: left; + margin-right: var(--ck-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-center { + margin-left: auto; + margin-right: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-right { + float: right; + margin-left: var(--ck-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-right { + margin-right: 0; + margin-left: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-left { + margin-left: 0; + margin-right: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content p + .image-style-align-left, +.ck-content p + .image-style-align-right, +.ck-content p + .image-style-side { + margin-top: 0; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-left, +.ck-content .image-inline.image-style-align-right { + margin-top: var(--ck-inline-image-style-spacing); + margin-bottom: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-left { + margin-right: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-right { + margin-left: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-yellow { + background-color: var(--ck-highlight-marker-yellow); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-green { + background-color: var(--ck-highlight-marker-green); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-pink { + background-color: var(--ck-highlight-marker-pink); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-blue { + background-color: var(--ck-highlight-marker-blue); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-red { + color: var(--ck-highlight-pen-red); + background-color: transparent; +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-green { + color: var(--ck-highlight-pen-green); + background-color: transparent; +} +/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */ +.ck-content blockquote { + overflow: hidden; + padding-right: 1.5em; + padding-left: 1.5em; + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} +/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */ +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} +/* @ckeditor/ckeditor5-basic-styles/theme/code.css */ +.ck-content code { + background-color: hsla(0, 0%, 78%, 0.3); + padding: .15em; + border-radius: 2px; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-tiny { + font-size: .7em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-small { + font-size: .85em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-big { + font-size: 1.4em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-huge { + font-size: 1.8em; +} +/* @ckeditor/ckeditor5-mention/theme/mention.css */ +.ck-content .mention { + background: var(--ck-color-mention-background); + color: var(--ck-color-mention-text); +} +/* @ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css */ +.ck-content hr { + margin: 15px 0; + height: 4px; + background: hsl(0, 0%, 87%); + border: 0; +} +/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre { + padding: 1em; + color: hsl(0, 0%, 20.8%); + background: hsla(0, 0%, 78%, 0.3); + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + text-align: left; + direction: ltr; + tab-size: 4; + white-space: pre-wrap; + font-style: normal; + min-width: 200px; +} +/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre code { + background: unset; + padding: 0; + border-radius: 0; +} +@media print { + /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break { + padding: 0; + } + /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break::after { + display: none; + } +} diff --git a/bin/docs/assets/v0.63.6/libraries/normalize.min.css b/bin/docs/assets/v0.63.6/libraries/normalize.min.css new file mode 100644 index 000000000..87aa24dc5 --- /dev/null +++ b/bin/docs/assets/v0.63.6/libraries/normalize.min.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} +/*# sourceMappingURL=normalize.min.css.map */ \ No newline at end of file diff --git a/bin/docs/assets/v0.63.6/stylesheets/share.css b/bin/docs/assets/v0.63.6/stylesheets/share.css new file mode 100644 index 000000000..718f8594c --- /dev/null +++ b/bin/docs/assets/v0.63.6/stylesheets/share.css @@ -0,0 +1,165 @@ +body { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; + line-height: 1.5; +} + +#layout { + max-width: 1200px; + margin: 0 auto; + display: flex; + flex-direction: row-reverse; +} + +#menu { + padding: 25px; + flex-basis: 0; + flex-grow: 1; + overflow: auto; +} + +#menu p { + margin: 0; +} + +#menu > p { + font-weight: bold; + font-size: 110%; +} + +#menu ul { + padding-left: 20px; +} + +#main { + flex-basis: 0; + flex-grow: 3; + overflow: auto; + padding: 10px 20px 20px 20px; +} + +#parentLink { + float: right; + margin-top: 20px; +} + +#title { + margin: 0; + padding-top: 10px; +} + +img { + max-width: 100%; +} + +pre { + white-space: pre-wrap; + word-wrap: anywhere; +} + +iframe.pdf-view { + width: 100%; + height: 800px; +} + +#toggleMenuButton { + display: none; + position: fixed; + top: 8px; + left: 5px; + width: 1.4em; + border-radius: 5px; + border: 1px solid #aaa; + font-size: 2rem; + z-index: 10; + height: auto; + color: black; + cursor: pointer; +} + +#childLinks.grid ul { + list-style-type: none; + display: flex; + flex-wrap: wrap; + padding: 0; +} + +#childLinks.grid ul li { + width: 180px; + height: 140px; + padding: 10px; +} + +#childLinks.grid ul li a { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + border: 1px solid #ddd; + border-radius: 5px; + justify-content: center; + align-content: center; + text-align: center; + font-size: large; +} + +#childLinks.grid ul li a:hover { + background: #eee; +} + +#childLinks.list ul { + list-style-type: none; + display: inline-flex; + flex-wrap: wrap; + padding: 0; + margin-top: 5px; +} + +#childLinks.list ul li { + margin-right: 20px; +} + +#noteClippedFrom { + padding: 10px 0 10px 0; + margin: 20px 0 20px 0; + color: #666; + border: 1px solid #ddd; + border-left: 0; + border-right: 0; +} + +#toggleMenuButton::after { + position: relative; + top: -2px; + left: 1px; +} + +@media (max-width: 48em) { + #layout.showMenu #menu { + display: block; + margin-top: 40px; + } + + #toggleMenuButton { + display: block; + } + + #layout.showMenu #main { + display: none; + } + + #title { + padding-left: 60px; + } + + #layout.showMenu #toggleMenuButton::after { + content: "«"; + } + + #toggleMenuButton::after { + content: "»"; + } + + #menu { + display: none; + } +} diff --git a/docs/3jc1nUXyteo0.html b/docs/3jc1nUXyteo0.html new file mode 100644 index 000000000..09753b687 --- /dev/null +++ b/docs/3jc1nUXyteo0.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Themes + + +
+
+ + + + +

Themes

+ + + + +
+

Server-side

  • There are two themes embedded in the application:
    • light, located in src\public\stylesheets\theme-light.css
    • dark, located in src\public\stylesheets\theme-dark.css
  • The default theme is set only once, when the database is created and is managed by options_init#initNotSyncedOptions.
    • On Electron, the choice between light and dark is done based on the OS preference.
    • Otherwise, the theme is always dark.
  • The theme is served via src\routes\index.ts, in the getThemeCssUrl method.

Client-side

  • The two predefined themes are hard-coded in the client in src\public\app\widgets\type_widgets\options\appearance\theme.js.
  • The user-defined themes are obtained via a call to the server: options/user-themes.
  • The theme retrieval is done via a request
+
+ + + +
+ + + + + + +
+ + diff --git a/docs/4yYHqKbLovVX.html b/docs/4yYHqKbLovVX.html index f2fb532a9..e75e6d9fd 100644 --- a/docs/4yYHqKbLovVX.html +++ b/docs/4yYHqKbLovVX.html @@ -40,13 +40,28 @@ @@ -76,20 +91,6 @@ - Internationalisation - -

- - - - - -
  • - -

    - - - Dependency Management

    @@ -109,6 +110,360 @@ +
  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/B8hxg4e66cVL.html b/docs/B8hxg4e66cVL.html new file mode 100644 index 000000000..a87867176 --- /dev/null +++ b/docs/B8hxg4e66cVL.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + Development and architecture + + +
    +
    + + + + +

    Development and architecture

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/BhE2WFknKKHG.html b/docs/BhE2WFknKKHG.html new file mode 100644 index 000000000..951da8d88 --- /dev/null +++ b/docs/BhE2WFknKKHG.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Main + + +
    +
    + + + + +

    Main

    + + + + +
    +

    The main workflow of the CI:

    • Builds the Docker image and publishes in the GitHub Docker registry.
    • Builds using a portion of the delivery script artifacts for the following platforms:
      • Windows x86_64 as .zip file
      • Windows x86_64 installer (using Squirrel)
      • macOS x86_64 and aarch64.
      • Linux x86_64
      • Linux server x86_64.

    The main workflow of the CI runs on develop branches as well as any branch that starts with feature/update_.

    Downloading the artifacts from the main branch

    Simply go to the develop branch on GitHub and look at the commit bar:

    Press the green checkmark (or red cross if something went bad). Then look at the list of jobs and their status:

    Then look for any of the entires that starts with “Main” and press the “Details” link next to it. It doesn't really matter which platform you'll choose as the artifacts are available on the same page.

     

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/C09Dou56ffMe.html b/docs/C09Dou56ffMe.html new file mode 100644 index 000000000..84c85f1a6 --- /dev/null +++ b/docs/C09Dou56ffMe.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Having a simpler packaging system + + +
    +
    + + + + +

    Having a simpler packaging system

    + + + + +
    +

    The current build scripts are a bit complicated and maintaining them is not easy.

    Electron Forge seems more mature and has a boatload of features, including Flatpak, snaps, Windows installers & more.

    Have a look also at the Plugins section since there are quite a few interesting things there as well.

    Afterwards consider running a new round of Reducing binary size, especially taking into consideration removing of the unnecessary locales.

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/GMta9hBHsXHQ.html b/docs/GMta9hBHsXHQ.html new file mode 100644 index 000000000..ecae78fd1 --- /dev/null +++ b/docs/GMta9hBHsXHQ.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Node.js, Electron and `better-sqlite3` + + +
    +
    + + + + +

    Node.js, Electron and `better-sqlite3`

    + + + + +
    +

    better-sqlite3 requires a native module in order to work. In order to ease the installation process, prebuilt binaries are provided by the library developers.

    Trilium Next started with version 8.4.0 for better-sqlite3

    better-sqlite3 versionSQLite versionNode.js prebuildsElectron.js prebuilds
    8.4.0<3.43.0v20???
    8.5.0v20v25
    8.5.1 v26
    8.5.2v20 (macOS + arm64)
    8.6.03.43.0 
    8.7.03.43.1 
    9.0.03.43.2 v27
    9.1.03.44.0 
    9.1.1macOS + Alpine
    9.2.03.44.2 
    9.2.1 / 9.2.2 v28
    9.3.03.45.0 
    9.4.03.45.1 
    9.4.1Windows arm, arm64
    9.4.2 <v29
    9.4.3 <v29
    9.4.4 v29
    9.4.5Better prebuilds
    9.5.03.45.2 
    9.6.03.45.3 v30
    10.0.0v22
    10.1.03.46.0 
    11.0.0>21
    11.1.0 (prerelease)  v31
    11.1.1  
    11.1.2  
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/KRC2O84LekPz.html b/docs/KRC2O84LekPz.html new file mode 100644 index 000000000..464a8a1b0 --- /dev/null +++ b/docs/KRC2O84LekPz.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + i18n-ally + + +
    +
    + + + + +

    i18n-ally

    + + + + +
    +

    i18n-ally is a VS Code extension that aids in internationalization.

    It is currently integrated in the project and offers features such as:

    • Highlight, autocomplete translations.
    • Display translations inline.
    • Extract messages into translation.

    Extracting messages into translation

    1. Open any .js file and select an untranslated string inside a template (TPL).
    2. Press Ctrl+P and look for “i18n Ally: Extract text into i18n messages”
    3. Select the first template.
    4. Select the path of translation, taking into consideration the Guidelines (e.g. jump_to_note.search-for-note-by-its-name).
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/PHqgH8FCfcod.html b/docs/PHqgH8FCfcod.html new file mode 100644 index 000000000..a837b4355 --- /dev/null +++ b/docs/PHqgH8FCfcod.html @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + Documentation + + +
    +
    + + + + +

    Documentation

    + + + + + + +

    This note has no content.

    + +
    + + + + + + +
    + + diff --git a/docs/QXCi6Y1SYulw.html b/docs/QXCi6Y1SYulw.html index 3e5f58f87..34d8f0bd2 100644 --- a/docs/QXCi6Y1SYulw.html +++ b/docs/QXCi6Y1SYulw.html @@ -86,7 +86,7 @@ node_modules/i18next + I18NEXT }

    Step 4. Using the library

    To import the library, simply use the following mechanism:

    import library_loader from "./library_loader.js";
     
    -await library_loader.requireLibrary(library_loader.I18NEXT);

    Make sure to replace I18NEXT with the library that was created at the previous steps.

    Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the requireLibrary method does not actually return anything. 

    To benefit from the library, it must export on its own an object in window.

    In the case of i18next, it sets window.i18next and that can be used directly:

    i18next.init({});
    +await library_loader.requireLibrary(library_loader.I18NEXT);

    Make sure to replace I18NEXT with the library that was created at the previous steps.

    Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the requireLibrary method does not actually return anything. 

    To benefit from the library, it must export on its own an object in window.

    In the case of i18next, it sets window.i18next and that can be used directly:

    i18next.init({});

    Step 5. Adding Electron support

    For Electron, the node_modules are copied as a separate step by bin/copy-dist.ts.

    Scroll all the way down to the nodeModulesFolder and append an entry for the newly added libraries.

    @@ -115,20 +115,6 @@ await library_loader.requireLibrary(library_loader.I18NEXT);

    Make - Internationalisation - -

    - - - -
  • - -
  • - -

    - - - Dependency Management

    @@ -148,6 +134,360 @@ await library_loader.requireLibrary(library_loader.I18NEXT);

    Make +

  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/U5RtMeGPeZ29.html b/docs/U5RtMeGPeZ29.html new file mode 100644 index 000000000..41c0da655 --- /dev/null +++ b/docs/U5RtMeGPeZ29.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + Synchronisation + + +
    +
    + + + + +

    Synchronisation

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/UTB518X6X9Uh.html b/docs/UTB518X6X9Uh.html new file mode 100644 index 000000000..2b59c0dd3 --- /dev/null +++ b/docs/UTB518X6X9Uh.html @@ -0,0 +1,461 @@ + + + + + + + + + + + + + + + + + + + + + + + Build deliveries locally + + +
    +
    + + + + +

    Build deliveries locally

    + + + + +
    +

    In the project root:

    PlatformArchitectureApplicationBuild command
    macOSx86_64Desktop / Electron app./bin/build-mac-x64.sh
    ARM 64Desktop / Electron app./bin/build-mac-arm64.sh
    Linuxx86_64Desktop / Electron app./bin/build-linux-x64.sh
    Server./bin/build-server.sh
    Windowsx86_64Desktop / Electron app./bin/build-win-x64.sh

    Under NixOS the following nix-shell is needed:

    nix-shell -p jq

    For Linux builds:

    nix-shell -p jq fakeroot dpkg

    The resulting build will be in the dist directory under the project root.

    Testing the Linux builds under NixOS

    Desktop clientServer
    $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
    +[nix-shell] cd dist/trilium-linux-x64
    +[nix-shell] steam-run ./trilium
    $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
    +[nix-shell] cd dist/trilium-linux-x64-server
    +[nix-shell] steam-run ./trilium.sh
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/VS22Hq5PBFNf.html b/docs/VS22Hq5PBFNf.html index 126d58524..0095e0ab9 100644 --- a/docs/VS22Hq5PBFNf.html +++ b/docs/VS22Hq5PBFNf.html @@ -49,6 +49,11 @@ class="type-text">Adding a new client library
  • +
  • + Having a simpler packaging system +
  • + @@ -76,20 +81,6 @@ - Internationalisation - -

    - - - - - -
  • - -

    - - - Dependency Management

    @@ -109,6 +100,360 @@ +
  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/X4N03xLYEWnN.html b/docs/X4N03xLYEWnN.html new file mode 100644 index 000000000..9aa2a6e0b --- /dev/null +++ b/docs/X4N03xLYEWnN.html @@ -0,0 +1,462 @@ + + + + + + + + + + + + + + + + + + + + + + + bettersqlite binaries + + +
    +
    + + + + +

    bettersqlite binaries

    + + + + +
    +

    The native node bindings

    better-sqlite3 has native Node bindings. With updates of better-sqlite3, but also of Electron and Node.js versions, these bindings need to be updated.

    Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js.

    During development, npm install tries to build or reuse prebuilt natives for the current Node.js version. This makes npm run start-server work out of the box. Trying to run npm run start-electron with these versions generally causes an error such as this:

    Uncaught Exception:
    +Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node'
    +was compiled against a different Node.js version using
    +NODE_MODULE_VERSION 108. This version of Node.js requires
    +NODE_MODULE_VERSION 116. Please try re-compiling or re-installing
    +the module (for instance, using `npm rebuild` or `npm install`).

    How the natives are handled

    Locally, this can be fixed by rebuilding the binaries, which is what npm run switch-electron does, which uses electron-rebuild under the hood.

    When the deliveries are built (see Build deliveries locally), it is not feasible to rebuild the dependencies since we are building for multiple platforms. Luckily, better-sqlite3 provides these prebuilt binaries from us, available as artifacts on their GitHub releases page

    The build script manages the natives for better-sqlite3 by keeping a copy of the .node file for every platform in bin/better-sqlite3.

    Whenever the version of better-sqlite3 changes, the .node files must also be renewed based on their releases page. To simplify this process, a script was created in bin/better-sqlite3/update.sh.

    How to update the natives

    The update script needs to know the version of Electron or Node.js for which to download the prebuilt binaries.

    If you get errors during download, check on the releases page to ensure that this particular combination of Electron/Node actually exists for the given release.

    To determine the NODE_MODULE_VERSION that is required, look for This version of Node.js requires
    NODE_MODULE_VERSION in the error when starting Trilium via:

    • npm run start-electron (or run any Electron delivery), case in which the ELECTRON_VERSION variable needs to be changed.
    • npm run start-server (or run the Linux server delivery), case in which the NODE_VERSION variable needs to be changed.

    Check which files got changed after running the update script and for each platform that got changed, test it locally via Build deliveries locally or via the CI.

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/XxqZW6JjkW2g.html b/docs/XxqZW6JjkW2g.html new file mode 100644 index 000000000..bffc19454 --- /dev/null +++ b/docs/XxqZW6JjkW2g.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Live reload + + +
    +
    + + + + +

    Live reload

    + + + + +
    +

    Server live reload

    If running the server using npm run start-server, the server will watch for changes in src/public and trigger a frontend reload if that occurs.

    Electron live reload

    Similarly, npm run start-electron supports live refresh  as well.

    However, a core difference is that Electron watches dist/src/public instead of src/public since Electron runs on its own copy of the files.

    To ameliorate that, a separate watch script has been implemented which automatically copies files from src/public to dist/src/public whenever a change is detected. To run it:

    npm run 

    Technical details

    • This mechanism is managed at server level by watching for changes inservices/ws.ts.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/Z9N9OKBXXLFW.html b/docs/Z9N9OKBXXLFW.html new file mode 100644 index 000000000..d16eeb443 --- /dev/null +++ b/docs/Z9N9OKBXXLFW.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Guidelines + + +
    +
    + + + + +

    Guidelines

    + + + + +
    +
    • Use hierarchy whenever appropriate, try to group the messages by:
      • Modals (e.g. about.foo, jump_to_note.foo)
    • Don't duplicate messages that are very widely used.
      • One such example is aria-label="Close" which should go to a single message such as modal.close instead of being duplicated in every modal.
    • On the other hand, don't overly generalise messages. A close message that is used whenever the “Close” word is encountered is not a good approach since it can potentially cause issues due to lack of context.
    • Use variable interpolation whenever appropriate.
      • If you see multiple messages joined together only to apply add a variable such as a user-inputted value, try to join those messages together into a single message containing a variable.
      • So instead of “Number of updates: “ + numUpdates + “.” use $(t("number_updates", { numUpdates })) where the message translation would appear as Number of updates: {{numUpdates}}.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/ZlxZh8NH5frM.html b/docs/ZlxZh8NH5frM.html new file mode 100644 index 000000000..b56c73abd --- /dev/null +++ b/docs/ZlxZh8NH5frM.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + Building and deployment + + +
    +
    + + + + +

    Building and deployment

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/api/attachments/27Z989bSFWAc/image/image.png b/docs/api/attachments/27Z989bSFWAc/image/image.png new file mode 100644 index 000000000..5eacee569 Binary files /dev/null and b/docs/api/attachments/27Z989bSFWAc/image/image.png differ diff --git a/docs/api/attachments/XEUUvzBxh89z/image/image.png b/docs/api/attachments/XEUUvzBxh89z/image/image.png new file mode 100644 index 000000000..2f13f1647 Binary files /dev/null and b/docs/api/attachments/XEUUvzBxh89z/image/image.png differ diff --git a/docs/biDJ9KgbWLgt.html b/docs/biDJ9KgbWLgt.html new file mode 100644 index 000000000..1583eae6c --- /dev/null +++ b/docs/biDJ9KgbWLgt.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Releasing a version + + +
    +
    + + + + +

    Releasing a version

    + + + + +
    +

    On NixOS:

    nix-shell -p dpkg fakeroot jq nodejs_20

    Then simply run from project root:

    ./bin/release.sh 1.2.3

    where 1.2.3 is the desired release version.

    If a version ends with -beta, it will automatically be marked as pre-release in GitHub.

    This will automatically generate a release in GitHub if everything goes according to plan.

    Note that the Windows installer is not automatically uploaded yet, it has to be taken from the main workflow of the CI from the develop branch.

    Make sure to check test the artifacts of the release.

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/btM6L9JtG301.html b/docs/btM6L9JtG301.html new file mode 100644 index 000000000..dcb786e94 --- /dev/null +++ b/docs/btM6L9JtG301.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Running a development build + + +
    +
    + + + + +

    Running a development build

    + + + + +
    +

    Run server

    Run with default settings:

    npm run start-server

    Run with custom port:

    TRILIUM_PORT=8082 npm run start-server

    Run Electron

    Rebuild better-sqlite3 dependency:

    npm run switch-electron

    Then run Electron:

    npm run start-electron

    To run Electron using the same data directory as the production version:

    npm run start-electron-no-dir

    When done, switch back the better-sqlite3 dependency:

    npm run switch-server
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/d3dnvVOhur16.html b/docs/d3dnvVOhur16.html new file mode 100644 index 000000000..671dbdfbf --- /dev/null +++ b/docs/d3dnvVOhur16.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Content hashing + + +
    +
    + + + + +

    Content hashing

    + + + + +
    +

    Entity hashing is done in content_hash#getEntityHashes.

    • It works by looking at the entity_changes table and going through each of the entity names/types:
      • blobs
      • attributes
      • revisions
      • attachments
      • notes
      • branches
      • etapi_tokens
      • options
    • For some reason note_reordering entities are ignored specifically.
    • All the rows in entity_changes are then ordered alphabetically, based on their entityId.
    • Every entity row is then grouped by entityName and then by sector. The sector is defined as the first character of the id.
    • The hash is altered to add the isErased value as well since the hash of deleted entries is not updated.
    • For each sector, the hash is calculated using utils.hash, using SHA1 encoded as Base64.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/hkrBX8KE1HQl.html b/docs/hkrBX8KE1HQl.html index 0b7abfe87..eb8e7b19a 100644 --- a/docs/hkrBX8KE1HQl.html +++ b/docs/hkrBX8KE1HQl.html @@ -20,19 +20,19 @@ - Internationalisation + Internationalisation / Translations
    -

    Internationalisation

    +

    Internationalisation / Translations

    @@ -42,11 +42,29 @@ "about": { "title": "About TriliumNext Notes" } -}

    Adding a new locale

    To add a new locale, go to src/public/translations with your favorite text editor and copy the en directory.

    Rename the copy to the ISO code (e.g. fr, ro) of the language being translated.

    Translations with a country-language combination, using their corresponding ISO code (e.g. fr_FR, fr_BE), has not been tested yet.

    Changing the language

    Since the internationalisation process is in its early stages, there is no user-facing way to switch the language.

    To change the language manually, edit src/public/app/services/i18n.js and look for the line containing lng: "en". Replace en with the desired language code (from the ones available in src/public/translations).

    Recommendations

    • Use hierarchy whenever appropriate, try to group the messages by:
      • Modals (e.g. about.foo, jump_to_note.foo)
    • Don't duplicate messages that are very widely used.
      • One such example is aria-label="Close" which should go to a single message such as modal.close instead of being duplicated in every modal.
    • On the other hand, don't overly generalise messages. A close message that is used whenever the “Close” word is encountered is not a good approach since it can potentially cause issues due to lack of context.
    • Use variable interpolation whenever appropriate.
      • If you see multiple messages joined together only to apply add a variable such as a user-inputted value, try to join those messages together into a single message containing a variable.
      • So instead of “Number of updates: “ + numUpdates + “.” use $(t("number_updates", { numUpdates })) where the message translation would appear as Number of updates: {{numUpdates}}.

    Client-side translations

    Component-level translations

    Most of the client translations are present in the various widgets and layouts.

    Translation support has to be added manually for every file.

    The first step is to add the translation import with a relative import. For example, if we are in the src/public/app/widgets/dialogs directory, the import would look as follows:

    import { t } from "../../services/i18n.js";

    Afterwards, simply replace the hard-coded message with:

    ${t("msgid")}

    where msgid is the key of the message being translated.

    Template-level translations

    Templates are .ejs files present in src/views, these are used to prepare the root layout for desktop, mobile applications as well as setup (onboarding) and the shared notes view.

    Due to using a different approach, it is not possible yet to translate those files.

    Server-side translations

    Currently the server-side messages are not translatable. They will be added as a separate step.

    +}

    Follow the Guidelines when creating a new message.

    Adding a new locale

    To add a new locale, go to src/public/translations with your favorite text editor and copy the en directory.

    Rename the copy to the ISO code (e.g. fr, ro) of the language being translated.

    Translations with a country-language combination, using their corresponding ISO code (e.g. fr_FR, fr_BE), has not been tested yet.

    Changing the language

    Since the internationalisation process is in its early stages, there is no user-facing way to switch the language.

    To change the language manually, edit src/public/app/services/i18n.js and look for the line containing lng: "en". Replace en with the desired language code (from the ones available in src/public/translations).

    Client-side translations

    Component-level translations

    Most of the client translations are present in the various widgets and layouts.

    Translation support has to be added manually for every file.

    The first step is to add the translation import with a relative import. For example, if we are in the src/public/app/widgets/dialogs directory, the import would look as follows:

    import { t } from "../../services/i18n.js";

    Afterwards, simply replace the hard-coded message with:

    ${t("msgid")}

    where msgid is the key of the message being translated.

    Variables

    In the translation, enclose the variables with {{ and }}:

    {
    +    "key": "{{what}} is {{how}}"
    +}

    Then pass the arguments when reading the translation:

    t('key', { what: 'i18next', how: 'great' })

    Template-level translations

    Templates are .ejs files present in src/views, these are used to prepare the root layout for desktop, mobile applications as well as setup (onboarding) and the shared notes view.

    Due to using a different approach, it is not possible yet to translate those files.

    Server-side translations

    Currently the server-side messages are not translatable. They will be added as a separate step.

    + +
    @@ -71,20 +89,6 @@ - Internationalisation - -

    - - - -
  • - -
  • - -

    - - - Dependency Management

    @@ -104,6 +108,360 @@ +
  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/jvdjFBOCCrOa.html b/docs/jvdjFBOCCrOa.html new file mode 100644 index 000000000..3db03c34d --- /dev/null +++ b/docs/jvdjFBOCCrOa.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Testing compatibility + + +
    +
    + + + + +

    Testing compatibility

    + + + + +
    +
    better-sqlite3 versionSQLite versionCompatibility
    8.4.0<3.43.0Compatible, same version.
    8.6.03.43.0 
    8.7.03.43.1 
    9.0.03.43.2 
    9.1.0 + 9.1.13.44.0 
    9.2.0 + 9.2.1 + 9.2.23.44.2 
    9.3.03.45.0 
    9.4.0, 9.4.1, 9.4.2, 9.4.3, 9.4.4, 9.4.53.45.1 
    9.5.03.45.2 
    9.6.0 / 10.0.03.45.3 
    10.1.0 / 11.0.0 / 11.1.1 / 11.1.23.46.0 
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/mPGbEmYGitWe.html b/docs/mPGbEmYGitWe.html new file mode 100644 index 000000000..14e1247a0 --- /dev/null +++ b/docs/mPGbEmYGitWe.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Build information + + +
    +
    + + + + +

    Build information

    + + + + +
    +
    • Provides context about when the build was made and the corresponding Git revision.
    • The information is displayed to the client when going in the about dialog.
    • The build information is hard-coded in src/services/build.ts. This file is generated automatically via npm run update-build-info which itself is run automatically whenever making a build in the CI, or a local delivery.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/oXLcQUniOWvl.html b/docs/oXLcQUniOWvl.html new file mode 100644 index 000000000..8b3f5d4ff --- /dev/null +++ b/docs/oXLcQUniOWvl.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + Environment Setup + + +
    +
    + + + + +

    Environment Setup

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/rU1hxvgqlA9x.html b/docs/rU1hxvgqlA9x.html new file mode 100644 index 000000000..632d75c2c --- /dev/null +++ b/docs/rU1hxvgqlA9x.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + CI + + +
    +
    + + + + +

    CI

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/s5gsYTbPQr6c.html b/docs/s5gsYTbPQr6c.html new file mode 100644 index 000000000..400fd8e01 --- /dev/null +++ b/docs/s5gsYTbPQr6c.html @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + Updating dependencies + + +
    +
    + + + + +

    Updating dependencies

    + + + + +
    +

     

    DependencyThings to check for a basic sanity check
    better-sqlite3See bettersqlite binaries.
    jsdom
    • Note map
    • Clipper
    • Note similarity
    async-mutex
    • Sync
    axios
    • Can't be directly tested, as it's exposed only via the backend script API.
    sax
    • EverNote imports
    • ws
    • debounce
    • Check any action is reported from server to client (e.g. delete a note).
    ejs
    • Onboarding / first setup
    dayjs
    • Day notes
    semver
    • Application should start.
    https-proxy-agent???
    sax
    • EverNote import
    ini
    • Affects config, generally if the application starts then it should be OK.
    +
    + + + + + +
    + + + + + + +
    + + diff --git a/docs/xtBYDVZPb0gr.html b/docs/xtBYDVZPb0gr.html new file mode 100644 index 000000000..908ef69ce --- /dev/null +++ b/docs/xtBYDVZPb0gr.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + Project maintenance + + +
    +
    + + + + +

    Project maintenance

    + + + + + + + + +
    + + + + + + +
    + +