diff --git a/package-lock.json b/package-lock.json index 5106d308..8666b4c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,15 @@ "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.38.6", "@ernane/svelte-star-rating": "^1.1.4", + "@fontsource/averia-libre": "^5.2.7", + "@fontsource/bebas-neue": "^5.2.7", + "@fontsource/libre-baskerville": "^5.2.10", + "@fontsource/lobster": "^5.2.8", + "@fontsource/pacifico": "^5.2.7", + "@fontsource/playfair-display": "^5.2.8", + "@fontsource/poppins": "^5.2.7", + "@fontsource/rethink-sans": "^5.2.8", + "@fontsource/source-code-pro": "^5.2.7", "@fullcalendar/common": "^5.11.5", "@microsoft/signalr": "^8.0.0", "@pgrabovets/json-view": "^2.7.5", @@ -29,7 +38,6 @@ "@vincjo/datatables": "^2.8.0", "apexcharts": "^3.44.2", "axios": "^1.6.2", - "bootstrap": "^5.3.2", "chart.js": "^4.4.0", "drawflow": "^0.0.59", "flatpickr": "^4.6.13", @@ -54,7 +62,6 @@ "svelte-splitpanes": "^8.0.12", "svelte-viewport-info": "^1.0.1", "svelvet": "^9.0.0", - "sweetalert2": "^11.12.4", "swiper": "^10.3.1", "tailwindcss": "^4.2.2", "uuid": "^10.0.0" @@ -726,6 +733,87 @@ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, + "node_modules/@fontsource/averia-libre": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/averia-libre/-/averia-libre-5.2.7.tgz", + "integrity": "sha512-wj2M7MyrKFiWR+H6BqAhYXu1RwPuqkifyEr+APVySV9Na1WUiJ1aVzgzy9mGOdIO5T9Rtsfe2QaadeicvbNZ/w==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/bebas-neue": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/bebas-neue/-/bebas-neue-5.2.7.tgz", + "integrity": "sha512-DsmBrmq55d9BCU0mt4DT4RZDdH8vhWRKEUOfbuNB1EEjMuwbtFvM8N+3gIlkYSFbsb10P8Q19BV5OdpMu2h0fA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/libre-baskerville": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@fontsource/libre-baskerville/-/libre-baskerville-5.2.10.tgz", + "integrity": "sha512-Y/bGj4cOdWhAxU4+sBPen3MB5Og3t/WvezVL+05CJ7cvhDQUKpQFUuw/hm1IQKRc9u0lWs8VP2MKDOK2uQtloQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/lobster": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/lobster/-/lobster-5.2.8.tgz", + "integrity": "sha512-5xlo4rcvefhac1tnwingFR9OT9wZYUVwlm4Iemx21flMCH8Z7mS4bNHosUtoRodPB8KLLFgywfjUbyt5rNRLng==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/pacifico": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/pacifico/-/pacifico-5.2.7.tgz", + "integrity": "sha512-L+YiZn3Lb8rVN15zcLlti62doVxQeFpS+dJmulKkFrUo3dZIAxZLHwXoKaaHm+VVcOTrT/mmKCZqGOIWVmFV2w==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/playfair-display": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/playfair-display/-/playfair-display-5.2.8.tgz", + "integrity": "sha512-fUEhib70SszNhQVsGbUMSsWJhr7Je0rdeuZdtGpDNu0GKF1xJM8QhpI/y0pckU25GcChXm9TLOmeZupkvvZo2g==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/poppins": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.2.7.tgz", + "integrity": "sha512-6uQyPmseo4FgI97WIhA4yWRlNaoLk4vSDK/PyRwdqqZb5zAEuc+Kunt8JTMcsHYUEGYBtN15SNkMajMdqUSUmg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/rethink-sans": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/rethink-sans/-/rethink-sans-5.2.8.tgz", + "integrity": "sha512-U2lMOtoTfQzMI0R2RC0FE/OvZXYbj7aNC0TS5uS2snLro+kZh9rDnocKkerfbJNwXodmvLZYevPbG4AsphwPcQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/source-code-pro": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/source-code-pro/-/source-code-pro-5.2.7.tgz", + "integrity": "sha512-7papq9TH94KT+S5VSY8cU7tFmwuGkIe3qxXRMscuAXH6AjMU+KJI75f28FzgBVDrlMfA0jjlTV4/x5+H5o/5EQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", @@ -2458,25 +2546,6 @@ "dev": true, "license": "MIT" }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -5714,16 +5783,6 @@ "node": ">= 0.8.0" } }, - "node_modules/sweetalert2": { - "version": "11.26.24", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.26.24.tgz", - "integrity": "sha512-SLgukW4wicewpW5VOukSXY5Z6DL/z7HCOK2ODSjmQPiSphCN8gJAmh9npoceXOtBRNoDN0xIz+zHYthtfiHmjg==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/limonte" - } - }, "node_modules/swiper": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.3.1.tgz", diff --git a/package.json b/package.json index bca68991..1b643e56 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,15 @@ "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.38.6", "@ernane/svelte-star-rating": "^1.1.4", + "@fontsource/averia-libre": "^5.2.7", + "@fontsource/bebas-neue": "^5.2.7", + "@fontsource/libre-baskerville": "^5.2.10", + "@fontsource/lobster": "^5.2.8", + "@fontsource/pacifico": "^5.2.7", + "@fontsource/playfair-display": "^5.2.8", + "@fontsource/poppins": "^5.2.7", + "@fontsource/rethink-sans": "^5.2.8", + "@fontsource/source-code-pro": "^5.2.7", "@fullcalendar/common": "^5.11.5", "@microsoft/signalr": "^8.0.0", "@pgrabovets/json-view": "^2.7.5", @@ -58,7 +67,6 @@ "@vincjo/datatables": "^2.8.0", "apexcharts": "^3.44.2", "axios": "^1.6.2", - "bootstrap": "^5.3.2", "chart.js": "^4.4.0", "drawflow": "^0.0.59", "flatpickr": "^4.6.13", @@ -83,7 +91,6 @@ "svelte-splitpanes": "^8.0.12", "svelte-viewport-info": "^1.0.1", "svelvet": "^9.0.0", - "sweetalert2": "^11.12.4", "swiper": "^10.3.1", "tailwindcss": "^4.2.2", "uuid": "^10.0.0" diff --git a/src/app.css b/src/app.css index 3d552a61..dd5c4e42 100644 --- a/src/app.css +++ b/src/app.css @@ -1,2 +1,55 @@ @import "tailwindcss"; +@plugin "@tailwindcss/forms"; +@plugin "@tailwindcss/typography"; + +@theme { + --font-sans: 'Poppins', ui-sans-serif, system-ui, sans-serif; + + /* Fancy / accent fonts — use via Tailwind utilities: font-display, font-script, font-handwriting, font-condensed */ + --font-display: 'Playfair Display', ui-serif, Georgia, serif; + --font-script: 'Pacifico', cursive; + --font-handwriting: 'Lobster', cursive; + --font-condensed: 'Bebas Neue', ui-sans-serif, system-ui, sans-serif; + --font-averia: 'Averia Libre', ui-serif, Georgia, serif; + --font-libre: 'Libre Baskerville', ui-serif, Georgia, serif; + --font-code: 'Source Code Pro', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + --font-rethink: 'Rethink Sans', ui-sans-serif, system-ui, sans-serif; + + /* Brand colors (overridable at runtime via PUBLIC_PRIMARY_COLOR / PUBLIC_SECONDARY_COLOR) */ + --color-primary: #6f42c1; + --color-primary-hover: color-mix(in srgb, var(--color-primary), black 20%); + --color-secondary: #74788d; + --color-secondary-hover: color-mix(in srgb, var(--color-secondary), black 20%); + + /* Semantic state colors (matched to original Skote palette) */ + --color-success: #34c38f; + --color-info: #50a5f1; + --color-warning: #f1b44c; + --color-danger: #f46a6a; + + /* Neutrals */ + --color-light: #eff2f7; + --color-dark: #343a40; + --color-muted: #74788d; + + /* Layout dimensions */ + --header-height: 70px; + --sidebar-width: 250px; + --sidebar-collapsed-width: 70px; + --footer-height: 60px; + --rightbar-width: 280px; + + /* Sidebar palette (light theme) */ + --sidebar-bg: #ffffff; + --sidebar-menu-item-color: #545a6d; + --sidebar-menu-item-icon-color: #7f8387; + --sidebar-menu-item-hover-color: #383c40; + --sidebar-menu-title-color: #7f8387; +} + +@layer base { + body { + font-weight: 300; + } +} diff --git a/src/lib/common/audio-player/AudioPlayer.svelte b/src/lib/common/audio-player/AudioPlayer.svelte index eeef2199..0408a049 100644 --- a/src/lib/common/audio-player/AudioPlayer.svelte +++ b/src/lib/common/audio-player/AudioPlayer.svelte @@ -161,7 +161,7 @@ player.addEventListener("loadedmetadata", () => { $duration = player.duration; }); - + player.addEventListener("error", () => { console.warn("An audio error has occurred, player will skip forward in 2 seconds."); if ($audioList.length > 1) { @@ -230,6 +230,22 @@ } }); + // Bootstrap playerListHeight whenever the list is shown. + // The original transitionend listener in onMount only updates the height + // after a real height transition runs — but with playerListHeight=0 + // initially, the very first toggle goes 0 → 0 and no transition fires, + // so the list would stay invisible forever. Read scrollHeight directly + // here; it reports the natural content height even while overflow is + // clipped and the visible height is 0. + $effect(() => { + // Reading $audioList here registers it as a dependency so the height + // also recomputes when the playlist contents change (e.g. tracks + // added or removed after mount), not just on isShowList flips. + if (isShowList && playListElement && $audioList.length > 0) { + playerListHeight = Math.min(playListElement.scrollHeight, listMaxHeight); + } + }); + const play = () => { if (mutex) { stopAll(); @@ -514,4 +530,329 @@ - \ No newline at end of file + + + diff --git a/src/lib/common/audio-player/AudioSpeaker.svelte b/src/lib/common/audio-player/AudioSpeaker.svelte index 48e4c0db..038ec424 100644 --- a/src/lib/common/audio-player/AudioSpeaker.svelte +++ b/src/lib/common/audio-player/AudioSpeaker.svelte @@ -87,15 +87,17 @@ class="{disableDefaultStyles ? '' : 'chat-speaker-container'} line-align-center {containerClasses}" style={`${containerStyles}`} > -
speak()}> +
speak()}> {#if !speaking} - + title="Play" + > + {:else} - + {/if}
\ No newline at end of file diff --git a/src/lib/common/audio-player/MessageAudioPlayer.svelte b/src/lib/common/audio-player/MessageAudioPlayer.svelte index 7fb98821..91c65ee1 100644 --- a/src/lib/common/audio-player/MessageAudioPlayer.svelte +++ b/src/lib/common/audio-player/MessageAudioPlayer.svelte @@ -111,7 +111,7 @@ {#if !speaking} {:else} - + {/if} \ No newline at end of file diff --git a/src/lib/common/dropdowns/FullScreenDropdown.svelte b/src/lib/common/dropdowns/FullScreenDropdown.svelte index 138a11af..bd7ba062 100644 --- a/src/lib/common/dropdowns/FullScreenDropdown.svelte +++ b/src/lib/common/dropdowns/FullScreenDropdown.svelte @@ -42,8 +42,12 @@ } - diff --git a/src/lib/common/dropdowns/LanguageDropdown.svelte b/src/lib/common/dropdowns/LanguageDropdown.svelte index b89362b0..1bfc99ca 100644 --- a/src/lib/common/dropdowns/LanguageDropdown.svelte +++ b/src/lib/common/dropdowns/LanguageDropdown.svelte @@ -32,42 +32,40 @@ diff --git a/src/lib/common/dropdowns/NotificationDropdown.svelte b/src/lib/common/dropdowns/NotificationDropdown.svelte index dc56a668..ffa9cd03 100644 --- a/src/lib/common/dropdowns/NotificationDropdown.svelte +++ b/src/lib/common/dropdowns/NotificationDropdown.svelte @@ -1,24 +1,9 @@