From ae0ee8fac714c6bf8f7c09ead868b817d24b818f Mon Sep 17 00:00:00 2001 From: Myx Date: Thu, 2 Apr 2026 04:08:53 +0200 Subject: [PATCH] Fix lint, make design more consistent, add license texts, --- toju-app/src/app/app.html | 50 ++- toju-app/src/app/app.ts | 62 ++- .../chat-message-composer.component.html | 2 +- .../chat-message-item.component.html | 16 +- .../chat-message-item.component.ts | 12 +- .../chat-message-markdown.component.ts | 2 +- .../chat-message-overlays.component.html | 4 +- .../klipy-gif-picker.component.html | 10 +- .../klipy-gif-picker.component.ts | 42 +- .../notifications-settings.component.html | 8 +- .../screen-share-viewer.component.html | 6 +- .../server-search.component.html | 2 +- .../application/element-picker.service.ts | 14 +- .../theme/application/layout-sync.service.ts | 6 +- .../application/theme-library.service.ts | 4 +- .../theme/application/theme.service.ts | 133 +++---- .../domains/theme/domain/theme-llm-guide.ts | 34 +- .../domains/theme/domain/theme.defaults.ts | 31 +- .../app/domains/theme/domain/theme.schema.ts | 6 +- .../settings/theme-grid-editor.component.html | 10 +- .../settings/theme-grid-editor.component.scss | 26 +- .../settings/theme-grid-editor.component.ts | 50 +-- .../theme-json-code-editor.component.html | 9 + .../theme-json-code-editor.component.scss | 22 ++ .../theme-json-code-editor.component.ts | 45 +-- .../settings/theme-settings.component.html | 86 +++-- .../settings/theme-settings.component.scss | 27 +- .../settings/theme-settings.component.ts | 12 +- .../theme-picker-overlay.component.html | 29 ++ .../feature/theme-picker-overlay.component.ts | 34 +- .../voice-controls.component.html | 2 +- .../rooms-side-panel.component.html | 4 +- .../bans-settings.component.html | 4 +- .../debugging-settings.component.html | 14 +- .../general-settings.component.html | 2 +- .../members-settings.component.html | 4 +- .../network-settings.component.html | 10 +- .../server-settings.component.html | 4 +- .../settings-modal.component.html | 215 ++++++----- .../settings-modal/third-party-licenses.ts | 365 ++++++++++++++++-- .../updates-settings.component.html | 24 +- .../voice-settings.component.html | 2 +- .../features/settings/settings.component.html | 10 +- .../app/store/rooms/room-members.helpers.ts | 6 +- toju-app/src/styles.scss | 100 +++-- 45 files changed, 988 insertions(+), 572 deletions(-) create mode 100644 toju-app/src/app/domains/theme/feature/settings/theme-json-code-editor.component.html create mode 100644 toju-app/src/app/domains/theme/feature/settings/theme-json-code-editor.component.scss create mode 100644 toju-app/src/app/domains/theme/feature/theme-picker-overlay.component.html diff --git a/toju-app/src/app/app.html b/toju-app/src/app/app.html index a4cd8e5..5cca12f 100644 --- a/toju-app/src/app/app.html +++ b/toju-app/src/app/app.html @@ -31,22 +31,38 @@
Loading Theme Studio…
} - } @else { @if (desktopUpdateState().restartRequired) { + } @else { @if (showDesktopUpdateNotice()) {
-
-
-
-

Update ready to install

-

- MetoYou {{ desktopUpdateState().targetVersion || 'update' }} has been downloaded. Restart the app to finish applying it. +

+
+ + +
+

Update Ready

+

+ Restart to install {{ desktopUpdateState().targetVersion || 'the latest update' }}

-
+

+ The update has already been downloaded. Restart the app when you're ready to finish applying it. +

+ +
@@ -54,7 +70,7 @@ @@ -78,9 +94,9 @@ class="pointer-events-none absolute z-[80]" [ngStyle]="themeStudioControlsPositionStyles()" > -
+
@@ -90,7 +106,7 @@ @@ -98,7 +114,7 @@ @@ -106,7 +122,7 @@
} @if (isThemeStudioMinimized()) {
-
+

Theme Studio

Minimized

@@ -115,7 +131,7 @@ @@ -123,7 +139,7 @@ diff --git a/toju-app/src/app/app.ts b/toju-app/src/app/app.ts index fb41c7b..7f18835 100644 --- a/toju-app/src/app/app.ts +++ b/toju-app/src/app/app.ts @@ -17,6 +17,8 @@ import { } from '@angular/router'; import { CommonModule } from '@angular/common'; import { Store } from '@ngrx/store'; +import { NgIcon, provideIcons } from '@ng-icons/core'; +import { lucideX } from '@ng-icons/lucide'; import { DatabaseService, @@ -51,6 +53,7 @@ import { selector: 'app-root', imports: [ CommonModule, + NgIcon, RouterOutlet, ServersRailComponent, TitleBarComponent, @@ -61,6 +64,11 @@ import { ThemeNodeDirective, ThemePickerOverlayComponent ], + viewProviders: [ + provideIcons({ + lucideX + }) + ], templateUrl: './app.html', styleUrl: './app.scss' }) @@ -72,20 +80,17 @@ export class App implements OnInit, OnDestroy { currentRoom = this.store.selectSignal(selectCurrentRoom); desktopUpdates = inject(DesktopAppUpdateService); desktopUpdateState = this.desktopUpdates.state; - - private databaseService = inject(DatabaseService); - private router = inject(Router); - private servers = inject(ServerDirectoryFacade); - private notifications = inject(NotificationsFacade); - private settingsModal = inject(SettingsModalService); - private timeSync = inject(TimeSyncService); - private theme = inject(ThemeService); - private voiceSession = inject(VoiceSessionFacade); - private externalLinks = inject(ExternalLinkService); - private electronBridge = inject(ElectronBridgeService); - private deepLinkCleanup: (() => void) | null = null; - private themeStudioControlsDragOffset: { x: number; y: number } | null = null; - private themeStudioControlsBounds: { width: number; height: number } | null = null; + readonly databaseService = inject(DatabaseService); + readonly router = inject(Router); + readonly servers = inject(ServerDirectoryFacade); + readonly notifications = inject(NotificationsFacade); + readonly settingsModal = inject(SettingsModalService); + readonly timeSync = inject(TimeSyncService); + readonly theme = inject(ThemeService); + readonly voiceSession = inject(VoiceSessionFacade); + readonly externalLinks = inject(ExternalLinkService); + readonly electronBridge = inject(ElectronBridgeService); + readonly dismissedDesktopUpdateNoticeKey = signal(null); readonly themeStudioFullscreenComponent = signal | null>(null); readonly themeStudioControlsPosition = signal<{ x: number; y: number } | null>(null); readonly isDraggingThemeStudioControls = signal(false); @@ -102,6 +107,17 @@ export class App implements OnInit, OnDestroy { return this.settingsModal.activePage() === 'theme' && this.settingsModal.themeStudioMinimized(); }); + readonly desktopUpdateNoticeKey = computed(() => { + const updateState = this.desktopUpdateState(); + + return updateState.targetVersion?.trim() + || updateState.latestVersion?.trim() + || `restart:${updateState.currentVersion}`; + }); + readonly showDesktopUpdateNotice = computed(() => { + return this.desktopUpdateState().restartRequired + && this.dismissedDesktopUpdateNoticeKey() !== this.desktopUpdateNoticeKey(); + }); readonly appWorkspaceShellStyles = computed(() => { const workspaceStyles = this.appWorkspaceLayoutStyles(); @@ -131,6 +147,10 @@ export class App implements OnInit, OnDestroy { }; }); + private deepLinkCleanup: (() => void) | null = null; + private themeStudioControlsDragOffset: { x: number; y: number } | null = null; + private themeStudioControlsBounds: { width: number; height: number } | null = null; + constructor() { effect(() => { if (!this.isThemeStudioFullscreen() || this.themeStudioFullscreenComponent()) { @@ -259,6 +279,14 @@ export class App implements OnInit, OnDestroy { this.settingsModal.open('updates'); } + dismissDesktopUpdateNotice(): void { + if (!this.desktopUpdateState().restartRequired) { + return; + } + + this.dismissedDesktopUpdateNoticeKey.set(this.desktopUpdateNoticeKey()); + } + startThemeStudioControlsDrag(event: PointerEvent, controlsElement: HTMLElement): void { if (event.button !== 0) { return; @@ -309,15 +337,15 @@ export class App implements OnInit, OnDestroy { await this.desktopUpdates.restartToApplyUpdate(); } - private clampThemeStudioControlsPosition(x: number, y: number, width: number, height: number): { x: number; y: number } { + private clampThemeStudioControlsPosition(left: number, top: number, width: number, height: number): { x: number; y: number } { const minX = App.THEME_STUDIO_CONTROLS_MARGIN; const minY = App.TITLE_BAR_HEIGHT + App.THEME_STUDIO_CONTROLS_MARGIN; const maxX = Math.max(minX, window.innerWidth - width - App.THEME_STUDIO_CONTROLS_MARGIN); const maxY = Math.max(minY, window.innerHeight - height - App.THEME_STUDIO_CONTROLS_MARGIN); return { - x: Math.min(Math.max(minX, x), maxX), - y: Math.min(Math.max(minY, y), maxY) + x: Math.min(Math.max(minX, left), maxX), + y: Math.min(Math.max(minY, top), maxY) }; } diff --git a/toju-app/src/app/domains/chat/feature/chat-messages/components/message-composer/chat-message-composer.component.html b/toju-app/src/app/domains/chat/feature/chat-messages/components/message-composer/chat-message-composer.component.html index 7385f80..56f0350 100644 --- a/toju-app/src/app/domains/chat/feature/chat-messages/components/message-composer/chat-message-composer.component.html +++ b/toju-app/src/app/domains/chat/feature/chat-messages/components/message-composer/chat-message-composer.component.html @@ -11,7 +11,7 @@
} @else { -
+
@for (gif of results(); track gif.id) { @@ -37,14 +37,14 @@ type="button" (click)="applyDraft()" [disabled]="!draftIsValid()" - class="inline-flex items-center rounded-full bg-primary px-4 py-1.5 text-sm font-semibold text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-60" + class="inline-flex items-center rounded-md bg-primary px-4 py-1.5 text-sm font-semibold text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-60" > Apply Draft @@ -60,8 +60,14 @@
- + @@ -81,12 +82,13 @@ - +
-
-
+ @if (themeStudioMinimized()) { + Minimized } +
-
- + Saved Theme + - +
+ + + +
+ } + +
+ + +
} @@ -304,18 +307,20 @@ aria-label="Close third-party licenses" >
-
-
+
+

Third-party licenses

-

License notices for bundled third-party libraries used by the app.

+

License information for bundled third-party libraries used by the app.

-
+
@for (license of thirdPartyLicenses; track license.id) {
@@ -340,14 +345,32 @@ rel="noopener noreferrer" class="text-xs font-medium text-primary hover:underline underline-offset-4" > - Source + View license
-
{{ license.text }}
+
+

Packages

+
+ @for (packageName of license.packages; track packageName) { + + {{ packageName }} + + } +
+ + @if (license.note) { +

{{ license.note }}

+ } + +
+

License text

+
{{ license.text }}
+
+
}
diff --git a/toju-app/src/app/features/settings/settings-modal/third-party-licenses.ts b/toju-app/src/app/features/settings/settings-modal/third-party-licenses.ts index a02412d..0b11a72 100644 --- a/toju-app/src/app/features/settings/settings-modal/third-party-licenses.ts +++ b/toju-app/src/app/features/settings/settings-modal/third-party-licenses.ts @@ -3,42 +3,345 @@ export interface ThirdPartyLicense { name: string; licenseName: string; sourceUrl: string; + packages: readonly string[]; text: string; + note?: string; } +const toLicenseText = (lines: readonly string[]): string => lines.join('\n'); + +const GROUPED_LICENSE_NOTE = 'Grouped by the license declared in the installed package metadata for the packages below. Some upstream packages include their own copyright notices in addition to this standard license text.'; + +const MIT_LICENSE_TEXT = toLicenseText([ + 'MIT License', + '', + 'Copyright ', + '', + 'Permission is hereby granted, free of charge, to any person obtaining a copy', + 'of this software and associated documentation files (the "Software"), to deal', + 'in the Software without restriction, including without limitation the rights', + 'to use, copy, modify, merge, publish, distribute, sublicense, and/or sell', + 'copies of the Software, and to permit persons to whom the Software is', + 'furnished to do so, subject to the following conditions:', + '', + 'The above copyright notice and this permission notice shall be included in all', + 'copies or substantial portions of the Software.', + '', + 'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR', + 'IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,', + 'FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE', + 'AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER', + 'LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,', + 'OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE', + 'SOFTWARE.' +]); + +const APACHE_LICENSE_TEXT = toLicenseText([ + 'Apache License', + 'Version 2.0, January 2004', + 'http://www.apache.org/licenses/', + '', + 'TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION', + '', + '1. Definitions.', + '', + '"License" shall mean the terms and conditions for use, reproduction, and distribution as', + 'defined by Sections 1 through 9 of this document.', + '', + '"Licensor" shall mean the copyright owner or entity authorized by the copyright owner', + 'that is granting the License.', + '', + '"Legal Entity" shall mean the union of the acting entity and all other entities that', + 'control, are controlled by, or are under common control with that entity. For the', + 'purposes of this definition, "control" means (i) the power, direct or indirect, to cause', + 'the direction or management of such entity, whether by contract or otherwise, or (ii)', + 'ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial', + 'ownership of such entity.', + '', + '"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted', + 'by this License.', + '', + '"Source" form shall mean the preferred form for making modifications, including but', + 'not limited to software source code, documentation source, and configuration files.', + '', + '"Object" form shall mean any form resulting from mechanical transformation or', + 'translation of a Source form, including but not limited to compiled object code,', + 'generated documentation, and conversions to other media types.', + '', + '"Work" shall mean the work of authorship, whether in Source or Object form, made', + 'available under the License, as indicated by a copyright notice that is included in or', + 'attached to the Work (an example is provided in the Appendix below).', + '', + '"Derivative Works" shall mean any work, whether in Source or Object form, that is based', + 'on (or derived from) the Work and for which the editorial revisions, annotations,', + 'elaborations, or other modifications represent, as a whole, an original work of', + 'authorship. For the purposes of this License, Derivative Works shall not include works', + 'that remain separable from, or merely link (or bind by name) to the interfaces of,', + 'the Work and Derivative Works thereof.', + '', + '"Contribution" shall mean any work of authorship, including the original version of the', + 'Work and any modifications or additions to that Work or Derivative Works thereof, that', + 'is intentionally submitted to Licensor for inclusion in the Work by the copyright owner', + 'or by an individual or Legal Entity authorized to submit on behalf of the copyright', + 'owner. For the purposes of this definition, "submitted" means any form of electronic,', + 'verbal, or written communication sent to the Licensor or its representatives, including', + 'but not limited to communication on electronic mailing lists, source code control', + 'systems, and issue tracking systems that are managed by, or on behalf of, the Licensor', + 'for the purpose of discussing and improving the Work, but excluding communication that', + 'is conspicuously marked or otherwise designated in writing by the copyright owner as', + '"Not a Contribution."', + '', + '"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a', + 'Contribution has been received by Licensor and subsequently incorporated within the', + 'Work.', + '', + '2. Grant of Copyright License. Subject to the terms and conditions of this License, each', + 'Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,', + 'royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of,', + 'publicly display, publicly perform, sublicense, and distribute the Work and such', + 'Derivative Works in Source or Object form.', + '', + '3. Grant of Patent License. Subject to the terms and conditions of this License, each', + 'Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,', + 'royalty-free, irrevocable (except as stated in this section) patent license to make,', + 'have made, use, offer to sell, sell, import, and otherwise transfer the Work, where', + 'such license applies only to those patent claims licensable by such Contributor that', + 'are necessarily infringed by their Contribution(s) alone or by combination of their', + 'Contribution(s) with the Work to which such Contribution(s) was submitted. If You', + 'institute patent litigation against any entity (including a cross-claim or counterclaim', + 'in a lawsuit) alleging that the Work or a Contribution incorporated within the Work', + 'constitutes direct or contributory patent infringement, then any patent licenses', + 'granted to You under this License for that Work shall terminate as of the date such', + 'litigation is filed.', + '', + '4. Redistribution. You may reproduce and distribute copies of the Work or Derivative', + 'Works thereof in any medium, with or without modifications, and in Source or Object', + 'form, provided that You meet the following conditions:', + '', + ' a. You must give any other recipients of the Work or Derivative Works a copy of', + ' this License; and', + '', + ' b. You must cause any modified files to carry prominent notices stating that You', + ' changed the files; and', + '', + ' c. You must retain, in the Source form of any Derivative Works that You distribute,', + ' all copyright, patent, trademark, and attribution notices from the Source form', + ' of the Work, excluding those notices that do not pertain to any part of the', + ' Derivative Works; and', + '', + ' d. If the Work includes a "NOTICE" text file as part of its distribution, then any', + ' Derivative Works that You distribute must include a readable copy of the', + ' attribution notices contained within such NOTICE file, excluding those notices', + ' that do not pertain to any part of the Derivative Works, in at least one of', + ' the following places: within a NOTICE text file distributed as part of the', + ' Derivative Works; within the Source form or documentation, if provided along', + ' with the Derivative Works; or, within a display generated by the Derivative', + ' Works, if and wherever such third-party notices normally appear. The contents', + ' of the NOTICE file are for informational purposes only and do not modify the', + ' License. You may add Your own attribution notices within Derivative Works', + ' that You distribute, alongside or as an addendum to the NOTICE text from the', + ' Work, provided that such additional attribution notices cannot be construed', + ' as modifying the License.', + '', + 'You may add Your own copyright statement to Your modifications and may provide', + 'additional or different license terms and conditions for use, reproduction, or', + 'distribution of Your modifications, or for any such Derivative Works as a whole,', + 'provided Your use, reproduction, and distribution of the Work otherwise complies with', + 'the conditions stated in this License.', + '', + '5. Submission of Contributions. Unless You explicitly state otherwise, any', + 'Contribution intentionally submitted for inclusion in the Work by You to the Licensor', + 'shall be under the terms and conditions of this License, without any additional terms', + 'or conditions. Notwithstanding the above, nothing herein shall supersede or modify', + 'the terms of any separate license agreement you may have executed with Licensor', + 'regarding such Contributions.', + '', + '6. Trademarks. This License does not grant permission to use the trade names,', + 'trademarks, service marks, or product names of the Licensor, except as required for', + 'reasonable and customary use in describing the origin of the Work and reproducing the', + 'content of the NOTICE file.', + '', + '7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing,', + 'Licensor provides the Work (and each Contributor provides its Contributions) on an', + '"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or', + 'implied, including, without limitation, any warranties or conditions of TITLE,', + 'NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are', + 'solely responsible for determining the appropriateness of using or redistributing the', + 'Work and assume any risks associated with Your exercise of permissions under this', + 'License.', + '', + '8. Limitation of Liability. In no event and under no legal theory, whether in tort', + '(including negligence), contract, or otherwise, unless required by applicable law', + '(such as deliberate and grossly negligent acts) or agreed to in writing, shall any', + 'Contributor be liable to You for damages, including any direct, indirect, special,', + 'incidental, or consequential damages of any character arising as a result of this', + 'License or out of the use or inability to use the Work (including but not limited to', + 'damages for loss of goodwill, work stoppage, computer failure or malfunction, or any', + 'and all other commercial damages or losses), even if such Contributor has been', + 'advised of the possibility of such damages.', + '', + '9. Accepting Warranty or Additional Liability. While redistributing the Work or', + 'Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance', + 'of support, warranty, indemnity, or other liability obligations and/or rights', + 'consistent with this License. However, in accepting such obligations, You may act', + 'only on Your own behalf and on Your sole responsibility, not on behalf of any other', + 'Contributor, and only if You agree to indemnify, defend, and hold each Contributor', + 'harmless for any liability incurred by, or claims asserted against, such Contributor', + 'by reason of your accepting any such warranty or additional liability.', + '', + 'END OF TERMS AND CONDITIONS' +]); + +const WAVESURFER_BSD_LICENSE_TEXT = toLicenseText([ + 'BSD 3-Clause License', + '', + 'Copyright (c) 2012-2023, katspaugh and contributors', + 'All rights reserved.', + '', + 'Redistribution and use in source and binary forms, with or without modification, are permitted provided', + 'that the following conditions are met:', + '', + '* Redistributions of source code must retain the above copyright notice, this list of conditions and', + ' the following disclaimer.', + '', + '* Redistributions in binary form must reproduce the above copyright notice, this list of conditions', + ' and the following disclaimer in the documentation and/or other materials provided with the', + ' distribution.', + '', + '* Neither the name of the copyright holder nor the names of its contributors may be used to endorse', + ' or promote products derived from this software without specific prior written permission.', + '', + 'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR', + 'IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND', + 'FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR', + 'CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL', + 'DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,', + 'DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER', + 'IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT', + 'OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.' +]); + +const ISC_LICENSE_TEXT = toLicenseText([ + 'ISC License', + '', + 'Copyright ', + '', + 'Permission to use, copy, modify, and/or distribute this software for any purpose', + 'with or without fee is hereby granted, provided that the above copyright notice', + 'and this permission notice appear in all copies.', + '', + 'THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH', + 'REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND', + 'FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,', + 'OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,', + 'DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS', + 'ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS', + 'SOFTWARE.' +]); + +const ZERO_BSD_LICENSE_TEXT = toLicenseText([ + 'Zero-Clause BSD', + '', + 'Permission to use, copy, modify, and/or distribute this software for any purpose', + 'with or without fee is hereby granted.', + '', + 'THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH', + 'REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND', + 'FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,', + 'OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,', + 'DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS', + 'ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS', + 'SOFTWARE.' +]); + export const THIRD_PARTY_LICENSES: ThirdPartyLicense[] = [ { - id: 'wavesurfer-js', - name: 'wavesurfer.js', + id: 'mit', + name: 'MIT-licensed packages', + licenseName: 'MIT License', + sourceUrl: 'https://opensource.org/licenses/MIT', + packages: [ + '@angular/common', + '@angular/compiler', + '@angular/core', + '@angular/forms', + '@angular/platform-browser', + '@angular/router', + '@codemirror/commands', + '@codemirror/lang-json', + '@codemirror/language', + '@codemirror/state', + '@codemirror/theme-one-dark', + '@codemirror/view', + 'codemirror', + '@ng-icons/core', + '@ngrx/effects', + '@ngrx/entity', + '@ngrx/store', + '@ngrx/store-devtools', + 'auto-launch', + 'clsx', + 'cytoscape', + 'electron-updater', + 'mermaid', + 'ngx-remark', + 'prismjs', + 'remark', + 'remark-breaks', + 'remark-gfm', + 'simple-peer', + 'sql.js', + 'typeorm', + 'uuid' + ], + text: MIT_LICENSE_TEXT, + note: GROUPED_LICENSE_NOTE + }, + { + id: 'apache-2-0', + name: 'Apache-licensed packages', + licenseName: 'Apache License 2.0', + sourceUrl: 'https://www.apache.org/licenses/LICENSE-2.0', + packages: [ + 'rxjs', + '@timephy/rnnoise-wasm', + 'class-variance-authority', + 'reflect-metadata' + ], + text: APACHE_LICENSE_TEXT, + note: GROUPED_LICENSE_NOTE + }, + { + id: 'bsd-3-clause', + name: 'BSD-licensed packages', licenseName: 'BSD 3-Clause License', - sourceUrl: 'https://github.com/katspaugh/wavesurfer.js/blob/main/LICENSE', - text: [ - 'BSD 3-Clause License', - '', - 'Copyright (c) 2012-2023, katspaugh and contributors', - 'All rights reserved.', - '', - 'Redistribution and use in source and binary forms, with or without modification, are permitted provided', - 'that the following conditions are met:', - '', - '* Redistributions of source code must retain the above copyright notice, this list of conditions and', - ' the following disclaimer.', - '', - '* Redistributions in binary form must reproduce the above copyright notice, this list of conditions', - ' and the following disclaimer in the documentation and/or other materials provided with the', - ' distribution.', - '', - '* Neither the name of the copyright holder nor the names of its contributors may be used to endorse', - ' or promote products derived from this software without specific prior written permission.', - '', - 'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR', - 'IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND', - 'FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR', - 'CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL', - 'DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,', - 'DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER', - 'IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT', - 'OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.' - ].join('\n') + sourceUrl: 'https://opensource.org/licenses/BSD-3-Clause', + packages: [ + 'wavesurfer.js' + ], + text: WAVESURFER_BSD_LICENSE_TEXT, + note: 'License text reproduced from the bundled wavesurfer.js package license.' + }, + { + id: 'isc', + name: 'ISC-licensed packages', + licenseName: 'ISC License', + sourceUrl: 'https://opensource.org/license/isc-license-txt', + packages: [ + '@ng-icons/lucide' + ], + text: ISC_LICENSE_TEXT, + note: GROUPED_LICENSE_NOTE + }, + { + id: '0bsd', + name: '0BSD-licensed packages', + licenseName: '0BSD License', + sourceUrl: 'https://opensource.org/license/0bsd', + packages: [ + 'tslib' + ], + text: ZERO_BSD_LICENSE_TEXT, + note: GROUPED_LICENSE_NOTE } ]; diff --git a/toju-app/src/app/features/settings/settings-modal/updates-settings/updates-settings.component.html b/toju-app/src/app/features/settings/settings-modal/updates-settings/updates-settings.component.html index b5b9c4c..03cda00 100644 --- a/toju-app/src/app/features/settings/settings-modal/updates-settings/updates-settings.component.html +++ b/toju-app/src/app/features/settings/settings-modal/updates-settings/updates-settings.component.html @@ -1,5 +1,5 @@
-
+

Desktop app updates

@@ -15,27 +15,27 @@
@if (!isElectron) { -
+

Automatic updates are only available in the packaged Electron desktop app.

} @else {
-
+

Installed

{{ state().currentVersion }}

-
+

Latest in manifest

{{ state().latestVersion || 'Unknown' }}

-
+

Target version

{{ state().targetVersion || 'Automatic' }}

-
+

Last checked

{{ state().lastCheckedAt ? (state().lastCheckedAt | date: 'medium') : 'Not checked yet' }} @@ -43,7 +43,7 @@

-
+
Update policy

@@ -81,7 +81,7 @@

-
+

Status

{{ state().statusMessage || 'Waiting for release information from the active server.' }} @@ -109,7 +109,7 @@

-
+
Manifest URL priority

@@ -118,7 +118,7 @@

-
+

{{ isUsingConnectedServerDefaults() ? 'Using connected server defaults' : 'Using saved manifest URLs' }}

@@ -160,7 +160,7 @@
@if (state().serverBlocked) { -
+
Server update required

{{ state().serverBlockMessage }}

@@ -177,7 +177,7 @@
} -
+

Resolved manifest URL

{{ state().manifestUrl || 'No working manifest URL has been resolved yet.' }}

diff --git a/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.html b/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.html index 25607fe..e15a7b2 100644 --- a/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.html +++ b/toju-app/src/app/features/settings/settings-modal/voice-settings/voice-settings.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/toju-app/src/app/features/settings/settings.component.html b/toju-app/src/app/features/settings/settings.component.html index 6cf9a80..2680fc7 100644 --- a/toju-app/src/app/features/settings/settings.component.html +++ b/toju-app/src/app/features/settings/settings.component.html @@ -3,7 +3,7 @@