## Problem
Safari can expose `navigator.clipboard.write()` while rejecting it with
`NotAllowedError`.
Studio's shared clipboard helper treated that rejection as a terminal
failure, so Copy buttons showed "Unable to copy to clipboard" even
though `writeText()` worked.
Fixes#50769
## Solution
- Fall back to `navigator.clipboard.writeText()` when the rich clipboard
write fails.
- Preserve the existing success callback and error behavior.
- Add regression coverage for fallback success, total failure, and
callback exceptions.
## Verification
- `pnpm exec vitest run lib/helpers.test.ts --pool=threads`
- `pnpm test:prettier`
- `pnpm --filter ui run typecheck`
- `pnpm --filter studio run typecheck`
- `pnpm --filter studio run lint`
- `npm run build -- --filter=studio`
- Rendered browser verification with `clipboard.write()` forced to
reject; `writeText()` received the expected payload and the Copy button
showed success.
## Review instructions
1. Review the fallback logic in
`packages/ui/src/lib/utils/clipboard.ts`.
2. Review the regression tests in `apps/studio/lib/helpers.test.ts`.
3. Confirm no generated or vendored files are changed.
- [x] I have read CONTRIBUTING.md
- [x] This PR does not change documentation content.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Copying now falls back to standard clipboard copying when rich
clipboard access is unavailable or denied.
* An error message is shown only when both clipboard methods fail.
Successful rich clipboard writes do not trigger a fallback if a
follow-up action fails.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->