From 7b2b3ac37d5e6bae7c37c0c7c8cf94cd8ef4d3b0 Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Thu, 19 Feb 2026 15:04:40 +0530
Subject: [PATCH] feat(V5): Update settings pages UI (#13396)
# Pull Request Template
## Description
This PR updates settings page UI
## Type of change
- [x] New feature (non-breaking change which adds functionality)
## Checklist:
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
---
.../dashboard/assets/scss/_base.scss | 2 +-
.../dashboard/assets/scss/_woot.scss | 80 ++
.../AgentCapacityPolicyCard.vue | 4 +-
.../AssignmentCard/AssignmentCard.vue | 6 +-
.../AssignmentPolicyCard.vue | 32 +-
.../components/ExclusionRules.vue | 2 +-
.../AssignmentPolicy/components/RadioCard.vue | 60 +-
.../Campaigns/CampaignLayout.vue | 10 +-
.../dashboard/components-next/CardLayout.vue | 2 +-
.../CompaniesHeader/CompanyHeader.vue | 6 +-
.../Companies/CompaniesListLayout.vue | 7 +-
.../Contacts/ContactLabels/ContactLabels.vue | 4 +-
.../Contacts/ContactsHeader/ContactHeader.vue | 4 +-
.../ContactsActiveFiltersPreview.vue | 2 +-
.../Contacts/ContactsListLayout.vue | 7 +-
.../AttributeListItem.vue | 91 +-
.../ConversationRequiredAttributeItem.vue | 8 +-
.../ConversationRequiredAttributes.vue | 4 +-
.../CustomAttributes/AttributeBadge.vue | 16 +-
.../components-next/EmptyStateLayout.vue | 2 +-
.../HelpCenter/HelpCenterLayout.vue | 11 +-
.../Pages/LocalePage/AddLocaleDialog.vue | 1 +
.../specs/composeConversationHelper.spec.js | 2 +-
.../Settings/SettingsAccordion.vue | 31 +
.../Settings/SettingsFieldSection.vue | 37 +
.../Settings/SettingsToggleSection.vue | 45 +
.../components-next/avatar/Avatar.vue | 22 +-
.../components-next/captain/PageLayout.vue | 11 +-
.../captain/pageComponents/Paywall.vue | 2 +-
.../combobox/ComboBoxDropdown.vue | 4 +-
.../FeatureSpotlightPopover.vue | 2 +-
.../components-next/icon/provider.js | 4 +-
.../icon/specs/provider.spec.js | 4 +-
.../dashboard/components-next/input/Input.vue | 4 +-
.../{Label => label}/AddLabel.vue | 0
.../dashboard/components-next/label/Label.vue | 71 ++
.../{Label => label}/LabelItem.vue | 0
.../{Label => label}/story/AddLabel.story.vue | 0
.../{Label => label}/story/Label.story.vue | 0
.../{Label => label}/story/fixtures.js | 0
.../pagination/PaginationFooter.vue | 12 +-
.../components-next/select/Select.vue | 97 ++
.../components-next/sidebar/ChannelLeaf.vue | 4 +-
.../components-next/sidebar/Sidebar.vue | 33 +-
.../sidebar/SidebarGroupLeaf.vue | 6 +-
.../components-next/switch/Switch.vue | 16 +-
.../components-next/table/BaseTable.story.vue | 175 +++
.../components-next/table/BaseTable.vue | 60 +
.../components-next/table/BaseTableCell.vue | 22 +
.../components-next/table/BaseTableRow.vue | 14 +
.../dashboard/components-next/table/index.js | 3 +
.../year-in-review/ShareModal.vue | 2 +-
.../dashboard/components/FormSection.vue | 31 -
.../components/widgets/InboxName.vue | 9 +-
.../components/widgets/LoadingState.vue | 2 +-
.../components/widgets/SettingIntroBanner.vue | 2 +-
.../components/widgets/forms/Input.vue | 6 +-
app/javascript/dashboard/helper/inbox.js | 22 +-
.../dashboard/helper/specs/inbox.spec.js | 8 +-
.../dashboard/i18n/locale/en/agentBots.json | 6 +-
.../dashboard/i18n/locale/en/agentMgmt.json | 3 +
.../i18n/locale/en/attributesMgmt.json | 3 +
.../dashboard/i18n/locale/en/automation.json | 9 +-
.../dashboard/i18n/locale/en/cannedMgmt.json | 3 +
.../dashboard/i18n/locale/en/customRole.json | 3 +
.../dashboard/i18n/locale/en/inboxMgmt.json | 21 +-
.../i18n/locale/en/integrationApps.json | 4 +
.../i18n/locale/en/integrations.json | 18 +-
.../dashboard/i18n/locale/en/labelsMgmt.json | 6 +-
.../dashboard/i18n/locale/en/macros.json | 6 +-
.../dashboard/i18n/locale/en/mfa.json | 2 +-
.../dashboard/i18n/locale/en/sla.json | 13 +-
.../i18n/locale/en/teamsSettings.json | 7 +-
.../widget-preview/components/Widget.vue | 489 +++++---
.../pages/CampaignsPageRouteView.vue | 2 +-
.../companies/pages/CompaniesIndex.vue | 2 +-
.../contacts/pages/ContactsIndex.vue | 2 +-
.../inbox/components/InboxListHeader.vue | 12 +-
.../routes/dashboard/notifications/routes.js | 7 +-
.../dashboard/settings/SettingsHeader.vue | 4 +-
.../dashboard/settings/SettingsLayout.vue | 2 +-
.../settings/SettingsSubPageHeader.vue | 6 +-
.../dashboard/settings/SettingsWrapper.vue | 12 +-
.../routes/dashboard/settings/Wrapper.vue | 37 +-
.../dashboard/settings/account/Index.vue | 3 +-
.../account/components/AutoResolve.vue | 4 +-
.../account/components/SectionLayout.vue | 17 +-
.../dashboard/settings/agentBots/Index.vue | 154 ++-
.../dashboard/settings/agents/Index.vue | 202 +--
.../settings/assignmentPolicy/Index.vue | 2 +-
.../pages/AgentAssignmentCreatePage.vue | 4 +-
.../pages/AgentAssignmentEditPage.vue | 7 +-
.../pages/AgentAssignmentIndexPage.vue | 4 +-
.../pages/AgentCapacityCreatePage.vue | 4 +-
.../pages/AgentCapacityEditPage.vue | 7 +-
.../pages/AgentCapacityIndexPage.vue | 4 +-
.../components/AgentAssignmentPolicyForm.vue | 11 +-
.../dashboard/settings/attributes/Index.vue | 50 +-
.../dashboard/settings/auditlogs/Index.vue | 121 +-
.../settings/automation/AutomationRuleRow.vue | 98 +-
.../dashboard/settings/automation/Index.vue | 45 +-
.../dashboard/settings/canned/Index.vue | 211 ++--
.../components/BaseSettingsHeader.vue | 113 +-
.../settings/conversationWorkflow/index.vue | 2 +-
.../dashboard/settings/customRoles/Index.vue | 57 +-
.../component/CustomRolePaywall.vue | 2 +-
.../component/CustomRoleTableBody.vue | 85 +-
.../dashboard/settings/inbox/ChannelList.vue | 2 +-
.../dashboard/settings/inbox/ImapSettings.vue | 134 +-
.../settings/inbox/InboxChannels.vue | 2 +-
.../routes/dashboard/settings/inbox/Index.vue | 152 +--
.../inbox/PreChatForm/PreChatFields.vue | 117 +-
.../settings/inbox/PreChatForm/Settings.vue | 264 ++--
.../dashboard/settings/inbox/Settings.vue | 1078 ++++++++++-------
.../dashboard/settings/inbox/SmtpSettings.vue | 176 +--
.../settings/inbox/WidgetBuilder.vue | 443 -------
.../inbox/channels/google/Reauthorize.vue | 5 +-
.../inbox/channels/instagram/Reauthorize.vue | 5 +-
.../inbox/channels/microsoft/Reauthorize.vue | 5 +-
.../inbox/channels/tiktok/Reauthorize.vue | 5 +-
.../inbox/channels/whatsapp/Reauthorize.vue | 2 +-
.../inbox/components/AccountHealth.vue | 24 +-
.../inbox/components/BotConfiguration.vue | 93 +-
.../settings/inbox/components/BusinessDay.vue | 161 ++-
.../components/SenderNameExamplePreview.vue | 176 ++-
.../inbox/components/WeeklyAvailability.vue | 173 +--
.../settings/inbox/facebook/Reauthorize.vue | 2 +-
.../dashboard/settings/inbox/inbox.routes.js | 4 +-
.../inbox/settingsPage/CollaboratorsPage.vue | 309 ++---
.../inbox/settingsPage/ConfigurationPage.vue | 265 ++--
.../settingsPage/CustomerSatisfactionPage.vue | 329 +++--
.../DashboardApps/DashboardAppsRow.vue | 81 +-
.../integrations/DashboardApps/Index.vue | 107 +-
.../dashboard/settings/integrations/Index.vue | 25 +-
.../settings/integrations/Integration.vue | 6 +-
.../integrations/IntegrationHooks.vue | 55 +-
.../settings/integrations/IntegrationItem.vue | 30 +-
.../settings/integrations/Linear.vue | 22 +-
.../integrations/MultipleIntegrationHooks.vue | 211 ++--
.../settings/integrations/Notion.vue | 22 +-
.../settings/integrations/Shopify.vue | 124 +-
.../integrations/SingleIntegrationHooks.vue | 6 +-
.../dashboard/settings/integrations/Slack.vue | 67 +-
.../Slack/SelectChannelWarning.vue | 6 +-
.../Slack/SlackIntegrationHelpText.vue | 9 +-
.../settings/integrations/Webhooks/Index.vue | 47 +-
.../integrations/Webhooks/WebhookRow.vue | 83 +-
.../integrations/integrations.routes.js | 24 +-
.../dashboard/settings/labels/Index.vue | 133 +-
.../dashboard/settings/macros/Index.vue | 49 +-
.../dashboard/settings/macros/MacroEditor.vue | 2 +-
.../dashboard/settings/macros/MacroForm.vue | 6 +-
.../settings/macros/MacroProperties.vue | 63 +-
.../settings/macros/MacrosTableRow.vue | 105 +-
.../settings/profile/AudioAlertCondition.vue | 6 +-
.../dashboard/settings/profile/HotKeyCard.vue | 8 +-
.../dashboard/settings/profile/Index.vue | 118 +-
.../settings/profile/MfaSettings.vue | 21 +-
.../settings/profile/MfaSettingsCard.vue | 4 +-
.../profile/NotificationPreferences.vue | 18 +-
.../settings/profile/profile.routes.js | 4 +-
.../reports/components/ReportHeader.vue | 13 +-
.../reports/components/ReportsWrapper.vue | 2 +-
.../dashboard/settings/security/Index.vue | 5 +-
.../security/components/SamlPaywall.vue | 2 +-
.../security/components/SamlSettings.vue | 1 +
.../routes/dashboard/settings/sla/Index.vue | 212 +++-
.../{components => }/SLAPaywallEnterprise.vue | 5 +-
.../sla/components/BaseEmptyState.vue | 33 -
.../sla/components/SLABusinessHoursLabel.vue | 32 -
.../settings/sla/components/SLAEmptyState.vue | 21 -
.../settings/sla/components/SLAHeader.vue | 30 -
.../settings/sla/components/SLAListItem.vue | 71 --
.../sla/components/SLAListItemLoading.vue | 41 -
.../sla/components/SLAResponseTime.vue | 37 -
.../settings/teams/AgentSelector.vue | 253 ++--
.../dashboard/settings/teams/Create/Index.vue | 4 +-
.../settings/teams/Edit/EditAgents.vue | 6 +-
.../dashboard/settings/teams/Edit/Index.vue | 4 +-
.../routes/dashboard/settings/teams/Index.vue | 166 ++-
.../shared/components/GreetingsEditor.vue | 8 +-
theme/icons.js | 140 ++-
182 files changed, 5187 insertions(+), 4297 deletions(-)
create mode 100644 app/javascript/dashboard/components-next/Settings/SettingsAccordion.vue
create mode 100644 app/javascript/dashboard/components-next/Settings/SettingsFieldSection.vue
create mode 100644 app/javascript/dashboard/components-next/Settings/SettingsToggleSection.vue
rename app/javascript/dashboard/components-next/{Label => label}/AddLabel.vue (100%)
create mode 100644 app/javascript/dashboard/components-next/label/Label.vue
rename app/javascript/dashboard/components-next/{Label => label}/LabelItem.vue (100%)
rename app/javascript/dashboard/components-next/{Label => label}/story/AddLabel.story.vue (100%)
rename app/javascript/dashboard/components-next/{Label => label}/story/Label.story.vue (100%)
rename app/javascript/dashboard/components-next/{Label => label}/story/fixtures.js (100%)
create mode 100644 app/javascript/dashboard/components-next/select/Select.vue
create mode 100644 app/javascript/dashboard/components-next/table/BaseTable.story.vue
create mode 100644 app/javascript/dashboard/components-next/table/BaseTable.vue
create mode 100644 app/javascript/dashboard/components-next/table/BaseTableCell.vue
create mode 100644 app/javascript/dashboard/components-next/table/BaseTableRow.vue
create mode 100644 app/javascript/dashboard/components-next/table/index.js
delete mode 100644 app/javascript/dashboard/components/FormSection.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/inbox/WidgetBuilder.vue
rename app/javascript/dashboard/routes/dashboard/settings/sla/{components => }/SLAPaywallEnterprise.vue (87%)
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/BaseEmptyState.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLABusinessHoursLabel.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAEmptyState.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAHeader.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAListItem.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAListItemLoading.vue
delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAResponseTime.vue
diff --git a/app/javascript/dashboard/assets/scss/_base.scss b/app/javascript/dashboard/assets/scss/_base.scss
index 14ae2a9d4..d3d3f6726 100644
--- a/app/javascript/dashboard/assets/scss/_base.scss
+++ b/app/javascript/dashboard/assets/scss/_base.scss
@@ -66,7 +66,7 @@ textarea {
// Field base styles (Input, TextArea, Select)
@layer components {
.field-base {
- @apply block box-border w-full transition-colors duration-[0.25s] ease-[ease-in-out] focus:outline-n-brand dark:focus:outline-n-brand appearance-none mx-0 mt-0 mb-4 py-2 px-3 rounded-lg text-base font-normal bg-n-alpha-black2 placeholder:text-n-slate-10 dark:placeholder:text-n-slate-10 text-n-slate-12 border-none outline outline-1 outline-n-weak dark:outline-n-weak hover:outline-n-slate-6 dark:hover:outline-n-slate-6;
+ @apply block box-border w-full transition-colors duration-[0.25s] ease-[ease-in-out] focus:outline-n-brand dark:focus:outline-n-brand appearance-none mx-0 mt-0 mb-4 py-2 px-3 rounded-lg text-sm font-normal bg-n-alpha-black2 placeholder:text-n-slate-10 dark:placeholder:text-n-slate-10 text-n-slate-12 border-none outline outline-1 outline-n-weak dark:outline-n-weak hover:outline-n-slate-6 dark:hover:outline-n-slate-6;
}
.field-disabled {
diff --git a/app/javascript/dashboard/assets/scss/_woot.scss b/app/javascript/dashboard/assets/scss/_woot.scss
index 40ca7b436..81a4569b5 100644
--- a/app/javascript/dashboard/assets/scss/_woot.scss
+++ b/app/javascript/dashboard/assets/scss/_woot.scss
@@ -66,4 +66,84 @@ body {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
+
+ /**
+ * ============================================================================
+ * TYPOGRAPHY UTILITIES
+ * ============================================================================
+ *
+ * | Class | Use Case |
+ * |--------------------|----------------------------------------------------|
+ * | .text-body-main |
, , general body text |
+ * | .text-body-para | for paragraphs, larger text blocks |
+ * | .text-heading-1 |
, page titles, panel headers |
+ * | .text-heading-2 | , section headings, card titles |
+ * | .text-heading-3 | , card headings, breadcrumbs, subsections |
+ * | .text-label |