--- name: fantasia-icon-picker description: >- Reusable FaIconPickerInput element and src/scripts/faIcons catalogs: merged MDI / Font Awesome / Material icon grid, lazy load, search, and q-icon name storage. Use when adding icon fields, regenerating icon catalogs, or wiring the picker into dialogs and forms. --- # Fantasia Archive — FaIconPickerInput ## When to use **`FaIconPickerInput`** for single **q-icon name** (**`mdi-account`**, **`fa-solid fa-dragon`**, **`person`**) via **`v-model`**. No one-off icon grids in feature dialogs — import **`src/components/elements/FaIconPickerInput/`**. **First consumer:** **Project Settings → Document Templates** — optional **`icon`** (**`DialogProjectSettingsDocumentTemplatesDetailPanel.vue`**). ## Public API (SFC) ```vue ``` | Prop | Role | | --- | --- | | **`modelValue`** | Selected q-icon name (may be empty) | | **`testLocator`** | Root **`data-test-locator`**; trigger **`{testLocator}-trigger`**, menu **`{testLocator}-menu`** | | **`defaultIcon`** | Preview when empty (default **`mdi-file-outline`** — **`FA_ICON_PICKER_EMPTY_PLACEHOLDER_ICON`**) | **Emit:** **`update:modelValue`**. **Test hooks:** **`data-test-icon-name`** on trigger when set; grid cells **`data-test-icon-name`** + **`data-test-locator="…-iconCell"`**. **i18n:** **`faIconPickerInput.*`** from **`i18n//components/elements/FaIconPickerInput/L_FaIconPickerInput.ts`**. Mirror keys in **`externalFileLoader.ts`**. ## UX behavior - **Trigger:** round **`q-btn`**, two-line tooltip - **Menu:** search (autofocus on open), merged catalog, **`QVirtualScroll`** 16-icon rows - **Load:** all packs parallel on first open, merge + dedupe + sort A–Z, session cache - **Search:** debounced **`FA_ICON_PICKER_SEARCH_DEBOUNCE_MS`** (150 ms) - **Cells:** flat **`q-btn`** (not round); selected = primary icon color only ## File map | Area | Path | | --- | --- | | SFC + menu | **`FaIconPickerInput.vue`**, **`FaIconPickerInputMenuPanel.vue`** | | Composable | **`scripts/faIconPickerInput_manager.ts`**, **`faIconPickerInputComposableWiring.ts`** | | Styles | **`styles/_variables.scss`**, **`styles/FaIconPickerInput.*.unscoped.scss`** | | Types + layout | **`types/I_faIconPickerInput.ts`** (**`FA_ICON_PICKER_ICONS_PER_ROW`**, **`FA_ICON_PICKER_VIRTUAL_ROW_HEIGHT_PX`** sync with SCSS) | | Level-1 catalog | **`src/scripts/faIcons/functions/`** | | Level-2 wiring | **`faIconPickerMergedCatalogLoadWiring.ts`**, **`faIconPickerCatalogLazyLoadWiring.ts`** | | Catalogs | **`src/scripts/faIcons/catalogs/*.catalog.json`** | | Generator | **`.utility-scripts/generateFaQuasarIconCatalogs.mjs`** → **`yarn generate:icon-catalogs`** | | Storybook | **`_tests/FaIconPickerInput.stories.ts`** | ## Icon packs | Pack | Examples | | --- | --- | | **`mdi-v7`** | **`mdi-account`**, **`mdi-file-outline`** | | **`fontawesome-v6`** | **`fa-solid fa-user`**, **`fa-brands fa-github`** | | **`material-icons`** | **`person`**, **`home`** | **`loadFaIconPickerMergedCatalogAsync`** loads **`FA_ICON_PICKER_PACK_IDS`**, then **`mergeFaIconPickerCatalogSlices`**. ## Regenerating catalogs After **`@quasar/extras`** or **`quasar.config.ts`** icon set changes: 1. **`yarn generate:icon-catalogs`** 2. Commit **`src/scripts/faIcons/catalogs/*.catalog.json`** 3. **Full** **`yarn testbatch:verify`** before commit (catalog regen touches broad lint/coverage surface) Prefer regenerate over hand-editing thousands of lines. ## Adding to a new screen 1. Import **`FaIconPickerInput`** 2. **`v-model`** draft string (persist q-icon name in SQLite/store) 3. Unique **`test-locator`**; extend Playwright **`selectorList`** if user-facing 4. Parent may add **`faIconPickerInput__field`** + feature BEM 5. Stub in colocated Vitest when testing parent layout only ## Two-level layout - **Level 1:** **`src/scripts/faIcons/functions/*.ts`** — pure transforms - **Level 2:** **`faIconPickerInput_manager.ts`** wires Vue + catalog loaders See [fantasia-two-level-architecture](../fantasia-two-level-architecture/SKILL.md). ## Tests | Suite | Location | | --- | --- | | Vitest (SFC) | **`FaIconPickerInput/_tests/FaIconPickerInput.vitest.test.ts`** | | Vitest (composable) | **`scripts/_tests/createUseFaIconPickerInput.vitest.test.ts`** | | Vitest (faIcons) | **`src/scripts/faIcons/_tests/`** | | Playwright | **`DialogProjectSettings.playwright.test.ts`** | ## Related - [fa-icon-picker.mdc](../../rules/fa-icon-picker.mdc) - [fantasia-quasar-vue](../fantasia-quasar-vue/SKILL.md)