Informe JSON sin procesar legible por máquina
{
"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"
}