diff --git a/package.json b/package.json
index 2877f3075..81d2b248a 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23",
"@appwrite.io/pink-legacy": "^1.0.3",
- "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6b17cb23",
+ "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29469d7",
"@popperjs/core": "^2.11.8",
"@sentry/sveltekit": "^8.38.0",
"@stripe/stripe-js": "^3.5.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3469cc543..81ad7c8b0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -21,8 +21,8 @@ importers:
specifier: ^1.0.3
version: 1.0.3
'@appwrite.io/pink-svelte':
- specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6b17cb23
- version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6b17cb23(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)
+ specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29469d7
+ version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29469d7(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)
'@popperjs/core':
specifier: ^2.11.8
version: 2.11.8
@@ -221,14 +221,14 @@ packages:
resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e}
version: 1.2.1
- '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23':
- resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23}
+ '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29469d70d89184306f1766f80ec4af4fab5c4939':
+ resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29469d70d89184306f1766f80ec4af4fab5c4939}
version: 1.0.0-next.7
peerDependencies:
svelte: ^4.0.0
- '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23ba11fbe98d56b96058a79ecc48b23120':
- resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23ba11fbe98d56b96058a79ecc48b23120}
+ '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23':
+ resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23}
version: 1.0.0-next.7
peerDependencies:
svelte: ^4.0.0
@@ -242,8 +242,8 @@ packages:
'@appwrite.io/pink-legacy@1.0.3':
resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==}
- '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6b17cb23':
- resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6b17cb23}
+ '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29469d7':
+ resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29469d7}
version: 1.0.0-next.85
peerDependencies:
react-dom: ^18.0.0
@@ -3536,11 +3536,11 @@ snapshots:
'@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@e2f082e': {}
- '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23(svelte@5.25.3)':
+ '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29469d70d89184306f1766f80ec4af4fab5c4939(svelte@5.25.3)':
dependencies:
svelte: 5.25.3
- '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23ba11fbe98d56b96058a79ecc48b23120(svelte@5.25.3)':
+ '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23(svelte@5.25.3)':
dependencies:
svelte: 5.25.3
@@ -3553,9 +3553,9 @@ snapshots:
'@appwrite.io/pink-icons': 1.0.0
the-new-css-reset: 1.11.3
- '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6b17cb23(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)':
+ '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29469d7(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)':
dependencies:
- '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23ba11fbe98d56b96058a79ecc48b23120(svelte@5.25.3)
+ '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29469d70d89184306f1766f80ec4af4fab5c4939(svelte@5.25.3)
'@floating-ui/dom': 1.6.13
'@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.3))(svelte@5.25.3)
'@melt-ui/svelte': 0.86.6(svelte@5.25.3)
diff --git a/src/lib/components/columnSelector.svelte b/src/lib/components/columnSelector.svelte
new file mode 100644
index 000000000..67e621ee2
--- /dev/null
+++ b/src/lib/components/columnSelector.svelte
@@ -0,0 +1,92 @@
+
+
+{#if $columns?.length}
+
+ {@render children(toggle, selectedColumnsNumber)}
+
+
+ {#each $columns as column}
+ {#if !column?.exclude}
+ (column.hide = !column.hide)}
+ disabled={allowNoColumns
+ ? false
+ : selectedColumnsNumber <= 1 && column.hide !== true}>
+
+ (column.hide = !column.hide)} />
+ {column.title}
+
+
+ {/if}
+ {/each}
+
+
+
+{/if}
diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts
index d827c596f..b20b38d1f 100644
--- a/src/lib/components/index.ts
+++ b/src/lib/components/index.ts
@@ -81,3 +81,4 @@ export { default as Sidebar } from './sidebar.svelte';
export { default as BottomSheet } from './bottom-sheet/index';
export { default as Confirm } from './confirm.svelte';
export { default as UsageCard } from './usageCard.svelte';
+export { default as ViewToggle } from './viewToggle.svelte';
diff --git a/src/lib/components/viewSelector.svelte b/src/lib/components/viewSelector.svelte
index 85550757b..c09cec650 100644
--- a/src/lib/components/viewSelector.svelte
+++ b/src/lib/components/viewSelector.svelte
@@ -16,6 +16,8 @@
} from '@appwrite.io/pink-svelte';
import { IconViewBoards, IconViewGrid, IconViewList } from '@appwrite.io/pink-icons-svelte';
import { goto } from '$app/navigation';
+ import ViewToggle from './viewToggle.svelte';
+ import ColumnSelector from './columnSelector.svelte';
export let columns: Writable;
export let view: View;
@@ -23,68 +25,11 @@
export let hideView = false;
export let hideColumns = false;
export let allowNoColumns = false;
-
- onMount(async () => {
- if (isCustomCollection) {
- const prefs = preferences.getCustomCollectionColumns(page.params.collection);
- columns.set(
- $columns.map((column) => {
- column.hide = prefs?.includes(column.id) ?? false;
- return column;
- })
- );
- } else {
- const prefs = preferences.get(page.route);
-
- // Override the shown columns only if a preference was set
- if (prefs?.columns) {
- columns.set(
- $columns.map((column) => {
- column.hide = prefs.columns?.includes(column.id) ?? false;
- return column;
- })
- );
- }
- }
-
- columns.subscribe((ctx) => {
- const columns = ctx.filter((n) => n.hide === true).map((n) => n.id);
-
- if (isCustomCollection) {
- preferences.setCustomCollectionColumns(columns);
- } else {
- preferences.setColumns(columns);
- }
- });
- });
-
- function getViewLink(view: View): string {
- const url = new URL(page.url);
- url.searchParams.set('view', view);
- return url.toString();
- }
-
- function updateViewPreferences(view: View) {
- preferences.setView(view);
- }
-
- function onViewChange(event: CustomEvent) {
- updateViewPreferences(event.detail);
- goto(getViewLink(event.detail), {
- replaceState: true
- });
- }
-
- $: selectedColumnsNumber = $columns.reduce((acc, column) => {
- if (column.hide === true) return acc;
-
- return ++acc;
- }, 0);
{#if !hideColumns && view === View.Table}
- {#if $columns?.length}
-
+
+ {#snippet children(toggle, selectedColumnsNumber)}
-
-
-
- {#each $columns as column}
- {#if !column?.exclude}
- (column.hide = !column.hide)}
- checked={!column.hide}
- disabled={allowNoColumns
- ? false
- : selectedColumnsNumber <= 1 && column.hide !== true} />
- {/if}
- {/each}
-
-
-
-
- {/if}
+ {/snippet}
+
{/if}
{#if !hideView}
-
+
{/if}
diff --git a/src/lib/components/viewToggle.svelte b/src/lib/components/viewToggle.svelte
new file mode 100644
index 000000000..350c18d21
--- /dev/null
+++ b/src/lib/components/viewToggle.svelte
@@ -0,0 +1,48 @@
+
+
+
diff --git a/src/lib/layout/displaySettingsModal.svelte b/src/lib/layout/displaySettingsModal.svelte
new file mode 100644
index 000000000..20a0a7706
--- /dev/null
+++ b/src/lib/layout/displaySettingsModal.svelte
@@ -0,0 +1,56 @@
+
+
+
+
+ {#if !hideView}
+
+ Layout
+
+
+ {/if}
+ {#if !hideColumns && $columns?.length}
+
+ Columns
+
+ {#snippet children(toggle, selectedColumnsNumber)}
+
+ Columns
+
+
+ {/snippet}
+
+
+ {/if}
+
+
diff --git a/src/lib/layout/index.ts b/src/lib/layout/index.ts
index 2d7362505..98acd4b51 100644
--- a/src/lib/layout/index.ts
+++ b/src/lib/layout/index.ts
@@ -21,3 +21,4 @@ export { default as WizardSecondaryContainer } from './wizardSecondaryContainer.
export { default as WizardSecondaryContent } from './wizardSecondaryContent.svelte';
export { default as WizardSecondaryFooter } from './wizardSecondaryFooter.svelte';
export { default as Wizard } from './wizard.svelte';
+export { default as ResponsiveContainerHeader } from './responsiveContainerHeader.svelte';
diff --git a/src/lib/layout/responsiveContainerHeader.svelte b/src/lib/layout/responsiveContainerHeader.svelte
new file mode 100644
index 000000000..ee7fed506
--- /dev/null
+++ b/src/lib/layout/responsiveContainerHeader.svelte
@@ -0,0 +1,136 @@
+
+
+
+
+ {#if $isSmallViewport}
+
+
+
+ {@render children()}
+
+ {#if numberOfOptions === 1}
+ {#if hasSearch}
+ {@render searchButton(true)}
+ {:else if hasFilters && $columns?.length}
+ {@render filtersButton(true)}
+ {:else if hasDisplaySettings}
+ {@render settingsButton(true)}
+ {/if}
+ {/if}
+
+ {#if numberOfOptions > 1}
+
+ {#if hasSearch}
+ {@render searchButton()}
+ {/if}
+ {#if hasFilters && $columns?.length}
+ {@render filtersButton()}
+ {/if}
+ {#if hasDisplaySettings}
+ {@render settingsButton()}
+ {/if}
+
+ {/if}
+
+ {#if showSearch && hasSearch}
+
+ {/if}
+
+ {:else}
+
+
+ {#if hasSearch}
+
+ {/if}
+ {#if hasFilters && $columns?.length}
+
+ {/if}
+
+
+ {#if hasDisplaySettings}
+
+ {/if}
+ {@render children()}
+
+
+ {/if}
+
+
+
+
+{#snippet searchButton(icon = false)}
+
+{/snippet}
+
+{#snippet settingsButton(icon = false)}
+
+{/snippet}
+
+{#snippet filtersButton(icon = false)}
+
+{/snippet}
+
+{#if showDisplaySettingsModal}
+
+{/if}
diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/edit.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/edit.svelte
index ead3c07ea..dd4fbd74a 100644
--- a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/edit.svelte
+++ b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/edit.svelte
@@ -92,7 +92,7 @@
this={option.component}
editing
bind:data={selectedAttribute}
- on:close={() => (option = null)} />
+ onclose={() => (option = null)} />
{/if}
{/if}
diff --git a/src/routes/(console)/project-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[project]/sites/site-[site]/deployments/+page.svelte
index 7e14e16c1..ed933f485 100644
--- a/src/routes/(console)/project-[project]/sites/site-[site]/deployments/+page.svelte
+++ b/src/routes/(console)/project-[project]/sites/site-[site]/deployments/+page.svelte
@@ -1,7 +1,7 @@