properly close modal stack in order on escape
This commit is contained in:
		
							parent
							
								
									939d69fe46
								
							
						
					
					
						commit
						c672236412
					
				| 
						 | 
					@ -28,6 +28,7 @@
 | 
				
			||||||
        "gpt-tokenizer": "^2.0.0",
 | 
					        "gpt-tokenizer": "^2.0.0",
 | 
				
			||||||
        "postcss": "^8.4.24",
 | 
					        "postcss": "^8.4.24",
 | 
				
			||||||
        "sass": "^1.61.0",
 | 
					        "sass": "^1.61.0",
 | 
				
			||||||
 | 
					        "stacking-order": "^2.0.0",
 | 
				
			||||||
        "svelte": "^3.58.0",
 | 
					        "svelte": "^3.58.0",
 | 
				
			||||||
        "svelte-check": "^3.4.3",
 | 
					        "svelte-check": "^3.4.3",
 | 
				
			||||||
        "svelte-fa": "^3.0.3",
 | 
					        "svelte-fa": "^3.0.3",
 | 
				
			||||||
| 
						 | 
					@ -3976,6 +3977,12 @@
 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/stacking-order": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/stacking-order/-/stacking-order-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-nnv68iFGwrKXYlmXJKD5qBuH8D49BEv6zAgesXoKeGqMmMit6/Hyvb6R0BG9odpjqQm35YjlTsZUyB0ffbFDrg==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/string.prototype.trim": {
 | 
					    "node_modules/string.prototype.trim": {
 | 
				
			||||||
      "version": "1.2.7",
 | 
					      "version": "1.2.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,7 @@
 | 
				
			||||||
    "gpt-tokenizer": "^2.0.0",
 | 
					    "gpt-tokenizer": "^2.0.0",
 | 
				
			||||||
    "postcss": "^8.4.24",
 | 
					    "postcss": "^8.4.24",
 | 
				
			||||||
    "sass": "^1.61.0",
 | 
					    "sass": "^1.61.0",
 | 
				
			||||||
 | 
					    "stacking-order": "^2.0.0",
 | 
				
			||||||
    "svelte": "^3.58.0",
 | 
					    "svelte": "^3.58.0",
 | 
				
			||||||
    "svelte-check": "^3.4.3",
 | 
					    "svelte-check": "^3.4.3",
 | 
				
			||||||
    "svelte-fa": "^3.0.3",
 | 
					    "svelte-fa": "^3.0.3",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
  import NewChat from './lib/NewChat.svelte'
 | 
					  import NewChat from './lib/NewChat.svelte'
 | 
				
			||||||
  import { chatsStorage, apiKeyStorage } from './lib/Storage.svelte'
 | 
					  import { chatsStorage, apiKeyStorage } from './lib/Storage.svelte'
 | 
				
			||||||
  import { Modals, closeModal } from 'svelte-modals'
 | 
					  import { Modals, closeModal } from 'svelte-modals'
 | 
				
			||||||
 | 
					  import { triggerModalEsc } from './lib/Util.svelte'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // The definition of the routes with some conditions
 | 
					  // The definition of the routes with some conditions
 | 
				
			||||||
  const routes = {
 | 
					  const routes = {
 | 
				
			||||||
| 
						 | 
					@ -51,6 +52,10 @@
 | 
				
			||||||
  />
 | 
					  />
 | 
				
			||||||
</Modals>
 | 
					</Modals>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<svelte:window
 | 
				
			||||||
 | 
					  on:keydown={(e) => triggerModalEsc(e)}
 | 
				
			||||||
 | 
					/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style>
 | 
					<style>
 | 
				
			||||||
  .backdrop {
 | 
					  .backdrop {
 | 
				
			||||||
    position: fixed;
 | 
					    position: fixed;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					declare namespace svelteHTML {
 | 
				
			||||||
 | 
					  interface HTMLAttributes<> {
 | 
				
			||||||
 | 
					    // Custom on:modal-esc event
 | 
				
			||||||
 | 
					    'on:modal-esc'?: (event: any) => any
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -139,12 +139,3 @@
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<input style="display:none" type="file" accept=".json" on:change={(e) => importChatFromFile(e)} bind:this={chatFileInput} >
 | 
					<input style="display:none" type="file" accept=".json" on:change={(e) => importChatFromFile(e)} bind:this={chatFileInput} >
 | 
				
			||||||
 | 
					 | 
				
			||||||
<svelte:window
 | 
					 | 
				
			||||||
  on:keydown={(event) => {
 | 
					 | 
				
			||||||
    if (event.key === 'Escape') {
 | 
					 | 
				
			||||||
      event.stopPropagation()
 | 
					 | 
				
			||||||
      showChatMenu = false
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }}
 | 
					 | 
				
			||||||
/>
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,7 +253,7 @@
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
					<!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
				
			||||||
<div class="modal chat-settings" class:is-active={showSettingsModal}>
 | 
					<div class="modal chat-settings" class:is-active={showSettingsModal} on:modal-esc={closeSettings}>
 | 
				
			||||||
  <div class="modal-background" on:click={closeSettings} />
 | 
					  <div class="modal-background" on:click={closeSettings} />
 | 
				
			||||||
  <div class="modal-card wide" on:click={() => { showProfileMenu = false }}>
 | 
					  <div class="modal-card wide" on:click={() => { showProfileMenu = false }}>
 | 
				
			||||||
    <header class="modal-card-head">
 | 
					    <header class="modal-card-head">
 | 
				
			||||||
| 
						 | 
					@ -322,12 +322,3 @@
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<input style="display:none" type="file" accept=".json" on:change={(e) => importProfileFromFile(e)} bind:this={profileFileInput} >
 | 
					<input style="display:none" type="file" accept=".json" on:change={(e) => importProfileFromFile(e)} bind:this={profileFileInput} >
 | 
				
			||||||
 | 
					 | 
				
			||||||
<svelte:window
 | 
					 | 
				
			||||||
  on:keydown={(event) => {
 | 
					 | 
				
			||||||
    if (event.key === 'Escape') {
 | 
					 | 
				
			||||||
      event.stopPropagation()
 | 
					 | 
				
			||||||
      closeSettings()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }}
 | 
					 | 
				
			||||||
/>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -67,12 +67,12 @@
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const keydown = (event:KeyboardEvent) => {
 | 
					  const keydown = (event:KeyboardEvent) => {
 | 
				
			||||||
    if (event.key === 'Escape') {
 | 
					    // if (event.key === 'Escape') {
 | 
				
			||||||
      event.stopPropagation()
 | 
					    //   event.stopPropagation()
 | 
				
			||||||
      event.preventDefault()
 | 
					    //   event.preventDefault()
 | 
				
			||||||
      message.content = original
 | 
					    //   message.content = original
 | 
				
			||||||
      editing = false
 | 
					    //   editing = false
 | 
				
			||||||
    }
 | 
					    // }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const scrollToMessage = (uuid:string | string[] | undefined) => {
 | 
					  const scrollToMessage = (uuid:string | string[] | undefined) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if isOpen}
 | 
					{#if isOpen}
 | 
				
			||||||
<div class="modal is-active">
 | 
					<div class="modal is-active" on:modal-esc={doCancel}>
 | 
				
			||||||
  <!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
					  <!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
				
			||||||
  <div class="modal-background" on:click={doCancel} />
 | 
					  <div class="modal-background" on:click={doCancel} />
 | 
				
			||||||
  <div class="modal-content nomax">
 | 
					  <div class="modal-content nomax">
 | 
				
			||||||
| 
						 | 
					@ -59,12 +59,3 @@
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
{/if}
 | 
					{/if}
 | 
				
			||||||
 | 
					 | 
				
			||||||
<svelte:window
 | 
					 | 
				
			||||||
  on:keydown={(event) => {
 | 
					 | 
				
			||||||
    if (event.key === 'Escape') {
 | 
					 | 
				
			||||||
      event.stopPropagation()
 | 
					 | 
				
			||||||
      doCancel()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }}
 | 
					 | 
				
			||||||
/>
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,7 @@
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if isOpen}
 | 
					{#if isOpen}
 | 
				
			||||||
<div class="modal is-active">
 | 
					<div class="modal is-active" on:modal-esc={doClose}>
 | 
				
			||||||
  <!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
					  <!-- svelte-ignore a11y-click-events-have-key-events -->
 | 
				
			||||||
  <div class="modal-background" on:click={doClose} />
 | 
					  <div class="modal-background" on:click={doClose} />
 | 
				
			||||||
  <div class="modal-content nomax">
 | 
					  <div class="modal-content nomax">
 | 
				
			||||||
| 
						 | 
					@ -97,11 +97,11 @@
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
{/if}
 | 
					{/if}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<svelte:window
 | 
					<!-- <svelte:window
 | 
				
			||||||
  on:keydown={(event) => {
 | 
					  on:keydown={(event) => {
 | 
				
			||||||
    if (event.key === 'Escape') {
 | 
					    if (event.key === 'Escape') {
 | 
				
			||||||
      event.stopPropagation()
 | 
					      event.stopPropagation()
 | 
				
			||||||
      onClose()
 | 
					      onClose()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }}
 | 
					  }}
 | 
				
			||||||
/>
 | 
					/> -->
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
<script  context="module" lang="ts">
 | 
					<script  context="module" lang="ts">
 | 
				
			||||||
 | 
					  import { compare } from 'stacking-order'
 | 
				
			||||||
  export const sizeTextElements = () => {
 | 
					  export const sizeTextElements = () => {
 | 
				
			||||||
    const els = document.querySelectorAll('textarea.auto-size')
 | 
					    const els = document.querySelectorAll('textarea.auto-size')
 | 
				
			||||||
    for (let i:number = 0, l = els.length; i < l; i++) autoGrowInput(els[i] as HTMLTextAreaElement)
 | 
					    for (let i:number = 0, l = els.length; i < l; i++) autoGrowInput(els[i] as HTMLTextAreaElement)
 | 
				
			||||||
| 
						 | 
					@ -27,4 +28,24 @@
 | 
				
			||||||
        offset
 | 
					        offset
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export const triggerModalEsc = (event:KeyboardEvent|undefined):boolean|void => {
 | 
				
			||||||
 | 
					    if (!event || event.key !== 'Escape') return
 | 
				
			||||||
 | 
					    const stack = Array.from(document.querySelectorAll('.modal')).filter(s =>
 | 
				
			||||||
 | 
					      window.getComputedStyle(s).getPropertyValue('display') !== 'none'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    const top:HTMLElement = stack.length === 1
 | 
				
			||||||
 | 
					      ? stack[0]
 | 
				
			||||||
 | 
					      : stack.find(m1 => {
 | 
				
			||||||
 | 
					        return stack.find(m2 => {
 | 
				
			||||||
 | 
					          return m1 !== m2 && compare(m1, m2) > 0 && m1
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      }) as any
 | 
				
			||||||
 | 
					    if (top) {
 | 
				
			||||||
 | 
					      // trigger modal-esc event on topmost modal when esc key is pressed
 | 
				
			||||||
 | 
					      const e = new CustomEvent('modal-esc', { detail: top })
 | 
				
			||||||
 | 
					      top.dispatchEvent(e)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script> 
 | 
					</script> 
 | 
				
			||||||
		Loading…
	
		Reference in New Issue