diff --git a/apps/web/app/(app)/account/authorize/page.tsx b/apps/web/app/(app)/account/authorize/page.tsx index c5411067c93b..c873be078341 100644 --- a/apps/web/app/(app)/account/authorize/page.tsx +++ b/apps/web/app/(app)/account/authorize/page.tsx @@ -76,7 +76,7 @@ const Page = async ({ searchParams }: Readonly<{ searchParams: Promise
- + {t("auth.oauth.invalid_oauth_request")} {t("auth.oauth.invalid_oauth_request_description")} @@ -136,7 +136,7 @@ const Page = async ({ searchParams }: Readonly<{ searchParams: Promise {isLocalhostHost(redirectHost) && ( - + {t("auth.oauth.localhost_redirect_warning")} {t("auth.oauth.localhost_redirect_warning_description")} diff --git a/apps/web/app/(app)/organizations/[organizationId]/settings/domain/page.tsx b/apps/web/app/(app)/organizations/[organizationId]/settings/domain/page.tsx index 0577ac014572..8caa1b969813 100644 --- a/apps/web/app/(app)/organizations/[organizationId]/settings/domain/page.tsx +++ b/apps/web/app/(app)/organizations/[organizationId]/settings/domain/page.tsx @@ -42,7 +42,7 @@ const Page = async (props: Readonly<{ params: Promise<{ organizationId: string } {!IS_STORAGE_CONFIGURED && (
- + {t("common.storage_not_configured")}
diff --git a/apps/web/app/(app)/organizations/[organizationId]/settings/general/page.tsx b/apps/web/app/(app)/organizations/[organizationId]/settings/general/page.tsx index 9347f238e543..64f1fc9ae829 100644 --- a/apps/web/app/(app)/organizations/[organizationId]/settings/general/page.tsx +++ b/apps/web/app/(app)/organizations/[organizationId]/settings/general/page.tsx @@ -56,7 +56,7 @@ const Page = async (props: Readonly<{ params: Promise<{ organizationId: string } {!IS_STORAGE_CONFIGURED && (
- + {t("common.storage_not_configured")}
diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/enterprise/components/EnterpriseLicenseStatus.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/enterprise/components/EnterpriseLicenseStatus.tsx index 539efd70b420..a29f9002af4a 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/enterprise/components/EnterpriseLicenseStatus.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/enterprise/components/EnterpriseLicenseStatus.tsx @@ -124,7 +124,7 @@ export const EnterpriseLicenseStatus = ({
{status === "unreachable" && gracePeriodEnd && ( - + {t("workspace.settings.enterprise.license_unreachable_grace_period", { gracePeriodEnd: formatDateForDisplay(new Date(gracePeriodEnd), locale, { @@ -137,14 +137,14 @@ export const EnterpriseLicenseStatus = ({ )} {status === "invalid_license" && ( - + {t("workspace.settings.enterprise.license_invalid_description")} )} {status === "instance_mismatch" && ( - + {t("workspace.settings.enterprise.license_instance_mismatch_description")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/AISettingsToggle.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/AISettingsToggle.tsx index ec382ad32c52..984d346c53b5 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/AISettingsToggle.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/AISettingsToggle.tsx @@ -101,7 +101,7 @@ export const AISettingsToggle = ({ return (
{showInstanceConfigWarning && ( - + {aiEnablementBlockedMessage} )} @@ -117,7 +117,7 @@ export const AISettingsToggle = ({ /> {!canEdit && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx index 3581ccf19898..4749bc0b75bf 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx @@ -11,7 +11,7 @@ export const CreateOrganizationCard = () => { return (
- + {t("workspace.settings.general.create_new_organization_description")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/DeleteOrganization.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/DeleteOrganization.tsx index 732b6e93f3f2..2b7894292b6b 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/DeleteOrganization.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/DeleteOrganization.tsx @@ -72,7 +72,7 @@ export const DeleteOrganization = ({
)} {isDeleteDisabled && ( - + {deleteDisabledWarning} )} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/EditOrganizationNameForm.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/EditOrganizationNameForm.tsx index e080e8f7fa5c..ab497f90dedb 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/EditOrganizationNameForm.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/EditOrganizationNameForm.tsx @@ -103,7 +103,7 @@ export const EditOrganizationNameForm = ({ organization, membershipRole }: EditO {!isOwner && ( - + {t("workspace.settings.general.only_org_owner_can_perform_action")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/AddIntegrationModal.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/AddIntegrationModal.tsx index 22e4c6f56c86..75dcd0b0814f 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/AddIntegrationModal.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/AddIntegrationModal.tsx @@ -102,7 +102,7 @@ type AddIntegrationModalProps = { const NoBaseFoundError = () => { const { t } = useTranslation(); return ( - + {t("workspace.integrations.airtable.no_bases_found")} {t("workspace.integrations.airtable.please_create_a_base")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/ManageIntegration.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/ManageIntegration.tsx index 30bdc9710f4a..13aef99cd41d 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/ManageIntegration.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/airtable/components/ManageIntegration.tsx @@ -86,7 +86,7 @@ export const ManageIntegration = ({ return (
{showReconnectButton && ( - + {t("workspace.integrations.reconnect_button_description")} {t("workspace.integrations.reconnect_button")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/anonymous-links-tab.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/anonymous-links-tab.tsx index cea78d777392..27a861e85263 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/anonymous-links-tab.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/anonymous-links-tab.tsx @@ -267,7 +267,7 @@ export const AnonymousLinksTab = ({ />
- + {t("workspace.surveys.share.anonymous_links.multi_use_powers_other_channels_title")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/app-tab.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/app-tab.tsx index ff17c46d4b67..3b6f55848c98 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/app-tab.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/app-tab.tsx @@ -151,7 +151,7 @@ export const AppTab = () => { return (
- + {workspace.appSetupCompleted ? t("workspace.surveys.summary.in_app.connection_title") diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/custom-html-tab.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/custom-html-tab.tsx index 2d7af3c6cc9c..00ab84ec449b 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/custom-html-tab.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/custom-html-tab.tsx @@ -150,7 +150,7 @@ export const CustomHtmlTab = ({ workspaceCustomScripts, isReadOnly }: CustomHtml {isSaving ? t("common.saving") : t("common.save")} {/* Security Warning */} - + {t("workspace.surveys.share.custom_html.security_warning")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links-section.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links-section.tsx index 7ba5bf620d81..f09f48b65e53 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links-section.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links-section.tsx @@ -23,7 +23,7 @@ export const DocumentationLinksSection = ({ title, links }: DocumentationLinksSe

{title}

{links.map((link) => ( - + {link.title} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links.tsx index 41c2520248a5..87ee424e04db 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/documentation-links.tsx @@ -18,7 +18,7 @@ export const DocumentationLinks = ({ links }: DocumentationLinksProps) => {
{links.map((link) => (
- + {link.title} { return (
- + {t("workspace.surveys.share.dynamic_popup.alert_title")} {t("workspace.surveys.share.dynamic_popup.alert_description")} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/social-media-tab.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/social-media-tab.tsx index ad5d666bc267..1600e313bd9e 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/social-media-tab.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/surveys/[surveyId]/(analysis)/summary/components/shareEmbedModal/social-media-tab.tsx @@ -92,7 +92,7 @@ export const SocialMediaTab: React.FC = ({ surveyUrl, surve ))}
- + {t("workspace.surveys.share.social_media.source_tracking_enabled")} diff --git a/apps/web/modules/auth/login/components/login-form.tsx b/apps/web/modules/auth/login/components/login-form.tsx index a52af1684d6a..2c6965704a96 100644 --- a/apps/web/modules/auth/login/components/login-form.tsx +++ b/apps/web/modules/auth/login/components/login-form.tsx @@ -193,7 +193,7 @@ export const LoginForm = ({

{formLabel}

{oauthAccountNotLinked && ( - + {t("auth.login.oauth_account_not_linked_title")}

{t("auth.login.oauth_account_not_linked_description")}

diff --git a/apps/web/modules/ee/analysis/charts/components/ai-query-section.tsx b/apps/web/modules/ee/analysis/charts/components/ai-query-section.tsx index 8a7b6ca41010..cfbbb93ba9f2 100644 --- a/apps/web/modules/ee/analysis/charts/components/ai-query-section.tsx +++ b/apps/web/modules/ee/analysis/charts/components/ai-query-section.tsx @@ -68,7 +68,7 @@ export function AIQuerySection({ if (!isAIAvailable) { return ( - + {t("workspace.analysis.charts.ai_chart_generation")} {aiUnavailableMessage} {aiUnavailableAction && ( diff --git a/apps/web/modules/ee/analysis/charts/components/create-chart-view.tsx b/apps/web/modules/ee/analysis/charts/components/create-chart-view.tsx index 402a25ce3039..7ee6e9507245 100644 --- a/apps/web/modules/ee/analysis/charts/components/create-chart-view.tsx +++ b/apps/web/modules/ee/analysis/charts/components/create-chart-view.tsx @@ -233,7 +233,7 @@ export function CreateChartView({
) : ( - +

{t("workspace.analysis.charts.no_data_source_available")}

{workspace?.organizationId && ( diff --git a/apps/web/modules/ee/analysis/charts/components/dimensions-panel.tsx b/apps/web/modules/ee/analysis/charts/components/dimensions-panel.tsx index 6d3697cc6b41..252bd8de9b2c 100644 --- a/apps/web/modules/ee/analysis/charts/components/dimensions-panel.tsx +++ b/apps/web/modules/ee/analysis/charts/components/dimensions-panel.tsx @@ -40,7 +40,7 @@ export function DimensionsPanel({ onChange={onDimensionsChange} placeholder={t("workspace.analysis.charts.select_dimensions")} /> - + {t("workspace.analysis.charts.group_by_description")}
diff --git a/apps/web/modules/ee/billing/components/pricing-table.tsx b/apps/web/modules/ee/billing/components/pricing-table.tsx index 57f1c0f77a53..7a72809ac636 100644 --- a/apps/web/modules/ee/billing/components/pricing-table.tsx +++ b/apps/web/modules/ee/billing/components/pricing-table.tsx @@ -1157,7 +1157,7 @@ export const PricingTable = ({ ))} {pendingChange && ( - + {t("workspace.settings.billing.pending_plan_change_title")} {t("workspace.settings.billing.pending_plan_change_description", { @@ -1179,7 +1179,7 @@ export const PricingTable = ({ )} {isStripeSetupIncomplete && hasBillingRights && ( - + {t("workspace.settings.billing.stripe_setup_incomplete")} {t("workspace.settings.billing.stripe_setup_incomplete_description")} @@ -1191,7 +1191,7 @@ export const PricingTable = ({ )} {currentCloudPlan === "custom" && ( - + {t("workspace.settings.billing.custom_plan_title")} {t("workspace.settings.billing.custom_plan_description")} diff --git a/apps/web/modules/ee/billing/components/trial-alert.tsx b/apps/web/modules/ee/billing/components/trial-alert.tsx index 7db53c550609..b0749fbe9e3f 100644 --- a/apps/web/modules/ee/billing/components/trial-alert.tsx +++ b/apps/web/modules/ee/billing/components/trial-alert.tsx @@ -39,7 +39,7 @@ export const TrialAlert = ({ const variant = hasPaymentMethod ? "success" : getTrialVariant(trialDaysRemaining); return ( - + {title} {children} diff --git a/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx b/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx index b4ca46ea90c3..903f3bb87379 100644 --- a/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx +++ b/apps/web/modules/ee/contacts/segments/components/targeting-card.tsx @@ -431,7 +431,7 @@ export function TargetingCard({
- + {workspaceConflictState.showBlockedExplanation && ( - +
{t("workspace.settings.feedback_directories.no_unassigned_workspaces_title")} diff --git a/apps/web/modules/ee/feedback-directory/components/frd-picker.tsx b/apps/web/modules/ee/feedback-directory/components/frd-picker.tsx index c6e334f26d26..909d4415d0da 100644 --- a/apps/web/modules/ee/feedback-directory/components/frd-picker.tsx +++ b/apps/web/modules/ee/feedback-directory/components/frd-picker.tsx @@ -25,7 +25,7 @@ export const FrdPicker = ({ directories, selectedDirectoryId, onChange }: FrdPic if (directories.length === 0) { return ( - +

{t("workspace.analysis.charts.no_data_source_available")}

{organizationId && ( diff --git a/apps/web/modules/ee/unify-feedback/sources/components/create-feedback-source-modal.tsx b/apps/web/modules/ee/unify-feedback/sources/components/create-feedback-source-modal.tsx index c75a1804ad1a..3ada5d810a99 100644 --- a/apps/web/modules/ee/unify-feedback/sources/components/create-feedback-source-modal.tsx +++ b/apps/web/modules/ee/unify-feedback/sources/components/create-feedback-source-modal.tsx @@ -754,7 +754,7 @@ interface NoFeedbackDirectoryAlertProps { const NoFeedbackDirectoryAlert = ({ organizationId, t }: NoFeedbackDirectoryAlertProps) => { return ( - +

{t("workspace.unify.no_feedback_directory_available")}

{organizationId && ( diff --git a/apps/web/modules/ee/unify-feedback/sources/components/feedback-source-type-selector.tsx b/apps/web/modules/ee/unify-feedback/sources/components/feedback-source-type-selector.tsx index 5a0a2cd2d8cf..8f49acf7e2c7 100644 --- a/apps/web/modules/ee/unify-feedback/sources/components/feedback-source-type-selector.tsx +++ b/apps/web/modules/ee/unify-feedback/sources/components/feedback-source-type-selector.tsx @@ -81,7 +81,7 @@ export function FeedbackSourceTypeSelector({ ); })}
- + {t("workspace.unify.missing_feedback_source_title")} {directories.length > 0 && ( - + {feedbackDirectoryAccessText} {!isReadOnly && workspace?.organizationId && ( diff --git a/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx b/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx index 4a8521e6d430..a40879c18174 100644 --- a/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx +++ b/apps/web/modules/ee/whitelabel/email-customization/components/email-customization-settings.tsx @@ -311,7 +311,7 @@ export const EmailCustomizationSettings = ({ )} {hasWhiteLabelPermission && isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/ee/whitelabel/favicon-customization/components/favicon-customization-settings.tsx b/apps/web/modules/ee/whitelabel/favicon-customization/components/favicon-customization-settings.tsx index e0c7faed71fc..dda7f60aad76 100644 --- a/apps/web/modules/ee/whitelabel/favicon-customization/components/favicon-customization-settings.tsx +++ b/apps/web/modules/ee/whitelabel/favicon-customization/components/favicon-customization-settings.tsx @@ -227,12 +227,12 @@ export const FaviconCustomizationSettings = ({ )} - + {t("workspace.settings.domain.favicon_size_hint")} {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/ee/whitelabel/remove-branding/components/branding-settings-card.tsx b/apps/web/modules/ee/whitelabel/remove-branding/components/branding-settings-card.tsx index 24f940f4121a..b8777ff9c4b2 100644 --- a/apps/web/modules/ee/whitelabel/remove-branding/components/branding-settings-card.tsx +++ b/apps/web/modules/ee/whitelabel/remove-branding/components/branding-settings-card.tsx @@ -72,7 +72,7 @@ export const BrandingSettingsCard = async ({ noPadding={showLiteLicenseTip}> {brandingContent} {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/organization/settings/api-keys/components/add-api-key-modal.tsx b/apps/web/modules/organization/settings/api-keys/components/add-api-key-modal.tsx index b49b32317837..f8f0d0ce2c5e 100644 --- a/apps/web/modules/organization/settings/api-keys/components/add-api-key-modal.tsx +++ b/apps/web/modules/organization/settings/api-keys/components/add-api-key-modal.tsx @@ -337,14 +337,14 @@ export const AddApiKeyModal = ({
))} {isFormbricksCloud && ( - + {t("workspace.api_keys.organization_access_cloud_note")} )}
- + {t("workspace.api_keys.api_key_security_warning")} diff --git a/apps/web/modules/organization/settings/teams/components/invite-member/bulk-invite-tab.tsx b/apps/web/modules/organization/settings/teams/components/invite-member/bulk-invite-tab.tsx index 521b9eb40c0e..10905f144cfd 100644 --- a/apps/web/modules/organization/settings/teams/components/invite-member/bulk-invite-tab.tsx +++ b/apps/web/modules/organization/settings/teams/components/invite-member/bulk-invite-tab.tsx @@ -297,7 +297,7 @@ export const BulkInviteTab = ({
{!isAccessControlAllowed && ( - +

{t("common.warning")}: diff --git a/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx b/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx index cf1ec3933117..de342a0663fe 100644 --- a/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx +++ b/apps/web/modules/organization/settings/teams/components/invite-member/individual-invite-tab.tsx @@ -183,7 +183,7 @@ export const IndividualInviteTab = ({ )} {!isAccessControlAllowed && ( - + {t("workspace.settings.teams.upgrade_plan_notice_message")} {!IS_SMTP_CONFIGURED && ( - + {t("setup.invite.smtp_not_configured")} {t("setup.invite.smtp_not_configured_description")} diff --git a/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx b/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx index 9d3734483414..7982326cb309 100644 --- a/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx +++ b/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx @@ -22,7 +22,7 @@ export const RemovedFromOrganization = ({ const [isModalOpen, setIsModalOpen] = useState(false); return (

- + {t("setup.organization.create.no_membership_found")} {t("setup.organization.create.no_membership_found_description")} diff --git a/apps/web/modules/survey/components/template-list/components/create-with-ai-form.tsx b/apps/web/modules/survey/components/template-list/components/create-with-ai-form.tsx index 2205c47cec28..38ad1eae64bc 100644 --- a/apps/web/modules/survey/components/template-list/components/create-with-ai-form.tsx +++ b/apps/web/modules/survey/components/template-list/components/create-with-ai-form.tsx @@ -95,7 +95,7 @@ export const CreateWithAIForm = ({ return (
{!isAIAvailable && ( - + {t("workspace.surveys.ai_create.ai_not_available")} {t(getUnavailableMessageKey(aiUnavailableReason))} {unavailableAction && unavailableActionLabel && ( diff --git a/apps/web/modules/survey/editor/components/block-card.tsx b/apps/web/modules/survey/editor/components/block-card.tsx index 210bf5ac25df..f6e78007b49b 100644 --- a/apps/web/modules/survey/editor/components/block-card.tsx +++ b/apps/web/modules/survey/editor/components/block-card.tsx @@ -396,7 +396,7 @@ export const BlockCard = ({ {shouldShowCautionAlert(element.type) && ( - + {t("workspace.surveys.edit.caution_text")} onAlertTrigger()}> {t("common.learn_more")} diff --git a/apps/web/modules/survey/editor/components/how-to-send-card.tsx b/apps/web/modules/survey/editor/components/how-to-send-card.tsx index 78429cea91d5..c5030e3a3324 100644 --- a/apps/web/modules/survey/editor/components/how-to-send-card.tsx +++ b/apps/web/modules/survey/editor/components/how-to-send-card.tsx @@ -115,7 +115,7 @@ export const HowToSendCard = ({ localSurvey, setLocalSurvey, appSetupCompleted }
{localSurvey.status === "inProgress" && ( - + {t("workspace.surveys.edit.change_survey_type")} {t("workspace.surveys.edit.changing_survey_type_will_remove_existing_distribution_channels")} diff --git a/apps/web/modules/survey/editor/components/response-options-card.tsx b/apps/web/modules/survey/editor/components/response-options-card.tsx index b30837efc128..e5b0eb0d7b2a 100644 --- a/apps/web/modules/survey/editor/components/response-options-card.tsx +++ b/apps/web/modules/survey/editor/components/response-options-card.tsx @@ -474,7 +474,7 @@ export const ResponseOptionsCard = ({

Strict

- + {t("workspace.surveys.edit.spam_protection_note")}
diff --git a/apps/web/modules/survey/editor/components/survey-menu-bar.tsx b/apps/web/modules/survey/editor/components/survey-menu-bar.tsx index beac42f43dff..7dab5362bd8f 100644 --- a/apps/web/modules/survey/editor/components/survey-menu-bar.tsx +++ b/apps/web/modules/survey/editor/components/survey-menu-bar.tsx @@ -616,7 +616,7 @@ export const SurveyMenuBar = ({ {!isStorageConfigured && (
- + {t("common.storage_not_configured")} 0 && (
- + {t("workspace.surveys.edit.caution_text")} setIsCautionDialogOpen(true)}>{t("common.learn_more")} diff --git a/apps/web/modules/survey/multi-language-surveys/components/edit-language.tsx b/apps/web/modules/survey/multi-language-surveys/components/edit-language.tsx index 2dc048dfe6f8..ace566f695f7 100644 --- a/apps/web/modules/survey/multi-language-surveys/components/edit-language.tsx +++ b/apps/web/modules/survey/multi-language-surveys/components/edit-language.tsx @@ -232,7 +232,7 @@ export function EditLanguage({ workspace, locale, isReadOnly }: EditLanguageProp t={t} /> {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/ui/components/alert/index.tsx b/apps/web/modules/ui/components/alert/index.tsx index cb627044885d..08f1f8062477 100644 --- a/apps/web/modules/ui/components/alert/index.tsx +++ b/apps/web/modules/ui/components/alert/index.tsx @@ -67,15 +67,18 @@ const alertVariantIcons: Record< const Alert = React.forwardRef< HTMLDivElement, - React.HTMLAttributes & VariantProps ->(({ className, variant, size, ...props }, ref) => { + Readonly & VariantProps> +>(({ className, variant, size, role = "alert", ...props }, ref) => { const variantIcon = variant && variant !== "default" ? alertVariantIcons[variant] : null; const contextValue = useMemo(() => ({ variant, size }), [variant, size]); return ( -
+ {/* role="alert" is an assertive live region and belongs on alerts that appear dynamically + (e.g. validation or request errors). For banners already visible on first paint, pass + role="status" so screen readers don't spuriously announce them on mount. */} +
{variantIcon} {props.children}
diff --git a/apps/web/modules/ui/components/alert/stories.tsx b/apps/web/modules/ui/components/alert/stories.tsx index 24be78e02d97..fa829ba62438 100644 --- a/apps/web/modules/ui/components/alert/stories.tsx +++ b/apps/web/modules/ui/components/alert/stories.tsx @@ -70,6 +70,18 @@ const meta: Meta = { }, order: 1, }, + role: { + control: "select", + options: ["alert", "status"], + description: + "ARIA role. Keep the default `alert` (assertive live region) for alerts that appear dynamically, e.g. after a failed request. Pass `status` for static banners that are already visible on first paint so screen readers don't announce them on mount.", + table: { + category: "Behavior", + type: { summary: "string" }, + defaultValue: { summary: "alert" }, + }, + order: 2, + }, title: { control: "text", description: "Alert title text", @@ -108,7 +120,7 @@ type Story = StoryObj; // Create a common render function to reduce duplication const renderAlert = (args: StoryProps) => { // Extract component props - const { variant = "default", size = "default", className = "" } = args; + const { variant = "default", size = "default", className = "", role } = args; // Extract story content options const { @@ -120,7 +132,7 @@ const renderAlert = (args: StoryProps) => { } = args as StoryOptions; return ( - + {showIcon && } {title} {description && {description}} @@ -243,6 +255,28 @@ export const Info: Story = { }, }; +// Static banner: opts out of the assertive live region +export const StaticBanner: Story = { + render: renderAlert, + args: { + variant: "info", + role: "status", + title: "Did you know?", + description: "You can automate follow-up emails based on survey responses.", + showIcon: true, + showButton: false, + actionButtonText: "", + }, + parameters: { + docs: { + description: { + story: + "Use `role='status'` for informational or promotional banners that are already visible when the page loads. The default `role='alert'` is an assertive live region and should be reserved for alerts that appear dynamically — static banners with `role='alert'` may be announced spuriously by screen readers on mount.", + }, + }, + }, +}; + // Success variant export const Success: Story = { render: renderAlert, diff --git a/apps/web/modules/ui/components/code-action-form/index.tsx b/apps/web/modules/ui/components/code-action-form/index.tsx index 3a5478342e02..0a4a8b93d78c 100644 --- a/apps/web/modules/ui/components/code-action-form/index.tsx +++ b/apps/web/modules/ui/components/code-action-form/index.tsx @@ -41,7 +41,7 @@ export const CodeActionForm = ({ form, isReadOnly }: CodeActionFormProps) => { )} />
- + {t("workspace.actions.how_do_code_actions_work")} diff --git a/apps/web/modules/workspaces/settings/(setup)/app-connection/page.tsx b/apps/web/modules/workspaces/settings/(setup)/app-connection/page.tsx index 9751c909e34c..ae9c695000f2 100644 --- a/apps/web/modules/workspaces/settings/(setup)/app-connection/page.tsx +++ b/apps/web/modules/workspaces/settings/(setup)/app-connection/page.tsx @@ -196,7 +196,7 @@ var t=document.createElement("script");t.type="text/javascript",t.async=!0,t.src )} {workspace.legacyEnvironmentId && ( - +

{t("workspace.app-connection.environment_id_legacy_alert")}{" "} @@ -227,14 +227,14 @@ var t=document.createElement("script");t.type="text/javascript",t.async=!0,t.src

{workspace.appSetupCompleted ? ( - + {t("workspace.app-connection.cache_update_delay_title")} {t("workspace.app-connection.cache_update_delay_description")} ) : ( - + {t("workspace.app-connection.setup_alert_title")} {t("workspace.app-connection.setup_alert_description")} diff --git a/apps/web/modules/workspaces/settings/general/components/custom-scripts-form.tsx b/apps/web/modules/workspaces/settings/general/components/custom-scripts-form.tsx index c2b72ba886e8..0a090bd9e540 100644 --- a/apps/web/modules/workspaces/settings/general/components/custom-scripts-form.tsx +++ b/apps/web/modules/workspaces/settings/general/components/custom-scripts-form.tsx @@ -68,7 +68,7 @@ export const CustomScriptsForm: React.FC = ({ workspace, <> - + {t("workspace.general.custom_scripts_warning")} @@ -111,7 +111,7 @@ export const CustomScriptsForm: React.FC = ({ workspace, {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/workspaces/settings/general/components/delete-workspace-render.tsx b/apps/web/modules/workspaces/settings/general/components/delete-workspace-render.tsx index 7209e8ab6f7b..5b8a9ae298bb 100644 --- a/apps/web/modules/workspaces/settings/general/components/delete-workspace-render.tsx +++ b/apps/web/modules/workspaces/settings/general/components/delete-workspace-render.tsx @@ -106,7 +106,7 @@ export const DeleteWorkspaceRender = ({ )} {isDeleteDisabled && ( - + {!isOwnerOrManager ? t("workspace.general.only_owners_or_managers_can_delete_workspaces") diff --git a/apps/web/modules/workspaces/settings/general/components/edit-waiting-time-form.tsx b/apps/web/modules/workspaces/settings/general/components/edit-waiting-time-form.tsx index 17f1b7eaa3cb..ea283d40c505 100644 --- a/apps/web/modules/workspaces/settings/general/components/edit-waiting-time-form.tsx +++ b/apps/web/modules/workspaces/settings/general/components/edit-waiting-time-form.tsx @@ -102,7 +102,7 @@ export const EditWaitingTimeForm: React.FC = ({ workspace, {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/workspaces/settings/general/components/edit-workspace-name-form.tsx b/apps/web/modules/workspaces/settings/general/components/edit-workspace-name-form.tsx index 95c824f9b7dc..76a94281fa79 100644 --- a/apps/web/modules/workspaces/settings/general/components/edit-workspace-name-form.tsx +++ b/apps/web/modules/workspaces/settings/general/components/edit-workspace-name-form.tsx @@ -114,7 +114,7 @@ export const EditWorkspaceNameForm: React.FC = ({ worksp {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/workspaces/settings/look/components/edit-logo.tsx b/apps/web/modules/workspaces/settings/look/components/edit-logo.tsx index 112e72cbc21c..200ca54b588d 100644 --- a/apps/web/modules/workspaces/settings/look/components/edit-logo.tsx +++ b/apps/web/modules/workspaces/settings/look/components/edit-logo.tsx @@ -233,7 +233,7 @@ export const EditLogo = ({ workspace, workspaceId, isReadOnly, isStorageConfigur />
{isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/workspaces/settings/look/components/edit-placement-form.tsx b/apps/web/modules/workspaces/settings/look/components/edit-placement-form.tsx index 166cf0a3dea9..c12657140269 100644 --- a/apps/web/modules/workspaces/settings/look/components/edit-placement-form.tsx +++ b/apps/web/modules/workspaces/settings/look/components/edit-placement-form.tsx @@ -203,7 +203,7 @@ export const EditPlacementForm = ({ workspace, isReadOnly }: EditPlacementProps) {isReadOnly && ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/workspaces/settings/look/components/theme-styling.tsx b/apps/web/modules/workspaces/settings/look/components/theme-styling.tsx index d1d89ed066c3..9a1a1410a61c 100644 --- a/apps/web/modules/workspaces/settings/look/components/theme-styling.tsx +++ b/apps/web/modules/workspaces/settings/look/components/theme-styling.tsx @@ -145,7 +145,7 @@ export const ThemeStyling = ({ if (isReadOnly) { return ( - + {t("common.only_owners_managers_and_manage_access_members_can_perform_this_action")} diff --git a/apps/web/modules/workspaces/settings/look/page.tsx b/apps/web/modules/workspaces/settings/look/page.tsx index bad287cb57fb..51d859a5c2ed 100644 --- a/apps/web/modules/workspaces/settings/look/page.tsx +++ b/apps/web/modules/workspaces/settings/look/page.tsx @@ -50,7 +50,7 @@ export const WorkspaceLookSettingsPage = async (props: { params: Promise<{ works {!IS_STORAGE_CONFIGURED && ( - + {t("common.storage_not_configured")} )} diff --git a/apps/web/package.json b/apps/web/package.json index d3669a93c5d6..774018de46be 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -12,7 +12,7 @@ "build:dev": "pnpm run build", "start": "next start", "typecheck": "pnpm typegen && tsc --noEmit --project tsconfig.typecheck.json", - "typegen": "cross-env DATABASE_URL=postgresql://postgres:postgres@localhost:5432/formbricks ENCRYPTION_KEY=example REDIS_URL=redis://localhost:6379 next typegen", + "typegen": "dotenv -e ../../.env -- next typegen", "lint": "eslint . --fix", "test": "dotenv -e ../../.env -- vitest run", "test:coverage": "dotenv -e ../../.env -- vitest run --coverage", diff --git a/packages/js-core/package.json b/packages/js-core/package.json index 1a1cb29e9ba2..0186a407cc89 100644 --- a/packages/js-core/package.json +++ b/packages/js-core/package.json @@ -46,6 +46,7 @@ "devDependencies": { "@formbricks/config-typescript": "workspace:*", "@formbricks/eslint-config": "workspace:*", + "@formbricks/vite-plugins": "workspace:*", "@types/node": "25.4.0", "@vitest/coverage-v8": "4.1.6", "typescript": "5.9.3", diff --git a/packages/js-core/tsconfig.json b/packages/js-core/tsconfig.json index 198706728dc0..a1deddaae589 100644 --- a/packages/js-core/tsconfig.json +++ b/packages/js-core/tsconfig.json @@ -11,5 +11,5 @@ "strict": true }, "extends": "@formbricks/config-typescript/js-library.json", - "include": ["src", "vitest.setup.ts", "package.json", "../types/surveys.d.ts", "../database/src/index.ts"] + "include": ["src", "vitest.setup.ts", "package.json"] } diff --git a/packages/js-core/vite.config.ts b/packages/js-core/vite.config.ts index bc087d4cb2dc..776607472f47 100644 --- a/packages/js-core/vite.config.ts +++ b/packages/js-core/vite.config.ts @@ -3,7 +3,6 @@ import { resolve } from "path"; import dts from "vite-plugin-dts"; import { defineConfig } from "vitest/config"; import type { ViteUserConfig } from "vitest/config"; -import webPackageJson from "../../apps/web/package.json"; import { copyCompiledAssetsPlugin } from "../vite-plugins/copy-compiled-assets"; import { rewriteNodeNextDtsSpecifiers } from "../vite-plugins/node-next-dts"; @@ -15,9 +14,6 @@ export default defineConfig({ "@": resolve(__dirname, "src"), }, }, - define: { - "import.meta.env.VERSION": JSON.stringify(webPackageJson.version), - }, build: { rollupOptions: { output: { inlineDynamicImports: true }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f5fec538cdf..43bb66e2daaa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1032,6 +1032,9 @@ importers: '@formbricks/eslint-config': specifier: workspace:* version: link:../config-eslint + '@formbricks/vite-plugins': + specifier: workspace:* + version: link:../vite-plugins '@types/node': specifier: 25.4.0 version: 25.4.0 diff --git a/turbo.json b/turbo.json index 503d48f74421..4baafc25442e 100644 --- a/turbo.json +++ b/turbo.json @@ -76,7 +76,7 @@ "dependsOn": ["@formbricks/logger#build"] }, "@formbricks/js-core#build": { - "dependsOn": ["^build", "@formbricks/database#build"], + "dependsOn": ["^build"], "outputs": ["dist/**"] }, "@formbricks/js-core#go": { @@ -84,12 +84,6 @@ "dependsOn": ["@formbricks/database#db:setup"], "persistent": true }, - "@formbricks/js-core#lint": { - "dependsOn": ["@formbricks/database#build"] - }, - "@formbricks/js-core#typecheck": { - "dependsOn": ["@formbricks/database#build"] - }, "@formbricks/logger#build": { "dependsOn": ["^build"], "outputs": ["dist/**"]