+
+
-
-
- {['gender', 'age', 'pitch', 'accent', 'lang'].map((dim) => (
-
- ))}
-
-
-
-
+ ))}
+
+
}
+ trailing={
+ advancedFilterCount > 0 ? (
+
+ {advancedFilterCount}
+
+ ) : null
+ }
+ aria-expanded={filtersOpen}
+ onClick={() => setFiltersOpen((open) => !open)}
+ >
+ {t('gallery.filters', { defaultValue: 'Filters' })}
+
-
}
- onClick={() => {
- resetFilters();
- setFavOnly(false);
- }}
- >
- {t('gallery.reset', { defaultValue: 'Reset' })}
-
+ {hasActiveFilters(filters) || favOnly ? (
+
+ ) : null}
+
+ , title: 'Grid' },
+ { value: 'list', label:
, title: 'List' },
+ ]}
+ />
+
-
, title: 'Grid' },
- { value: 'list', label:
, title: 'List' },
- ]}
- />
+ {filtersOpen ? (
+
+ {['gender', 'age', 'pitch', 'accent', 'lang'].map((dim) => (
+
+ ))}
+
+
+ ) : null}
{showFeatured && (
diff --git a/frontend/src/components/gallery/ArchetypesZone.test.jsx b/frontend/src/components/gallery/ArchetypesZone.test.jsx
new file mode 100644
index 00000000..48ae3250
--- /dev/null
+++ b/frontend/src/components/gallery/ArchetypesZone.test.jsx
@@ -0,0 +1,94 @@
+import React from 'react';
+import { describe, expect, it, vi } from 'vitest';
+import { fireEvent, render, screen } from '@testing-library/react';
+
+import ArchetypesZone from './ArchetypesZone';
+import ArchetypeCard from './ArchetypeCard';
+
+vi.mock('../../api/hooks', () => ({
+ useArchetypeCategories: () => ({
+ data: [
+ { id: 'narration', name: 'Narration & Story', icon: 'BookOpen' },
+ { id: 'social', name: 'Social Media', icon: 'Radio' },
+ ],
+ }),
+ useArchetypes: (filters) => ({
+ data: filters.featured ? { items: [] } : { items: [], total: 0 },
+ isLoading: false,
+ isFetching: false,
+ }),
+}));
+
+const t = (_key, options = {}) => options.defaultValue || _key;
+
+const baseProps = {
+ t,
+ filters: {
+ use_case: null,
+ gender: null,
+ age: null,
+ pitch: null,
+ accent: null,
+ whisper: null,
+ lang: null,
+ },
+ setFilter: vi.fn(),
+ resetFilters: vi.fn(),
+ favorites: [],
+ toggleFavorite: vi.fn(),
+ viewMode: 'grid',
+ setViewMode: vi.fn(),
+ playingId: null,
+ loadingPreviewId: null,
+ onPreview: vi.fn(),
+ onUse: vi.fn(),
+ onDesign: vi.fn(),
+};
+
+describe('ArchetypesZone filter toolbar', () => {
+ it('keeps categories in one menu and reveals advanced filters on demand', () => {
+ const setFilter = vi.fn();
+ render(