diff --git a/apps/ui/package.json b/apps/ui/package.json index cc5fe9009..e5133a041 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -14,15 +14,20 @@ "format": "prettier --write --plugin-search-dir=. ." }, "devDependencies": { + "@floating-ui/dom": "1.0.1", "@playwright/test": "1.25.1", + "@popperjs/core": "2.11.6", "@sveltejs/kit": "1.0.0-next.405", "@types/js-cookie": "3.0.2", "@typescript-eslint/eslint-plugin": "5.35.1", "@typescript-eslint/parser": "5.35.1", "autoprefixer": "10.4.8", + "classnames": "2.3.1", "eslint": "8.22.0", "eslint-config-prettier": "8.5.0", "eslint-plugin-svelte3": "4.0.0", + "flowbite": "1.5.2", + "flowbite-svelte": "0.26.2", "postcss": "8.4.16", "prettier": "2.7.1", "prettier-plugin-svelte": "2.7.0", diff --git a/apps/ui/src/lib/components/DocLink.svelte b/apps/ui/src/lib/components/DocLink.svelte new file mode 100644 index 000000000..407605df2 --- /dev/null +++ b/apps/ui/src/lib/components/DocLink.svelte @@ -0,0 +1,37 @@ + + +
+ + +
+{#if id} + {#if isLink} + LINK + {:else} + {@html explanation} + {/if} +{/if} diff --git a/apps/ui/src/lib/components/Setting.svelte b/apps/ui/src/lib/components/Setting.svelte index 04e5f1eac..339814921 100644 --- a/apps/ui/src/lib/components/Setting.svelte +++ b/apps/ui/src/lib/components/Setting.svelte @@ -1,6 +1,8 @@ -
+
-
{title}
- +
+ {title} +
-
+
Use setting
+ +{#if dataTooltip} + {dataTooltip} +{/if} diff --git a/apps/ui/src/lib/components/Tooltip.svelte b/apps/ui/src/lib/components/Tooltip.svelte new file mode 100644 index 000000000..c20e4836d --- /dev/null +++ b/apps/ui/src/lib/components/Tooltip.svelte @@ -0,0 +1,8 @@ + + + diff --git a/apps/ui/src/lib/locales/en.json b/apps/ui/src/lib/locales/en.json index 3b6386f93..2a18d41e2 100644 --- a/apps/ui/src/lib/locales/en.json +++ b/apps/ui/src/lib/locales/en.json @@ -209,7 +209,7 @@ "expose_a_port": "Expose a port", "enable_preview_deploy_mr_pr_requests": "Enable preview deployments from pull or merge requests.", "debug_logs": "Debug Logs", - "enable_debug_log_during_build": "Enable debug logs during build phase.
Sensitive information could be visible and saved in logs.", + "enable_debug_log_during_build": "Enable debug logs during build phase.
Sensitive information could be visible and saved in logs.", "cant_activate_auto_deploy_without_repo": "Cannot activate automatic deployments until only one application is defined for this repository / branch.", "no_applications_found": "No applications found", "secret__batch_dot_env": "Paste .env file", @@ -275,7 +275,7 @@ "application_id": "Application ID", "group_name": "Group Name", "oauth_id": "OAuth ID", - "oauth_id_explainer": "The OAuth ID is the unique identifier of the GitLab application.
You can find it in the URL of your GitLab OAuth Application.", + "oauth_id_explainer": "The OAuth ID is the unique identifier of the GitLab application.
You can find it in the URL of your GitLab OAuth Application.", "register_oauth_gitlab": "Register new OAuth application on GitLab", "gitlab": { "self_hosted": "Instance-wide application (self-hosted)", diff --git a/apps/ui/src/routes/__layout.svelte b/apps/ui/src/routes/__layout.svelte index 5f19fe0ad..fcf040cd5 100644 --- a/apps/ui/src/routes/__layout.svelte +++ b/apps/ui/src/routes/__layout.svelte @@ -88,6 +88,7 @@ import { errorNotification } from '$lib/common'; import { appSession } from '$lib/store'; import Toasts from '$lib/components/Toasts.svelte'; + import Tooltip from '$lib/components/Tooltip.svelte'; if (userId) $appSession.userId = userId; if (teamId) $appSession.teamId = teamId; @@ -132,12 +133,12 @@ {/if}
-
+
+
@@ -400,3 +410,16 @@
+ +Dashboard +Applications +Git Sources +Destinations +Databases +Services +IAM +Settings +Logout diff --git a/apps/ui/src/routes/applications/[id]/__layout.svelte b/apps/ui/src/routes/applications/[id]/__layout.svelte index 4cf80ef4d..3d0e656d0 100644 --- a/apps/ui/src/routes/applications/[id]/__layout.svelte +++ b/apps/ui/src/routes/applications/[id]/__layout.svelte @@ -62,6 +62,7 @@ import { t } from '$lib/translations'; import { appSession, disabledButton, status, location, setLocation, addToast } from '$lib/store'; import { errorNotification, handlerNotFoundLoad } from '$lib/common'; + import Tooltip from '$lib/components/Tooltip.svelte'; let statusInterval: any; $disabledButton = @@ -115,6 +116,10 @@ $status.application.initialLoading = true; $status.application.loading = true; await post(`/applications/${id}/restart`, {}); + addToast({ + type: 'success', + message: 'Restart successful.' + }); } catch (error) { return errorNotification(error); } finally { @@ -174,9 +179,10 @@
+ +Configurations +Secrets +Persistent Storages +Previews +Application Logs +Build Logs +Delete diff --git a/apps/ui/src/routes/applications/[id]/configuration/_PublicRepository.svelte b/apps/ui/src/routes/applications/[id]/configuration/_PublicRepository.svelte index 851b04587..3d852715e 100644 --- a/apps/ui/src/routes/applications/[id]/configuration/_PublicRepository.svelte +++ b/apps/ui/src/routes/applications/[id]/configuration/_PublicRepository.svelte @@ -164,7 +164,6 @@
{#if branchSelectOptions.length > 0} @@ -193,7 +192,5 @@
- +
diff --git a/apps/ui/src/routes/applications/[id]/configuration/source.svelte b/apps/ui/src/routes/applications/[id]/configuration/source.svelte index 6c02f35e1..6114afb5c 100644 --- a/apps/ui/src/routes/applications/[id]/configuration/source.svelte +++ b/apps/ui/src/routes/applications/[id]/configuration/source.svelte @@ -32,7 +32,8 @@ import { errorNotification } from '$lib/common'; import { appSession } from '$lib/store'; import PublicRepository from './_PublicRepository.svelte'; -import Explainer from '$lib/components/Explainer.svelte'; + import Explainer from '$lib/components/Explainer.svelte'; + import DocLink from '$lib/components/DocLink.svelte'; const { id } = $page.params; const from = $page.url.searchParams.get('from'); @@ -192,7 +193,6 @@ import Explainer from '$lib/components/Explainer.svelte';
{/if}
-
Public Repository
- - +
Public Repository
+
diff --git a/apps/ui/src/routes/applications/[id]/index.svelte b/apps/ui/src/routes/applications/[id]/index.svelte index 283fb1ab0..6cbf6444e 100644 --- a/apps/ui/src/routes/applications/[id]/index.svelte +++ b/apps/ui/src/routes/applications/[id]/index.svelte @@ -39,7 +39,9 @@ import { addToast, appSession, disabledButton, setLocation, status } from '$lib/store'; import { t } from '$lib/translations'; import { errorNotification, getDomain, notNodeDeployments, staticDeployments } from '$lib/common'; - import Setting from './_Setting.svelte'; + import Setting from '$lib/components/Setting.svelte'; + import Tooltip from '$lib/components/Tooltip.svelte'; + import DocLink from '$lib/components/DocLink.svelte'; const { id } = $page.params; $: isDisabled = @@ -281,6 +283,7 @@
{#if application.gitSource?.htmlUrl && application.repository && application.branch} {/if} + Open on Git {/if}
@@ -426,7 +430,7 @@ > {/if} -
+
@@ -440,10 +444,15 @@
{#if application.buildCommand || application.buildPack === 'rust' || application.buildPack === 'laravel'} -
+
+ >{$t('application.base_build_image')} + +
-
{/if} {#if application.buildPack !== 'docker' && (application.buildPack === 'nextjs' || application.buildPack === 'nuxtjs')}
Deployment Type +
Static is for static websites, node is for server-side applications."} + />
-
- !$status.application.isRunning && changeSettings('dualCerts')} - /> -
{/if} {#if application.buildPack === 'python'}
@@ -658,7 +661,11 @@
{/if}
- + -
Useful if you would like to use your own reverse proxy or tunnel and also in development mode. Otherwise leave empty.'} - />
{#if !notNodeDeployments.includes(application.buildPack)}
@@ -715,7 +719,9 @@ {#if application.buildPack === 'docker'}
Dockerfile Location /data/Dockerfile or /Dockerfile."} + /> -
{/if} {#if application.buildPack === 'deno'} @@ -743,7 +746,11 @@ />
- + -
{/if} {#if application.buildPack !== 'laravel' && application.buildPack !== 'heroku'}
{$t('forms.base_directory')} + Could be useful with monorepos."} + /> -
{$t('forms.publish_directory')} + For example: dist,_site or public."} + /> -
changeSettings('autodeploy')} @@ -815,6 +824,7 @@ {#if !application.settings.isBot}
changeSettings('previews')} @@ -825,6 +835,7 @@ {/if}
changeSettings('debug')} diff --git a/apps/ui/src/routes/applications/[id]/logs/_BuildLog.svelte b/apps/ui/src/routes/applications/[id]/logs/_BuildLog.svelte index 206cdfc5a..48fc836b8 100644 --- a/apps/ui/src/routes/applications/[id]/logs/_BuildLog.svelte +++ b/apps/ui/src/routes/applications/[id]/logs/_BuildLog.svelte @@ -11,6 +11,7 @@ import { t } from '$lib/translations'; import LoadingLogs from '$lib/components/LoadingLogs.svelte'; import { errorNotification } from '$lib/common'; + import Tooltip from '$lib/components/Tooltip.svelte'; let logs: any = []; let loading = true; @@ -108,9 +109,9 @@ {:else}
+ Follow Logs {#if currentStatus === 'running'} + Cancel build {/if}
{#if logs.length > 0} diff --git a/apps/ui/src/routes/applications/[id]/logs/index.svelte b/apps/ui/src/routes/applications/[id]/logs/index.svelte index 75a650bfa..93c7c4bca 100644 --- a/apps/ui/src/routes/applications/[id]/logs/index.svelte +++ b/apps/ui/src/routes/applications/[id]/logs/index.svelte @@ -5,6 +5,7 @@ import { errorNotification } from '$lib/common'; import LoadingLogs from '$lib/components/LoadingLogs.svelte'; import { onMount, onDestroy } from 'svelte'; +import Tooltip from '$lib/components/Tooltip.svelte'; let application: any = {}; let logsLoading = false; @@ -146,9 +147,9 @@ {/if}
+ Follow Logs
+ {'Service exited with an error!'} {/if} {#if $status.database.initialLoading} + {'Stop'} {:else} + {'Start'} {/if} {/if}
- + {'Configuration'}
- + {'Logs'} + {'Delete'} {/if} diff --git a/apps/ui/src/routes/databases/[id]/logs/index.svelte b/apps/ui/src/routes/databases/[id]/logs/index.svelte index 308d9819c..7b63a6362 100644 --- a/apps/ui/src/routes/databases/[id]/logs/index.svelte +++ b/apps/ui/src/routes/databases/[id]/logs/index.svelte @@ -6,6 +6,7 @@ import { get } from '$lib/api'; import { t } from '$lib/translations'; import { errorNotification } from '$lib/common'; + import Tooltip from '$lib/components/Tooltip.svelte'; const { id } = $page.params; @@ -129,9 +130,9 @@ {/if}
+ Follow Logs
{#if $appSession.teamId === '0'} -
+

${ + description={`This will install a proxy on the destination to allow you to access your applications and services without any manual configuration.${ cannotDisable ? 'You cannot disable this proxy as FQDN is configured for Coolify.' : '' diff --git a/apps/ui/src/routes/destinations/[id]/_NewLocalDocker.svelte b/apps/ui/src/routes/destinations/[id]/_NewLocalDocker.svelte index 63e6d3fe9..fc6ee4fec 100644 --- a/apps/ui/src/routes/destinations/[id]/_NewLocalDocker.svelte +++ b/apps/ui/src/routes/destinations/[id]/_NewLocalDocker.svelte @@ -33,11 +33,7 @@
{$t('forms.configuration')}
-
{#if $appSession.teamId === '0'} -
+
(payload.isCoolifyProxyUsed = !payload.isCoolifyProxyUsed)} title={$t('destination.use_coolify_proxy')} - description={$t('destination.new.install_proxy')} + description={'This will install a proxy on the destination to allow you to access your applications and services without any manual configuration.'} />
{/if} diff --git a/apps/ui/src/routes/destinations/[id]/_NewRemoteDocker.svelte b/apps/ui/src/routes/destinations/[id]/_NewRemoteDocker.svelte index f754073f9..5e4135d83 100644 --- a/apps/ui/src/routes/destinations/[id]/_NewRemoteDocker.svelte +++ b/apps/ui/src/routes/destinations/[id]/_NewRemoteDocker.svelte @@ -33,18 +33,14 @@ customClass="max-w-[32rem]" text="Remote Docker Engines are using SSH to communicate with the remote docker engine. You need to setup an SSH key in advance on the server and install Docker. -
See docs for more details." +
See docs for more details." />
{$t('forms.configuration')}
-
-
+
(payload.isCoolifyProxyUsed = !payload.isCoolifyProxyUsed)} title={$t('destination.use_coolify_proxy')} - description={$t('destination.new.install_proxy')} + description={'This will install a proxy on the destination to allow you to access your applications and services without any manual configuration.'} />
diff --git a/apps/ui/src/routes/destinations/[id]/_RemoteDocker.svelte b/apps/ui/src/routes/destinations/[id]/_RemoteDocker.svelte index dde84860e..368b51816 100644 --- a/apps/ui/src/routes/destinations/[id]/_RemoteDocker.svelte +++ b/apps/ui/src/routes/destinations/[id]/_RemoteDocker.svelte @@ -259,14 +259,15 @@ />
-
+

${ + description={`This will install a proxy on the destination to allow you to access your applications and services without any manual configuration.${ cannotDisable ? 'You cannot disable this proxy as FQDN is configured for Coolify.' : '' diff --git a/apps/ui/src/routes/destinations/[id]/__layout.svelte b/apps/ui/src/routes/destinations/[id]/__layout.svelte index bf774266f..8cde64d2b 100644 --- a/apps/ui/src/routes/destinations/[id]/__layout.svelte +++ b/apps/ui/src/routes/destinations/[id]/__layout.svelte @@ -40,7 +40,7 @@ } }; } catch (error) { - console.log(error) + console.log(error); return handlerNotFoundLoad(error, url); } }; @@ -56,12 +56,16 @@ import { errorNotification, handlerNotFoundLoad } from '$lib/common'; import { appSession } from '$lib/store'; import DeleteIcon from '$lib/components/DeleteIcon.svelte'; + import Tooltip from '$lib/components/Tooltip.svelte'; const { id } = $page.params; - const isDestinationDeletable = destination?.application.length === 0 && destination?.database.length === 0 && destination?.service.length === 0 - + const isDestinationDeletable = + destination?.application.length === 0 && + destination?.database.length === 0 && + destination?.service.length === 0; + async function deleteDestination(destination: any) { - if (!isDestinationDeletable) return + if (!isDestinationDeletable) return; const sure = confirm($t('application.confirm_to_delete', { name: destination.name })); if (sure) { try { @@ -74,12 +78,12 @@ } function deletable() { if (!isDestinationDeletable) { - return "Please delete all resources before deleting this." + return 'Please delete all resources before deleting this.'; } if ($appSession.isAdmin) { - return $t('destination.delete_destination') + return $t('destination.delete_destination'); } else { - return $t('destination.permission_denied_delete_destination') + return $t('destination.permission_denied_delete_destination'); } } @@ -87,14 +91,15 @@ {#if id !== 'new'} + {deletable()} {/if} diff --git a/apps/ui/src/routes/iam/team/[id]/__layout.svelte b/apps/ui/src/routes/iam/team/[id]/__layout.svelte index 235f008ff..48d45eed8 100644 --- a/apps/ui/src/routes/iam/team/[id]/__layout.svelte +++ b/apps/ui/src/routes/iam/team/[id]/__layout.svelte @@ -35,6 +35,7 @@ import DeleteIcon from '$lib/components/DeleteIcon.svelte'; import { goto } from '$app/navigation'; import Cookies from 'js-cookie'; + import Tooltip from '$lib/components/Tooltip.svelte'; const { id } = $page.params; async function deleteTeam() { @@ -69,15 +70,14 @@ {/if} diff --git a/apps/ui/src/routes/services/[id]/__layout.svelte b/apps/ui/src/routes/services/[id]/__layout.svelte index a19a5fb84..633709a38 100644 --- a/apps/ui/src/routes/services/[id]/__layout.svelte +++ b/apps/ui/src/routes/services/[id]/__layout.svelte @@ -62,6 +62,7 @@ import { errorNotification, handlerNotFoundLoad } from '$lib/common'; import { appSession, disabledButton, status, location, setLocation } from '$lib/store'; import { onDestroy, onMount } from 'svelte'; + import Tooltip from '$lib/components/Tooltip.svelte'; const { id } = $page.params; export let service: any; @@ -108,7 +109,7 @@ } async function startService() { $status.service.initialLoading = true; - $status.service.loading = true + $status.service.loading = true; try { await post(`/services/${service.id}/${service.type}/start`, {}); } catch (error) { @@ -152,9 +153,10 @@ {#if service.type && service.destinationDockerId && service.version} {#if $location} + Open
{/if} {#if $status.service.isExited} + Service exited with an error! {/if} {#if $status.service.initialLoading} + Stop {:else} + Start {/if}
{/if} {#if service.type && service.destinationDockerId && service.version} - + Configuration - + Secrets - + Persistent Storage
- + Logs {/if} + Delete diff --git a/apps/ui/src/routes/services/[id]/logs/index.svelte b/apps/ui/src/routes/services/[id]/logs/index.svelte index f2c4d3229..ba71cc365 100644 --- a/apps/ui/src/routes/services/[id]/logs/index.svelte +++ b/apps/ui/src/routes/services/[id]/logs/index.svelte @@ -5,6 +5,7 @@ import { t } from '$lib/translations'; import { errorNotification } from '$lib/common'; import { onDestroy, onMount } from 'svelte'; + import Tooltip from '$lib/components/Tooltip.svelte'; let service: any = {}; let logsLoading = false; @@ -126,9 +127,9 @@ {/if}
+ Follow Logs
{$t('application.url_fqdn')} +
-
{$t('forms.public_port_range')} +
-
-
-
- Custom DNS servers -
- +
+ Custom DNS servers
-
+ +
- + -
Organization + -
General
{#if $appSession.isAdmin} - {loading ? $t('forms.saving') : $t('forms.save')} {#if source.gitlabAppId} + Delete {/if} diff --git a/apps/ui/tailwind.config.cjs b/apps/ui/tailwind.config.cjs index cc36c7115..f276a039c 100644 --- a/apps/ui/tailwind.config.cjs +++ b/apps/ui/tailwind.config.cjs @@ -1,15 +1,15 @@ const defaultTheme = require('tailwindcss/defaultTheme'); module.exports = { - content: ['./**/*.html', './src/**/*.{js,jsx,ts,tsx,svelte}'], - important: true, + content: ['./**/*.html', './src/**/*.{js,jsx,ts,tsx,svelte}', "./node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}",], + important: true, daisyui: { themes: [ { coollabs: { - "base-100":"#323232", - "base-200":"#242424", - "base-300":"#181818", + "base-100": "#323232", + "base-200": "#242424", + "base-300": "#181818", "primary": "#6d28d9", "primary-content": "#fff", "secondary": "#343232", @@ -40,13 +40,13 @@ module.exports = { sans: ['Poppins', ...defaultTheme.fontFamily.sans] }, colors: { - "applications":"#16A34A", - "databases":"#9333EA", - "destinations":"#0284C7", - "sources":"#EA580C", - "services":"#DB2777", - "settings":"#FEE440", - "iam":"#C026D3", + "applications": "#16A34A", + "databases": "#9333EA", + "destinations": "#0284C7", + "sources": "#EA580C", + "services": "#DB2777", + "settings": "#FEE440", + "iam": "#C026D3", coollabs: '#6B16ED', 'coollabs-100': '#7317FF', coolblack: '#161616', @@ -62,5 +62,6 @@ module.exports = { scrollbar: ['dark'], extend: {} }, + darkMode: 'class', plugins: [require('tailwindcss-scrollbar'), require('daisyui'), require("@tailwindcss/typography")] }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d584ae13..24004da17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -131,7 +131,9 @@ importers: apps/ui: specifiers: + '@floating-ui/dom': ^1.0.1 '@playwright/test': 1.25.1 + '@popperjs/core': ^2.11.6 '@sveltejs/adapter-static': 1.0.0-next.39 '@sveltejs/kit': 1.0.0-next.405 '@tailwindcss/typography': ^0.5.4 @@ -139,11 +141,14 @@ importers: '@typescript-eslint/eslint-plugin': 5.35.1 '@typescript-eslint/parser': 5.35.1 autoprefixer: 10.4.8 + classnames: ^2.3.1 cuid: 2.1.8 daisyui: 2.24.0 eslint: 8.22.0 eslint-config-prettier: 8.5.0 eslint-plugin-svelte3: 4.0.0 + flowbite: ^1.5.2 + flowbite-svelte: ^0.26.2 js-cookie: 3.0.1 p-limit: 4.0.0 postcss: 8.4.16 @@ -169,15 +174,20 @@ importers: svelte-select: 4.4.7 sveltekit-i18n: 2.2.2_svelte@3.49.0 devDependencies: + '@floating-ui/dom': 1.0.1 '@playwright/test': 1.25.1 + '@popperjs/core': 2.11.6 '@sveltejs/kit': 1.0.0-next.405_svelte@3.49.0+vite@3.0.5 '@types/js-cookie': 3.0.2 '@typescript-eslint/eslint-plugin': 5.35.1_ktjxjibzrfqejavile4bhmzhjq '@typescript-eslint/parser': 5.35.1_4rv7y5c6xz3vfxwhbrcxxi73bq autoprefixer: 10.4.8_postcss@8.4.16 + classnames: 2.3.1 eslint: 8.22.0 eslint-config-prettier: 8.5.0_eslint@8.22.0 eslint-plugin-svelte3: 4.0.0_laaqauvsmoyypsiqkozwyi2fn4 + flowbite: 1.5.2 + flowbite-svelte: 0.26.2 postcss: 8.4.16 prettier: 2.7.1 prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi @@ -369,6 +379,16 @@ packages: - supports-color dev: false + /@floating-ui/core/1.0.1: + resolution: {integrity: sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==} + dev: true + + /@floating-ui/dom/1.0.1: + resolution: {integrity: sha512-wBDiLUKWU8QNPNOTAFHiIAkBv1KlHauG2AhqjSeh2H+wR8PX+AArXfz8NkRexH5PgMJMmSOS70YS89AbWYh5dA==} + dependencies: + '@floating-ui/core': 1.0.1 + dev: true + /@humanwhocodes/config-array/0.10.4: resolution: {integrity: sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==} engines: {node: '>=10.10.0'} @@ -458,6 +478,10 @@ packages: playwright-core: 1.25.1 dev: true + /@popperjs/core/2.11.6: + resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + dev: true + /@prisma/client/3.15.2_prisma@3.15.2: resolution: {integrity: sha512-ErqtwhX12ubPhU4d++30uFY/rPcyvjk+mdifaZO5SeM21zS3t4jQrscy8+6IyB0GIYshl5ldTq6JSBo1d63i8w==} engines: {node: '>=12.6'} @@ -2000,6 +2024,10 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false + /classnames/2.3.1: + resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} + dev: true + /clean-stack/4.2.0: resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} engines: {node: '>=12'} @@ -3461,6 +3489,24 @@ packages: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} dev: true + /flowbite-svelte/0.26.2: + resolution: {integrity: sha512-CpZ33fyMuzrYvECKN2rD5zNa/ZY0c4cDMcY6wE/hvajFybbCqwMYzd0AkA88zTNm5fknEN0/E23TVmD4Qkhzzw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@floating-ui/dom': 1.0.1 + '@popperjs/core': 2.11.6 + classnames: 2.3.1 + flowbite: 1.5.2 + svelte-heros: 2.3.5 + dev: true + + /flowbite/1.5.2: + resolution: {integrity: sha512-oSKhPkg0bYb4dZG4ypSh++dPrFM3IOSER6HOwJHYRFPW5u9PXL4AQFMQh7Kytgws2xrDQyl/zqefZmymeWt2IA==} + dependencies: + '@popperjs/core': 2.11.6 + mini-svg-data-uri: 1.4.4 + dev: true + /follow-redirects/1.15.0: resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==} engines: {node: '>=4.0'} @@ -4482,6 +4528,11 @@ packages: engines: {node: '>=4'} dev: true + /mini-svg-data-uri/1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + dev: true + /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: false @@ -5856,6 +5907,10 @@ packages: - sugarss dev: true + /svelte-heros/2.3.5: + resolution: {integrity: sha512-08PdccaeRPP1pVa90AGieTwGzrNtXpC1Fry+i95OTvcR3xbGRU/hxK4rnaFYvGgk1Pxj9YT6GKGTEX8uXE9XJQ==} + dev: true + /svelte-hmr/0.14.12_svelte@3.49.0: resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} engines: {node: ^12.20 || ^14.13.1 || >= 16}