{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "The actor's visual customization: a selected built-in theme plus optional custom CSS/JS for their home page and post decorations. Custom JS runs only inside a sandboxed iframe; custom CSS is sanitized and scoped server-side before use.",
      "key": "literal:self",
      "record": {
        "properties": {
          "assets": {
            "description": "Blobs referenced by the actor's CSS/tokens (backgrounds, cursors, fonts). Listed here so the PDS keeps them referenced; a CID used in CSS but absent here is rejected on save.",
            "items": {
              "accept": [
                "image/png",
                "image/jpeg",
                "image/webp",
                "image/gif",
                "font/woff2",
                "font/woff"
              ],
              "maxSize": 5000000,
              "type": "blob"
            },
            "maxLength": 16,
            "type": "array"
          },
          "customBase": {
            "default": "y2kringe",
            "description": "When theme is \"custom\", the built-in base theme whose tokens the custom CSS layers on top of (light or dark).",
            "knownValues": [
              "y2kringe",
              "gyaru"
            ],
            "type": "string"
          },
          "effects": {
            "description": "Enabled first-party page effects for the actor's home page.",
            "items": {
              "ref": "social.twinkl.theme.defs#effect",
              "type": "ref"
            },
            "maxLength": 8,
            "type": "array"
          },
          "homeCss": {
            "description": "Custom CSS applied to the actor's home page (sanitized + scoped before use).",
            "maxLength": 100000,
            "type": "string"
          },
          "homeJs": {
            "description": "DEPRECATED: superseded by Web Tiles (social.twinkl.homepage.tile) and no longer rendered on profile pages. Custom JS for the actor's home page. Executed only inside a sandboxed iframe with no same-origin access.",
            "maxLength": 100000,
            "type": "string"
          },
          "postCss": {
            "description": "CSS-only decoration applied to the actor's posts in feeds (sanitized + scoped). Never executes JS.",
            "maxLength": 50000,
            "type": "string"
          },
          "priorThemeCid": {
            "description": "CID of the immediately-previous version of this style record, for one-step \"revert to previous look\" rollback (best-effort; the prior version may be GC'd by the PDS over time).",
            "format": "cid",
            "type": "string"
          },
          "sourceTheme": {
            "description": "Provenance: the social.twinkl.theme.pack this style was copied from (attribution only; content is materialized locally). Backlink target for gallery wearer counts.",
            "format": "at-uri",
            "type": "string"
          },
          "sourceThemeCid": {
            "description": "CID of the theme.pack version that was copied.",
            "format": "cid",
            "type": "string"
          },
          "theme": {
            "default": "y2kringe",
            "description": "Selected base theme.",
            "knownValues": [
              "y2kringe",
              "gyaru",
              "custom"
            ],
            "type": "string"
          },
          "tokens": {
            "description": "Open map of theme token name to string value, layered on the base theme (validated per-token in code; see social.twinkl.theme.pack `tokens`).",
            "type": "unknown"
          },
          "updatedAt": {
            "format": "datetime",
            "type": "string"
          }
        },
        "required": [
          "theme"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "social.twinkl.actor.style",
  "lexicon": 1
}
