chore(release): publish db 0.8.21, cli 0.8.65 and seven in-flight packages
Quality / quality (ubuntu-latest) (push) Failing after 10m1s
Quality / quality (windows-latest) (push) Canceled after 0s

Carries the rollback refusal in db and the matching CLI message, together
with the auth, captcha, csr, dev-server, dev-toolbar, ui and validation
changes that were already in the working tree, since publishing stages
from it and those files would otherwise ship without being recorded here.

  @wrnexus/auth        0.8.28 -> 0.8.29
  @wrnexus/captcha     0.8.15 -> 0.8.16
  @wrnexus/cli         0.8.64 -> 0.8.65
  @wrnexus/csr         0.8.37 -> 0.8.38
  @wrnexus/db          0.8.20 -> 0.8.21
  @wrnexus/dev-server  0.8.60 -> 0.8.61
  @wrnexus/dev-toolbar 0.8.17 -> 0.8.18
  @wrnexus/ui          0.8.75 -> 0.8.76
  @wrnexus/validation  0.8.12 -> 0.8.13

Also declares Event among the browser globals captcha's client asset
already lists, which was the last lint failure, and reformats four files.
typecheck, lint, 1998 tests and format:check all pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
ClintchizandClaude Opus 5 committed 2026-09-03 10:17:09 +05:30
1 parent b807f7b5a7
commit 06433e4ac4
28 files changed
+194 -43

No files matched your search

+41 -1
View File
@@ -241,6 +241,15 @@ test("screenshot-directed canonical components are bundled", () => {
expect(uiComponentNames()).toEqual(expect.arrayContaining(required));
});
test("badge labels are humanized and capitalized by default", () => {
const source = readFileSync(uiComponentPath("Badge"), "utf8");
const contract = parse(source);
const defaults = new Map(contract.props.map((prop) => [prop.name, prop.default]));
expect(defaults.get("humanize")).toBe("true");
expect(source).toContain("label.replaceAll('_', ' ').replaceAll('-', ' ')");
expect(source).toContain("text-transform: capitalize");
});
test("navbar supports brands, nested menus, actions, utility slots, and public events", () => {
const source = readFileSync(uiComponentPath("Navbar"), "utf8");
expect(source).toContain('slot name="topbar"');
@@ -638,12 +647,28 @@ test("every bundled UI component compiles", () => {
test("icon buttons expose their accessible label as a hover and focus tooltip", () => {
const button = readFileSync(uiComponentPath("Button"), "utf8");
expect(button).toContain('class="wrn-btn__tooltip"');
expect(button).toContain('class="wrn-btn__tooltip wrn-btn__tooltip--{tooltipPlacement}"');
expect(button).toContain("{ariaLabel || label}");
expect(uiStyles()).toContain(".wrn-btn:hover > .wrn-btn__tooltip");
expect(uiStyles()).toContain(".wrn-btn:focus-visible > .wrn-btn__tooltip");
});
test("icon button tooltips support downward placement below sticky headers", () => {
const button = readFileSync(uiComponentPath("Button"), "utf8");
const contract = parse(button);
const defaults = new Map(contract.props.map((prop) => [prop.name, prop.default]));
expect(defaults.get("tooltipPlacement")).toBe('"top"');
expect(button).toContain('data-placement="{tooltipPlacement}"');
expect(uiStyles()).toContain(".wrn-btn__tooltip--bottom");
expect(uiStyles()).toContain("inset-block-start: calc(100% + 0.5rem)");
});
test("textarea does not reserve validation space while its error is empty", () => {
const textarea = readFileSync(uiComponentPath("Textarea"), "utf8");
expect(textarea).toContain('.wrn-next--field[data-invalid="false"] > .wrn-next__field-error');
expect(textarea).not.toContain(".wrn-next__field-error:empty");
});
test("button links navigate by default and only download when the native attribute is passed", () => {
const button = readFileSync(uiComponentPath("Button"), "utf8");
expect(button).not.toMatch(/^\s+download\s*=/m);
@@ -2043,6 +2068,11 @@ test("advanced select opens, filters, and selects without reactive handler error
expect(dom.querySelector(".wrn-next__select-dropdown")?.getAttribute("data-show")).toBe("true");
expect(dom.querySelector('[role="listbox"]')).not.toBeNull();
const search = dom.querySelector(".wrn-next__select-search input") as HTMLInputElement;
expect(
dom
.querySelector(".wrn-next__select-search .wrn-next__search-icon")
?.classList.contains("icon-[lucide--search]"),
).toBe(true);
search.value = "engine";
search.dispatchEvent(
new (dom.window as { Event: typeof Event }).Event("input", { bubbles: true }),
@@ -3281,6 +3311,16 @@ test("sidebar composes Drawer for its off-canvas presentation", async () => {
expect(source).toContain("<Drawer");
});
test("sidebar reveals the active item when a long navigation rail mounts", () => {
const source = readFileSync(uiComponentPath("Sidebar"), "utf8");
expect(source).toContain("lifecycle {");
expect(source).toContain("revealActiveItem()");
expect(source).toContain(".wrn-sidebar__link--active");
expect(source).toContain(
'scrollIntoView({ block: "nearest", inline: "nearest", behavior: "auto" })',
);
});
test("scrollspy renders section links and marks the runtime observation target", async () => {
const source = readFileSync(uiComponentPath("Scrollspy"), "utf8");
const html = await renderComponent(source, {