{
  "$generated": "by scripts/gen-manifest.mjs — do not edit; drift-gated (pnpm gen:manifest:check)",
  "package": "@stapel/categories-react",
  "version": "0.36.0",
  "backend": {
    "module": "stapel-categories",
    "contract": ">=0.25 <0.26"
  },
  "layers": [
    "api",
    "model",
    "flows",
    "headless",
    "i18n"
  ],
  "flows": {},
  "machines": [],
  "operations": {
    "categories_api_v1_categories_bulk_add_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/bulk_add/",
      "tag": "Categories",
      "request": null,
      "response": "BulkUpdateResponse"
    },
    "categories_api_v1_categories_bulk_commands_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/bulk-commands/",
      "tag": "Categories",
      "request": "CategoryBulkCommand",
      "response": null
    },
    "categories_api_v1_categories_by_slug_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/categories/by-slug/{slug}/",
      "tag": "Categories",
      "request": null,
      "response": "Category"
    },
    "categories_api_v1_categories_carousel_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/carousel/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_children_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/children/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/",
      "tag": "Categories",
      "request": "CategoryStaff",
      "response": "CategoryStaff"
    },
    "categories_api_v1_categories_data.json_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/data.json/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_deleted_children_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/deleted-children/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_destroy": {
      "method": "DELETE",
      "path": "/categories/api/v1/categories/{id}/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_feature_editor_apply_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/{id}/feature-editor/apply/",
      "tag": "Feature Editor",
      "request": "FeatureEditorApply",
      "response": "FeatureEditorState"
    },
    "categories_api_v1_categories_feature_editor_draft_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/{id}/feature-editor/draft/",
      "tag": "Feature Editor",
      "request": "FeatureEditorDraft",
      "response": "FeatureEditorDraftResponse"
    },
    "categories_api_v1_categories_feature_editor_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/feature-editor/",
      "tag": "Feature Editor",
      "request": null,
      "response": "FeatureEditorState"
    },
    "categories_api_v1_categories_features_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/features/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_links_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/{id}/links/",
      "tag": "Categories",
      "request": "CategoryLink",
      "response": "CategoryLink"
    },
    "categories_api_v1_categories_links_destroy": {
      "method": "DELETE",
      "path": "/categories/api/v1/categories/{id}/links/{target_pk}/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_links_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/links/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/",
      "tag": "Categories",
      "request": null,
      "response": "PaginatedCategoryList"
    },
    "categories_api_v1_categories_partial_update": {
      "method": "PATCH",
      "path": "/categories/api/v1/categories/{id}/",
      "tag": "Categories",
      "request": "PatchedCategoryStaff",
      "response": "CategoryStaff"
    },
    "categories_api_v1_categories_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/",
      "tag": "Categories",
      "request": null,
      "response": "Category"
    },
    "categories_api_v1_categories_revision_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/categories/revision/",
      "tag": "Categories",
      "request": null,
      "response": "MaxRevision"
    },
    "categories_api_v1_categories_roots_list": {
      "method": "GET",
      "path": "/categories/api/v1/categories/roots/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "categories_api_v1_categories_undelete_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/{id}/undelete/",
      "tag": "Categories",
      "request": "Category",
      "response": "UndeleteResponse"
    },
    "categories_api_v1_categories_update": {
      "method": "PUT",
      "path": "/categories/api/v1/categories/{id}/",
      "tag": "Categories",
      "request": "CategoryStaff",
      "response": "CategoryStaff"
    },
    "categories_api_v1_categories_validate_configs_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/categories/{id}/validate-configs/",
      "tag": "Categories",
      "request": null,
      "response": "ValidationBatchResult"
    },
    "categories_api_v1_categories_validate_dto_create": {
      "method": "POST",
      "path": "/categories/api/v1/categories/{id}/validate-dto/",
      "tag": "Categories",
      "request": "ValidateDtoRequest",
      "response": "ValidationBatchResult"
    },
    "categories_api_v1_features_bulk_add_create": {
      "method": "POST",
      "path": "/categories/api/v1/features/bulk_add/",
      "tag": "Features",
      "request": null,
      "response": "BulkUpdateResponse"
    },
    "categories_api_v1_features_convert_type_create": {
      "method": "POST",
      "path": "/categories/api/v1/features/{id}/convert-type/",
      "tag": "Features",
      "request": "FeatureConvertType",
      "response": "Feature"
    },
    "categories_api_v1_features_create": {
      "method": "POST",
      "path": "/categories/api/v1/features/",
      "tag": "Features",
      "request": "FeatureCreateUpdate",
      "response": "FeatureCreateUpdate"
    },
    "categories_api_v1_features_data.json_list": {
      "method": "GET",
      "path": "/categories/api/v1/features/data.json/",
      "tag": "Features",
      "request": null,
      "response": null
    },
    "categories_api_v1_features_destroy": {
      "method": "DELETE",
      "path": "/categories/api/v1/features/{id}/",
      "tag": "Features",
      "request": null,
      "response": null
    },
    "categories_api_v1_features_list": {
      "method": "GET",
      "path": "/categories/api/v1/features/",
      "tag": "Features",
      "request": null,
      "response": "PaginatedFeatureCompactList"
    },
    "categories_api_v1_features_partial_update": {
      "method": "PATCH",
      "path": "/categories/api/v1/features/{id}/",
      "tag": "Features",
      "request": "PatchedFeatureCreateUpdate",
      "response": "FeatureCreateUpdate"
    },
    "categories_api_v1_features_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/features/{id}/",
      "tag": "Features",
      "request": null,
      "response": "Feature"
    },
    "categories_api_v1_features_revision_retrieve": {
      "method": "GET",
      "path": "/categories/api/v1/features/revision/",
      "tag": "Features",
      "request": null,
      "response": "MaxRevision"
    },
    "categories_api_v1_features_update": {
      "method": "PUT",
      "path": "/categories/api/v1/features/{id}/",
      "tag": "Features",
      "request": "FeatureCreateUpdate",
      "response": "FeatureCreateUpdate"
    },
    "categories_api_v1_tree_list": {
      "method": "GET",
      "path": "/categories/api/v1/tree/",
      "tag": "Categories",
      "request": null,
      "response": null
    },
    "collect_translation_keys": {
      "method": "GET",
      "path": "/categories/api/v1/categories/translation-keys/",
      "tag": "Categories",
      "request": null,
      "response": null
    }
  },
  "hooks": {
    "useCategoriesRevision": {
      "kind": "query",
      "operation": "revision",
      "queryKey": [
        "categories",
        "revision"
      ]
    },
    "useCategory": {
      "kind": "query",
      "operation": "retrieve",
      "queryKey": [
        "categories",
        "category",
        "{id}"
      ]
    },
    "useCategoryCarousel": {
      "kind": "query",
      "operation": "carousel",
      "queryKey": [
        "categories",
        "carousel"
      ]
    },
    "useCategoryCatalog": {
      "kind": "query",
      "queryKey": [
        "categories",
        "catalog",
        "{options}"
      ]
    },
    "useCategoryChildren": {
      "kind": "query",
      "operation": "children",
      "queryKey": [
        "categories",
        "children",
        "{id}"
      ]
    },
    "useCategoryFeatures": {
      "kind": "query",
      "operation": "features",
      "queryKey": [
        "categories",
        "features",
        "{id}"
      ]
    },
    "useCategoryTree": {
      "kind": "query",
      "operation": "tree",
      "queryKey": [
        "categories",
        "tree",
        "{depth}"
      ]
    }
  },
  "errors": {
    "error.400.bad_request": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.captcha_invalid": {
      "status": 400,
      "params": [],
      "remediation": "retry"
    },
    "error.400.captcha_required": {
      "status": 400,
      "params": [],
      "remediation": "retry"
    },
    "error.400.categories_config_required": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.categories_database_error": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.categories_duplicate_slug": {
      "status": 400,
      "params": [
        "slug"
      ],
      "remediation": "fix_input"
    },
    "error.400.categories_expected_list": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.categories_feature_editor_invalid": {
      "status": 400,
      "params": [
        "reason"
      ],
      "remediation": "fix_input"
    },
    "error.400.categories_invalid_conversion": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.categories_not_deleted": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.description_too_long": {
      "status": 400,
      "params": [
        "max_length"
      ],
      "remediation": "fix_input"
    },
    "error.400.description_too_short": {
      "status": 400,
      "params": [
        "min_length"
      ],
      "remediation": "fix_input"
    },
    "error.400.expected_list": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.feature_above_maximum": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_below_minimum": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_invalid_config": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_invalid_format": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_invalid_rules": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_invalid_type": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_mandatory_missing": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_not_allowed": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_not_in_options": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_unknown": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.feature_unknown_type": {
      "status": 400,
      "params": [
        "feature"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.blank": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.does_not_exist": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.invalid": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.invalid_choice": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.max_length": {
      "status": 400,
      "params": [
        "field",
        "max_length"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.max_value": {
      "status": 400,
      "params": [
        "field",
        "max_value"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.min_length": {
      "status": 400,
      "params": [
        "field",
        "min_length"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.min_value": {
      "status": 400,
      "params": [
        "field",
        "min_value"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.null": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.required": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.field.unique": {
      "status": 400,
      "params": [
        "field"
      ],
      "remediation": "fix_input"
    },
    "error.400.invalid_ad_id": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.validation_error": {
      "status": 400,
      "params": [],
      "remediation": "fix_input"
    },
    "error.400.verification_failed": {
      "status": 400,
      "params": [],
      "remediation": "verify"
    },
    "error.400.verification_invalid_factor": {
      "status": 400,
      "params": [],
      "remediation": "verify"
    },
    "error.401.unauthorized": {
      "status": 401,
      "params": [],
      "remediation": "reauthenticate"
    },
    "error.402.payment_required": {
      "status": 402,
      "params": [],
      "remediation": "retry"
    },
    "error.403.forbidden": {
      "status": 403,
      "params": [],
      "remediation": "retry"
    },
    "error.403.network_blocked": {
      "status": 403,
      "params": [],
      "remediation": "contact_support"
    },
    "error.403.verification_enrollment_required": {
      "status": 403,
      "params": [],
      "remediation": "verify"
    },
    "error.403.verification_required": {
      "status": 403,
      "params": [],
      "remediation": "verify"
    },
    "error.404.ad_not_found": {
      "status": 404,
      "params": [],
      "remediation": "retry"
    },
    "error.404.categories_slug_not_found": {
      "status": 404,
      "params": [
        "slug"
      ],
      "remediation": "retry"
    },
    "error.404.not_found": {
      "status": 404,
      "params": [],
      "remediation": "retry"
    },
    "error.404.verification_challenge_not_found": {
      "status": 404,
      "params": [],
      "remediation": "verify"
    },
    "error.405.method_not_allowed": {
      "status": 405,
      "params": [],
      "remediation": "retry"
    },
    "error.406.not_acceptable": {
      "status": 406,
      "params": [],
      "remediation": "retry"
    },
    "error.408.request_timeout": {
      "status": 408,
      "params": [],
      "remediation": "retry"
    },
    "error.409.categories_feature_editor_conflict": {
      "status": 409,
      "params": [
        "expected",
        "actual"
      ],
      "remediation": "fix_input"
    },
    "error.409.conflict": {
      "status": 409,
      "params": [],
      "remediation": "fix_input"
    },
    "error.410.gone": {
      "status": 410,
      "params": [],
      "remediation": "retry"
    },
    "error.413.payload_too_large": {
      "status": 413,
      "params": [],
      "remediation": "retry"
    },
    "error.415.unsupported_media_type": {
      "status": 415,
      "params": [],
      "remediation": "retry"
    },
    "error.422.unprocessable_entity": {
      "status": 422,
      "params": [],
      "remediation": "wait_and_retry"
    },
    "error.423.locked": {
      "status": 423,
      "params": [],
      "remediation": "wait_and_retry"
    },
    "error.423.verification_locked": {
      "status": 423,
      "params": [],
      "remediation": "wait_and_retry"
    },
    "error.429.rate_limit": {
      "status": 429,
      "params": [
        "retry_after_minutes"
      ],
      "remediation": "wait_and_retry"
    },
    "error.429.too_many_requests": {
      "status": 429,
      "params": [],
      "remediation": "wait_and_retry"
    },
    "error.500.internal": {
      "status": 500,
      "params": [],
      "remediation": "contact_support"
    },
    "error.503.mandate_unavailable": {
      "status": 503,
      "params": [],
      "remediation": "retry"
    }
  },
  "events": {
    "defined": [],
    "flows": []
  },
  "demos": [
    {
      "id": "categories.breadcrumbs",
      "title": "Category breadcrumbs",
      "description": "Every caption goes through renderCategoryLabel, the one place this skin decides between 'translate this' and 'print this': a name is a translation KEY unless the row says otherwise. The CURRENT crumb is a label, never a link to the page under your feet.",
      "component": "CategoryBreadcrumbsBar",
      "covers": [
        "CategoryBreadcrumbs",
        "CategoryLink"
      ],
      "tokens": [
        "surface-raised"
      ],
      "variants": [
        "deep",
        "in a router",
        "the link itself",
        "stale link"
      ],
      "source": "demo/CategoryBreadcrumbsBar.demo.tsx"
    },
    {
      "id": "categories.carousel",
      "title": "Category carousel",
      "description": "The one endpoint that arrives ready to render — the server filters active + carousel_enabled, orders by priority and sends its own Cache-Control. Labels still say whether they are translation keys or literals, because the catalogue's names belong to the deployment, not to the library.",
      "component": "CategoryCarouselStrip",
      "covers": [
        "CategoryCarousel"
      ],
      "tokens": [
        "surface-raised"
      ],
      "variants": [
        "tiles",
        "text only",
        "card tiles",
        "nothing featured",
        "outage"
      ],
      "source": "demo/CategoryCarouselStrip.demo.tsx"
    },
    {
      "id": "categories.cascade",
      "title": "Category cascade",
      "description": "One select per level of the tree, growing a rung as each is answered and dropping every rung below when one is changed — the ladder is derived from the chain above it, never remembered, so a stale deep answer cannot survive a shallow change. It is deliberately the same gesture as a 'brand → model' characteristic, because under the owner's navigation model a deep category IS one. Counts per option are a host prop and are unfilled here: no server can currently count a category's children, and an invented number is worse than none.",
      "component": "CategoryCascadeField",
      "covers": [
        "CategoryCascade",
        "useCategoryCascade"
      ],
      "tokens": [
        "surface-raised"
      ],
      "variants": [
        "on a phone",
        "half way",
        "at the leaf",
        "inside a filter chip",
        "nothing left to narrow",
        "outage"
      ],
      "source": "demo/CategoryCascadeField.demo.tsx"
    },
    {
      "id": "categories.catalog",
      "title": "Catalogue page",
      "description": "The /c route: the carousel of featured categories over the top-level tree. Category names arrive from the wire as TRANSLATION KEYS, so the host's bundle supplies the copy — and icon references stay opaque strings the host resolves, because a library that guessed a CDN path would ship a broken image on every deployment that guessed differently.",
      "component": "CatalogPage",
      "covers": [
        "CategoriesProvider"
      ],
      "tokens": [
        "surface-base",
        "surface-raised"
      ],
      "variants": [
        "browse",
        "no icons",
        "empty catalogue",
        "outage"
      ],
      "source": "demo/CatalogPage.demo.tsx"
    },
    {
      "id": "categories.category",
      "title": "Category page",
      "description": "The /c/:slug route. The slug is resolved against the CLIENT-BUILT tree because the server has no slug lookup, and 'there is no category here' is shown only once the sync has succeeded — a slow network must never render a 404 for a page that exists.",
      "component": "CategoryPage",
      "covers": [
        "CategoryTree"
      ],
      "tokens": [
        "surface-base"
      ],
      "variants": [
        "composed",
        "unfilled slot",
        "leaf with its schema",
        "no such category",
        "outage"
      ],
      "source": "demo/CategoryPage.demo.tsx"
    },
    {
      "id": "categories.features",
      "title": "Category feature schema",
      "description": "GET /categories/{id}/features/ resolves inheritance and order server-side and returns config VERBATIM — no defaults filled in, so an absent key means 'the type's default', never 'off'. attributes-react owns those defaults; this pair does not restate them.",
      "component": "CategoryFeatureList",
      "covers": [
        "CategoryFeatures"
      ],
      "tokens": [
        "surface-raised"
      ],
      "variants": [
        "schema",
        "no extra details",
        "outage"
      ],
      "source": "demo/CategoryFeatureList.demo.tsx"
    },
    {
      "id": "categories.mega-menu",
      "title": "Category mega menu",
      "description": "The desktop catalogue panel: roots on the left, the chosen root's second-level headers and their first five third-level links on the right, and a tail link to the header when there are more. One cached tree read, ARIA menu semantics on the rail, and nothing at all below the tokens' desktop rung, which a host moves with `minWidth`.",
      "component": "CategoryMegaMenu",
      "covers": [
        "useCategoryTree"
      ],
      "tokens": [
        "surface-overlay",
        "surface-sunken",
        "border-subtle",
        "text-muted",
        "text-subtle"
      ],
      "variants": [
        "open",
        "tight cap",
        "empty catalogue",
        "outage"
      ],
      "source": "demo/CategoryMegaMenu.demo.tsx"
    },
    {
      "id": "categories.picker",
      "title": "Category picker",
      "description": "Drill down or search; either way the options come out of the tree already in memory, so typing issues no request per keystroke and the control works offline once the catalogue has synced. A non-leaf selection is refused WITH ITS REASON: a listing filed under 'Electronics' instead of 'Electronics › Phones' inherits a different feature set, so the form then asks the wrong questions.",
      "component": "CategoryPickerField",
      "covers": [
        "CategoryPicker"
      ],
      "tokens": [
        "surface-raised"
      ],
      "variants": [
        "on a phone",
        "the closed trigger",
        "inline",
        "too general",
        "chosen",
        "outage"
      ],
      "source": "demo/CategoryPickerField.demo.tsx"
    },
    {
      "id": "categories.quick-search",
      "title": "Category quick search",
      "description": "The category landing's brand-tinted panel: a heading, the host's own field slots, and a full-width button carrying the live result count. Only a ready, countable answer earns a number — loading, refused and 'the engine cannot say' all render the plain sentence, and a lower bound gets its own, because a floor printed as a total is a lie in a shorter form.",
      "component": "CategoryQuickSearchPanel",
      "tokens": [
        "brand-subtle"
      ],
      "variants": [
        "counted",
        "counting",
        "a floor, not a total",
        "no fields"
      ],
      "source": "demo/CategoryQuickSearchPanel.demo.tsx"
    },
    {
      "id": "categories.search-hits",
      "title": "Category search hits",
      "description": "The categories a search query reached, ranked exact-then-prefix-then-substring and printed as links above the results. Not a picker and not a typeahead over the tree: a short list that lets a person who typed a section's name land in that section instead of only ever landing in results. With no hits it renders nothing at all.",
      "component": "CategorySearchHits",
      "covers": [
        "useCategorySearch"
      ],
      "tokens": [
        "surface",
        "text"
      ],
      "variants": [
        "ranked",
        "one hit",
        "nothing matched"
      ],
      "source": "demo/CategorySearchHits.demo.tsx"
    },
    {
      "id": "categories.tile-grid",
      "title": "Category tile grid",
      "description": "Two rows of rounded tiles that scroll sideways, sized as a fraction of the box they were mounted in rather than of the viewport. The label sits top-left over two lines; the art is pinned bottom-right through the same renderIcon seam the carousel strip takes, and an unresolved reference draws a placeholder rather than a broken image.",
      "component": "CategoryTileGrid",
      "covers": [
        "CategoryCarousel"
      ],
      "tokens": [
        "surface-sunken",
        "border-subtle"
      ],
      "variants": [
        "tiles",
        "no art",
        "host tiles",
        "inside a category",
        "compact flat",
        "card tiles",
        "reserved rows",
        "nothing featured",
        "outage"
      ],
      "source": "demo/CategoryTileGrid.demo.tsx"
    },
    {
      "id": "categories.tree",
      "title": "Category tree pane",
      "description": "stapel-categories has no tree endpoint: the list returns FLAT rows ordered by revision, with ancestry as comma-joined pk strings. The client assembles the hierarchy, drops soft-deleted and inactive rows for DIFFERENT reasons, and resolves /c/:slug against the result — the server has no slug lookup either.",
      "component": "CategoryTreePane",
      "covers": [
        "CategoriesProvider"
      ],
      "tokens": [
        "surface-raised"
      ],
      "variants": [
        "roots",
        "one level down",
        "leaf",
        "partial catalogue",
        "outage"
      ],
      "source": "demo/CategoryTreePane.demo.tsx"
    }
  ],
  "i18nKeys": [
    "categories.breadcrumbs.label",
    "categories.breadcrumbs.root",
    "categories.carousel.empty",
    "categories.carousel.load_failed",
    "categories.carousel.loading",
    "categories.carousel.title",
    "categories.cascade.blocked.nothing_selected",
    "categories.cascade.choose",
    "categories.catalog.as_of",
    "categories.catalog.empty",
    "categories.catalog.load_failed",
    "categories.catalog.loading",
    "categories.catalog.refreshing",
    "categories.catalog.retry",
    "categories.catalog.title",
    "categories.catalog.truncated",
    "categories.category.back_to_catalog",
    "categories.category.no_subcategories",
    "categories.category.open",
    "categories.category.subcategories",
    "categories.category.subcategories_count",
    "categories.category.subcategories_count.one",
    "categories.category.subcategories_count.other",
    "categories.category.title",
    "categories.category.unknown_slug",
    "categories.category.unknown_slug_hint",
    "categories.error.unknown",
    "categories.features.empty",
    "categories.features.load_failed",
    "categories.features.loading",
    "categories.features.mandatory",
    "categories.features.title",
    "categories.features.type.bool",
    "categories.features.type.convertible_unit",
    "categories.features.type.date",
    "categories.features.type.float",
    "categories.features.type.header",
    "categories.features.type.hex_color",
    "categories.features.type.hierarchical_select",
    "categories.features.type.int",
    "categories.features.type.other",
    "categories.features.type.select",
    "categories.features.type.string",
    "categories.features.untyped",
    "categories.mega_menu.label",
    "categories.mega_menu.more",
    "categories.picker.blocked.not_a_leaf",
    "categories.picker.blocked.nothing_selected",
    "categories.picker.choose",
    "categories.picker.done",
    "categories.picker.load_failed",
    "categories.picker.loading",
    "categories.picker.no_matches",
    "categories.picker.search",
    "categories.picker.selected",
    "categories.picker.title",
    "categories.picker.up",
    "categories.quick_search.cta",
    "categories.quick_search.cta_count",
    "categories.quick_search.cta_count.one",
    "categories.quick_search.cta_count.other",
    "categories.quick_search.cta_count_at_least",
    "categories.quick_search.cta_count_at_least.one",
    "categories.quick_search.cta_count_at_least.other",
    "categories.search.hits_title",
    "categories.tiles.all",
    "categories.tiles.all_no_matches",
    "categories.tiles.all_search",
    "categories.tiles.show_all",
    "error.400.bad_request",
    "error.400.captcha_invalid",
    "error.400.captcha_required",
    "error.400.categories_config_required",
    "error.400.categories_database_error",
    "error.400.categories_duplicate_slug",
    "error.400.categories_expected_list",
    "error.400.categories_feature_editor_invalid",
    "error.400.categories_invalid_conversion",
    "error.400.categories_not_deleted",
    "error.400.description_too_long",
    "error.400.description_too_short",
    "error.400.expected_list",
    "error.400.feature_above_maximum",
    "error.400.feature_below_minimum",
    "error.400.feature_invalid_config",
    "error.400.feature_invalid_format",
    "error.400.feature_invalid_rules",
    "error.400.feature_invalid_type",
    "error.400.feature_mandatory_missing",
    "error.400.feature_not_allowed",
    "error.400.feature_not_in_options",
    "error.400.feature_unknown",
    "error.400.feature_unknown_type",
    "error.400.field.blank",
    "error.400.field.does_not_exist",
    "error.400.field.invalid",
    "error.400.field.invalid_choice",
    "error.400.field.max_length",
    "error.400.field.max_value",
    "error.400.field.min_length",
    "error.400.field.min_value",
    "error.400.field.null",
    "error.400.field.required",
    "error.400.field.unique",
    "error.400.invalid_ad_id",
    "error.400.validation_error",
    "error.400.verification_failed",
    "error.400.verification_invalid_factor",
    "error.401.unauthorized",
    "error.402.payment_required",
    "error.403.forbidden",
    "error.403.network_blocked",
    "error.403.verification_enrollment_required",
    "error.403.verification_required",
    "error.404.ad_not_found",
    "error.404.categories_slug_not_found",
    "error.404.not_found",
    "error.404.verification_challenge_not_found",
    "error.405.method_not_allowed",
    "error.406.not_acceptable",
    "error.408.request_timeout",
    "error.409.categories_feature_editor_conflict",
    "error.409.conflict",
    "error.410.gone",
    "error.413.payload_too_large",
    "error.415.unsupported_media_type",
    "error.422.unprocessable_entity",
    "error.423.locked",
    "error.423.verification_locked",
    "error.429.rate_limit",
    "error.429.too_many_requests",
    "error.500.internal",
    "error.503.mandate_unavailable"
  ],
  "exports": {
    "runtime": [
      "ADMIN_VISIBILITY",
      "CATALOG_KEY",
      "CATALOG_NAMESPACE",
      "CATEGORIES_ERRORS",
      "CATEGORIES_ERROR_CODES",
      "CATEGORIES_FEATURE_EDITOR_CONFLICT",
      "CATEGORIES_I18N_KEYS",
      "CATEGORIES_I18N_PLURAL_KEYS",
      "CATEGORY_SEARCH_LIMIT",
      "CategoriesProvider",
      "CategoriesRuntimeContext",
      "CategoryBreadcrumbs",
      "CategoryCarousel",
      "CategoryCascade",
      "CategoryFeatures",
      "CategoryPicker",
      "CategoryTree",
      "DEFAULT_TREE_DEPTH",
      "EFFECTIVE_FROM_HEADER",
      "EMPTY_SNAPSHOT",
      "MAX_SYNC_PAGES",
      "MAX_TILE_DEPTH",
      "UNPERSISTED_WARNING",
      "applyCategoryPage",
      "browsableCategories",
      "browseChildren",
      "browseStage",
      "buildCategoryCascade",
      "buildCategoryTree",
      "cascadeChainIds",
      "cascadeParentIds",
      "cascadeReachedLeaf",
      "cascadeSelection",
      "cascadeTrail",
      "catalogKeyOptions",
      "categoriesErrorBundleEn",
      "categoriesI18nBundleEn",
      "categoriesQueryKeys",
      "categoryAncestorChain",
      "categoryAncestorIds",
      "categoryBreadcrumbs",
      "categoryChildIds",
      "categoryChildTileEntries",
      "categoryIconSrc",
      "categoryLabel",
      "categoryListParams",
      "categoryLiveChildCount",
      "categoryOffersTileGrid",
      "categoryTileEntry",
      "childControl",
      "createCatalogStore",
      "createCategoriesApi",
      "createCategoriesRuntime",
      "explainCategoriesError",
      "featureCommentLabel",
      "featureLabel",
      "featureOptionsAreKeys",
      "fetchCategoryFeatures",
      "firstPageRequest",
      "flattenCategoryNodes",
      "foldForSearch",
      "hasChildren",
      "isBrowsableCategory",
      "isEmptySnapshot",
      "isLinkedChild",
      "isRowChild",
      "isTestCategory",
      "isTransparentNode",
      "isTransparentWrapper",
      "isVirtualChild",
      "isWrapperAncestor",
      "memoryCatalogStore",
      "navEntries",
      "nextPageRequest",
      "nodeOffersTileGrid",
      "parseSnapshot",
      "parseTreenodePks",
      "partitionSides",
      "rankCategoryMatches",
      "registerCategoriesI18n",
      "renderCategoryLabel",
      "resolveCategorySlug",
      "syncCatalog",
      "useCategoriesAnalytics",
      "useCategoriesApi",
      "useCategoriesRevision",
      "useCategoriesRuntime",
      "useCategory",
      "useCategoryCarousel",
      "useCategoryCascade",
      "useCategoryCatalog",
      "useCategoryChildren",
      "useCategoryFeatures",
      "useCategoryLevels",
      "useCategoryRows",
      "useCategorySearch",
      "useCategoryTree",
      "visibleFeatures"
    ],
    "types": [
      "AxisRole",
      "BrowsableRow",
      "BrowseStage",
      "BrowseStageInput",
      "BuildCategoryTreeOptions",
      "CarouselEntry",
      "CatalogKeyOptions",
      "CatalogStore",
      "CategoriesApi",
      "CategoriesApiOptions",
      "CategoriesErrorCode",
      "CategoriesErrorSpec",
      "CategoriesI18nKey",
      "CategoriesRawTransport",
      "CategoriesRuntime",
      "Category",
      "CategoryBreadcrumbsBag",
      "CategoryBreadcrumbsProps",
      "CategoryBrowseOptions",
      "CategoryCarouselBag",
      "CategoryCarouselProps",
      "CategoryCascadeBag",
      "CategoryCascadeBlockedReason",
      "CategoryCascadeCommit",
      "CategoryCascadeLevel",
      "CategoryCascadeOption",
      "CategoryCascadeProps",
      "CategoryCascadeSource",
      "CategoryCascadeStep",
      "CategoryCatalog",
      "CategoryChild",
      "CategoryChildrenAs",
      "CategoryCrumb",
      "CategoryFanOut",
      "CategoryFeature",
      "CategoryFeatureConfig",
      "CategoryFeatureEntry",
      "CategoryFeatureType",
      "CategoryFeaturesBag",
      "CategoryFeaturesEffectiveFrom",
      "CategoryFeaturesProps",
      "CategoryFeaturesResult",
      "CategoryIndex",
      "CategoryLabel",
      "CategoryLabelKind",
      "CategoryLinkedChild",
      "CategoryListPage",
      "CategoryListParams",
      "CategoryMatchKind",
      "CategoryNode",
      "CategoryOption",
      "CategoryPickerBag",
      "CategoryPickerBlockedReason",
      "CategoryPickerProps",
      "CategoryPresentation",
      "CategoryRevisions",
      "CategoryRowChild",
      "CategorySearchHit",
      "CategorySnapshot",
      "CategoryTileEntry",
      "CategoryTreeBag",
      "CategoryTreeNode",
      "CategoryTreeParams",
      "CategoryTreeProps",
      "CategoryVirtualChild",
      "CategoryVisibilityOptions",
      "ChildControl",
      "ChildrenOf",
      "CreateCatalogStoreOptions",
      "CreateCategoriesRuntimeOptions",
      "FeatureConfig",
      "MaxRevision",
      "RankCategoryMatchesOptions",
      "Remediation",
      "Schemas",
      "SyncCatalogOptions",
      "SyncCatalogResult",
      "UseCategoryCarouselOptions",
      "UseCategoryCascadeOptions",
      "UseCategoryCatalogOptions",
      "UseCategorySearchOptions",
      "UseCategoryTreeOptions",
      "VirtualChildHref",
      "VirtualTileEntry"
    ]
  }
}
