{
  "protocol": "site-operations",
  "contractVersion": "1.1.0",
  "schemaVersion": 1,
  "siteId": "joyhop",
  "siteName": "JoyHop",
  "siteVersion": "1.2.4",
  "canonicalOrigin": "https://joyhop.games",
  "languages": [
    "en",
    "zh"
  ],
  "defaultLanguage": "en",
  "catalogRevision": "arrow-escape@1.18.0:cd8e11891aeb4e28|bottle-code@2.0.4:18719b2e42453464|coffee-jam@1.18.0:253024f586d6691f|dot-duel@1.6.5:488b1af016017442|draw-to-park@1.5.3:62b00d0a6a1e205b|farm-match@2.4.1:9293533f041672ea|fruit-hunt@2.1.7:e88742f68844875d|kitty-nook@1.8.4:c029a0e24a319502|maze-splash@3.6.9:18034b8df7a739ef|monster-munch@1.0.4:2bff544c3d0bcef4|pixel-peck@1.3.5:9d339deac4f12283|pixel-pour@1.1.13:68e78bea4a91c673|pocket-freecell@1.16.2:fdbe8715fc8c1bd9|screw-pop@1.11.7:08088d00e3a7c7d2|sweet-roll@0.1.4:8a352d949b123a91|hexa-stack@1.4.4:cf48a70e3a36c0c7|kitty-cargo@1.7.4:ec7fd875e2f65cb1|sheep-match@1.0.1:d08cb4acb0a09028|flirty-frames@0.6.5:677db8bc9d0576e5",
  "catalogSources": {
    "base": "/site-ops/catalog.json",
    "dynamic": "/relay-platform/catalog.json",
    "protocolVersion": 1,
    "identity": "stable-game-id",
    "revisionPolicy": "Base catalogRevision is independent of dynamic registry revision; validate IDs against merged current catalogs."
  },
  "paths": {
    "manifest": "/site-ops/manifest.json",
    "schema": "/site-ops/schema.json",
    "catalog": "/site-ops/catalog.json",
    "defaults": "/site-ops/defaults.json",
    "published": "/site-ops/published.json",
    "integration": "/site-ops/integration.md",
    "discovery": "/.well-known/site-operations.json",
    "siteInfo": "/site-info.json"
  },
  "editor": {
    "groups": [
      {
        "id": "featured",
        "label": {
          "en": "Home carousel",
          "zh": "首页轮播"
        },
        "fields": [
          {
            "pointer": "/home/featured/enabled",
            "widget": "toggle",
            "label": "是否展示轮播"
          },
          {
            "pointer": "/home/featured/gameIds",
            "widget": "ordered-game-picker",
            "maxItems": 6,
            "label": "轮播游戏与顺序"
          }
        ]
      },
      {
        "id": "library",
        "label": {
          "en": "Game library",
          "zh": "游戏列表"
        },
        "fields": [
          {
            "pointer": "/home/library/title",
            "widget": "localized-text",
            "maxLength": 80,
            "label": "列表标题"
          },
          {
            "pointer": "/home/library/layout",
            "widget": "select",
            "options": [
              "showcase",
              "compact"
            ],
            "label": "错落大卡片或紧凑列表"
          },
          {
            "pointer": "/home/library/gameIds",
            "widget": "ordered-game-picker",
            "label": "优先游戏及顺序，未选择游戏自动追加"
          }
        ]
      },
      {
        "id": "ranking",
        "label": {
          "en": "Editorial ranking",
          "zh": "人工精选榜"
        },
        "fields": [
          {
            "pointer": "/home/ranking/enabled",
            "widget": "toggle",
            "label": "是否展示榜单"
          },
          {
            "pointer": "/home/ranking/title",
            "widget": "localized-text",
            "maxLength": 80,
            "label": "榜单标题"
          },
          {
            "pointer": "/home/ranking/gameIds",
            "widget": "ordered-game-picker",
            "maxItems": 10,
            "label": "第1至10名；数组顺序就是名次"
          }
        ]
      },
      {
        "id": "visibility",
        "label": {
          "en": "Discovery visibility",
          "zh": "发现页展示开关"
        },
        "fields": [
          {
            "pointer": "/hiddenGameIds",
            "widget": "game-multiselect",
            "label": "从首页、分类、搜索、收藏列表及相关推荐隐藏；不是访问封禁或删除"
          }
        ]
      }
    ],
    "readOnly": [
      "schemaVersion",
      "siteId",
      "catalogRevision",
      "revision",
      "updatedAt",
      "game.id",
      "game.name",
      "game.category",
      "game.cover",
      "game.releaseVersion",
      "game.runtime"
    ],
    "unsupported": [
      "player-accounts",
      "arbitrary-html",
      "custom-css",
      "new-game-upload",
      "editing-native-assets",
      "scheduled-publication",
      "automatic-popularity-ranking"
    ],
    "workflow": [
      "clone-current-or-defaults",
      "edit-only-declared-fields",
      "validate-schema-and-semantics",
      "preview",
      "publish-with-expected-revision",
      "read-back-and-verify"
    ]
  },
  "publication": {
    "transport": "authenticated-static-file-replacement",
    "publicWriteApi": false,
    "targetPath": "/site-ops/published.json",
    "expectedRevisionRequired": true,
    "candidateRevision": "Clone the current revision into the draft; the publisher increments it on commit.",
    "missingPublished": "404 means uninitialized: use defaults at revision 0, then publish revision 1.",
    "atomicReplace": "transport-dependent",
    "retainLastConfigOutsidePublicRoot": true,
    "webOverlayPreservesPublishedConfig": true,
    "localCli": "node scripts/site-ops.mjs publish draft.json --target dist-web --expected-revision 0",
    "sourceOfTruth": "The config installed on the target website; ordinary web updates must never overwrite it."
  },
  "preview": {
    "protocolVersion": 1,
    "urls": {
      "en": "/en/?ops-preview=1",
      "zh": "/zh/?ops-preview=1"
    },
    "readyType": "site-operations:ready",
    "applyType": "site-operations:apply",
    "resultType": "site-operations:result",
    "nonceRequired": true,
    "parentFrameOnly": true,
    "persistent": false
  },
  "compatibility": {
    "rejectUnknownFields": true,
    "rejectUnknownIds": true,
    "rejectDuplicateIds": true,
    "requireCatalogRevisionMatch": true,
    "unsupportedVersion": "Stop publishing, refresh website information and update the adapter or migrate the configuration."
  }
}
