diff --git a/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript b/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript
index 497b9ec..37a1dfa 100755
--- a/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript
+++ b/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript
@@ -549,3 +549,40 @@ plugin.tx_solr.search.faceting {
}
}
}
+
+# =============================================================================
+# Autocomplete endpoint: GET /search?type=7384&tx_solr[queryString]=
+# Lean JSON page type (no page envelope) for type-ahead in the React search
+# field. Response: { suggestions: {term: count}, suggestion, documents[],
+# didSecondSearch }.
+# 10 is deliberately USER_INT, not USER as in the shipped example: the example
+# predates TYPO3 v14 (config.no_cache is gone), and a cached USER would pin
+# the first query's suggestions for every later request.
+# =============================================================================
+tx_solr_suggest = PAGE
+tx_solr_suggest {
+ typeNum = 7384
+ config {
+ disableAllHeaderCode = 1
+ additionalHeaders.10.header = Content-Type: application/json; charset=utf-8
+ }
+
+ 10 = USER_INT
+ 10 {
+ userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
+ extensionName = Solr
+ pluginName = pi_suggest
+ vendorName = ApacheSolrForTypo3
+ controller = Suggest
+ action = suggest
+ }
+}
+
+plugin.tx_solr.suggest = 1
+plugin.tx_solr.suggest {
+ numberOfSuggestions = 8
+ suggestField = spell
+ # term suggestions only: the built-in top-results carry the raw document
+ # type and the full indexed content - too fat and off-contract for type-ahead
+ showTopResults = 0
+}
diff --git a/packages/vitec/Documentation/Headless-JSON-Architecture.md b/packages/vitec/Documentation/Headless-JSON-Architecture.md
index 789f759..e5ef0d0 100755
--- a/packages/vitec/Documentation/Headless-JSON-Architecture.md
+++ b/packages/vitec/Documentation/Headless-JSON-Architecture.md
@@ -25,7 +25,7 @@
| 1.9 | 2026‑08‑15 | **Interface change, partly breaking.** The four list plugins were unified: every one of them now emits an object carrying `layout`, the new `showToolbar` flag and its payload array. `vitec_usecaselist` and `vitec_productlist` previously emitted a **bare array** — front ends reading them have to move one level down (7.3, 7.14, 8). New plugin **`vitec_solutionlist`** (`SolutionListJsonRenderer`, key `solutions`), the counterpart 7.13.2 had been asking for since v1.2. `tx_vitec_domain_model_usecase` gained `detail_page`, emitted as the resolved `detailUrl` in the story card shape and therefore also in the `vitec_modelcard` story branch, which had carried no link at all until now. Noted: `vitec_productlist` had a configurable `layout` that was never serialised, and its vocabulary (`0`–`3`) differs from the other lists. |
| 1.10 | 2026‑08‑18 | **Interface change (additive).** `tx_vitec_domain_model_product` gained five fields: `heroimage` (multiple FAL images, detail payload only), the richtext fields `description2`, `capabilities` and `textrelatedproducts`, and `portfolio` (TCA `link`) — emitted as a **resolved URL** through the new `LinkResolver::typolinkUrl()`. The product payloads are specified for the first time (7.15). Links in `contentelement` / `contentelementcta` that point at a **container** now resolve its children (`items`, page‑level shape) and `background` (7.4). Two record link handlers (`download`, `product`) added to the link browser, resolved server‑side per the new Clause 9.12; new middleware `vitec/download-file` streams `/download/file/` as a forced download (5.3), file lookup consolidated into `DownloadFileResolver` — first step towards the B‑4 target (10.2). Backend‑only: `relatedprodukt` moved from the Misc tab to General. Editorial: the document footer had been stuck at v1.7 since v1.8. |
| 1.11 | 2026‑08‑21 | **New interface: site search.** Apache Solr 10 (dedicated VPS behind an HTTPS reverse proxy) with `apache-solr-for-typo3/solr` 14.0.0-RC1. The EXT:solr results plugin `solr_pi_results` on the search page is rendered headless by `SearchJsonRenderer` (payload key `search`) - request/response contract in the new Clause 7.16. Indexed corpus: pages plus product, market (`detail_page` only), use-case, news and download records; result `type` vocabulary `page\|product\|market\|story\|news\|download`. Downloads gained the canonical route `/download/` (uid route kept for the record links) and `private_download` is now enforced by `DownloadFileResolver` (5.3, 9.12). The VITEC Set now declares the solr set as a dependency - overriding a foreign set’s TypoScript requires loading after it (5.2). Editorial: the header table had been stuck at v1.9 since v1.10. |
-| 1.12 | 2026‑08‑24 | **Interface change (additive).** The search endpoint (7.16) gained a type filter and facet counts: request parameter `filter` (a value from the `type` vocabulary; the natural name `type` is unavailable - it is TYPO3’s reserved page-type parameter), response keys `filter` (active filter or null) and `facets.type` (per-type document counts with `active` flags; counts stay complete while a filter is active, except when the filtered result is empty). Editorial baseline of 76 managed synonyms imported into `core_en` (codecs, acquired-brand names such as `exterity => avedia`, UK/US spellings, common misspellings) - synonyms apply at query time, no re-index. |
+| 1.12 | 2026‑08‑24 | **Interface change (additive).** The search endpoint (7.16) gained a type filter and facet counts: request parameter `filter` (a value from the `type` vocabulary; the natural name `type` is unavailable - it is TYPO3’s reserved page-type parameter), response keys `filter` (active filter or null) and `facets.type` (per-type document counts with `active` flags; counts stay complete while a filter is active, except when the filtered result is empty). Editorial baseline of 76 managed synonyms imported into `core_en` (codecs, acquired-brand names such as `exterity => avedia`, UK/US spellings, common misspellings) - synonyms apply at query time, no re-index. New autocomplete endpoint: the EXT:solr suggest plugin as lean JSON page type 7384, deliberately USER_INT (7.16). |
This document is drafted in the style of, and adopts the terminology conventions of,
ISO/IEC/IEEE 42010 (architecture description), ISO/IEC/IEEE 26514 (information for
@@ -974,6 +974,24 @@ hideonwebsite = 0`). Solutions are not indexed until they carry slugs or detail
pages. Ranking boosts products (^10) and stories (^2). Every executed search is
logged to `tx_solr_statistics` with the last two IP octets masked.
+**Autocomplete.** `GET /search?type=7384&tx_solr[queryString]=` answers as
+a lean JSON page type without the page envelope:
+
+```json
+{ "suggestions": { "encoder": 118, "encoding": 171 },
+ "suggestion": "enc", "documents": [], "didSecondSearch": false }
+```
+
+Term completions come from the index (spell field) with document counts;
+synonyms and all indexed types are reflected automatically. The plugin is
+wired as **USER_INT** - the example shipped with EXT:solr predates TYPO3 v14
+(`config.no_cache` no longer exists), and a cached USER would pin the first
+query’s suggestions for every later request. Front ends should debounce
+(~200 ms), start at 2-3 characters, and turn a picked suggestion into a
+regular `/search?q=` request. Top-result documents are deliberately disabled
+(`showTopResults = 0`): their shape is hardcoded upstream and carries the raw
+document type and the full indexed content.
+
**Operations.** Indexing runs automatically: record and page saves enter the
index queue, a scheduler task (Index Queue Worker, every 5 minutes) pushes them
to Solr; the CLI command `vitec:solr-index` (with `--initialize` and `--debug`)