Skip to content

Refactor: redesign projects hub UI, optimize workspace navigation, and harmonize feature metadata - #27

Merged
MathCunha16 merged 2 commits into
mainfrom
refactor/projects-hub-ui-refinement
Jul 26, 2026
Merged

Refactor: redesign projects hub UI, optimize workspace navigation, and harmonize feature metadata#27
MathCunha16 merged 2 commits into
mainfrom
refactor/projects-hub-ui-refinement

Conversation

@MathCunha16

@MathCunha16 MathCunha16 commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Description

This PR refactors the home dashboard page into a premium, theme-adaptive Projects Hub, resolves workspace feature tab sub-navigation, harmonizes sidebar headers/dates, and adds quality-of-life enhancements for Snippets, Notes, and desktop performance.

Key Changes

  • Refined Projects Hub UI:
    • Replaced generic placeholder dashboard metrics with an interactive Projects Hub.
    • Added a theme-adaptive control bar for searching and filtering projects (supporting both Dark and Light modes).
    • Made the entire project card grid clickable to enter the workspace, replacing the footer link with a "View Details" settings trigger.
    • Added direct shortcut tags on cards to launch directly into specific feature tabs (Snippets, Vault, Problems, Notes, Links).
  • Direct Workspace Navigation & State Resolution:
    • Implemented validateSearch for the tab URL parameter in TanStack Router.
    • Derived active workspace tab state directly from search parameters, eliminating synchronous state updates and React linter warnings.
  • Sidebar Date Formatting Harmonization:
    • Harmonized date formatting across Snippets, Notes, Links, and Problems sidebars to use clean date strings (toLocaleDateString()).
    • Adjusted header layout to align-items: flex-start with clean spacing so titles wrap gracefully without crowding or overlapping date tags.
  • Notes Workspace Polish:
    • Added a dedicated Copy content action button in the Notes header action bar using copyToClipboard.
  • Snippets Workspace Polish:
    • Added a metadata row displaying Created and Updated dates under the snippet detail title (consistent with other workspaces).
  • CSS Standard Compliance:
    • Added standard line-clamp properties alongside vendor prefixes in index.module.css and projects.$projectId.module.css.
  • JavaFX/WebKit WebView Glitch Fix:
    • Resolved JavaFX WebView logo hover blur issues by implementing hardware acceleration (transform: translateZ(0), backface-visibility: hidden) on .appLogo and .greenLogo components.
    • Replaced parent hover opacity transitions with filter: brightness(1.1) to bypass subpixel antialiasing smearing and downsampling issues.

Verification

  • Production Build: Verified by running npm run build which compiled successfully with 0 errors and 0 warnings.

Summary by CodeRabbit

  • Novos recursos
    • Dashboard de projetos unificado com busca, abas (ACTIVE/ARCHIVED/ALL), contagens e estados vazios; ações de arquivar/restaurar/excluir no card.
    • Aba do projeto agora é preservada na URL; atualização de detalhes do workspace.
    • Detalhes de credenciais com seção “fallback” para campos personalizados e ação de copiar; notas com botão “Copy”; links e snippets com metadados de datas.
  • Melhorias visuais
    • Redesenho de layout de cartões, controles e responsividade; melhorias de acessibilidade e efeitos (3D/GPU).
  • Correções
    • Melhorias de teclado/propagação em seletores; texto de confirmação de exclusão permanente mais completo.
  • Chores
    • Versão exibida atualizada para 0.1.6-alpha.

…e WebView rendering

- Replace placeholder dashboard with a theme-adaptive Projects Hub (with search, tabs, and direct shortcuts).
- Sync workspace sub-tabs with TanStack Router search params to resolve linter warnings.
- Harmonize creation/update date displays across all feature sidebars.
- Add a "Copy Content" action to Notes and metadata row to Snippet detail views.
- Fix standard CSS 'line-clamp' properties to resolve compatibility warnings.
- Apply hardware acceleration layers and brightness filters to HackerLogo to resolve JavaFX WebView hover blur artifacts.
@MathCunha16 MathCunha16 self-assigned this Jul 26, 2026
@MathCunha16 MathCunha16 added enhancement New feature or request Frontend Frontend feature or modification labels Jul 26, 2026
@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 2bbb061e-5c87-49ff-848e-d9dff3f2ff2b

📥 Commits

Reviewing files that changed from the base of the PR and between 1da27db and a203e3e.

📒 Files selected for processing (3)
  • frontend/src/components/DashboardView.tsx
  • frontend/src/components/ProjectDetailView.tsx
  • frontend/src/features/notes/components/NotesWorkspace.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • frontend/src/components/ProjectDetailView.tsx
  • frontend/src/components/DashboardView.tsx

📝 Walkthrough

Walkthrough

A atualização reformula o dashboard de projetos com busca, filtros e cards interativos, sincroniza abas de workspace pela URL, amplia dados de credenciais e metadados, adiciona cópia de notas, ajusta estilos visuais e atualiza a versão do backend.

Changes

Dashboard e workspaces

Layer / File(s) Summary
Dashboard de projetos
frontend/src/components/DashboardView.tsx
Adiciona busca, filtros, contagens, navegação por cards, ações de arquivamento e exclusão, estados vazios e confirmação ampliada.
Layout do dashboard
frontend/src/routes/index.module.css
Redesenha controles, grid, cards, estados vazios e botões da página de projetos.
Abas baseadas na URL
frontend/src/routes/projects.$projectId.tsx, frontend/src/components/ProjectDetailView.tsx, frontend/src/routes/projects.$projectId.module.css
Valida search.tab, exporta ProjectTabType e controla a aba ativa pela URL.
Payload e cards de credenciais
frontend/src/types/api.ts, frontend/src/features/credentials/components/*, frontend/src/components/TagManagerSection.tsx, frontend/src/routes/projects.$projectId.module.css
Adiciona notes, exibe chaves customizadas e ajusta interação, dica de desbloqueio, tags e layout dos cards.
Metadados dos workspaces
frontend/src/features/links/components/LinksWorkspace.tsx, frontend/src/features/notes/components/NotesWorkspace.tsx, frontend/src/features/snippets/components/SnippetsWorkspace.tsx
Exibe datas, adiciona metadados de snippets e permite copiar notas com feedback visual.
Renderização visual
frontend/src/components/HackerLogo.module.css, frontend/src/routes/__root.module.css
Atualiza composição 3D, sombras, filtros, animações e estados de hover.
Versão da aplicação
backend/src/main/resources/application.yaml
Atualiza app.version para 0.1.6-alpha.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Pessoa
  participant DashboardView
  participant ProjectDetailView
  participant Workspace
  Pessoa->>DashboardView: pesquisa, filtra ou abre um projeto
  DashboardView->>ProjectDetailView: navega para o projeto
  Pessoa->>ProjectDetailView: seleciona uma aba
  ProjectDetailView->>Workspace: atualiza tab na URL e renderiza a aba
  Workspace-->>Pessoa: exibe conteúdo e metadados
Loading

Possibly related PRs

Suggested labels: Backend

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed O título resume bem o redesenho do hub de projetos, a navegação do workspace e o ajuste de metadados, que são os principais temas da PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
frontend/src/features/credentials/components/CredentialDetailModal.tsx (1)

283-366: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Fallback genérico expõe segredos sem máscara e pode duplicar o valor mascarado do RAW_TEXT.

Diferente de username/password/API key/raw text (que exigem clique em "reveal"), qualquer chave customizada do payload é exibida em texto puro imediatamente pelo bloco de fallback. Além disso, quando RAW_TEXT não tem nenhuma das chaves nomeadas e cai no fallback Object.values(payload)[0] (linha 290), a chave real usada não está na lista de exclusão do fallback genérico — o mesmo segredo mascarado no bloco RAW_TEXT reaparece em texto puro logo abaixo.

🔒 Fix sugerido: excluir a chave real usada como fonte do RAW_TEXT
+                const KNOWN_PAYLOAD_KEYS = [
+                  "username", "user", "email", "password", "pass", "secret",
+                  "apiKey", "api_key", "token", "key",
+                  "rawTextContent", "rawText", "content", "text",
+                ];
+                const rawTextSourceKey =
+                  cred.secretType === "RAW_TEXT"
+                    ? ["rawTextContent", "rawText", "content", "text"].find((k) => payload[k]) ??
+                      Object.keys(payload)[0]
+                    : undefined;
+
                 {/* Generic fallback for any unlisted or custom keys in payload */}
                 {Object.entries(payload)
                   .filter(
                     ([key]) =>
-                      ![
-                        "username", "user", "email", "password", "pass", "secret",
-                        "apiKey", "api_key", "token", "key",
-                        "rawTextContent", "rawText", "content", "text",
-                      ].includes(key)
+                      !KNOWN_PAYLOAD_KEYS.includes(key) && key !== rawTextSourceKey
                   )

Também vale considerar aplicar a mesma UX de "reveal"/máscara aos campos genéricos, já que podem conter dados tão sensíveis quanto senha/API key.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/features/credentials/components/CredentialDetailModal.tsx`
around lines 283 - 366, Atualize o bloco de fallback genérico em conjunto com o
cálculo de rawTextValue para identificar e excluir a chave efetivamente usada
como fonte do RAW_TEXT, evitando duplicação do segredo. Campos genéricos também
devem seguir a mesma UX de proteção: exibir valor mascarado por padrão e
permitir revelar e copiar mediante ações explícitas, em vez de renderizá-los em
texto puro.
🧹 Nitpick comments (11)
frontend/src/routes/__root.module.css (1)

105-116: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

transition inclui transform, mas nada altera o transform.

O único transform é o translateZ(0) estático e o :hover só muda filter, então a parte transform 0.15s ease não tem efeito. Simplifique para transition: filter 0.15s ease; se não houver outro estado que mova o logo.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/routes/__root.module.css` around lines 105 - 116, Update the
.appLogo transition declaration to animate only filter, removing transform
because no state changes the logo’s transform. Preserve the existing hover
brightness behavior and other styling.
frontend/src/routes/index.module.css (5)

93-100: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Larguras mínimas fixas podem gerar overflow horizontal em telas estreitas.

.searchBox com min-width: 260px e .projectsGrid com minmax(320px, 1fr) não encolhem abaixo desses valores; somados ao padding do container, estouram em viewports próximas de 320px.

📱 Ajuste sugerido
 .searchBox {
   position: relative;
   display: flex;
   align-items: center;
-  min-width: 260px;
+  min-width: min(260px, 100%);
   flex: 1;
   max-width: 440px;
 }
 .projectsGrid {
   display: grid;
-  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
+  grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
   gap: 1.25rem;
 }

Also applies to: 186-190

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/routes/index.module.css` around lines 93 - 100, Remove or
replace the fixed min-width constraints in .searchBox and .projectsGrid so both
can shrink on narrow viewports, while preserving their normal minimum sizes on
wider screens. Account for the container padding so layouts near 320px do not
overflow horizontally.

56-77: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Falta estilo para o estado :disabled.

.createBtn (e .createCard, Linha 405) são renderizados com disabled={isMutationPending}, mas sem feedback visual: o botão continua com aparência clicável e cursor: pointer.

🎨 Ajuste sugerido
 .createBtn:hover:not(:disabled) {
   transform: translateY(-1px);
   filter: brightness(1.12);
   box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
 }
+
+.createBtn:disabled {
+  opacity: 0.6;
+  cursor: not-allowed;
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/routes/index.module.css` around lines 56 - 77, Adicionar estilos
de estado disabled para .createBtn e .createCard, refletindo visualmente que não
estão interativos quando isMutationPending estiver ativo. Sobrescrever o cursor
pointer e ajustar opacidade/aparência, além de impedir o efeito de hover em
elementos desabilitados, preservando o estilo atual nos estados habilitados.

440-444: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Hover do badge ignora o estado desabilitado.

Diferente de .createCard:hover:not(:disabled) (Linha 421), esta regra anima o badge mesmo com o botão desabilitado durante mutações.

🎨 Ajuste sugerido
-.createCard:hover .createCardBadge {
+.createCard:hover:not(:disabled) .createCardBadge {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/routes/index.module.css` around lines 440 - 444, Atualize o
seletor `.createCard:hover .createCardBadge` para excluir cartões desabilitados,
alinhando-o ao comportamento de `.createCard:hover:not(:disabled)`. Preserve a
animação e as cores para cartões habilitados, mas impeça qualquer alteração do
badge enquanto o botão estiver desabilitado durante mutações.

127-130: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cor de foco fixa contraria o restante do tema.

O comentário na Linha 79 anuncia "Theme Adaptive", mas o anel de foco usa rgba(195, 100, 50, 0.15) fixo, que não acompanha --color-primary em outros temas.

🎨 Ajuste sugerido
 .searchInput:focus {
   border-color: var(--color-primary);
-  box-shadow: 0 0 0 2px rgba(195, 100, 50, 0.15);
+  box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 15%, transparent);
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/routes/index.module.css` around lines 127 - 130, Atualize a
regra .searchInput:focus para que o anel de foco derive de --color-primary em
vez de usar o rgba fixo. Preserve a intensidade visual atual e garanta que o
estilo acompanhe corretamente os diferentes temas.

270-288: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Classes CSS órfãs em index.module.css
.cardManageBtn não é referenciada em TS/TSX e .enterArrow não é aplicada ao ícone dentro de .enterLink, então essas regras não têm efeito. Remova-as ou adicione styles.enterArrow ao ícone se a animação for necessária.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/routes/index.module.css` around lines 270 - 288, Remove the
unused .cardManageBtn styles from index.module.css, and inspect the .enterArrow
rule and the icon inside .enterLink: either remove the orphaned rule or apply
styles.enterArrow to that icon if its animation is required.
frontend/src/components/HackerLogo.module.css (2)

89-100: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

will-change + translateZ(0) são redundantes aqui.

Ambos promovem a camada; manter will-change permanente em várias partículas simultâneas mantém camadas GPU alocadas o tempo todo, o que pesa justamente no WebView que este PR busca otimizar. Considere manter apenas um dos dois.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/HackerLogo.module.css` around lines 89 - 100, Remove
the redundant layer-promotion declaration from the .cssParticle styles, keeping
only either will-change: transform, opacity or transform: translateZ(0). Apply
the same cleanup consistently to the dark and light theme rules without changing
the particle visuals or animation behavior.

102-123: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Evitar depender da ordem de !important entre .logoSvg e .greenLogo.

Como o <svg> recebe as duas classes, o drop-shadow só ganha porque .greenLogo vem depois no arquivo. Isso deixa o efeito frágil a reorder/minificação. Remova o !important de .logoSvg ou exclua .greenLogo dela.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/HackerLogo.module.css` around lines 102 - 123, Remova
o !important de filter em .logoSvg, ou ajuste o seletor para não afetar
elementos que também usam .greenLogo. Preserve os filtros drop-shadow definidos
em .greenLogo e no seletor de tema claro, sem depender da ordem das regras CSS.
frontend/src/components/DashboardView.tsx (3)

264-321: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extraia os atalhos para uma lista e renderize com map.

Os cinco Links são idênticos exceto por tab, ícone, rótulo e title; o onClick de stopPropagation também está duplicado no wrapper e em cada link.

♻️ Refactor sugerido
+const PROJECT_SHORTCUTS = [
+  { tab: "snippets", icon: Icons.Code2, label: "Snippets", title: "Code Snippets" },
+  { tab: "credentials", icon: Icons.KeyRound, label: "Vault", title: "Vault Credentials" },
+  { tab: "problems", icon: Icons.AlertCircle, label: "Problems", title: "Problems & Solutions" },
+  { tab: "notes", icon: Icons.FileText, label: "Notes", title: "Notes" },
+  { tab: "links", icon: Icons.Link2, label: "Links", title: "Links" },
+] as const;
                 <div className={styles.shortcutRow} onClick={(e) => e.stopPropagation()}>
-                  <Link ... >...</Link>  {/* x5 */}
+                  {PROJECT_SHORTCUTS.map(({ tab, icon: ShortcutIcon, label, title }) => (
+                    <Link
+                      key={tab}
+                      to="/projects/$projectId"
+                      params={{ projectId: project.id }}
+                      search={{ tab }}
+                      className={styles.shortcutTag}
+                      title={title}
+                    >
+                      <ShortcutIcon size={11} />
+                      <span>{label}</span>
+                    </Link>
+                  ))}
                 </div>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/DashboardView.tsx` around lines 264 - 321, Refactor
the shortcut links in DashboardView’s shortcutRow by defining a data list for
each tab, icon, label, and title, then render the five Links with map. Preserve
the existing route, projectId params, styling, icons, labels, titles, and
stopPropagation behavior, removing the duplicated JSX while retaining the
wrapper’s propagation handling.

121-139: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Adicione um rótulo acessível ao campo de busca.

O input só tem placeholder, que não é anunciado como rótulo por leitores de tela; o botão de limpar também não tem nome acessível.

♿ Correção sugerida
           <input
             type="text"
             className={styles.searchInput}
+            aria-label="Filtrar projetos"
             placeholder="Filter projects by name or description..."
             value={searchQuery}
             onChange={(e) => setSearchQuery(e.target.value)}
           />
           {searchQuery && (
             <button
               type="button"
               className={styles.clearSearchBtn}
+              aria-label="Limpar busca"
               onClick={() => setSearchQuery("")}
             >
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/DashboardView.tsx` around lines 121 - 139, Update the
search input in DashboardView to include a persistent accessible label, and add
an accessible name to the clearSearchBtn button so screen readers identify both
controls without relying on placeholder text or icons.

215-236: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Card role="button" com links/botões aninhados quebra a semântica de acessibilidade.

Um elemento com role="button" não pode conter conteúdo interativo (os Links de atalho e os botões do rodapé). Leitores de tela achatam o conteúdo e a ordem de foco fica ambígua. Uma alternativa comum é manter o card como div não focável e transformar o título em um Link real (padrão "card com link estendido" via ::after), preservando o onClick no card apenas como conveniência de mouse.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/DashboardView.tsx` around lines 215 - 236, Remove the
card’s role="button" and tabIndex so the project card remains a non-focusable
div when it contains nested links and footer buttons. Keep its onClick
navigation as mouse convenience, and move keyboard/focus navigation to the
project title by making it a real Link, using the existing project route and
preserving the nested controls’ independent interaction.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/components/DashboardView.tsx`:
- Around line 210-250: Update the cardIconBox borderColor and backgroundColor
styling in the filteredProjects mapping to derive transparency with CSS
color-mix() instead of appending a hex alpha suffix to cardColor. Preserve
cardColor for the accent bar and icon, and ensure the new color-mix values work
with fallback, rgb(), named, and hex color formats.
- Around line 141-165: Update the DashboardView tab-selection logic so tabFilter
cannot remain effectively set to "ARCHIVED" when archivedProjectsCount is zero;
derive an effective tab that falls back to a visible filter, and use
effectiveTab for filterTabActive comparisons and empty-state text while
preserving the existing tabFilter controls.

In `@frontend/src/components/ProjectDetailView.tsx`:
- Around line 16-23: Remova a importação de Route de
../routes/projects.$projectId em ProjectDetailView e use
getRouteApi("/projects/$projectId") para criar a API da rota. Substitua as
chamadas Route.useSearch() e Route.useNavigate() por routeApi.useSearch() e
routeApi.useNavigate(), preservando o comportamento atual e eliminando a
dependência circular.

In `@frontend/src/features/notes/components/NotesWorkspace.tsx`:
- Around line 336-353: Update the Copy button handler in NotesWorkspace to
choose inlineContent when isEditingContent is true, and otherwise use
noteDetail.content. Preserve the existing empty-content guard, clipboard call,
and success/error toast behavior while ensuring unsaved inline edits are copied.

---

Outside diff comments:
In `@frontend/src/features/credentials/components/CredentialDetailModal.tsx`:
- Around line 283-366: Atualize o bloco de fallback genérico em conjunto com o
cálculo de rawTextValue para identificar e excluir a chave efetivamente usada
como fonte do RAW_TEXT, evitando duplicação do segredo. Campos genéricos também
devem seguir a mesma UX de proteção: exibir valor mascarado por padrão e
permitir revelar e copiar mediante ações explícitas, em vez de renderizá-los em
texto puro.

---

Nitpick comments:
In `@frontend/src/components/DashboardView.tsx`:
- Around line 264-321: Refactor the shortcut links in DashboardView’s
shortcutRow by defining a data list for each tab, icon, label, and title, then
render the five Links with map. Preserve the existing route, projectId params,
styling, icons, labels, titles, and stopPropagation behavior, removing the
duplicated JSX while retaining the wrapper’s propagation handling.
- Around line 121-139: Update the search input in DashboardView to include a
persistent accessible label, and add an accessible name to the clearSearchBtn
button so screen readers identify both controls without relying on placeholder
text or icons.
- Around line 215-236: Remove the card’s role="button" and tabIndex so the
project card remains a non-focusable div when it contains nested links and
footer buttons. Keep its onClick navigation as mouse convenience, and move
keyboard/focus navigation to the project title by making it a real Link, using
the existing project route and preserving the nested controls’ independent
interaction.

In `@frontend/src/components/HackerLogo.module.css`:
- Around line 89-100: Remove the redundant layer-promotion declaration from the
.cssParticle styles, keeping only either will-change: transform, opacity or
transform: translateZ(0). Apply the same cleanup consistently to the dark and
light theme rules without changing the particle visuals or animation behavior.
- Around line 102-123: Remova o !important de filter em .logoSvg, ou ajuste o
seletor para não afetar elementos que também usam .greenLogo. Preserve os
filtros drop-shadow definidos em .greenLogo e no seletor de tema claro, sem
depender da ordem das regras CSS.

In `@frontend/src/routes/__root.module.css`:
- Around line 105-116: Update the .appLogo transition declaration to animate
only filter, removing transform because no state changes the logo’s transform.
Preserve the existing hover brightness behavior and other styling.

In `@frontend/src/routes/index.module.css`:
- Around line 93-100: Remove or replace the fixed min-width constraints in
.searchBox and .projectsGrid so both can shrink on narrow viewports, while
preserving their normal minimum sizes on wider screens. Account for the
container padding so layouts near 320px do not overflow horizontally.
- Around line 56-77: Adicionar estilos de estado disabled para .createBtn e
.createCard, refletindo visualmente que não estão interativos quando
isMutationPending estiver ativo. Sobrescrever o cursor pointer e ajustar
opacidade/aparência, além de impedir o efeito de hover em elementos
desabilitados, preservando o estilo atual nos estados habilitados.
- Around line 440-444: Atualize o seletor `.createCard:hover .createCardBadge`
para excluir cartões desabilitados, alinhando-o ao comportamento de
`.createCard:hover:not(:disabled)`. Preserve a animação e as cores para cartões
habilitados, mas impeça qualquer alteração do badge enquanto o botão estiver
desabilitado durante mutações.
- Around line 127-130: Atualize a regra .searchInput:focus para que o anel de
foco derive de --color-primary em vez de usar o rgba fixo. Preserve a
intensidade visual atual e garanta que o estilo acompanhe corretamente os
diferentes temas.
- Around line 270-288: Remove the unused .cardManageBtn styles from
index.module.css, and inspect the .enterArrow rule and the icon inside
.enterLink: either remove the orphaned rule or apply styles.enterArrow to that
icon if its animation is required.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 91025539-1b81-418d-8435-4239027a8336

📥 Commits

Reviewing files that changed from the base of the PR and between e674354 and 1da27db.

📒 Files selected for processing (15)
  • backend/src/main/resources/application.yaml
  • frontend/src/components/DashboardView.tsx
  • frontend/src/components/HackerLogo.module.css
  • frontend/src/components/ProjectDetailView.tsx
  • frontend/src/components/TagManagerSection.tsx
  • frontend/src/features/credentials/components/CredentialDetailModal.tsx
  • frontend/src/features/credentials/components/CredentialsWorkspace.tsx
  • frontend/src/features/links/components/LinksWorkspace.tsx
  • frontend/src/features/notes/components/NotesWorkspace.tsx
  • frontend/src/features/snippets/components/SnippetsWorkspace.tsx
  • frontend/src/routes/__root.module.css
  • frontend/src/routes/index.module.css
  • frontend/src/routes/projects.$projectId.module.css
  • frontend/src/routes/projects.$projectId.tsx
  • frontend/src/types/api.ts

Comment thread frontend/src/components/DashboardView.tsx
Comment thread frontend/src/components/DashboardView.tsx
Comment thread frontend/src/components/ProjectDetailView.tsx Outdated
Comment thread frontend/src/features/notes/components/NotesWorkspace.tsx
…uter usage, and enable copying active note edits
@MathCunha16
MathCunha16 merged commit 98c3830 into main Jul 26, 2026
2 checks passed
@MathCunha16
MathCunha16 deleted the refactor/projects-hub-ui-refinement branch July 26, 2026 14:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request Frontend Frontend feature or modification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant