Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 22:41 UTC

Mezzanine-UI / mezzanine

An enterprise-class UI design language and React/Angular UI library

TypeScriptMIT★ 25 Sterne⑂ 6 Forksseit Nov. 2020Auf GitHub ansehen ↗

Mezzanine-UI/mezzanine erreicht einen Gesundheitsindex von 71 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Vitality (92/100) ab, am schwächsten bei Community & Adoption (47/100). Zuletzt vor 6 Tagen aktualisiert. 2 Mitwirkende tragen den Großteil der jüngsten Arbeit.

71
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

71
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Mezzanine UIOrganisation
2 Follower4 öffentliche Reposseit Nov. 2020

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
npm@mezzanine-ui/ng1.0.0-rc.1041244vor 6 Tagen
npm@mezzanine-ui/core1.1.02.553120vor 81 Tagen
npm@mezzanine-ui/icons1.0.22.32086vor 101 Tagen
npm@mezzanine-ui/react1.4.22.920137vor 6 Tagen
npm@mezzanine-ui/system1.0.22.19682vor 101 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

92Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 6 Tagen
22.8/36Commit-Rhythmus — 33/52 Wochen mit Commits
18/18Commit-Volumen — 2.444 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year2.444
human_commit_share1
days_since_last_push6
active_weeks_last_year33

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 99 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 6 Tagen
27/27Release-Rhythmus — ein Release etwa alle 6,7 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count99
latest_release_tag@mezzanine-ui/react@1.4.2
releases_from_tagsnein
days_since_latest_release6
mean_days_between_releases6,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

47Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
22.4/60Stars — 25 Stars
5.8/25Forks — 6 Forks
2.7/15Watcher — 4 Watcher
Verwendete Eingangsdaten
forks6
stars25
watchers4
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
53.6/80Downloads pro Monat — 10.401 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@mezzanine-ui/ng, @mezzanine-ui/core, @mezzanine-ui/icons, @mezzanine-ui/react, @mezzanine-ui/system
dependents
ecosystemsnpm
total_downloads
monthly_downloads10.401
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

74Gut · 24 % des Gesamtindex
Wie die Bewertung erfolgt
25.2/54Bus-Faktor — 2 Beitragende decken die Hälfte aller Commits ab
12.8/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 43 % der Commits
13.5/13.5Breite der Beitragenden — 15 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 6 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor2
contributors_sampled15
top_contributor_share0,433
Wie die Bewertung erfolgt
46.2/46.8Issue-Lösungsquote — 99 % der Issues geschlossen
35.6/38.3PR-Annahme — 327/351 entschiedene PRs gemergt
10.5/15OpenSSF Scorecard: Code-Review — Found 7/9 approved changesets -- score normalized to 7
Verwendete Eingangsdaten
merged_prs327
open_issues1
closed_issues85
issue_closed_ratio0,988
closed_unmerged_prs24
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
3.4/25Reichweite des Inhabers — 2 Follower von Mezzanine-UI
16.5/25Kontohistorie — 4 öffentliche Repos, Kontoalter ca. 5 Jahre
Verwendete Eingangsdaten
followers2
owner_typeOrganization
is_verified
owner_loginMezzanine-UI
public_repos4
account_age_days2.076

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 5 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 6 Tagen
20/20Versionshistorie — 137 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@mezzanine-ui/ng, @mezzanine-ui/core, @mezzanine-ui/icons, @mezzanine-ui/react, @mezzanine-ui/system
ecosystemsnpm
any_deprecatednein
min_days_since_publish6

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

77Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.mjs
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
8/20OpenSSF Scorecard: CI-Tests — 3 out of 7 merged PRs checked by a CI test -- score normalized to 4
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://storybook.mezzanine-ui.org
10/10Repository-Beschreibung
10/10Topics — 5 Topics
10/10Wiki
Verwendete Eingangsdaten
topicstypescript, ui-library, react, scss, angular
has_wikija
homepagehttps://storybook.mezzanine-ui.org
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

58Mittel · 16 % des Gesamtindex

Sicherheitslage

47Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
1/2.5CI-Tests — 3 out of 7 merged PRs checked by a CI test -- score normalized to 4
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
5.2/7.5Code-Review — Found 7/9 approved changesets -- score normalized to 7
2.5/2.5Contributors — project has 6 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 158 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages10
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von npm:@mezzanine-ui/ng@1.0.0-rc.10 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 10 Paketen. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

74Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
15/15Maschinenlesbare Doku (llms.txt) — llms.txt vorhanden
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtja
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes3.353
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.mjs
11/11Statische Typprüfung — .storybook-ng/tsconfig.json, packages/core/tsconfig.json, packages/icons/tsconfig.json, packages/ng/.storybook/tsconfig.json, packages/ng/tsconfig.json, packages/react/tsconfig.json, packages/system/tsconfig.json, tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 47 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesyarn.lock
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs.storybook-ng/tsconfig.json, packages/core/tsconfig.json, packages/icons/tsconfig.json, packages/ng/.storybook/tsconfig.json, packages/ng/tsconfig.json, packages/react/tsconfig.json, packages/system/tsconfig.json, tsconfig.json
agent_commit_share0,47
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
54.9/55Handhabbare Dateigrößen — 2/1.499 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes125.255
source_files_sampled1.499
oversized_source_files2
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
20/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalja
api_schema_files

Eckdaten

25GitHub-Sterne
15Mitwirkende
2.444Commits, letzte 12 Monate
6Tage seit letztem Push
99Releases
2Bus-Faktor
1offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 6 ⇿
0Sterne
6Forks
91Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

123456622021-082024-012026-06
Major 0Minor 0Patch 0

Jeder Punkt umfasst 5 Tage.

OpenSSF Scorecard 4.7 / 10
4.7Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-27 22:41 UTC

10Binary-Artifactsno binaries found in the repo
1Branch-Protectionbranch protection is not maximal on development and all release branches
4CI-Tests3 out of 7 merged PRs checked by a CI test -- score normalized to 4
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
7Code-ReviewFound 7/9 approved changesets -- score normalized to 7
10Contributorsproject has 6 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities158 existing vulnerabilities detected
Direkte Abhängigkeiten 27
RegistryPaketVersionsvorgabeManifest
npm@mezzanine-ui/icons1.0.2packages/core/package.json
npm@mezzanine-ui/system1.0.2packages/core/package.json
npmlodash^4.17.21packages/core/package.json
npmtslib^2.8.1packages/core/package.json
npm@floating-ui/dom^1.7.4packages/ng/package.json
npm@mezzanine-ui/core1.1.0packages/ng/package.json
npm@mezzanine-ui/icons1.0.2packages/ng/package.json
npm@mezzanine-ui/system1.0.2packages/ng/package.json
npmclsx^2.1.1packages/ng/package.json
npmoverlayscrollbars^2.13.0packages/ng/package.json
npmtslib^2.8.1packages/ng/package.json
npm@floating-ui/dom^1.7.4packages/react/package.json
npm@floating-ui/react-dom^2.1.6packages/react/package.json
npm@hello-pangea/dnd^18.0.1packages/react/package.json
npm@mezzanine-ui/core1.1.0packages/react/package.json
npm@mezzanine-ui/icons1.0.2packages/react/package.json
npm@mezzanine-ui/system1.0.2packages/react/package.json
npm@tanstack/react-virtual^3.13.13packages/react/package.json
npm@types/react-transition-group^4.4.12packages/react/package.json
npmclsx^2.1.1packages/react/package.json
npmkeycode^2.2.1packages/react/package.json
npmlodash^4.17.21packages/react/package.json
npmoverlayscrollbars^2.13.0packages/react/package.json
npmoverlayscrollbars-react^0.5.6packages/react/package.json
npmreact-transition-group^4.4.5packages/react/package.json
npmtslib^2.8.1packages/react/package.json
npmtslib^2.8.1packages/system/package.json
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Abhängigkeits-Advisories 0

Die Installation von npm:@mezzanine-ui/ng@1.0.0-rc.10 zieht 10 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "typescript",
        "ui-library",
        "react",
        "scss",
        "angular"
      ],
      "is_fork": false,
      "size_kb": 18784,
      "has_wiki": true,
      "homepage": "https://storybook.mezzanine-ui.org",
      "languages": {
        "MDX": 84653,
        "SCSS": 443882,
        "Shell": 25302,
        "JavaScript": 44333,
        "TypeScript": 7532162
      },
      "pushed_at": "2026-07-21T03:05:29Z",
      "created_at": "2020-11-19T09:21:54Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T03:05:39Z",
      "description": "An enterprise-class UI design language and React/Angular UI library",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Mezzanine UI",
      "type": "Organization",
      "login": "Mezzanine-UI",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/74706754?v=4",
      "created_at": "2020-11-19T08:49:19Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 2076
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "@mezzanine-ui/react@1.4.2",
          "kind": "other",
          "published_at": "2026-07-21T03:10:36Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.10",
          "kind": "other",
          "published_at": "2026-07-21T03:10:00Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.4.1",
          "kind": "other",
          "published_at": "2026-06-22T07:24:19Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.9",
          "kind": "other",
          "published_at": "2026-06-22T07:23:52Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.4.0",
          "kind": "other",
          "published_at": "2026-06-18T03:18:13Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.8",
          "kind": "other",
          "published_at": "2026-06-18T03:17:30Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.3.1",
          "kind": "other",
          "published_at": "2026-06-11T07:25:40Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.7",
          "kind": "other",
          "published_at": "2026-06-11T07:24:42Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.3.0",
          "kind": "other",
          "published_at": "2026-05-22T06:44:54Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.6",
          "kind": "other",
          "published_at": "2026-05-22T06:44:17Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.2.0",
          "kind": "other",
          "published_at": "2026-05-07T08:36:10Z"
        },
        {
          "tag": "@mezzanine-ui/core@1.1.0",
          "kind": "other",
          "published_at": "2026-05-07T08:35:05Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.5",
          "kind": "other",
          "published_at": "2026-05-07T08:34:14Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.1.0",
          "kind": "other",
          "published_at": "2026-04-24T05:43:57Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.4",
          "kind": "other",
          "published_at": "2026-04-22T08:52:57Z"
        },
        {
          "tag": "@mezzanine-ui/core@1.0.4",
          "kind": "other",
          "published_at": "2026-04-22T08:52:32Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.4",
          "kind": "other",
          "published_at": "2026-04-22T08:52:05Z"
        },
        {
          "tag": "@mezzanine-ui/ng@1.0.0-rc.3",
          "kind": "other",
          "published_at": "2026-04-21T08:10:13Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.3",
          "kind": "other",
          "published_at": "2026-04-21T08:10:39Z"
        },
        {
          "tag": "@mezzanine-ui/core@1.0.3",
          "kind": "other",
          "published_at": "2026-04-21T08:10:29Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.2",
          "kind": "other",
          "published_at": "2026-04-17T06:11:04Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.1",
          "kind": "other",
          "published_at": "2026-04-14T05:27:56Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0",
          "kind": "other",
          "published_at": "2026-04-02T07:19:35Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.8",
          "kind": "other",
          "published_at": "2026-03-27T06:26:21Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.7",
          "kind": "other",
          "published_at": "2026-03-26T07:12:51Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.6",
          "kind": "other",
          "published_at": "2026-03-18T07:10:18Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.5",
          "kind": "other",
          "published_at": "2026-03-13T03:52:30Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.4",
          "kind": "other",
          "published_at": "2026-03-11T02:42:27Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.3",
          "kind": "other",
          "published_at": "2026-03-06T05:12:14Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.2",
          "kind": "other",
          "published_at": "2026-03-05T02:54:27Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.1",
          "kind": "other",
          "published_at": "2026-03-03T02:51:00Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-rc.0",
          "kind": "other",
          "published_at": "2026-02-26T08:47:39Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.7",
          "kind": "other",
          "published_at": "2026-02-12T07:46:59Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.6",
          "kind": "other",
          "published_at": "2026-02-03T02:19:08Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.5",
          "kind": "other",
          "published_at": "2026-01-29T05:52:54Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.4",
          "kind": "other",
          "published_at": "2026-01-27T00:22:26Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.3",
          "kind": "other",
          "published_at": "2026-01-20T09:17:58Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-01-09T12:02:21Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.1",
          "kind": "other",
          "published_at": "2025-12-31T09:40:08Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-beta.0",
          "kind": "other",
          "published_at": "2025-12-31T09:02:48Z"
        },
        {
          "tag": "@mezzanine-ui/react@1.0.0-alpha.0",
          "kind": "other",
          "published_at": "2025-12-17T06:08:40Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.16.0",
          "kind": "other",
          "published_at": "2025-04-23T03:34:49Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.15.3",
          "kind": "other",
          "published_at": "2024-10-30T06:44:02Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.15.2",
          "kind": "other",
          "published_at": "2024-08-21T01:29:27Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.15.1",
          "kind": "other",
          "published_at": "2024-08-16T02:49:01Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.15.0",
          "kind": "other",
          "published_at": "2024-08-14T05:54:12Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.10",
          "kind": "other",
          "published_at": "2024-07-22T03:52:11Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.13",
          "kind": "other",
          "published_at": "2024-07-22T03:51:03Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.9",
          "kind": "other",
          "published_at": "2024-07-10T06:55:11Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.8",
          "kind": "other",
          "published_at": "2024-04-12T04:53:56Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.5",
          "kind": "other",
          "published_at": "2024-01-29T06:50:25Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.12",
          "kind": "other",
          "published_at": "2024-01-10T06:29:08Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.4",
          "kind": "other",
          "published_at": "2024-01-10T05:11:44Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.3",
          "kind": "other",
          "published_at": "2024-01-05T04:28:48Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.2",
          "kind": "other",
          "published_at": "2023-12-18T07:03:13Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.1",
          "kind": "other",
          "published_at": "2023-12-14T08:54:41Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.14.0",
          "kind": "other",
          "published_at": "2023-12-06T05:25:34Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.11",
          "kind": "other",
          "published_at": "2023-12-05T06:19:17Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.10",
          "kind": "other",
          "published_at": "2023-10-31T03:37:18Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.10",
          "kind": "other",
          "published_at": "2023-10-27T06:01:32Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.9",
          "kind": "other",
          "published_at": "2023-10-18T02:04:20Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.8",
          "kind": "other",
          "published_at": "2023-10-12T02:23:17Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.7",
          "kind": "other",
          "published_at": "2023-10-11T01:51:28Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.6",
          "kind": "other",
          "published_at": "2023-09-22T05:46:06Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.5",
          "kind": "other",
          "published_at": "2023-09-19T03:47:38Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.4",
          "kind": "other",
          "published_at": "2023-09-18T02:10:34Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.3",
          "kind": "other",
          "published_at": "2023-08-07T04:48:33Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.2",
          "kind": "other",
          "published_at": "2023-07-28T05:06:17Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.1",
          "kind": "other",
          "published_at": "2023-07-25T02:09:56Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.13.0",
          "kind": "other",
          "published_at": "2023-07-10T06:16:49Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.9",
          "kind": "other",
          "published_at": "2023-06-19T08:06:57Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.8",
          "kind": "other",
          "published_at": "2023-06-17T07:38:28Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.7",
          "kind": "other",
          "published_at": "2023-06-14T06:32:04Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.6",
          "kind": "other",
          "published_at": "2023-06-08T03:30:05Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.5",
          "kind": "other",
          "published_at": "2023-05-08T09:27:29Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.4",
          "kind": "other",
          "published_at": "2023-03-10T06:38:16Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.3",
          "kind": "other",
          "published_at": "2023-03-02T01:45:25Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.2",
          "kind": "other",
          "published_at": "2023-02-20T06:17:07Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.1",
          "kind": "other",
          "published_at": "2023-02-06T04:14:10Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.12.0",
          "kind": "other",
          "published_at": "2022-11-16T08:25:32Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.11.3",
          "kind": "other",
          "published_at": "2022-11-08T08:44:07Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.11.2",
          "kind": "other",
          "published_at": "2022-09-28T02:19:57Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.11.1",
          "kind": "other",
          "published_at": "2022-08-03T07:37:48Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.11.0",
          "kind": "other",
          "published_at": "2022-06-29T03:49:55Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.10.5",
          "kind": "other",
          "published_at": "2022-06-29T03:32:33Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.10.4",
          "kind": "other",
          "published_at": "2022-06-29T03:28:46Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.10.3",
          "kind": "other",
          "published_at": "2022-05-03T05:23:31Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.10.2",
          "kind": "other",
          "published_at": "2022-04-01T03:28:52Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.10.1",
          "kind": "other",
          "published_at": "2022-03-23T07:04:57Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.10.0",
          "kind": "other",
          "published_at": "2022-03-15T11:40:01Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.9.2",
          "kind": "other",
          "published_at": "2022-03-04T07:46:58Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.9.1",
          "kind": "other",
          "published_at": "2022-03-03T04:01:32Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.9.0",
          "kind": "other",
          "published_at": "2022-02-15T12:03:06Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.8.1",
          "kind": "other",
          "published_at": "2022-02-08T11:04:57Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.8.0",
          "kind": "other",
          "published_at": "2022-01-18T08:24:17Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.7.4",
          "kind": "other",
          "published_at": "2022-01-10T07:31:29Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.7.3",
          "kind": "other",
          "published_at": "2022-01-05T06:38:53Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.7.2",
          "kind": "other",
          "published_at": "2021-12-23T08:38:21Z"
        },
        {
          "tag": "@mezzanine-ui/react@0.7.1",
          "kind": "other",
          "published_at": "2021-12-16T11:06:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "05deb3beb8ffa73a266d319acce7733711a1283a",
          "body": " - @mezzanine-ui/ng@1.0.0-rc.10\n - @mezzanine-ui/react@1.4.2",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-07-21T03:03:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c19effc84a2990410984c0f09f03c63b41b3a961",
          "body": "…-insensitive-filter\n\nfix(react/autocomplete): match options case-insensitively by default",
          "is_bot": false,
          "headline": "Merge pull request #454 from Mezzanine-UI/fix/react-autocomplete-case…",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-07-21T02:57:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b61dd42bc7ead728e61a38da225242477934a2d2",
          "body": "…-option-click\n\nfix(react/dropdown): keep trigger focus on option mousedown",
          "is_bot": false,
          "headline": "Merge pull request #453 from Mezzanine-UI/fix/react-dropdown-filtered…",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-07-21T02:56:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79beb402d622d7c919e636ef17e6d53f4dc21d5f",
          "body": "processBulkCreate and getPendingCreateList hardcoded toLowerCase() when\ndeduping bulk-create input against selected values and existing options,\nignoring the caseSensitive flag. With caseSensitive enabled, a\ndifferently-cased entry (e.g. pasting \"Apple\" while a lowercase \"apple\"\noption exists) was s\n[…]\n normalizeOptionName helper (mirroring the Angular side),\nroute both Set-based dedup checks through it, and add caseSensitive to\nprocessBulkCreate's dependency array. Covered by a new regression test.",
          "is_bot": false,
          "headline": "fix(react/autocomplete): thread caseSensitive through bulk-create dedup",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-07-21T02:54:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a11f4589facf07fbbdc218cb4c83c030e0dcd46",
          "body": "Mirrors the React CaseSensitivity story so the two Storybooks stay\ncomparable for parity checks.",
          "is_bot": false,
          "headline": "docs(ng/autocomplete): add case sensitivity story",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc77ccea5469bf42563dc2163e9380c4db11d31c",
          "body": "Mirrors the React specs: filtering in both directions plus the\nduplicate-detection path that gates the create action.",
          "is_bot": false,
          "headline": "test(ng/autocomplete): cover caseSensitive matching",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:51:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1be96dc6d1a062620a60f4f75a90e252c5ce55e",
          "body": "Angular already lowercased both sides when filtering and when detecting\nduplicate names, but offered no way to opt out. React just gained a\n`caseSensitive` prop covering the same two concerns, so mirror it here to\nkeep the APIs prop-for-prop.\n\nRoutes every case-normalizing site -- the options filter\n[…]\nion\nduplicate check, and the bulk-create pending/existing lookups -- through a\nshared helper instead of repeating the ternary at each call site.\n\nDefaults to false, so existing behaviour is unchanged.",
          "is_bot": false,
          "headline": "feat(ng/autocomplete): add caseSensitive input to mirror React",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:51:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7d0943c422153811726100312897278c6a05ae18",
          "body": "Shows default and caseSensitive side by side so the behavioural\ndifference is directly comparable.",
          "is_bot": false,
          "headline": "docs(react/autocomplete): add case sensitivity story",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:35:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6331aca1e4dfbfd5022c5cdb06ba8972813cdd57",
          "body": "Covers filtering in both directions, regex metacharacter escaping under\nthe new flag, and the addable create-action behaviour that depends on\nfilter and duplicate-check agreeing.",
          "is_bot": false,
          "headline": "test(react/autocomplete): cover caseSensitive matching",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:35:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1ed822f0bf7fe269bb6d095b72ed4b77692006c",
          "body": "Option filtering built its RegExp without the `i` flag, so typing `vir`\nfound nothing while `Virginia` sat in the list. The Angular AutoComplete\nhas always lowercased both sides when filtering, making React the outlier;\nthis brings the two back in line.\n\nThe `addable` duplicate check is folded into \n[…]\n to create a duplicate of an option already on screen.\n\nAdds a `caseSensitive` prop (default false) to opt back into the previous\nmatching for consumers that intentionally distinguish items by casing.",
          "is_bot": false,
          "headline": "fix(react/autocomplete): match options case-insensitively by default",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:34:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b6aefd6992addba6d98668f66c8cfd2c2145d35",
          "body": "Filtering on 'ap' yields [apple, apricot], so apricot sits at filtered\nindex 1 while the unfiltered list has banana there. Selecting by row\nindex therefore distinguishes a stable list from one that reset mid-click.",
          "is_bot": false,
          "headline": "test(react/autocomplete): cover filtered option mousedown/blur race",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:05:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d155f23607d8dc4ce8a98be954e09e4379b598c",
          "body": "Option rows fire selection on click (mouseup), but nothing prevented the\ndefault mousedown behaviour, so pressing an option blurred the trigger\ninput first. Consumers that reset their search text on blur -- notably\nAutoComplete via resetSearchInputsAndOptions -- cleared the filter\nsynchronously, re-\n[…]\ned because inputPosition=\"inside\"\nrenders a real input there that must stay clickable and caret-positionable.\nDropdownAction already did this for the create button; option rows were\nthe remaining gap.",
          "is_bot": false,
          "headline": "fix(react/dropdown): keep trigger focus on option mousedown",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-07-20T13:05:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b95ac17062962addb5f6f632cdc718631158d5a5",
          "body": " - @mezzanine-ui/ng@1.0.0-rc.9\n - @mezzanine-ui/react@1.4.1",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-22T07:06:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a018f8f0053a7ceaafa1a6fc4bd07911718e03a2",
          "body": "feat(ng/dropdown)!: CDK Overlay rewrite + React API parity (194→29)",
          "is_bot": false,
          "headline": "Merge pull request #449 from Mezzanine-UI/refactor/ng-dropdown-parity",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-22T07:05:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d60e0accb56fd235ecf780bfc0fb3ec66a94f6ae",
          "body": "- Add dropdown __api__ input/output deviations: scrollbar* (OverlayScrollbars\n  integration deferred to a focused PR) + anchor (sanctioned children->ref\n  exception); open/opened (input/output name collision).\n- Remove the now-stale accordion / four-thumbnail-card / single-thumbnail-card\n  'Dropdown does not inject aria-*' deviations — resolved by MznDropdown's new\n  ARIA injection (verified those components stay at 0).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(parity): record dropdown api deviations and drop resolved aria ones",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T07:01:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d24fbe4e685f84ccaf8c93e640c3fe78a7006a48",
          "body": "… react\n\nRewrite MznDropdown's outside-mode popover onto the new CDK Overlay directive\nand align its rendered DOM + public API to React's <Dropdown>:\n\n- Host element now plays React's div.mzn-dropdown root (host class bindings for\n  mzn-dropdown / --outside / --inside, plus [attr.id]); trigger proje\n[…]\ned->actionConfirm, actionCustomClicked->actionCustom);\ninputs actionConfig/name/showCheckIcon/showHeader/disableClickAway removed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ng/dropdown)!: rewrite popover with cdk overlay and align api to…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T07:01:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c690e71edb2c49724f4ddc930a94eb7290360944",
          "body": "…rops\n\n- New [mznDropdownPopper] directive: a Dropdown-scoped CDK Overlay layer on\n  <ng-template> (mirrors the MznInputTriggerPopper precedent) supporting\n  arbitrary floating-ui placement + flip fallback, emitting the resolved\n  placement back via placementChange. Closing detaches the overlay so n\n[…]\n: add `customActionButtonProps` (ButtonProps subset) wired\n  onto the custom-mode button, mirroring React actionCustomButtonProps.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ng/dropdown): add CDK Overlay popper directive and item/action p…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:58:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f568b7e1f1708fd90d20073107b3950228b37c35",
          "body": "These were added solely to match React `computed` / `target` props that never\nexisted — they were callback parameter names the parity extractor mis-extracted\nbefore the api.ts fix. Removing the unused inputs (and their host attr\nbindings) keeps select api parity at 0 now that the extractor is correct.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(ng/select): drop phantom computed/target inputs",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:58:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cd3b9bfb624f15cf0f1f4ca45d25b13ded42fd03",
          "body": "… extractor\n\nextractBodyProps now tracks parenthesis depth so callback parameter names\n(e.g. the `computed` / `target` params of `onScroll?: (computed, target) =>\nvoid`) are no longer mis-extracted as props. buildInterfaceIndex also walks\npackages/core/src so React prop interfaces that `extends` sha\n[…]\nherited props (value / mode / …). Verified the core scan only affects the\ndropdown api result, with no ripple to other components.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(parity): exclude callback params and index core interfaces in api…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:58:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4bee6c06ba39f74ae00db8a7a7e108e7a0875479",
          "body": "refactor(ng/tag): host addable/overflow-counter tags on a native button",
          "is_bot": false,
          "headline": "Merge pull request #448 from Mezzanine-UI/refactor/ng-tag-button-host",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-22T06:57:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d14566c9875a9ae9873939184ea80cc33e4c6496",
          "body": "The `select / Basic / tag / button-span` deviation recorded the\noverflow-counter tag rendering as `<span>` instead of React's\n`<button>`. The MznTag button-host change resolves that diff, so the\nrow no longer applies; `parity -- select` now reports 0 diffs without\nit.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(parity): drop obsolete select overflow-counter tag deviation",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:48:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb6e20da4b0bc65d6061508311697d04d7236290",
          "body": "Follow-up to the MznTag button-host change: every consumer that renders\nan `addable` / `overflow-counter` tag now hosts it on a native\n`<button mznTag>` so the rendered DOM matches React's button root.\n\n- select-trigger-tags: the +N overflow counter (visible and the hidden\n  fake-measurement ellipsi\n[…]\noverflow-counter tag\n\nBehaviour is unchanged (outputs/handlers identical); only the host\nelement switches from <span> to <button>.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(ng): render button-type tags on <button mznTag> in consumers",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:48:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40572d5112c55b4240e3d9b2497d49dbc48c174b",
          "body": "React's `Tag` renders a `<button>` root for the `addable` and\n`overflow-counter` types, while Angular's attribute-selector `MznTag`\nwrapped an inner `<button>` in a `display: contents` host `<span>`,\nadding a transparent extra DOM node that broke DOM parity.\n\n`MznTag` now detects when it is hosted o\n[…]\nst path since host and tag classes live on one element.\n\nStory templates for addable/overflow-counter switch to `<button mznTag>`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(ng/tag): host addable/overflow-counter on a native button",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:48:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "621bf46c3093c4ea55b64f6314693001a55eaf46",
          "body": "Design notes behind this PR: the select DOM-parity breakdown and the CDK\nOverlay rewrite of InputTriggerPopper. Dropdown/Tag plans are intentionally\nleft out of this PR (tracked separately).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(parity): add select DOM-parity and CDK Overlay design notes",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-22T06:48:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "140c34b0d82b9fb29e4db8455fd81e7558e0a6a9",
          "body": "refactor(ng/select)!: align rendered DOM/interaction/API with React + CDK Overlay",
          "is_bot": false,
          "headline": "Merge pull request #447 from Mezzanine-UI/refactor/ng-select-dom-parity",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-22T06:45:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59336946a61462817a148db59e574403188bfdde",
          "body": "…ror-state\n\nfix(react/select): apply error state on trigger (was shadowed by type check)",
          "is_bot": false,
          "headline": "Merge pull request #450 from Mezzanine-UI/fix/react-select-trigger-er…",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-22T06:32:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "735afac83e26df7287b21853a4cae5918f156e80",
          "body": "fix(react/navigation): leaf NavigationOption with a Badge child renders as anchor leaf, no chevron",
          "is_bot": false,
          "headline": "Merge pull request #452 from Mezzanine-UI/fix/navigation-leaf-badge",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-22T06:02:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "016b6e0fb8126a3e80654aec84c8c6f661cbed0f",
          "body": "Add a badge-only leaf item to the Basic story and a dedicated LeafWithBadge\nstory contrasting a badge leaf (anchor, right-aligned badge, no chevron)\nwith a badge group (chevron + collapsible sub-options).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(react/navigation): add leaf-with-badge story examples",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:32:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a89b2c820ece859eca87794ba33b6673a34e05b5",
          "body": "Add cases asserting a badge-only leaf renders the badge inline, shows no\ngroup chevron, stays an <a href> instead of a <div>, keeps --basic styling,\nand mounts no Collapse — plus a control that a badge alongside real\nsub-options still renders the chevron and group.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(react/navigation): cover leaf NavigationOption with a lone Badge",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:32:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2579e716f80dd32acf264b6c9019cb355f089ae",
          "body": "A NavigationOption whose only child is a Badge was misclassified as an\nexpandable group because every group-vs-leaf decision keyed off the raw\n`children` prop. As a result it rendered a group chevron, downgraded from\nthe anchor to a plain <div> (dropping href / router navigation), mounted an\nempty C\n[…]\nation that now depends on it. The\nbadge is still rendered inline regardless. Groups with NavigationOption\nchildren are unaffected.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(react/navigation): classify leaf-with-badge by sub-option count",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:32:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e3c3384235b1431590a838aef9a16d857f3e1c5",
          "body": "…eviations\n\nAfter aligning select DOM/API to React, the remaining 7 parity diffs are\nplatform/extractor-intrinsic, recorded as approved deviations so select parity\nis now 0:\n- 5x trigger <div> value-attr: React leaks the value prop onto the host div\n  (multiple -> [object Object]); Angular correctly\n[…]\nor\n  doesn't expand; Angular change is name/behaviour-aligned\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit cdbeced99912bef9b4e557a323058dfcb61d237b)",
          "is_bot": false,
          "headline": "docs(parity): record select value-leak / Tag button-host / onChange d…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb8bdde5424a5f9d7fe0f57a90aa957632de53ec",
          "body": "extractReactApi already skips className/prefix/suffix/style/etc.; the Angular\nextractor did not, so those content-projection / framework-intrinsic names\nshowed up as false 'Angular-only' input diffs. Apply the same skip-list on the\nAngular side. Removes the spurious className/prefix select diffs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 9cf2a09c7fc60d09263d002094898bb022adb336)",
          "is_bot": false,
          "headline": "chore(parity): apply SKIP_PROP_NAMES to the Angular extractor too",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e3728061153db0d16876f6d46f0e693123df3feb",
          "body": "…forceXxx/…)\n\nMirror the remaining React Select / SelectTrigger props as Angular inputs:\n- value / defaultValue -> synced into the internal value signal (value wins;\n  neither set leaves ngModel/CVA in charge)\n- warning, forceHideSuffixActionIcon, isForceClearable, forceShowClearable\n  -> forwarded \n[…]\nextractor asymmetry, React value-attr leak, Tag button-host).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 6aafeb7c59f1c1f16600fb54b0244a9eb04157bd)",
          "is_bot": false,
          "headline": "feat(ng/select): add React-parity inputs (value/defaultValue/warning/…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee3573b5c842c326a3db2685ac057da6228b2be6",
          "body": "…lur/clear/focus/tagClose)\n\nMirror React Select's callback props as Angular outputs (SKILL: drop the `on`\nprefix):\n- rename onScroll->scroll, onReachBottom->reachBottom, onLeaveBottom->leaveBottom,\n  selectionChange->change\n- add blur/focus (emitted on close/open), clear (on clear), tagClose (on tag\n[…]\n (onLeaveBottom)->(leaveBottom),\n(selectionChange)->(change).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 1b7928fd8989db0ac1a62dc680d32ca05043c2ea)",
          "is_bot": false,
          "headline": "feat(ng/select)!: align outputs with React (rename on-prefixed, add b…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f18c504a95c00305251aedd7057a5930b2fc379d",
          "body": "…laceholder\n\n- input value attr: omit on multiple mode (React renderValue returns undefined\n  there, so React emits no value attribute) instead of an empty one\n- input placeholder: mirror React getPlaceholder — when a single value is\n  selected the placeholder is the value name (not the static place\n[…]\no\nthe trigger div, and the Tag overflow-counter button host).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit e3f5406f695e2cb5f7f848df4af6c99593b5984a)",
          "is_bot": false,
          "headline": "fix(ng/select): align trigger input value/placeholder with React getP…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "751535b56e4baca5e0f940f04bc9009c416adbcf",
          "body": "…older with React\n\n- SelectTriggerTags fake-measurement container mirrors React useSelectTriggerTags:\n  drop the tag-group wrapper, use .__fake-tag / .__fake-ellipsis spans, and the\n  plain .triggerTags class (no --ellipsis); measure via those selectors\n- MznTag span host always renders aria-disable\n[…]\neact is static)\nselect parity (multiple-with-value) 47 -> 37.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 552485d4f372af97309e4866d765334f00514f3e)",
          "is_bot": false,
          "headline": "fix(ng/select): align tag fake-measurement DOM, aria-disabled, placeh…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0e5bf174f0848e7ff4a074abfe73b3955bc5fc6",
          "body": "…ple tags\n\nReact TagGroup wraps each child in a <span> (Children.map); the Angular\ncounter strategy rendered mzn-tag directly into the group, shifting the whole\ntag subtree one level and cascading ~120 style diffs once the multiple select\nshows tags. Wrap each tag (and the fake measurement tags) in \n[…]\n item26666 ×).\nselect parity (multiple-with-value) 167 -> 47.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit f3ae0ce59e57e460c09f8ab0fb072a1e31356833)",
          "is_bot": false,
          "headline": "fix(ng/select): mirror React TagGroup per-child span wrapper in multi…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "415cae338668d7d2a959e23e0a1bd59e3aaa58c3",
          "body": "React SelectTrigger passes `disabled` to the inner input; Angular omitted it,\nleaving the input enabled (wrong cursor + missing disabled attr). Bind\n[disabled]=\"disabled()\". select parity 62 -> 60.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 6a7bfbd048b47172e79cd6f05b3378aa03859f6a)",
          "is_bot": false,
          "headline": "fix(ng/select): forward disabled state to the trigger input",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "38f43f063c50cd4af333f6f85e19c57d1907b693",
          "body": "…up out of consumer DOM\n\nReplace the MznPopper(floating-ui) + MznPortal implementation with Angular CDK\nOverlay. MznInputTriggerPopper becomes a directive on an <ng-template>; its\ncontent is portaled into the cdk-overlay-container (body) so the consumer DOM\nsubtree no longer retains a popper host — \n[…]\n parity 73 -> 62\n(mzn-input-trigger-popper EXTRA eliminated).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 07b10969b331015613ccb15fc110dffecb496778)",
          "is_bot": false,
          "headline": "refactor(ng): rewrite InputTriggerPopper on CDK Overlay to portal pop…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6191f875f19f13cf8ea8907b934590cc5b51ce2",
          "body": "WithScroll/WithTree used `@Component` wrappers whose host element tag\n(story-select-*) and layout differed from React's plain styled `div`,\ncascading into ~63 parity diffs that were story-scaffolding artifacts, not\ncomponent differences. Switch the wrappers to attribute selectors on a div\nwith matching host styles. Cuts select parity diffs 136 -> 73.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit be2c5304fb165f2d5a116b3c4357e920b532dbe8)",
          "is_bot": false,
          "headline": "refactor(ng/select): align scroll/tree story markup with React",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fc44734e552dfb148fe22708b6a2a9d30b87ce2a",
          "body": "Mirror React's combobox: generate a stable listbox id, set it on the popup\n<ul role=listbox>, and expose it via the trigger host's aria-controls.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit aa1c8b19171ecd50055ac031e86767f0ae7dfe93)",
          "is_bot": false,
          "headline": "fix(ng/select): wire trigger aria-controls to the listbox id",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "99c461616b78c1a22bf88c4b7292ed0cec82e62d",
          "body": "id/for/aria-controls/aria-labelledby/etc. carry non-deterministic values\n(React useId, Angular/CDK ids). Collapse them to a placeholder so correctly\nwired pairs are not flagged solely because generated id strings differ.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit ab554b3b0aebe2d3121d6c4c2dd0429a69558054)",
          "is_bot": false,
          "headline": "chore(parity): normalize framework-generated id-reference attributes",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4aa008220fb5c5e8c090e63939b2d4ed15906aa0",
          "body": "… clear)\n\nReact enables the inline clear only in multiple mode with a value\n(shouldEnableClearable). Align the Angular trigger: gate the clear button,\n`mzn-text-field--clearable` and `mzn-text-field--slim-gap` on the same\ncondition, dropping the single-mode inline clear to match React.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 9e297bd62363ffa959e76dd0669efa71fad90d00)",
          "is_bot": false,
          "headline": "fix(ng/select): mirror React clearable/slim-gap (multiple-only inline…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9b7563cebe26800c8d61f05332a6066d339a4e7",
          "body": "…e attr with React\n\nMirror React SelectTrigger details on the Angular trigger:\n- add role=combobox / aria-expanded / aria-haspopup on the trigger host and\n  role=combobox on the inner input\n- mark the suffix action icon clickable so it emits --mzn-icon-cursor:pointer\n- reflect the input value as an \n[…]\nes clearable=false)\nCuts select parity diffs from 215 to 154.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit ba51f9f49bd85e118673dba1178c17e7470ecef4)",
          "is_bot": false,
          "headline": "fix(ng/select): align trigger ARIA, suffix-icon cursor and input valu…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d6346e275c76847cbf943ab2964e88db6ff01fe",
          "body": "… DOM\n\nReact Select renders its trigger inside a `mzn-dropdown mzn-dropdown--outside`\nwrapper (via the Dropdown component). Angular placed the trigger directly under\nthe host, shifting every parity xpath by one level and cascading into ~210\nDOM/style diffs. Add the matching wrapper around the trigge\n[…]\ns portaled popper). Cuts select parity diffs from\n426 to 215.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n(cherry picked from commit 50a1899b0e2436ffbf6bcfbee34d6cb81ef0cb37)",
          "is_bot": false,
          "headline": "fix(ng/select): wrap trigger in mzn-dropdown--outside to mirror React…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:06:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fddbce32779c420e25fb7e8be2fd1a1d2490cea",
          "body": "… check)\n\nSelectTrigger passed `error={type === 'error'}` to TextField, but `type` is a\nDropdownType ('default'/'tree'/...) that is never 'error', so the `error` prop\nforwarded from Select was silently ignored — error Selects never received\n`mzn-text-field--error`. Honor the actual `error` prop (kept the legacy\ntype==='error' fallback). Surfaced by React/Angular DOM parity.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(react/select): apply error state on trigger (was shadowed by type…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-18T15:05:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b00e6adedc8fffc20bc9db56c364bfd8efb3a691",
          "body": " - @mezzanine-ui/ng@1.0.0-rc.8\n - @mezzanine-ui/react@1.4.0",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-18T03:07:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9f8509010647910423078d276c2a97d1144dc89",
          "body": "feat(select): enable dropdown menu flip when overflowing the viewport (React + Angular)",
          "is_bot": false,
          "headline": "Merge pull request #446 from Mezzanine-UI/feat/select-dropdown-flip",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-18T03:03:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da9c9b6666b1ba134ae599de1f4ef5c19dc5a668",
          "body": "…nt-aware transition\n\nMirror React Select's `flip` prop on MznSelect (default false), forwarding it\nto MznInputTriggerPopper which now exposes a `flip` input and a\n`placementChange` output. MznSelect drives the mznTranslate `from` direction\noff the resolved placement so the menu animates from the co\n[…]\nut. Default false keeps the existing fixed bottom-start\nbehavior; previously the menu always allowed flip via MznPopper's default.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ng/select): forward flip through InputTriggerPopper with placeme…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-17T15:27:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "861b71e9dc103f14275034c0f3f5cce249d024fc",
          "body": "Add a `flip` signal input (default false) that drives MznPopper's\n`disableFlip` (previously hardcoded true). When enabled, the menu flips along\nthe main axis on viewport overflow and the enter transition follows the\nplacement resolved by floating-ui (via the `positionUpdated` output) so it\nslides from the correct side after a flip.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ng/dropdown): add flip input mirroring React Dropdown",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-17T15:27:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70bee7409727762a31696e96a3f8467b8da3216d",
          "body": "Add an opt-in `flip` prop (default false) that is forwarded to the underlying\nDropdown. When enabled, the menu flips above the input near the bottom of the\nviewport while keeping its width and horizontal alignment. Includes a story\ndemonstrating the flip near the viewport bottom.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(react/select): forward flip prop to enable dropdown menu flipping",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-17T14:49:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4c27d336ad39abd633079dedef816dfaa9723b65",
          "body": "…transition\n\nWhen `flip` is enabled, align the flip middleware with InputTriggerPopper\n(`fallbackAxisSideDirection: 'end'`, no shift/crossAxis) so the menu only\nflips bottom<->top and a sameWidth menu keeps its horizontal alignment with\nthe anchor. The enter transition now follows the placement reso\n[…]\nhe new Popper `onPlacementChange` callback, so the menu\nslides from the correct side after a flip instead of from the static side.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(react/dropdown): flip menu along main axis with placement-aware …",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-17T14:49:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e1c35de35cadda57779cd7f685c4f3e5a3e7f6e",
          "body": "…anges\n\nPopper now accepts an `onPlacementChange` callback that fires with the\nplacement resolved by floating-ui, including middleware-driven flips. This\nlets consumers (e.g. Dropdown) react to the actual side a popper settles on,\nsuch as adjusting an enter-transition direction after a flip.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(react/popper): emit onPlacementChange when resolved placement ch…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-06-17T14:48:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca9b78cd3e56e6bcc32aaebd8c9c6133bb110332",
          "body": " - @mezzanine-ui/ng@1.0.0-rc.7\n - @mezzanine-ui/react@1.3.1",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-11T07:17:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "211ffa846810d92dbb541d820e3afa252dab4d60",
          "body": null,
          "is_bot": false,
          "headline": "fix(react/dropdown): remove deprecated props",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-11T07:14:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1d8fc3384d1ee259fcbf62f17d7ff3e7f92dc32",
          "body": "fix(react): avoid React 18 ref-is-not-a-prop warning when Dropdown reads child ref",
          "is_bot": false,
          "headline": "Merge pull request #445 from gs7743/fix/dropdown-ref-warning",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-11T07:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e876d16f89b80031bf2d01e6266c85a763983005",
          "body": "fix(ng/input): throw on native input host to prevent silent CVA failure",
          "is_bot": false,
          "headline": "Merge pull request #444 from Mezzanine-UI/fix/ng-input",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-06-11T03:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b87338173e752120c321d529b7f0410205315dcf",
          "body": "Add a prominent textual warning in the FormBinding (correct-usage) story\nexplaining that mznInput must not be placed on a native <input>/<textarea>,\nand to bind [(ngModel)]/[formControl]/[value]+(valueChange) on a container\nhost instead. Keeps the guidance in a passing story rather than a dedicated\nexample that would intentionally break.",
          "is_bot": false,
          "headline": "docs(ng/input): warn against native-input host in FormBinding story",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-11T03:07:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfef09b1d2fc471ddad023a69f77d0960ca0f686",
          "body": "…ads child ref\n\nDropdown's getElementRef() read element.props.ref before falling back to\nelement.ref. On React 18 in dev mode, props.ref is a warning getter\n(defineRefPropWarningGetter) installed whenever the element was created\nwith a ref, so every Select/AutoComplete trigger logged:\n\n  Warning: Se\n[…]\n approach as getElementRef in\nradix-ui/primitives. Helper moved to utils with unit tests covering\nReact 18/19 dev and production element shapes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(react): avoid React 18 ref-is-not-a-prop warning when Dropdown re…",
          "author_name": "石展丞",
          "author_login": "gs7743",
          "committed_at": "2026-06-10T19:34:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aae47f005f08a491e5db2c14c83ee9824d1a3470",
          "body": "Pre-existing formatting drift — pure prettier output, no behavior change.\nSplit out so the follow-up fix commit stays reviewable.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(react): format Dropdown spec with prettier",
          "author_name": "石展丞",
          "author_login": "gs7743",
          "committed_at": "2026-06-10T19:33:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "49b37dfa16ee58b3f3f69f4342388e174818b09f",
          "body": "… message\n\n- Guard moved from ngOnInit to constructor so it fires before any CVA\n  lifecycle calls (e.g. writeValue from FormControlDirective on init)\n- Error message rewritten in English for library consumers\n- Remove redundant ?? '' on tagName (always a string)\n- Remove MisuseGuard story (was for manual verification only)",
          "is_bot": false,
          "headline": "refactor(ng/input): move host guard to constructor, use English error…",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-10T08:12:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17f53adb3a2680f11d559bc9017c64cd3030a187",
          "body": "MznInput is a Component that renders its own <input>; placing it on a\nnative <input>/<textarea> decouples the host from the internal CVA, so\nngModel/value binding silently fails with no error. Guard ngOnInit to\nthrow an actionable error when the host is a form-control element, and\nreinforce the JSDoc to use a container host (e.g. <div mznInput>).\n\nAdd FormBinding and MisuseGuard stories to verify correct two-way\nbinding ([(ngModel)], [formControl]) and demonstrate the new guard.",
          "is_bot": false,
          "headline": "fix(ng/input): throw on native input host to prevent silent CVA failure",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-06-10T07:50:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0118c5c570921c27cd5a30752191a45b3808d06c",
          "body": " - @mezzanine-ui/ng@1.0.0-rc.6\n - @mezzanine-ui/react@1.3.0",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-05-22T06:36:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f293a9eae1ad88dd1b0058c65891fa65f389bf37",
          "body": "feat(table): use last column as resize donor across React and Angular",
          "is_bot": false,
          "headline": "Merge pull request #443 from Mezzanine-UI/optimize/table-drag",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-05-22T06:32:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc3e604f0a0eb89ea1d2651746708845fb07dcb2",
          "body": "Switch the column resize algorithm to last-column donor with N+1 fallback\nto match the recently-updated react/table behavior. Resizing a middle\ncolumn now absorbs space from the rightmost column first, leaving the\ncolumns between untouched until the last column hits its minWidth.\n\nAlso fixes two exi\n[…]\n its start width (LIFO donor restoration).\n\nUpdates the resizable story to six narrow columns plus a wide Address\ndonor, mirroring the React story shape so parity tooling has a matching\nDOM structure.",
          "is_bot": false,
          "headline": "fix(ng/table): align resize donor strategy with React",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-05-22T06:27:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d6255b0a91d74825fa07002a0febc8c84ae1aab",
          "body": "Resizing a column now compensates against the rightmost column first,\nkeeping middle columns stable. When the last column hits its minWidth,\nthe adjacent column (N+1) takes over as fallback. Three-column writes\non every frame ensure LIFO restoration on the return drag.\n\nAlso updates the resizable Storybook story with six narrow columns\nplus a wide Address donor to showcase the behavior.",
          "is_bot": false,
          "headline": "feat(react/table): use last column as resize donor",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-05-22T03:44:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5fa136dac936a0debafff9ea5a3815ff0b5c040",
          "body": " - @mezzanine-ui/core@1.1.0\n - @mezzanine-ui/ng@1.0.0-rc.5\n - @mezzanine-ui/react@1.2.0",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-05-07T08:20:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2d07f60c79f779bce0207274c57b26cd8425ddc",
          "body": "feat: add JS-native Temporal calendar adapter",
          "is_bot": false,
          "headline": "Merge pull request #442 from Mezzanine-UI/feat/calendar-methods-temporal",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-05-07T08:08:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed4d5789ddc884effce496872598e7a248e16571",
          "body": "…alignment\n\nfix(core): align calendar adapter week classification with CLDR weekInfo",
          "is_bot": false,
          "headline": "Merge pull request #441 from Mezzanine-UI/fix/calendar-adapters-cldr-…",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-05-07T08:06:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5152e0fc6ee53d19e27ac63232be3a706d4cddca",
          "body": "* Calendar.mdx: rewrite the \"Choosing a date adapter\" section as a\n  four-row table covering Moment / Dayjs / Luxon / Temporal, with\n  separate Vite/CRA and Next.js App Router setup snippets for the\n  Temporal polyfill (the App Router case must use a Client Component\n  to register the polyfill on th\n[…]\nolumns) — registers the\n  polyfill at module top so the story-only Storybook build works on\n  unpolyfilled Node test environments.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(react/calendar): document Temporal adapter setup",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:51:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d1f070fee47ae767f0a5f7a03e769acc90ff4ce3",
          "body": "The calendar.stories.ts and date-range-picker.stories.ts playgrounds\nalready render Moment / Dayjs / Luxon side-by-side via per-column\n[mznCalendarConfigProvider] directives. Add a fourth column backed by\nthe new CalendarMethodsTemporal so the parity with the React story is\npreserved and reviewers c\n[…]\ntern) so the Storybook build doesn't\nneed any extra setup.\n\nng/package.json: @js-temporal/polyfill devDep for the storybook build.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ng/calendar): add Temporal column to multi-adapter stories",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:51:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fcd363b524aba7a86d693a9aa55fd8c2dc142330",
          "body": "Provides the Temporal-backed analogue of the existing dayjs / moment /\nluxon Calendar config providers, plus a tree-shake-friendly sub-path\nentry at \\`@mezzanine-ui/react/temporal\\` so apps that only need the\nTemporal adapter don't pull in the other libraries.\n\nFiles:\n- Calendar/CalendarConfigProvid\n[…]\nenum (matches the dayjs.ts / moment.ts / luxon.ts\n  pattern).\n- react/package.json: \\`@js-temporal/polyfill\\` devDep for the spec.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(react/temporal): add CalendarConfigProviderTemporal sub-path entry",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:51:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e784e37a3f6eca4c0fe8b92708b1629dd7b7abc2",
          "body": "- Add `@js-temporal/polyfill` as an optional peerDependency (>=0.5\n  for `Temporal.PlainDate#yearOfWeek`) plus devDep for tests/storybook.\n- Mark all four date-library peer deps (moment/dayjs/luxon/temporal) as\n  optional in peerDependenciesMeta.\n- Update scripts/build.js to:\n    * include `temporal\n[…]\ntime-resolved (matches the existing moment/dayjs/luxon\n      handling).\n- Sync yarn.lock with the new optional dependency entries.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(core): wire @js-temporal/polyfill peer dep and Temporal entry",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:50:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d1f3f35e273126205f927c463ab47d43fd3228a4",
          "body": "Implements the full CalendarMethods contract on top of the JS-native\nTemporal API (ES2026, Stage 4), letting consumers use Mezzanine UI's\nCalendar/DatePicker without any third-party date library on runtimes\nwith native Temporal support (Chrome 144+, Firefox 139+, Edge 144+).\n\nHighlights\n==========\n\n\n[…]\nadapter. Missing-Temporal errors\ninclude the full setup guide; isValid() surfaces this error rather\nthan silently returning false.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core/calendarMethodsTemporal): add JS-native Temporal adapter",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:50:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b915ff680ee72bdafb6716b89af4c6aeaa890363",
          "body": "…O Monday-first locales\n\nMirror the dayjs adapter changes for moment:\n\n1. ISO classification now requires BOTH Monday-first AND minimalDays=4.\n   Add `usesISOWeekRules = isMondayFirst && isISOWeekLocale` helper;\n   getWeek/getWeekYear/getCurrentWeekFirstDate/isSameWeek/isWeekIncluded\n   use this str\n[…]\nekends / getCalendarGrid)\nkeep the simpler `isMondayFirst` check since their output depends only\non first-day-of-week positioning.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core/calendarMethodsMoment): align week math with CLDR for non-IS…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:48:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c628e513e7bef92bc2a315c6f19549e023c28437",
          "body": "… Monday-first locales\n\nThree related fixes to the dayjs calendar adapter:\n\n1. ISO classification now requires BOTH Monday-first AND minimalDays=4.\n\n   Previously, getWeek/getWeekYear/getCurrentWeekFirstDate/isSameWeek/\n   isWeekIncluded and formatToString's gggg-handling treated any locale\n   with \n[…]\nekends / getCalendarGrid)\nkeep the simpler `isMondayFirst` check since their output depends only\non first-day-of-week positioning.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core/calendarMethodsDayjs): align week math with CLDR for non-ISO…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:48:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1e736cc2973bd6135e53e6a2af3f5b15bb788b38",
          "body": "The static set was used by `getDefaultModeFormat` and the dayjs/moment\nadapters' `isISOWeekLocale` to choose between ISO and locale week\nformatting/numbering. Cross-referencing the entries against\n`Intl.Locale#weekInfo` (CLDR) revealed 11 misclassifications:\n\n- Sunday-first per CLDR (ISO requires Mo\n[…]\nhe JSDoc.\nThis unblocks the dayjs/moment adapters from internally forcing ISO\nweek math for these locales — see follow-up commits.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core/calendar): align ISO_WEEK_LOCALES with CLDR weekInfo",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-05-07T07:47:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f8dfbe37b5800fa027b14f7c50cb63d121d15e5",
          "body": "…ipping",
          "is_bot": false,
          "headline": "feat(react/pagination): enable flip on page size dropdown to avoid cl…",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-05-05T05:35:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb830da61cd22e2ecd5710b4f3622b9c448ae483",
          "body": null,
          "is_bot": false,
          "headline": "feat(react/dropdown): add opt-in flip middleware prop",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-05-05T05:35:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57aad09a14dbe179234edeb1fe5e006827b9f140",
          "body": " - @mezzanine-ui/react@1.1.0",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-24T05:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b95b66a22df44e6c421abc69e03095d29741f7c8",
          "body": "feat(react/select-button): add closeOnSelect prop with controlled dropdown",
          "is_bot": false,
          "headline": "Merge pull request #440 from Mezzanine-UI/fix/input-select-behavior",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-04-24T03:26:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e12a111d04b7f60f845f85a263543a455ff87b3e",
          "body": "…pdown\n\nDropdown is now controlled by SelectButton via open/onVisibilityChange so\noption clicks actually close the popper. Defaults closeOnSelect to true\n(matches single-select UX); consumers can opt out with closeOnSelect={false}.\nAlso add a story demonstrating the opt-out behavior.",
          "is_bot": false,
          "headline": "feat(react/select-button): add closeOnSelect prop with controlled dro…",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-24T03:17:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3fdc9397eb8314daf215b2021fcb18b510e3993",
          "body": "fix(react/table): prevent SSR hydration mismatch from CSS variable read",
          "is_bot": false,
          "headline": "Merge pull request #439 from Mezzanine-UI/fix/table-hydration",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-04-24T02:43:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29a9532b03025393aba8964c820db724bc4679fb",
          "body": "Row height was resolved via getComputedStyle inside useMemo during render,\nreturning 0 on the server and the real pixel value on the client. Defer the\nCSS variable read to useIsomorphicLayoutEffect so the first render is\ndeterministic across SSR and hydration.",
          "is_bot": false,
          "headline": "fix(react/table): prevent SSR hydration mismatch from CSS variable read",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-24T02:10:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47d6a5b0ddd253e4fe3a3fb3c91cffc42229f96d",
          "body": "…yboard\n\nfix(react/picker): restore keyboard navigation across portalled popper",
          "is_bot": false,
          "headline": "Merge pull request #438 from Mezzanine-UI/fix/input-trigger-popper-ke…",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-04-23T09:17:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8da724f554e3a111f7947d6c14f0d77391b53074",
          "body": "Bridge trigger input and portalled popper as a logical focus loop so\nTab/Shift+Tab traverse the calendar despite the portal breaking natural\nDOM order. Use ref-mirrored handlers to avoid closure staleness in the\ndocument-level listeners, and bind a direct keydown listener on the\ntrigger to stay reliable inside Modal focus traps.",
          "is_bot": false,
          "headline": "fix(react/picker): restore keyboard navigation across portalled popper",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-23T09:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0767eb5fb522b4996b94752d56c03edd9bdb801d",
          "body": " - @mezzanine-ui/core@1.0.4\n - @mezzanine-ui/ng@1.0.0-rc.4\n - @mezzanine-ui/react@1.0.4",
          "is_bot": false,
          "headline": "chore: release",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-22T08:44:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6197617763b41669c01f84bdeefc13f34a79158b",
          "body": "…store-portal\n\nfix(react/input-trigger-popper): restore portal rendering so picker popups overflow Modal",
          "is_bot": false,
          "headline": "Merge pull request #437 from Mezzanine-UI/fix/input-trigger-popper-re…",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-04-22T08:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad35aabbebb90c33c028af09c7b1ecaf44a499d8",
          "body": "…insufficient\n\nAdd floating-ui's `flip` middleware to InputTriggerPopper so the calendar /\ntime panel reverses to the top of the trigger when the viewport bottom edge\nwould otherwise clip it. Previously the popper was hard-anchored to\n`bottom-start` with only `offset` middleware, leaving no recovery\n[…]\nchange is needed; this restores prop-for-prop parity.\n\nAdds DatePicker `NearViewportEdge` story as a regression guard, anchoring\nthe trigger at the viewport bottom to verify the calendar flips upward.",
          "is_bot": false,
          "headline": "fix(react/input-trigger-popper): flip placement when bottom space is …",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-22T08:20:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb46c982fa4bec3f55140ffb014afbc012dce40c",
          "body": "…sion\n\nRender a DatePicker near the bottom of a standard Modal's body so the\ncalendar popup has to visually overflow the modal bounds to be usable.\nMirrors the DrawerModalSelectLayering story added for Select/Dropdown\n(c090dc97); now the picker family has an equivalent layering guard.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(react/date-picker): add InsideModal story to guard portal regres…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-04-22T06:46:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c657c63607ef963e2cf39acc09f617c55ae61d2e",
          "body": "Remove the hard-coded disablePortal forced on every picker popper by\nebfeefaa (2025-12-03, during the v2 Calendar rewrite). That change\ncaused the calendar/time panel to inherit the stacking clipping of\nwhatever ancestor it was rendered under — most notably, Modal's\noverflow:hidden body — so pickers\n[…]\ny.\n\nAffects DatePicker, DateRangePicker, TimePicker, DateTimePicker,\nDateTimeRangePicker, TimeRangePicker, and MultipleDatePicker.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(react/input-trigger-popper): restore portal rendering",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-04-22T06:46:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81e48a735847d6924ab6404c48603bdface5228c",
          "body": "…ontainer\n\nThe default portal container (#mzn-portal-container) is position:fixed\nwith pointer-events:none so the rest of the page stays clickable while\nthe portal slot sits above. Children must opt back into auto, otherwise\nclicks pass through the portal. This mirrors the\n.mzn-dropdown-popper--with\n[…]\nMouseLeave> hover layer in\nDatePickerCalendar / DateRangePickerCalendar) would lose mouse events\nonce the popper is portalled out.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core/input-trigger-popper): enable pointer-events inside portal c…",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-04-22T06:45:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "503f24558e3b0e7bd6ba30a279c3d810c7888a84",
          "body": "…build",
          "is_bot": false,
          "headline": "fix(ng): whitelist clsx in allowedNonPeerDependencies for ng-packagr …",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T07:25:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aeb65a4b202db60b91f4adac4d916e31baba001b",
          "body": null,
          "is_bot": false,
          "headline": "chore: release ng@1.0.0-rc.3",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T07:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4ad2017775389533dadffa0b2ca8159f5b18b89",
          "body": "fix(ng): declare clsx as an explicit dependency",
          "is_bot": false,
          "headline": "Merge pull request #436 from Mezzanine-UI/fix/ng-clsx-dependency",
          "author_name": "李國均",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T07:20:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2acd076c5ebf3c8f57d87953da6ce8091bc72e13",
          "body": "The ng package imports clsx across 114 component files but did not\nlist it in dependencies. It worked only because the react package\nhoists clsx to the workspace root via its own dependency declaration.\n\nDeclare clsx@^2.1.1 explicitly (same range as the react package so\npackage managers can deduplicate to a single version) so that\n@mezzanine-ui/ng can be installed standalone without pulling in\n@mezzanine-ui/react.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ng): declare clsx as an explicit dependency",
          "author_name": "Chia Yu Pai",
          "author_login": "fantasywind",
          "committed_at": "2026-04-21T06:31:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff25071e8f2f5f94df0203ddc995d25fac22c925",
          "body": null,
          "is_bot": false,
          "headline": "build: update yarn.lock",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T03:27:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bee30f71ce21d3faf3be5f1f876e8b66a0a16f4d",
          "body": null,
          "is_bot": false,
          "headline": "chore: update README.md",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T03:24:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71de413f3a78032b73763060b68c177ea4044578",
          "body": null,
          "is_bot": false,
          "headline": "chore: release core@1.0.3, react@1.0.3, ng@1.0.0-rc.2",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T02:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e14d3ce9b403cc9ebe01f66b56dab95277ecd27",
          "body": null,
          "is_bot": false,
          "headline": "feat: merge @mezzanine-ui/ng Angular component library",
          "author_name": "travor20814",
          "author_login": "travor20814",
          "committed_at": "2026-04-21T02:49:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 99,
      "commits_last_year": 2444,
      "latest_release_at": "2026-07-21T03:10:36Z",
      "latest_release_tag": "@mezzanine-ui/react@1.4.2",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 33,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 6.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@mezzanine-ui/ng",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@mezzanine-ui/ng",
          "is_deprecated": false,
          "latest_version": "1.0.0-rc.10",
          "repository_url": "https://github.com/Mezzanine-UI/mezzanine",
          "versions_count": 44,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 412,
          "first_published_at": "2021-02-26T07:15:30.583000Z",
          "latest_published_at": "2026-07-21T03:05:15.113000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@mezzanine-ui/core",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@mezzanine-ui/core",
          "is_deprecated": false,
          "latest_version": "1.1.0",
          "repository_url": "https://github.com/Mezzanine-UI/mezzanine",
          "versions_count": 120,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 2553,
          "first_published_at": "2021-02-26T07:15:26.769000Z",
          "latest_published_at": "2026-05-07T08:26:21.193000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 81
        },
        {
          "name": "@mezzanine-ui/icons",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@mezzanine-ui/icons",
          "is_deprecated": false,
          "latest_version": "1.0.2",
          "repository_url": "https://github.com/Mezzanine-UI/mezzanine",
          "versions_count": 86,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 2320,
          "first_published_at": "2021-02-26T07:15:22.182000Z",
          "latest_published_at": "2026-04-17T06:08:34.822000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 101
        },
        {
          "name": "@mezzanine-ui/react",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@mezzanine-ui/react",
          "is_deprecated": false,
          "latest_version": "1.4.2",
          "repository_url": "https://github.com/Mezzanine-UI/mezzanine",
          "versions_count": 137,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 2920,
          "first_published_at": "2021-02-26T07:15:30.842000Z",
          "latest_published_at": "2026-07-21T03:05:14.864000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@mezzanine-ui/system",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@mezzanine-ui/system",
          "is_deprecated": false,
          "latest_version": "1.0.2",
          "repository_url": "https://github.com/Mezzanine-UI/mezzanine",
          "versions_count": 82,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 2196,
          "first_published_at": "2021-02-26T07:15:21.597000Z",
          "latest_published_at": "2026-04-17T06:08:35.779000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 101
        }
      ]
    },
    "popularity": {
      "forks": 6,
      "stars": 25,
      "watchers": 4,
      "fork_history": {
        "days": [
          {
            "date": "2021-08-21",
            "count": 1
          },
          {
            "date": "2022-02-08",
            "count": 1
          },
          {
            "date": "2022-02-10",
            "count": 1
          },
          {
            "date": "2023-05-08",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 6,
        "total_forks": 6
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        ".storybook-ng/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/icons/tsconfig.json",
        "packages/ng/.storybook/tsconfig.json",
        "packages/ng/tsconfig.json",
        "packages/react/tsconfig.json",
        "packages/system/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 125255,
      "source_files_sampled": 1499,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 3353
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 10,
        "malicious_count": 0,
        "assessed_package": "npm:@mezzanine-ui/ng@1.0.0-rc.10",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@mezzanine-ui/icons",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.0.2"
        },
        {
          "name": "@mezzanine-ui/system",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.0.2"
        },
        {
          "name": "lodash",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.17.21"
        },
        {
          "name": "tslib",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.1"
        },
        {
          "name": "@floating-ui/dom",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.7.4"
        },
        {
          "name": "@mezzanine-ui/core",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.1.0"
        },
        {
          "name": "@mezzanine-ui/icons",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.0.2"
        },
        {
          "name": "@mezzanine-ui/system",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.0.2"
        },
        {
          "name": "clsx",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "overlayscrollbars",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.13.0"
        },
        {
          "name": "tslib",
          "manifest": "packages/ng/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.1"
        },
        {
          "name": "@floating-ui/dom",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.7.4"
        },
        {
          "name": "@floating-ui/react-dom",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.6"
        },
        {
          "name": "@hello-pangea/dnd",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.0.1"
        },
        {
          "name": "@mezzanine-ui/core",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.1.0"
        },
        {
          "name": "@mezzanine-ui/icons",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.0.2"
        },
        {
          "name": "@mezzanine-ui/system",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.0.2"
        },
        {
          "name": "@tanstack/react-virtual",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.13.13"
        },
        {
          "name": "@types/react-transition-group",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.12"
        },
        {
          "name": "clsx",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "keycode",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.1"
        },
        {
          "name": "lodash",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.17.21"
        },
        {
          "name": "overlayscrollbars",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.13.0"
        },
        {
          "name": "overlayscrollbars-react",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.6"
        },
        {
          "name": "react-transition-group",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.5"
        },
        {
          "name": "tslib",
          "manifest": "packages/react/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.1"
        },
        {
          "name": "tslib",
          "manifest": "packages/system/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 327,
        "open_issues": 1,
        "closed_ratio": 0.988,
        "closed_issues": 85,
        "closed_unmerged_prs": 24
      },
      "bus_factor": 2,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "travor20814",
          "commits": 1442,
          "avatar_url": "https://avatars.githubusercontent.com/u/17423836?v=4"
        },
        {
          "type": "User",
          "login": "fantasywind",
          "commits": 473,
          "avatar_url": "https://avatars.githubusercontent.com/u/1902526?v=4"
        },
        {
          "type": "User",
          "login": "Phisten",
          "commits": 338,
          "avatar_url": "https://avatars.githubusercontent.com/u/1415118?v=4"
        },
        {
          "type": "User",
          "login": "Akai0121",
          "commits": 335,
          "avatar_url": "https://avatars.githubusercontent.com/u/208425138?v=4"
        },
        {
          "type": "User",
          "login": "Jay0328",
          "commits": 202,
          "avatar_url": "https://avatars.githubusercontent.com/u/17613903?v=4"
        },
        {
          "type": "User",
          "login": "ting-ting-ting",
          "commits": 167,
          "avatar_url": "https://avatars.githubusercontent.com/u/71868179?v=4"
        },
        {
          "type": "User",
          "login": "FantasyQ",
          "commits": 137,
          "avatar_url": "https://avatars.githubusercontent.com/u/15118521?v=4"
        },
        {
          "type": "User",
          "login": "kristxeng",
          "commits": 90,
          "avatar_url": "https://avatars.githubusercontent.com/u/24317598?v=4"
        },
        {
          "type": "User",
          "login": "kuaniscreative",
          "commits": 86,
          "avatar_url": "https://avatars.githubusercontent.com/u/30052612?v=4"
        },
        {
          "type": "User",
          "login": "syminrosie",
          "commits": 48,
          "avatar_url": "https://avatars.githubusercontent.com/u/43403595?v=4"
        }
      ],
      "contributors_sampled": 15,
      "top_contributor_share": 0.433
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "test.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "eslint.config.mjs"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "yarn.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 1,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 4,
            "reason": "3 out of 7 merged PRs checked by a CI test -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 7,
            "reason": "Found 7/9 approved changesets -- score normalized to 7",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 6 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "158 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "05deb3beb8ffa73a266d319acce7733711a1283a",
        "ran_at": "2026-07-27T22:41:32Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T03:05:28Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-21T02:57:21Z",
      "ci_last_conclusion": "CANCELLED",
      "oldest_open_issues": [
        {
          "number": 170,
          "created_at": "2022-04-25T09:59:42Z",
          "last_comment_at": "2022-07-29T07:47:52Z",
          "last_comment_author": "travor20814"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Mezzanine-UI/mezzanine",
    "host": "github.com",
    "name": "mezzanine",
    "owner": "Mezzanine-UI"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 71,
      "inputs": {
        "security": 58,
        "vitality": 92,
        "community": 47,
        "governance": 74,
        "engineering": 77
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 87,
            "inputs": {
              "commits_last_year": 2444,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 33
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "33/52 weeks with commits",
                "points": 22.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 33
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "2444 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 2444
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 99,
              "latest_release_tag": "@mezzanine-ui/react@1.4.2",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 6.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "99 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 6,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 6 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "forks": 6,
              "stars": 25,
              "watchers": 4,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "25 stars",
                "points": 22.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "6 forks",
                "points": 5.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "4 watchers",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 67,
            "inputs": {
              "packages": [
                "@mezzanine-ui/ng",
                "@mezzanine-ui/core",
                "@mezzanine-ui/icons",
                "@mezzanine-ui/react",
                "@mezzanine-ui/system"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 10401
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "10,401 downloads/month across npm",
                "points": 53.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 10401,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 74,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 15,
              "top_contributor_share": 0.433
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 43% of commits",
                "points": 12.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 43
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "15 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "merged_prs": 327,
              "open_issues": 1,
              "closed_issues": 85,
              "issue_closed_ratio": 0.988,
              "closed_unmerged_prs": 24
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "99% of issues closed",
                "points": 46.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "327/351 decided PRs merged",
                "points": 35.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 327,
                      "decided": 351
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 7/9 approved changesets -- score normalized to 7",
                "points": 10.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "Mezzanine-UI",
              "public_repos": 4,
              "account_age_days": 2076
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "2 followers of Mezzanine-UI",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "Mezzanine-UI"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~5 yr old",
                "points": 16.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 5
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@mezzanine-ui/ng",
                "@mezzanine-ui/core",
                "@mezzanine-ui/icons",
                "@mezzanine-ui/react",
                "@mezzanine-ui/system"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "5 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 5,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "137 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 137
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 77,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "3 out of 7 merged PRs checked by a CI test -- score normalized to 4",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "typescript",
                "ui-library",
                "react",
                "scss",
                "angular"
              ],
              "has_wiki": true,
              "homepage": "https://storybook.mezzanine-ui.org",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://storybook.mezzanine-ui.org",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 58,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 7 merged PRs checked by a CI test -- score normalized to 4",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 7/9 approved changesets -- score normalized to 7",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "158 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@mezzanine-ui/ng@1.0.0-rc.10 runtime dependency closure — what installing the published package pulls in — 10 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@mezzanine-ui/ng@1.0.0-rc.10",
                  "assessed": 10
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 10,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 10,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 5
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 74,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 3353
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "yarn.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                ".storybook-ng/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/icons/tsconfig.json",
                "packages/ng/.storybook/tsconfig.json",
                "packages/ng/tsconfig.json",
                "packages/react/tsconfig.json",
                "packages/system/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.47,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": ".storybook-ng/tsconfig.json, packages/core/tsconfig.json, packages/icons/tsconfig.json, packages/ng/.storybook/tsconfig.json, packages/ng/tsconfig.json, packages/react/tsconfig.json, packages/system/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".storybook-ng/tsconfig.json, packages/core/tsconfig.json, packages/icons/tsconfig.json, packages/ng/.storybook/tsconfig.json, packages/ng/tsconfig.json, packages/react/tsconfig.json, packages/system/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "47 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 47,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 125255,
              "source_files_sampled": 1499,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/1499 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1499,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T22:41:52.225040Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/Mezzanine-UI/mezzanine.svg",
  "full_name": "Mezzanine-UI/mezzanine",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.