{
  "version": "1.1.1",
  "generated": "scripts/sync-catalog.ts",
  "components": [
    {
      "tag": "roxy-natal-chart",
      "pascal": "RoxyNatalChart",
      "slug": "natal-chart",
      "domain": "Western",
      "renders": "Natal chart wheel with planet glyphs and aspect lines",
      "endpointLabel": "POST /astrology/natal-chart",
      "endpoints": [
        {
          "operationId": "generateNatalChart",
          "method": "POST",
          "path": "/astrology/natal-chart",
          "toolName": "post_astrology_natal_chart"
        }
      ],
      "parts": [
        "aspect-grid",
        "aspects",
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "details",
        "distribution",
        "edit-bar",
        "element-modality",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "houses",
        "legend",
        "loading",
        "panel",
        "pattern",
        "patterns",
        "positions",
        "reading",
        "readings",
        "section",
        "strongest",
        "tab",
        "table",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-natal-chart publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-natal-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"natal-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/natal-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/natal-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "heading",
          "type": "string"
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-synastry-chart",
      "pascal": "RoxySynastryChart",
      "slug": "synastry-chart",
      "domain": "Western",
      "renders": "Dual-wheel synastry with inter-aspects table",
      "endpointLabel": "POST /astrology/synastry",
      "endpoints": [
        {
          "operationId": "calculateSynastry",
          "method": "POST",
          "path": "/astrology/synastry",
          "toolName": "post_astrology_synastry"
        }
      ],
      "parts": [
        "aspects",
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "house-overlay",
        "inter-aspects",
        "legend",
        "loading",
        "reading",
        "section",
        "strengths-challenges",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-synastry-chart publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-synastry-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"synastry-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/synastry-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/synastry-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-western-planets-table",
      "pascal": "RoxyWesternPlanetsTable",
      "slug": "western-planets-table",
      "domain": "Western",
      "renders": "Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",
      "endpointLabel": "POST /astrology/natal-chart",
      "endpoints": [
        {
          "operationId": "generateNatalChart",
          "method": "POST",
          "path": "/astrology/natal-chart",
          "toolName": "post_astrology_natal_chart"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "houses",
        "loading",
        "section",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-western-planets-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-western-planets-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"western-planets-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/western-planets-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/western-planets-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-transits-table",
      "pascal": "RoxyTransitsTable",
      "slug": "transits-table",
      "domain": "Western",
      "renders": "Transit planet positions plus optional aspects to a natal chart",
      "endpointLabel": "POST /astrology/transits",
      "endpoints": [
        {
          "operationId": "calculateTransits",
          "method": "POST",
          "path": "/astrology/transits",
          "toolName": "post_astrology_transits"
        }
      ],
      "parts": [
        "aspects",
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "panel",
        "reading",
        "section",
        "tab",
        "table",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-transits-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-transits-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"transits-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/transits-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/transits-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-transit-wheel",
      "pascal": "RoxyTransitWheel",
      "slug": "transit-wheel",
      "domain": "Western",
      "renders": "Natal chart on the inner ring, transiting bodies on the outer ring, aspect lines between them",
      "endpointLabel": "POST /astrology/transit-aspects",
      "endpoints": [
        {
          "operationId": "calculateTransitAspects",
          "method": "POST",
          "path": "/astrology/transit-aspects",
          "toolName": "post_astrology_transit_aspects"
        }
      ],
      "parts": [
        "aspects",
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "houses",
        "legend",
        "loading",
        "pattern",
        "patterns",
        "positions",
        "reading",
        "readings",
        "section",
        "strongest",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-transit-wheel publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-transit-wheel>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"transit-wheel\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/transit-wheel-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/transit-wheel-dark.webp"
      },
      "attributes": [
        {
          "name": "heading",
          "type": "string",
          "description": "Heading above the bi-wheel. Defaults to \"Transits\"."
        },
        {
          "name": "ascendant",
          "type": "number",
          "description": "Natal Ascendant as an ecliptic longitude in degrees (0-360), supplied by the page from a chart endpoint that returns one. Rotates the wheel so that longitude falls on the left horizon and draws the ASC/DSC axis. Leave it unset and the wheel keeps a fixed zodiacal orientation with 0 degrees Aries on the left."
        },
        {
          "name": "houses",
          "type": "string",
          "description": "The twelve natal house cusps, supplied by the page: the /astrology/natal-chart `houses` array verbatim, or twelve bare cusp longitudes in house order. The transit-aspects response numbers every body by house but returns no cusp longitudes, so this is the only way the wheel can draw the sectors those numbers refer to. Supplying it draws the twelve cusps and their numbers, and rotates the first cusp onto the left horizon unless an ascendant is also given. Anything that does not resolve to houses 1 to 12 with finite longitudes is ignored rather than half drawn."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-aspects-table",
      "pascal": "RoxyAspectsTable",
      "slug": "aspects-table",
      "domain": "Western",
      "renders": "Aspect rows coloured by nature with orb and strength, plus detected chart patterns",
      "endpointLabel": "POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",
      "endpoints": [
        {
          "operationId": "calculateAspects",
          "method": "POST",
          "path": "/astrology/aspects",
          "toolName": "post_astrology_aspects"
        },
        {
          "operationId": "calculateTransitAspects",
          "method": "POST",
          "path": "/astrology/transit-aspects",
          "toolName": "post_astrology_transit_aspects"
        },
        {
          "operationId": "detectAspectPatterns",
          "method": "POST",
          "path": "/astrology/aspect-patterns",
          "toolName": "post_astrology_aspect_patterns"
        }
      ],
      "parts": [
        "aspects",
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "pattern",
        "patterns",
        "reading",
        "readings",
        "section",
        "strongest"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-aspects-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-aspects-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"aspects-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/aspects-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/aspects-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-moon-phase",
      "pascal": "RoxyMoonPhase",
      "slug": "moon-phase",
      "domain": "Western",
      "renders": "Moon phase card and calendar",
      "endpointLabel": "GET /astrology/moon-phase/{current,upcoming,calendar/...}",
      "endpoints": [
        {
          "operationId": "getCurrentMoonPhase",
          "method": "GET",
          "path": "/astrology/moon-phase/current",
          "toolName": "get_astrology_moon_phase_current",
          "attrs": {
            "mode": "current"
          }
        },
        {
          "operationId": "getUpcomingMoonPhases",
          "method": "GET",
          "path": "/astrology/moon-phase/upcoming",
          "toolName": "get_astrology_moon_phase_upcoming",
          "attrs": {
            "mode": "upcoming"
          }
        },
        {
          "operationId": "getMoonCalendar",
          "method": "GET",
          "path": "/astrology/moon-phase/calendar/{year}/{month}",
          "toolName": "get_astrology_moon_phase_calendar_year_month",
          "attrs": {
            "mode": "calendar"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-moon-phase mode=\"current\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-moon-phase>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"moon-phase\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/moon-phase-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/moon-phase-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'current' | 'upcoming' | 'calendar'",
          "description": "Which moon-phase response shape to render: a single current phase, an upcoming list, or a calendar."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-horoscope-card",
      "pascal": "RoxyHoroscopeCard",
      "slug": "horoscope-card",
      "domain": "Western",
      "renders": "Daily, weekly, monthly, or yearly horoscope card",
      "endpointLabel": "GET /astrology/horoscope/{sign}/{daily,weekly,monthly,yearly}",
      "endpoints": [
        {
          "operationId": "getDailyHoroscope",
          "method": "GET",
          "path": "/astrology/horoscope/{sign}/daily",
          "toolName": "get_astrology_horoscope_sign_daily",
          "attrs": {
            "period": "daily"
          }
        },
        {
          "operationId": "getWeeklyHoroscope",
          "method": "GET",
          "path": "/astrology/horoscope/{sign}/weekly",
          "toolName": "get_astrology_horoscope_sign_weekly",
          "attrs": {
            "period": "weekly"
          }
        },
        {
          "operationId": "getMonthlyHoroscope",
          "method": "GET",
          "path": "/astrology/horoscope/{sign}/monthly",
          "toolName": "get_astrology_horoscope_sign_monthly",
          "attrs": {
            "period": "monthly"
          }
        },
        {
          "operationId": "getYearlyHoroscope",
          "method": "GET",
          "path": "/astrology/horoscope/{sign}/yearly",
          "toolName": "get_astrology_horoscope_sign_yearly",
          "attrs": {
            "period": "yearly"
          }
        }
      ],
      "parts": [
        "attribution",
        "best-periods",
        "card",
        "column",
        "details",
        "eclipses",
        "edit-bar",
        "empty",
        "error",
        "events",
        "form",
        "header",
        "hint",
        "key-dates",
        "key-periods",
        "label-track",
        "loading",
        "outlook",
        "overview",
        "retrogrades",
        "section",
        "sky",
        "themes",
        "week-by-week"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-horoscope-card period=\"daily\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-horoscope-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"horoscope-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/horoscope-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/horoscope-card-dark.webp"
      },
      "attributes": [
        {
          "name": "period",
          "type": "'daily' | 'weekly' | 'monthly' | 'yearly'",
          "description": "Which horoscope cadence the response is for. Selects the heading and date framing."
        },
        {
          "name": "layout",
          "type": "'auto' | 'column' | 'sections'",
          "description": "Which shape the written reading takes. The endpoint returns the same reading twice, once whole as the column and once split into six topic sections, so exactly one is rendered. Defaults to auto, which prefers the column and falls back to the sections for a response that carries none."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-astrocartography-map",
      "pascal": "RoxyAstrocartographyMap",
      "slug": "astrocartography-map",
      "domain": "Western",
      "renders": "World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",
      "endpointLabel": "POST /astrology/astrocartography",
      "endpoints": [
        {
          "operationId": "generateAstrocartography",
          "method": "POST",
          "path": "/astrology/astrocartography",
          "toolName": "post_astrology_astrocartography"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "reading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-astrocartography-map publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-astrocartography-map>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"astrocartography-map\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/astrocartography-map-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/astrocartography-map-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-local-space-compass",
      "pascal": "RoxyLocalSpaceCompass",
      "slug": "local-space-compass",
      "domain": "Western",
      "renders": "Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",
      "endpointLabel": "POST /astrology/local-space",
      "endpoints": [
        {
          "operationId": "generateLocalSpace",
          "method": "POST",
          "path": "/astrology/local-space",
          "toolName": "post_astrology_local_space"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-local-space-compass publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-local-space-compass>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"local-space-compass\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/local-space-compass-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/local-space-compass-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-relocation-wheel",
      "pascal": "RoxyRelocationWheel",
      "slug": "relocation-wheel",
      "domain": "Western",
      "renders": "Relocated chart wheel plus the move geometry, angular planets, and planets that change house",
      "endpointLabel": "POST /astrology/relocation-chart",
      "endpoints": [
        {
          "operationId": "generateRelocationChart",
          "method": "POST",
          "path": "/astrology/relocation-chart",
          "toolName": "post_astrology_relocation_chart"
        }
      ],
      "parts": [
        "angular-planets",
        "aspect-grid",
        "aspects",
        "attribution",
        "card",
        "changes",
        "chart",
        "chart-controls",
        "chart-dialog",
        "details",
        "distribution",
        "edit-bar",
        "element-modality",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "house-changes",
        "houses",
        "legend",
        "loading",
        "panel",
        "pattern",
        "patterns",
        "positions",
        "reading",
        "readings",
        "section",
        "stack",
        "strongest",
        "tab",
        "table",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-relocation-wheel publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-relocation-wheel>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"relocation-wheel\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/relocation-wheel-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/relocation-wheel-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-positions-table",
      "pascal": "RoxyPositionsTable",
      "slug": "positions-table",
      "domain": "Western",
      "renders": "Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",
      "endpointLabel": "POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",
      "endpoints": [
        {
          "operationId": "generateAsteroids",
          "method": "POST",
          "path": "/astrology/asteroids",
          "toolName": "post_astrology_asteroids"
        },
        {
          "operationId": "generateLilith",
          "method": "POST",
          "path": "/astrology/lilith",
          "toolName": "post_astrology_lilith"
        },
        {
          "operationId": "generateProgressions",
          "method": "POST",
          "path": "/astrology/progressions",
          "toolName": "post_astrology_progressions"
        },
        {
          "operationId": "generateSolarArc",
          "method": "POST",
          "path": "/astrology/solar-arc",
          "toolName": "post_astrology_solar_arc"
        },
        {
          "operationId": "calculateArabicLots",
          "method": "POST",
          "path": "/astrology/arabic-lots",
          "toolName": "post_astrology_arabic_lots"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "readings",
        "section",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-positions-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-positions-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"positions-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/positions-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/positions-table-dark.webp"
      },
      "attributes": [
        {
          "name": "heading",
          "type": "string",
          "description": "Override the auto-derived heading. Empty by default, in which case it is derived from the response shape (Asteroids, Black Moon Lilith, Secondary progressions, Solar arc directions, or Arabic lots)."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-ephemeris-table",
      "pascal": "RoxyEphemerisTable",
      "slug": "ephemeris-table",
      "domain": "Cross",
      "renders": "Per-body sign changes and retrograde windows for the month, over the full daily position grid",
      "endpointLabel": "POST /astrology/planets/monthly, /vedic-astrology/planetary-positions/monthly",
      "endpoints": [
        {
          "operationId": "getMonthlyTropicalEphemeris",
          "method": "POST",
          "path": "/astrology/planets/monthly",
          "toolName": "post_astrology_planets_monthly"
        },
        {
          "operationId": "getMonthlyEphemeris",
          "method": "POST",
          "path": "/vedic-astrology/planetary-positions/monthly",
          "toolName": "post_vedic_astrology_planetary_positions_monthly"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "changes",
        "daily",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "section",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-ephemeris-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-ephemeris-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"ephemeris-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/ephemeris-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/ephemeris-table-dark.webp"
      },
      "attributes": [
        {
          "name": "heading",
          "type": "string",
          "description": "Card heading above the month. Defaults to \"Ephemeris\", translated into the page language like every other label the component writes."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-fixed-stars",
      "pascal": "RoxyFixedStars",
      "slug": "fixed-stars",
      "domain": "Western",
      "renders": "Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",
      "endpointLabel": "POST /astrology/fixed-stars",
      "endpoints": [
        {
          "operationId": "generateFixedStars",
          "method": "POST",
          "path": "/astrology/fixed-stars",
          "toolName": "post_astrology_fixed_stars"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "conjunctions",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-fixed-stars publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-fixed-stars>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"fixed-stars\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/fixed-stars-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/fixed-stars-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-profection-card",
      "pascal": "RoxyProfectionCard",
      "slug": "profection-card",
      "domain": "Western",
      "renders": "Profected house and sign for the year, the lord of the year, its natal placement, and the reading",
      "endpointLabel": "POST /astrology/profections",
      "endpoints": [
        {
          "operationId": "generateProfections",
          "method": "POST",
          "path": "/astrology/profections",
          "toolName": "post_astrology_profections"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-profection-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-profection-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"profection-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/profection-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/profection-card-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-compatibility-card",
      "pascal": "RoxyCompatibilityCard",
      "slug": "compatibility-card",
      "domain": "Cross",
      "renders": "Score card with category breakdown",
      "endpointLabel": "POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",
      "endpoints": [
        {
          "operationId": "calculateCompatibility",
          "method": "POST",
          "path": "/astrology/compatibility-score",
          "toolName": "post_astrology_compatibility_score",
          "attrs": {
            "mode": "astrology"
          }
        },
        {
          "operationId": "calculateNumCompatibility",
          "method": "POST",
          "path": "/numerology/compatibility",
          "toolName": "post_numerology_compatibility",
          "attrs": {
            "mode": "numerology"
          }
        },
        {
          "operationId": "calculateBioCompatibility",
          "method": "POST",
          "path": "/biorhythm/compatibility",
          "toolName": "post_biorhythm_compatibility",
          "attrs": {
            "mode": "biorhythm"
          }
        }
      ],
      "parts": [
        "aspect-breakdown",
        "attribution",
        "breakdown",
        "card",
        "details",
        "edit-bar",
        "element-balance",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "key-aspects",
        "loading",
        "reading",
        "readings",
        "section",
        "strengths-challenges"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-compatibility-card mode=\"astrology\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-compatibility-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"compatibility-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/compatibility-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/compatibility-card-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'astrology' | 'numerology' | 'biorhythm'",
          "description": "Which compatibility domain the response is from. Themes the card and labels the category breakdown."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-vedic-kundli",
      "pascal": "RoxyVedicKundli",
      "slug": "vedic-kundli",
      "domain": "Vedic",
      "renders": "South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",
      "endpointLabel": "POST /vedic-astrology/birth-chart",
      "endpoints": [
        {
          "operationId": "generateBirthChart",
          "method": "POST",
          "path": "/vedic-astrology/birth-chart",
          "toolName": "post_vedic_astrology_birth_chart"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "panel",
        "tab",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-vedic-kundli publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-vedic-kundli>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"vedic-kundli\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-kundli-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-kundli-dark.webp"
      },
      "attributes": [
        {
          "name": "chart-style",
          "type": "'south' | 'north' | 'east'",
          "description": "Initial regional kundli layout. The end user can switch styles at runtime via the visible tablist."
        },
        {
          "name": "chart-reference",
          "type": "'lagna' | 'moon'",
          "description": "Ascendant reference point. \"lagna\" (default) uses the Janma Lagna; \"moon\" renders the Chandra Lagna (Moon as house 1) from the same response."
        },
        {
          "name": "lagna-override",
          "type": "string",
          "description": "Explicit rashi/sign name to pin as the ascendant, overriding both the Janma Lagna and chartReference. Empty by default. Use for Surya Lagna, Arudha Lagna, or any custom reference chart."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-divisional-chart",
      "pascal": "RoxyDivisionalChart",
      "slug": "divisional-chart",
      "domain": "Vedic",
      "renders": "Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",
      "endpointLabel": "POST /vedic-astrology/{divisional-chart,navamsa}",
      "endpoints": [
        {
          "operationId": "generateDivisionalChart",
          "method": "POST",
          "path": "/vedic-astrology/divisional-chart",
          "toolName": "post_vedic_astrology_divisional_chart"
        },
        {
          "operationId": "generateNavamsa",
          "method": "POST",
          "path": "/vedic-astrology/navamsa",
          "toolName": "post_vedic_astrology_navamsa"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "chart-controls",
        "chart-dialog",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "panel",
        "positions",
        "section",
        "tab",
        "table",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-divisional-chart publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-divisional-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"divisional-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/divisional-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/divisional-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "chart-style",
          "type": "'south' | 'north' | 'east'",
          "description": "Initial regional varga layout. The end user can switch styles at runtime via the visible tablist."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-kp-chart",
      "pascal": "RoxyKpChart",
      "slug": "kp-chart",
      "domain": "Vedic (KP)",
      "renders": "Ascendant, cusps, planets and nodes with KP stellar hierarchy and house meanings",
      "endpointLabel": "POST /vedic-astrology/kp/chart",
      "endpoints": [
        {
          "operationId": "generateKpChart",
          "method": "POST",
          "path": "/vedic-astrology/kp/chart",
          "toolName": "post_vedic_astrology_kp_chart"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "panel",
        "tab",
        "table",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-kp-chart publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-kp-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"kp-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-vedic-planets-table",
      "pascal": "RoxyVedicPlanetsTable",
      "slug": "vedic-planets-table",
      "domain": "Vedic",
      "renders": "Degree, nakshatra, pada, lord, bhava, Baladi, Jagradadi and Deeptadi columns",
      "endpointLabel": "POST /vedic-astrology/birth-chart",
      "endpoints": [
        {
          "operationId": "generateBirthChart",
          "method": "POST",
          "path": "/vedic-astrology/birth-chart",
          "toolName": "post_vedic_astrology_birth_chart"
        }
      ],
      "parts": [
        "attribution",
        "bhava-significations",
        "card",
        "combustion",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "planetary-war",
        "readings",
        "section",
        "table",
        "yogas"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-vedic-planets-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-vedic-planets-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"vedic-planets-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-planets-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-planets-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-kp-planets-table",
      "pascal": "RoxyKpPlanetsTable",
      "slug": "kp-planets-table",
      "domain": "Vedic (KP)",
      "renders": "Sub-lord and sub-sub-lord columns",
      "endpointLabel": "POST /vedic-astrology/kp/planets",
      "endpoints": [
        {
          "operationId": "getKpPlanets",
          "method": "POST",
          "path": "/vedic-astrology/kp/planets",
          "toolName": "post_vedic_astrology_kp_planets"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-kp-planets-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-kp-planets-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"kp-planets-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-planets-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-planets-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-kp-ruling-planets",
      "pascal": "RoxyKpRulingPlanets",
      "slug": "kp-ruling-planets",
      "domain": "Vedic (KP)",
      "renders": "Day lord, Moon/Lagna hierarchies, ruling planets, significators with house meanings",
      "endpointLabel": "POST /vedic-astrology/kp/ruling-planets",
      "endpoints": [
        {
          "operationId": "getKpRulingPlanets",
          "method": "POST",
          "path": "/vedic-astrology/kp/ruling-planets",
          "toolName": "post_vedic_astrology_kp_ruling_planets"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "label-track",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-kp-ruling-planets publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-kp-ruling-planets>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"kp-ruling-planets\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-ruling-planets-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-ruling-planets-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-ashtakavarga-grid",
      "pascal": "RoxyAshtakavargaGrid",
      "slug": "ashtakavarga-grid",
      "domain": "Vedic",
      "renders": "Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",
      "endpointLabel": "POST /vedic-astrology/ashtakavarga",
      "endpoints": [
        {
          "operationId": "calculateAshtakavarga",
          "method": "POST",
          "path": "/vedic-astrology/ashtakavarga",
          "toolName": "post_vedic_astrology_ashtakavarga"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "panel",
        "tab",
        "table",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-ashtakavarga-grid publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-ashtakavarga-grid>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"ashtakavarga-grid\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/ashtakavarga-grid-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/ashtakavarga-grid-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-shadbala-table",
      "pascal": "RoxyShadbalaTable",
      "slug": "shadbala-table",
      "domain": "Vedic",
      "renders": "Six-fold planetary strength bar plus rupas and adequacy badge",
      "endpointLabel": "POST /vedic-astrology/shadbala",
      "endpoints": [
        {
          "operationId": "calculateShadbala",
          "method": "POST",
          "path": "/vedic-astrology/shadbala",
          "toolName": "post_vedic_astrology_shadbala"
        }
      ],
      "parts": [
        "attribution",
        "bars",
        "card",
        "chart",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-shadbala-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-shadbala-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"shadbala-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/shadbala-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/shadbala-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-dasha-timeline",
      "pascal": "RoxyDashaTimeline",
      "slug": "dasha-timeline",
      "domain": "Vedic",
      "renders": "Vimshottari mahadasha, antardasha, pratyantardasha, sookshma and prana, drill-down at every level",
      "endpointLabel": "POST /vedic-astrology/dasha/{current,major,sub/...}",
      "endpoints": [
        {
          "operationId": "getMajorDashas",
          "method": "POST",
          "path": "/vedic-astrology/dasha/major",
          "toolName": "post_vedic_astrology_dasha_major",
          "attrs": {
            "period": "major"
          }
        },
        {
          "operationId": "getCurrentDasha",
          "method": "POST",
          "path": "/vedic-astrology/dasha/current",
          "toolName": "post_vedic_astrology_dasha_current",
          "attrs": {
            "period": "current"
          }
        },
        {
          "operationId": "getSubDashas",
          "method": "POST",
          "path": "/vedic-astrology/dasha/sub/{mahadasha}",
          "toolName": "post_vedic_astrology_dasha_sub_mahadasha",
          "attrs": {
            "period": "sub"
          }
        },
        {
          "operationId": "getPratyantardashas",
          "method": "POST",
          "path": "/vedic-astrology/dasha/sub/{mahadasha}/{antardasha}",
          "toolName": "post_vedic_astrology_dasha_sub_mahadasha_antardasha",
          "attrs": {
            "period": "antara"
          }
        },
        {
          "operationId": "getSookshmaDashas",
          "method": "POST",
          "path": "/vedic-astrology/dasha/sub/{mahadasha}/{antardasha}/{pratyantardasha}",
          "toolName": "post_vedic_astrology_dasha_sub_mahadasha_antardasha_pratyantardasha",
          "attrs": {
            "period": "sookshma"
          }
        },
        {
          "operationId": "getPranaDashas",
          "method": "POST",
          "path": "/vedic-astrology/dasha/sub/{mahadasha}/{antardasha}/{pratyantardasha}/{sookshma}",
          "toolName": "post_vedic_astrology_dasha_sub_mahadasha_antardasha_pratyantardasha_sookshma",
          "attrs": {
            "period": "prana"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "current",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "frame",
        "header",
        "hint",
        "label-track",
        "loading",
        "panel",
        "reading",
        "readings",
        "section",
        "tab",
        "tablist",
        "timeline"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-dasha-timeline period=\"major\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-dasha-timeline>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"dasha-timeline\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dasha-timeline-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dasha-timeline-dark.webp"
      },
      "attributes": [
        {
          "name": "period",
          "type": "'current' | 'major' | 'sub' | 'antara' | 'sookshma' | 'prana'",
          "description": "Which dasha response shape to render: the running periods, the major mahadashas, or one of the four drill-down levels (antardashas, pratyantardashas, sookshma dashas, prana dashas)."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-guna-milan",
      "pascal": "RoxyGunaMilan",
      "slug": "guna-milan",
      "domain": "Vedic",
      "renders": "36-point Ashtakoota with eight sub-scores",
      "endpointLabel": "POST /vedic-astrology/compatibility",
      "endpoints": [
        {
          "operationId": "calculateGunMilan",
          "method": "POST",
          "path": "/vedic-astrology/compatibility",
          "toolName": "post_vedic_astrology_compatibility"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-guna-milan publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-guna-milan>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"guna-milan\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/guna-milan-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/guna-milan-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-panchang-table",
      "pascal": "RoxyPanchangTable",
      "slug": "panchang-table",
      "domain": "Vedic",
      "renders": "15+ muhurtas in detailed mode",
      "endpointLabel": "POST /vedic-astrology/panchang/{basic,detailed}",
      "endpoints": [
        {
          "operationId": "getDetailedPanchang",
          "method": "POST",
          "path": "/vedic-astrology/panchang/detailed",
          "toolName": "post_vedic_astrology_panchang_detailed",
          "attrs": {
            "detail": "detailed"
          }
        },
        {
          "operationId": "getBasicPanchang",
          "method": "POST",
          "path": "/vedic-astrology/panchang/basic",
          "toolName": "post_vedic_astrology_panchang_basic",
          "attrs": {
            "detail": "basic"
          }
        }
      ],
      "parts": [
        "attribution",
        "auspicious",
        "balams",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "inauspicious",
        "loading",
        "section",
        "table",
        "transitions"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-panchang-table detail=\"detailed\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-panchang-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"panchang-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/panchang-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/panchang-table-dark.webp"
      },
      "attributes": [
        {
          "name": "detail",
          "type": "'basic' | 'detailed'",
          "description": "Whether the response is the basic five-limb panchang or the detailed muhurta set. Detailed mode shows the auspicious and inauspicious period sections."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-vedic-aspects",
      "pascal": "RoxyVedicAspects",
      "slug": "vedic-aspects",
      "domain": "Vedic",
      "renders": "Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",
      "endpointLabel": "POST /vedic-astrology/aspects",
      "endpoints": [
        {
          "operationId": "calculateDrishti",
          "method": "POST",
          "path": "/vedic-astrology/aspects",
          "toolName": "post_vedic_astrology_aspects"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "mutual-aspects",
        "positions",
        "section",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-vedic-aspects publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-vedic-aspects>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"vedic-aspects\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-aspects-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-aspects-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-hora-table",
      "pascal": "RoxyHoraTable",
      "slug": "hora-table",
      "domain": "Vedic",
      "renders": "Day and night planetary hours with ruling planet and window",
      "endpointLabel": "POST /vedic-astrology/panchang/hora",
      "endpoints": [
        {
          "operationId": "getHora",
          "method": "POST",
          "path": "/vedic-astrology/panchang/hora",
          "toolName": "post_vedic_astrology_panchang_hora"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-hora-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-hora-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"hora-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hora-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hora-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-choghadiya-grid",
      "pascal": "RoxyChoghadiyaGrid",
      "slug": "choghadiya-grid",
      "domain": "Vedic",
      "renders": "Day and night Choghadiya muhurta tiles colored by effect",
      "endpointLabel": "POST /vedic-astrology/panchang/choghadiya",
      "endpoints": [
        {
          "operationId": "getChoghadiya",
          "method": "POST",
          "path": "/vedic-astrology/panchang/choghadiya",
          "toolName": "post_vedic_astrology_panchang_choghadiya"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-choghadiya-grid publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-choghadiya-grid>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"choghadiya-grid\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/choghadiya-grid-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/choghadiya-grid-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-heliacal-table",
      "pascal": "RoxyHeliacalTable",
      "slug": "heliacal-table",
      "domain": "Vedic",
      "renders": "Udaya and asta windows for the six visible grahas, the calculation behind Guru Asta and Shukra Asta",
      "endpointLabel": "POST /vedic-astrology/heliacal",
      "endpoints": [
        {
          "operationId": "getHeliacalVisibility",
          "method": "POST",
          "path": "/vedic-astrology/heliacal",
          "toolName": "post_vedic_astrology_heliacal"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table",
        "window"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-heliacal-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-heliacal-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"heliacal-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/heliacal-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/heliacal-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-vedic-daily",
      "pascal": "RoxyVedicDaily",
      "slug": "vedic-daily",
      "domain": "Vedic",
      "renders": "Composed Vedic daily reading with the classical rule behind every graha state, the Tara and Chandrabala windows in full, and all three sidereal frames named",
      "endpointLabel": "POST /vedic-astrology/daily",
      "endpoints": [
        {
          "operationId": "getVedicDailyReading",
          "method": "POST",
          "path": "/vedic-astrology/daily",
          "toolName": "post_vedic_astrology_daily"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "dasha",
        "details",
        "edit-bar",
        "empty",
        "error",
        "finance",
        "form",
        "frame",
        "grahas",
        "header",
        "hint",
        "legend",
        "loading",
        "panchanga",
        "section",
        "table",
        "windows"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-vedic-daily publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-vedic-daily>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"vedic-daily\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-daily-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vedic-daily-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-kp-finance-card",
      "pascal": "RoxyKpFinanceCard",
      "slug": "kp-finance-card",
      "domain": "Vedic",
      "renders": "KP daily finance reading with the cusp sub lords, the running dasha lords, the ruling planets and the Moon sub lord windows each scored against the gain and loss houses, weighed into one band for the day",
      "endpointLabel": "POST /vedic-astrology/kp/daily-finance",
      "endpoints": [
        {
          "operationId": "getKpDailyFinance",
          "method": "POST",
          "path": "/vedic-astrology/kp/daily-finance",
          "toolName": "post_vedic_astrology_kp_daily_finance"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "cusps",
        "dasha",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "frame",
        "header",
        "hint",
        "loading",
        "moon-windows",
        "ruling-planets",
        "section",
        "significators",
        "table",
        "windows"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-kp-finance-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-kp-finance-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"kp-finance-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-finance-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kp-finance-card-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-gochara-table",
      "pascal": "RoxyGocharaTable",
      "slug": "gochara-table",
      "domain": "Vedic",
      "renders": "Vedic gochara with aspects to the natal chart and the Gochara Kaksha reading drawn as a position within the sign",
      "endpointLabel": "POST /vedic-astrology/transit",
      "endpoints": [
        {
          "operationId": "calculateTransit",
          "method": "POST",
          "path": "/vedic-astrology/transit",
          "toolName": "post_vedic_astrology_transit"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "key-transits",
        "loading",
        "section",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-gochara-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-gochara-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"gochara-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/gochara-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/gochara-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-bhava-bala-table",
      "pascal": "RoxyBhavaBalaTable",
      "slug": "bhava-bala-table",
      "domain": "Vedic",
      "renders": "House strength in rupas and virupas, ranked, with Bhavadhipati, Dig and Drishti Bala shown as proportions of the total",
      "endpointLabel": "POST /vedic-astrology/bhava-bala",
      "endpoints": [
        {
          "operationId": "calculateBhavaBala",
          "method": "POST",
          "path": "/vedic-astrology/bhava-bala",
          "toolName": "post_vedic_astrology_bhava_bala"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-bhava-bala-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-bhava-bala-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"bhava-bala-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bhava-bala-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bhava-bala-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-bhav-chalit-table",
      "pascal": "RoxyBhavChalitTable",
      "slug": "bhav-chalit-table",
      "domain": "Vedic",
      "renders": "The Chalit chart against the Rashi chart, leading with how many grahas move and which, plus the unequal bhava spans",
      "endpointLabel": "POST /vedic-astrology/bhav-chalit",
      "endpoints": [
        {
          "operationId": "calculateBhavChalit",
          "method": "POST",
          "path": "/vedic-astrology/bhav-chalit",
          "toolName": "post_vedic_astrology_bhav_chalit"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "moved",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-bhav-chalit-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-bhav-chalit-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"bhav-chalit-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bhav-chalit-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bhav-chalit-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-upagraha-table",
      "pascal": "RoxyUpagrahaTable",
      "slug": "upagraha-table",
      "domain": "Vedic",
      "renders": "Time-based and Sun-based upagrahas with rashi, degree, longitude and nakshatra",
      "endpointLabel": "POST /vedic-astrology/upagraha",
      "endpoints": [
        {
          "operationId": "getUpagrahaPositions",
          "method": "POST",
          "path": "/vedic-astrology/upagraha",
          "toolName": "post_vedic_astrology_upagraha"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "section",
        "sun-based",
        "table",
        "time-based"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-upagraha-table publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-upagraha-table>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"upagraha-table\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/upagraha-table-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/upagraha-table-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-chara-karakas",
      "pascal": "RoxyCharaKarakas",
      "slug": "chara-karakas",
      "domain": "Vedic",
      "renders": "Karaka offices in rank order with graha, degree, scheme, and what each is read for",
      "endpointLabel": "POST /vedic-astrology/chara-karakas",
      "endpoints": [
        {
          "operationId": "calculateCharaKarakas",
          "method": "POST",
          "path": "/vedic-astrology/chara-karakas",
          "toolName": "post_vedic_astrology_chara_karakas"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-chara-karakas publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-chara-karakas>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"chara-karakas\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/chara-karakas-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/chara-karakas-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-arudha-padas",
      "pascal": "RoxyArudhaPadas",
      "slug": "arudha-padas",
      "domain": "Vedic",
      "renders": "Twelve padas with bhava, lord, pada rashi, house from Lagna, and the classical exception marked",
      "endpointLabel": "POST /vedic-astrology/arudha",
      "endpoints": [
        {
          "operationId": "calculateArudhaPadas",
          "method": "POST",
          "path": "/vedic-astrology/arudha",
          "toolName": "post_vedic_astrology_arudha"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-arudha-padas publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-arudha-padas>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"arudha-padas\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/arudha-padas-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/arudha-padas-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-yoga-list",
      "pascal": "RoxyYogaList",
      "slug": "yoga-list",
      "domain": "Vedic",
      "renders": "Filterable yoga cards from the 300 plus yoga catalog, grouped by verdict in detect mode",
      "endpointLabel": "GET /vedic-astrology/yoga, /vedic-astrology/yoga/{id}, POST /vedic-astrology/yoga/detect",
      "endpoints": [
        {
          "operationId": "listYogas",
          "method": "GET",
          "path": "/vedic-astrology/yoga",
          "toolName": "get_vedic_astrology_yoga"
        },
        {
          "operationId": "detectYogas",
          "method": "POST",
          "path": "/vedic-astrology/yoga/detect",
          "toolName": "post_vedic_astrology_yoga_detect"
        },
        {
          "operationId": "getYoga",
          "method": "GET",
          "path": "/vedic-astrology/yoga/{id}",
          "toolName": "get_vedic_astrology_yoga_id"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "section",
        "verdict",
        "verdicts",
        "yogas"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-yoga-list publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-yoga-list>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"yoga-list\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/yoga-list-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/yoga-list-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-nakshatra-card",
      "pascal": "RoxyNakshatraCard",
      "slug": "nakshatra-card",
      "domain": "Vedic",
      "renders": "Lord, deity, symbol, characteristics, remedies",
      "endpointLabel": "GET /vedic-astrology/nakshatras/{id}",
      "endpoints": [
        {
          "operationId": "getNakshatra",
          "method": "GET",
          "path": "/vedic-astrology/nakshatras/{id}",
          "toolName": "get_vedic_astrology_nakshatras_id"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "characteristics",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "remedies",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-nakshatra-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-nakshatra-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"nakshatra-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/nakshatra-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/nakshatra-card-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-dosha-card",
      "pascal": "RoxyDoshaCard",
      "slug": "dosha-card",
      "domain": "Vedic",
      "renders": "Presence, severity, remedies, scoped effects",
      "endpointLabel": "POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",
      "endpoints": [
        {
          "operationId": "checkManglikDosha",
          "method": "POST",
          "path": "/vedic-astrology/dosha/manglik",
          "toolName": "post_vedic_astrology_dosha_manglik",
          "attrs": {
            "type": "manglik"
          }
        },
        {
          "operationId": "checkKalsarpaDosha",
          "method": "POST",
          "path": "/vedic-astrology/dosha/kalsarpa",
          "toolName": "post_vedic_astrology_dosha_kalsarpa",
          "attrs": {
            "type": "kalsarpa"
          }
        },
        {
          "operationId": "checkSadhesati",
          "method": "POST",
          "path": "/vedic-astrology/dosha/sadhesati",
          "toolName": "post_vedic_astrology_dosha_sadhesati",
          "attrs": {
            "type": "sadhesati"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "effects",
        "empty",
        "error",
        "exceptions",
        "form",
        "header",
        "hint",
        "loading",
        "remedies",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-dosha-card type=\"manglik\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-dosha-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"dosha-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dosha-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dosha-card-dark.webp"
      },
      "attributes": [
        {
          "name": "type",
          "type": "'manglik' | 'kalsarpa' | 'sadhesati'",
          "description": "Which dosha to title and theme. The three dosha responses share a shape, so the card cannot infer this. Defaults to manglik, so set it explicitly per card."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-numerology-card",
      "pascal": "RoxyNumerologyCard",
      "slug": "numerology-card",
      "domain": "Numerology",
      "renders": "Life path, expression, soul urge, personality, personal year, full chart",
      "endpointLabel": "POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",
      "endpoints": [
        {
          "operationId": "calculateLifePath",
          "method": "POST",
          "path": "/numerology/life-path",
          "toolName": "post_numerology_life_path",
          "attrs": {
            "type": "life-path"
          }
        },
        {
          "operationId": "calculateExpression",
          "method": "POST",
          "path": "/numerology/expression",
          "toolName": "post_numerology_expression",
          "attrs": {
            "type": "expression"
          }
        },
        {
          "operationId": "calculateSoulUrge",
          "method": "POST",
          "path": "/numerology/soul-urge",
          "toolName": "post_numerology_soul_urge",
          "attrs": {
            "type": "soul-urge"
          }
        },
        {
          "operationId": "calculatePersonality",
          "method": "POST",
          "path": "/numerology/personality",
          "toolName": "post_numerology_personality",
          "attrs": {
            "type": "personality"
          }
        },
        {
          "operationId": "calculateBirthDay",
          "method": "POST",
          "path": "/numerology/birth-day",
          "toolName": "post_numerology_birth_day",
          "attrs": {
            "type": "birth-day"
          }
        },
        {
          "operationId": "calculateMaturity",
          "method": "POST",
          "path": "/numerology/maturity",
          "toolName": "post_numerology_maturity",
          "attrs": {
            "type": "maturity"
          }
        },
        {
          "operationId": "getDailyNumber",
          "method": "POST",
          "path": "/numerology/daily",
          "toolName": "post_numerology_daily",
          "attrs": {
            "type": "daily"
          }
        },
        {
          "operationId": "calculatePersonalDay",
          "method": "POST",
          "path": "/numerology/personal-day",
          "toolName": "post_numerology_personal_day",
          "attrs": {
            "type": "personal-day"
          }
        },
        {
          "operationId": "calculatePersonalMonth",
          "method": "POST",
          "path": "/numerology/personal-month",
          "toolName": "post_numerology_personal_month",
          "attrs": {
            "type": "personal-month"
          }
        },
        {
          "operationId": "calculatePersonalYear",
          "method": "POST",
          "path": "/numerology/personal-year",
          "toolName": "post_numerology_personal_year",
          "attrs": {
            "type": "personal-year"
          }
        },
        {
          "operationId": "generateNumerologyChart",
          "method": "POST",
          "path": "/numerology/chart",
          "toolName": "post_numerology_chart",
          "attrs": {
            "type": "chart"
          }
        }
      ],
      "parts": [
        "attribution",
        "birth-day-profile",
        "calculation",
        "card",
        "cores",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "karmic-debt",
        "karmic-lessons",
        "loading",
        "lucky-associations",
        "maturity",
        "name-letters",
        "name-numbers",
        "obstacle-periods",
        "personal-year",
        "pinnacles",
        "reading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-numerology-card type=\"life-path\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-numerology-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"numerology-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/numerology-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/numerology-card-dark.webp"
      },
      "attributes": [
        {
          "name": "type",
          "type": "'life-path' | 'expression' | 'soul-urge' | 'personality' | 'birth-day' | 'maturity' | 'daily' | 'personal-day' | 'personal-month' | 'personal-year' | 'chart'",
          "description": "Which numerology response the card is showing. Selects the heading and which fields are surfaced."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-compound-number",
      "pascal": "RoxyCompoundNumber",
      "slug": "compound-number",
      "domain": "Numerology",
      "renders": "Compound 10 to 52 with name, root, nature and meaning",
      "endpointLabel": "GET /numerology/compound-number/{number}",
      "endpoints": [
        {
          "operationId": "getCompoundNumber",
          "method": "GET",
          "path": "/numerology/compound-number/{number}",
          "toolName": "get_numerology_compound_number"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-compound-number publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-compound-number>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"compound-number\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/compound-number-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/compound-number-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-gematria",
      "pascal": "RoxyGematria",
      "slug": "gematria",
      "domain": "Kabbalah",
      "renders": "Values by cipher, every candidate Hebrew spelling with its per letter breakdown, and equal-value words",
      "endpointLabel": "POST /kabbalah/gematria",
      "endpoints": [
        {
          "operationId": "calculateGematria",
          "method": "POST",
          "path": "/kabbalah/gematria",
          "toolName": "post_kabbalah_gematria"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "latin-ciphers",
        "legend",
        "letters",
        "loading",
        "matches",
        "reading",
        "section",
        "spellings",
        "substitutions",
        "values"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-gematria publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-gematria>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"gematria\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/gematria-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/gematria-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-tarot-card",
      "pascal": "RoxyTarotCard",
      "slug": "tarot-card",
      "domain": "Tarot",
      "renders": "Single card with upright and reversed flip",
      "endpointLabel": "GET /tarot/cards/{id}, POST /tarot/daily",
      "endpoints": [
        {
          "operationId": "getDailyCard",
          "method": "POST",
          "path": "/tarot/daily",
          "toolName": "post_tarot_daily"
        },
        {
          "operationId": "getCard",
          "method": "GET",
          "path": "/tarot/cards/{id}",
          "toolName": "get_tarot_cards_id"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "panel",
        "reading",
        "readings",
        "section",
        "tab",
        "tablist"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-tarot-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-tarot-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"tarot-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/tarot-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/tarot-card-dark.webp"
      },
      "sideReads": [
        {
          "kind": "picker",
          "endpoint": "getCard",
          "field": "id",
          "operationId": "listCards",
          "method": "GET",
          "path": "/tarot/cards"
        }
      ],
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-tarot-catalog",
      "pascal": "RoxyTarotCatalog",
      "slug": "tarot-catalog",
      "domain": "Tarot",
      "renders": "Deck gallery tiles with card art, name, and arcana and suit; a pick opens the card in place",
      "endpointLabel": "GET /tarot/cards",
      "endpoints": [
        {
          "operationId": "listCards",
          "method": "GET",
          "path": "/tarot/cards",
          "toolName": "get_tarot_cards"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "cards",
        "detail",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "more",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-tarot-catalog publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-tarot-catalog>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"tarot-catalog\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/tarot-catalog-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/tarot-catalog-dark.webp"
      },
      "sideReads": [
        {
          "kind": "more",
          "endpoint": "listCards",
          "operationId": "listCards",
          "method": "GET",
          "path": "/tarot/cards"
        },
        {
          "kind": "row",
          "operationId": "getCard",
          "method": "GET",
          "path": "/tarot/cards/{id}"
        }
      ],
      "attributes": [
        {
          "name": "heading",
          "type": "string",
          "description": "Override the auto-derived gallery heading. Empty by default, in which case the heading is \"Tarot deck\"."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-symbol-select",
          "description": "Provides the selected list entry so the page can show its details."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-tarot-spread",
      "pascal": "RoxyTarotSpread",
      "slug": "tarot-spread",
      "domain": "Tarot",
      "renders": "Spreads with positions and reading",
      "endpointLabel": "POST /tarot/spreads/{three-card,celtic-cross,love,career,custom}, /tarot/yes-no, /tarot/draw",
      "endpoints": [
        {
          "operationId": "castThreeCard",
          "method": "POST",
          "path": "/tarot/spreads/three-card",
          "toolName": "post_tarot_spreads_three_card",
          "attrs": {
            "spread": "three-card"
          }
        },
        {
          "operationId": "castCelticCross",
          "method": "POST",
          "path": "/tarot/spreads/celtic-cross",
          "toolName": "post_tarot_spreads_celtic_cross",
          "attrs": {
            "spread": "celtic-cross"
          }
        },
        {
          "operationId": "castLoveSpread",
          "method": "POST",
          "path": "/tarot/spreads/love",
          "toolName": "post_tarot_spreads_love",
          "attrs": {
            "spread": "love"
          }
        },
        {
          "operationId": "castCareerSpread",
          "method": "POST",
          "path": "/tarot/spreads/career",
          "toolName": "post_tarot_spreads_career",
          "attrs": {
            "spread": "career"
          }
        },
        {
          "operationId": "castCustomSpread",
          "method": "POST",
          "path": "/tarot/spreads/custom",
          "toolName": "post_tarot_spreads_custom",
          "attrs": {
            "spread": "custom"
          }
        },
        {
          "operationId": "castYesNo",
          "method": "POST",
          "path": "/tarot/yes-no",
          "toolName": "post_tarot_yes_no",
          "attrs": {
            "spread": "yes-no"
          }
        },
        {
          "operationId": "drawCards",
          "method": "POST",
          "path": "/tarot/draw",
          "toolName": "post_tarot_draw",
          "attrs": {
            "spread": "draw"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "cards",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "positions",
        "section",
        "verdict"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-tarot-spread spread=\"three-card\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-tarot-spread>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"tarot-spread\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/tarot-spread-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/tarot-spread-dark.webp"
      },
      "attributes": [
        {
          "name": "spread",
          "type": "'three-card' | 'celtic-cross' | 'love' | 'career' | 'custom' | 'yes-no' | 'draw'",
          "description": "Which spread layout the response is for. Positions the cards and selects the reading template."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-bodygraph",
      "pascal": "RoxyBodygraph",
      "slug": "bodygraph",
      "domain": "Human Design",
      "renders": "Nine-center chart with defined and open centers, active channels, and gates, plus the type, strategy, authority, profile, and definition readings, the channels by circuit, the centers, and every activation with its gate and line meaning",
      "endpointLabel": "POST /human-design/bodygraph",
      "endpoints": [
        {
          "operationId": "generateBodygraph",
          "method": "POST",
          "path": "/human-design/bodygraph",
          "toolName": "post_human_design_bodygraph"
        }
      ],
      "parts": [
        "activations",
        "attribution",
        "card",
        "centers",
        "channels",
        "chart",
        "chart-controls",
        "chart-dialog",
        "details",
        "edit-bar",
        "empty",
        "error",
        "fact",
        "facts",
        "form",
        "header",
        "hint",
        "keynotes",
        "layout",
        "legend",
        "loading",
        "panel",
        "reading",
        "readings",
        "section",
        "tab",
        "tablist",
        "themes"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-bodygraph publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-bodygraph>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"bodygraph\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bodygraph-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bodygraph-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-hd-type-card",
      "pascal": "RoxyHdTypeCard",
      "slug": "hd-type-card",
      "domain": "Human Design",
      "renders": "Type, strategy, authority, and profile tiles with the aura, signature, and not-self themes, plus the reading behind each label and the profile line keynotes",
      "endpointLabel": "POST /human-design/type, /human-design/profile",
      "endpoints": [
        {
          "operationId": "calculateType",
          "method": "POST",
          "path": "/human-design/type",
          "toolName": "post_human_design_type"
        },
        {
          "operationId": "calculateProfile",
          "method": "POST",
          "path": "/human-design/profile",
          "toolName": "post_human_design_profile"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "fact",
        "facts",
        "form",
        "header",
        "hint",
        "keynotes",
        "lines",
        "loading",
        "reading",
        "readings",
        "section",
        "themes"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-hd-type-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-hd-type-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"hd-type-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-type-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-type-card-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-hd-connection",
      "pascal": "RoxyHdConnection",
      "slug": "hd-connection",
      "domain": "Human Design",
      "renders": "Electromagnetic, compromise, and dominance channels between two charts",
      "endpointLabel": "POST /human-design/connection",
      "endpoints": [
        {
          "operationId": "calculateConnection",
          "method": "POST",
          "path": "/human-design/connection",
          "toolName": "post_human_design_connection"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "centers",
        "channels",
        "chart",
        "chart-controls",
        "chart-dialog",
        "edit-bar",
        "empty",
        "error",
        "fact",
        "facts",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "reading",
        "readings",
        "section",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-hd-connection publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-hd-connection>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"hd-connection\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-connection-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-connection-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-hd-penta",
      "pascal": "RoxyHdPenta",
      "slug": "hd-penta",
      "domain": "Human Design",
      "renders": "Group penta channels split into upper and lower triangles",
      "endpointLabel": "POST /human-design/penta",
      "endpoints": [
        {
          "operationId": "calculatePenta",
          "method": "POST",
          "path": "/human-design/penta",
          "toolName": "post_human_design_penta"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "channels",
        "chart",
        "chart-controls",
        "chart-dialog",
        "edit-bar",
        "empty",
        "error",
        "fact",
        "facts",
        "form",
        "gates",
        "header",
        "hint",
        "legend",
        "loading",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-hd-penta publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-hd-penta>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"hd-penta\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-penta-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-penta-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-hd-variables",
      "pascal": "RoxyHdVariables",
      "slug": "hd-variables",
      "domain": "Human Design",
      "renders": "The four transformation arrows with direction, color, tone, and base, plus a reading per arrow grouped by layer and the cognition",
      "endpointLabel": "POST /human-design/variables",
      "endpoints": [
        {
          "operationId": "calculateVariables",
          "method": "POST",
          "path": "/human-design/variables",
          "toolName": "post_human_design_variables"
        }
      ],
      "parts": [
        "arrows",
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-hd-variables publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-hd-variables>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"hd-variables\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-variables-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hd-variables-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-forecast-timeline",
      "pascal": "RoxyForecastTimeline",
      "slug": "forecast-timeline",
      "domain": "Forecast",
      "renders": "Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",
      "endpointLabel": "POST /forecast/{timeline,significant-dates,transits}",
      "endpoints": [
        {
          "operationId": "generateTimeline",
          "method": "POST",
          "path": "/forecast/timeline",
          "toolName": "post_forecast_timeline"
        },
        {
          "operationId": "findSignificantDates",
          "method": "POST",
          "path": "/forecast/significant-dates",
          "toolName": "post_forecast_significant_dates"
        },
        {
          "operationId": "forecastTransits",
          "method": "POST",
          "path": "/forecast/transits",
          "toolName": "post_forecast_transits"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "events",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-forecast-timeline publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-forecast-timeline>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"forecast-timeline\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/forecast-timeline-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/forecast-timeline-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-forecast-digest",
      "pascal": "RoxyForecastDigest",
      "slug": "forecast-digest",
      "domain": "Forecast",
      "renders": "Per-window event counts, domain breakdown, and the highest-significance events",
      "endpointLabel": "POST /forecast/digest",
      "endpoints": [
        {
          "operationId": "generateDigest",
          "method": "POST",
          "path": "/forecast/digest",
          "toolName": "post_forecast_digest"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "label-track",
        "legend",
        "loading",
        "section",
        "window"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-forecast-digest publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-forecast-digest>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"forecast-digest\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/forecast-digest-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/forecast-digest-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-bazi-chart",
      "pascal": "RoxyBaziChart",
      "slug": "bazi-chart",
      "domain": "Chinese",
      "renders": "Year, month, day and hour pillars in hanzi with hidden stems, Ten Gods, Na Yin, element balance and interactions",
      "endpointLabel": "POST /chinese-astrology/bazi/chart",
      "endpoints": [
        {
          "operationId": "generateBaziChart",
          "method": "POST",
          "path": "/chinese-astrology/bazi/chart",
          "toolName": "post_chinese_astrology_bazi_chart"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "day-master",
        "edit-bar",
        "elements",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "interactions",
        "label-track",
        "loading",
        "pillar",
        "reading",
        "section",
        "summary"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-bazi-chart publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-bazi-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"bazi-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bazi-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/bazi-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-luck-pillars",
      "pascal": "RoxyLuckPillars",
      "slug": "luck-pillars",
      "domain": "Chinese",
      "renders": "Ten-year luck pillars as a strip with ages and years, the annual pillars, and the direction and start age behind them",
      "endpointLabel": "POST /chinese-astrology/bazi/luck-pillars",
      "endpoints": [
        {
          "operationId": "calculateLuckPillars",
          "method": "POST",
          "path": "/chinese-astrology/bazi/luck-pillars",
          "toolName": "post_chinese_astrology_bazi_luck_pillars"
        }
      ],
      "parts": [
        "annual-pillars",
        "attribution",
        "card",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "pillar",
        "section",
        "summary"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-luck-pillars publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-luck-pillars>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"luck-pillars\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/luck-pillars-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/luck-pillars-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-zodiac-card",
      "pascal": "RoxyZodiacCard",
      "slug": "zodiac-card",
      "domain": "Chinese",
      "renders": "The animal for a date, one animal in full, a daily reading, or a pair scored",
      "endpointLabel": "POST /chinese-astrology/zodiac/sign, GET /chinese-astrology/zodiac/{animals/{id},{id}/daily,compatibility/{sign1}/{sign2}}",
      "endpoints": [
        {
          "operationId": "calculateZodiacAnimal",
          "method": "POST",
          "path": "/chinese-astrology/zodiac/sign",
          "toolName": "post_chinese_astrology_zodiac_sign",
          "attrs": {
            "mode": "sign"
          }
        },
        {
          "operationId": "getZodiacAnimal",
          "method": "GET",
          "path": "/chinese-astrology/zodiac/animals/{id}",
          "toolName": "get_chinese_astrology_zodiac_animals_id",
          "attrs": {
            "mode": "animal"
          }
        },
        {
          "operationId": "getDailyZodiacReading",
          "method": "GET",
          "path": "/chinese-astrology/zodiac/{id}/daily",
          "toolName": "get_chinese_astrology_zodiac_id_daily",
          "attrs": {
            "mode": "daily"
          }
        },
        {
          "operationId": "getZodiacCompatibility",
          "method": "GET",
          "path": "/chinese-astrology/zodiac/compatibility/{sign1}/{sign2}",
          "toolName": "get_chinese_astrology_zodiac_compatibility_sign1_sign2",
          "attrs": {
            "mode": "compatibility"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "interpretation",
        "list",
        "loading",
        "outlook",
        "overview",
        "partners",
        "reading",
        "section",
        "summary",
        "traits",
        "trine"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-zodiac-card mode=\"sign\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-zodiac-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"zodiac-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/zodiac-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/zodiac-card-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'sign' | 'animal' | 'daily' | 'compatibility'",
          "description": "Which of the four zodiac reads the response is: the animal a date falls in, the reference read of one animal, a daily reading, or the compatibility of a pair."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-almanac-day",
      "pascal": "RoxyAlmanacDay",
      "slug": "almanac-day",
      "domain": "Chinese",
      "renders": "Day officer, favours and avoids, clash animal and pillars, as one day, a month, or a date search",
      "endpointLabel": "GET /chinese-astrology/calendar/{day/{date},monthly}, POST /chinese-astrology/calendar/auspicious-days",
      "endpoints": [
        {
          "operationId": "getAlmanacDay",
          "method": "GET",
          "path": "/chinese-astrology/calendar/day/{date}",
          "toolName": "get_chinese_astrology_calendar_day_date",
          "attrs": {
            "mode": "day"
          }
        },
        {
          "operationId": "getMonthlyAlmanac",
          "method": "GET",
          "path": "/chinese-astrology/calendar/monthly",
          "toolName": "get_chinese_astrology_calendar_monthly",
          "attrs": {
            "mode": "month"
          }
        },
        {
          "operationId": "lookupAuspiciousDays",
          "method": "POST",
          "path": "/chinese-astrology/calendar/auspicious-days",
          "toolName": "post_chinese_astrology_calendar_auspicious_days",
          "attrs": {
            "mode": "auspicious"
          }
        }
      ],
      "parts": [
        "activities",
        "attribution",
        "card",
        "days",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "label-track",
        "loading",
        "reading",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-almanac-day mode=\"day\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-almanac-day>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"almanac-day\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/almanac-day-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/almanac-day-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'day' | 'month' | 'auspicious'",
          "description": "Which read the response is: one almanac day as a card, a whole month of them as rows, or the days a search returned for one activity."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-flying-star-chart",
      "pascal": "RoxyFlyingStarChart",
      "slug": "flying-star-chart",
      "domain": "Feng Shui",
      "renders": "Nine-palace flying star plate with the mountain, period and water star per palace, the facing and sitting mountains and the structure",
      "endpointLabel": "POST /feng-shui/flying-stars/natal, GET /feng-shui/flying-stars/annual/{year}",
      "endpoints": [
        {
          "operationId": "generateFlyingStarChart",
          "method": "POST",
          "path": "/feng-shui/flying-stars/natal",
          "toolName": "post_feng_shui_flying_stars_natal",
          "attrs": {
            "mode": "natal"
          }
        },
        {
          "operationId": "getAnnualFlyingStars",
          "method": "GET",
          "path": "/feng-shui/flying-stars/annual/{year}",
          "toolName": "get_feng_shui_flying_stars_annual_year",
          "attrs": {
            "mode": "annual"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "label-track",
        "legend",
        "loading",
        "palaces",
        "plate",
        "reading",
        "section",
        "structure"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-flying-star-chart mode=\"natal\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-flying-star-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"flying-star-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/flying-star-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/flying-star-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'natal' | 'annual'",
          "description": "Which plate the response is: the natal chart of a building, which carries a mountain and a water star per palace, or one year of stars over it, which carries one."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-kua-card",
      "pascal": "RoxyKuaCard",
      "slug": "kua-card",
      "domain": "Feng Shui",
      "renders": "Kua number and trigram over the eight-sector direction map, favourable and unfavourable sectors ranked",
      "endpointLabel": "POST /feng-shui/kua, POST /feng-shui/eight-mansions",
      "endpoints": [
        {
          "operationId": "calculateKuaNumber",
          "method": "POST",
          "path": "/feng-shui/kua",
          "toolName": "post_feng_shui_kua",
          "attrs": {
            "mode": "kua"
          }
        },
        {
          "operationId": "generateEightMansions",
          "method": "POST",
          "path": "/feng-shui/eight-mansions",
          "toolName": "post_feng_shui_eight_mansions",
          "attrs": {
            "mode": "mansions"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "label-track",
        "legend",
        "loading",
        "plate",
        "reading",
        "section",
        "sectors"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-kua-card mode=\"kua\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-kua-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"kua-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kua-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/kua-card-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'kua' | 'mansions'",
          "description": "Which read the response is: the Kua number alone, or the full Eight Mansions map, which adds a reading per sector and names the best and worst of them."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-mayan-day-sign",
      "pascal": "RoxyMayanDaySign",
      "slug": "mayan-day-sign",
      "domain": "Mesoamerican",
      "renders": "Day sign and coefficient with the trecena, the reading, and the Calendar Round on the fuller response",
      "endpointLabel": "POST /mesoamerican-astrology/mayan/tzolkin, POST /mesoamerican-astrology/mayan/chart",
      "endpoints": [
        {
          "operationId": "calculateTzolkin",
          "method": "POST",
          "path": "/mesoamerican-astrology/mayan/tzolkin",
          "toolName": "post_mesoamerican_astrology_mayan_tzolkin",
          "attrs": {
            "mode": "day"
          }
        },
        {
          "operationId": "generateMayanChart",
          "method": "POST",
          "path": "/mesoamerican-astrology/mayan/chart",
          "toolName": "post_mesoamerican_astrology_mayan_chart",
          "attrs": {
            "mode": "chart"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "cross",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-mayan-day-sign mode=\"day\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-mayan-day-sign>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"mayan-day-sign\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/mayan-day-sign-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/mayan-day-sign-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'day' | 'chart'",
          "description": "Which read the response is: the Tzolkin day sign alone, or the full Calendar Round chart, which adds the Haab date, the Long Count, the year bearer and the four-fold cross."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-vastu-mandala",
      "pascal": "RoxyVastuMandala",
      "slug": "vastu-mandala",
      "domain": "Vastu",
      "renders": "Pada grid with a devata per square, the brahmasthan, and the entrance pada lit with its effect",
      "endpointLabel": "POST /vastu/mandala, POST /vastu/entrance",
      "endpoints": [
        {
          "operationId": "generateMandala",
          "method": "POST",
          "path": "/vastu/mandala",
          "toolName": "post_vastu_mandala",
          "attrs": {
            "mode": "mandala"
          }
        },
        {
          "operationId": "calculateEntrancePada",
          "method": "POST",
          "path": "/vastu/entrance",
          "toolName": "post_vastu_entrance",
          "attrs": {
            "mode": "entrance"
          }
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "details",
        "devatas",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "reading",
        "section",
        "sources"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-vastu-mandala mode=\"mandala\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-vastu-mandala>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"vastu-mandala\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vastu-mandala-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/vastu-mandala-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'mandala' | 'entrance'",
          "description": "Which read the response is: the projected pada grid with a devata on every square, or the entrance read, which lights the square the main door falls on."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-biorhythm-chart",
      "pascal": "RoxyBiorhythmChart",
      "slug": "biorhythm-chart",
      "domain": "Biorhythm",
      "renders": "Daily bars, forecast cycle lines, critical days",
      "endpointLabel": "POST /biorhythm/{daily,forecast,critical-days}",
      "endpoints": [
        {
          "operationId": "getDailyBiorhythm",
          "method": "POST",
          "path": "/biorhythm/daily",
          "toolName": "post_biorhythm_daily",
          "attrs": {
            "mode": "daily"
          }
        },
        {
          "operationId": "getForecast",
          "method": "POST",
          "path": "/biorhythm/forecast",
          "toolName": "post_biorhythm_forecast",
          "attrs": {
            "mode": "forecast"
          }
        },
        {
          "operationId": "getCriticalDays",
          "method": "POST",
          "path": "/biorhythm/critical-days",
          "toolName": "post_biorhythm_critical_days",
          "attrs": {
            "mode": "critical-days"
          }
        }
      ],
      "parts": [
        "attribution",
        "bars",
        "card",
        "chart",
        "days",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "legend",
        "loading",
        "reading",
        "readings",
        "section",
        "spotlight",
        "table"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-biorhythm-chart mode=\"daily\" publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-biorhythm-chart>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"biorhythm-chart\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/biorhythm-chart-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/biorhythm-chart-dark.webp"
      },
      "attributes": [
        {
          "name": "mode",
          "type": "'daily' | 'forecast' | 'critical-days'",
          "description": "Which biorhythm response shape to render: a single day, a multi-day forecast, or the critical days list."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-dosha-constitution",
      "pascal": "RoxyDoshaConstitution",
      "slug": "dosha-constitution",
      "domain": "Ayurveda",
      "renders": "Vata, pitta and kapha shares as one bar with the dominant humour and the cited factors behind it",
      "endpointLabel": "POST /ayurveda/constitution",
      "endpoints": [
        {
          "operationId": "calculateAyurvedicConstitution",
          "method": "POST",
          "path": "/ayurveda/constitution",
          "toolName": "post_ayurveda_constitution"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "details",
        "disclaimer",
        "edit-bar",
        "empty",
        "error",
        "factors",
        "form",
        "header",
        "hint",
        "label-track",
        "loading",
        "planet-humours",
        "ranking",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-dosha-constitution publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-dosha-constitution>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"dosha-constitution\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dosha-constitution-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dosha-constitution-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-hexagram",
      "pascal": "RoxyHexagram",
      "slug": "hexagram",
      "domain": "I Ching",
      "renders": "Hexagram figure with trigrams, judgment, image, and a reading per line (statement plus meaning); a cast highlights the moving lines and the resulting hexagram",
      "endpointLabel": "GET /iching/hexagrams/{number}, /iching/hexagrams/random, /iching/hexagrams/lookup, /iching/cast, POST /iching/daily, /iching/daily/cast",
      "endpoints": [
        {
          "operationId": "getRandomHexagram",
          "method": "GET",
          "path": "/iching/hexagrams/random",
          "toolName": "get_iching_hexagrams_random"
        },
        {
          "operationId": "getHexagram",
          "method": "GET",
          "path": "/iching/hexagrams/{number}",
          "toolName": "get_iching_hexagrams_number"
        },
        {
          "operationId": "lookupHexagram",
          "method": "GET",
          "path": "/iching/hexagrams/lookup",
          "toolName": "get_iching_hexagrams_lookup"
        },
        {
          "operationId": "castReading",
          "method": "GET",
          "path": "/iching/cast",
          "toolName": "get_iching_cast"
        },
        {
          "operationId": "getDailyHexagram",
          "method": "POST",
          "path": "/iching/daily",
          "toolName": "post_iching_daily"
        },
        {
          "operationId": "castDailyReading",
          "method": "POST",
          "path": "/iching/daily/cast",
          "toolName": "post_iching_daily_cast"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "changing-lines",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "readings",
        "resulting-hexagram",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-hexagram publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-hexagram>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"hexagram\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hexagram-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/hexagram-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-crystal-card",
      "pascal": "RoxyCrystalCard",
      "slug": "crystal-card",
      "domain": "Crystals",
      "renders": "Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",
      "endpointLabel": "GET /crystals/{id}",
      "endpoints": [
        {
          "operationId": "getCrystal",
          "method": "GET",
          "path": "/crystals/{id}",
          "toolName": "get_crystals_id"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "chart",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "keywords",
        "loading",
        "meaning",
        "pairs-with",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-crystal-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-crystal-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"crystal-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/crystal-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/crystal-card-dark.webp"
      },
      "sideReads": [
        {
          "kind": "picker",
          "endpoint": "getCrystal",
          "field": "id",
          "operationId": "listCrystals",
          "method": "GET",
          "path": "/crystals"
        }
      ],
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-crystal-grid",
      "pascal": "RoxyCrystalGrid",
      "slug": "crystal-grid",
      "domain": "Crystals",
      "renders": "Crystal gallery with chakra, zodiac, element, colour, and planet filters; a pick opens the card in place",
      "endpointLabel": "GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",
      "endpoints": [
        {
          "operationId": "listCrystals",
          "method": "GET",
          "path": "/crystals",
          "toolName": "get_crystals"
        },
        {
          "operationId": "getCrystalsByChakra",
          "method": "GET",
          "path": "/crystals/chakra/{chakra}",
          "toolName": "get_crystals_chakra"
        },
        {
          "operationId": "getCrystalsByElement",
          "method": "GET",
          "path": "/crystals/element/{element}",
          "toolName": "get_crystals_element"
        },
        {
          "operationId": "getCrystalsByZodiac",
          "method": "GET",
          "path": "/crystals/zodiac/{sign}",
          "toolName": "get_crystals_zodiac_sign"
        },
        {
          "operationId": "getBirthstones",
          "method": "GET",
          "path": "/crystals/birthstone/{month}",
          "toolName": "get_crystals_birthstone_month"
        },
        {
          "operationId": "searchCrystals",
          "method": "GET",
          "path": "/crystals/search",
          "toolName": "get_crystals_search"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "crystals",
        "detail",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "more",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-crystal-grid publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-crystal-grid>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"crystal-grid\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/crystal-grid-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/crystal-grid-dark.webp"
      },
      "sideReads": [
        {
          "kind": "options",
          "endpoint": "listCrystals",
          "field": "color",
          "operationId": "listCrystalColors",
          "method": "GET",
          "path": "/crystals/colors"
        },
        {
          "kind": "options",
          "endpoint": "listCrystals",
          "field": "planet",
          "operationId": "listCrystalPlanets",
          "method": "GET",
          "path": "/crystals/planets"
        },
        {
          "kind": "more",
          "endpoint": "listCrystals",
          "operationId": "listCrystals",
          "method": "GET",
          "path": "/crystals"
        },
        {
          "kind": "more",
          "endpoint": "getCrystalsByChakra",
          "operationId": "getCrystalsByChakra",
          "method": "GET",
          "path": "/crystals/chakra/{chakra}"
        },
        {
          "kind": "more",
          "endpoint": "getCrystalsByElement",
          "operationId": "getCrystalsByElement",
          "method": "GET",
          "path": "/crystals/element/{element}"
        },
        {
          "kind": "more",
          "endpoint": "getCrystalsByZodiac",
          "operationId": "getCrystalsByZodiac",
          "method": "GET",
          "path": "/crystals/zodiac/{sign}"
        },
        {
          "kind": "more",
          "endpoint": "searchCrystals",
          "operationId": "searchCrystals",
          "method": "GET",
          "path": "/crystals/search"
        },
        {
          "kind": "row",
          "operationId": "getCrystal",
          "method": "GET",
          "path": "/crystals/{id}"
        }
      ],
      "attributes": [
        {
          "name": "heading",
          "type": "string",
          "description": "Override the auto-derived grid heading. Empty by default, in which case the heading is derived from the response filter (chakra, element, zodiac sign, or birth month)."
        },
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-symbol-select",
          "description": "Provides the selected list entry so the page can show its details."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-dream-card",
      "pascal": "RoxyDreamCard",
      "slug": "dream-card",
      "domain": "Dreams",
      "renders": "Symbol name, interpretation body, and letter chip",
      "endpointLabel": "GET /dreams/symbols/{id}",
      "endpoints": [
        {
          "operationId": "getDreamSymbol",
          "method": "GET",
          "path": "/dreams/symbols/{id}",
          "toolName": "get_dreams_symbols_id"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-dream-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-dream-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"dream-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dream-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dream-card-dark.webp"
      },
      "sideReads": [
        {
          "kind": "picker",
          "endpoint": "getDreamSymbol",
          "field": "id",
          "operationId": "searchDreamSymbols",
          "method": "GET",
          "path": "/dreams/symbols"
        }
      ],
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-dream-search",
      "pascal": "RoxyDreamSearch",
      "slug": "dream-search",
      "domain": "Dreams",
      "renders": "The dream dictionary as tiles, browsed A to Z or searched; a pick opens the card in place",
      "endpointLabel": "GET /dreams/symbols",
      "endpoints": [
        {
          "operationId": "searchDreamSymbols",
          "method": "GET",
          "path": "/dreams/symbols",
          "toolName": "get_dreams_symbols"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "detail",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "more",
        "section",
        "symbols"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-dream-search publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-dream-search>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"dream-search\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dream-search-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/dream-search-dark.webp"
      },
      "sideReads": [
        {
          "kind": "options",
          "endpoint": "searchDreamSymbols",
          "field": "letter",
          "operationId": "getSymbolLetterCounts",
          "method": "GET",
          "path": "/dreams/symbols/letters"
        },
        {
          "kind": "more",
          "endpoint": "searchDreamSymbols",
          "operationId": "searchDreamSymbols",
          "method": "GET",
          "path": "/dreams/symbols"
        },
        {
          "kind": "row",
          "operationId": "getDreamSymbol",
          "method": "GET",
          "path": "/dreams/symbols/{id}"
        }
      ],
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-symbol-select",
          "description": "Provides the selected list entry so the page can show its details."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-angel-number-card",
      "pascal": "RoxyAngelNumberCard",
      "slug": "angel-number-card",
      "domain": "Angel Numbers",
      "renders": "Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",
      "endpointLabel": "GET /angel-numbers/numbers/{number}, POST /angel-numbers/daily",
      "endpoints": [
        {
          "operationId": "getAngelNumber",
          "method": "GET",
          "path": "/angel-numbers/numbers/{number}",
          "toolName": "get_angel_numbers_number"
        },
        {
          "operationId": "getDailyAngelNumber",
          "method": "POST",
          "path": "/angel-numbers/daily",
          "toolName": "post_angel_numbers_daily"
        }
      ],
      "parts": [
        "action-steps",
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "reading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-angel-number-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-angel-number-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"angel-number-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/angel-number-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/angel-number-card-dark.webp"
      },
      "sideReads": [
        {
          "kind": "picker",
          "endpoint": "getAngelNumber",
          "field": "number",
          "operationId": "listAngelNumbers",
          "method": "GET",
          "path": "/angel-numbers/numbers"
        }
      ],
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-angel-number-lookup",
      "pascal": "RoxyAngelNumberLookup",
      "slug": "angel-number-lookup",
      "domain": "Angel Numbers",
      "renders": "Pattern analysis plus known meaning and digit-root fallback",
      "endpointLabel": "GET /angel-numbers/lookup",
      "endpoints": [
        {
          "operationId": "analyzeNumberSequence",
          "method": "GET",
          "path": "/angel-numbers/lookup",
          "toolName": "get_angel_numbers_lookup"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "context",
        "details",
        "digit-root",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "known-meaning",
        "loading",
        "reading",
        "readings",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-angel-number-lookup publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-angel-number-lookup>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"angel-number-lookup\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/angel-number-lookup-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/angel-number-lookup-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-reference-card",
      "pascal": "RoxyReferenceCard",
      "slug": "reference-card",
      "domain": "Reference",
      "renders": "Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",
      "endpointLabel": "GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/{rashis,avasthas}/{id}, /iching/trigrams/{id}, /human-design/gates/{number}, /human-design/centers/{id}, /numerology/meanings/{number}",
      "endpoints": [
        {
          "operationId": "getZodiacSign",
          "method": "GET",
          "path": "/astrology/signs/{id}",
          "toolName": "get_astrology_signs_id"
        },
        {
          "operationId": "getPlanetMeaning",
          "method": "GET",
          "path": "/astrology/planet-meanings/{id}",
          "toolName": "get_astrology_planet_meanings_id"
        },
        {
          "operationId": "getRashi",
          "method": "GET",
          "path": "/vedic-astrology/rashis/{id}",
          "toolName": "get_vedic_astrology_rashis_id"
        },
        {
          "operationId": "getTrigram",
          "method": "GET",
          "path": "/iching/trigrams/{id}",
          "toolName": "get_iching_trigrams_id"
        },
        {
          "operationId": "getGate",
          "method": "GET",
          "path": "/human-design/gates/{number}",
          "toolName": "get_human_design_gates_number"
        },
        {
          "operationId": "getCenter",
          "method": "GET",
          "path": "/human-design/centers/{id}",
          "toolName": "get_human_design_centers_id"
        },
        {
          "operationId": "getNumberMeaning",
          "method": "GET",
          "path": "/numerology/meanings/{number}",
          "toolName": "get_numerology_meanings_number"
        },
        {
          "operationId": "getAvastha",
          "method": "GET",
          "path": "/vedic-astrology/avasthas/{id}",
          "toolName": "get_vedic_astrology_avasthas_id"
        }
      ],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "loading",
        "section"
      ],
      "snippets": {
        "script": "<!-- Optional: Rosewater theme (drop this line for the default look) -->\n<!-- <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/styles/themes/practitioner.css\"> -->\n<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js\" defer></script>\n<roxy-reference-card publishable-key=\"pk_live_YOUR_KEY\" hide-sections=\"hint\"></roxy-reference-card>",
        "oneTag": "<script src=\"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js\" defer></script>\n<div data-roxy-widget=\"reference-card\" data-publishable-key=\"pk_live_YOUR_KEY\" data-hide-sections=\"hint\"></div>"
      },
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/reference-card-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/reference-card-dark.webp"
      },
      "sideReads": [
        {
          "kind": "picker",
          "endpoint": "getZodiacSign",
          "field": "id",
          "operationId": "listZodiacSigns",
          "method": "GET",
          "path": "/astrology/signs"
        },
        {
          "kind": "picker",
          "endpoint": "getPlanetMeaning",
          "field": "id",
          "operationId": "listPlanetMeanings",
          "method": "GET",
          "path": "/astrology/planet-meanings"
        },
        {
          "kind": "picker",
          "endpoint": "getTrigram",
          "field": "id",
          "operationId": "listTrigrams",
          "method": "GET",
          "path": "/iching/trigrams"
        }
      ],
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-endpoint-form",
      "pascal": "RoxyEndpointForm",
      "slug": "endpoint-form",
      "domain": "Helper",
      "renders": "Schema-driven form, emits roxy-submit",
      "endpointLabel": "Any endpoint, from the spec",
      "endpoints": [],
      "parts": [
        "advanced",
        "attribution",
        "edit-bar",
        "empty",
        "error",
        "field",
        "field-error",
        "form",
        "group",
        "hint",
        "loading",
        "submit",
        "title",
        "validation-error"
      ],
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/endpoint-form-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/endpoint-form-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path the form is built for and submits to, e.g. \"astrology/natal-chart\". The fields are derived from the spec for that operation."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method of the operation. Defaults to POST."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Explicit OpenAPI spec URL to build the form from. Empty resolves a version-pinned slice first, then the production spec."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the submit-button label. Empty derives an outcome-first label from the endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) forwarded to the slotted city search so a natal or synastry form can geocode."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the slotted city search sends its request, absolute or page-relative. Set it when the page routes its API traffic through its own server. Unset, the search keeps its own default."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-location-search",
      "pascal": "RoxyLocationSearch",
      "slug": "location-search",
      "domain": "Helper",
      "renders": "Debounced city search input, emits roxy-location-select",
      "endpointLabel": "GET /location/search",
      "endpoints": [],
      "parts": [
        "attribution",
        "edit-bar",
        "empty",
        "error",
        "form",
        "hint",
        "input",
        "loading",
        "option",
        "results"
      ],
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/location-search-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/location-search-dark.webp"
      },
      "attributes": [
        {
          "name": "api-key",
          "type": "string"
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) the search sends with its request. A secret key is refused client-side and never sent. Leave unset when `endpoint` or `submitUrl` points at your own server route."
        },
        {
          "name": "endpoint",
          "type": "string",
          "description": "Where the search sends its GET while the visitor types, as an absolute URL or a page-relative path such as \"/api/roxy/location\". Wins over submitUrl. Unset with no submitUrl, the search calls the RoxyAPI location search."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. With no endpoint set, each search is POSTed there as `{ path: \"/location/search\", method: \"GET\", query: { q, limit } }`, the shape every component request takes there."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the search. Passed through untouched and never read."
        },
        {
          "name": "placeholder",
          "type": "string",
          "description": "Input placeholder. The default renders in the page language; a caller-supplied one is printed as given."
        },
        {
          "name": "default-value",
          "type": "string",
          "description": "Initial text in the input, for restoring a previous search."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    },
    {
      "tag": "roxy-data",
      "pascal": "RoxyData",
      "slug": "data",
      "domain": "Helper",
      "renders": "Generic fallback renderer for unknown shapes",
      "endpointLabel": "Any response shape",
      "endpoints": [],
      "parts": [
        "attribution",
        "card",
        "details",
        "edit-bar",
        "empty",
        "error",
        "form",
        "header",
        "hint",
        "label-track",
        "loading",
        "table"
      ],
      "preview": {
        "light": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/data-light.webp",
        "dark": "https://cdn.jsdelivr.net/gh/RoxyAPI/ui@v1.1.1/assets/previews/data-dark.webp"
      },
      "attributes": [
        {
          "name": "data-endpoint",
          "type": "string",
          "description": "Endpoint path for built-in self-fetch, e.g. \"astrology/natal-chart\". Optional: with a publishableKey or submitUrl and no endpoint, the component fetches its default endpoint, or the one its config prop (mode, period, type, spread, detail) selects. Set it to render any other endpoint the component draws. Pass `data` and no key for controlled mode."
        },
        {
          "name": "method",
          "type": "'GET' | 'POST'",
          "description": "HTTP method for the self-fetch request. Defaults to the method of the endpoint in use, and to POST beside an explicit endpoint."
        },
        {
          "name": "publishable-key",
          "type": "string",
          "description": "Browser-safe publishable key (pk_) for self-fetch. A secret key is refused client-side and never sent."
        },
        {
          "name": "base-url",
          "type": "string",
          "description": "Override the API origin for self-hosted or proxied deployments. Absolute, or relative to the page for a same-origin route."
        },
        {
          "name": "spec-url",
          "type": "string",
          "description": "Override the OpenAPI spec URL the self-fetch form introspects."
        },
        {
          "name": "submit-url",
          "type": "string",
          "description": "Your own backend route, which holds the secret key. Every request the component makes, the city search included, is POSTed there as `{ path, method, body, query }` instead of calling RoxyAPI directly, and the component renders the JSON your route returns, so no key of any kind reaches the browser."
        },
        {
          "name": "submit-context",
          "type": "string",
          "description": "An object of your own, sent to your submitUrl route as `context` beside the request, so a page can attach its own verification data to a proxied submission. Passed through untouched and never read by the component: what it holds is for your page and your route to agree on. Unset, nothing is added and the route receives the request exactly as before. Rides the submitUrl path only; a direct call sends what the endpoint declares."
        },
        {
          "name": "location-url",
          "type": "string",
          "description": "Where the self-fetch form city search sends its GET, absolute or relative to the page. Optional beside submitUrl, which carries the city search too; set it only to send the city search somewhere else. Unset with no submitUrl, the search calls the public location endpoint."
        },
        {
          "name": "remember",
          "type": "boolean",
          "description": "Persist the last self-fetch form values in sessionStorage, keyed by endpoint, and prefill the form when the visitor returns. Off by default."
        },
        {
          "name": "hide-readings",
          "type": "boolean",
          "description": "Render the chart and the data and omit the written interpretation. Off by default. Use it when the page supplies its own words: the wheels, tables, grids, legends and numbers stay, and the interpretive prose is left out of the markup entirely."
        },
        {
          "name": "hide-sections",
          "type": "string",
          "description": "Comma-separated list of `part` names to take off this component, for example \"patterns\" or \"patterns, legend\". Per element rather than per site, so the same component can drop a block on one page and keep it on another with no CSS. Sibling of hideReadings and a different tool: this hides a whole block whatever it contains, where hideReadings drops interpretive prose out of the markup. Names come from the `parts` array in components-catalog.json; a name the component does not carry hides nothing and is not an error."
        },
        {
          "name": "submit-label",
          "type": "string",
          "description": "Override the self-fetch form submit-button label. Empty derives an outcome-first label from the endpoint (Get reading, Generate, Compare, Cast)."
        },
        {
          "name": "error-message",
          "type": "string",
          "description": "Your own words for a failed self-fetch the API did not explain (a dropped connection, a response with no message). A failure the API explains, such as a spent quota, reads as the API worded it."
        },
        {
          "name": "attribution",
          "type": "string",
          "description": "Render a small \"Spiritual data by RoxyAPI\" credit under a self-fetch result, linking back to RoxyAPI. Off by default; set any value to enable, or \"off\" to force it off. Never shown in controlled mode."
        }
      ],
      "events": [
        {
          "name": "roxy-location-select",
          "description": "Provides the selected city with its coordinates and timezone."
        },
        {
          "name": "roxy-render-error",
          "description": "Reports a failed render before showing the response as structured data or an empty state."
        },
        {
          "name": "roxy-spec-error",
          "description": "Reports a failure to load the form schema, including the spec URL and error message."
        },
        {
          "name": "roxy-submit",
          "description": "Provides validated form values, the endpoint, query fields, and whether the form stays visible."
        },
        {
          "name": "roxy-validation-error",
          "description": "Reports missing required inputs or a refused client-side API key."
        }
      ]
    }
  ],
  "themes": [
    {
      "key": "practitioner",
      "name": "Rosewater",
      "stylesheet": "dist/styles/themes/practitioner.css"
    },
    {
      "key": "eucalyptus",
      "name": "Eucalyptus",
      "stylesheet": "dist/styles/themes/eucalyptus.css"
    },
    {
      "key": "kiln",
      "name": "Kiln",
      "stylesheet": "dist/styles/themes/kiln.css"
    },
    {
      "key": "moonlit",
      "name": "Moonlit",
      "stylesheet": "dist/styles/themes/moonlit.css"
    },
    {
      "key": "celeste",
      "name": "Celeste",
      "stylesheet": "dist/styles/themes/celeste.css"
    }
  ],
  "chromeParts": [
    "attribution",
    "edit-bar",
    "empty",
    "error",
    "form",
    "hint",
    "loading"
  ]
}
