You know the STP release months that read like three grid fixes and a font-feature-settings tweak? This one is not that. STP 249 is a pile.
Safari Technology Preview 249 shipped on 2026-07-29, covering WebKit changes 316531@main through 317820@main, for macOS Golden Gate and macOS Tahoe. It is a preview build, not a stable Safari release. That framing matters for everything that follows.
The pile, laid out flat
Per the release notes, CSS gains under New Features: attr() function support, outline-offset: inset, the @function custom functions rule, if(), calc-mix(), and justify-self on block-level boxes. Under preview support: wrap-inside, text-decoration-inset, and content on the ::marker pseudo-element. HTML gains popover=hint. Web API gains close watchers, including the closedby attribute for dialog. JavaScript gains the Temporal object. WebGPU gains subgroups. The resolved-issues line names grid layout sizing, clip-path rendering, and highlight decoration layering.
That is nine CSS lines, two HTML/DOM lines, one JavaScript line and one WebGPU line in one preview build. The queue scored this drop a 92 for a reason.
attr() and if(), sharing the same notes
Two of those CSS lines change how a stylesheet talks to itself. attr() gets one "Added support" bullet. if() gets another. The release lists both without follow-up prose, so I am not going to paste a syntax example the notes do not provide. What I will say is this: an engine acknowledging both a generalized attr() and a first-class if() in the same drop is the kind of thing that quietly changes what a hand-authored stylesheet can do without a build step. Read the linked spec text before you write more than a scratch rule, and gate anything real behind @supports.
@function is the one to actually stop and read
The release calls it "@function custom functions rule support". That is the whole entry. But the name is the interesting part: a first-class way to declare a callable function inside CSS. If it lands widely the way its neighbours land, a fair chunk of the mixin-flavoured build-time tooling stops being necessary. That is the promise. Whether the syntax and scoping match your mental model is a spec-reading exercise the release notes do not do for you.
The preview-support triplet, and the quieter CSS fixes
wrap-inside, text-decoration-inset, and content on the ::marker pseudo-element are labeled preview support. That is engine-speak for "the parser knows the name; behaviour is not committed for shipping yet." Useful for feature-detecting and scratch pages. Not for production.
The resolved-issues line calls out grid layout sizing, clip-path rendering, and highlight decoration layering. If you have been chasing a phantom subgrid track or a clip-path that never quite rendered on a hover state in this preview channel, retest.
HTML gains popover=hint; dialog gains closedby
Under HTML the release adds popover=hint. Under Web API it adds close watchers, including the closedby attribute for dialog. Both entries land without extra prose, so the useful thing to say is what they change conceptually. popover=hint gives the popover attribute another value beyond the existing set. closedby gives dialog a declarative hook that says "what closes me." Both fit the same pattern this engine has been chasing all year: move overlay behaviour from JavaScript back into markup. Read the spec, wire a scratch page, do not ship yet.
The JavaScript and WebGPU sidebar
Two lines outside the HTML/CSS beat this site covers. Temporal lands as an object under JavaScript. WebGPU adds subgroups. Both are the kind of one-line entries whose signal sits entirely in the linked specs. If you have been waiting on Temporal in a Safari-shaped build, it is here.
Where this leaves you
STP 249 is a preview channel, one engine, one build. The release makes no Baseline claim, and neither will I. What it does do is put more author-visible primitives (attr(), if(), @function), one new HTML overlay value (popover=hint), one new declarative close-hook (closedby), and a working Temporal in one place, in one week, for you to try. Feature-detect with @supports. Test in this build. Watch what Gecko and Blink do next, because the value of any of these primitives scales with how many engines land them.
This is what a good week on the platform looks like. Nine-and-a-bit on the density scale for a preview build. Read the spec before you type.
Top comments (0)