From 27d156b5560e351868fceda46e8d97bf4d336791 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:13:19 -0300 Subject: [PATCH 01/30] Run `pnpm dedupe` --- playground/app-router/src/app/layout.tsx | 6 +- pnpm-lock.yaml | 218 ++++++++++++++++++++++- 2 files changed, 216 insertions(+), 8 deletions(-) diff --git a/playground/app-router/src/app/layout.tsx b/playground/app-router/src/app/layout.tsx index c90b61270fd..ce2b6af9f26 100644 --- a/playground/app-router/src/app/layout.tsx +++ b/playground/app-router/src/app/layout.tsx @@ -1,7 +1,7 @@ -import './globals.css'; -import { Inter } from 'next/font/google'; -import { ClerkProvider } from '@clerk/nextjs'; import { Links } from '@/common/Links'; +import { ClerkProvider } from '@clerk/nextjs'; +import { Inter } from 'next/font/google'; +import './globals.css'; const inter = Inter({ subsets: ['latin'] }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f65b6e000b..6ceafdd1ea7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4258,24 +4258,64 @@ packages: cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-Mp0/gqiPdepHjjVm7e0yL1acWvI0rJVVFQEADSezvAjon9sjQ7CEg9JnXICD4B1YrPmN9qV/e7cQZCp87tTV4w==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-Mp0/gqiPdepHjjVm7e0yL1acWvI0rJVVFQEADSezvAjon9sjQ7CEg9JnXICD4B1YrPmN9qV/e7cQZCp87tTV4w==} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.43': resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-40re4rMNrsi57oavRzIOpRGmg3QRlW6Ea8Q3znaqgOuJuKVrrm2bIQInTfkZJG7a4/5YMX7T951d0+toGLTdCA==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-40re4rMNrsi57oavRzIOpRGmg3QRlW6Ea8Q3znaqgOuJuKVrrm2bIQInTfkZJG7a4/5YMX7T951d0+toGLTdCA==} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-8BDM939bbMariZupiHp3OmP5N+LXPT4mULA0hZjDaq970PCxv4krZOSMG+HkWUUwmuQROtV+/00xw39EO0P+8g==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-8BDM939bbMariZupiHp3OmP5N+LXPT4mULA0hZjDaq970PCxv4krZOSMG+HkWUUwmuQROtV+/00xw39EO0P+8g==} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-sntsPaPgrECpBB/+2xrQzVUt0r493TMPI+4kWRMhvMsmrxOqH1Ep5lM0Wua/ZdbfZNwm1aVa5pcESQfNfM4Fhw==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-sntsPaPgrECpBB/+2xrQzVUt0r493TMPI+4kWRMhvMsmrxOqH1Ep5lM0Wua/ZdbfZNwm1aVa5pcESQfNfM4Fhw==} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4283,6 +4323,18 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-5clBW/I+er9F2uM1OFjJFWX86y7Lcy0M+NqsN4s3o07W+8467Zk8oQa4B45vdaXoNUF/yqIAgKkA/OEdQDxZqA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-5clBW/I+er9F2uM1OFjJFWX86y7Lcy0M+NqsN4s3o07W+8467Zk8oQa4B45vdaXoNUF/yqIAgKkA/OEdQDxZqA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4290,6 +4342,18 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-wv+rnAfQDk9p/CheX8/Kmqk2o1WaFa4xhWI9gOyDMk/ljvOX0u0ubeM8nI1Qfox7Tnh71eV5AjzSePXUhFOyOg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-wv+rnAfQDk9p/CheX8/Kmqk2o1WaFa4xhWI9gOyDMk/ljvOX0u0ubeM8nI1Qfox7Tnh71eV5AjzSePXUhFOyOg==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4297,6 +4361,18 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-gxD0/xhU4Py47IH3bKZbWtvB99tMkUPGPJFRfSc5UB9Osoje0l0j1PPbxpUtXIELurYCqwLBKXIMTQGifox1BQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-gxD0/xhU4Py47IH3bKZbWtvB99tMkUPGPJFRfSc5UB9Osoje0l0j1PPbxpUtXIELurYCqwLBKXIMTQGifox1BQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4304,6 +4380,18 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-HotuVe3XUjDwqqEMbm3o3IRkP9gdm8raY/btd/6KE3JGLF/cv4+3ff1l6nOhAZI8wulWDPEXPtE7v+HQEaTXnA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-HotuVe3XUjDwqqEMbm3o3IRkP9gdm8raY/btd/6KE3JGLF/cv4+3ff1l6nOhAZI8wulWDPEXPtE7v+HQEaTXnA==} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4315,24 +4403,64 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-8Cx+ucbd8n2dIr21FqBh6rUvTVL0uTgEtKR7l+MUZ5BgY4dFh1e4mPVX8oqmoYwOxBiXrsD2JIOCz4AyKLKxWA==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-8Cx+ucbd8n2dIr21FqBh6rUvTVL0uTgEtKR7l+MUZ5BgY4dFh1e4mPVX8oqmoYwOxBiXrsD2JIOCz4AyKLKxWA==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-Vhq5vikrVDxAa75fxsyqj0c0Y/uti/TwshXI71Xb8IeUQJOBnmLUsn5dgYf5ljpYYkNa0z9BPAvUDIDMmyDi+w==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-Vhq5vikrVDxAa75fxsyqj0c0Y/uti/TwshXI71Xb8IeUQJOBnmLUsn5dgYf5ljpYYkNa0z9BPAvUDIDMmyDi+w==} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-lN7RIg9Iugn08zP2aZN9y/MIdG8iOOCE93M1UrFlrxMTqPf8X+fDzmR/OKhTSd1A2pYNipZHjyTcb5H8kyQSow==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-lN7RIg9Iugn08zP2aZN9y/MIdG8iOOCE93M1UrFlrxMTqPf8X+fDzmR/OKhTSd1A2pYNipZHjyTcb5H8kyQSow==} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-7/7cLIn48Y+EpQ4CePvf8reFl63F15yPUlg4ZAhl+RXJIfydkdak1WD8Ir3AwAO+bJBXzrfNL+XQbxm0mcQZmw==} + cpu: [x64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-7/7cLIn48Y+EpQ4CePvf8reFl63F15yPUlg4ZAhl+RXJIfydkdak1WD8Ir3AwAO+bJBXzrfNL+XQbxm0mcQZmw==} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.11': resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} @@ -4345,6 +4473,9 @@ packages: '@rolldown/pluginutils@1.0.0-beta.50': resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + '@rolldown/pluginutils@1.0.0-beta.9-commit.d91dfb5': + resolution: {integrity: sha512-8sExkWRK+zVybw3+2/kBkYBFeLnEUWz1fT7BLHplpzmtqkOfTbAQ9gkt4pzwGIIZmg4Qn5US5ACjUBenrhezwQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -12881,6 +13012,14 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-beta.9-commit.d91dfb5: + resolution: {integrity: sha512-FHkj6gGEiEgmAXQchglofvUUdwj2Oiw603Rs+zgFAnn9Cb7T7z3fiaEc0DbN3ja4wYkW6sF2rzMEtC1V4BGx/g==} + hasBin: true + + rolldown@1.0.0-beta.9-commit.d91dfb5: + resolution: {integrity: sha512-FHkj6gGEiEgmAXQchglofvUUdwj2Oiw603Rs+zgFAnn9Cb7T7z3fiaEc0DbN3ja4wYkW6sF2rzMEtC1V4BGx/g==} + hasBin: true + rollup-plugin-visualizer@6.0.3: resolution: {integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==} engines: {node: '>=18'} @@ -18968,6 +19107,10 @@ snapshots: '@oxc-parser/binding-win32-x64-msvc@0.87.0': optional: true + '@oxc-project/runtime@0.71.0': {} + + '@oxc-project/types@0.71.0': {} + '@oxc-project/types@0.87.0': {} '@oxc-project/types@0.94.0': {} @@ -19582,27 +19725,51 @@ snapshots: '@rolldown/binding-darwin-arm64@1.0.0-beta.43': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.43': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': optional: true @@ -19611,15 +19778,34 @@ snapshots: '@napi-rs/wasm-runtime': 1.0.7 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.d91dfb5': + optional: true + '@rolldown/pluginutils@1.0.0-beta.11': {} '@rolldown/pluginutils@1.0.0-beta.29': {} @@ -19628,6 +19814,8 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.50': {} + '@rolldown/pluginutils@1.0.0-beta.9-commit.d91dfb5': {} + '@rollup/plugin-alias@5.1.1(rollup@4.52.4)': optionalDependencies: rollup: 4.52.4 @@ -30120,7 +30308,7 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.0 - rolldown-plugin-dts@0.16.12(rolldown@1.0.0-beta.43)(typescript@5.8.3): + rolldown-plugin-dts@0.16.12(rolldown@1.0.0-beta.9-commit.d91dfb5)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -30131,7 +30319,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.13.0 magic-string: 0.30.19 - rolldown: 1.0.0-beta.43 + rolldown: 1.0.0-beta.9-commit.d91dfb5 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30159,7 +30347,27 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 - rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.43)(rollup@4.52.4): + rolldown@1.0.0-beta.9-commit.d91dfb5: + dependencies: + '@oxc-project/runtime': 0.71.0 + '@oxc-project/types': 0.71.0 + '@rolldown/pluginutils': 1.0.0-beta.9-commit.d91dfb5 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-darwin-x64': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.9-commit.d91dfb5 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.9-commit.d91dfb5 + + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.9-commit.d91dfb5)(rollup@4.52.4): dependencies: open: 8.4.2 picomatch: 4.0.3 @@ -31405,8 +31613,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.43 - rolldown-plugin-dts: 0.16.12(rolldown@1.0.0-beta.43)(typescript@5.8.3) + rolldown: 1.0.0-beta.9-commit.d91dfb5 + rolldown-plugin-dts: 0.16.12(rolldown@1.0.0-beta.9-commit.d91dfb5)(typescript@5.8.3) semver: 7.7.3 tinyexec: 1.0.1 tinyglobby: 0.2.15 From 6a9808eeb42872a7d49cb05fa0c16bd583519114 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 5 Nov 2025 11:42:40 -0300 Subject: [PATCH 02/30] Add HOC to open modal based on org settings --- packages/clerk-js/src/core/clerk.ts | 15 ++++- packages/clerk-js/src/ui/Components.tsx | 37 +++++++++-- .../components/EnableOrganizations/index.tsx | 63 +++++++++++++++++++ .../components/EnableOrganizations.tsx | 24 +++++++ .../src/ui/elements/contexts/index.tsx | 3 +- .../clerk-js/src/ui/lazyModules/components.ts | 11 ++++ packages/clerk-js/src/ui/types.ts | 6 ++ packages/react/src/isomorphicClerk.ts | 22 +++++++ packages/shared/src/organization.ts | 36 ++++++++++- .../src/react/hooks/useOrganization.tsx | 7 ++- .../src/react/hooks/useOrganizationList.tsx | 6 +- packages/shared/src/types/appearance.ts | 6 ++ packages/shared/src/types/clerk.ts | 19 ++++++ .../vue/src/composables/useOrganization.ts | 12 +++- 14 files changed, 253 insertions(+), 14 deletions(-) create mode 100644 packages/clerk-js/src/ui/components/EnableOrganizations/index.tsx create mode 100644 packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 6353d4c09d3..4b2c07fb6d8 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -23,6 +23,7 @@ import type { __experimental_CheckoutInstance, __experimental_CheckoutOptions, __internal_CheckoutProps, + __internal_EnableOrganizationsModalProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -35,9 +36,9 @@ import type { AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, BillingNamespace, - Clerk as ClerkInterface, ClerkAPIError, ClerkAuthenticateWithWeb3Params, + Clerk as ClerkInterface, ClerkOptions, ClientJSONSnapshot, ClientResource, @@ -745,6 +746,18 @@ export class Clerk implements ClerkInterface { void this.#componentControls.ensureMounted().then(controls => controls.closeModal('userVerification')); }; + public __internal_openEnableOrganizations = (props?: __internal_EnableOrganizationsModalProps): void => { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls + .ensureMounted({ preloadHint: 'EnableOrganizations' }) + .then(controls => controls.openModal('enableOrganizations', props || {})); + }; + + public __internal_closeEnableOrganizations = (): void => { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls.ensureMounted().then(controls => controls.closeModal('enableOrganizations')); + }; + public __internal_openBlankCaptchaModal = (): Promise => { this.assertComponentsReady(this.#componentControls); return this.#componentControls diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx index 148736665ce..9ae84de9bc9 100644 --- a/packages/clerk-js/src/ui/Components.tsx +++ b/packages/clerk-js/src/ui/Components.tsx @@ -1,5 +1,6 @@ import type { __internal_CheckoutProps, + __internal_EnableOrganizationsProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, __internal_UserVerificationProps, @@ -27,6 +28,7 @@ import type { ClerkComponentName } from './lazyModules/components'; import { BlankCaptchaModal, CreateOrganizationModal, + EnableOrganizationsModal, ImpersonationFab, KeylessPrompt, OrganizationProfileModal, @@ -79,7 +81,8 @@ export type ComponentControls = { | 'createOrganization' | 'userVerification' | 'waitlist' - | 'blankCaptcha', + | 'blankCaptcha' + | 'enableOrganizations', >( modal: T, props: T extends 'signIn' @@ -90,7 +93,9 @@ export type ComponentControls = { ? __internal_UserVerificationProps : T extends 'waitlist' ? WaitlistProps - : UserProfileProps, + : T extends 'enableOrganizations' + ? __internal_EnableOrganizationsProps + : UserProfileProps, ) => void; closeModal: ( modal: @@ -102,7 +107,8 @@ export type ComponentControls = { | 'createOrganization' | 'userVerification' | 'waitlist' - | 'blankCaptcha', + | 'blankCaptcha' + | 'enableOrganizations', options?: { notify?: boolean; }, @@ -152,6 +158,7 @@ interface ComponentsState { userVerificationModal: null | __internal_UserVerificationProps; organizationProfileModal: null | OrganizationProfileProps; createOrganizationModal: null | CreateOrganizationProps; + enableOrganizationsModal: null | __internal_EnableOrganizationsProps; blankCaptchaModal: null; organizationSwitcherPrefetch: boolean; waitlistModal: null | WaitlistProps; @@ -245,6 +252,7 @@ const Components = (props: ComponentsProps) => { userVerificationModal: null, organizationProfileModal: null, createOrganizationModal: null, + enableOrganizationsModal: null, organizationSwitcherPrefetch: false, waitlistModal: null, blankCaptchaModal: null, @@ -274,6 +282,7 @@ const Components = (props: ComponentsProps) => { createOrganizationModal, waitlistModal, blankCaptchaModal, + enableOrganizationsModal, checkoutDrawer, planDetailsDrawer, subscriptionDetailsDrawer, @@ -325,9 +334,10 @@ const Components = (props: ComponentsProps) => { clearUrlStateParam(); setState(s => { function handleCloseModalForExperimentalUserVerification() { - const modal = s[`${name}Modal`] || {}; + const modal = s[`${name}Modal`]; if (modal && typeof modal === 'object' && 'afterVerificationCancelled' in modal && notify) { - modal.afterVerificationCancelled?.(); + // TypeScript doesn't narrow properly with template literal access and 'in' operator + (modal as { afterVerificationCancelled?: () => void }).afterVerificationCancelled?.(); } } @@ -484,6 +494,22 @@ const Components = (props: ComponentsProps) => { ); + const mountedEnableOrganizationsModal = ( + componentsControls.closeModal('enableOrganizations')} + onExternalNavigate={() => componentsControls.closeModal('enableOrganizations')} + startPath={buildVirtualRouterUrl({ base: '/enable-organizations', path: urlStateParam?.path })} + componentName={'EnableOrganizationsModal'} + modalContainerSx={{ alignItems: 'center' }} + > + + + ); + const mountedOrganizationProfileModal = ( { {createOrganizationModal && mountedCreateOrganizationModal} {waitlistModal && mountedWaitlistModal} {blankCaptchaModal && mountedBlankCaptchaModal} + {enableOrganizationsModal && mountedEnableOrganizationsModal} ( + + + + Enable organizations + + + + +)); + +function EnableOrganizationsRoutes(): JSX.Element { + return ( + + + + + + + + ); +} + +EnableOrganizationsRoutes.displayName = 'EnableOrganizations'; + +const EnableOrganizations: React.ComponentType<__internal_EnableOrganizationsProps> = + withCoreSessionSwitchGuard(EnableOrganizationsRoutes); + +// TODO -> Maybe move this to a inner folder for all in-app modals +const EnableOrganizationsModal = (props: __internal_EnableOrganizationsModalProps): JSX.Element => { + return ( + + +
+ +
+
+
+ ); +}; + +export { EnableOrganizations, EnableOrganizationsModal }; diff --git a/packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx b/packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx new file mode 100644 index 00000000000..e6dbc52d294 --- /dev/null +++ b/packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx @@ -0,0 +1,24 @@ +import { createContext, useContext } from 'react'; + +import type { EnableOrganizationsCtx } from '../../types'; + +export type EnableOrganizationsContextType = EnableOrganizationsCtx; + +export const EnableOrganizationsContext = createContext(null); + +export const useEnableOrganizations = (): EnableOrganizationsContextType => { + const context = useContext(EnableOrganizationsContext); + + if (!context || context.componentName !== 'EnableOrganizations') { + throw new Error( + 'Clerk: useEnableOrganizationsContext called outside of the mounted EnableOrganizations component.', + ); + } + + const { componentName, ...ctx } = context; + + return { + ...ctx, + componentName, + }; +}; diff --git a/packages/clerk-js/src/ui/elements/contexts/index.tsx b/packages/clerk-js/src/ui/elements/contexts/index.tsx index f14986eedd2..fb38f0bb4ed 100644 --- a/packages/clerk-js/src/ui/elements/contexts/index.tsx +++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx @@ -101,7 +101,8 @@ export type FlowMetadata = { | 'oauthConsent' | 'subscriptionDetails' | 'tasks' - | 'taskChooseOrganization'; + | 'taskChooseOrganization' + | 'enableOrganizations'; part?: | 'start' | 'emailCode' diff --git a/packages/clerk-js/src/ui/lazyModules/components.ts b/packages/clerk-js/src/ui/lazyModules/components.ts index 3a5ecee7a9c..40010045b32 100644 --- a/packages/clerk-js/src/ui/lazyModules/components.ts +++ b/packages/clerk-js/src/ui/lazyModules/components.ts @@ -27,6 +27,7 @@ const componentImportPaths = { SubscriptionDetails: () => import(/* webpackChunkName: "subscriptionDetails" */ '../components/SubscriptionDetails'), APIKeys: () => import(/* webpackChunkName: "apiKeys" */ '../components/APIKeys/APIKeys'), OAuthConsent: () => import(/* webpackChunkName: "oauthConsent" */ '../components/OAuthConsent/OAuthConsent'), + EnableOrganizations: () => import(/* webpackChunkName: "enableOrganizations" */ '../components/EnableOrganizations'), } as const; export const SignIn = lazy(() => componentImportPaths.SignIn().then(module => ({ default: module.SignIn }))); @@ -44,6 +45,14 @@ export const UserVerificationModal = lazy(() => componentImportPaths.UserVerification().then(module => ({ default: module.UserVerificationModal })), ); +export const EnableOrganizations = lazy(() => + componentImportPaths.EnableOrganizations().then(module => ({ default: module.EnableOrganizations })), +); + +export const EnableOrganizationsModal = lazy(() => + componentImportPaths.EnableOrganizations().then(module => ({ default: module.EnableOrganizationsModal })), +); + export const SignUp = lazy(() => componentImportPaths.SignUp().then(module => ({ default: module.SignUp }))); export const SignUpModal = lazy(() => componentImportPaths.SignUp().then(module => ({ default: module.SignUpModal }))); @@ -144,6 +153,7 @@ export const ClerkComponents = { UserButton, UserProfile, UserVerification, + EnableOrganizations, OrganizationSwitcher, OrganizationList, OrganizationProfile, @@ -154,6 +164,7 @@ export const ClerkComponents = { OrganizationProfileModal, CreateOrganizationModal, UserVerificationModal, + EnableOrganizationsModal, GoogleOneTap, Waitlist, WaitlistModal, diff --git a/packages/clerk-js/src/ui/types.ts b/packages/clerk-js/src/ui/types.ts index 3f9fe2a27ef..a7ff6e665c9 100644 --- a/packages/clerk-js/src/ui/types.ts +++ b/packages/clerk-js/src/ui/types.ts @@ -1,5 +1,6 @@ import type { __internal_CheckoutProps, + __internal_EnableOrganizationsProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -75,6 +76,11 @@ export type UserVerificationCtx = __internal_UserVerificationProps & { mode?: ComponentMode; }; +export type EnableOrganizationsCtx = __internal_EnableOrganizationsProps & { + componentName: 'EnableOrganizations'; + mode?: ComponentMode; +}; + export type UserProfileCtx = UserProfileProps & { componentName: 'UserProfile'; mode?: ComponentMode; diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index bb0ffd1633c..c88fa45c3cf 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -3,6 +3,7 @@ import { clerkEvents, createClerkEventBus } from '@clerk/shared/clerkEventBus'; import { loadClerkJsScript } from '@clerk/shared/loadClerkJsScript'; import type { __internal_CheckoutProps, + __internal_EnableOrganizationsModalProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -131,6 +132,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { private preopenOrganizationProfile?: null | OrganizationProfileProps = null; private preopenCreateOrganization?: null | CreateOrganizationProps = null; private preOpenWaitlist?: null | WaitlistProps = null; + private preopenEnableOrganizations?: null | __internal_EnableOrganizationsModalProps = null; private premountSignInNodes = new Map(); private premountSignUpNodes = new Map(); private premountUserAvatarNodes = new Map(); @@ -624,6 +626,10 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { clerkjs.openWaitlist(this.preOpenWaitlist); } + if (this.preopenEnableOrganizations !== null) { + clerkjs.__internal_openEnableOrganizations(this.preopenEnableOrganizations); + } + this.premountSignInNodes.forEach((props, node) => { clerkjs.mountSignIn(node, props); }); @@ -865,6 +871,22 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; + __internal_openEnableOrganizations = (props?: __internal_EnableOrganizationsModalProps) => { + if (this.clerkjs && this.loaded) { + this.clerkjs.__internal_openEnableOrganizations(props); + } else { + this.preopenEnableOrganizations = props; + } + }; + + __internal_closeEnableOrganizations = () => { + if (this.clerkjs && this.loaded) { + this.clerkjs.__internal_closeEnableOrganizations(); + } else { + this.preopenEnableOrganizations = null; + } + }; + openGoogleOneTap = (props?: GoogleOneTapProps) => { if (this.clerkjs && this.loaded) { this.clerkjs.openGoogleOneTap(props); diff --git a/packages/shared/src/organization.ts b/packages/shared/src/organization.ts index 12d8ea0689e..1d22d1ff498 100644 --- a/packages/shared/src/organization.ts +++ b/packages/shared/src/organization.ts @@ -1,7 +1,8 @@ -import type { OrganizationMembershipResource } from './types'; +import type { EnvironmentResource, LoadedClerk, OrganizationMembershipResource } from './types'; /** * Finds the organization membership for a given organization ID from a list of memberships + * * @param organizationMemberships - Array of organization memberships to search through * @param organizationId - ID of the organization to find the membership for * @returns The matching organization membership or undefined if not found @@ -14,3 +15,36 @@ export function getCurrentOrganizationMembership( organizationMembership => organizationMembership.organization.id === organizationId, ); } + +/** + * Clerk instance with unstable environment access + * + * @internal + */ +export type ClerkWithEnvironment = { + __unstable__environment?: EnvironmentResource | null; +}; + +/** + * Wraps a hook function in a check to see if organization settings is enabled + * + * If not enabled, it will open a dialog with a prompt to enable organizations + * + * @internal + */ +export const withOrganizationSettingsEnabled = + ( + hook: (...args: TParams) => TReturn, + getLoadedClerk: () => LoadedClerk | null | undefined, + ) => + (...args: TParams): TReturn => { + const clerk = getLoadedClerk(); + // @ts-expect-error - __unstable__environment is not typed + const environment = clerk?.__unstable__environment; + + if (!environment?.organizationSettings.enabled) { + clerk?.__internal_openEnableOrganizations({}); + } + + return hook(...args); + }; diff --git a/packages/shared/src/react/hooks/useOrganization.tsx b/packages/shared/src/react/hooks/useOrganization.tsx index b6e716324bd..10e007031b3 100644 --- a/packages/shared/src/react/hooks/useOrganization.tsx +++ b/packages/shared/src/react/hooks/useOrganization.tsx @@ -1,4 +1,4 @@ -import { getCurrentOrganizationMembership } from '../../organization'; +import { getCurrentOrganizationMembership, withOrganizationSettingsEnabled } from '../../organization'; import { eventMethodCalled } from '../../telemetry/events/method-called'; import type { GetDomainsParams, @@ -20,6 +20,7 @@ import { import { STABLE_KEYS } from '../stable-keys'; import type { PaginatedHookConfig, PaginatedResources, PaginatedResourcesWithDefault } from '../types'; import { createCacheKeys } from './createCacheKeys'; +import { useClerk } from './useClerk'; import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite'; /** @@ -271,7 +272,7 @@ const undefinedPaginatedResource = { * } * ``` */ -export function useOrganization(params?: T): UseOrganizationReturn { +function useOrganizationInternal(params?: T): UseOrganizationReturn { const { domains: domainListParams, membershipRequests: membershipRequestsListParams, @@ -494,3 +495,5 @@ export function useOrganization(params?: T): Us invitations, }; } + +export const useOrganization = withOrganizationSettingsEnabled(useOrganizationInternal, () => useClerk()); diff --git a/packages/shared/src/react/hooks/useOrganizationList.tsx b/packages/shared/src/react/hooks/useOrganizationList.tsx index 280e9b18363..853b7c4f82b 100644 --- a/packages/shared/src/react/hooks/useOrganizationList.tsx +++ b/packages/shared/src/react/hooks/useOrganizationList.tsx @@ -1,3 +1,4 @@ +import { withOrganizationSettingsEnabled } from '../../organization'; import { eventMethodCalled } from '../../telemetry/events/method-called'; import type { CreateOrganizationParams, @@ -14,6 +15,7 @@ import { useAssertWrappedByClerkProvider, useClerkInstanceContext, useUserContex import { STABLE_KEYS } from '../stable-keys'; import type { PaginatedHookConfig, PaginatedResources, PaginatedResourcesWithDefault } from '../types'; import { createCacheKeys } from './createCacheKeys'; +import { useClerk } from './useClerk'; import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite'; /** @@ -247,7 +249,7 @@ export type UseOrganizationListReturn = * export default UserInvitationsTable * ``` */ -export function useOrganizationList(params?: T): UseOrganizationListReturn { +function useOrganizationListInternal(params?: T): UseOrganizationListReturn { const { userMemberships, userInvitations, userSuggestions } = params || {}; useAssertWrappedByClerkProvider('useOrganizationList'); @@ -396,3 +398,5 @@ export function useOrganizationList(params? userSuggestions: suggestions, }; } + +export const useOrganizationList = withOrganizationSettingsEnabled(useOrganizationListInternal, () => useClerk()); diff --git a/packages/shared/src/types/appearance.ts b/packages/shared/src/types/appearance.ts index 7f0cb4f32fd..5c636b2a70f 100644 --- a/packages/shared/src/types/appearance.ts +++ b/packages/shared/src/types/appearance.ts @@ -1033,6 +1033,7 @@ export type OrganizationListTheme = Theme; export type OrganizationProfileTheme = Theme; export type CreateOrganizationTheme = Theme; export type UserVerificationTheme = Theme; +export type EnableOrganizationsTheme = Theme; export type WaitlistTheme = Theme; export type PricingTableTheme = Theme; export type CheckoutTheme = Theme; @@ -1121,4 +1122,9 @@ export type Appearance = T & * Theme overrides that only apply to the `` component */ taskChooseOrganization?: T; + /** + * Theme overrides that only apply to the `` component + * TODO -> Change to __internal + */ + enableOrganizations?: T; }; diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index b37e7d0a8a8..38ce631f988 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -4,6 +4,7 @@ import type { Appearance, CheckoutTheme, CreateOrganizationTheme, + EnableOrganizationsTheme, OAuthConsentTheme, OrganizationListTheme, OrganizationProfileTheme, @@ -320,6 +321,18 @@ export interface Clerk { */ __internal_closeReverification: () => void; + /** + * Opens the Clerk Enable Organizations component in a modal. + * + * @param props - Optional user verification configuration parameters. + */ + __internal_openEnableOrganizations: (props?: __internal_EnableOrganizationsModalProps) => void; + + /** + * Closes the Clerk Enable Organizations modal. + */ + __internal_closeEnableOrganizations: () => void; + /** * Opens the Google One Tap component. * @@ -1429,6 +1442,12 @@ export type __internal_UserVerificationProps = RoutingOptions & { export type __internal_UserVerificationModalProps = WithoutRouting<__internal_UserVerificationProps>; +export type __internal_EnableOrganizationsProps = RoutingOptions & { + appearance?: EnableOrganizationsTheme; +}; + +export type __internal_EnableOrganizationsModalProps = WithoutRouting<__internal_EnableOrganizationsProps>; + export type __internal_ComponentNavigationContext = { /** * The `navigate` reference within the component router context diff --git a/packages/vue/src/composables/useOrganization.ts b/packages/vue/src/composables/useOrganization.ts index 409d31396e2..25166cc5b4b 100644 --- a/packages/vue/src/composables/useOrganization.ts +++ b/packages/vue/src/composables/useOrganization.ts @@ -1,9 +1,10 @@ -import { getCurrentOrganizationMembership } from '@clerk/shared/organization'; -import type { OrganizationMembershipResource, OrganizationResource } from '@clerk/shared/types'; +import { getCurrentOrganizationMembership, withOrganizationSettingsEnabled } from '@clerk/shared/organization'; +import type { LoadedClerk, OrganizationMembershipResource, OrganizationResource } from '@clerk/shared/types'; import { computed } from 'vue'; import type { ToComputedRefs } from '../utils'; import { toComputedRefs } from '../utils'; +import { useClerk } from './useClerk'; import { useClerkContext } from './useClerkContext'; import { useSession } from './useSession'; @@ -52,7 +53,7 @@ type UseOrganization = () => ToComputedRefs; * * */ -export const useOrganization: UseOrganization = () => { +const useOrganizationInternal: UseOrganization = () => { const { clerk, organizationCtx } = useClerkContext('useOrganization'); const { session } = useSession(); @@ -87,3 +88,8 @@ export const useOrganization: UseOrganization = () => { return toComputedRefs(result); }; + +export const useOrganization = withOrganizationSettingsEnabled( + useOrganizationInternal, + () => useClerk().value as LoadedClerk, +); From 30e9e47909e1057067b9a7723dcc8dd8f0f80630 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 5 Nov 2025 14:53:18 -0300 Subject: [PATCH 03/30] Replace throwing error with opening modal --- packages/clerk-js/src/core/clerk.ts | 39 ++- packages/clerk-js/src/core/warnings.ts | 13 - packages/clerk-js/src/ui/Components.tsx | 55 +++-- .../components/EnableOrganizations/index.tsx | 63 ----- .../EnableOrganizationsPrompt/index.tsx | 232 ++++++++++++++++++ .../components/EnableOrganizations.tsx | 24 -- .../clerk-js/src/ui/lazyModules/components.ts | 14 +- packages/clerk-js/src/ui/types.ts | 4 +- packages/react/src/isomorphicClerk.ts | 15 +- packages/shared/src/organization.ts | 16 +- .../src/react/hooks/useOrganization.tsx | 6 +- .../src/react/hooks/useOrganizationList.tsx | 6 +- packages/shared/src/types/appearance.ts | 1 - packages/shared/src/types/clerk.ts | 34 +-- .../vue/src/composables/useOrganization.ts | 1 + playground/app-router/src/app/test.tsx | 9 + 16 files changed, 319 insertions(+), 213 deletions(-) delete mode 100644 packages/clerk-js/src/ui/components/EnableOrganizations/index.tsx create mode 100644 packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx delete mode 100644 packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx create mode 100644 playground/app-router/src/app/test.tsx diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 4b2c07fb6d8..5133eed55e8 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -23,7 +23,7 @@ import type { __experimental_CheckoutInstance, __experimental_CheckoutOptions, __internal_CheckoutProps, - __internal_EnableOrganizationsModalProps, + __internal_EnableOrganizationsPromptProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -178,7 +178,6 @@ declare global { const CANNOT_RENDER_BILLING_DISABLED_ERROR_CODE = 'cannot_render_billing_disabled'; const CANNOT_RENDER_USER_MISSING_ERROR_CODE = 'cannot_render_user_missing'; -const CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE = 'cannot_render_organizations_disabled'; const CANNOT_RENDER_ORGANIZATION_MISSING_ERROR_CODE = 'cannot_render_organization_missing'; const CANNOT_RENDER_SINGLE_SESSION_ENABLED_ERROR_CODE = 'cannot_render_single_session_enabled'; const CANNOT_RENDER_API_KEYS_DISABLED_ERROR_CODE = 'cannot_render_api_keys_disabled'; @@ -746,16 +745,16 @@ export class Clerk implements ClerkInterface { void this.#componentControls.ensureMounted().then(controls => controls.closeModal('userVerification')); }; - public __internal_openEnableOrganizations = (props?: __internal_EnableOrganizationsModalProps): void => { + public __internal_openEnableOrganizationsPrompt = (props?: __internal_EnableOrganizationsPromptProps): void => { this.assertComponentsReady(this.#componentControls); void this.#componentControls - .ensureMounted({ preloadHint: 'EnableOrganizations' }) - .then(controls => controls.openModal('enableOrganizations', props || {})); + .ensureMounted({ preloadHint: 'EnableOrganizationsPrompt' }) + .then(controls => controls.openModal('enableOrganizationsPrompt', props || {})); }; public __internal_closeEnableOrganizations = (): void => { this.assertComponentsReady(this.#componentControls); - void this.#componentControls.ensureMounted().then(controls => controls.closeModal('enableOrganizations')); + void this.#componentControls.ensureMounted().then(controls => controls.closeModal('enableOrganizationsPrompt')); }; public __internal_openBlankCaptchaModal = (): Promise => { @@ -831,8 +830,8 @@ export class Clerk implements ClerkInterface { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('OrganizationProfile'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationSwitcher', }); } return; @@ -861,8 +860,8 @@ export class Clerk implements ClerkInterface { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('CreateOrganization'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationSwitcher', }); } return; @@ -1003,8 +1002,8 @@ export class Clerk implements ClerkInterface { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('OrganizationProfile'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationProfile', }); } return; @@ -1043,8 +1042,8 @@ export class Clerk implements ClerkInterface { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('CreateOrganization'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationSwitcher', }); } return; @@ -1074,8 +1073,8 @@ export class Clerk implements ClerkInterface { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('OrganizationSwitcher'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationSwitcher', }); } return; @@ -1113,8 +1112,8 @@ export class Clerk implements ClerkInterface { this.assertComponentsReady(this.#componentControls); if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('OrganizationList'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationList', }); } return; @@ -1309,8 +1308,8 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { - throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('TaskChooseOrganization'), { - code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE, + this.__internal_openEnableOrganizationsPrompt({ + callerName: 'OrganizationSwitcher', }); } return; diff --git a/packages/clerk-js/src/core/warnings.ts b/packages/clerk-js/src/core/warnings.ts index ac0621a4160..b53fee0884d 100644 --- a/packages/clerk-js/src/core/warnings.ts +++ b/packages/clerk-js/src/core/warnings.ts @@ -4,18 +4,6 @@ const formatWarning = (msg: string) => { return `🔒 Clerk:\n${msg.trim()}\n(This notice only appears in development)`; }; -const createMessageForDisabledOrganizations = ( - componentName: - | 'OrganizationProfile' - | 'OrganizationSwitcher' - | 'OrganizationList' - | 'CreateOrganization' - | 'TaskChooseOrganization', -) => { - return formatWarning( - `The <${componentName}/> cannot be rendered when the feature is turned off. Visit 'dashboard.clerk.com' to enable the feature. Since the feature is turned off, this is no-op.`, - ); -}; const createMessageForDisabledBilling = (componentName: 'PricingTable' | 'Checkout' | 'PlanDetails') => { return formatWarning( `The <${componentName}/> component cannot be rendered when billing is disabled. Visit 'https://dashboard.clerk.com/last-active?path=billing/settings' to follow the necessary steps to enable billing. Since billing is disabled, this is no-op.`, @@ -37,7 +25,6 @@ const warnings = { cannotRenderComponentWhenUserDoesNotExist: ' cannot render unless a user is signed in. Since no user is signed in, this is no-op.', cannotRenderComponentWhenOrgDoesNotExist: ` cannot render unless an organization is active. Since no organization is currently active, this is no-op.`, - cannotRenderAnyOrganizationComponent: createMessageForDisabledOrganizations, cannotRenderAnyBillingComponent: createMessageForDisabledBilling, cannotOpenUserProfile: 'The UserProfile modal cannot render unless a user is signed in. Since no user is signed in, this is no-op.', diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx index 9ae84de9bc9..d103aa86eb5 100644 --- a/packages/clerk-js/src/ui/Components.tsx +++ b/packages/clerk-js/src/ui/Components.tsx @@ -1,6 +1,6 @@ import type { __internal_CheckoutProps, - __internal_EnableOrganizationsProps, + __internal_EnableOrganizationsPromptProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, __internal_UserVerificationProps, @@ -28,7 +28,7 @@ import type { ClerkComponentName } from './lazyModules/components'; import { BlankCaptchaModal, CreateOrganizationModal, - EnableOrganizationsModal, + EnableOrganizationsPrompt, ImpersonationFab, KeylessPrompt, OrganizationProfileModal, @@ -82,7 +82,7 @@ export type ComponentControls = { | 'userVerification' | 'waitlist' | 'blankCaptcha' - | 'enableOrganizations', + | 'enableOrganizationsPrompt', >( modal: T, props: T extends 'signIn' @@ -93,8 +93,8 @@ export type ComponentControls = { ? __internal_UserVerificationProps : T extends 'waitlist' ? WaitlistProps - : T extends 'enableOrganizations' - ? __internal_EnableOrganizationsProps + : T extends 'enableOrganizationsPrompt' + ? __internal_EnableOrganizationsPromptProps : UserProfileProps, ) => void; closeModal: ( @@ -108,7 +108,7 @@ export type ComponentControls = { | 'userVerification' | 'waitlist' | 'blankCaptcha' - | 'enableOrganizations', + | 'enableOrganizationsPrompt', options?: { notify?: boolean; }, @@ -158,7 +158,7 @@ interface ComponentsState { userVerificationModal: null | __internal_UserVerificationProps; organizationProfileModal: null | OrganizationProfileProps; createOrganizationModal: null | CreateOrganizationProps; - enableOrganizationsModal: null | __internal_EnableOrganizationsProps; + enableOrganizationsPromptModal: null | __internal_EnableOrganizationsPromptProps; blankCaptchaModal: null; organizationSwitcherPrefetch: boolean; waitlistModal: null | WaitlistProps; @@ -252,7 +252,7 @@ const Components = (props: ComponentsProps) => { userVerificationModal: null, organizationProfileModal: null, createOrganizationModal: null, - enableOrganizationsModal: null, + enableOrganizationsPromptModal: null, organizationSwitcherPrefetch: false, waitlistModal: null, blankCaptchaModal: null, @@ -282,7 +282,6 @@ const Components = (props: ComponentsProps) => { createOrganizationModal, waitlistModal, blankCaptchaModal, - enableOrganizationsModal, checkoutDrawer, planDetailsDrawer, subscriptionDetailsDrawer, @@ -352,6 +351,18 @@ const Components = (props: ComponentsProps) => { }; componentsControls.openModal = (name, props) => { + // Prevent opening enableOrganizations modal if it's already open + // to avoid duplicate mounting when component is called multiple times + if (name === 'enableOrganizationsPrompt') { + setState(s => { + if (s.enableOrganizationsPromptModal) { + return s; // Modal is already open, don't update state + } + return { ...s, [`${name}Modal`]: props }; + }); + return; + } + function handleCloseModalForExperimentalUserVerification() { if (!('afterVerificationCancelled' in props)) { return; @@ -494,22 +505,6 @@ const Components = (props: ComponentsProps) => {
); - const mountedEnableOrganizationsModal = ( - componentsControls.closeModal('enableOrganizations')} - onExternalNavigate={() => componentsControls.closeModal('enableOrganizations')} - startPath={buildVirtualRouterUrl({ base: '/enable-organizations', path: urlStateParam?.path })} - componentName={'EnableOrganizationsModal'} - modalContainerSx={{ alignItems: 'center' }} - > - - - ); - const mountedOrganizationProfileModal = ( { {createOrganizationModal && mountedCreateOrganizationModal} {waitlistModal && mountedWaitlistModal} {blankCaptchaModal && mountedBlankCaptchaModal} - {enableOrganizationsModal && mountedEnableOrganizationsModal} { )} + {state.enableOrganizationsPromptModal && ( + + + + )} + {state.options?.__internal_keyless_claimKeylessApplicationUrl && state.options?.__internal_keyless_copyInstanceKeysUrl && ( diff --git a/packages/clerk-js/src/ui/components/EnableOrganizations/index.tsx b/packages/clerk-js/src/ui/components/EnableOrganizations/index.tsx deleted file mode 100644 index 031c4f51f71..00000000000 --- a/packages/clerk-js/src/ui/components/EnableOrganizations/index.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import type { - __internal_EnableOrganizationsModalProps, - __internal_EnableOrganizationsProps, -} from '@clerk/shared/types'; -import React from 'react'; - -import { EnableOrganizationsContext } from '@/ui/contexts/components/EnableOrganizations'; -import { Card } from '@/ui/elements/Card'; -import { withCardStateProvider } from '@/ui/elements/contexts'; -import { Header } from '@/ui/elements/Header'; - -import { withCoreSessionSwitchGuard } from '../../contexts'; -import { Flow } from '../../customizables'; -import { Route, Switch } from '../../router'; - -const EnableOrganizationsContent = withCardStateProvider(() => ( - - - - Enable organizations - - - - -)); - -function EnableOrganizationsRoutes(): JSX.Element { - return ( - - - - - - - - ); -} - -EnableOrganizationsRoutes.displayName = 'EnableOrganizations'; - -const EnableOrganizations: React.ComponentType<__internal_EnableOrganizationsProps> = - withCoreSessionSwitchGuard(EnableOrganizationsRoutes); - -// TODO -> Maybe move this to a inner folder for all in-app modals -const EnableOrganizationsModal = (props: __internal_EnableOrganizationsModalProps): JSX.Element => { - return ( - - -
- -
-
-
- ); -}; - -export { EnableOrganizations, EnableOrganizationsModal }; diff --git a/packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx new file mode 100644 index 00000000000..7e3c6b7be88 --- /dev/null +++ b/packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx @@ -0,0 +1,232 @@ +import { css } from '@emotion/react'; + +import { Modal } from '@/ui/elements/Modal'; +import { InternalThemeProvider } from '@/ui/styledSystem'; + +import { Button, Flex } from '../../customizables'; +import { Portal } from '../../elements/Portal'; + +const baseElementStyles = css` + box-sizing: border-box; + padding: 0; + margin: 0; + background: none; + border: none; + line-height: 1.5; + font-family: + -apple-system, + BlinkMacSystemFont, + avenir next, + avenir, + segoe ui, + helvetica neue, + helvetica, + Cantarell, + Ubuntu, + roboto, + noto, + arial, + sans-serif; + text-decoration: none; +`; + +const mainCTAStyles = css` + ${baseElementStyles}; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 1.75rem; + max-width: 14.625rem; + padding: 0.25rem 0.625rem; + border-radius: 0.375rem; + font-size: 0.75rem; + font-weight: 500; + letter-spacing: 0.12px; + color: 'white'; + text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32); + white-space: nowrap; + user-select: none; + cursor: pointer; + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545; + box-shadow: + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.12), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48), + 0px 0px 4px 0px rgba(243, 107, 22, 0) inset; +`; + +type EnableOrganizationsPromptProps = { + callerString: string; +}; + +const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProps) => { + return ( + + ({ animation: 'unset' })} + > + ({ + position: 'fixed', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + flexDirection: 'column', + gap: t.space.$1, + width: 'fit-content', + maxWidth: '25rem', + borderRadius: '1.25rem', + overflow: 'hidden', + fontFamily: t.fonts.$main, + background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 100%), #1f1f1f', + boxShadow: + '0px 0px 0px 0.5px #2F3037 inset, 0px 1px 0px 0px rgba(255, 255, 255, 0.08) inset, 0px 0px 0.8px 0.8px rgba(255, 255, 255, 0.20) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.72), 0px 16px 36px -6px rgba(0, 0, 0, 0.36), 0px 6px 16px -2px rgba(0, 0, 0, 0.20);', + transition: 'all 195ms cubic-bezier(0.2, 0.61, 0.1, 1)', + })} + > + ({ + display: 'flex', + flexDirection: 'column', + padding: `${t.space.$3} ${t.space.$4}`, + gap: t.space.$2, + })} + > + ({ + display: 'flex', + alignItems: 'center', + gap: t.space.$2, + })} + > + + + + + + + +

+ Organizations feature required +

+
+ +

+ To use the{' '} + + useOrganization + {' '} + hook, +
+ you’ll need to enable the Organizations feature +
+ for your app first. +
+ + Learn more about this add-on. + +

+
+ + ({ + borderBottom: '1px solid rgba(255, 255, 255, 0.10)', + background: 'rgba(0, 0, 0, 0.80)', + overflow: 'hidden', + width: '100%', + height: '1px', + })} + /> + + ({ + paddingLeft: `${t.space.$4}`, + paddingRight: `${t.space.$4}`, + paddingTop: `${t.space.$3}`, + paddingBottom: `${t.space.$5}`, + flexDirection: 'column', + gap: t.space.$3, + justifyContent: 'center', + })} + > + + + + +
+
+ ); +}; + +export const EnableOrganizationsPrompt = (props: EnableOrganizationsPromptProps) => { + return ( + + + + ); +}; diff --git a/packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx b/packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx deleted file mode 100644 index e6dbc52d294..00000000000 --- a/packages/clerk-js/src/ui/contexts/components/EnableOrganizations.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { createContext, useContext } from 'react'; - -import type { EnableOrganizationsCtx } from '../../types'; - -export type EnableOrganizationsContextType = EnableOrganizationsCtx; - -export const EnableOrganizationsContext = createContext(null); - -export const useEnableOrganizations = (): EnableOrganizationsContextType => { - const context = useContext(EnableOrganizationsContext); - - if (!context || context.componentName !== 'EnableOrganizations') { - throw new Error( - 'Clerk: useEnableOrganizationsContext called outside of the mounted EnableOrganizations component.', - ); - } - - const { componentName, ...ctx } = context; - - return { - ...ctx, - componentName, - }; -}; diff --git a/packages/clerk-js/src/ui/lazyModules/components.ts b/packages/clerk-js/src/ui/lazyModules/components.ts index 40010045b32..98c2f7769e3 100644 --- a/packages/clerk-js/src/ui/lazyModules/components.ts +++ b/packages/clerk-js/src/ui/lazyModules/components.ts @@ -27,7 +27,8 @@ const componentImportPaths = { SubscriptionDetails: () => import(/* webpackChunkName: "subscriptionDetails" */ '../components/SubscriptionDetails'), APIKeys: () => import(/* webpackChunkName: "apiKeys" */ '../components/APIKeys/APIKeys'), OAuthConsent: () => import(/* webpackChunkName: "oauthConsent" */ '../components/OAuthConsent/OAuthConsent'), - EnableOrganizations: () => import(/* webpackChunkName: "enableOrganizations" */ '../components/EnableOrganizations'), + EnableOrganizationsPrompt: () => + import(/* webpackChunkName: "enableOrganizationsPrompt" */ '../components/EnableOrganizationsPrompt'), } as const; export const SignIn = lazy(() => componentImportPaths.SignIn().then(module => ({ default: module.SignIn }))); @@ -45,12 +46,8 @@ export const UserVerificationModal = lazy(() => componentImportPaths.UserVerification().then(module => ({ default: module.UserVerificationModal })), ); -export const EnableOrganizations = lazy(() => - componentImportPaths.EnableOrganizations().then(module => ({ default: module.EnableOrganizations })), -); - -export const EnableOrganizationsModal = lazy(() => - componentImportPaths.EnableOrganizations().then(module => ({ default: module.EnableOrganizationsModal })), +export const EnableOrganizationsPrompt = lazy(() => + componentImportPaths.EnableOrganizationsPrompt().then(module => ({ default: module.EnableOrganizationsPrompt })), ); export const SignUp = lazy(() => componentImportPaths.SignUp().then(module => ({ default: module.SignUp }))); @@ -153,7 +150,7 @@ export const ClerkComponents = { UserButton, UserProfile, UserVerification, - EnableOrganizations, + EnableOrganizationsPrompt, OrganizationSwitcher, OrganizationList, OrganizationProfile, @@ -164,7 +161,6 @@ export const ClerkComponents = { OrganizationProfileModal, CreateOrganizationModal, UserVerificationModal, - EnableOrganizationsModal, GoogleOneTap, Waitlist, WaitlistModal, diff --git a/packages/clerk-js/src/ui/types.ts b/packages/clerk-js/src/ui/types.ts index a7ff6e665c9..053a7f0abd5 100644 --- a/packages/clerk-js/src/ui/types.ts +++ b/packages/clerk-js/src/ui/types.ts @@ -1,6 +1,6 @@ import type { __internal_CheckoutProps, - __internal_EnableOrganizationsProps, + __internal_EnableOrganizationsPromptProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -76,7 +76,7 @@ export type UserVerificationCtx = __internal_UserVerificationProps & { mode?: ComponentMode; }; -export type EnableOrganizationsCtx = __internal_EnableOrganizationsProps & { +export type EnableOrganizationsCtx = __internal_EnableOrganizationsPromptProps & { componentName: 'EnableOrganizations'; mode?: ComponentMode; }; diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index c88fa45c3cf..17aec8cc4b6 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -3,7 +3,7 @@ import { clerkEvents, createClerkEventBus } from '@clerk/shared/clerkEventBus'; import { loadClerkJsScript } from '@clerk/shared/loadClerkJsScript'; import type { __internal_CheckoutProps, - __internal_EnableOrganizationsModalProps, + __internal_EnableOrganizationsPromptProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -132,7 +132,6 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { private preopenOrganizationProfile?: null | OrganizationProfileProps = null; private preopenCreateOrganization?: null | CreateOrganizationProps = null; private preOpenWaitlist?: null | WaitlistProps = null; - private preopenEnableOrganizations?: null | __internal_EnableOrganizationsModalProps = null; private premountSignInNodes = new Map(); private premountSignUpNodes = new Map(); private premountUserAvatarNodes = new Map(); @@ -626,10 +625,6 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { clerkjs.openWaitlist(this.preOpenWaitlist); } - if (this.preopenEnableOrganizations !== null) { - clerkjs.__internal_openEnableOrganizations(this.preopenEnableOrganizations); - } - this.premountSignInNodes.forEach((props, node) => { clerkjs.mountSignIn(node, props); }); @@ -871,19 +866,15 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; - __internal_openEnableOrganizations = (props?: __internal_EnableOrganizationsModalProps) => { + __internal_openEnableOrganizationsPrompt = (props?: __internal_EnableOrganizationsPromptProps) => { if (this.clerkjs && this.loaded) { - this.clerkjs.__internal_openEnableOrganizations(props); - } else { - this.preopenEnableOrganizations = props; + this.clerkjs.__internal_openEnableOrganizationsPrompt(props); } }; __internal_closeEnableOrganizations = () => { if (this.clerkjs && this.loaded) { this.clerkjs.__internal_closeEnableOrganizations(); - } else { - this.preopenEnableOrganizations = null; } }; diff --git a/packages/shared/src/organization.ts b/packages/shared/src/organization.ts index 1d22d1ff498..ba31ec5d564 100644 --- a/packages/shared/src/organization.ts +++ b/packages/shared/src/organization.ts @@ -1,4 +1,4 @@ -import type { EnvironmentResource, LoadedClerk, OrganizationMembershipResource } from './types'; +import type { LoadedClerk, OrganizationMembershipResource } from './types'; /** * Finds the organization membership for a given organization ID from a list of memberships @@ -16,15 +16,6 @@ export function getCurrentOrganizationMembership( ); } -/** - * Clerk instance with unstable environment access - * - * @internal - */ -export type ClerkWithEnvironment = { - __unstable__environment?: EnvironmentResource | null; -}; - /** * Wraps a hook function in a check to see if organization settings is enabled * @@ -36,6 +27,7 @@ export const withOrganizationSettingsEnabled = ( hook: (...args: TParams) => TReturn, getLoadedClerk: () => LoadedClerk | null | undefined, + callerName?: string, ) => (...args: TParams): TReturn => { const clerk = getLoadedClerk(); @@ -43,7 +35,9 @@ export const withOrganizationSettingsEnabled = const environment = clerk?.__unstable__environment; if (!environment?.organizationSettings.enabled) { - clerk?.__internal_openEnableOrganizations({}); + clerk?.__internal_openEnableOrganizationsPrompt({ + callerName, + }); } return hook(...args); diff --git a/packages/shared/src/react/hooks/useOrganization.tsx b/packages/shared/src/react/hooks/useOrganization.tsx index 10e007031b3..a1918317096 100644 --- a/packages/shared/src/react/hooks/useOrganization.tsx +++ b/packages/shared/src/react/hooks/useOrganization.tsx @@ -496,4 +496,8 @@ function useOrganizationInternal(params?: T): U }; } -export const useOrganization = withOrganizationSettingsEnabled(useOrganizationInternal, () => useClerk()); +export const useOrganization = withOrganizationSettingsEnabled( + useOrganizationInternal, + () => useClerk(), + 'useOrganization', +); diff --git a/packages/shared/src/react/hooks/useOrganizationList.tsx b/packages/shared/src/react/hooks/useOrganizationList.tsx index 853b7c4f82b..9c1261692d7 100644 --- a/packages/shared/src/react/hooks/useOrganizationList.tsx +++ b/packages/shared/src/react/hooks/useOrganizationList.tsx @@ -399,4 +399,8 @@ function useOrganizationListInternal(params }; } -export const useOrganizationList = withOrganizationSettingsEnabled(useOrganizationListInternal, () => useClerk()); +export const useOrganizationList = withOrganizationSettingsEnabled( + useOrganizationListInternal, + () => useClerk(), + 'useOrganizationList', +); diff --git a/packages/shared/src/types/appearance.ts b/packages/shared/src/types/appearance.ts index 5c636b2a70f..fffcbca3e4e 100644 --- a/packages/shared/src/types/appearance.ts +++ b/packages/shared/src/types/appearance.ts @@ -1124,7 +1124,6 @@ export type Appearance = T & taskChooseOrganization?: T; /** * Theme overrides that only apply to the `` component - * TODO -> Change to __internal */ enableOrganizations?: T; }; diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 38ce631f988..0c314558111 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -4,7 +4,6 @@ import type { Appearance, CheckoutTheme, CreateOrganizationTheme, - EnableOrganizationsTheme, OAuthConsentTheme, OrganizationListTheme, OrganizationProfileTheme, @@ -322,11 +321,9 @@ export interface Clerk { __internal_closeReverification: () => void; /** - * Opens the Clerk Enable Organizations component in a modal. - * - * @param props - Optional user verification configuration parameters. + * Opens the Clerk Enable Organizations prompt for development environments */ - __internal_openEnableOrganizations: (props?: __internal_EnableOrganizationsModalProps) => void; + __internal_openEnableOrganizationsPrompt: (props?: __internal_EnableOrganizationsPromptProps) => void; /** * Closes the Clerk Enable Organizations modal. @@ -1442,31 +1439,8 @@ export type __internal_UserVerificationProps = RoutingOptions & { export type __internal_UserVerificationModalProps = WithoutRouting<__internal_UserVerificationProps>; -export type __internal_EnableOrganizationsProps = RoutingOptions & { - appearance?: EnableOrganizationsTheme; -}; - -export type __internal_EnableOrganizationsModalProps = WithoutRouting<__internal_EnableOrganizationsProps>; - -export type __internal_ComponentNavigationContext = { - /** - * The `navigate` reference within the component router context - */ - navigate: ( - to: string, - options?: { - searchParams?: URLSearchParams; - }, - ) => Promise; - /** - * This path represents the root route for a specific component type and is used - * for internal routing and navigation. - * - * @example - * indexPath: '/sign-in' // When - * indexPath: '/sign-up' // When - */ - indexPath: string; +export type __internal_EnableOrganizationsPromptProps = { + callerName?: string; }; type GoogleOneTapRedirectUrlProps = SignInForceRedirectUrl & SignUpForceRedirectUrl; diff --git a/packages/vue/src/composables/useOrganization.ts b/packages/vue/src/composables/useOrganization.ts index 25166cc5b4b..5a20e432004 100644 --- a/packages/vue/src/composables/useOrganization.ts +++ b/packages/vue/src/composables/useOrganization.ts @@ -92,4 +92,5 @@ const useOrganizationInternal: UseOrganization = () => { export const useOrganization = withOrganizationSettingsEnabled( useOrganizationInternal, () => useClerk().value as LoadedClerk, + 'useOrganization', ); diff --git a/playground/app-router/src/app/test.tsx b/playground/app-router/src/app/test.tsx new file mode 100644 index 00000000000..5cb46ecb787 --- /dev/null +++ b/playground/app-router/src/app/test.tsx @@ -0,0 +1,9 @@ +"use client" + +import { OrganizationList } from "@clerk/clerk-react"; + + +export function Test() { + + return
; +} From 0b4fa3f85110a702cf48f221389d9fe1b236a445 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Fri, 7 Nov 2025 16:22:58 -0300 Subject: [PATCH 04/30] Move to shared styles --- packages/clerk-js/src/core/clerk.ts | 2 +- packages/clerk-js/src/ui/Components.tsx | 22 +- .../EnableOrganizationsPrompt/index.tsx | 236 ++++++++++-------- .../KeylessPrompt/ClerkLogoIcon.tsx | 0 .../KeylessPrompt/KeySlashIcon.tsx | 0 .../{ => devPrompts}/KeylessPrompt/index.tsx | 58 +---- .../use-revalidate-environment.ts | 6 +- .../src/ui/components/devPrompts/shared.tsx | 61 +++++ .../src/ui/customizables/parseAppearance.ts | 2 +- .../clerk-js/src/ui/lazyModules/components.ts | 4 +- .../clerk-js/src/ui/lazyModules/providers.tsx | 17 ++ packages/clerk-js/src/ui/types.ts | 6 - packages/shared/src/organization.ts | 3 +- packages/shared/src/types/clerk.ts | 4 +- playground/app-router/src/app/layout.tsx | 14 +- playground/app-router/src/app/test.tsx | 9 - pnpm-lock.yaml | 181 +++++++++++++- 17 files changed, 413 insertions(+), 212 deletions(-) rename packages/clerk-js/src/ui/components/{ => devPrompts}/EnableOrganizationsPrompt/index.tsx (52%) rename packages/clerk-js/src/ui/components/{ => devPrompts}/KeylessPrompt/ClerkLogoIcon.tsx (100%) rename packages/clerk-js/src/ui/components/{ => devPrompts}/KeylessPrompt/KeySlashIcon.tsx (100%) rename packages/clerk-js/src/ui/components/{ => devPrompts}/KeylessPrompt/index.tsx (93%) rename packages/clerk-js/src/ui/components/{ => devPrompts}/KeylessPrompt/use-revalidate-environment.ts (91%) create mode 100644 packages/clerk-js/src/ui/components/devPrompts/shared.tsx delete mode 100644 playground/app-router/src/app/test.tsx diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 5133eed55e8..be1254f14b3 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -745,7 +745,7 @@ export class Clerk implements ClerkInterface { void this.#componentControls.ensureMounted().then(controls => controls.closeModal('userVerification')); }; - public __internal_openEnableOrganizationsPrompt = (props?: __internal_EnableOrganizationsPromptProps): void => { + public __internal_openEnableOrganizationsPrompt = (props: __internal_EnableOrganizationsPromptProps): void => { this.assertComponentsReady(this.#componentControls); void this.#componentControls .ensureMounted({ preloadHint: 'EnableOrganizationsPrompt' }) diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx index d103aa86eb5..757c681d351 100644 --- a/packages/clerk-js/src/ui/Components.tsx +++ b/packages/clerk-js/src/ui/Components.tsx @@ -42,6 +42,7 @@ import { import { MountedCheckoutDrawer, MountedPlanDetailDrawer, MountedSubscriptionDetailDrawer } from './lazyModules/drawers'; import { LazyComponentRenderer, + LazyEnableOrganizationsPromptProvider, LazyImpersonationFabProvider, LazyModalRenderer, LazyOneTapRenderer, @@ -351,14 +352,16 @@ const Components = (props: ComponentsProps) => { }; componentsControls.openModal = (name, props) => { - // Prevent opening enableOrganizations modal if it's already open + // Prevent opening enableOrganizations prompt if it's already open // to avoid duplicate mounting when component is called multiple times if (name === 'enableOrganizationsPrompt') { - setState(s => { - if (s.enableOrganizationsPromptModal) { - return s; // Modal is already open, don't update state + setState(prev => { + // Modal is already open, don't update state + if (prev.enableOrganizationsPromptModal) { + return prev; } - return { ...s, [`${name}Modal`]: props }; + + return { ...prev, [`${name}Modal`]: props }; }); return; } @@ -634,12 +637,9 @@ const Components = (props: ComponentsProps) => { )} {state.enableOrganizationsPromptModal && ( - - - + + + )} {state.options?.__internal_keyless_claimKeylessApplicationUrl && diff --git a/packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx similarity index 52% rename from packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx rename to packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx index 7e3c6b7be88..c18019b4e27 100644 --- a/packages/clerk-js/src/ui/components/EnableOrganizationsPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx @@ -3,62 +3,12 @@ import { css } from '@emotion/react'; import { Modal } from '@/ui/elements/Modal'; import { InternalThemeProvider } from '@/ui/styledSystem'; -import { Button, Flex } from '../../customizables'; -import { Portal } from '../../elements/Portal'; - -const baseElementStyles = css` - box-sizing: border-box; - padding: 0; - margin: 0; - background: none; - border: none; - line-height: 1.5; - font-family: - -apple-system, - BlinkMacSystemFont, - avenir next, - avenir, - segoe ui, - helvetica neue, - helvetica, - Cantarell, - Ubuntu, - roboto, - noto, - arial, - sans-serif; - text-decoration: none; -`; - -const mainCTAStyles = css` - ${baseElementStyles}; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 1.75rem; - max-width: 14.625rem; - padding: 0.25rem 0.625rem; - border-radius: 0.375rem; - font-size: 0.75rem; - font-weight: 500; - letter-spacing: 0.12px; - color: 'white'; - text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32); - white-space: nowrap; - user-select: none; - cursor: pointer; - background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545; - box-shadow: - 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, - 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, - 0px 0px 0px 1px rgba(0, 0, 0, 0.12), - 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48), - 0px 0px 4px 0px rgba(243, 107, 22, 0) inset; -`; +import { Flex } from '../../../customizables'; +import { Portal } from '../../../elements/Portal'; +import { basePromptElementStyles, PromptContainer } from '../shared'; type EnableOrganizationsPromptProps = { - callerString: string; + callerName: string; }; const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProps) => { @@ -68,30 +18,24 @@ const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProp canCloseModal={false} contentSx={() => ({ animation: 'unset' })} > - ({ - position: 'fixed', + ({ top: '50%', left: '50%', + bottom: 'auto', + right: 'auto', + padding: 'unset', transform: 'translate(-50%, -50%)', flexDirection: 'column', - gap: t.space.$1, - width: 'fit-content', - maxWidth: '25rem', - borderRadius: '1.25rem', - overflow: 'hidden', - fontFamily: t.fonts.$main, - background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 100%), #1f1f1f', - boxShadow: - '0px 0px 0px 0.5px #2F3037 inset, 0px 1px 0px 0px rgba(255, 255, 255, 0.08) inset, 0px 0px 0.8px 0.8px rgba(255, 255, 255, 0.20) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.72), 0px 16px 36px -6px rgba(0, 0, 0, 0.36), 0px 6px 16px -2px rgba(0, 0, 0, 0.20);', - transition: 'all 195ms cubic-bezier(0.2, 0.61, 0.1, 1)', + height: 'fit-content', })} > ({ display: 'flex', flexDirection: 'column', - padding: `${t.space.$3} ${t.space.$4}`, + padding: `${t.space.$5} ${t.space.$6}`, + paddingBottom: t.space.$4, gap: t.space.$2, })} > @@ -137,9 +81,9 @@ const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProp

@@ -147,82 +91,134 @@ const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProp

-

({ + display: 'flex', + flexDirection: 'column', + gap: t.space.$0x5, + })} > - To use the{' '} - - useOrganization - {' '} - hook, -
- you’ll need to enable the Organizations feature -
- for your app first. -
+ To use the{' '} + + useOrganization + {' '} + hook, +
+ you’ll need to enable the Organizations feature +
+ for your app first. + + Learn more about this add-on. -

+
- ({ - borderBottom: '1px solid rgba(255, 255, 255, 0.10)', - background: 'rgba(0, 0, 0, 0.80)', - overflow: 'hidden', - width: '100%', - height: '1px', - })} + + {/* TODO -> Introduce FAPI mutation to enable organizations */} ({ - paddingLeft: `${t.space.$4}`, - paddingRight: `${t.space.$4}`, - paddingTop: `${t.space.$3}`, - paddingBottom: `${t.space.$5}`, + padding: `${t.space.$4} ${t.space.$6}`, flexDirection: 'column', gap: t.space.$3, justifyContent: 'center', })} > - - + + + - + ); }; +/** + * A prompt that allows the user to enable the Organizations feature for their development instance + * @internal + */ export const EnableOrganizationsPrompt = (props: EnableOrganizationsPromptProps) => { return ( @@ -230,3 +226,23 @@ export const EnableOrganizationsPrompt = (props: EnableOrganizationsPromptProps) ); }; + +const mainCTAStyles = css` + ${basePromptElementStyles}; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 1.75rem; + max-width: 14.625rem; + padding: 0.25rem 0.625rem; + border-radius: 0.375rem; + font-size: 0.75rem; + font-weight: 500; + letter-spacing: 0.12px; + color: white; + text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32); + white-space: nowrap; + user-select: none; +`; diff --git a/packages/clerk-js/src/ui/components/KeylessPrompt/ClerkLogoIcon.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/ClerkLogoIcon.tsx similarity index 100% rename from packages/clerk-js/src/ui/components/KeylessPrompt/ClerkLogoIcon.tsx rename to packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/ClerkLogoIcon.tsx diff --git a/packages/clerk-js/src/ui/components/KeylessPrompt/KeySlashIcon.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/KeySlashIcon.tsx similarity index 100% rename from packages/clerk-js/src/ui/components/KeylessPrompt/KeySlashIcon.tsx rename to packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/KeySlashIcon.tsx diff --git a/packages/clerk-js/src/ui/components/KeylessPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx similarity index 93% rename from packages/clerk-js/src/ui/components/KeylessPrompt/index.tsx rename to packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx index 4e354ad4f44..d92f429d3c4 100644 --- a/packages/clerk-js/src/ui/components/KeylessPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx @@ -5,9 +5,10 @@ import type { PropsWithChildren } from 'react'; import { useEffect, useMemo, useState } from 'react'; import { createPortal } from 'react-dom'; -import { Flex, Link } from '../../customizables'; -import { Portal } from '../../elements/Portal'; -import { InternalThemeProvider } from '../../styledSystem'; +import { Flex, Link } from '../../../customizables'; +import { Portal } from '../../../elements/Portal'; +import { InternalThemeProvider } from '../../../styledSystem'; +import { basePromptElementStyles, PromptContainer } from '../shared'; import { ClerkLogoIcon } from './ClerkLogoIcon'; import { KeySlashIcon } from './KeySlashIcon'; import { useRevalidateEnvironment } from './use-revalidate-environment'; @@ -22,30 +23,6 @@ const buttonIdentifierPrefix = `--clerk-keyless-prompt`; const buttonIdentifier = `${buttonIdentifierPrefix}-button`; const contentIdentifier = `${buttonIdentifierPrefix}-content`; -const baseElementStyles = css` - box-sizing: border-box; - padding: 0; - margin: 0; - background: none; - border: none; - line-height: 1.5; - font-family: - -apple-system, - BlinkMacSystemFont, - avenir next, - avenir, - segoe ui, - helvetica neue, - helvetica, - Cantarell, - Ubuntu, - roboto, - noto, - arial, - sans-serif; - text-decoration: none; -`; - /** * If we cannot reconstruct the url properly, then simply fallback to Clerk Dashboard */ @@ -122,7 +99,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { }, [_props.copyKeysUrl]); const mainCTAStyles = css` - ${baseElementStyles}; + ${basePromptElementStyles}; display: flex; align-items: center; justify-content: center; @@ -150,22 +127,9 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { return ( - ({ - position: 'fixed', - bottom: '1.25rem', - right: '1.25rem', - height: `${t.sizes.$10}`, - minWidth: '13.4rem', - paddingLeft: `${t.space.$3}`, - borderRadius: '1.25rem', - fontFamily: t.fonts.$main, - background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 100%), #1f1f1f', - boxShadow: - '0px 0px 0px 0.5px #2F3037 inset, 0px 1px 0px 0px rgba(255, 255, 255, 0.08) inset, 0px 0px 0.8px 0.8px rgba(255, 255, 255, 0.20) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.72), 0px 16px 36px -6px rgba(0, 0, 0, 0.36), 0px 6px 16px -2px rgba(0, 0, 0, 0.20);', - transition: 'all 195ms cubic-bezier(0.2, 0.61, 0.1, 1)', - '&[data-expanded="false"]:hover': { background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.20) 0%, rgba(255, 255, 255, 0) 100%), #1f1f1f', }, @@ -192,7 +156,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { id={buttonIdentifier} onClick={() => !claimed && setIsExpanded(prev => !prev)} css={css` - ${baseElementStyles}; + ${basePromptElementStyles}; width: 100%; display: flex; justify-content: space-between; @@ -315,7 +279,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { success ? 'Claim completed' : claimed ? 'Missing environment keys' : 'Clerk is in keyless mode' } css={css` - ${baseElementStyles}; + ${basePromptElementStyles}; color: #d9d9d9; font-size: 0.875rem; font-weight: 500; @@ -381,7 +345,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { >

{ target='_blank' rel='noopener noreferrer' css={css` - ${baseElementStyles}; + ${basePromptElementStyles}; color: #ffffff9e; font-size: 0.75rem; transition: color 120ms ease-out; @@ -565,7 +529,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { ))} - + ) { + return ( + [ + { + position: 'fixed', + bottom: '1.25rem', + right: '1.25rem', + height: `${t.sizes.$10}`, + minWidth: '13.4rem', + paddingLeft: `${t.space.$3}`, + borderRadius: '1.25rem', + fontFamily: t.fonts.$main, + background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 100%), #1f1f1f', + boxShadow: + '0px 0px 0px 0.5px #2F3037 inset, 0px 1px 0px 0px rgba(255, 255, 255, 0.08) inset, 0px 0px 0.8px 0.8px rgba(255, 255, 255, 0.20) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.72), 0px 16px 36px -6px rgba(0, 0, 0, 0.36), 0px 6px 16px -2px rgba(0, 0, 0, 0.20);', + transition: 'all 195ms cubic-bezier(0.2, 0.61, 0.1, 1)', + }, + sx, + ]} + {...props} + > + {children} + + ); +} + +/** + * @internal + */ +export const basePromptElementStyles = css` + box-sizing: border-box; + padding: 0; + margin: 0; + background: none; + border: none; + line-height: 1.5; + font-family: + -apple-system, + BlinkMacSystemFont, + avenir next, + avenir, + segoe ui, + helvetica neue, + helvetica, + Cantarell, + Ubuntu, + roboto, + noto, + arial, + sans-serif; + text-decoration: none; +`; diff --git a/packages/clerk-js/src/ui/customizables/parseAppearance.ts b/packages/clerk-js/src/ui/customizables/parseAppearance.ts index 11348a8f29d..cc2c53bb0bc 100644 --- a/packages/clerk-js/src/ui/customizables/parseAppearance.ts +++ b/packages/clerk-js/src/ui/customizables/parseAppearance.ts @@ -27,7 +27,7 @@ type PublicAppearanceTopLevelKey = keyof Omit< export type AppearanceCascade = { globalAppearance?: Appearance; appearance?: Appearance; - appearanceKey: PublicAppearanceTopLevelKey | 'impersonationFab'; + appearanceKey: PublicAppearanceTopLevelKey | 'impersonationFab' | 'enableOrganizationsPrompt'; }; export type ParsedAppearance = { diff --git a/packages/clerk-js/src/ui/lazyModules/components.ts b/packages/clerk-js/src/ui/lazyModules/components.ts index 98c2f7769e3..cd00ce8ee0b 100644 --- a/packages/clerk-js/src/ui/lazyModules/components.ts +++ b/packages/clerk-js/src/ui/lazyModules/components.ts @@ -17,7 +17,7 @@ const componentImportPaths = { BlankCaptchaModal: () => import(/* webpackChunkName: "blankcaptcha" */ './../components/BlankCaptchaModal'), UserVerification: () => import(/* webpackChunkName: "userverification" */ './../components/UserVerification'), Waitlist: () => import(/* webpackChunkName: "waitlist" */ './../components/Waitlist'), - KeylessPrompt: () => import(/* webpackChunkName: "keylessPrompt" */ '../components/KeylessPrompt'), + KeylessPrompt: () => import(/* webpackChunkName: "keylessPrompt" */ '../components/devPrompts/KeylessPrompt'), PricingTable: () => import(/* webpackChunkName: "pricingTable" */ '../components/PricingTable'), Checkout: () => import(/* webpackChunkName: "checkout" */ '../components/Checkout'), SessionTasks: () => import(/* webpackChunkName: "sessionTasks" */ '../components/SessionTasks'), @@ -28,7 +28,7 @@ const componentImportPaths = { APIKeys: () => import(/* webpackChunkName: "apiKeys" */ '../components/APIKeys/APIKeys'), OAuthConsent: () => import(/* webpackChunkName: "oauthConsent" */ '../components/OAuthConsent/OAuthConsent'), EnableOrganizationsPrompt: () => - import(/* webpackChunkName: "enableOrganizationsPrompt" */ '../components/EnableOrganizationsPrompt'), + import(/* webpackChunkName: "enableOrganizationsPrompt" */ '../components/devPrompts/EnableOrganizationsPrompt'), } as const; export const SignIn = lazy(() => componentImportPaths.SignIn().then(module => ({ default: module.SignIn }))); diff --git a/packages/clerk-js/src/ui/lazyModules/providers.tsx b/packages/clerk-js/src/ui/lazyModules/providers.tsx index 9e2c871f23d..827d869a650 100644 --- a/packages/clerk-js/src/ui/lazyModules/providers.tsx +++ b/packages/clerk-js/src/ui/lazyModules/providers.tsx @@ -209,6 +209,23 @@ export const LazyImpersonationFabProvider = ( ); }; +export const LazyEnableOrganizationsPromptProvider = ( + props: React.PropsWithChildren<{ globalAppearance: Appearance | undefined }>, +) => { + return ( + + + + {props.children} + + + + ); +}; + type LazyOneTapRendererProps = React.PropsWithChildren< { componentProps: any; diff --git a/packages/clerk-js/src/ui/types.ts b/packages/clerk-js/src/ui/types.ts index 053a7f0abd5..3f9fe2a27ef 100644 --- a/packages/clerk-js/src/ui/types.ts +++ b/packages/clerk-js/src/ui/types.ts @@ -1,6 +1,5 @@ import type { __internal_CheckoutProps, - __internal_EnableOrganizationsPromptProps, __internal_OAuthConsentProps, __internal_PlanDetailsProps, __internal_SubscriptionDetailsProps, @@ -76,11 +75,6 @@ export type UserVerificationCtx = __internal_UserVerificationProps & { mode?: ComponentMode; }; -export type EnableOrganizationsCtx = __internal_EnableOrganizationsPromptProps & { - componentName: 'EnableOrganizations'; - mode?: ComponentMode; -}; - export type UserProfileCtx = UserProfileProps & { componentName: 'UserProfile'; mode?: ComponentMode; diff --git a/packages/shared/src/organization.ts b/packages/shared/src/organization.ts index ba31ec5d564..9aaa516f3ff 100644 --- a/packages/shared/src/organization.ts +++ b/packages/shared/src/organization.ts @@ -17,8 +17,7 @@ export function getCurrentOrganizationMembership( } /** - * Wraps a hook function in a check to see if organization settings is enabled - * + * Wraps a function in a check to see if organization settings is enabled * If not enabled, it will open a dialog with a prompt to enable organizations * * @internal diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 0c314558111..859cc5bc567 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -323,7 +323,7 @@ export interface Clerk { /** * Opens the Clerk Enable Organizations prompt for development environments */ - __internal_openEnableOrganizationsPrompt: (props?: __internal_EnableOrganizationsPromptProps) => void; + __internal_openEnableOrganizationsPrompt: (props: __internal_EnableOrganizationsPromptProps) => void; /** * Closes the Clerk Enable Organizations modal. @@ -1440,7 +1440,7 @@ export type __internal_UserVerificationProps = RoutingOptions & { export type __internal_UserVerificationModalProps = WithoutRouting<__internal_UserVerificationProps>; export type __internal_EnableOrganizationsPromptProps = { - callerName?: string; + callerName: string; }; type GoogleOneTapRedirectUrlProps = SignInForceRedirectUrl & SignUpForceRedirectUrl; diff --git a/playground/app-router/src/app/layout.tsx b/playground/app-router/src/app/layout.tsx index ce2b6af9f26..de072d2b2a5 100644 --- a/playground/app-router/src/app/layout.tsx +++ b/playground/app-router/src/app/layout.tsx @@ -15,13 +15,13 @@ export default function RootLayout({ children }: { children: React.ReactNode }) return ( - - -

- + + +
+

Root layout

+ {children} +
+ ); diff --git a/playground/app-router/src/app/test.tsx b/playground/app-router/src/app/test.tsx deleted file mode 100644 index 5cb46ecb787..00000000000 --- a/playground/app-router/src/app/test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client" - -import { OrganizationList } from "@clerk/clerk-react"; - - -export function Test() { - - return
; -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ceafdd1ea7..326e4de0b86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3784,6 +3784,9 @@ packages: '@oxc-project/types@0.94.0': resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} + '@oxc-project/types@0.96.0': + resolution: {integrity: sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==} + '@oxc-transform/binding-android-arm64@0.87.0': resolution: {integrity: sha512-B7W6J8T9cS054LUGLfYkYz8bz5+t+4yPftZ67Bn6MJ03okMLnbbEfm1bID1tqcP5tJwMurTILVy/dQfDYDcMgQ==} engines: {node: '>=14.0.0'} @@ -4252,12 +4255,24 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-Mp0/gqiPdepHjjVm7e0yL1acWvI0rJVVFQEADSezvAjon9sjQ7CEg9JnXICD4B1YrPmN9qV/e7cQZCp87tTV4w==} cpu: [arm64] @@ -4274,6 +4289,12 @@ packages: cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.47': + resolution: {integrity: sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-40re4rMNrsi57oavRzIOpRGmg3QRlW6Ea8Q3znaqgOuJuKVrrm2bIQInTfkZJG7a4/5YMX7T951d0+toGLTdCA==} cpu: [x64] @@ -4290,6 +4311,12 @@ packages: cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.47': + resolution: {integrity: sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-8BDM939bbMariZupiHp3OmP5N+LXPT4mULA0hZjDaq970PCxv4krZOSMG+HkWUUwmuQROtV+/00xw39EO0P+8g==} cpu: [x64] @@ -4306,6 +4333,12 @@ packages: cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47': + resolution: {integrity: sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-sntsPaPgrECpBB/+2xrQzVUt0r493TMPI+4kWRMhvMsmrxOqH1Ep5lM0Wua/ZdbfZNwm1aVa5pcESQfNfM4Fhw==} cpu: [arm] @@ -4323,6 +4356,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47': + resolution: {integrity: sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-5clBW/I+er9F2uM1OFjJFWX86y7Lcy0M+NqsN4s3o07W+8467Zk8oQa4B45vdaXoNUF/yqIAgKkA/OEdQDxZqA==} cpu: [arm64] @@ -4342,6 +4382,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.47': + resolution: {integrity: sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-wv+rnAfQDk9p/CheX8/Kmqk2o1WaFa4xhWI9gOyDMk/ljvOX0u0ubeM8nI1Qfox7Tnh71eV5AjzSePXUhFOyOg==} cpu: [arm64] @@ -4361,6 +4408,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.47': + resolution: {integrity: sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-gxD0/xhU4Py47IH3bKZbWtvB99tMkUPGPJFRfSc5UB9Osoje0l0j1PPbxpUtXIELurYCqwLBKXIMTQGifox1BQ==} cpu: [x64] @@ -4380,6 +4434,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.47': + resolution: {integrity: sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-HotuVe3XUjDwqqEMbm3o3IRkP9gdm8raY/btd/6KE3JGLF/cv4+3ff1l6nOhAZI8wulWDPEXPtE7v+HQEaTXnA==} cpu: [x64] @@ -4398,11 +4459,22 @@ packages: cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.47': + resolution: {integrity: sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-8Cx+ucbd8n2dIr21FqBh6rUvTVL0uTgEtKR7l+MUZ5BgY4dFh1e4mPVX8oqmoYwOxBiXrsD2JIOCz4AyKLKxWA==} engines: {node: '>=14.21.3'} @@ -4419,6 +4491,12 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-Vhq5vikrVDxAa75fxsyqj0c0Y/uti/TwshXI71Xb8IeUQJOBnmLUsn5dgYf5ljpYYkNa0z9BPAvUDIDMmyDi+w==} cpu: [arm64] @@ -4435,6 +4513,12 @@ packages: cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-lN7RIg9Iugn08zP2aZN9y/MIdG8iOOCE93M1UrFlrxMTqPf8X+fDzmR/OKhTSd1A2pYNipZHjyTcb5H8kyQSow==} cpu: [ia32] @@ -4451,6 +4535,12 @@ packages: cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.d91dfb5': resolution: {integrity: sha512-7/7cLIn48Y+EpQ4CePvf8reFl63F15yPUlg4ZAhl+RXJIfydkdak1WD8Ir3AwAO+bJBXzrfNL+XQbxm0mcQZmw==} cpu: [x64] @@ -4473,9 +4563,6 @@ packages: '@rolldown/pluginutils@1.0.0-beta.50': resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} - '@rolldown/pluginutils@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-8sExkWRK+zVybw3+2/kBkYBFeLnEUWz1fT7BLHplpzmtqkOfTbAQ9gkt4pzwGIIZmg4Qn5US5ACjUBenrhezwQ==} - '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -13012,6 +13099,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-beta.47: + resolution: {integrity: sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rolldown@1.0.0-beta.9-commit.d91dfb5: resolution: {integrity: sha512-FHkj6gGEiEgmAXQchglofvUUdwj2Oiw603Rs+zgFAnn9Cb7T7z3fiaEc0DbN3ja4wYkW6sF2rzMEtC1V4BGx/g==} hasBin: true @@ -19107,14 +19199,18 @@ snapshots: '@oxc-parser/binding-win32-x64-msvc@0.87.0': optional: true - '@oxc-project/runtime@0.71.0': {} + '@oxc-project/runtime@0.71.0': + optional: true - '@oxc-project/types@0.71.0': {} + '@oxc-project/types@0.71.0': + optional: true '@oxc-project/types@0.87.0': {} '@oxc-project/types@0.94.0': {} + '@oxc-project/types@0.96.0': {} + '@oxc-transform/binding-android-arm64@0.87.0': optional: true @@ -19722,62 +19818,97 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.43': optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.47': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.47': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.43': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.47': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.43': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.47': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.47': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.47': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.47': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.47': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.47': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': dependencies: '@napi-rs/wasm-runtime': 0.2.12 @@ -19791,18 +19922,27 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47': + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.d91dfb5': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.d91dfb5': optional: true @@ -19814,8 +19954,6 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.50': {} - '@rolldown/pluginutils@1.0.0-beta.9-commit.d91dfb5': {} - '@rollup/plugin-alias@5.1.1(rollup@4.52.4)': optionalDependencies: rollup: 4.52.4 @@ -30308,7 +30446,7 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.0 - rolldown-plugin-dts@0.16.12(rolldown@1.0.0-beta.9-commit.d91dfb5)(typescript@5.8.3): + rolldown-plugin-dts@0.16.12(rolldown@1.0.0-beta.47)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -30319,7 +30457,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.13.0 magic-string: 0.30.19 - rolldown: 1.0.0-beta.9-commit.d91dfb5 + rolldown: 1.0.0-beta.47 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30347,6 +30485,26 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 + rolldown@1.0.0-beta.47: + dependencies: + '@oxc-project/types': 0.96.0 + '@rolldown/pluginutils': 1.0.0-beta.47 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.47 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.47 + '@rolldown/binding-darwin-x64': 1.0.0-beta.47 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.47 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.47 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.47 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.47 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.47 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.47 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.47 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.47 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.47 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.47 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.47 + rolldown@1.0.0-beta.9-commit.d91dfb5: dependencies: '@oxc-project/runtime': 0.71.0 @@ -30366,6 +30524,7 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.9-commit.d91dfb5 '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.9-commit.d91dfb5 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.9-commit.d91dfb5 + optional: true rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.9-commit.d91dfb5)(rollup@4.52.4): dependencies: @@ -31613,8 +31772,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.9-commit.d91dfb5 - rolldown-plugin-dts: 0.16.12(rolldown@1.0.0-beta.9-commit.d91dfb5)(typescript@5.8.3) + rolldown: 1.0.0-beta.47 + rolldown-plugin-dts: 0.16.12(rolldown@1.0.0-beta.47)(typescript@5.8.3) semver: 7.7.3 tinyexec: 1.0.1 tinyglobby: 0.2.15 From ecc17a123f3b60aa975062c5e117541d301072ba Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:41:26 -0300 Subject: [PATCH 05/30] Revert pnpm-lock.yaml changes Revert pnpm-lock.yaml changes --- packages/clerk-js/src/core/clerk.ts | 14 ++-- .../EnableOrganizationsPrompt/index.tsx | 11 ++- packages/shared/src/organization.ts | 6 +- packages/shared/src/types/clerk.ts | 10 ++- playground/app-router/src/app/layout.tsx | 20 ++--- pnpm-lock.yaml | 73 ------------------- 6 files changed, 32 insertions(+), 102 deletions(-) diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index be1254f14b3..c331ce42ffc 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -831,7 +831,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationSwitcher', + componentName: 'OrganizationProfile', }); } return; @@ -861,7 +861,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationSwitcher', + componentName: 'OrganizationSwitcher', }); } return; @@ -1003,7 +1003,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationProfile', + componentName: 'OrganizationProfile', }); } return; @@ -1043,7 +1043,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationSwitcher', + componentName: 'OrganizationSwitcher', }); } return; @@ -1074,7 +1074,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationSwitcher', + componentName: 'OrganizationSwitcher', }); } return; @@ -1113,7 +1113,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationList', + componentName: 'OrganizationList', }); } return; @@ -1309,7 +1309,7 @@ export class Clerk implements ClerkInterface { if (disabledOrganizationsFeature(this, this.environment)) { if (this.#instanceType === 'development') { this.__internal_openEnableOrganizationsPrompt({ - callerName: 'OrganizationSwitcher', + componentName: 'OrganizationSwitcher', }); } return; diff --git a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx index c18019b4e27..d5091b1fd25 100644 --- a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx @@ -1,3 +1,4 @@ +import type { __internal_EnableOrganizationsPromptProps } from '@clerk/shared/types'; import { css } from '@emotion/react'; import { Modal } from '@/ui/elements/Modal'; @@ -7,11 +8,9 @@ import { Flex } from '../../../customizables'; import { Portal } from '../../../elements/Portal'; import { basePromptElementStyles, PromptContainer } from '../shared'; -type EnableOrganizationsPromptProps = { - callerName: string; -}; +const EnableOrganizationsPromptInternal = (props: __internal_EnableOrganizationsPromptProps) => { + const ctaText = 'componentName' in props ? `<${props.componentName} /> component` : props.utilityName; -const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProps) => { return ( - useOrganization + {ctaText} {' '} hook,
@@ -219,7 +218,7 @@ const EnableOrganizationsPromptInternal = (_props: EnableOrganizationsPromptProp * A prompt that allows the user to enable the Organizations feature for their development instance * @internal */ -export const EnableOrganizationsPrompt = (props: EnableOrganizationsPromptProps) => { +export const EnableOrganizationsPrompt = (props: __internal_EnableOrganizationsPromptProps) => { return ( diff --git a/packages/shared/src/organization.ts b/packages/shared/src/organization.ts index 9aaa516f3ff..2e81fe80619 100644 --- a/packages/shared/src/organization.ts +++ b/packages/shared/src/organization.ts @@ -1,4 +1,4 @@ -import type { LoadedClerk, OrganizationMembershipResource } from './types'; +import type { __internal_EnableOrganizationsPromptProps, LoadedClerk, OrganizationMembershipResource } from './types'; /** * Finds the organization membership for a given organization ID from a list of memberships @@ -26,7 +26,7 @@ export const withOrganizationSettingsEnabled = ( hook: (...args: TParams) => TReturn, getLoadedClerk: () => LoadedClerk | null | undefined, - callerName?: string, + utilityName?: __internal_EnableOrganizationsPromptProps['utilityName'], ) => (...args: TParams): TReturn => { const clerk = getLoadedClerk(); @@ -35,7 +35,7 @@ export const withOrganizationSettingsEnabled = if (!environment?.organizationSettings.enabled) { clerk?.__internal_openEnableOrganizationsPrompt({ - callerName, + utilityName, }); } diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 859cc5bc567..59af9367c28 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -1439,9 +1439,13 @@ export type __internal_UserVerificationProps = RoutingOptions & { export type __internal_UserVerificationModalProps = WithoutRouting<__internal_UserVerificationProps>; -export type __internal_EnableOrganizationsPromptProps = { - callerName: string; -}; +export type __internal_EnableOrganizationsPromptProps = + | { + componentName: 'OrganizationSwitcher' | 'OrganizationProfile' | 'OrganizationList'; + } + | { + utilityName: 'useOrganizationList' | 'useOrganization'; + }; type GoogleOneTapRedirectUrlProps = SignInForceRedirectUrl & SignUpForceRedirectUrl; diff --git a/playground/app-router/src/app/layout.tsx b/playground/app-router/src/app/layout.tsx index de072d2b2a5..c90b61270fd 100644 --- a/playground/app-router/src/app/layout.tsx +++ b/playground/app-router/src/app/layout.tsx @@ -1,7 +1,7 @@ -import { Links } from '@/common/Links'; -import { ClerkProvider } from '@clerk/nextjs'; -import { Inter } from 'next/font/google'; import './globals.css'; +import { Inter } from 'next/font/google'; +import { ClerkProvider } from '@clerk/nextjs'; +import { Links } from '@/common/Links'; const inter = Inter({ subsets: ['latin'] }); @@ -15,13 +15,13 @@ export default function RootLayout({ children }: { children: React.ReactNode }) return ( - - -
-

Root layout

- {children} -
- + + +
+

Root layout

+ {children} +
+
); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 326e4de0b86..44854c5622a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4278,11 +4278,6 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-Mp0/gqiPdepHjjVm7e0yL1acWvI0rJVVFQEADSezvAjon9sjQ7CEg9JnXICD4B1YrPmN9qV/e7cQZCp87tTV4w==} - cpu: [arm64] - os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.43': resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4300,11 +4295,6 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-40re4rMNrsi57oavRzIOpRGmg3QRlW6Ea8Q3znaqgOuJuKVrrm2bIQInTfkZJG7a4/5YMX7T951d0+toGLTdCA==} - cpu: [x64] - os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.43': resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4322,11 +4312,6 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-8BDM939bbMariZupiHp3OmP5N+LXPT4mULA0hZjDaq970PCxv4krZOSMG+HkWUUwmuQROtV+/00xw39EO0P+8g==} - cpu: [x64] - os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4344,11 +4329,6 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-sntsPaPgrECpBB/+2xrQzVUt0r493TMPI+4kWRMhvMsmrxOqH1Ep5lM0Wua/ZdbfZNwm1aVa5pcESQfNfM4Fhw==} - cpu: [arm] - os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4369,12 +4349,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-5clBW/I+er9F2uM1OFjJFWX86y7Lcy0M+NqsN4s3o07W+8467Zk8oQa4B45vdaXoNUF/yqIAgKkA/OEdQDxZqA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4395,12 +4369,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-wv+rnAfQDk9p/CheX8/Kmqk2o1WaFa4xhWI9gOyDMk/ljvOX0u0ubeM8nI1Qfox7Tnh71eV5AjzSePXUhFOyOg==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4421,12 +4389,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-gxD0/xhU4Py47IH3bKZbWtvB99tMkUPGPJFRfSc5UB9Osoje0l0j1PPbxpUtXIELurYCqwLBKXIMTQGifox1BQ==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4447,12 +4409,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-HotuVe3XUjDwqqEMbm3o3IRkP9gdm8raY/btd/6KE3JGLF/cv4+3ff1l6nOhAZI8wulWDPEXPtE7v+HQEaTXnA==} - cpu: [x64] - os: [linux] - libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4480,11 +4436,6 @@ packages: engines: {node: '>=14.21.3'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-8Cx+ucbd8n2dIr21FqBh6rUvTVL0uTgEtKR7l+MUZ5BgY4dFh1e4mPVX8oqmoYwOxBiXrsD2JIOCz4AyKLKxWA==} - engines: {node: '>=14.21.3'} - cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4502,11 +4453,6 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-Vhq5vikrVDxAa75fxsyqj0c0Y/uti/TwshXI71Xb8IeUQJOBnmLUsn5dgYf5ljpYYkNa0z9BPAvUDIDMmyDi+w==} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4524,11 +4470,6 @@ packages: cpu: [ia32] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-lN7RIg9Iugn08zP2aZN9y/MIdG8iOOCE93M1UrFlrxMTqPf8X+fDzmR/OKhTSd1A2pYNipZHjyTcb5H8kyQSow==} - cpu: [ia32] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4546,11 +4487,6 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.9-commit.d91dfb5': - resolution: {integrity: sha512-7/7cLIn48Y+EpQ4CePvf8reFl63F15yPUlg4ZAhl+RXJIfydkdak1WD8Ir3AwAO+bJBXzrfNL+XQbxm0mcQZmw==} - cpu: [x64] - os: [win32] - '@rolldown/pluginutils@1.0.0-beta.11': resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} @@ -13108,10 +13044,6 @@ packages: resolution: {integrity: sha512-FHkj6gGEiEgmAXQchglofvUUdwj2Oiw603Rs+zgFAnn9Cb7T7z3fiaEc0DbN3ja4wYkW6sF2rzMEtC1V4BGx/g==} hasBin: true - rolldown@1.0.0-beta.9-commit.d91dfb5: - resolution: {integrity: sha512-FHkj6gGEiEgmAXQchglofvUUdwj2Oiw603Rs+zgFAnn9Cb7T7z3fiaEc0DbN3ja4wYkW6sF2rzMEtC1V4BGx/g==} - hasBin: true - rollup-plugin-visualizer@6.0.3: resolution: {integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==} engines: {node: '>=18'} @@ -19914,11 +19846,6 @@ snapshots: '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.9-commit.d91dfb5': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true From fce2cc2319de6b33b2d70b2d9b1f44d399beb3ff Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:37:40 -0300 Subject: [PATCH 06/30] Update `PromptContainer` to exclude keyless styles --- .../EnableOrganizationsPrompt/index.tsx | 105 +++++++++--------- .../devPrompts/KeylessPrompt/index.tsx | 8 ++ .../src/ui/components/devPrompts/shared.tsx | 6 - 3 files changed, 61 insertions(+), 58 deletions(-) diff --git a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx index d5091b1fd25..2ba565d377d 100644 --- a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx @@ -9,46 +9,40 @@ import { Portal } from '../../../elements/Portal'; import { basePromptElementStyles, PromptContainer } from '../shared'; const EnableOrganizationsPromptInternal = (props: __internal_EnableOrganizationsPromptProps) => { - const ctaText = 'componentName' in props ? `<${props.componentName} /> component` : props.utilityName; + const ctaText = 'componentName' in props ? `<${props.componentName} />` : props.utilityName; return ( ({ animation: 'unset' })} + containerSx={() => ({ alignItems: 'center' })} > ({ - top: '50%', - left: '50%', - bottom: 'auto', - right: 'auto', - padding: 'unset', - transform: 'translate(-50%, -50%)', + display: 'flex', flexDirection: 'column', - height: 'fit-content', })} > ({ - display: 'flex', - flexDirection: 'column', - padding: `${t.space.$5} ${t.space.$6}`, - paddingBottom: t.space.$4, - gap: t.space.$2, + padding: `${t.sizes.$4} ${t.sizes.$6}`, + paddingBottom: t.sizes.$4, + gap: t.sizes.$2, })} > ({ - display: 'flex', - alignItems: 'center', - gap: t.space.$2, + gap: t.sizes.$2, })} >

Organizations feature required

({ - display: 'flex', - flexDirection: 'column', - gap: t.space.$0x5, + gap: t.sizes.$0x5, })} > To use the{' '} {ctaText} {' '} - hook, + {'componentName' in props ? 'component' : 'hook'},
you’ll need to enable the Organizations feature
@@ -123,14 +122,16 @@ const EnableOrganizationsPromptInternal = (props: __internal_EnableOrganizations
Introduce FAPI mutation to enable organizations */} ({ - padding: `${t.space.$4} ${t.space.$6}`, - flexDirection: 'column', - gap: t.space.$3, - justifyContent: 'center', + padding: `${t.sizes.$4} ${t.sizes.$6}`, + gap: t.sizes.$3, })} > + &:hover:not(:disabled) { + box-shadow: + 0px 0px 6px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.1), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48); + } - + ) : ( + <> + + &:hover:not(:disabled) { + box-shadow: + 0px 0px 6px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.1), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48); + } + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + `} + > + Enable Organizations + + + + + )}
diff --git a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx index 3d24d08765e..04eee749bd9 100644 --- a/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/KeylessPrompt/index.tsx @@ -8,7 +8,7 @@ import { createPortal } from 'react-dom'; import { Flex, Link } from '../../../customizables'; import { Portal } from '../../../elements/Portal'; import { InternalThemeProvider } from '../../../styledSystem'; -import { basePromptElementStyles, PromptContainer } from '../shared'; +import { basePromptElementStyles, PromptContainer, PromptSuccessIcon } from '../shared'; import { ClerkLogoIcon } from './ClerkLogoIcon'; import { KeySlashIcon } from './KeySlashIcon'; import { useRevalidateEnvironment } from './use-revalidate-environment'; @@ -178,29 +178,7 @@ const KeylessPromptInternal = (_props: KeylessPromptProps) => { })} > {success ? ( - - - - - - + ) : claimed ? ( + + + + + + ); +} From 687e38721fbfda943a8fbbfaf34136ec9869a94d Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 12 Nov 2025 13:47:08 -0300 Subject: [PATCH 11/30] Extract button to generic component --- .../core/resources/OrganizationSettings.ts | 4 + .../EnableOrganizationsPrompt/index.tsx | 167 ++++++++++-------- 2 files changed, 94 insertions(+), 77 deletions(-) diff --git a/packages/clerk-js/src/core/resources/OrganizationSettings.ts b/packages/clerk-js/src/core/resources/OrganizationSettings.ts index 08c4cad9ba6..38deff7c404 100644 --- a/packages/clerk-js/src/core/resources/OrganizationSettings.ts +++ b/packages/clerk-js/src/core/resources/OrganizationSettings.ts @@ -76,6 +76,10 @@ export class OrganizationSettings extends BaseResource implements OrganizationSe } as unknown as OrganizationSettingsJSONSnapshot; } + /** + * Used to enable the Organizations feature in memory after it has been enabled in the backend + * from the devtools resource, since it cannot return the updated environment due to API caching + */ public __internal_enableInMemory() { this.enabled = true; } diff --git a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx index aad95df3444..d12fbdd723d 100644 --- a/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx +++ b/packages/clerk-js/src/ui/components/devPrompts/EnableOrganizationsPrompt/index.tsx @@ -232,96 +232,28 @@ const EnableOrganizationsPromptInternal = (props: __internal_EnableOrganizations })} > {isEnabled ? ( - + ) : ( <> - + - + )} @@ -361,4 +293,85 @@ const mainCTAStyles = css` text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32); white-space: nowrap; user-select: none; + min-width: 100%; + color: white; + transition: + background 150ms cubic-bezier(0.2, 0.61, 0.1, 1), + box-shadow 150ms cubic-bezier(0.2, 0.61, 0.1, 1), + border-color 150ms cubic-bezier(0.2, 0.61, 0.1, 1); + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } `; + +type PromptButtonVariant = 'solid' | 'outline'; + +type PromptButtonProps = Pick, 'onClick' | 'children' | 'disabled'> & { + variant?: PromptButtonVariant; +}; + +const PromptButton = ({ variant = 'solid', ...props }: PromptButtonProps) => { + const solidStyles = css` + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545; + box-shadow: + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.12), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48), + 0px 0px 4px 0px rgba(243, 107, 22, 0) inset; + + &:hover:not(:disabled) { + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.15) 100%), #5f5f5f; + box-shadow: + 0 0 3px 0 rgba(253, 224, 71, 0) inset, + 0 0 0 1px rgba(255, 255, 255, 0.04) inset, + 0 1px 0 0 rgba(255, 255, 255, 0.04) inset, + 0 0 0 1px rgba(0, 0, 0, 0.12), + 0 1.5px 2px 0 rgba(0, 0, 0, 0.48); + } + + &:focus:not(:disabled) { + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.15) 100%), #5f5f5f; + box-shadow: + 0 0 3px 0 rgba(253, 224, 71, 0) inset, + 0 0 0 1px rgba(255, 255, 255, 0.04) inset, + 0 1px 0 0 rgba(255, 255, 255, 0.04) inset, + 0 0 0 1px rgba(0, 0, 0, 0.12), + 0 1.5px 2px 0 rgba(0, 0, 0, 0.48); + } + `; + + const outlineStyles = css` + background: rgba(69, 69, 69, 0.1); + border: 1px solid rgba(118, 118, 132, 0.25); + + &:hover:not(:disabled) { + box-shadow: + 0px 0px 6px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.1), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48); + } + + &:focus:not(:disabled) { + box-shadow: + 0px 0px 6px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset, + 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset, + 0px 0px 0px 1px rgba(0, 0, 0, 0.1), + 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48); + border-color: rgba(118, 118, 132, 0.4); + } + `; + + return ( +