wabi 0.25.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a384f4302bd3a32241bef8c7a5a5629716bf49962db16c602fce4ce915c35e3
4
- data.tar.gz: 6363df2bdf330cdbf8b181a45a42b4cd1ce41b08be7a59948c0b638a9c2abfe7
3
+ metadata.gz: 71aa466808ac1d38788cab128140642bc5b7130b045f72bdf9c7a76dc9545fcf
4
+ data.tar.gz: b2a9956a503a1a7cea95730b4d819ee47a332006ef22598338432fefb30bac53
5
5
  SHA512:
6
- metadata.gz: 84718c3185eb5d9ed47798abf8ba892c11f0062429f85491729a39c362c14f6b762b169e2451ae01e90a36f0c3a425765b8b0fd3224783c11e6fa89d90353e52
7
- data.tar.gz: 98eb1aff33f581c80bca3ddef63773c023e03a63cd9c456c791e9089a5297ea8ca4047785ae6e7d16f08d087f8894f79e89e19b3fbb7c98d7d93dff4f6421005
6
+ metadata.gz: '09bcde85a5ad92d26b7992c84186d118d09dff63b5ec78159da8b90895a788199dde737cd2aa457c370a9f55d6cb021613fb182b01931852e728a4b9594b7875'
7
+ data.tar.gz: ec94e25aa20ee576d77f8c9bdd66cad7401b6d8265d365bb41de255c0e4691f70710270f8367085ea14027d4ef632494ba7470edb1b5df698a63eaa934530bf2
data/CHANGELOG.md CHANGED
@@ -2,6 +2,48 @@
2
2
 
3
3
  All notable changes to Wabi land here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## 0.30.0 - 2026-06-09
6
+
7
+ Pre-1.0 hardening: a Turbo-cache fix for every portaled overlay, dependency alignment, and release-metadata polish. Version jumps 0.26 → 0.30 to mark the start of the 0.3x pre-1.0 series.
8
+
9
+ ### Breaking changes
10
+ - **Ruby >= 4.0 required** (was >= 3.4), matching what CI actually tests.
11
+ - **date_picker / calendar** — `readonly:` is now `read_only:`, matching the Ruby snake_case convention used everywhere else (e.g. `rating_group`). The rendered markup is unchanged.
12
+
13
+ ### Fixed
14
+ - **Portaled overlays now survive the Turbo page cache.** Turbo snapshots the page *before* controllers disconnect, so an open dialog/popover/select/etc. was cached portaled at `<body>` with `data-state="open"` — restoring that snapshot (back button) left an orphaned open overlay the controller could no longer reach (plus a stuck backdrop for modals). The shared portal helpers now close the overlay and restore its nodes on `turbo:before-cache`, so cached snapshots always hold a clean closed overlay. Applies to dialog, alert_dialog, drawer, popover, select, combobox, command, dropdown_menu, context_menu, tooltip, hover_card, date_picker, color_picker and navigation_menu.
15
+
16
+ ### Changed (non-breaking)
17
+ - All `@zag-js/*` packages aligned on **1.41.2** (the registry mixed 1.41.0/1.41.2; mismatched Zag patch versions across machines can cause subtle bugs).
18
+ - Gem metadata: homepage points at the live docs (https://wabi-docs.onrender.com) until wabikit.dev is wired; `rubygems_mfa_required` declared.
19
+
20
+ ## 0.26.0 - 2026-06-09
21
+
22
+ An API-standardization pass ahead of 1.0, a documentation consistency sweep across all 49 component pages, and automated gem releases. **This release contains breaking API changes** (allowed pre-1.0 per SemVer) — they close the last naming/typing inconsistencies before the public API freezes at 1.0.
23
+
24
+ ### Breaking changes
25
+ - **accordion** — `AccordionTrigger`'s `heading_level:` (symbol, e.g. `:h3`) is now `level:` (Integer 1-6, default `3`), mirroring `CardTitle`. Pass `level: nil` to opt out of heading semantics (renders a `<div>` wrapper).
26
+ - **`aria_label:` rename** — the keyword that maps to the HTML `aria-label` attribute is now `aria_label:` (was `label:`) in: `progress`, `radio_group`, `number_input`, `input_otp`, `splitter` (resize trigger), and `context_menu` (radio group). Components that render a real `<label>` element keep `label:` (`checkbox`, `command`, `tree_view`).
27
+
28
+ ### Added
29
+ - `invalid:` on **textarea** (parity with `input`) → emits `aria-invalid="true"`.
30
+ - `aria_label:` on **dropdown_menu** radio group (parity with `context_menu`).
31
+
32
+ ### Changed (non-breaking)
33
+ - Relaxed the required `name:` keyword to optional across form inputs (`combobox`, `radio_group`, `rating_group`, `slider`, `tags_input`, `input_otp`, `number_input`, `file_upload`, `date_picker` incl. `Calendar`); **toggle_group** `type:` now defaults to `:single`. Callers that already pass these are unaffected.
34
+ - Enum defaults are now symbols: `tree_view` `selection_mode: :single`, `color_picker` `format: :rgba` (strings are still accepted — output is unchanged).
35
+ - User `class:` routes uniformly through `merge_class` in the breadcrumb/popover/alert_dialog/tooltip triggers.
36
+
37
+ ### Fixed
38
+ - `Wabi::ClassMerge.call` returns `nil` (not `""`) for an empty result, so components never emit a spurious empty `class=""` attribute.
39
+ - **date_picker** range mode no longer emits malformed `name="[start]"`/`name="[end]"` hidden inputs when `name:` is omitted.
40
+
41
+ ### Docs
42
+ - Consistency sweep across all 49 component pages: descriptions sourced from the component manifests, complete `SOURCE_PATHS` (the Source section now shows every file you install), copy-pasteable example code (no placeholders), richer variant coverage, and a missing accessibility section added to `skeleton`.
43
+
44
+ ### Tooling
45
+ - Automated gem publishing via **RubyGems Trusted Publishing (OIDC)** on `vX.Y.Z` tags — see `.github/workflows/gem-release.yml` and `RELEASING.md`. No stored credentials.
46
+
5
47
  ## 0.25.0 - 2026-06-08
6
48
 
7
49
  Component count 47 → **49**. Two new components, a project-wide WCAG-AA accessibility audit, and the first `CONTRIBUTING.md`.
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Wabi is an open-source UI component library for **Ruby on Rails 8**, built on **Phlex + Tailwind 4 + Stimulus + Hotwire**. Inspired by shadcn/ui, components are *copied* into your app — you own the code, customize freely, no upstream API to drift away from.
6
6
 
7
- 🎉 **Status:** v0.25.0 alpha — [available on RubyGems](https://rubygems.org/gems/wabi). 49 components, 8 theme palettes, WCAG-AA audited, live docs + registry at [wabi-docs.onrender.com](https://wabi-docs.onrender.com).
7
+ 🎉 **Status:** v0.30.0 alpha — [available on RubyGems](https://rubygems.org/gems/wabi). 49 components, 8 theme palettes, WCAG-AA audited, live docs + registry at [wabi-docs.onrender.com](https://wabi-docs.onrender.com).
8
8
 
9
9
  ---
10
10
 
@@ -114,7 +114,7 @@ That's a fully-accessible modal with focus trap, scroll lock, backdrop click, Es
114
114
 
115
115
  ## Compatibility
116
116
 
117
- - **Ruby**: 3.4 or later
117
+ - **Ruby**: 4.0 or later
118
118
  - **Rails**: 8.0 or later
119
119
  - **Tailwind**: 4.x (native `@theme inline`, no `tailwind.config.js`/`preset.js`)
120
120
  - **Phlex**: 2.4 or later
@@ -156,7 +156,7 @@ Then visit:
156
156
  The docs site is a Rails app under `docs/`. Local dev: `bin/dev` from
157
157
  repo root. The static search index lives at `docs/public/pagefind/`
158
158
  and is regenerated by a Rake task that crawls every docs route via
159
- `Rack::Test`, dumps HTML to disk, then runs `npx pagefind` on it.
159
+ `Rack::Test`, dumps HTML to disk, then runs `pnpm dlx pagefind` on it.
160
160
 
161
161
  ```bash
162
162
  cd docs && bin/rails wabi:docs:index
@@ -25,7 +25,13 @@ module Wabi
25
25
  tokens.each do |token|
26
26
  seen[group_key(token)] = token
27
27
  end
28
- seen.values.join(" ")
28
+ merged = seen.values.join(" ")
29
+ # Return nil (not "") for an all-empty merge so Phlex omits the attribute
30
+ # entirely instead of emitting a spurious `class=""`. Base-class-less
31
+ # components (e.g. breadcrumb root, popover/alert_dialog/tooltip triggers)
32
+ # call merge_class(user_class) with no class, and would otherwise render
33
+ # `class=""`. Non-empty results are unaffected.
34
+ merged.empty? ? nil : merged
29
35
  end
30
36
 
31
37
  def group_key(token)
data/lib/wabi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wabi
4
- VERSION = "0.25.0"
4
+ VERSION = "0.30.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wabi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0
4
+ version: 0.30.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Ortega
@@ -150,14 +150,15 @@ files:
150
150
  - lib/wabi/zag_vendor.rb
151
151
  - templates/controllers/wabi/theme_controller.js
152
152
  - templates/tokens.css
153
- homepage: https://wabikit.dev
153
+ homepage: https://wabi-docs.onrender.com
154
154
  licenses:
155
155
  - MIT
156
156
  metadata:
157
- homepage_uri: https://wabikit.dev
157
+ homepage_uri: https://wabi-docs.onrender.com
158
158
  source_code_uri: https://github.com/wabikit/wabi
159
159
  bug_tracker_uri: https://github.com/wabikit/wabi/issues
160
160
  changelog_uri: https://github.com/wabikit/wabi/blob/main/CHANGELOG.md
161
+ rubygems_mfa_required: 'true'
161
162
  rdoc_options: []
162
163
  require_paths:
163
164
  - lib
@@ -165,7 +166,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
166
  requirements:
166
167
  - - ">="
167
168
  - !ruby/object:Gem::Version
168
- version: '3.4'
169
+ version: '4.0'
169
170
  required_rubygems_version: !ruby/object:Gem::Requirement
170
171
  requirements:
171
172
  - - ">="