feat: add corner-scoop, corner/overlap recipe macros - #517
feat: add corner-scoop, corner/overlap recipe macros#517jackgranatowski wants to merge 16 commits into
Conversation
.sf-corner-scoop (#484): a mask-based concave corner that curves away from the box, revealing whatever sits behind it. Named to mirror the future `corner-shape: scoop` keyword for an easy @supports migration. .sf-corners / .sf-overlap / .sf-overlap-host (#490): three independent recipe macros — coordinated multi-corner radius patterns (leaf shapes), an element intentionally overlapping the one before it, and the receiving container that reserves clearance for the intrusion. #489 (unified background overlay macro): no new class needed — .sf-bg + .sf-scrim already compose into exactly the requested "media background + overlay + stacked content, no manual z-index" recipe. Documented the composition and added regression coverage instead of duplicating it behind a new abstraction. Along the way, found and fixed a real latent bug that blocked that composition: --sf-bg-inset defaulted to a bare `0` instead of `0px`, which made .sf-bg's `calc(100% - 2 * var(--sf-bg-inset))` sizing invalid at computed-value time (percentage/number type mismatch), silently collapsing .sf-bg to the media's intrinsic size whenever the default inset was used — i.e. by default, for everyone. .sf-overlap-host's padding-compensation default is resolved via a var() fallback inside the rule itself (not a pre-baked :root alias), so a local --sf-overlap-pull override is honored — the same class of pitfall just fixed for section theming in #496. Closes #484 Closes #489 Closes #490 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
docs/test-coverage-6-token-reference.html and reports/full-api-audit's tokens-report.json are static artifacts not regenerated by npm run build/docs — they need a manual patch when the public token surface changes, per the precedent set in 1ec534f. Adds the 7 new corner-scoop/ corners/overlap tokens to both, sourced from real data already sitting in this repo: docs/api-index.json for tier/role/category/declared, and this same tokens-report.json's own existing rows for --sf-radius-2xl, --sf-radius-l, and --sf-space-xl (the exact tokens these 7 alias), since none of the 7 are color-scheme-dependent or otherwise need a fresh browser read to get an accurate computed value. reachable-ui.json is intentionally left untouched: these 7 tokens have no configurator UI surface yet (no MacrosPanel control, no matching domain-patterns.json substring), so adding them there would misreport audit data that was never actually collected. That's a real, separate gap worth its own follow-up, not a documentation-sync problem. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
|
Warning Review limit reached
Next review available in: 28 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (24)
📝 WalkthroughWalkthroughAdds new corner-scoop, corners, and overlap macros, updates ChangesCorner, overlap, and bg-inset surface
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR Summary by QodoAdd corner-scoop and corner/overlap recipe macros (plus .sf-bg inset fix)
AI Description
Diagram
High-Level Assessment
Files changed (23)
|
Add corner-scoop/corners/overlap patterns to the configurator's domain-patterns.json — its own curation.test.js fails otherwise, since --sf-corner-scoop-at (a knob-role literal) had no matching domain and fell through to the disallowed Misc bucket. Also drop an unused destructured variable flagged by review. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
Code Review by Qodo
Context used✅ Tickets:
🎫 Explore: concave/inverted corner utility 🎫 Add unified background image/video overlay macro with automatic z-index 🎫 Code-block color tokens don't follow section-scoped `data-theme` +1 more✅ Compliance rules (platform):
12 rules 1.
|
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
reports/full-api-audit/results/tokens-report.json (1)
382-393: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winRegenerate the token audit snapshot for
--sf-bg-inset.reports/full-api-audit/results/tokens-report.jsonstill showsdeclared: "0"/computed: "0", butcore/tokens.layout.cssnow declares--sf-bg-inset: 0px;, so this report is stale and should be regenerated.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@reports/full-api-audit/results/tokens-report.json` around lines 382 - 393, The token audit snapshot for --sf-bg-inset is stale in the tokens report and still reflects the old zero value. Regenerate the audit output from the source tokens so reports/full-api-audit/results/tokens-report.json matches core/tokens.layout.css, with the token’s declared and computed values updated from 0 to 0px and any related snapshot fields refreshed accordingly.
🧹 Nitpick comments (2)
tests/macros.spec.js (2)
432-438: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winTest doesn't verify "resolved cut radius" as claimed.
The test name says it verifies the "resolved cut radius" changes, but the assertion only checks that the raw
--sf-corner-scoop-sizecustom property equals the inline value that was just set ('40px') — a tautology, since custom properties always reflect literally whatever inline style set them. It never verifies that themask-image'sradial-gradient(...)actually resolves/uses that value (e.g., by asserting the computedmaskImagestring contains40px, or comparing visual/geometry effects at different sizes).💡 Suggested strengthening
test('--sf-corner-scoop-size override changes the resolved cut radius', async ({ page }) => { await setup(page, `<div id="t" class="sf-corner-scoop" style="width:100px;height:100px; --sf-corner-scoop-size: 40px"></div>`); - const size = await page.locator('`#t`').evaluate(el => - getComputedStyle(el).getPropertyValue('--sf-corner-scoop-size').trim() - ); - expect(size).toBe('40px'); + const mask = await page.locator('`#t`').evaluate(el => getComputedStyle(el).maskImage); + expect(mask).toContain('40px'); });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/macros.spec.js` around lines 432 - 438, The test in macros.spec.js is only asserting the inline custom property value, not the resolved cut radius used by the mask. Update the test in the existing `--sf-corner-scoop-size override changes the resolved cut radius` case to validate the computed `mask-image` or other geometry derived from `sf-corner-scoop` actually reflects the overridden size, using the same `setup`, `page.locator('`#t`')`, and `getComputedStyle` flow. Make the assertion depend on the resolved `radial-gradient(...)` output or a measurable visual effect so the test proves the override is consumed by the component.
506-529: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a regression test for the host padding fallback. The current
.sf-overlap-hosttest only covers the default pull value; add a case with a local--sf-overlap-pulloverride so thevar(--sf-overlap-host-pad, var(--sf-overlap-pull))fallback path is exercised too.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/macros.spec.js` around lines 506 - 529, The existing .sf-overlap-host test only verifies the default padding behavior, so add a regression case that sets a local --sf-overlap-pull override and asserts the host still gets matching block-start padding. Update the test near the .sf-overlap-host block in macros.spec.js to exercise the var(--sf-overlap-host-pad, var(--sf-overlap-pull)) fallback path, reusing setup and getComputedStyle on the sf-overlap-host element.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@configurator/src/data/api-index.generated.json`:
- Around line 11194-11216: The generated api-index entry for --sf-overlap-pull
has a truncated description that ends mid-sentence, so regenerate the
corresponding record in api-index.generated.json to restore the full
public-facing text. Update the description field for the --sf-overlap-pull token
so it includes the complete sentence, keeping the existing metadata (such as
name, aliasOf, and group) unchanged.
In `@configurator/src/data/classes.generated.json`:
- Around line 838-886: The class descriptions for
sf-corner-scoop--bottom-left/right/top-left/top-right are being filled from a
lint suppression comment instead of the real variant text. Update the
description extraction in extract.js to ignore stylelint-disable-next-line
property-no-vendor-prefix comments when building the API index, so these macro
entries keep their intended purpose descriptions.
In `@docs/llm-guide.md`:
- Around line 859-872: The `--sf-bg-inset` docs in `docs/llm-guide.md` are still
out of sync with the token default update and should match the `0px` value used
by `core/tokens.layout.css` and the generated indexes. Update the
`--sf-bg-inset` entry in the relevant documentation section so it reflects the
current default exactly, and keep the surrounding token examples consistent with
the same formatting used by the other recipe entries.
---
Outside diff comments:
In `@reports/full-api-audit/results/tokens-report.json`:
- Around line 382-393: The token audit snapshot for --sf-bg-inset is stale in
the tokens report and still reflects the old zero value. Regenerate the audit
output from the source tokens so
reports/full-api-audit/results/tokens-report.json matches
core/tokens.layout.css, with the token’s declared and computed values updated
from 0 to 0px and any related snapshot fields refreshed accordingly.
---
Nitpick comments:
In `@tests/macros.spec.js`:
- Around line 432-438: The test in macros.spec.js is only asserting the inline
custom property value, not the resolved cut radius used by the mask. Update the
test in the existing `--sf-corner-scoop-size override changes the resolved cut
radius` case to validate the computed `mask-image` or other geometry derived
from `sf-corner-scoop` actually reflects the overridden size, using the same
`setup`, `page.locator('`#t`')`, and `getComputedStyle` flow. Make the assertion
depend on the resolved `radial-gradient(...)` output or a measurable visual
effect so the test proves the override is consumed by the component.
- Around line 506-529: The existing .sf-overlap-host test only verifies the
default padding behavior, so add a regression case that sets a local
--sf-overlap-pull override and asserts the host still gets matching block-start
padding. Update the test near the .sf-overlap-host block in macros.spec.js to
exercise the var(--sf-overlap-host-pad, var(--sf-overlap-pull)) fallback path,
reusing setup and getComputedStyle on the sf-overlap-host element.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e41848a5-bdc1-49f8-ba5a-53a45a7ffe88
📒 Files selected for processing (23)
badges/badge-optimal.jsonbadges/css-custom-data.jsonconfigurator/src/data/api-index.generated.jsonconfigurator/src/data/classes.generated.jsonconfigurator/src/data/token-registry.generated.jsoncore/macros.csscore/tokens.layout.csscore/tokens.macros.cssdocs/api-index.jsondocs/api-index.mddocs/classes.mddocs/demo.htmldocs/llm-guide.mddocs/macros.mddocs/registry.jsondocs/test-coverage-6-token-reference.htmldocs/token-index.jsondocs/token-index.mddocs/tokens.mdreports/full-api-audit/results/tokens-report.jsonscripts/check-macro-catalog.jstests/macros.spec.jstoken-registry.json
| { | ||
| "name": "--sf-overlap-pull", | ||
| "tier": "PUBLIC", | ||
| "role": "consumption", | ||
| "namespace": "overlap", | ||
| "category": "Macro tokens", | ||
| "group": "Overlap recipe", | ||
| "description": "how far .sf-overlap pulls into the adjacent element. .sf-overlap-host's padding compensation defaults to this same value via a var() fallback in the rule itself (not aliased here — see core/macros.css), so one override on the host tunes both unless --sf-overlap-host-pad is set…", | ||
| "note": "", | ||
| "value": "var(--sf-space-xl)", | ||
| "aliasOf": "--sf-space-xl", | ||
| "registered": false, | ||
| "syntax": null, | ||
| "fallbackOnly": false, | ||
| "optional": false, | ||
| "layer": "slashed.tokens", | ||
| "bundles": [ | ||
| "full", | ||
| "optimal", | ||
| "optimal-components", | ||
| "optimal-utilities" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check the source comment in core/macros.css for --sf-overlap-pull
rg -n -B2 -A2 'sf-overlap-pull' core/macros.cssRepository: codeslash-dev/SLASHED
Length of output: 972
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== overlap entry in generated index ==="
sed -n '11194,11216p' configurator/src/data/api-index.generated.json
echo
echo "=== nearby source comment in core/macros.css ==="
sed -n '424,436p' core/macros.css
echo
echo "=== search for other generated descriptions ending with ellipsis ==="
python3 - <<'PY'
import json, re
from pathlib import Path
p = Path('configurator/src/data/api-index.generated.json')
data = json.loads(p.read_text())
hits = []
for item in data:
desc = item.get('description')
if isinstance(desc, str) and desc.endswith('…'):
hits.append((item.get('name'), desc))
print("count", len(hits))
for name, desc in hits[:20]:
print(name, "=>", desc)
PYRepository: codeslash-dev/SLASHED
Length of output: 1927
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== source for overlap-pull docs in repo ==="
rg -n -B2 -A3 --fixed-strings '--sf-overlap-pull' core configurator/src/dataRepository: codeslash-dev/SLASHED
Length of output: 624
configurator/src/data/api-index.generated.json:11194-11216 — Truncated description for --sf-overlap-pull. The generated text ends mid-sentence; regenerate this entry so the public-facing tooltip/docs show the full sentence.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@configurator/src/data/api-index.generated.json` around lines 11194 - 11216,
The generated api-index entry for --sf-overlap-pull has a truncated description
that ends mid-sentence, so regenerate the corresponding record in
api-index.generated.json to restore the full public-facing text. Update the
description field for the --sf-overlap-pull token so it includes the complete
sentence, keeping the existing metadata (such as name, aliasOf, and group)
unchanged.
|
|
||
| /* Concave corner (.sf-corner-scoop) */ | ||
| --sf-corner-scoop-size: var(--sf-radius-2xl) | ||
| --sf-corner-scoop-at: 100% 0 | ||
|
|
||
| /* Border-radius recipe (.sf-corners) — 4 logical corners */ | ||
| --sf-corners-start-start: var(--sf-radius-l) | ||
| --sf-corners-start-end: var(--sf-radius-l) | ||
| --sf-corners-end-end: var(--sf-radius-l) | ||
| --sf-corners-end-start: var(--sf-radius-l) | ||
|
|
||
| /* Overlap recipe (.sf-overlap / .sf-overlap-host) */ | ||
| --sf-overlap-pull: var(--sf-space-xl) | ||
| --sf-overlap-host-pad: var(--sf-overlap-pull) /* defaults to match the pull */ |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Sync the bg-inset entry with the token fix.
The earlier --sf-bg-inset documentation in this file still says 0, which conflicts with the 0px default now used in core/tokens.layout.css and the generated indexes.
As per coding guidelines, docs/llm-guide.md must stay aligned with token/default changes when core CSS or token-registry values change.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/llm-guide.md` around lines 859 - 872, The `--sf-bg-inset` docs in
`docs/llm-guide.md` are still out of sync with the token default update and
should match the `0px` value used by `core/tokens.layout.css` and the generated
indexes. Update the `--sf-bg-inset` entry in the relevant documentation section
so it reflects the current default exactly, and keep the surrounding token
examples consistent with the same formatting used by the other recipe entries.
Source: Coding guidelines
The corner-scoop/corners/overlap macros add 7 new PUBLIC tokens that weren't reflected in the locked token-api snapshot, failing the Regression tests CI job. Updates the snapshot and adds the matching CHANGELOG entry per the test's own documented update process. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
.sf-corner-scoop, .sf-corners--leaf, and .sf-overlap/-host previously only appeared in isolated per-variant swatches. Adds a realistic composed example (notched banner + leaf badge + overlapping avatar) so the demo shows how the recipes combine in practice. Also fixes the .sf-corner-scoop docs/macros.md example, which was missing the required base class alongside the variant modifier. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
…larify --sf-overlap-host-pad extract.js's nearest-preceding-comment heuristic picked up stylelint-disable-next-line directive comments as descriptions for whatever selector followed them with no comment of its own — visible on .sf-corner-scoop--* (leaked "stylelint-disable-next-line property-no-vendor-prefix..." as their public description). Classifies directive comments (stylelint-/eslint-disable/enable) and skips them in contextAt the same way header comments already are, so affected selectors fall back to their governing note instead, matching how undecorated variants elsewhere in the codebase already behave. Adds a regression test in tests/parse-lib.test.js. Also reworded --sf-overlap-host-pad in docs/llm-guide.md and docs/macros.md: it was listed as if it were a declared token, but it's only consumed via a var() fallback in core/macros.css and is tombstoned in token-registry.json — now described as the override hook it actually is. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
demo.html's <link> was swapped to the jsDelivr @dist CDN link, which only reflects the last release — the new corner-scoop/corners/overlap macros from this PR don't exist there yet, so they silently didn't render. It also broke the Playwright demo suite (73/93 failures in demo-visual.spec.js): the sandboxed test environment can't reach the external CDN at all, so the page loads with no stylesheet. The file's own header comment already documents why: the relative local path is required for Playwright/file://; the CDN link is only for someone manually sharing a standalone copy externally, not the committed default. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
…verlay-recipes-lxk7a9 # Conflicts: # badges/badge-optimal.json # configurator/src/data/token-registry.generated.json # docs/api-index.json # docs/api-index.md # docs/classes.md # docs/registry.json # token-registry.json
.sf-corner-scoop previously only supported one cut per element - a second single-corner variant would silently overwrite the first rather than adding a second cut, since the base class's mask-image only encodes one gradient. Adds --top/--bottom/--left/--right, which combine two radial-gradient mask layers via mask-composite: intersect so both cuts survive together (the default "add" compositing is what caused the original one-cut limitation - the second, mostly-opaque layer paints back over the first hole). Sized so the cut radius is half the element's width/height, --bottom produces a "U"/bowl opening where the two cuts meet in the middle. Adds a pixel-level regression test (screenshot decoded via canvas in the browser context, since elementFromPoint can't see mask effects - masking is paint-only, not hit-testing) confirming both corners are independently transparent, not just one. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
WebKit has a known bug (webkit.org/b/240324) where mask-composite: intersect against the implicit nothing below the bottommost mask layer collapses that layer to fully transparent, instead of leaving it unchanged. The .sf-corner-scoop--top/-bottom/-left/-right pair variants applied intersect to both of their two layers, so the bottom layer's cut silently disappeared in WebKit. Uses intersect only for the top layer (combining with the real layer below it) and add for the bottom layer (combining with nothing, where add is the identity operation in every engine — verified unaffected in Chromium, where the previous intersect/intersect pairing already worked correctly). Network access to install Playwright's WebKit binary is blocked in this environment, so this fix is verified against the documented WebKit bug report and unchanged Chromium behavior, not a local WebKit run - CI's webkit project is the first real confirmation. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
The unprefixed mask-composite: intersect, add fix (previous commit) did not resolve the WebKit CI failure - .sf-corner-scoop--bottom's bottom-left corner still rendered uncut in Playwright's WebKit. WebKit's actual masking engine evaluates the legacy -webkit-mask-image / -webkit-mask-composite pair, not the unprefixed properties, despite nominal unprefixed mask-composite support. The legacy compositing keyword set is different (source-over/source-in/source-out/xor, not add/subtract/intersect/exclude), and per the documented workaround for this exact class of bug, the bottommost layer needs 'xor' rather than 'source-over' (the legacy equivalent of 'add') - source-over against nothing still collapses to transparent in WebKit's legacy engine, unlike the unprefixed spec model where 'add' is a safe identity. Ships both prefixed forms so spec-compliant engines (Chromium, Firefox, and correctly-behaving WebKit) use the standard properties, while WebKit's actual legacy evaluation path gets the compositing values it needs. Still unverified against a real WebKit run locally (network access to install Playwright's WebKit binary is blocked in this environment) - CI is the verification. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
…op pairs" This reverts commit 9d6f23d.
…p pairs" This reverts commit 9084218.
This reverts commit ca6f7b3.
.sf-corners was the weakest of the three macros added by this PR: it's just 4 border-radius longhands with no real cross-browser or composability pitfalls to encapsulate, unlike .sf-corner-scoop (vendor-prefixing, mask composition) and .sf-overlap/.sf-overlap-host (the pull/clearance sync bug this session already found and fixed twice elsewhere). The "leaf" asymmetric look is a styling opinion, not a pattern worth a shipped default. Removes the class, its 4 --sf-corners-* tokens (tombstoned in token-registry.json per the append-only convention, not deleted), tests, docs, demo entries, and the domain-patterns.json curation pattern. Manually syncs the two frozen audit snapshot artifacts (docs/test-coverage-6-token-reference.html, reports/full-api-audit/results/tokens-report.json) per the established precedent for public-token-surface changes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sg35d8wNVerSUss6UXQMm1
Closing in favor of #519 — a clean re-submission of this same accepted content (
.sf-corner-scoop+.sf-overlap/.sf-overlap-host, plus the--sf-bg-insetunit fix and the doc-generator directive-comment fix) on a fresh branch off currentmain, with a conventionally-formatted commit history instead of this branch's revert-heavy one (which also has a commit that fails theLint commit messagesgate).The two-corner pair variant and
.sf-corners/.sf-corners--leafrecipe that were explored on this branch are not carried forward — cut after review (WebKitmask-compositebug with no viable fix, and judged too niche for the public API, respectively).No further action needed here.