feat(shared): gate paid features from one entitlement source

Desktop, web, mobile, and the API each decided locally what a tier could do,
so a plan change could unlock a feature on one surface and not another.
Entitlement checks now live in `@d3ro/core` and are exercised by tests.

The shared theme and design-system packages also gain the tokens the new
surfaces consume, and the api-client exposes the dictionary and team types
the clients now send.
This commit is contained in:
Yun Chan 2026-09-16 23:24:18 +09:00
parent 6ba25f53b7
commit f6a29db95a
13 changed files with 576 additions and 11 deletions

View file

@ -62,6 +62,12 @@
"dictionary.noResults": "No results found",
"dictionary.noWords": "No words — add custom words to improve STT accuracy",
"dictionary.used": "Used {{count}} times",
"dictionary.export": "Export",
"dictionary.import": "Import",
"dictionary.exported": "Dictionary exported.",
"dictionary.exportFailed": "Dictionary export failed.",
"dictionary.importedCount": "Imported {{imported}}, skipped {{skipped}}, errors {{errors}}.",
"dictionary.importFailed": "Dictionary import failed.",
"dictionary.editTitle": "Edit Word",
"dictionary.addTitle": "Add Word",
"dictionary.word": "Word",
@ -1390,6 +1396,12 @@
"mobile.teams.deleteTitle": "Permanently delete team",
"mobile.teams.deleteBody": "This permanently deletes the team, invitations, and memberships. Shared meetings will be detached. This cannot be undone.",
"mobile.teams.realtimeWaiting": "Waiting for realtime sync. Pull down to verify the latest server state.",
"mobile.teams.activity": "Activity",
"mobile.teams.activityPlaceholder": "Leave a note for the team...",
"mobile.teams.post": "Post",
"mobile.teams.posting": "Posting...",
"mobile.teams.noActivity": "No activity yet.",
"mobile.teams.system": "System",
"mobile.teams.acceptTitle": "Team invitation",
"mobile.teams.inviteLoading": "Checking invitation link",
"mobile.teams.loginToAccept": "Sign in before accepting this invitation.",