From 2bcdf6c5542eb350b6ab27b9c69c08770e1ded55 Mon Sep 17 00:00:00 2001 From: Guillem Arias Fauste Date: Mon, 4 May 2026 21:40:17 +0200 Subject: [PATCH] fix(design-system): replace undefined utility classes and broken /N modifiers (#1660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(design-system): replace undefined utility classes and broken /N modifiers Audit of class-name resolution in views surfaced two related silent failures across ~17 files: 1. Class names that don't exist anywhere in the design system. Tailwind silently drops them and the element renders with no CSS for that property. - bg-primary (and bg-primary/5, /10, /90): never defined as a custom utility, no --color-primary in @theme. Used as a CTA bg in 8 places, all rendered transparent. - text-inverted: typo of text-inverse. - text-primary-foreground: shadcn/Radix vocabulary, not in our token system. - bg-accent / border-accent / text-accent: same shadcn vocabulary; not defined. 2. Slash modifier (/N) used on custom @utility blocks. Modifiers only resolve on Tailwind theme colors (anything in tokens.json color.*). Custom @utility blocks compile to static @apply statements and silently drop the /N variant. Affected uses: - border-surface-inset/50 across provider account selectors. - border-secondary/30, /40 in admin SSO form and simplefin setup. - bg-surface-inset/30, /40 in settings preferences and simplefin. Fixes: | From | To | |---------------------------------------------------|------------------------------------------------------| | bg-primary text-white (and similar primary CTAs) | button-bg-primary text-inverse | | bg-primary text-primary-foreground (badges) | button-bg-primary text-inverse | | bg-primary text-inverted (typo) | button-bg-primary text-inverse | | bg-primary text-primary (broken active pill) | bg-inverse text-inverse | | bg-primary (status dot) | bg-inverse | | bg-primary/5, bg-primary/10 (subtle accent bg) | bg-gray-tint-5, bg-gray-tint-10 | | hover:bg-primary/90 | hover:button-bg-primary-hover | | border-accent bg-accent/10 text-accent (badges) | border-secondary bg-surface-inset text-secondary | | border-surface-inset/50 | border-secondary | | border-secondary/30, /40 | border-tertiary | | bg-surface-inset/30 | bg-surface-inset (full strength) | | bg-surface-inset/40 | bg-container-inset | Also documents the alpha-modifier limitation in design/tokens/README.md under a new "Alpha modifiers in views (/N syntax)" section, with the opacity-N convention for custom utilities and a note that the gray-tint-5 / gray-tint-10 family (and similar pre-resolved tints) are theme colors and accept /N modifiers natively. The accent-badge mapping uses neutral semantics for now. A dedicated brand-accent token (text-link-tint-10 etc.) is worth considering as a follow-up if the "highlighted metadata badge" pattern recurs. * fix(design-system): replace undefined divide-primary / divide-secondary with alpha tokens Same class of bug as the rest of this PR: divide-{name} requires the name to be a theme color (i.e. expose --color-{name}), and our custom @utility utilities (primary, secondary, etc.) do not. Tailwind silently drops the unrecognized class and rows render with no separator. Spotted six instances during the visual audit: - admin/users/index.html.erb (×2): users table + pending invitations - admin/sso_providers/index.html.erb (×2): configured + legacy lists - transactions/categorizes/_transaction_list.html.erb: categorize sidebar - settings/preferences/show.html.erb: divide-secondary/60 (also broken) Swapped to the alpha-black/white pattern already used elsewhere in the codebase (imports/cleans/show, transactions/_summary, etc.): divide-y divide-primary -> divide-y divide-alpha-black-200 theme-dark:divide-alpha-white-200 divide-y divide-secondary/60 -> divide-y divide-alpha-black-100 theme-dark:divide-alpha-white-100 The lighter (-100) variant on the preferences list matches the original intent of /60 (more subtle). --- app/components/provider_sync_summary.html.erb | 2 +- app/views/admin/sso_providers/_form.html.erb | 6 +++--- app/views/admin/sso_providers/index.html.erb | 4 ++-- app/views/admin/users/index.html.erb | 4 ++-- .../binance_items/select_existing_account.html.erb | 2 +- app/views/budgets/_budget_nav.html.erb | 2 +- .../coinbase_items/select_existing_account.html.erb | 2 +- .../select_existing_account.html.erb | 2 +- app/views/import/rows/_form.html.erb | 2 +- .../_indexa_capital_item.html.erb | 2 +- app/views/pages/intro.html.erb | 2 +- app/views/settings/api_keys/show.html.erb | 2 +- app/views/settings/preferences/show.html.erb | 8 ++++---- .../providers/_enable_banking_panel.html.erb | 2 +- .../select_existing_account.html.erb | 2 +- app/views/simplefin_items/setup_accounts.html.erb | 2 +- app/views/transactions/_split_parent_row.html.erb | 2 +- app/views/transactions/_transaction.html.erb | 2 +- .../categorizes/_transaction_list.html.erb | 2 +- app/views/transactions/categorizes/show.html.erb | 2 +- design/tokens/README.md | 13 +++++++++++++ 21 files changed, 40 insertions(+), 27 deletions(-) diff --git a/app/components/provider_sync_summary.html.erb b/app/components/provider_sync_summary.html.erb index b6156edf7..c2df24d43 100644 --- a/app/components/provider_sync_summary.html.erb +++ b/app/components/provider_sync_summary.html.erb @@ -1,4 +1,4 @@ -
+
<%= helpers.icon "chevron-right", class: "group-open:transform group-open:rotate-90" %> diff --git a/app/views/admin/sso_providers/_form.html.erb b/app/views/admin/sso_providers/_form.html.erb index 5ccdc3b87..5a3527c3e 100644 --- a/app/views/admin/sso_providers/_form.html.erb +++ b/app/views/admin/sso_providers/_form.html.erb @@ -119,7 +119,7 @@
<%= t("admin.sso_providers.form.manual_saml_config") %> -
+

<%= t("admin.sso_providers.form.manual_saml_help") %>

@@ -202,7 +202,7 @@
<%= t("admin.sso_providers.form.role_mapping_title") %> -
+

<%= t("admin.sso_providers.form.role_mapping_help") %>

@@ -284,7 +284,7 @@
<%= link_to "Cancel", admin_sso_providers_path, class: "px-4 py-2 text-sm font-medium text-secondary hover:text-primary" %> <%= form.submit sso_provider.persisted? ? "Update Provider" : "Create Provider", - class: "px-4 py-2 bg-primary text-inverse rounded-lg text-sm font-medium hover:bg-primary/90" %> + class: "px-4 py-2 button-bg-primary text-inverse rounded-lg text-sm font-medium hover:button-bg-primary-hover" %>
<% end %> diff --git a/app/views/admin/sso_providers/index.html.erb b/app/views/admin/sso_providers/index.html.erb index 8709fbdb1..c9ccfc6a1 100644 --- a/app/views/admin/sso_providers/index.html.erb +++ b/app/views/admin/sso_providers/index.html.erb @@ -10,7 +10,7 @@ <%= settings_section title: "Configured Providers" do %> <% if @sso_providers.any? %> -
+
<% @sso_providers.each do |provider| %>
@@ -73,7 +73,7 @@
-
+
<% @legacy_providers.each do |provider| %>
diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb index 6d10e0570..ba17db830 100644 --- a/app/views/admin/users/index.html.erb +++ b/app/views/admin/users/index.html.erb @@ -95,7 +95,7 @@ <%= t(".table.role") %> - + <% users.each do |user| %> @@ -137,7 +137,7 @@ <% end %> <% if pending_invitations.any? %> - + <% pending_invitations.each do |invitation| %> diff --git a/app/views/binance_items/select_existing_account.html.erb b/app/views/binance_items/select_existing_account.html.erb index 8f12e628a..a980fca99 100644 --- a/app/views/binance_items/select_existing_account.html.erb +++ b/app/views/binance_items/select_existing_account.html.erb @@ -17,7 +17,7 @@ <%= hidden_field_tag :account_id, @account.id %>
<% @available_binance_accounts.each do |ba| %> -