公开记录
软件健康报告模式 0.27.0 · 指标 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 星标⑂ 6 复刻始于 2020年11月在 GitHub 上查看 ↗

Mezzanine-UI/mezzanine 的健康指数为 100 分中的 71 分,处于「良好」区间。 其得分最高的类别是Vitality(92/100),最低的是Community & Adoption(47/100)。 最近一次更新在 6 天前。 近期的大部分工作由 2 位贡献者完成。

71
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

71
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

2 关注者4 个公开仓库始于 2020年11月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
npm@mezzanine-ui/ng1.0.0-rc.10412446 天前
npm@mezzanine-ui/core1.1.02,55312081 天前
npm@mezzanine-ui/icons1.0.22,32086101 天前
npm@mezzanine-ui/react1.4.22,9201376 天前
npm@mezzanine-ui/system1.0.22,19682101 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

92优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 6 天前
22.8/36提交节奏 — 52 周中有 33 周有提交
18/18提交量 — 最近一年 2,444 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year2,444
human_commit_share1
days_since_last_push6
active_weeks_last_year33

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 99 个发布版本
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 6.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count99
latest_release_tag@mezzanine-ui/react@1.4.2
releases_from_tags
days_since_latest_release6
mean_days_between_releases6.7
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

47存在风险 · 占总体的 18%

流行度与采用

31存在风险
评分方式
22.4/60星标 — 25 个星标
5.8/25复刻 — 6 个复刻
2.7/15关注者 — 4 位关注者
所用输入
forks6
stars25
watchers4
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
53.6/80月度下载量 — npm 合计每月 10,401 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@mezzanine-ui/ng, @mezzanine-ui/core, @mezzanine-ui/icons, @mezzanine-ui/react, @mezzanine-ui/system
dependents
ecosystemsnpm
total_downloads
monthly_downloads10,401
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

74良好 · 占总体的 24%
评分方式
25.2/54巴士系数 — 2 位贡献者贡献了半数提交
12.8/22.5提交分布 — 头号贡献者编写了 43% 的提交
13.5/13.5贡献者广度 — 15 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 6 contributing companies or organizations
所用输入
bus_factor2
contributors_sampled15
top_contributor_share0.433
评分方式
46.2/46.8议题解决 — 99% 的议题已关闭
35.6/38.3PR 接受 — 已裁定的 PR 中 327/351 已合并
10.5/15OpenSSF Scorecard:Code-Review — Found 7/9 approved changesets -- score normalized to 7
所用输入
merged_prs327
open_issues1
closed_issues85
issue_closed_ratio0.988
closed_unmerged_prs24
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
3.4/25所有者影响力 — Mezzanine-UI 有 2 位关注者
16.5/25既往记录 — 4 个公开仓库,账户约 5 年
所用输入
followers2
owner_typeOrganization
is_verified
owner_loginMezzanine-UI
public_repos4
account_age_days2,076
评分方式
25/25已发布且可解析 — npm 上有 5 个软件包
35/35发布时效 — 最近一次发布于 6 天前
20/20版本历史 — 137 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@mezzanine-ui/ng, @mezzanine-ui/core, @mezzanine-ui/icons, @mezzanine-ui/react, @mezzanine-ui/system
ecosystemsnpm
any_deprecated
min_days_since_publish6

工程质量

基础的工程与文档实践是否到位?

77良好 · 占总体的 20%

工程实践

78良好
评分方式
24/24CI 工作流 — 1 个工作流
24/24存在测试
16/16Linter 配置 — eslint.config.mjs
0/9.6Pre-commit 钩子
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
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

75良好
评分方式
30/30README
0/25文档目录
15/15文档 / 主页站点 — https://storybook.mezzanine-ui.org
10/10仓库描述
10/10主题标签 — 5 个主题标签
10/10Wiki
所用输入
topicstypescript, ui-library, react, scss, angular
has_wiki
homepagehttps://storybook.mezzanine-ui.org
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

58中等 · 占总体的 16%

安全态势

47存在风险
评分方式
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.5许可证 — 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 — 无数据
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 — 无数据
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 158 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.7
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages10
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:@mezzanine-ui/ng@1.0.0-rc.10 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 10 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

74良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
15/15机器可读文档(llms.txt) — 存在 llms.txt
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes3,353
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — eslint.config.mjs
11/11静态类型检查 — .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/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 47 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesyarn.lock
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
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
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.9/55可控的文件大小 — 采样的 1,499 个源文件中有 2 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes125,255
source_files_sampled1,499
oversized_source_files2
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
0/40可运行示例
所用输入
example_dirs
has_mcp_signal
api_schema_files

关键数据

25GitHub 星标
15贡献者
2,444最近 12 个月提交数
6距最近推送天数
99发布版本数
2巴士系数(bus factor)
1开放议题
npm软件包生态系统数

数据采集警告

  • 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

更多细节

Star 与 Fork 历史 0 ★ / 6 ⇿
0Star
6Fork
91发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

123456622021-082024-012026-06
主版本 0次版本 0修订 0

每个点涵盖 5 天。

OpenSSF Scorecard 4.7 / 10
4.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。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
不适用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
不适用Signed-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities158 existing vulnerabilities detected
直接依赖 27
注册表软件包版本约束清单文件
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
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

依赖安全公告 0

安装 npm:@mezzanine-ui/ng@1.0.0-rc.10 会引入 10 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.