v0.139.0
Minor Changes
-
#1179
658f0b94Thanks @tenphi! - Added a newoutline-2type. It mirrorsoutlinebut paints over#surface-3instead of#surface-2, so the component stays visually distinct when placed inside a#surface-2container. The matching theme constants (DEFAULT_OUTLINE_2_STYLES,DANGER_OUTLINE_2_STYLES,SUCCESS_OUTLINE_2_STYLES,WARNING_OUTLINE_2_STYLES,NOTE_OUTLINE_2_STYLES) are exported fromdata/item-themes.outline-2is wired intoButton,Item(and every component that goes throughItem—ItemButton,ItemAction,ItemBadge,Select,FilterPicker,Picker,Menu, etc.). Thespecialtheme intentionally has nooutline-2variant (it paints over#special-surface); pairingtheme="special"withtype="outline-2"falls back tooutline. -
#1179
658f0b94Thanks @tenphi! - Breaking: Removed theneutralandsecondaryvalues from thetypeprop onButton,ButtonSplit,Item,ItemAction,ItemBadge, andItemButton, and frombuttonTypeonRadioGroup. Their visuals are now expressed through the existingclearandoutlinetypes combined withisSelected:type="neutral"→type="clear"type="clear"(selected look) →type="clear" isSelectedtype="secondary"→type="outline" isSelected
Default
typeforItemAction,ItemBadge, andItemButtonchanged fromneutraltoclear.ItemBadgenow accepts the full'primary' | 'outline' | 'clear' | 'link'union and supportsisSelected. -
#1179
658f0b94Thanks @tenphi! -RadioGroupwithtype="button"now groups its buttons likeButtonSplit: zero gap, shared corner radius (only the first/last items keep their outer-side radius), overlapping borders, and the selected button is lifted viaz-indexso its brand-tinted border is visible from all four sides. Hover / focus-visible bump higher still so they always read on top.Outline-style selected borders no longer use the alpha-blended
#<theme>-text.15(which doubled up at every overlap into a darker stripe) — they now use the new opaque#<theme>-bordertoken. The token comes from the existing neutralborderramp re-resolved per colored theme atsaturation: 0.5, giving each theme a subtly hue-tinted border with no extra palette bookkeeping. This affectsDEFAULT_OUTLINE_STYLES,DANGER_OUTLINE_STYLES,SUCCESS_OUTLINE_STYLES,WARNING_OUTLINE_STYLES, andNOTE_OUTLINE_STYLES. -
#1179
658f0b94Thanks @tenphi! - Breaking: Renamed the specialiconstring from'checkbox'to'checkmark'onItem,ItemAction, andItemBadgesince the rendered glyph is a checkmark, not a checkbox. Replaceicon="checkbox"withicon="checkmark". The associatedcheckboxstyle modifier was renamed tocheckmarkaccordingly.
Patch Changes
-
#1179
658f0b94Thanks @tenphi! - Fixedspecialthemeoutlineandclearfills resolving to the wrong layer forselected & hovered,selected & focusedandselected & hovered & pressedstates. Two state entries within the samefillmap shared the same#white.Xvalue (hovered↔disabledfor outline;'hovered | focused'↔'selected & disabled'for clear). Tasty'smergeEntriesByValuepass coalesced them into a single high-priority OR-condition entry that then negated against the lower-priority'selected & (hovered | focused)'rule, making it resolve toFALSEfor selected-hover/focus. Each alpha step now uses a unique value string, restoring the intended monotonic-contrast progression. Seesrc/data/Claude.mdfor the underlying pitfall. -
#1179
658f0b94Thanks @tenphi! - FixedItemActionandItemBadgerendering without variant styles when nested inside anItem/ItemButtonwithtype="outline-2".ItemActionContextnow collapses'outline-2'to'clear'for child actions, matching the existing behavior for'outline'/'item'/'header'/'card'. -
#1179
658f0b94Thanks @tenphi! - Internal: migrated every color reference insrc/data/item-themes.tsto use Glaze palette tokens directly, removing all dependencies on the legacy alias layer insrc/tokens/colors.ts(e.g.#dark→#surface-text,#dark-02→#surface-text-soft,#primary-text→#primary-accent-text,#primary-hover→#primary-accent-surface-hover,#primarybrand fill →#primary-accent-surface,#light→#surface-3,#clear→transparent, and the matchingdanger/success/warning/noteramps). Resolved values are unchanged — every alias was a direct re-export of the same Glaze token — so component visuals are identical. The legacy aliases incolors.tsare still exported for backwards compatibility with consumer code. -
#1179
658f0b94Thanks @tenphi! - Unified theprimary-type fill ramp across all themes.DANGER,SUCCESS,WARNING,NOTEandSPECIALnow follow the same monotonically-darkeningaccent-surface→-2→-3(default → hover → pressed) ramp already used by the default theme, so contrast against the app background increases consistently with each interaction step in both light and dark schemes. Previously the colored themes used adefault→-hover→defaultshape (no press feedback) and the special theme used a separateaccent-fill/accent-fill-hover/accent-fillramp.The special theme palette was renamed for consistency:
accent-fill→accent-surface,accent-fill-text→accent-surface-text,accent-fill-hover→accent-surface-hover, plus newaccent-surface-2andaccent-surface-3steps. The legacyaccent-surface-hovertoken is retained for the#primary-hover/#<theme>-hovercolor aliases consumed by external code.Breaking (special theme tokens only):
#special-accent-fill,#special-accent-fill-text, and#special-accent-fill-hoverwere renamed to#special-accent-surface,#special-accent-surface-text, and#special-accent-surface-hoverrespectively. External consumers referencing these by name should update their references. -
#1179
658f0b94Thanks @tenphi! - Fixed keyboard focus ring onRadioGroup:- Classic
RadioGroup(defaulttype="radio") — removed the redundant per-item wrapper outline; the inner radio circle already shows afocused-mod ring, and the duplicate wrapper ring driven by:focus-withinalso fired on mouse clicks. - Button / Tabs
RadioGroup(type="button"/type="tabs") — added a keyboard-only focus ring on the group container itself (none was rendered before, since the per-itemItemthemes only swap the border color on focus). Implemented via React Aria'suseFocusRing({ within: true })readingisFocusVisible(notisFocused), so mouse clicks don't trigger it.
- Classic
-
#1179
658f0b94Thanks @tenphi! -RadioGroupwithtype="tabs": the selected tab no longer looks active when the group is disabled. The selected-tab override now dims fill (#surface→#surface.6) and text (#dark→#dark.3) and drops$item-shadowfor thetabs & selected & disabledstate. -
#1179
658f0b94Thanks @tenphi! - Fixed a brief surface-color flash that appeared when togglingisSelectedonoutline/outline-2buttons (most visible insideRadioGroup type="button") and when togglingisDisabledonprimarybuttons (e.g. on form submit). The flash came from a CSS-transition layer-count mismatch: tasty'sfillrenders single-color values asbackground-coloronly and two-color values asbackground-color+--tasty-second-fill-color+background-image: linear-gradient(...). When a state with two layers transitioned to a state with one (or vice-versa), the gradient overlay snapped on/off instantly whilebackground-colorinterpolated, exposing the base layer mid-transition.Every
fillstate map insrc/data/item-themes.tsnow uses the same two-layer shape across non-selected, selected, and disabled states, with the same opaque base color (#surface,#surface-2,#surface-3, or#special-surfaceper variant). Only the overlay tint changes between states, sobackground-color,--tasty-second-fill-color, andbackground-imageall interpolate smoothly. Visuals are essentially unchanged — the brand-tinted overlays now composite over the variant's own base instead of the body surface, producing a sub-1-OKHSL-point lightness shift that's imperceptible in side-by-side comparisons.