Browser releases

Safari Technology Preview 249 drops attr(), if(), @function, popover=hint and Temporal in one build

Safari Technology Preview 249 drops attr(), if(), @function, popover=hint and Temporal in one build

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.

Source: WebKit Blog (webkit.org)

Related
Browser releases

Safari Technology Preview 247 lands calc-mix() and clears a scatter of small fixes

WebKit's July 1 preview build adds CSS calc-mix() under its New Features list, plus HTML spec-alignment repairs for align="center" and rel=preload as="json", two VoiceOver-facing accessibility fixes, and a MathML change for underover layout.

July 2, 2026
Browser releases

Safari 27 beta opens up the form control, scroll, and the cascade

WebKit has detailed the Safari 27 beta: 58 new web-platform features and 525 fixes, including customizable <select>, scroll anchoring, the :heading pseudo-class, and the revert-rule and stretch CSS keywords.

June 19, 2026
Browser releases

Safari Technology Preview 248 gives progress() a no-clamp option and forwards missing components across analogous color spaces

WebKit's Safari Technology Preview 248 lands two CSS additions worth reading — a no-clamp option on the CSS progress() function and forwarding of missing color components when interpolating between analogous color spaces — plus a pair of accessibility repairs and a small stack of quieter CSS fixes.

July 23, 2026