{
  "versions": [
    {
      "version": "Unreleased",
      "date": null,
      "sections": {}
    },
    {
      "version": "1.8.1",
      "date": "2026-10-04",
      "sections": {
        "Changed": [
          {
            "text": "Site: `shayach.netlify.app` now redirects every path to `https://shayach.co.il` with a permanent redirect. The widget and its `/v1/` URL are unchanged. Nothing to change.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.8.0",
      "date": "2026-10-04",
      "sections": {
        "Added": [
          {
            "text": "Site: the configurator's statement step asks for the statement languages: Hebrew, English or both. With English the suggestions are in English, and with both every detail gets a Hebrew and an English field, the suggestions fill both, the code gets per-language values and the preview switches between the two languages.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Statement: every text you write (the organization name and description, list items such as `adjustments`, notices, contact names and the like) can now be given once per language instead of as one string, for example `organizationName: { he: \"מאפיית הדוגמה\", en: \"Example Bakery\" }`. The statement shows the value in its own language, else the page's language, else the first value given. Plain strings work exactly as before. Nothing to change; see \"Owner text in several languages\" in `docs/ai-agents.md`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "Widget: console warnings about invalid config values are shorter and all take one form: the option, the value and what the widget used instead (for example `[shayach] icon.size: 120 is not valid; using 96.`). The allowed values are in the schema and `docs/ai-agents.md`. This keeps `widget.js` small. Nothing to change.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.7.0",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "Widget: when both `statement` and `statementUrl` are set, the statement window also links to the statement page (new tab). Nothing to change: sites with both settings get the link automatically. With only `statement` the window has no link, and with only `statementUrl` the about card's button still links to the page.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.6.4",
      "date": "2026-10-02",
      "sections": {
        "Changed": [
          {
            "text": "Site: the statement page now says the business has no in-person reception, is open to search engines and is in the sitemap.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Fixed": [
          {
            "text": "Site: the widget's \"full statement\" button opens the statement window on every page of the site (it navigated away on pages that had only the statement address).",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.6.3",
      "date": "2026-10-02",
      "sections": {
        "Changed": [
          {
            "text": "Site: the accessibility statement page now lists the accessibility contact (name, phone, email) given by the owner.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.6.2",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "Site: the site's own accessibility statement page at `/accessibility-statement/`, linked from the footer and from the widget's about card. It lists only facts that were checked; the contact details and physical-service line are still listed as missing until the owner confirms them. The page is `noindex` until then.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "Widget: the button shows a grab cursor (grabbing while it is dragged), so visitors can tell it can be moved. Dragging itself is unchanged.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.6.1",
      "date": "2026-10-02",
      "sections": {
        "Fixed": [
          {
            "text": "Configurator: after ticking \"already have a statement page\", the address field now reliably receives focus in Safari-based browsers.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.6.0",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "Visitors can move the accessibility button: drag it (it snaps to the nearest of ten spots, five on each side) or choose a spot in the new \"Button position\" card in the panel, which also works with a keyboard. The choice is saved in the visitor's own browser for that site, and Reset settings puts the button back. Turn it off with `icon.draggable: false`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Four new button positions for `icon.position` and `icon.mobile.position`: `upper-right`, `upper-left`, `lower-right`, `lower-left`, a quarter and three quarters of the way down the screen.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "`theme.scrollbar`: the color of the scrollbars in the panel and the statement window. Default: `theme.primary`. A color below 3:1 against `theme.surface` is replaced with `theme.text`, with a warning.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The panel's last card, \"About the accessibility menu\", says what the menu is, lists the tools this menu has, notes that it does not replace an accessible site, and opens the full statement.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The generated statement opens in a readable window over the page: fact boxes, the contact details first, one block per section of the official template, and a print button that prints only the statement (in black on white, whatever the panel colors).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "`statement.js`: `data-layout=\"blocks\"` on the container renders the same block layout, with a minimal style scoped to the statement that keeps the page's font and colors (tune it with the CSS custom properties `--shayach-accent`, `--shayach-surface`, `--shayach-line` and `--shayach-muted`). Without it the markup is unchanged.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the configurator has a new step, \"Accessibility statement\": a short form with a live preview, the statement page address (default `/accessibility-statement`, or the address of a page you already have), the statement page code (in the block layout), and instructions for each platform. It also offers the ten positions, the drag switch and the scrollbar color.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "The panel's sections are collapsible cards, one open at a time, with a badge showing how many adjustments are on in each.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The statement window replaces the statement view inside the panel. The footer's \"הצהרת נגישות\" still links to `statementUrl` when it is set.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The panel opens on the side where the button is now, also after a visitor moved it.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The \"could not load\" message appears below the button when the button is in the top half of the screen.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The panel's color contrast warnings are logged when the panel first opens instead of on page load. The button's own colors are still corrected before it appears.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "`widget.js` is now up to 7 KB gzip (was 6 KB), for the drag code.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Compatibility: an older 1.x `widget.js` (for example a copy a visitor's browser cached before this release) warns about the four new position values and uses the default position, warns that `icon.draggable` and `theme.scrollbar` are unknown options and ignores them, and does not offer the position card, until the browser loads this version.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Removed": [
          {
            "text": "`icon.image`: the button always shows the universal accessibility symbol, in the four shapes. A config that still sets `icon.image` gets an unknown-option warning in the console and the regular icon. No site had installed the widget with a custom image, so nothing needs to change.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.5.0",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "Site: the logo spheres as a soft background on every page. They drift slowly, move with scroll (parallax) and gently with the pointer on desktop. Static soft blobs under reduced-motion.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "Site: scrollbars match the site colors everywhere (page, code blocks, dialog, widget preview). The ink and muted text colors are slightly darker so text stays at AA contrast over the background.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Widget: the panel's scrolling area uses the theme colors for its scrollbar (thumb from the primary color). No config change and nothing to do.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.4.3",
      "date": "2026-10-02",
      "sections": {
        "Changed": [
          {
            "text": "Site: configurator steps slide in the reading direction going forward and reverse going back, with a light scale and blur, and the step number pulses. Page-to-page navigation has a softer slide and fade with a steady header (browsers without view transitions get a fade-in on load). All motion is off under reduced-motion.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.4.2",
      "date": "2026-10-02",
      "sections": {
        "Fixed": [
          {
            "text": "Site: the configurator showed a \"next step\" button on the last step and a \"back\" button on the first, because the hidden attribute lost to the button display rule. Elements with the hidden attribute are now always hidden.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the paste dialog keeps one size when switching platforms. The instructions scroll inside it.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.4.1",
      "date": "2026-10-02",
      "sections": {
        "Fixed": [
          {
            "text": "Site: on narrow screens the configurator form was wider than the screen because of the code block, which clipped text on the left. Long links in the docs pages now wrap.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.4.0",
      "date": "2026-10-02",
      "sections": {
        "Fixed": [
          {
            "text": "Site: the configurator scripts and styles are always revalidated, so a cached page can no longer pair with an old script. The \"where to paste\" dialog jumps to the instructions on small screens after a platform is chosen, and has a way back to the list.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the next-step button on the last step before the code now reads \"לקבלת הקוד\".",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "Site: the example accessibility statement page is restyled to match the site and moved to `/statement/` (`/statement.html` redirects).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the docs have styled pages at `/docs/guide/`, `/docs/ai-agents/`, `/docs/schema/` and `/docs/changelog/`, rendered from the same sources at build time. The raw `.md` and `.json` files are unchanged. The footer links point to the styled pages.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.3.0",
      "date": "2026-10-02",
      "sections": {
        "Changed": [
          {
            "text": "Site: the configurator no longer has a profiles step (4 steps now). The six profiles are still explained on the home page.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the paste guide is a dialog with a platform picker (WordPress, Wix, Shopify, Webflow, Squarespace, plain HTML, AI tools, Google Sites).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the \"what is Shayach\" section is redesigned. The FAQ is animated and pages fade between each other. All motion is off under reduced-motion.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Site: the footer font credit line is removed (the font license file stays in the repo).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Docs: the AI agents guide link in `docs/guide.md` points to the site.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.2.1",
      "date": "2026-10-02",
      "sections": {
        "Fixed": [
          {
            "text": "The site share images (`/assets/og-image.png`, `/assets/og-image-square.png`) render the Hebrew text in the site font.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.2.0",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "The Shayach website at the site root: a Hebrew home page that explains the widget, a configurator page that builds the script tag (language, colors, icon size, shape and position, with a live preview), and a page for AI agents. Includes favicons, share images, `sitemap.xml`, `robots.txt` and structured data.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The Hebrew installation guide and the technical reference are also served as Markdown at `/docs/guide.md` and `/docs/ai-agents.md`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "`/llms.txt` links to those two files on the site instead of GitHub, and lists the new pages. The widget files under `/v1/` are unchanged.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.1.0",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "`statement.js` also renders into a container with the new attribute `data-shayach-statement`. The old attribute `data-il-a11y-statement` keeps working.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "The project is renamed Shayach (שייך). The repository is now [github.com/blakazulu/shayach](https://github.com/blakazulu/shayach).",
            "legal": false,
            "actionRequired": false,
            "links": [
              "https://github.com/blakazulu/shayach"
            ]
          },
          {
            "text": "The widget's address is now `https://shayach.co.il/v1/widget.js` (and `https://shayach.co.il/v1/statement.js` for the statement). The old address `il-a11y-widget.netlify.app` no longer works; no site had installed it yet. New installs use the new address, and the Content Security Policy instructions now name `https://shayach.co.il`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The widget's own element ids (`#shayach`, `#shayach-overlay`), the settings storage key (`shayach:v1`) and the console warning prefix (`[shayach]`) use the new name. Settings visitors saved under the old name are not carried over, so a returning visitor starts from the defaults once.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.0.1",
      "date": "2026-10-02",
      "sections": {
        "Changed": [
          {
            "text": "Documentation split into three documents: a Hebrew README for site owners and decision makers, a Hebrew step-by-step installation guide for owners with no technical background ([docs/guide.md](https://github.com/blakazulu/shayach/blob/main/docs/guide.md)), and an English technical reference for AI agents and developers ([docs/ai-agents.md](https://github.com/blakazulu/shayach/blob/main/docs/ai-agents.md)). `llms.txt` now points to the new reference, and the demo page links to the Hebrew guide.",
            "legal": false,
            "actionRequired": false,
            "links": [
              "https://github.com/blakazulu/shayach/blob/main/docs/guide.md",
              "https://github.com/blakazulu/shayach/blob/main/docs/ai-agents.md"
            ]
          }
        ],
        "Fixed": [
          {
            "text": "An empty `updatedAt` in the statement (as in the guide's fill-in template) is listed as not filled in yet, without a console warning.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    },
    {
      "version": "1.0.0",
      "date": "2026-10-02",
      "sections": {
        "Added": [
          {
            "text": "Project scaffolding: license (Apache 2.0 with NOTICE attribution), changelog, README, design document.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Compliance agents: weekly law monitor, independent verifier, and applier, with a shared runner script and a GitHub Actions workflow.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "`compliance/legal-state.json`: single source of truth for Israeli website accessibility requirements, accessibility statement requirements and the official statement template, with a verification status on every item.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Headless-browser fetcher for official sites that block plain fetching (gov.il, justice.gov.il).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Widget loader (`/v1/widget.js`) with a configurable floating button: four shapes, six positions, size, offsets, mobile overrides, custom image and colors. Adds nothing to the page until a visitor uses it.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Accessibility panel (side drawer) in Hebrew, Arabic, Russian and English with language switch, reset, hide for the session, keyboard and screen reader support, and automatic WCAG 2.2 AA text contrast for any theme.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "First adjustments: highlight links, highlight headings. Settings are remembered across pages.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "`window.A11yConfig` validation with console warnings, and its JSON Schema at `/v1/config.schema.json`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Text adjustments: font size (100% to 200%, scales px, rem and em sites without compounding, including content added later), line height, letter and word spacing (never letter-spaces Arabic), readable font, dyslexia font (OpenDyslexic, downloaded only when turned on), text alignment.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Color adjustments: dark, light and high contrast, monochrome, low and high saturation. Filters apply to the root element so fixed headers keep working.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "for sites with a Content Security Policy that want the dyslexia font: allow `https://shayach.co.il` in `font-src`.",
            "legal": false,
            "actionRequired": true,
            "links": []
          },
          {
            "text": "Navigation and display: stop animations (CSS animations, transitions, smooth scrolling, autoplaying videos, GIFs), hide images (kept for screen readers), emphasize focus, big cursor, reading guide, reading mask, and a page structure view to jump to headings and regions.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Read aloud: click or focus any text to hear it with the device's voice for that language, with adjustable speed; disabled with an explanation when the device has no voice for the page language.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Six one-click profiles: seizure safe, vision impaired, ADHD friendly, cognitive, dyslexia, keyboard navigation.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Generated accessibility statement (הצהרת נגישות) in Hebrew, Arabic, Russian and English, following the Commission's official template, shown in the panel and on the site's own page with `/v1/statement.js`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The statement covers every item in the Commission's guide on the accessibility statement (updated 15.04.2026), including measures taken, known limitations, temporary fault notices and partial conformance for third-party content ([gov.il](https://www.gov.il/he/pages/declaration_website_accessibility)).",
            "legal": true,
            "actionRequired": false,
            "links": [
              "https://www.gov.il/he/pages/declaration_website_accessibility"
            ]
          },
          {
            "text": "Add `statement` details to `window.A11yConfig` (organization name, updated date, adjustments made, contact, physical arrangements), publish a statement page, set `statementUrl`, and link the page from your footer: the Commission's guide requires at least two ways to reach the statement.",
            "legal": false,
            "actionRequired": true,
            "links": []
          },
          {
            "text": "README documents the small-business exemption thresholds, where the regulation (100,000 ILS) and the Commission's guide (120,000 ILS) differ ([Nevo](https://www.nevo.co.il/law_html/law01/500_865.htm), [gov.il](https://www.gov.il/he/pages/website_accessibility?chapterIndex=8)).",
            "legal": true,
            "actionRequired": false,
            "links": [
              "https://www.nevo.co.il/law_html/law01/500_865.htm",
              "https://www.gov.il/he/pages/website_accessibility?chapterIndex=8"
            ]
          },
          {
            "text": "`llms.txt` for AI agents at `/llms.txt` and a machine-readable `changelog.json` at `/v1/changelog.json`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Changed": [
          {
            "text": "Adjustments work under a strict Content-Security-Policy without `style-src 'unsafe-inline'`.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ],
        "Fixed": [
          {
            "text": "A saved read aloud on a device without a voice can now be turned off.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "A technological exemption without `alternatives` now logs a warning, because regulation 35ו(ג) requires publishing the alternative adjustments.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Owner-written statement text keeps its own language marking when the statement is shown in another language, so screen readers pronounce it correctly. Write it in the site's language.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "`statement: null` is treated as no statement (no statement button).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Reading guide and reading mask are disabled with an explanation on touch-only devices.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Font size no longer touches the widget's own page overlay.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Read aloud prefers voices installed on the device over online voices.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Adjustments win over `!important` rules in CSS cascade layers (Tailwind v4 `!` utilities) and over every unlayered page rule.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The button, reading aids, font size, stop animations and contrast keep working when a site replaces the whole `<body>` on navigation (Turbo Drive, some single-page app routers).",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Dark and light contrast now also override colors a page sets with `!important` in an element's own `style` attribute, and restore them when turned off.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Adjustments now also reach content inside open shadow roots (web components), including components added or defined after an adjustment is turned on. Closed shadow roots stay out of reach.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Escape closes the panel after a mouse click inside it, also in Safari, which never focuses a clicked button.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "The statement container accepts only whole heading levels 1 to 4, is rendered once even if `statement.js` is included twice, and one broken container no longer stops the others. A phone number without digits is shown as plain text, and a contact with only a name now logs a warning.",
            "legal": false,
            "actionRequired": false,
            "links": []
          },
          {
            "text": "Font size honors an em or rem font-size the page sets later while scaling is active, and restores it exactly when turned off.",
            "legal": false,
            "actionRequired": false,
            "links": []
          }
        ]
      }
    }
  ]
}
