Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
7b9866c
chore(ui): implement Phase 2 ClinicalDashboard container scaling and …
BigSimmo Jul 25, 2026
c04b765
feat(ui): add new UI primitives and context providers for Phase 2
BigSimmo Jul 25, 2026
599cc56
chore(lint): add z-index ladder rule
BigSimmo Jul 25, 2026
dcdcb5b
chore: execute audit remediation fixes and RAG governance
BigSimmo Jul 28, 2026
0b5636f
merge: sync execute-audit-remediation-fixes with origin/main
cursoragent Jul 28, 2026
0262c9f
style: format docs after main merge
cursoragent Jul 28, 2026
7aaf9fd
fix: restore fail-closed upload publisher metadata after merge
cursoragent Jul 28, 2026
7662c94
fix: restore phone chrome viewport breakpoints after audit remediation
cursoragent Jul 28, 2026
264aebd
docs: record PR #1305 pr-bugbot phone-chrome fix in review ledger
cursoragent Jul 28, 2026
6c089f2
fix: keep ClinicalDashboard under maintainability budget
cursoragent Jul 28, 2026
ef13e82
docs: record PR #1305 CI/conflict babysit closeout in review ledger
cursoragent Jul 28, 2026
cee65df
ci: sync PR #1305 policy body via PR_POLICY_BODY.md
cursoragent Jul 28, 2026
b488485
ci: remove PR_POLICY_BODY.md after sync
cursoragent Jul 28, 2026
5d18668
docs: record PR #1305 policy-body sync closeout
cursoragent Jul 28, 2026
f1c978d
fix(ci): skip local RAM build guard on GitHub Actions
cursoragent Jul 28, 2026
88932fa
docs: note PR #1305 CI Build RAM-guard fix and retrigger checks
cursoragent Jul 28, 2026
73c4704
ci: retrigger hosted CI for audit remediation tip
cursoragent Jul 28, 2026
2775ca5
ci: force pull_request CI emit for Build guard tip
cursoragent Jul 28, 2026
9705a15
merge: sync execute-audit-remediation-fixes with origin/main
cursoragent Jul 28, 2026
c6c16aa
fix: apply CodeRabbit auto-fixes
coderabbitai[bot] Jul 28, 2026
2938ea4
Merge remote-tracking branch 'origin/main' into execute-audit-remedia…
cursoragent Jul 28, 2026
d822854
fix(ui): memoize OverlayProvider context value
cursoragent Jul 28, 2026
4141ca3
docs: drop exact-duplicate #1306 ledger row after main sync
cursoragent Jul 28, 2026
47a2f42
docs: record PR #1305 ledger dedupe and CodeRabbit closeout
cursoragent Jul 28, 2026
b3677cc
fix(lint): move chrome safe-area stack to ladder rung z-40
cursoragent Jul 28, 2026
d1b5ff1
Merge remote-tracking branch 'origin/main' into execute-audit-remedia…
cursoragent Jul 28, 2026
71ed508
fix(ledger): convert merge-residue heading records to table rows
cursoragent Jul 28, 2026
0a5818d
docs(ledger): record #1305 CI green babysit closeout
cursoragent Jul 28, 2026
b101b69
Merge remote-tracking branch 'origin/main' into execute-audit-remedia…
cursoragent Jul 28, 2026
a4fa19d
docs(ledger): close out #1305 after PR required green
cursoragent Jul 28, 2026
cc7800f
Merge remote-tracking branch 'origin/main' into execute-audit-remedia…
cursoragent Jul 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion docs/branch-review-ledger.md

Large diffs are not rendered by default.

55 changes: 55 additions & 0 deletions eslint-rules/require-z-index-ladder.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/**
* Local ESLint rule: enforce z-index ladder allowed rungs.
* Validates all z-[<n>] utilities against allowed rungs:
* 0, 5, 10, 20, 30, 40, 60, 80-85, 95, 100
*
* Rung 5 is reserved for interstitial chrome that must sit above a z-0
* backdrop but below the z-10 command/suggestion surface (privacy notice).
*/

const ALLOWED_RUNGS = new Set([0, 5, 10, 20, 30, 40, 60, 80, 81, 82, 83, 84, 85, 95, 100]);

/** @type {import("eslint").Rule.RuleModule} */
const rule = {
meta: {
type: "problem",
docs: {
description: "Enforce z-index ladder allowed rungs.",
},
schema: [],
messages: {
invalid: "Z-index value z-[{{value}}] is not allowed. Allowed rungs: 0, 5, 10, 20, 30, 40, 60, 80-85, 95, 100.",
},
},
create(context) {
const checkString = (node, value) => {
const regex = /\bz-\[(\d+)\](?:\s|$)/g;
let match;
while ((match = regex.exec(value)) !== null) {
const num = parseInt(match[1], 10);
if (!ALLOWED_RUNGS.has(num)) {
context.report({
node,
messageId: "invalid",
data: { value: match[1] },
});
}
}
};

return {
Literal(node) {
if (typeof node.value === "string") {
checkString(node, node.value);
}
},
TemplateElement(node) {
if (typeof node.value.raw === "string") {
checkString(node, node.value.raw);
}
},
};
},
};

export default rule;
11 changes: 11 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import nextTs from "eslint-config-next/typescript";

import requireLucideIconAria from "./eslint-rules/require-lucide-icon-aria.mjs";
import requireButtonWiring from "./eslint-rules/require-button-wiring.mjs";
import requireZIndexLadder from "./eslint-rules/require-z-index-ladder.mjs";
import restrictSuppressHydrationWarning from "./eslint-rules/restrict-suppress-hydration-warning.mjs";
import noHardcodedHex from "./eslint-rules/no-hardcoded-hex.mjs";

Expand All @@ -14,6 +15,7 @@ const localRulesPlugin = {
rules: {
"require-lucide-icon-aria": requireLucideIconAria,
"require-button-wiring": requireButtonWiring,
"require-z-index-ladder": requireZIndexLadder,
"restrict-suppress-hydration-warning": restrictSuppressHydrationWarning,
"no-hardcoded-hex": noHardcodedHex,
},
Expand Down Expand Up @@ -78,6 +80,15 @@ const eslintConfig = defineConfig([
"local/restrict-suppress-hydration-warning": "error",
},
},
// Z-index ladder enforcement
{
files: ["src/**/*.{js,jsx,ts,tsx}"],
ignores: MOCKUP_IGNORES,
plugins: { local: localRulesPlugin },
rules: {
"local/require-z-index-ladder": "error",
},
},
// Import boundary: production source must not import design-scratch mockup
// modules. Every legitimate mockup import lives under `src/app/mockups/**` (all
// 404 in production) or inside the `*-mockups` component sources themselves;
Expand Down
Loading