Inazda GlassClean
Solid Reduce motion

Glass you can read.

Frosted, rim-lit surfaces with a pointer sheen, and real refraction where the browser can draw it. 18 components, 4 tiers and 14 background patterns made to sit behind glass. Every text-safe tier holds 4.5:1 over any backdrop, and solid mode is one attribute away.

18components
14patterns, light + dark
4tiers
0dependencies

Lisbon

21°

Clear until 18:00

Focus

42 of 60 min

Refraction at the rimThe edge bends what sits behind it.

Low Tide

Sekar Ayu · Field Notes

1:083:45
A scene built only from this pack, over the pattern you pick below. Move your pointer across it.
Pattern
Tier

Surface

One surface class, four tiers. Frost, rim light and depth come with every tier; refraction and the sheen are opt-in.

A

Tiers

Pick the tier by what sits on it. Thin is for frames and trays with no text. Regular carries body text. Thick suits overlays that sit over busy content. Solid is the opaque fallback, and what every tier becomes in solid mode.

thin 45 % · regular 72 % · thick 86 % (light) · thin 50 % · regular 80 % · thick 88 % (dark)

textSafe. Regular, thick and solid keep body text at 4.5:1 or more over any backdrop, pure black to pure white. Thin is not text-safe: put labels on a .iz-glass-scrim or a nested tier.

Thin · no text
Aa
Regular · textSafe
Aa
Thick · textSafe
Aa
Solid · textSafe
B

Refraction

Hero surfaces, a dock, a single feature card. data-refract bends the backdrop through an SVG displacement map: lens (default) curves it at the rim like thick glass, ripple warps the whole pane like pressed glass. Use it on one or two surfaces per screen.

lens: depth 56 px · bevel 14–36 px · map built once per size

Where it works. Chromium-based browsers render it. Safari and Firefox show the same surface as plain frost, with nothing broken. Solid mode and reduced transparency turn it off. It does not move, so it stays with reduced motion.

Refraction
Lens · thin
Ripple · thin
Text on refracting glass A textSafe tier keeps the words readable; the rim still bends.
C

Sheen and rim

Every surface has a 1 px rim that catches light at the top left and a soft inner shadow. Add data-sheen and a specular highlight follows the pointer, so the glass feels lit by the person using it.

one pointer listener · rAF-throttled · visible surfaces only

Reduced motion. The sheen stops tracking and rests at the top left. In solid mode there is no sheen and the rim becomes a plain divider line.

Move your pointer here The highlight follows it, the rim stays put.

Controls

Controls sit on a glass surface and borrow its backdrop. Their own fills are tints, so they never stack a second blur.

01

Button

Primary for the one action that matters, secondary for the rest, ghost inside toolbars. To float a button straight over a picture, make it glass itself: class="iz-glass iz-g-btn".

40 px tall · 32 and 48 px sizes · press scale .97

Reduced motion. No press scale. Hover and pressed colours still show.

02

Segmented control

Two to five views of the same thing. A raised thumb slides to the choice; arrow keys move it. It is a radio group, so screen readers say “2 of 3”.

320 ms ease-out slide · roving tabindex

Reduced motion. The thumb jumps to the new choice.

Calendar view

03

Toggle

Settings that apply at once. The track has a 3:1 outline, so the off state reads on any glass.

200 ms ease-out thumb · role="switch"

Reduced motion. The thumb jumps; the track colour still fades.

Focus filter

Silence apps outside Kiln.

Lossless audio

Uses more data on mobile.

05

Chip

Filters you can switch on and off (toggle buttons), and tags you can remove. Pressed chips flip to solid ink with a tick, so the state never relies on colour alone.

32 px · aria-pressed · removal is announced

Keyboard. Removing a tag moves focus to the next one.

Show

Tags

  • Launch
  • Dunes
  • Field notes

Bars

Glass earns its place on things that float over content: navigation, tools, docks and players.

06

Nav bar

A top bar that floats over a hero or a scrolling page. Under 480 px of its own width the links fold behind a menu button, so it fits any column, not only the viewport.

56 px · container query · aria-current="page"

Keyboard. Escape closes the folded menu and returns focus to its button.

07

Toolbar

Formatting bars and canvas tools that hover over the work. One Tab stop for the whole bar; arrows, Home and End move inside it. Toggles use aria-pressed; grouped ones (alignment) act like radios.

role="toolbar" · roving tabindex · data-group

Reduced motion. Nothing moves here; only colours change.

08

Tab bar

The bottom navigation of a phone-sized app. These are links with aria-current, not ARIA tabs, because each one goes to a page.

52 px targets · icon + label · pill for the current page

Solid mode. The bar turns opaque; the current pill keeps its full contrast.

09

Dock

A launcher tray. It uses the thin tier, which is fine because it carries only app tiles; names appear in a regular-tier label on hover and focus. Icons magnify toward the pointer.

thin tier + refraction · magnify 1.42× over 150 px · arrows move focus

Reduced motion. No magnify, no label slide. Labels still appear.

10

Sidebar

App navigation beside a canvas or a photo. It collapses to an icon rail; labels stay in the accessibility tree, so links keep their names.

248 px · 68 px rail · aria-expanded on the toggle

Reduced motion. The width snaps instead of sliding.

11

Media player bar

Now-playing bars for audio and video. The scrubber is a native range input with a readable value (“1:08 of 3:45”); the play button swaps its name between Play and Pause.

native range · aria-valuetext · stacks under 420 px

Keyboard. Arrow keys scrub by a second, Page Up and Page Down by more.

Low Tide

Sekar Ayu · Field Notes

1:083:45

Content

Cards, panels and tiles that hold reading text. They default to the regular tier; switch the bar above to thick or solid to compare.

12

Card

A feature, a post or a product over a picture. The media slot takes an image, a video or one of the patterns at card size.

20 px padding · 20 px radius · media 16:9

Text. Title and body use the glass text tokens, so they pass on every textSafe tier.

Field notes · 6 min read

Mapping the dunes at first light

Sekar spent a week on the coast with a drone and a notebook. Here is what the sand looked like before the wind woke up.

13

Panel

Settings and inspectors: a header, rows split by hairlines, and a footer for actions. Rows hold switches, segmented controls or fields.

16 px header · 14 px rows · hairline dividers

Solid mode. Dividers stay; the rim becomes a plain line.

Sharing

Tidepool launch

3 people
Anyone with the linkCan view, cannot edit
CommentsGuests can reply to threads
New members join as
14

Widget tiles

Glanceable tiles for a home screen or a dashboard corner: one number, one note. Charts inside are images with a text alternative.

auto-fill grid · 150 px minimum · span 2 for wide tiles

Screen readers. Each tile is a labelled region; the ring and bars have text alternatives.

Lisbon

21°

Clear until 18:00, light wind from the west.

Focus

42 of 60 min today

Listening this week

Most on Sunday: 70 min of Field Notes.

Overlays

Things that open over everything else. They default to the thick tier, because what is behind them is unknown.

15

Popover menu

Sort, filter and overflow actions. Opens on click, Enter, Space or the arrow keys; arrows, Home and End move; Escape closes and returns focus; a click outside closes it.

thick tier · 200 ms scale from the corner · role="menu"

Reduced motion. Fades only, no scale.

16

Modal and sheet

Native <dialog>: focus is trapped and returned, Escape closes, and a click on the scrim closes it. The sheet variant rises from the bottom edge, for phones and quick share menus.

thick tier · blurred scrim · 320 ms rise · data-iz-close="value"

Reduced motion. Dialog and scrim fade; nothing rises.

Invite to Tidepool

They get an email with a link. You can change their access later.

Share “Low Tide”

Send the track, or a link that starts at 1:08.

17

Toast

Short confirmations after an action. They stack, wait while hovered or focused, and leave after five seconds. Escape or the close button dismisses one.

thick tier · 200 ms rise · four at most · polite live region

Reduced motion. Toasts fade in and out in place.

    18

    Notification stack

    Several alerts from one place, stacked like cards. Collapsed, only the newest is in the tab order; expanded, each one can be read and dismissed.

    peek 12 px · scale .95 per card · 320 ms spread

    Reduced motion. The stack opens in one step.

    • Rina shared “Moodboard v3”

      2 min

      Twelve new frames, mostly dunes at dawn. Have a look before the 14:00 review.

    • Studio review moved

      18 min

      Now 14:00 to 14:30 in Room 2. Dimas added the agenda.

    • Theo replied

      1 h

      “The second mix is warmer. Ship that one.”

    Patterns

    14 original backgrounds made to sit behind glass: soft shapes for calm screens, hard edges and stripes where you want the refraction to show. Each one is pure CSS (four use a small SVG file), switches with the theme, and comes as 4K desktop and phone wallpapers in light and dark.

    Install

    1. Copy the files

      Put glass.css, glass.js and the patterns/ folder next to your page (or the .min copies).

    2. Link them
      <link rel="stylesheet" href="glass.css">
      <link rel="stylesheet" href="patterns/patterns.css">
      <script type="module">
        import { init } from "./glass.js";
        init();
      </script>
    3. Put glass over something

      Glass needs a backdrop. Use one of the patterns, a photo or your own content.

      <main class="iz-pattern" data-pattern="aurora">
        <article class="iz-glass iz-g-card" data-sheen>
          <h2 class="iz-g-card__title">Hello</h2>
          <p class="iz-g-card__body">Readable on any backdrop.</p>
        </article>
      </main>
    4. Pick a tier, opt in to effects

      data-tier="thin | thick | solid" (regular is the default), data-sheen for the pointer highlight, data-refract or data-refract="ripple" for refraction.

    API

    ExportWhat it does
    init(scope?)Binds every [data-iz], [data-refract] and [data-sheen]. Call again after adding markup.
    get(el, name?)The controller of a component, for example get(el, "seg").select(2).
    toast(opts)Adds a toast: { title, body, tone, duration, action }.
    setSolid(on, el?)Solid mode for the page or one subtree.
    setTier(el, tier)Changes a surface's tier and rebuilds its refraction map.
    setPattern(el, name)Puts a pattern behind a subtree. PATTERNS lists all 14.
    refresh(el)Rebuilds one refraction map (resizes are handled for you).
    audit(scope?)Lists thin-tier surfaces that hold text. Returns [] when all is well.
    supportsRefraction(), reduced(), solid(el?)What the current browser and settings allow.
    announce(text)Speaks through one shared polite live region.

    Events bubble: iz:change, iz:select, iz:open, iz:close.

    Accessibility

    • Contrast by construction. Each textSafe tier is tuned so body text passes 4.5:1 composited over pure black and pure white, with the sheen at full strength. Measured over all 14 patterns the lowest is 7.0:1.
    • Focus is a two-tone ring (ring + halo) that keeps 3:1 against any backdrop. Strokes for fields, switches and chips are 3:1 on every textSafe tier.
    • Solid mode for prefers-reduced-transparency, html[data-iz-solid], forced colours and browsers without backdrop-filter. Text colours never change, so nothing reflows.
    • Reduced motion stops the sheen, the dock magnify, slides and pattern drift; colour and opacity changes stay.
    • Keyboard: roving focus in segmented controls, toolbars and the dock; menus, combobox and dialogs follow the ARIA patterns and return focus.
    • No layout reads, Date.now() or Math.random() at import time, so server-rendered pages hydrate cleanly.

    Browser support

    FeatureChrome, EdgeSafariFirefoxWithout it
    Frost (backdrop-filter)76+9+ (prefixed), 18+103+Solid surfaces
    Refraction (SVG in backdrop-filter)yesnonoPlain frost
    Pattern colours (light-dark())123+17.5+120+Light colours in both themes
    Enter animations (@starting-style)117+17.5+129+Overlays appear without the rise
    Reduced transparency query118+no (use the solid switch)nodata-iz-solid
    Container queries (nav bar, player, tiles)105+16+110+Wide layout

    Licence

    Use the pack in unlimited personal and client projects, commercial ones included. Do not resell or share the pack itself. The patterns and wallpapers are original to Inazda: use them freely inside the projects you build, but do not sell or give them away as standalone wallpapers. Geist and Geist Mono come with it as free extras under the SIL Open Font License 1.1 (fonts/OFL-Geist.txt); they are not sold.