Skip to content

[@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

Description

@AdiRishi

Preliminary Checks

Reproduction

I've provided a replay instead of a reproduction

Publishable key

pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

Description

Steps to reproduce:

  1. Open an Expo app using @clerk/expo and render AuthView on Android.
  2. Focus the email input field.
  3. Press the return/enter key on the keyboard.
  4. Press it a few more times and continue typing.

Expected behavior:

The email input should behave like a standard single-line email field.

  • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
  • It should not insert newline characters into the email field.

Actual behavior:

On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

  • The field accepts multiple newline characters.
  • You can continue typing after the newline.
  • This makes the email input behave like a multiline field, which seems incorrect for an email input.

On iOS, pressing return closes the keyboard, which seems like the correct behavior.

Screen.Recording.2026-04-17.at.2.51.55.pm.mov

NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

Environment

❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
System:
OS: macOS 26.4.1
CPU: (8) arm64 Apple M3
Memory: 251.42 MB / 16.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
bun: 1.3.12 - /opt/homebrew/bin/bun
Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
Browsers:
Chrome: 147.0.7727.56
Safari: 26.4
npmPackages:
@clerk/expo: ^3.2.0 => 3.2.0
@expo-google-fonts/inter: ^0.4.2 => 0.4.2
@expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
@expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
@expo/ui: ~55.0.11 => 55.0.11
@expo/vector-icons: ^15.1.1 => 15.1.1
@gorhom/bottom-sheet: ^5.2.9 => 5.2.9
@inkjs/ui: ^2.0.0 => 2.0.0
@openai/codex-sdk: ^0.121.0 => 0.121.0
@react-native-community/datetimepicker: 8.6.0 => 8.6.0
@react-native-masked-view/masked-view: 0.3.2 => 0.3.2
@react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
@react-navigation/elements: ^2.9.14 => 2.9.14
@react-navigation/native: ^7.2.2 => 7.2.2
@repo/server: workspace:* => undefined
@sentry/react-native: ^8.8.0 => 8.8.0
@tanstack/react-form: ^1.29.0 => 1.29.0
@tanstack/react-query: ^5.99.0 => 5.99.0
@trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
@trpc/client: ^11.16.0 => 11.16.0
@trpc/tanstack-react-query: ^11.16.0 => 11.16.0
@types/big.js: ^6.2.2 => 6.2.2
@types/node: ^25.6.0 => 25.6.0
@types/react: ~19.2.14 => 19.2.14
@types/yargs: ^17.0.35 => 17.0.35
big.js: ^7.0.1 => 7.0.1
date-fns: ^4.1.0 => 4.1.0
eslint: ^9.39.4 => 9.39.4
eslint-config-expo: ~55.0.0 => 55.0.0
eslint-config-prettier: ^10.1.8 => 10.1.8
expo: ~55.0.15 => 55.0.15
expo-application: ^55.0.14 => 55.0.14
expo-auth-session: ~55.0.14 => 55.0.14
expo-blur: ~55.0.14 => 55.0.14
expo-build-properties: ~55.0.13 => 55.0.13
expo-constants: ~55.0.14 => 55.0.14
expo-crypto: ~55.0.14 => 55.0.14
expo-dev-client: ~55.0.27 => 55.0.27
expo-device: ~55.0.15 => 55.0.15
expo-font: ~55.0.6 => 55.0.6
expo-glass-effect: ~55.0.10 => 55.0.10
expo-haptics: ~55.0.14 => 55.0.14
expo-image: ~55.0.8 => 55.0.8
expo-insights: ~55.0.16 => 55.0.16
expo-linear-gradient: ~55.0.13 => 55.0.13
expo-linking: ~55.0.13 => 55.0.13
expo-network: ~55.0.13 => 55.0.13
expo-router: ~55.0.12 => 55.0.12
expo-secure-store: ~55.0.13 => 55.0.13
expo-splash-screen: ~55.0.18 => 55.0.18
expo-status-bar: ~55.0.5 => 55.0.5
expo-symbols: ~55.0.7 => 55.0.7
expo-system-ui: ~55.0.15 => 55.0.15
expo-updates: ~55.0.20 => 55.0.20
expo-web-browser: ~55.0.14 => 55.0.14
heroui-native: ^1.0.2 => 1.0.2
ink: ^7.0.0 => 7.0.0
prettier: ^3.8.3 => 3.8.3
prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
react: 19.2.0 => 19.2.0
react-devtools-core: ^7.0.1 => 7.0.1
react-dom: 19.2.0 => 19.2.0
react-native: 0.83.4 => 0.83.4
react-native-easing-gradient: ^1.1.1 => 1.1.1
react-native-gesture-handler: ~2.30.1 => 2.30.1
react-native-keyboard-controller: ~1.20.7 => 1.20.7
react-native-reanimated: 4.2.3 => 4.2.3
react-native-safe-area-context: ~5.6.2 => 5.6.2
react-native-screens: ~4.24.0 => 4.24.0
react-native-svg: 15.15.3 => 15.15.3
react-native-web: ~0.21.2 => 0.21.2
react-native-worklets: 0.7.2 => 0.7.2
superjson: ^2.2.6 => 2.2.6
tailwind-merge: ^3.5.0 => 3.5.0
tailwind-variants: ^3.2.2 => 3.2.2
tailwindcss: ^4.2.2 => 4.2.2
tsx: ^4.21.0 => 4.21.0
typescript: ~5.9.3 => 5.9.3
uniwind: ^1.6.2 => 1.6.2
yargs: ^18.0.0 => 18.0.0
zod: ^4.3.6 => 4.3.6

Metadata

Metadata

Assignees

Labels

needs-triageA ticket that needs to be triaged by a team member

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
    Skip to content

    [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

    Description

    @AdiRishi

    Preliminary Checks

    Reproduction

    I've provided a replay instead of a reproduction

    Publishable key

    pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

    Description

    Steps to reproduce:

    1. Open an Expo app using @clerk/expo and render AuthView on Android.
    2. Focus the email input field.
    3. Press the return/enter key on the keyboard.
    4. Press it a few more times and continue typing.

    Expected behavior:

    The email input should behave like a standard single-line email field.

    • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
    • It should not insert newline characters into the email field.

    Actual behavior:

    On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

    • The field accepts multiple newline characters.
    • You can continue typing after the newline.
    • This makes the email input behave like a multiline field, which seems incorrect for an email input.

    On iOS, pressing return closes the keyboard, which seems like the correct behavior.

    Screen.Recording.2026-04-17.at.2.51.55.pm.mov

    NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

    Environment

    ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
    System:
    OS: macOS 26.4.1
    CPU: (8) arm64 Apple M3
    Memory: 251.42 MB / 16.00 GB
    Shell: 5.9 - /bin/zsh
    Binaries:
    Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
    npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
    pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
    bun: 1.3.12 - /opt/homebrew/bin/bun
    Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
    Browsers:
    Chrome: 147.0.7727.56
    Safari: 26.4
    npmPackages:
    @clerk/expo: ^3.2.0 => 3.2.0
    @expo-google-fonts/inter: ^0.4.2 => 0.4.2
    @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
    @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
    @expo/ui: ~55.0.11 => 55.0.11
    @expo/vector-icons: ^15.1.1 => 15.1.1
    @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
    @inkjs/ui: ^2.0.0 => 2.0.0
    @openai/codex-sdk: ^0.121.0 => 0.121.0
    @react-native-community/datetimepicker: 8.6.0 => 8.6.0
    @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
    @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
    @react-navigation/elements: ^2.9.14 => 2.9.14
    @react-navigation/native: ^7.2.2 => 7.2.2
    @repo/server: workspace:* => undefined
    @sentry/react-native: ^8.8.0 => 8.8.0
    @tanstack/react-form: ^1.29.0 => 1.29.0
    @tanstack/react-query: ^5.99.0 => 5.99.0
    @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
    @trpc/client: ^11.16.0 => 11.16.0
    @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
    @types/big.js: ^6.2.2 => 6.2.2
    @types/node: ^25.6.0 => 25.6.0
    @types/react: ~19.2.14 => 19.2.14
    @types/yargs: ^17.0.35 => 17.0.35
    big.js: ^7.0.1 => 7.0.1
    date-fns: ^4.1.0 => 4.1.0
    eslint: ^9.39.4 => 9.39.4
    eslint-config-expo: ~55.0.0 => 55.0.0
    eslint-config-prettier: ^10.1.8 => 10.1.8
    expo: ~55.0.15 => 55.0.15
    expo-application: ^55.0.14 => 55.0.14
    expo-auth-session: ~55.0.14 => 55.0.14
    expo-blur: ~55.0.14 => 55.0.14
    expo-build-properties: ~55.0.13 => 55.0.13
    expo-constants: ~55.0.14 => 55.0.14
    expo-crypto: ~55.0.14 => 55.0.14
    expo-dev-client: ~55.0.27 => 55.0.27
    expo-device: ~55.0.15 => 55.0.15
    expo-font: ~55.0.6 => 55.0.6
    expo-glass-effect: ~55.0.10 => 55.0.10
    expo-haptics: ~55.0.14 => 55.0.14
    expo-image: ~55.0.8 => 55.0.8
    expo-insights: ~55.0.16 => 55.0.16
    expo-linear-gradient: ~55.0.13 => 55.0.13
    expo-linking: ~55.0.13 => 55.0.13
    expo-network: ~55.0.13 => 55.0.13
    expo-router: ~55.0.12 => 55.0.12
    expo-secure-store: ~55.0.13 => 55.0.13
    expo-splash-screen: ~55.0.18 => 55.0.18
    expo-status-bar: ~55.0.5 => 55.0.5
    expo-symbols: ~55.0.7 => 55.0.7
    expo-system-ui: ~55.0.15 => 55.0.15
    expo-updates: ~55.0.20 => 55.0.20
    expo-web-browser: ~55.0.14 => 55.0.14
    heroui-native: ^1.0.2 => 1.0.2
    ink: ^7.0.0 => 7.0.0
    prettier: ^3.8.3 => 3.8.3
    prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
    react: 19.2.0 => 19.2.0
    react-devtools-core: ^7.0.1 => 7.0.1
    react-dom: 19.2.0 => 19.2.0
    react-native: 0.83.4 => 0.83.4
    react-native-easing-gradient: ^1.1.1 => 1.1.1
    react-native-gesture-handler: ~2.30.1 => 2.30.1
    react-native-keyboard-controller: ~1.20.7 => 1.20.7
    react-native-reanimated: 4.2.3 => 4.2.3
    react-native-safe-area-context: ~5.6.2 => 5.6.2
    react-native-screens: ~4.24.0 => 4.24.0
    react-native-svg: 15.15.3 => 15.15.3
    react-native-web: ~0.21.2 => 0.21.2
    react-native-worklets: 0.7.2 => 0.7.2
    superjson: ^2.2.6 => 2.2.6
    tailwind-merge: ^3.5.0 => 3.5.0
    tailwind-variants: ^3.2.2 => 3.2.2
    tailwindcss: ^4.2.2 => 4.2.2
    tsx: ^4.21.0 => 4.21.0
    typescript: ~5.9.3 => 5.9.3
    uniwind: ^1.6.2 => 1.6.2
    yargs: ^18.0.0 => 18.0.0
    zod: ^4.3.6 => 4.3.6

    Metadata

    Metadata

    Assignees

    Labels

    needs-triageA ticket that needs to be triaged by a team member

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
      Skip to content

      [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

      Description

      @AdiRishi

      Preliminary Checks

      Reproduction

      I've provided a replay instead of a reproduction

      Publishable key

      pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

      Description

      Steps to reproduce:

      1. Open an Expo app using @clerk/expo and render AuthView on Android.
      2. Focus the email input field.
      3. Press the return/enter key on the keyboard.
      4. Press it a few more times and continue typing.

      Expected behavior:

      The email input should behave like a standard single-line email field.

      • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
      • It should not insert newline characters into the email field.

      Actual behavior:

      On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

      • The field accepts multiple newline characters.
      • You can continue typing after the newline.
      • This makes the email input behave like a multiline field, which seems incorrect for an email input.

      On iOS, pressing return closes the keyboard, which seems like the correct behavior.

      Screen.Recording.2026-04-17.at.2.51.55.pm.mov

      NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

      Environment

      ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
      System:
      OS: macOS 26.4.1
      CPU: (8) arm64 Apple M3
      Memory: 251.42 MB / 16.00 GB
      Shell: 5.9 - /bin/zsh
      Binaries:
      Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
      npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
      pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
      bun: 1.3.12 - /opt/homebrew/bin/bun
      Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
      Browsers:
      Chrome: 147.0.7727.56
      Safari: 26.4
      npmPackages:
      @clerk/expo: ^3.2.0 => 3.2.0
      @expo-google-fonts/inter: ^0.4.2 => 0.4.2
      @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
      @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
      @expo/ui: ~55.0.11 => 55.0.11
      @expo/vector-icons: ^15.1.1 => 15.1.1
      @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
      @inkjs/ui: ^2.0.0 => 2.0.0
      @openai/codex-sdk: ^0.121.0 => 0.121.0
      @react-native-community/datetimepicker: 8.6.0 => 8.6.0
      @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
      @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
      @react-navigation/elements: ^2.9.14 => 2.9.14
      @react-navigation/native: ^7.2.2 => 7.2.2
      @repo/server: workspace:* => undefined
      @sentry/react-native: ^8.8.0 => 8.8.0
      @tanstack/react-form: ^1.29.0 => 1.29.0
      @tanstack/react-query: ^5.99.0 => 5.99.0
      @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
      @trpc/client: ^11.16.0 => 11.16.0
      @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
      @types/big.js: ^6.2.2 => 6.2.2
      @types/node: ^25.6.0 => 25.6.0
      @types/react: ~19.2.14 => 19.2.14
      @types/yargs: ^17.0.35 => 17.0.35
      big.js: ^7.0.1 => 7.0.1
      date-fns: ^4.1.0 => 4.1.0
      eslint: ^9.39.4 => 9.39.4
      eslint-config-expo: ~55.0.0 => 55.0.0
      eslint-config-prettier: ^10.1.8 => 10.1.8
      expo: ~55.0.15 => 55.0.15
      expo-application: ^55.0.14 => 55.0.14
      expo-auth-session: ~55.0.14 => 55.0.14
      expo-blur: ~55.0.14 => 55.0.14
      expo-build-properties: ~55.0.13 => 55.0.13
      expo-constants: ~55.0.14 => 55.0.14
      expo-crypto: ~55.0.14 => 55.0.14
      expo-dev-client: ~55.0.27 => 55.0.27
      expo-device: ~55.0.15 => 55.0.15
      expo-font: ~55.0.6 => 55.0.6
      expo-glass-effect: ~55.0.10 => 55.0.10
      expo-haptics: ~55.0.14 => 55.0.14
      expo-image: ~55.0.8 => 55.0.8
      expo-insights: ~55.0.16 => 55.0.16
      expo-linear-gradient: ~55.0.13 => 55.0.13
      expo-linking: ~55.0.13 => 55.0.13
      expo-network: ~55.0.13 => 55.0.13
      expo-router: ~55.0.12 => 55.0.12
      expo-secure-store: ~55.0.13 => 55.0.13
      expo-splash-screen: ~55.0.18 => 55.0.18
      expo-status-bar: ~55.0.5 => 55.0.5
      expo-symbols: ~55.0.7 => 55.0.7
      expo-system-ui: ~55.0.15 => 55.0.15
      expo-updates: ~55.0.20 => 55.0.20
      expo-web-browser: ~55.0.14 => 55.0.14
      heroui-native: ^1.0.2 => 1.0.2
      ink: ^7.0.0 => 7.0.0
      prettier: ^3.8.3 => 3.8.3
      prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
      react: 19.2.0 => 19.2.0
      react-devtools-core: ^7.0.1 => 7.0.1
      react-dom: 19.2.0 => 19.2.0
      react-native: 0.83.4 => 0.83.4
      react-native-easing-gradient: ^1.1.1 => 1.1.1
      react-native-gesture-handler: ~2.30.1 => 2.30.1
      react-native-keyboard-controller: ~1.20.7 => 1.20.7
      react-native-reanimated: 4.2.3 => 4.2.3
      react-native-safe-area-context: ~5.6.2 => 5.6.2
      react-native-screens: ~4.24.0 => 4.24.0
      react-native-svg: 15.15.3 => 15.15.3
      react-native-web: ~0.21.2 => 0.21.2
      react-native-worklets: 0.7.2 => 0.7.2
      superjson: ^2.2.6 => 2.2.6
      tailwind-merge: ^3.5.0 => 3.5.0
      tailwind-variants: ^3.2.2 => 3.2.2
      tailwindcss: ^4.2.2 => 4.2.2
      tsx: ^4.21.0 => 4.21.0
      typescript: ~5.9.3 => 5.9.3
      uniwind: ^1.6.2 => 1.6.2
      yargs: ^18.0.0 => 18.0.0
      zod: ^4.3.6 => 4.3.6

      Metadata

      Metadata

      Assignees

      Labels

      needs-triageA ticket that needs to be triaged by a team member

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
        Skip to content

        [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

        Description

        @AdiRishi

        Preliminary Checks

        Reproduction

        I've provided a replay instead of a reproduction

        Publishable key

        pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

        Description

        Steps to reproduce:

        1. Open an Expo app using @clerk/expo and render AuthView on Android.
        2. Focus the email input field.
        3. Press the return/enter key on the keyboard.
        4. Press it a few more times and continue typing.

        Expected behavior:

        The email input should behave like a standard single-line email field.

        • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
        • It should not insert newline characters into the email field.

        Actual behavior:

        On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

        • The field accepts multiple newline characters.
        • You can continue typing after the newline.
        • This makes the email input behave like a multiline field, which seems incorrect for an email input.

        On iOS, pressing return closes the keyboard, which seems like the correct behavior.

        Screen.Recording.2026-04-17.at.2.51.55.pm.mov

        NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

        Environment

        ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
        System:
        OS: macOS 26.4.1
        CPU: (8) arm64 Apple M3
        Memory: 251.42 MB / 16.00 GB
        Shell: 5.9 - /bin/zsh
        Binaries:
        Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
        npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
        pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
        bun: 1.3.12 - /opt/homebrew/bin/bun
        Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
        Browsers:
        Chrome: 147.0.7727.56
        Safari: 26.4
        npmPackages:
        @clerk/expo: ^3.2.0 => 3.2.0
        @expo-google-fonts/inter: ^0.4.2 => 0.4.2
        @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
        @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
        @expo/ui: ~55.0.11 => 55.0.11
        @expo/vector-icons: ^15.1.1 => 15.1.1
        @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
        @inkjs/ui: ^2.0.0 => 2.0.0
        @openai/codex-sdk: ^0.121.0 => 0.121.0
        @react-native-community/datetimepicker: 8.6.0 => 8.6.0
        @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
        @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
        @react-navigation/elements: ^2.9.14 => 2.9.14
        @react-navigation/native: ^7.2.2 => 7.2.2
        @repo/server: workspace:* => undefined
        @sentry/react-native: ^8.8.0 => 8.8.0
        @tanstack/react-form: ^1.29.0 => 1.29.0
        @tanstack/react-query: ^5.99.0 => 5.99.0
        @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
        @trpc/client: ^11.16.0 => 11.16.0
        @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
        @types/big.js: ^6.2.2 => 6.2.2
        @types/node: ^25.6.0 => 25.6.0
        @types/react: ~19.2.14 => 19.2.14
        @types/yargs: ^17.0.35 => 17.0.35
        big.js: ^7.0.1 => 7.0.1
        date-fns: ^4.1.0 => 4.1.0
        eslint: ^9.39.4 => 9.39.4
        eslint-config-expo: ~55.0.0 => 55.0.0
        eslint-config-prettier: ^10.1.8 => 10.1.8
        expo: ~55.0.15 => 55.0.15
        expo-application: ^55.0.14 => 55.0.14
        expo-auth-session: ~55.0.14 => 55.0.14
        expo-blur: ~55.0.14 => 55.0.14
        expo-build-properties: ~55.0.13 => 55.0.13
        expo-constants: ~55.0.14 => 55.0.14
        expo-crypto: ~55.0.14 => 55.0.14
        expo-dev-client: ~55.0.27 => 55.0.27
        expo-device: ~55.0.15 => 55.0.15
        expo-font: ~55.0.6 => 55.0.6
        expo-glass-effect: ~55.0.10 => 55.0.10
        expo-haptics: ~55.0.14 => 55.0.14
        expo-image: ~55.0.8 => 55.0.8
        expo-insights: ~55.0.16 => 55.0.16
        expo-linear-gradient: ~55.0.13 => 55.0.13
        expo-linking: ~55.0.13 => 55.0.13
        expo-network: ~55.0.13 => 55.0.13
        expo-router: ~55.0.12 => 55.0.12
        expo-secure-store: ~55.0.13 => 55.0.13
        expo-splash-screen: ~55.0.18 => 55.0.18
        expo-status-bar: ~55.0.5 => 55.0.5
        expo-symbols: ~55.0.7 => 55.0.7
        expo-system-ui: ~55.0.15 => 55.0.15
        expo-updates: ~55.0.20 => 55.0.20
        expo-web-browser: ~55.0.14 => 55.0.14
        heroui-native: ^1.0.2 => 1.0.2
        ink: ^7.0.0 => 7.0.0
        prettier: ^3.8.3 => 3.8.3
        prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
        react: 19.2.0 => 19.2.0
        react-devtools-core: ^7.0.1 => 7.0.1
        react-dom: 19.2.0 => 19.2.0
        react-native: 0.83.4 => 0.83.4
        react-native-easing-gradient: ^1.1.1 => 1.1.1
        react-native-gesture-handler: ~2.30.1 => 2.30.1
        react-native-keyboard-controller: ~1.20.7 => 1.20.7
        react-native-reanimated: 4.2.3 => 4.2.3
        react-native-safe-area-context: ~5.6.2 => 5.6.2
        react-native-screens: ~4.24.0 => 4.24.0
        react-native-svg: 15.15.3 => 15.15.3
        react-native-web: ~0.21.2 => 0.21.2
        react-native-worklets: 0.7.2 => 0.7.2
        superjson: ^2.2.6 => 2.2.6
        tailwind-merge: ^3.5.0 => 3.5.0
        tailwind-variants: ^3.2.2 => 3.2.2
        tailwindcss: ^4.2.2 => 4.2.2
        tsx: ^4.21.0 => 4.21.0
        typescript: ~5.9.3 => 5.9.3
        uniwind: ^1.6.2 => 1.6.2
        yargs: ^18.0.0 => 18.0.0
        zod: ^4.3.6 => 4.3.6

        Metadata

        Metadata

        Assignees

        Labels

        needs-triageA ticket that needs to be triaged by a team member

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
          Skip to content

          [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

          Description

          @AdiRishi

          Preliminary Checks

          Reproduction

          I've provided a replay instead of a reproduction

          Publishable key

          pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

          Description

          Steps to reproduce:

          1. Open an Expo app using @clerk/expo and render AuthView on Android.
          2. Focus the email input field.
          3. Press the return/enter key on the keyboard.
          4. Press it a few more times and continue typing.

          Expected behavior:

          The email input should behave like a standard single-line email field.

          • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
          • It should not insert newline characters into the email field.

          Actual behavior:

          On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

          • The field accepts multiple newline characters.
          • You can continue typing after the newline.
          • This makes the email input behave like a multiline field, which seems incorrect for an email input.

          On iOS, pressing return closes the keyboard, which seems like the correct behavior.

          Screen.Recording.2026-04-17.at.2.51.55.pm.mov

          NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

          Environment

          ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
          System:
          OS: macOS 26.4.1
          CPU: (8) arm64 Apple M3
          Memory: 251.42 MB / 16.00 GB
          Shell: 5.9 - /bin/zsh
          Binaries:
          Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
          npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
          pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
          bun: 1.3.12 - /opt/homebrew/bin/bun
          Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
          Browsers:
          Chrome: 147.0.7727.56
          Safari: 26.4
          npmPackages:
          @clerk/expo: ^3.2.0 => 3.2.0
          @expo-google-fonts/inter: ^0.4.2 => 0.4.2
          @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
          @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
          @expo/ui: ~55.0.11 => 55.0.11
          @expo/vector-icons: ^15.1.1 => 15.1.1
          @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
          @inkjs/ui: ^2.0.0 => 2.0.0
          @openai/codex-sdk: ^0.121.0 => 0.121.0
          @react-native-community/datetimepicker: 8.6.0 => 8.6.0
          @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
          @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
          @react-navigation/elements: ^2.9.14 => 2.9.14
          @react-navigation/native: ^7.2.2 => 7.2.2
          @repo/server: workspace:* => undefined
          @sentry/react-native: ^8.8.0 => 8.8.0
          @tanstack/react-form: ^1.29.0 => 1.29.0
          @tanstack/react-query: ^5.99.0 => 5.99.0
          @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
          @trpc/client: ^11.16.0 => 11.16.0
          @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
          @types/big.js: ^6.2.2 => 6.2.2
          @types/node: ^25.6.0 => 25.6.0
          @types/react: ~19.2.14 => 19.2.14
          @types/yargs: ^17.0.35 => 17.0.35
          big.js: ^7.0.1 => 7.0.1
          date-fns: ^4.1.0 => 4.1.0
          eslint: ^9.39.4 => 9.39.4
          eslint-config-expo: ~55.0.0 => 55.0.0
          eslint-config-prettier: ^10.1.8 => 10.1.8
          expo: ~55.0.15 => 55.0.15
          expo-application: ^55.0.14 => 55.0.14
          expo-auth-session: ~55.0.14 => 55.0.14
          expo-blur: ~55.0.14 => 55.0.14
          expo-build-properties: ~55.0.13 => 55.0.13
          expo-constants: ~55.0.14 => 55.0.14
          expo-crypto: ~55.0.14 => 55.0.14
          expo-dev-client: ~55.0.27 => 55.0.27
          expo-device: ~55.0.15 => 55.0.15
          expo-font: ~55.0.6 => 55.0.6
          expo-glass-effect: ~55.0.10 => 55.0.10
          expo-haptics: ~55.0.14 => 55.0.14
          expo-image: ~55.0.8 => 55.0.8
          expo-insights: ~55.0.16 => 55.0.16
          expo-linear-gradient: ~55.0.13 => 55.0.13
          expo-linking: ~55.0.13 => 55.0.13
          expo-network: ~55.0.13 => 55.0.13
          expo-router: ~55.0.12 => 55.0.12
          expo-secure-store: ~55.0.13 => 55.0.13
          expo-splash-screen: ~55.0.18 => 55.0.18
          expo-status-bar: ~55.0.5 => 55.0.5
          expo-symbols: ~55.0.7 => 55.0.7
          expo-system-ui: ~55.0.15 => 55.0.15
          expo-updates: ~55.0.20 => 55.0.20
          expo-web-browser: ~55.0.14 => 55.0.14
          heroui-native: ^1.0.2 => 1.0.2
          ink: ^7.0.0 => 7.0.0
          prettier: ^3.8.3 => 3.8.3
          prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
          react: 19.2.0 => 19.2.0
          react-devtools-core: ^7.0.1 => 7.0.1
          react-dom: 19.2.0 => 19.2.0
          react-native: 0.83.4 => 0.83.4
          react-native-easing-gradient: ^1.1.1 => 1.1.1
          react-native-gesture-handler: ~2.30.1 => 2.30.1
          react-native-keyboard-controller: ~1.20.7 => 1.20.7
          react-native-reanimated: 4.2.3 => 4.2.3
          react-native-safe-area-context: ~5.6.2 => 5.6.2
          react-native-screens: ~4.24.0 => 4.24.0
          react-native-svg: 15.15.3 => 15.15.3
          react-native-web: ~0.21.2 => 0.21.2
          react-native-worklets: 0.7.2 => 0.7.2
          superjson: ^2.2.6 => 2.2.6
          tailwind-merge: ^3.5.0 => 3.5.0
          tailwind-variants: ^3.2.2 => 3.2.2
          tailwindcss: ^4.2.2 => 4.2.2
          tsx: ^4.21.0 => 4.21.0
          typescript: ~5.9.3 => 5.9.3
          uniwind: ^1.6.2 => 1.6.2
          yargs: ^18.0.0 => 18.0.0
          zod: ^4.3.6 => 4.3.6

          Metadata

          Metadata

          Assignees

          Labels

          needs-triageA ticket that needs to be triaged by a team member

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
            Skip to content

            [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

            Description

            @AdiRishi

            Preliminary Checks

            Reproduction

            I've provided a replay instead of a reproduction

            Publishable key

            pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

            Description

            Steps to reproduce:

            1. Open an Expo app using @clerk/expo and render AuthView on Android.
            2. Focus the email input field.
            3. Press the return/enter key on the keyboard.
            4. Press it a few more times and continue typing.

            Expected behavior:

            The email input should behave like a standard single-line email field.

            • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
            • It should not insert newline characters into the email field.

            Actual behavior:

            On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

            • The field accepts multiple newline characters.
            • You can continue typing after the newline.
            • This makes the email input behave like a multiline field, which seems incorrect for an email input.

            On iOS, pressing return closes the keyboard, which seems like the correct behavior.

            Screen.Recording.2026-04-17.at.2.51.55.pm.mov

            NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

            Environment

            ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
            System:
            OS: macOS 26.4.1
            CPU: (8) arm64 Apple M3
            Memory: 251.42 MB / 16.00 GB
            Shell: 5.9 - /bin/zsh
            Binaries:
            Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
            npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
            pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
            bun: 1.3.12 - /opt/homebrew/bin/bun
            Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
            Browsers:
            Chrome: 147.0.7727.56
            Safari: 26.4
            npmPackages:
            @clerk/expo: ^3.2.0 => 3.2.0
            @expo-google-fonts/inter: ^0.4.2 => 0.4.2
            @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
            @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
            @expo/ui: ~55.0.11 => 55.0.11
            @expo/vector-icons: ^15.1.1 => 15.1.1
            @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
            @inkjs/ui: ^2.0.0 => 2.0.0
            @openai/codex-sdk: ^0.121.0 => 0.121.0
            @react-native-community/datetimepicker: 8.6.0 => 8.6.0
            @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
            @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
            @react-navigation/elements: ^2.9.14 => 2.9.14
            @react-navigation/native: ^7.2.2 => 7.2.2
            @repo/server: workspace:* => undefined
            @sentry/react-native: ^8.8.0 => 8.8.0
            @tanstack/react-form: ^1.29.0 => 1.29.0
            @tanstack/react-query: ^5.99.0 => 5.99.0
            @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
            @trpc/client: ^11.16.0 => 11.16.0
            @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
            @types/big.js: ^6.2.2 => 6.2.2
            @types/node: ^25.6.0 => 25.6.0
            @types/react: ~19.2.14 => 19.2.14
            @types/yargs: ^17.0.35 => 17.0.35
            big.js: ^7.0.1 => 7.0.1
            date-fns: ^4.1.0 => 4.1.0
            eslint: ^9.39.4 => 9.39.4
            eslint-config-expo: ~55.0.0 => 55.0.0
            eslint-config-prettier: ^10.1.8 => 10.1.8
            expo: ~55.0.15 => 55.0.15
            expo-application: ^55.0.14 => 55.0.14
            expo-auth-session: ~55.0.14 => 55.0.14
            expo-blur: ~55.0.14 => 55.0.14
            expo-build-properties: ~55.0.13 => 55.0.13
            expo-constants: ~55.0.14 => 55.0.14
            expo-crypto: ~55.0.14 => 55.0.14
            expo-dev-client: ~55.0.27 => 55.0.27
            expo-device: ~55.0.15 => 55.0.15
            expo-font: ~55.0.6 => 55.0.6
            expo-glass-effect: ~55.0.10 => 55.0.10
            expo-haptics: ~55.0.14 => 55.0.14
            expo-image: ~55.0.8 => 55.0.8
            expo-insights: ~55.0.16 => 55.0.16
            expo-linear-gradient: ~55.0.13 => 55.0.13
            expo-linking: ~55.0.13 => 55.0.13
            expo-network: ~55.0.13 => 55.0.13
            expo-router: ~55.0.12 => 55.0.12
            expo-secure-store: ~55.0.13 => 55.0.13
            expo-splash-screen: ~55.0.18 => 55.0.18
            expo-status-bar: ~55.0.5 => 55.0.5
            expo-symbols: ~55.0.7 => 55.0.7
            expo-system-ui: ~55.0.15 => 55.0.15
            expo-updates: ~55.0.20 => 55.0.20
            expo-web-browser: ~55.0.14 => 55.0.14
            heroui-native: ^1.0.2 => 1.0.2
            ink: ^7.0.0 => 7.0.0
            prettier: ^3.8.3 => 3.8.3
            prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
            react: 19.2.0 => 19.2.0
            react-devtools-core: ^7.0.1 => 7.0.1
            react-dom: 19.2.0 => 19.2.0
            react-native: 0.83.4 => 0.83.4
            react-native-easing-gradient: ^1.1.1 => 1.1.1
            react-native-gesture-handler: ~2.30.1 => 2.30.1
            react-native-keyboard-controller: ~1.20.7 => 1.20.7
            react-native-reanimated: 4.2.3 => 4.2.3
            react-native-safe-area-context: ~5.6.2 => 5.6.2
            react-native-screens: ~4.24.0 => 4.24.0
            react-native-svg: 15.15.3 => 15.15.3
            react-native-web: ~0.21.2 => 0.21.2
            react-native-worklets: 0.7.2 => 0.7.2
            superjson: ^2.2.6 => 2.2.6
            tailwind-merge: ^3.5.0 => 3.5.0
            tailwind-variants: ^3.2.2 => 3.2.2
            tailwindcss: ^4.2.2 => 4.2.2
            tsx: ^4.21.0 => 4.21.0
            typescript: ~5.9.3 => 5.9.3
            uniwind: ^1.6.2 => 1.6.2
            yargs: ^18.0.0 => 18.0.0
            zod: ^4.3.6 => 4.3.6

            Metadata

            Metadata

            Assignees

            Labels

            needs-triageA ticket that needs to be triaged by a team member

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
              Skip to content

              [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

              Description

              @AdiRishi

              Preliminary Checks

              Reproduction

              I've provided a replay instead of a reproduction

              Publishable key

              pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

              Description

              Steps to reproduce:

              1. Open an Expo app using @clerk/expo and render AuthView on Android.
              2. Focus the email input field.
              3. Press the return/enter key on the keyboard.
              4. Press it a few more times and continue typing.

              Expected behavior:

              The email input should behave like a standard single-line email field.

              • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
              • It should not insert newline characters into the email field.

              Actual behavior:

              On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

              • The field accepts multiple newline characters.
              • You can continue typing after the newline.
              • This makes the email input behave like a multiline field, which seems incorrect for an email input.

              On iOS, pressing return closes the keyboard, which seems like the correct behavior.

              Screen.Recording.2026-04-17.at.2.51.55.pm.mov

              NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

              Environment

              ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
              System:
              OS: macOS 26.4.1
              CPU: (8) arm64 Apple M3
              Memory: 251.42 MB / 16.00 GB
              Shell: 5.9 - /bin/zsh
              Binaries:
              Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
              npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
              pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
              bun: 1.3.12 - /opt/homebrew/bin/bun
              Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
              Browsers:
              Chrome: 147.0.7727.56
              Safari: 26.4
              npmPackages:
              @clerk/expo: ^3.2.0 => 3.2.0
              @expo-google-fonts/inter: ^0.4.2 => 0.4.2
              @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
              @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
              @expo/ui: ~55.0.11 => 55.0.11
              @expo/vector-icons: ^15.1.1 => 15.1.1
              @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
              @inkjs/ui: ^2.0.0 => 2.0.0
              @openai/codex-sdk: ^0.121.0 => 0.121.0
              @react-native-community/datetimepicker: 8.6.0 => 8.6.0
              @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
              @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
              @react-navigation/elements: ^2.9.14 => 2.9.14
              @react-navigation/native: ^7.2.2 => 7.2.2
              @repo/server: workspace:* => undefined
              @sentry/react-native: ^8.8.0 => 8.8.0
              @tanstack/react-form: ^1.29.0 => 1.29.0
              @tanstack/react-query: ^5.99.0 => 5.99.0
              @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
              @trpc/client: ^11.16.0 => 11.16.0
              @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
              @types/big.js: ^6.2.2 => 6.2.2
              @types/node: ^25.6.0 => 25.6.0
              @types/react: ~19.2.14 => 19.2.14
              @types/yargs: ^17.0.35 => 17.0.35
              big.js: ^7.0.1 => 7.0.1
              date-fns: ^4.1.0 => 4.1.0
              eslint: ^9.39.4 => 9.39.4
              eslint-config-expo: ~55.0.0 => 55.0.0
              eslint-config-prettier: ^10.1.8 => 10.1.8
              expo: ~55.0.15 => 55.0.15
              expo-application: ^55.0.14 => 55.0.14
              expo-auth-session: ~55.0.14 => 55.0.14
              expo-blur: ~55.0.14 => 55.0.14
              expo-build-properties: ~55.0.13 => 55.0.13
              expo-constants: ~55.0.14 => 55.0.14
              expo-crypto: ~55.0.14 => 55.0.14
              expo-dev-client: ~55.0.27 => 55.0.27
              expo-device: ~55.0.15 => 55.0.15
              expo-font: ~55.0.6 => 55.0.6
              expo-glass-effect: ~55.0.10 => 55.0.10
              expo-haptics: ~55.0.14 => 55.0.14
              expo-image: ~55.0.8 => 55.0.8
              expo-insights: ~55.0.16 => 55.0.16
              expo-linear-gradient: ~55.0.13 => 55.0.13
              expo-linking: ~55.0.13 => 55.0.13
              expo-network: ~55.0.13 => 55.0.13
              expo-router: ~55.0.12 => 55.0.12
              expo-secure-store: ~55.0.13 => 55.0.13
              expo-splash-screen: ~55.0.18 => 55.0.18
              expo-status-bar: ~55.0.5 => 55.0.5
              expo-symbols: ~55.0.7 => 55.0.7
              expo-system-ui: ~55.0.15 => 55.0.15
              expo-updates: ~55.0.20 => 55.0.20
              expo-web-browser: ~55.0.14 => 55.0.14
              heroui-native: ^1.0.2 => 1.0.2
              ink: ^7.0.0 => 7.0.0
              prettier: ^3.8.3 => 3.8.3
              prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
              react: 19.2.0 => 19.2.0
              react-devtools-core: ^7.0.1 => 7.0.1
              react-dom: 19.2.0 => 19.2.0
              react-native: 0.83.4 => 0.83.4
              react-native-easing-gradient: ^1.1.1 => 1.1.1
              react-native-gesture-handler: ~2.30.1 => 2.30.1
              react-native-keyboard-controller: ~1.20.7 => 1.20.7
              react-native-reanimated: 4.2.3 => 4.2.3
              react-native-safe-area-context: ~5.6.2 => 5.6.2
              react-native-screens: ~4.24.0 => 4.24.0
              react-native-svg: 15.15.3 => 15.15.3
              react-native-web: ~0.21.2 => 0.21.2
              react-native-worklets: 0.7.2 => 0.7.2
              superjson: ^2.2.6 => 2.2.6
              tailwind-merge: ^3.5.0 => 3.5.0
              tailwind-variants: ^3.2.2 => 3.2.2
              tailwindcss: ^4.2.2 => 4.2.2
              tsx: ^4.21.0 => 4.21.0
              typescript: ~5.9.3 => 5.9.3
              uniwind: ^1.6.2 => 1.6.2
              yargs: ^18.0.0 => 18.0.0
              zod: ^4.3.6 => 4.3.6

              Metadata

              Metadata

              Assignees

              Labels

              needs-triageA ticket that needs to be triaged by a team member

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard · Issue #8346 · clerk/javascript · GitHub
                Skip to content

                [@clerk/expo] AuthView email field on Android accepts newline characters instead of dismissing the keyboard #8346

                Description

                @AdiRishi

                Preliminary Checks

                Reproduction

                I've provided a replay instead of a reproduction

                Publishable key

                pk_live_Y2xlcmsuZGhhd2FsLmNvLmluJA

                Description

                Steps to reproduce:

                1. Open an Expo app using @clerk/expo and render AuthView on Android.
                2. Focus the email input field.
                3. Press the return/enter key on the keyboard.
                4. Press it a few more times and continue typing.

                Expected behavior:

                The email input should behave like a standard single-line email field.

                • Pressing return should dismiss the keyboard, submit, or otherwise trigger a normal single-line input action.
                • It should not insert newline characters into the email field.

                Actual behavior:

                On Android, pressing return inserts a newline into the email input instead of dismissing the keyboard.

                • The field accepts multiple newline characters.
                • You can continue typing after the newline.
                • This makes the email input behave like a multiline field, which seems incorrect for an email input.

                On iOS, pressing return closes the keyboard, which seems like the correct behavior.

                Screen.Recording.2026-04-17.at.2.51.55.pm.mov

                NOTE: Separate issue, but possibly worth noting: tapping outside the input does not dismiss the keyboard on either iOS or Android.

                Environment

                ❯ pnpm dlx envinfo --system --browsers --binaries --npmPackages
                System:
                OS: macOS 26.4.1
                CPU: (8) arm64 Apple M3
                Memory: 251.42 MB / 16.00 GB
                Shell: 5.9 - /bin/zsh
                Binaries:
                Node: 24.13.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/node
                npm: 11.12.1 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/npm
                pnpm: 10.33.0 - /Users/arishi/.local/state/fnm_multishells/1237_1776390715701/bin/pnpm
                bun: 1.3.12 - /opt/homebrew/bin/bun
                Watchman: 2026.03.30.00 - /opt/homebrew/bin/watchman
                Browsers:
                Chrome: 147.0.7727.56
                Safari: 26.4
                npmPackages:
                @clerk/expo: ^3.2.0 => 3.2.0
                @expo-google-fonts/inter: ^0.4.2 => 0.4.2
                @expo-google-fonts/jetbrains-mono: ^0.4.1 => 0.4.1
                @expo-google-fonts/plus-jakarta-sans: ^0.4.2 => 0.4.2
                @expo/ui: ~55.0.11 => 55.0.11
                @expo/vector-icons: ^15.1.1 => 15.1.1
                @gorhom/bottom-sheet: ^5.2.9 => 5.2.9
                @inkjs/ui: ^2.0.0 => 2.0.0
                @openai/codex-sdk: ^0.121.0 => 0.121.0
                @react-native-community/datetimepicker: 8.6.0 => 8.6.0
                @react-native-masked-view/masked-view: 0.3.2 => 0.3.2
                @react-navigation/bottom-tabs: ^7.15.9 => 7.15.9
                @react-navigation/elements: ^2.9.14 => 2.9.14
                @react-navigation/native: ^7.2.2 => 7.2.2
                @repo/server: workspace:* => undefined
                @sentry/react-native: ^8.8.0 => 8.8.0
                @tanstack/react-form: ^1.29.0 => 1.29.0
                @tanstack/react-query: ^5.99.0 => 5.99.0
                @trivago/prettier-plugin-sort-imports: ^6.0.2 => 6.0.2
                @trpc/client: ^11.16.0 => 11.16.0
                @trpc/tanstack-react-query: ^11.16.0 => 11.16.0
                @types/big.js: ^6.2.2 => 6.2.2
                @types/node: ^25.6.0 => 25.6.0
                @types/react: ~19.2.14 => 19.2.14
                @types/yargs: ^17.0.35 => 17.0.35
                big.js: ^7.0.1 => 7.0.1
                date-fns: ^4.1.0 => 4.1.0
                eslint: ^9.39.4 => 9.39.4
                eslint-config-expo: ~55.0.0 => 55.0.0
                eslint-config-prettier: ^10.1.8 => 10.1.8
                expo: ~55.0.15 => 55.0.15
                expo-application: ^55.0.14 => 55.0.14
                expo-auth-session: ~55.0.14 => 55.0.14
                expo-blur: ~55.0.14 => 55.0.14
                expo-build-properties: ~55.0.13 => 55.0.13
                expo-constants: ~55.0.14 => 55.0.14
                expo-crypto: ~55.0.14 => 55.0.14
                expo-dev-client: ~55.0.27 => 55.0.27
                expo-device: ~55.0.15 => 55.0.15
                expo-font: ~55.0.6 => 55.0.6
                expo-glass-effect: ~55.0.10 => 55.0.10
                expo-haptics: ~55.0.14 => 55.0.14
                expo-image: ~55.0.8 => 55.0.8
                expo-insights: ~55.0.16 => 55.0.16
                expo-linear-gradient: ~55.0.13 => 55.0.13
                expo-linking: ~55.0.13 => 55.0.13
                expo-network: ~55.0.13 => 55.0.13
                expo-router: ~55.0.12 => 55.0.12
                expo-secure-store: ~55.0.13 => 55.0.13
                expo-splash-screen: ~55.0.18 => 55.0.18
                expo-status-bar: ~55.0.5 => 55.0.5
                expo-symbols: ~55.0.7 => 55.0.7
                expo-system-ui: ~55.0.15 => 55.0.15
                expo-updates: ~55.0.20 => 55.0.20
                expo-web-browser: ~55.0.14 => 55.0.14
                heroui-native: ^1.0.2 => 1.0.2
                ink: ^7.0.0 => 7.0.0
                prettier: ^3.8.3 => 3.8.3
                prettier-plugin-tailwindcss: ^0.7.2 => 0.7.2
                react: 19.2.0 => 19.2.0
                react-devtools-core: ^7.0.1 => 7.0.1
                react-dom: 19.2.0 => 19.2.0
                react-native: 0.83.4 => 0.83.4
                react-native-easing-gradient: ^1.1.1 => 1.1.1
                react-native-gesture-handler: ~2.30.1 => 2.30.1
                react-native-keyboard-controller: ~1.20.7 => 1.20.7
                react-native-reanimated: 4.2.3 => 4.2.3
                react-native-safe-area-context: ~5.6.2 => 5.6.2
                react-native-screens: ~4.24.0 => 4.24.0
                react-native-svg: 15.15.3 => 15.15.3
                react-native-web: ~0.21.2 => 0.21.2
                react-native-worklets: 0.7.2 => 0.7.2
                superjson: ^2.2.6 => 2.2.6
                tailwind-merge: ^3.5.0 => 3.5.0
                tailwind-variants: ^3.2.2 => 3.2.2
                tailwindcss: ^4.2.2 => 4.2.2
                tsx: ^4.21.0 => 4.21.0
                typescript: ~5.9.3 => 5.9.3
                uniwind: ^1.6.2 => 1.6.2
                yargs: ^18.0.0 => 18.0.0
                zod: ^4.3.6 => 4.3.6

                Metadata

                Metadata

                Assignees

                Labels

                needs-triageA ticket that needs to be triaged by a team member

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions