diff --git a/scripts/check-github-action-pins.mjs b/scripts/check-github-action-pins.mjs index 539f90a883..9db2b94a1a 100644 --- a/scripts/check-github-action-pins.mjs +++ b/scripts/check-github-action-pins.mjs @@ -173,19 +173,6 @@ if (!/^ image: semgrep\/semgrep@sha256:[0-9a-f]{64}\s*$/m.test(semgrepGateJ // the per-line validation above only covers workflows, a composite skew (e.g. // setup-node v5 vs v7) was previously invisible. Assert each action name resolves // to a single SHA everywhere it is used. -function discoverCompositeActionFiles(workflowRoot) { - const actionsRoot = path.join(workflowRoot, ".github", "actions"); - if (!existsSync(actionsRoot)) return []; - const files = []; - for (const entry of readdirSync(actionsRoot, { withFileTypes: true })) { - if (!entry.isDirectory()) continue; - for (const name of ["action.yml", "action.yaml"]) { - const candidate = path.join(actionsRoot, entry.name, name); - if (existsSync(candidate)) files.push(candidate); - } - } - return files; -} const actionPinPattern = /uses:\s*([^@\s]+)@([0-9a-f]{40})(?:\s*#\s*(\S+))?/; const shasByAction = new Map(); diff --git a/src/app/globals.css b/src/app/globals.css index 1db94159d6..631d0ad0d9 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -104,13 +104,19 @@ --ease-out-soft: cubic-bezier(0.22, 1, 0.36, 1); --ease-spring: cubic-bezier(0.34, 1.3, 0.64, 1); + --ease-exit: cubic-bezier(0.4, 0, 1, 1); --animate-fade-up: fade-up 200ms cubic-bezier(0.22, 1, 0.36, 1) both; --animate-overlay-in: overlay-in 200ms cubic-bezier(0.22, 1, 0.36, 1) both; + --animate-overlay-out: overlay-out 140ms cubic-bezier(0.4, 0, 1, 1) both; --animate-sheet-up: sheet-up 250ms cubic-bezier(0.22, 1, 0.36, 1) both; + --animate-sheet-down: sheet-down 140ms cubic-bezier(0.4, 0, 1, 1) both; --animate-sheet-left: sheet-left 220ms cubic-bezier(0.22, 1, 0.36, 1) both; --animate-pop-in: pop-in 180ms cubic-bezier(0.34, 1.3, 0.64, 1) both; --animate-dialog-rise: dialog-rise 220ms cubic-bezier(0.22, 1, 0.36, 1) both; + --animate-dialog-fall: dialog-fall 140ms cubic-bezier(0.4, 0, 1, 1) both; + --animate-pop-out: pop-out 140ms cubic-bezier(0.4, 0, 1, 1) both; + --animate-sheet-left-out: sheet-left-out 140ms cubic-bezier(0.4, 0, 1, 1) both; --animate-action-tray-in: action-tray-in 160ms cubic-bezier(0.22, 1, 0.36, 1) both; --animate-shimmer: shimmer 1.4s linear infinite; } @@ -288,6 +294,7 @@ --duration-fast: 120ms; --duration-base: 180ms; --duration-slow: 240ms; + --duration-exit: 140ms; --ease-standard: cubic-bezier(0.2, 0, 0, 1); --ease-emphasized: cubic-bezier(0.2, 0.8, 0.2, 1); color-scheme: light; @@ -1252,13 +1259,17 @@ summary::-webkit-details-marker { } } @media (prefers-reduced-motion: no-preference) { - .mode-action-surface[data-placement="up"] { + .mode-action-surface[data-placement="up"]:not([data-state="exiting"]) { animation: mode-action-fold-up 170ms cubic-bezier(0.22, 1, 0.36, 1) both; } - .mode-action-surface[data-placement="down"] { + .mode-action-surface[data-placement="down"]:not([data-state="exiting"]) { animation: mode-action-fold-down 170ms cubic-bezier(0.22, 1, 0.36, 1) both; } + + .mode-action-surface[data-state="exiting"] { + animation: pop-out 140ms cubic-bezier(0.4, 0, 1, 1) both; + } } .answer-footer-search-input { @@ -2108,6 +2119,15 @@ html[data-motion="reduced"] .pwa-notice-card { } } +@keyframes overlay-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + @keyframes sheet-up { from { transform: translateY(100%); @@ -2117,6 +2137,15 @@ html[data-motion="reduced"] .pwa-notice-card { } } +@keyframes sheet-down { + from { + transform: translateY(0); + } + to { + transform: translateY(100%); + } +} + @keyframes sheet-left { from { transform: translateX(-100%); @@ -2148,6 +2177,37 @@ html[data-motion="reduced"] .pwa-notice-card { } } +@keyframes dialog-fall { + from { + opacity: 1; + transform: translateY(0) scale(1); + } + to { + opacity: 0; + transform: translateY(12px) scale(0.98); + } +} + +@keyframes pop-out { + from { + opacity: 1; + transform: scale(1); + } + to { + opacity: 0; + transform: scale(0.97); + } +} + +@keyframes sheet-left-out { + from { + transform: translateX(0); + } + to { + transform: translateX(-100%); + } +} + @keyframes action-tray-in { from { opacity: 0; diff --git a/src/components/calculator-mockups/popup-sheet-mockup.tsx b/src/components/calculator-mockups/popup-sheet-mockup.tsx index 701b70e301..c18a02c1d7 100644 --- a/src/components/calculator-mockups/popup-sheet-mockup.tsx +++ b/src/components/calculator-mockups/popup-sheet-mockup.tsx @@ -102,9 +102,9 @@ export function CalculatorSheet({ aria-label="Close calculator" tabIndex={-1} onClick={onClose} - className="absolute inset-0 animate-overlay-in bg-[color:var(--neutral-950)]/55 backdrop-blur-[2px]" + className="absolute inset-0 motion-safe:animate-overlay-in bg-[color:var(--neutral-950)]/55 backdrop-blur-[2px] motion-reduce:transition-none" /> -
+