With every producer on the generated lexicons, the branded-string assertions at
these 30 sites are no-ops, and oxlint flags them. Also sorts the imports the
type flip disturbed and prunes the suppressions that no longer occur.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The rest of the consumer surface - components, screens and the legacy `view`
tree - takes its moderation types from `@bsky.app/sdk/moderation` and its
`moderate*` calls from the `lib/moderation/subjects` seam.
`DebugMod` constructs a `ModerationOpts` by hand for its scenario matrix, so
its literal `userDid` is branded at the construction site.
The two RichText classes are not mutually assignable - `UnicodeString` has a
private field and the SDK brands `did`/`uri` as template literal types - so
every producer and consumer of a RichText instance has to move in one step.
`detectFacets` now takes a lex client instead of the legacy agent, which is
what removes the last hard agent dependency from these files. Handle
resolution is an appview job, so the appview client is threaded in: through
`useAppviewClient` in the hooks and dialogs, and through a new
`appviewClient` option on `apilib.post` (Composer already had the client to
hand). The rest of the post pipeline still writes through the agent.
Facet feature checks move from the `AppBskyRichtextFacet` validators to the
generated `#/lexicons` schemas, matching how the rest of the app narrows
lexicon types.
Display sinks still read facets off `@atproto/api` view types, which are the
same lexicon but typed with plain strings. `asSdkFacets` widens them at those
call sites and goes away once the view types come from the SDK too.
* Fix text input not updating
* Fix autofocus
* make placeholder text fainter
* Await invalidation
* Image only drafts
* tweaks to gif presentation
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* Upgrade ESLint to v9 with flat config
- Upgrade eslint from v8 to v9.18.0
- Migrate from .eslintrc.js to eslint.config.mjs (flat config)
- Upgrade typescript-eslint to v8.20.0 (unified package)
- Replace eslint-plugin-import with eslint-plugin-import-x for flat config support
- Add globals package for environment globals
- Update eslint-plugin-bsky-internal with proper meta objects for ESLint v9
- Fix deprecated context.getScope() API usage
- Update bskyembed to use flat config
- Remove deprecated --ext flag from lint scripts
- Configure rules to maintain previous behavior while using new ESLint version
* Fix varsIgnorePattern to require character after underscore
Restore the original pattern `^_.+` instead of `^_` so that lingui's
`const { _ } = useLingui()` will still be flagged when unused.
* Update ESLint rule tests for flat config format
- Update RuleTester to use flat config languageOptions instead of
eslintrc parser format
- Remove duplicate test case that ESLint v9 now detects
- Add Jest globals for test files
* update eslint package versions
* lint android a11y
* enable typechecked rules, switch them to warn
* fix yarn lock ci
* Fix CI failure
* Remove unused globals?
* Organize a bit, add quiet to main lint command
* Allow ternary
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Eric Bailey <git@esb.lol>
* Add cashtag support for stock ticker discussions
Display cashtags ($TICKER format) as clickable links with dedicated menu actions and search feed, alongside hashtags. Includes composer highlighting and proper formatting.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
* Fix cashtag search query to use # prefix
Cashtags need to be searched as "#$BTC" rather than just "$BTC" to work
with the search API.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Update @atproto/api to 0.18.14 with cashtag support
The updated package includes native CASHTAG_REGEX detection for stock
ticker symbols like $AAPL and $BTC.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Fix todo, remove redundant validation
---------
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Co-authored-by: Eric Bailey <git@esb.lol>
* tighten eslint config to catch unused `useLingui`s
* fix now-invalid uses of _
* remove unused function that produces a ton of eslint warnings
* upgrade react compiler plugin
* keep all radix deps aligned by using single package
* import directly from `radix-ui` or `radix-ui/internal`
* prevent radix leaking into native build
* Revert "fix autocomplete (#7930)"
This reverts commit f06a78017a.
* Revert "#6861: Use available space to make focus on Composer TextInput easier (copy) (#7836)"
This reverts commit e40656128d.
* 6861: Use available space to make focus on Composer TextInput easier
* Undo web
* bluesky-social#6861: Adjust focus area for native platforms taking Embeds into consideration
* use atoms
* remove empty div
* remove debug atom, whoopsie
---------
Co-authored-by: GrizliK1988 <dgrachikov@gmail.com>
Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
* Only portal the emoji picker where needed
* Add optional portal prop to emoji picker
* Use FocusScope to our advantage
* Pare back, add guards, fix focus trap
* Don't return focus to emoji button
* Set DM input position on emoji insert
* Let the caller determine next focus node
---------
Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
* chore: update tiptap packages
* perf: reduce number of re-renders
* refactor: apply min height without a layout effect
* Remove stale zeed-dom resolution
---------
Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
* stop using ref in render
* fix display name fallback on web
* use unicode ellipsis for useGrapheme
* fix overflow issue
* sanitize handle/displayname on web