ng-blatui — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ng-blatui (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
ng-blatui is an accessible Angular UI library (Angular 21 & 22 — standalone, signals, zoneless, SSR-ready) ported from BlatUI, built on @angular/aria + @angular/cdk. 157 components, 16 blocks, 70 charts, 35 page templates.
npm i ng-blatuiPeer deps: @angular/core, @angular/common, @angular/forms, @angular/cdk, @angular/aria.
/* src/styles.css */
@import 'tailwindcss';
@import 'ng-blatui/foundations/blatui.css'; /* oklch design tokens + dark theme */
@source '../node_modules/ng-blatui'; /* generate the utilities the lib's classes use */Without @source, Tailwind never scans ng-blatui's compiled templates and every component renders unstyled — that is the first thing to check when a screen looks broken. Adjust the ../ depth to wherever node_modules sits relative to the stylesheet. Dark mode is a dark class on an ancestor (<html class="dark">); re-theme by overriding oklch tokens in :root / .dark.
Nothing else to import: CDK 22 injects its own overlay styles, so overlay-prebuilt.css is not needed.
The library ships no icon set. Wire your own (e.g. @ng-icons with provideIcons(...)). Components that take an icon accept an SVG path d string, so any source works.
ng-blatui barrel into a standalone component's imports. No NgModule.<bui-avatar>, attribute/directive form <button buiButton>, <input buiInput>, <span buiBadge tone="success">.input<ClassValue>('', { alias: 'class' })), merged with the internal classes via tailwind-merge — so <bui-card class="mt-6"> overrides cleanly instead of fighting specificity. Hosts also expose data-slot="…" attributes as styling hooks.input()/model(), outputs output(). Bind [checked] / (checkedChange). Works under zoneless CD and SSR with no extra setup.ControlValueAccessor — formControlName, [(ngModel)], [formControl], or Signal Forms all work.import { Component } from '@angular/core';
import { BuiButton, BuiBadge } from 'ng-blatui';
@Component({
selector: 'app-demo',
imports: [BuiButton, BuiBadge],
template: `<button buiButton>Save <span buiBadge tone="success">New</span></button>`,
})
export class Demo {}Dropdown-menu, context-menu, navigation-menu, select, combobox, autocomplete, popover, hover-card, tooltip, dialog, date-picker, datetime-picker, date-range-picker, mini-cart and notification-center portal their panel into .cdk-overlay-container at the document root. Consequences:
overflow: hidden ancestors, flip (and push) to stay on-screen, and close on outside click — don't hand-roll workarounds.document.querySelector('.cdk-overlay-container …'), not the fixture.bui-dialog is CDK's Dialog service, so its backdrop behaviour is the disableClose config. bui-sheet and bui-drawer take [closeOnOverlay]="false" for a static backdrop instead — it governs the backdrop only, Escape stays wired.
aria-describedby/aria-invalid wired for you): BuiInputField, BuiMoneyInput (localized currency; symbol="DH" overrides the ISO code), BuiDateRangePicker (start→end with presets), plus BuiSelect, BuiCombobox, BuiAutocomplete, BuiPhoneInput.buiField + buiFieldLabel / buiFieldDescription / buiFieldError wrap a bare buiInput and manage the a11y relationships. buiFieldSet / buiFieldLegend group them.Reach for a bare buiInput only if you add the buiField scaffolding yourself. Other easy-to-miss primitives: buiEmpty (empty states), bui-stat (stat cards).
bui-sidebar-provider owns the shared state (exportAs="buiSidebar"). Worth knowing:
[mobileBreakpoint]="1023" moves the off-canvas threshold off Tailwind's md; a bare number is px, anything else ('40em') is used as written.buiSidebarContent is the scrolling region between a pinned header and footer. Without it the sidebar scrolls as a whole — either way an overflowing menu stays reachable, and the icon rail hides its scrollbar rather than losing 16px of a 3.5rem rail to it.<a buiSidebarMenuButton tooltip="Inbox"> labels an item while it is shrunk to the icon rail, and only there. It is a visual affordance: the label <span> stays in the DOM, so the accessible name never depends on it.Directional icons take the blat-rtl-flip class from the foundations stylesheet to mirror under dir="rtl"; the registry itself is written in logical properties (ps-*, me-*, border-s, text-start), so RTL needs no overrides.
Dates, numbers and week conventions follow the app's LOCALE_ID — no config needed, and no hardcoded en-US.
locale input on bui-calendar, bui-date-picker, bui-datetime-picker, bui-date-range-picker, bui-time-field, bui-gantt, bui-price, bui-mini-cart, bui-money-input. Use it for runtime language switching — a statically injected LOCALE_ID can't reformat.dateFormat takes full Intl.DateTimeFormatOptions ({ dateStyle: 'short' } works), numberFormat takes Intl.NumberFormatOptions.providers: [
provideBuiLabels({ bannerDismiss: 'Fermer', fileUploadRemove: 'Supprimer le fichier' }),
];provideBuiLabels takes a Partial<BuiLabels>; unpassed keys keep their English defaults. Resolution order: per-instance input → global override → built-in.
Don't invent component names or props. Resolve them, in order of preference:
npx ng-blatui-mcp — tools list_components (optional category), list_blocks, list_charts, list_templates, search({ query }), get_docs({ name }) (docs + install + import + full typed API) and get_api({ name }) (just the typed API). Also serves prompts use-component and scaffold-page. claude mcp add ng-blatui -- npx -y ng-blatui-mcpname, type, category, url + an API summary per item.https://ngblatui.remix-it.com/components/<slug> returns real HTML with the live example, props and copy-paste code. Same for /blocks/, /charts/, /templates/.Component categories: Forms & Input, Data Display, Layout, Feedback, Disclosure, Navigation, Overlays, Effects, AI, E-commerce, Media.
When unsure about a component, call get_docs/get_api (or fetch the page) and copy the documented import + usage rather than guessing.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.