Skip to content

[FEATURE] Interactive Issue Preview Card with Animations (#125)#239

Merged
ascender1729 merged 4 commits into
masterfrom
feature/125-interactive-preview-card
Dec 28, 2025
Merged

[FEATURE] Interactive Issue Preview Card with Animations (#125)#239
ascender1729 merged 4 commits into
masterfrom
feature/125-interactive-preview-card

Conversation

@ascender1729
Copy link
Copy Markdown
Member

@ascender1729 ascender1729 commented Dec 28, 2025

Summary

  • Implements 3D flip animation for issue cards with front/back faces
  • Adds IssueCardSkeleton component for loading states
  • Creates back panel with detailed issue information and metadata
  • Adds keyboard support (Enter/Space to flip, Escape to close)
  • Fixes z-index management for flipped cards using CSS :has() selector
  • Converts FilterHelpTooltip and FilterBuilder to full-page centered modals
  • Fixes accessibility issues (orphan label to span)
  • GPU-optimized animations with will-change and backface-visibility

Test Plan

  • Verify issue cards flip on click with smooth 3D animation
  • Verify keyboard navigation (Enter/Space to flip, Escape to close)
  • Verify back panel displays detailed issue information correctly
  • Verify flipped cards appear above other cards (z-index)
  • Verify FilterHelpTooltip modal centers on full page
  • Verify FilterBuilder modal centers on full page
  • Verify skeleton loading state displays properly
  • Verify build passes with 0 errors

Closes #125

Summary by CodeRabbit

  • New Features

    • Flip-card interaction on issue cards to reveal full issue details and body preview
    • Loading skeleton previews while issues load
    • Body preview/summary generation for issues
  • UX Improvements

    • Improved accessibility: screen-reader flip announcements, keyboard support, and reduced-motion handling
    • Filter and help moved to modal dialogs for clearer flows
    • Added copy/view actions and refined hover/focus visuals for issue cards
  • Tests

    • Updated test fixtures to include issue body handling

✏️ Tip: You can customize this high-level summary in your review settings.

- Implement 3D flip animation for issue cards with front/back faces
- Add IssueCardSkeleton component for loading states
- Create back panel with detailed issue information and metadata
- Add keyboard support (Enter/Space to flip, Escape to close)
- Fix z-index management for flipped cards using CSS :has() selector
- Convert FilterHelpTooltip to full-page centered modal
- Convert FilterBuilder to full-page centered modal
- Fix accessibility: change orphan label to span in SearchForm
- Add GPU-optimized animations with will-change and backface-visibility
- Implement smooth transitions with proper timing functions
@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Dec 28, 2025

Deploying issueflow with  Cloudflare Pages  Cloudflare Pages

Latest commit: fb05d15
Status: ✅  Deploy successful!
Preview URL: https://13a59f65.issueflow.pages.dev
Branch Preview URL: https://feature-125-interactive-prev.issueflow.pages.dev

View logs

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Dec 28, 2025

Caution

Review failed

The pull request is closed.

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'instructions'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

Adds a two-sided flip-card UX to issue cards with accessible body previews, a responsive IssueCardSkeleton loading component, body support in the GitHubIssue model plus helper utilities, and refactors filter/help tooltips into modal-based dialogs with reduced-motion handling. (≤50 words)

Changes

Cohort / File(s) Summary
Issue Card Flip Feature
src/components/results/IssueCard.svelte, src/components/results/ResultsContainer.svelte
Implements card flip state/UI (front/back faces, flip button, screen-reader live region), body preview and copy/view actions in IssueCard; ResultsContainer supplies flip CSS (perspective, transforms, z-index), hover/focus visuals, reduced-motion pathways, and flip-button styling.
Loading Skeleton
src/components/results/IssueCardSkeleton.svelte, src/components/results/index.ts
Adds IssueCardSkeleton component (mobile/desktop variants, shimmer, count & showLabels props) and exports it from the results index.
Data Model & Utilities
src/lib/github-graphql.ts, src/lib/issue-utils.ts, tests/issue-utils.test.ts
Adds body: string to GitHubIssue and queries/maps it; introduces getBodyPreview(issue, maxLength) and hasBody(issue) utilities; test mocks updated with body.
Filter & Help Modal Refactor
src/components/shared/FilterBuilder.svelte, src/components/shared/FilterHelpTooltip.svelte
Replaces inline add-filter menu and tooltip with modal/dialog overlays rendered at document body level; implements modal keyboard/backdrop handling, ARIA semantics, type/value flow, and focus/escape behavior.
Minor Semantic Change
src/components/results/SearchForm.svelte
Replaced a label with a span for the Advanced Filters header (semantic-only change).

Sequence Diagram(s)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

Possibly related PRs

Pre-merge checks and finishing touches

✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main feature: interactive issue preview cards with animations, relating directly to the core changes in the changeset.
Description check ✅ Passed The PR description provides a comprehensive summary of changes, includes the required test plan, and references issue #125. Although the full template checklist is not explicitly marked, the description covers the essential elements: summary, type of change (new feature), testing details, and additional context.
Linked Issues check ✅ Passed All acceptance criteria from issue #125 are met: hover animation effects implemented [ResultsContainer.svelte], card flip animation implemented [IssueCard.svelte, ResultsContainer.svelte], skeleton animations added [IssueCardSkeleton.svelte], and reduced-motion preferences respected [ResultsContainer.svelte].
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #125 requirements. Modifications to FilterHelpTooltip, FilterBuilder, and SearchForm support improved UX/accessibility alongside the card flip feature without introducing unrelated functionality.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between beeb4d8 and fb05d15.

📒 Files selected for processing (2)
  • src/components/shared/FilterBuilder.svelte
  • src/components/shared/FilterHelpTooltip.svelte

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (4)
src/components/shared/FilterHelpTooltip.svelte (2)

107-114: Modal implementation looks good, but consider removing redundant keydown handler.

The onkeydown={handleKeydown} on the backdrop div (line 113) is redundant since Escape handling is already registered at the document level via $effect (lines 66-75). Both will fire when Escape is pressed.

Additionally, this modal lacks focus trapping—users can Tab outside the modal to background elements. For a help modal this is low risk, but for full WCAG 2.4.3 compliance, consider trapping focus.

🔎 Remove redundant keydown handler
   <div
     class="fixed inset-0 bg-black/70 backdrop-blur-sm z-50 flex items-center justify-center p-4"
     onclick={closeTooltip}
-    onkeydown={handleKeydown}
   >

78-105: LGTM with minor ARIA suggestion.

The trigger button accessibility is well-implemented with aria-expanded and aria-label. However, aria-describedby (line 87) typically describes the element itself, not what it controls. For a button that opens a dialog, aria-controls is more semantically appropriate.

🔎 Consider using aria-controls instead
   onclick={toggleTooltip}
-  aria-describedby={show ? tooltipId : undefined}
+  aria-controls={tooltipId}
   aria-expanded={show}
src/components/shared/FilterBuilder.svelte (2)

139-167: handleClickOutside is now dead code with the modal pattern.

With the new full-screen modal overlay, clicks outside the modal content hit the backdrop, which directly calls resetAddForm via onclick={resetAddForm} (line 249). The handleClickOutside function and its document event listener registration (lines 159-167) are no longer reached and can be removed.

🔎 Remove dead code
-  /**
-   * Handle click outside to close menu
-   */
-  function handleClickOutside(event: MouseEvent): void {
-    if (addMenuRef && !addMenuRef.contains(event.target as Node)) {
-      if (showAddMenu && !selectedFilterType) {
-        resetAddForm();
-      }
-    }
-  }

   // ... other code ...

-  // Close menu on outside click
-  $effect(() => {
-    if (showAddMenu) {
-      document.addEventListener('click', handleClickOutside);
-      return () => {
-        document.removeEventListener('click', handleClickOutside);
-      };
-    }
-  });

279-291: Consider removing role="menuitem" from type buttons.

If changing the container from role="menu" to role="dialog" (as suggested above), the role="menuitem" on these buttons becomes invalid and should be removed. Regular buttons inside a dialog don't need special roles.

🔎 Remove role="menuitem"
             <button
               type="button"
               class="type-btn px-2 py-1 rounded text-xs
                    bg-slate-700 text-slate-300 border border-slate-600
                    hover:bg-slate-600 hover:text-white
                    focus:outline-none focus:ring-1 focus:ring-teal-500
                    transition-colors"
               onclick={() => selectFilterType(type)}
-              role="menuitem"
             >
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a2b60df and 3bdfb42.

📒 Files selected for processing (9)
  • src/components/results/IssueCard.svelte
  • src/components/results/IssueCardSkeleton.svelte
  • src/components/results/ResultsContainer.svelte
  • src/components/results/SearchForm.svelte
  • src/components/results/index.ts
  • src/components/shared/FilterBuilder.svelte
  • src/components/shared/FilterHelpTooltip.svelte
  • src/lib/github-graphql.ts
  • src/lib/issue-utils.ts
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Maintain TypeScript strict mode across all TypeScript files

Files:

  • src/lib/github-graphql.ts
  • src/lib/issue-utils.ts
  • src/components/results/index.ts
**/*.{svelte,astro,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use UnoCSS with Tailwind-compatible syntax for styling

Files:

  • src/lib/github-graphql.ts
  • src/lib/issue-utils.ts
  • src/components/results/IssueCardSkeleton.svelte
  • src/components/results/index.ts
  • src/components/results/SearchForm.svelte
  • src/components/shared/FilterBuilder.svelte
  • src/components/results/IssueCard.svelte
  • src/components/shared/FilterHelpTooltip.svelte
  • src/components/results/ResultsContainer.svelte
**/*.{js,ts,tsx,svelte,astro}

📄 CodeRabbit inference engine (CLAUDE.md)

Ensure ESLint linting passes with 0 errors (run npm run lint)

Files:

  • src/lib/github-graphql.ts
  • src/lib/issue-utils.ts
  • src/components/results/IssueCardSkeleton.svelte
  • src/components/results/index.ts
  • src/components/results/SearchForm.svelte
  • src/components/shared/FilterBuilder.svelte
  • src/components/results/IssueCard.svelte
  • src/components/shared/FilterHelpTooltip.svelte
  • src/components/results/ResultsContainer.svelte
**/*.{js,ts,tsx,svelte,astro,json,md}

📄 CodeRabbit inference engine (CLAUDE.md)

Format all code with Prettier including Svelte/Astro plugins (run npm run format)

Files:

  • src/lib/github-graphql.ts
  • src/lib/issue-utils.ts
  • src/components/results/IssueCardSkeleton.svelte
  • src/components/results/index.ts
  • src/components/results/SearchForm.svelte
  • src/components/shared/FilterBuilder.svelte
  • src/components/results/IssueCard.svelte
  • src/components/shared/FilterHelpTooltip.svelte
  • src/components/results/ResultsContainer.svelte
src/lib/github-graphql.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Use GitHub GraphQL API for issue discovery as implemented in src/lib/github-graphql.ts

Files:

  • src/lib/github-graphql.ts
**/*.svelte

📄 CodeRabbit inference engine (CLAUDE.md)

Use Svelte 5 runes ($state, $derived, $effect) for reactive state management

Files:

  • src/components/results/IssueCardSkeleton.svelte
  • src/components/results/SearchForm.svelte
  • src/components/shared/FilterBuilder.svelte
  • src/components/results/IssueCard.svelte
  • src/components/shared/FilterHelpTooltip.svelte
  • src/components/results/ResultsContainer.svelte
🧠 Learnings (1)
📚 Learning: 2025-12-27T04:07:21.626Z
Learnt from: CR
Repo: VibeTensor/IssueFlow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-27T04:07:21.626Z
Learning: Applies to src/lib/github-graphql.ts : Use GitHub GraphQL API for issue discovery as implemented in `src/lib/github-graphql.ts`

Applied to files:

  • src/lib/github-graphql.ts
  • src/lib/issue-utils.ts
  • src/components/results/IssueCard.svelte
🧬 Code graph analysis (1)
src/lib/issue-utils.ts (1)
src/lib/github-graphql.ts (1)
  • GitHubIssue (15-46)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (17)
src/components/results/SearchForm.svelte (1)

515-532: Good accessibility fix.

Changing the orphan <label> to a <span> is correct. The previous <label> had no associated form control (no for attribute, no wrapped input), which is invalid HTML and confusing for screen readers. The <span> maintains the visual appearance while being semantically appropriate for a section header.

src/lib/issue-utils.ts (2)

321-363: Well-implemented body preview with good markdown stripping.

The implementation handles common markdown elements effectively, and the word-boundary truncation at 70% threshold is a nice touch to avoid awkward cuts.

One minor edge case: bodies consisting entirely of code blocks will result in just [code] as the preview. This is acceptable for a preview feature.


365-373: Clean utility function.

The hasBody function is concise and correctly uses optional chaining with Boolean() for a clean boolean return.

src/lib/github-graphql.ts (2)

15-46: Body field addition is well-integrated.

The body: string field is correctly added to the interface, and the GraphQL query includes it. The type consistency is maintained across the codebase.


330-347: REST API mapping correctly defaults body to empty string.

Using issue.body || '' (line 335) ensures the field is always a string, preventing null/undefined propagation to consumers like getBodyPreview and hasBody.

src/components/results/index.ts (1)

1-34: Clean barrel export addition.

The IssueCardSkeleton export follows the established pattern, and the documentation comments are updated to reflect the new component in the hierarchy.

src/components/results/IssueCardSkeleton.svelte (2)

10-22: Good use of Svelte 5 runes for props and derived state.

Using $props() and $derived follows the coding guidelines for Svelte 5 reactive state management. The skeleton array generation is clean and efficient.


24-101: Well-structured skeleton with proper accessibility.

The skeleton correctly uses aria-hidden="true" and role="presentation" to hide from screen readers—this is the right pattern for decorative loading indicators. The responsive layout (mobile/desktop variants) mirrors the actual IssueCard structure for smooth visual transitions when content loads.

src/components/results/IssueCard.svelte (4)

86-105: Minor: Flip button aria-label on front face uses inverse logic.

The flip button on the front face (line 92) has aria-label={isFlipped ? 'Show issue front' : 'Show issue details'}. Since this button is on the front face (visible when !isFlipped), the label will always be "Show issue details" when the button is visible, which is correct. The ternary handles the case where the component re-renders while animating. The implementation is fine.


346-406: Back face implementation is well-structured.

The back face properly displays the body preview with line-clamp-5 for overflow handling, includes navigation back to front, and provides the "Read Full Issue" link. The comment count context helps users understand engagement level.


64-75: Excellent accessibility for flip state announcements.

The screen reader announcement with aria-live="polite" and aria-atomic="true" properly notifies assistive technology users when the card flips. Conditionally rendering only when issueHasBody prevents unnecessary announcements for non-flippable cards.


77-85: Flip animation CSS classes are properly defined in ResultsContainer.svelte.

All required classes (card-flip-container, card-flip-inner, card-front, card-back, and flip-button) are defined with the necessary 3D transform properties (perspective, transform-style: preserve-3d, rotateY transforms) and GPU optimizations (will-change on hover/focus-within, backface-visibility with vendor prefixes, and :has() selector for z-index control).

src/components/results/ResultsContainer.svelte (5)

956-962: Excellent will-change optimization!

Applying will-change: transform only during hover and focus-within interactions (rather than persistently) is a performance best practice. This avoids unnecessary GPU memory allocation while still optimizing for the flip animation when needed.


971-972: Good cross-browser backface-visibility implementation.

Using both the -webkit- prefixed and standard backface-visibility properties ensures GPU acceleration for the flip animation works across different browser engines. This will provide smooth 3D transforms.


987-1021: Strong accessibility implementation for flip button.

The flip button includes proper ARIA semantics (aria-pressed), clear focus indicators (focus-visible), visual feedback states (hover, active), and appropriate keyboard support. This ensures the flip interaction is accessible to all users.


1284-1307: Excellent reduced-motion accessibility implementation.

The reduced-motion media query properly disables decorative animations, removes transitions from flip elements, and simplifies the hover effect while maintaining functionality. The instant flip (Line 1306) without animation is the correct approach for users who prefer reduced motion.


947-949: No action required: :has() selector is appropriate for this project's scope.

The :has() pseudo-class is well-supported in all modern browsers and aligns with this project's target environment. Astro 5, Svelte 5, and the Node >= 18.0 requirement indicate a modern browser baseline. Even if unsupported in rare cases, the z-index enhancement gracefully degrades—flipped cards continue functioning, just without the stacking optimization. No fallback is needed.

Comment thread src/components/shared/FilterBuilder.svelte
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

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

⚠️ Outside diff range comments (1)
tests/issue-utils.test.ts (1)

8-17: Add test coverage for getBodyPreview and hasBody utilities.

The utilities getBodyPreview and hasBody are exported from src/lib/issue-utils.ts but lack corresponding tests in this file. Per coding guidelines, unit tests should be written for all utilities using Vitest. The existing mock issue helper already includes a body property, making it straightforward to implement these tests.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3bdfb42 and e2707b6.

📒 Files selected for processing (1)
  • tests/issue-utils.test.ts
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Maintain TypeScript strict mode across all TypeScript files

Files:

  • tests/issue-utils.test.ts
**/*.{svelte,astro,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use UnoCSS with Tailwind-compatible syntax for styling

Files:

  • tests/issue-utils.test.ts
**/*.{js,ts,tsx,svelte,astro}

📄 CodeRabbit inference engine (CLAUDE.md)

Ensure ESLint linting passes with 0 errors (run npm run lint)

Files:

  • tests/issue-utils.test.ts
**/*.{js,ts,tsx,svelte,astro,json,md}

📄 CodeRabbit inference engine (CLAUDE.md)

Format all code with Prettier including Svelte/Astro plugins (run npm run format)

Files:

  • tests/issue-utils.test.ts
tests/**/*.test.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Write unit tests for utilities and API functions using Vitest

Files:

  • tests/issue-utils.test.ts
🧠 Learnings (1)
📚 Learning: 2025-12-27T04:07:21.626Z
Learnt from: CR
Repo: VibeTensor/IssueFlow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-27T04:07:21.626Z
Learning: Applies to src/lib/github-graphql.ts : Use GitHub GraphQL API for issue discovery as implemented in `src/lib/github-graphql.ts`

Applied to files:

  • tests/issue-utils.test.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (1)
tests/issue-utils.test.ts (1)

30-30: LGTM: Body field correctly added to mock.

The body property aligns the mock with the updated GitHubIssue type and supports the new body-related utilities introduced in this PR.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/components/shared/FilterBuilder.svelte (2)

244-260: Modal lacks focus management and focus trap.

The modal opens without moving focus to the dialog, and there's no focus trap to prevent users from tabbing to elements behind the backdrop. Additionally, onkeydown on the backdrop div (line 250) won't reliably receive keyboard events since the div isn't focusable.

Consider:

  1. Move focus to the first focusable element (e.g., NOT button) when modal opens using an $effect.
  2. Move onkeydown to the dialog element (line 252) or add tabindex="-1" to the dialog and focus it.
  3. Optionally implement a focus trap for full modal accessibility.
🔎 Proposed fix for focus management
   let valueInputRef = $state<HTMLInputElement | null>(null);
+  let dialogRef = $state<HTMLDivElement | null>(null);

+  // Focus management for modal
+  $effect(() => {
+    if (showAddMenu && dialogRef) {
+      dialogRef.focus();
+    }
+  });

Then update the dialog element:

     <div
+      bind:this={dialogRef}
       class="add-filter-menu flex flex-wrap items-center gap-2 p-3 rounded-lg
              bg-slate-800 border border-slate-600 shadow-2xl shadow-black/50
              max-w-md w-full"
       role="dialog"
       aria-modal="true"
       aria-label="Add filter"
+      tabindex="-1"
       onclick={(e) => e.stopPropagation()}
+      onkeydown={handleAddMenuKeydown}
     >

And remove onkeydown from the backdrop (line 250).


159-167: Consider removing redundant click-outside handler.

The handleClickOutside effect and function (lines 139-145, 159-167) check against addMenuRef which is bound to the button container, not the modal. Since the modal now handles click-outside via the backdrop's onclick={resetAddForm} (line 249), this document-level listener appears to be leftover from the previous inline menu implementation.

Additionally, the condition showAddMenu && !selectedFilterType (line 141) would only close the modal if no filter type is selected, which is inconsistent with the backdrop click behavior that always closes.

🔎 Proposed cleanup
-  /**
-   * Handle click outside to close menu
-   */
-  function handleClickOutside(event: MouseEvent): void {
-    if (addMenuRef && !addMenuRef.contains(event.target as Node)) {
-      if (showAddMenu && !selectedFilterType) {
-        resetAddForm();
-      }
-    }
-  }

   // ... other code ...

-  // Close menu on outside click
-  $effect(() => {
-    if (showAddMenu) {
-      document.addEventListener('click', handleClickOutside);
-      return () => {
-        document.removeEventListener('click', handleClickOutside);
-      };
-    }
-  });

The addMenuRef binding (line 212) can also be removed if no longer needed.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e2707b6 and beeb4d8.

📒 Files selected for processing (1)
  • src/components/shared/FilterBuilder.svelte
🧰 Additional context used
📓 Path-based instructions (4)
**/*.svelte

📄 CodeRabbit inference engine (CLAUDE.md)

Use Svelte 5 runes ($state, $derived, $effect) for reactive state management

Files:

  • src/components/shared/FilterBuilder.svelte
**/*.{svelte,astro,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use UnoCSS with Tailwind-compatible syntax for styling

Files:

  • src/components/shared/FilterBuilder.svelte
**/*.{js,ts,tsx,svelte,astro}

📄 CodeRabbit inference engine (CLAUDE.md)

Ensure ESLint linting passes with 0 errors (run npm run lint)

Files:

  • src/components/shared/FilterBuilder.svelte
**/*.{js,ts,tsx,svelte,astro,json,md}

📄 CodeRabbit inference engine (CLAUDE.md)

Format all code with Prettier including Svelte/Astro plugins (run npm run format)

Files:

  • src/components/shared/FilterBuilder.svelte
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (3)
src/components/shared/FilterBuilder.svelte (3)

211-242: LGTM!

The add filter button implementation is clean with proper disabled state handling and accessible SVG markup.


262-335: LGTM!

The modal content implementation is well-structured with proper accessibility attributes (aria-pressed on the NOT toggle), dynamic placeholders for context-aware input hints, and appropriate disabled state handling on the Add button.


337-361: LGTM!

Cancel button has proper accessibility with aria-label and hidden decorative SVG.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Interactive Issue Preview Card with Animations

1 participant