From d9ce3a498df17a17a941354243edc605802a914f Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Thu, 26 Jun 2025 16:28:25 +0530 Subject: [PATCH 1/7] fix: improve modal focus with dual autofocus strategy --- .../billing/validateCreditModal.svelte | 1 + src/lib/components/feedback/evaluation.svelte | 17 +++++++- .../feedback/feedbackGeneral.svelte | 11 ++++++ src/lib/components/modal.svelte | 39 +++++++++++++++++++ src/lib/layout/createProject.svelte | 26 +++++++++++++ .../create-organization/+page.svelte | 25 ++++++++++++ .../onboarding/create-project/+page.svelte | 26 ++++++++++++- .../domains/add-domain/+page.svelte | 1 + .../domain-[domain]/createRecordModal.svelte | 8 +++- .../overview/platforms/createWeb.svelte | 1 + .../settings/domains/add-domain/+page.svelte | 1 + .../domains/createPreviewDomainModal.svelte | 2 +- 12 files changed, 154 insertions(+), 4 deletions(-) diff --git a/src/lib/components/billing/validateCreditModal.svelte b/src/lib/components/billing/validateCreditModal.svelte index e73ea2949..9b2f02691 100644 --- a/src/lib/components/billing/validateCreditModal.svelte +++ b/src/lib/components/billing/validateCreditModal.svelte @@ -58,6 +58,7 @@ placeholder="Promo code" id="code" label="Add promo code" + autofocus bind:value={coupon} /> diff --git a/src/lib/components/feedback/evaluation.svelte b/src/lib/components/feedback/evaluation.svelte index deaad320f..5aafc8902 100644 --- a/src/lib/components/feedback/evaluation.svelte +++ b/src/lib/components/feedback/evaluation.svelte @@ -1,7 +1,17 @@
@@ -10,7 +20,12 @@ style="padding-block: 0.13rem"> {#each Array(11) as _, i}
  • - (value = i)}> + (value = i)}> {i}
  • diff --git a/src/lib/components/feedback/feedbackGeneral.svelte b/src/lib/components/feedback/feedbackGeneral.svelte index a60f65f01..a74ff90be 100644 --- a/src/lib/components/feedback/feedbackGeneral.svelte +++ b/src/lib/components/feedback/feedbackGeneral.svelte @@ -1,11 +1,22 @@ diff --git a/src/lib/components/modal.svelte b/src/lib/components/modal.svelte index 2eb562336..6db9a61f1 100644 --- a/src/lib/components/modal.svelte +++ b/src/lib/components/modal.svelte @@ -14,6 +14,7 @@ }; export let title = ''; export let hideFooter = false; + export let autoFocus = true; let alert: HTMLElement; @@ -26,6 +27,44 @@ $: if (error) { alert?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' }); } + + $: if (show && autoFocus) { + setTimeout(() => { + focusFirstElement(); + }, 100); + } + + function focusFirstElement() { + const modalDialog = document.querySelector('dialog[open]') as HTMLElement; + if (!modalDialog) return; + + const autofocusElement = modalDialog.querySelector('[autofocus]') as HTMLElement; + if (autofocusElement) { + autofocusElement.focus(); + return; + } + const activeElement = document.activeElement; + if (activeElement && modalDialog.contains(activeElement)) { + return; + } + const focusableSelectors = [ + 'input:not([disabled]):not([readonly]):not([type="hidden"])', + 'textarea:not([disabled]):not([readonly])', + 'select:not([disabled])', + 'button:not([disabled])', + 'a[href]:not([disabled])', + '[tabindex]:not([tabindex="-1"]):not([disabled])', + '.card-selector:not([disabled])', + '[role="button"]:not([disabled])', + '[role="link"]:not([disabled])', + '[contenteditable="true"]:not([disabled])' + ].join(', '); + + const firstFocusable = modalDialog.querySelector(focusableSelectors) as HTMLElement; + if (firstFocusable) { + firstFocusable.focus(); + } + }
    diff --git a/src/lib/layout/createProject.svelte b/src/lib/layout/createProject.svelte index 1f75e59b1..1bf014d0a 100644 --- a/src/lib/layout/createProject.svelte +++ b/src/lib/layout/createProject.svelte @@ -1,4 +1,5 @@ @@ -34,6 +59,7 @@ label="Name" placeholder="Project name" required + autofocus bind:value={projectName} /> {#if !showCustomId}
    diff --git a/src/routes/(console)/onboarding/create-organization/+page.svelte b/src/routes/(console)/onboarding/create-organization/+page.svelte index 0118c0e3c..fd7c4c257 100644 --- a/src/routes/(console)/onboarding/create-organization/+page.svelte +++ b/src/routes/(console)/onboarding/create-organization/+page.svelte @@ -1,4 +1,5 @@
    diff --git a/src/lib/components/modal.svelte b/src/lib/components/modal.svelte index 6db9a61f1..2eb562336 100644 --- a/src/lib/components/modal.svelte +++ b/src/lib/components/modal.svelte @@ -14,7 +14,6 @@ }; export let title = ''; export let hideFooter = false; - export let autoFocus = true; let alert: HTMLElement; @@ -27,44 +26,6 @@ $: if (error) { alert?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' }); } - - $: if (show && autoFocus) { - setTimeout(() => { - focusFirstElement(); - }, 100); - } - - function focusFirstElement() { - const modalDialog = document.querySelector('dialog[open]') as HTMLElement; - if (!modalDialog) return; - - const autofocusElement = modalDialog.querySelector('[autofocus]') as HTMLElement; - if (autofocusElement) { - autofocusElement.focus(); - return; - } - const activeElement = document.activeElement; - if (activeElement && modalDialog.contains(activeElement)) { - return; - } - const focusableSelectors = [ - 'input:not([disabled]):not([readonly]):not([type="hidden"])', - 'textarea:not([disabled]):not([readonly])', - 'select:not([disabled])', - 'button:not([disabled])', - 'a[href]:not([disabled])', - '[tabindex]:not([tabindex="-1"]):not([disabled])', - '.card-selector:not([disabled])', - '[role="button"]:not([disabled])', - '[role="link"]:not([disabled])', - '[contenteditable="true"]:not([disabled])' - ].join(', '); - - const firstFocusable = modalDialog.querySelector(focusableSelectors) as HTMLElement; - if (firstFocusable) { - firstFocusable.focus(); - } - } diff --git a/src/lib/layout/createProject.svelte b/src/lib/layout/createProject.svelte index 1bf014d0a..856eea30f 100644 --- a/src/lib/layout/createProject.svelte +++ b/src/lib/layout/createProject.svelte @@ -1,5 +1,4 @@ diff --git a/src/routes/(console)/create-organization/+page.svelte b/src/routes/(console)/create-organization/+page.svelte index a45c2cdc3..7cb126160 100644 --- a/src/routes/(console)/create-organization/+page.svelte +++ b/src/routes/(console)/create-organization/+page.svelte @@ -186,6 +186,7 @@ bind:value={name} label="Organization name" placeholder="Enter organization name" + autofocus id="name" required />
    diff --git a/src/routes/(console)/onboarding/create-organization/+page.svelte b/src/routes/(console)/onboarding/create-organization/+page.svelte index fd7c4c257..a5cfa3a3d 100644 --- a/src/routes/(console)/onboarding/create-organization/+page.svelte +++ b/src/routes/(console)/onboarding/create-organization/+page.svelte @@ -1,5 +1,4 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte index ab227bb65..35fb78e81 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte @@ -52,7 +52,7 @@ label="Email" placeholder="Enter email" required={true} - autofocus={true} + autofocus bind:value={email} /> From b26833ec89bfdf83dce8fd8004eec47414418518 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 11:45:20 +0530 Subject: [PATCH 3/7] fix:added autofocus to all components that need it --- src/lib/components/feedback/feedbackGeneral.svelte | 2 +- .../organization-[organization]/createMember.svelte | 2 +- .../(console)/project-[region]-[project]/auth/+page.svelte | 4 ++-- .../project-[region]-[project]/auth/createUser.svelte | 2 +- .../messaging/create-[type]/(type)/email.svelte | 1 + .../messaging/create-[type]/(type)/push.svelte | 1 + .../messaging/create-[type]/(type)/sms.svelte | 1 + .../project-[region]-[project]/storage/+page.svelte | 5 +---- .../project-[region]-[project]/storage/create.svelte | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/components/feedback/feedbackGeneral.svelte b/src/lib/components/feedback/feedbackGeneral.svelte index a74ff90be..14b5d2701 100644 --- a/src/lib/components/feedback/feedbackGeneral.svelte +++ b/src/lib/components/feedback/feedbackGeneral.svelte @@ -16,7 +16,7 @@ diff --git a/src/routes/(console)/organization-[organization]/createMember.svelte b/src/routes/(console)/organization-[organization]/createMember.svelte index 2ea47fb3d..b107cf90c 100644 --- a/src/routes/(console)/organization-[organization]/createMember.svelte +++ b/src/routes/(console)/organization-[organization]/createMember.svelte @@ -26,7 +26,7 @@ name: string, error: string, role: string = isSelfHosted ? 'owner' : 'developer'; - emailInput: HTMLInputElement; + emailInput: HTMLInputElement; async function create() { try { diff --git a/src/routes/(console)/project-[region]-[project]/auth/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/+page.svelte index aa4f5702c..1f2dc4423 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/+page.svelte @@ -60,7 +60,7 @@ - @@ -173,7 +173,7 @@ href="https://appwrite.io/docs/references/cloud/server-nodejs/users" target="user" allowCreate={$canWriteUsers} - on:mousedown={() => showCreateUser.set(true)} /> + on:click={() => showCreateUser.set(true)} /> {/if} diff --git a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte index 201e85353..982c5c7e1 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte @@ -56,7 +56,7 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte index 352715d43..529265b67 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte @@ -106,6 +106,7 @@ id="subject" label="Subject" required + autofocus={true} placeholder="Enter subject" bind:value={subject}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte index 82d12a36f..ad9af669c 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte @@ -116,6 +116,7 @@ id="title" label="Title" required + autofocus={true} placeholder="Enter title" bind:value={title}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte index e71f479f8..d2fe11dd3 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte @@ -96,6 +96,7 @@ id="message" label="Message" required + autofocus={true} maxlength={900} placeholder="Type here..." bind:value={content}> diff --git a/src/routes/(console)/project-[region]-[project]/storage/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/+page.svelte index 9d780c407..7bbac81ce 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/+page.svelte @@ -44,10 +44,7 @@ hideColumns={!data.buckets.total} hideView={!data.buckets.total} /> {#if $canWriteBuckets} - diff --git a/src/routes/(console)/project-[region]-[project]/storage/create.svelte b/src/routes/(console)/project-[region]-[project]/storage/create.svelte index fcb3ca65f..55f73bd22 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/create.svelte @@ -55,7 +55,7 @@ label="Name" placeholder="New bucket" bind:value={name} - autofocus + autofocus={true} required /> {#if !showCustomId} From 27f89eff56dde433943f84c9c9082f179df34d40 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 13:09:01 +0530 Subject: [PATCH 4/7] fix:removed onMount --- .../feedback/feedbackGeneral.svelte | 12 +------ src/lib/components/navbar.svelte | 32 ++++++++++--------- src/lib/components/sidebar.svelte | 10 ++++-- .../auth/createUser.svelte | 2 +- .../create-[type]/(type)/push.svelte | 2 +- .../messaging/create-[type]/(type)/sms.svelte | 2 +- .../storage/create.svelte | 2 +- 7 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/lib/components/feedback/feedbackGeneral.svelte b/src/lib/components/feedback/feedbackGeneral.svelte index 14b5d2701..021fa4661 100644 --- a/src/lib/components/feedback/feedbackGeneral.svelte +++ b/src/lib/components/feedback/feedbackGeneral.svelte @@ -1,22 +1,12 @@ diff --git a/src/lib/components/navbar.svelte b/src/lib/components/navbar.svelte index b1932715e..c87845b4e 100644 --- a/src/lib/components/navbar.svelte +++ b/src/lib/components/navbar.svelte @@ -51,7 +51,7 @@ import { base } from '$app/paths'; import { logout } from '$lib/helpers/logout'; import { app } from '$lib/stores/app'; - import { isTabletViewport } from '$lib/stores/viewport'; + import { isTabletViewport, isSmallViewport } from '$lib/stores/viewport'; import { isCloud } from '$lib/system.js'; import { user } from '$lib/stores/user'; import { Click, trackEvent } from '$lib/actions/analytics'; @@ -166,20 +166,22 @@ >Upgrade {/if} - - { - toggleFeedback(); - trackEvent(Click.FeedbackSubmitClick, { source: 'top_nav' }); - }} - >Feedback - - - - - + {#if !$isSmallViewport} + + { + toggleFeedback(); + trackEvent(Click.FeedbackSubmitClick, { source: 'top_nav' }); + }} + >Feedback + + + + + + {/if} Feedback - + {#if $isSmallViewport} + + {/if} @@ -329,7 +331,9 @@ >Feedback - + {#if $isSmallViewport} + + {/if} diff --git a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte index 982c5c7e1..201e85353 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte @@ -56,7 +56,7 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte index ad9af669c..41e481f95 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte @@ -116,7 +116,7 @@ id="title" label="Title" required - autofocus={true} + autofocus placeholder="Enter title" bind:value={title}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte index d2fe11dd3..ebb0859a6 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte @@ -96,7 +96,7 @@ id="message" label="Message" required - autofocus={true} + autofocus maxlength={900} placeholder="Type here..." bind:value={content}> diff --git a/src/routes/(console)/project-[region]-[project]/storage/create.svelte b/src/routes/(console)/project-[region]-[project]/storage/create.svelte index 55f73bd22..fcb3ca65f 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/create.svelte @@ -55,7 +55,7 @@ label="Name" placeholder="New bucket" bind:value={name} - autofocus={true} + autofocus required /> {#if !showCustomId} From afb5d16e0d459ee08f7ce7c65f51b69b44d3d17c Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 14:26:02 +0530 Subject: [PATCH 5/7] fix: resolved minor issue and removed a unused element to solve lint error caught during check --- src/lib/components/sidebar.svelte | 25 ++++--------------- .../createMember.svelte | 1 - 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index 5019b139f..2285d4b12 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -268,11 +268,6 @@ }} >Feedback - - {#if $isSmallViewport} - - {/if} - @@ -284,11 +279,6 @@ trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); }}> Support - - - - @@ -330,11 +320,6 @@ }} >Feedback - - {#if $isSmallViewport} - - {/if} - @@ -346,11 +331,6 @@ trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); }}> Support - - - - @@ -361,6 +341,11 @@
    +{#if $isSmallViewport} + + +{/if} + {#if subNavigation} - {:else} + {/if} + {#if $isSmallViewport}
    @@ -306,35 +307,33 @@
    {/if} - {#if project} -
    -
    - - - { - toggleFeedback(); - trackEvent('click_menu_feedback', { source: 'side_nav' }); - }} - >Feedback - - + {#if project && $isSmallViewport} +
    + + + { + toggleFeedback(); + trackEvent('click_menu_feedback', { source: 'side_nav' }); + }} + >Feedback + + - - { - $showSupportModal = true; - trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); - }}> - Support - - - -
    + + { + $showSupportModal = true; + trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); + }}> + Support + + +
    {/if}
    From 58b63960fb9e94b9803e8ff2374cff5b7085ee19 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 18:34:42 +0530 Subject: [PATCH 7/7] fix: added else if condition instead of if --- src/lib/components/sidebar.svelte | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index bf7a559b7..59e049f60 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -255,8 +255,7 @@ - {/if} - {#if $isSmallViewport} + {:else if $isSmallViewport}
    @@ -269,6 +268,9 @@ }} >Feedback + + + @@ -280,6 +282,10 @@ trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); }}> Support + + + @@ -340,11 +346,6 @@
    -{#if $isSmallViewport} - - -{/if} - {#if subNavigation}