npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@saitec/ui

v0.1.12

Published

SAITEC Angular UI component library

Readme

@saitec/ui

Reusable Angular UI component library developed by SAITEC Ingeniería S.A.S.

@saitec/ui provides standalone Angular components, shared design tokens, light/dark themes, and reusable interaction patterns for SAITEC applications.

The library is designed so consuming applications depend on the public @saitec/ui/* API instead of third-party component suites or internal source paths.

Features

  • Standalone Angular components
  • Angular Forms and ControlValueAccessor support
  • Signal-based APIs
  • Light and dark themes
  • CSS custom-property design tokens
  • Global, component, and instance-level customization
  • Angular CDK for overlay-based components where appropriate
  • No Tailwind dependency inside SUI
  • Secondary entry points such as @saitec/ui/button and @saitec/ui/table

Installation

npm install @saitec/ui

Some components use Angular CDK. If needed:

npm install @angular/cdk

Angular framework packages are provided by the consuming application.

Global styles

Import SUI once from the application's global stylesheet:

@import '@saitec/ui/styles.css';

If the application uses Tailwind:

@import 'tailwindcss';
@import '@saitec/ui/styles.css';

SUI itself does not require Tailwind.

Basic usage

import { Component } from '@angular/core';
import { SuiButton } from '@saitec/ui/button';
import { SuiTag } from '@saitec/ui/tag';

@Component({
    selector: 'app-example',
    standalone: true,
    imports: [SuiButton, SuiTag],
    template: `
        <button suiButton>Save</button>

        <sui-tag severity="success"> Active </sui-tag>
    `,
})
export class ExampleComponent {}

Secondary entry points

Import components through their public package entry points:

import { SuiButton } from '@saitec/ui/button';
import { SuiInput } from '@saitec/ui/input';
import { SuiDialog } from '@saitec/ui/dialog';
import { SuiTable, SuiColumn, SuiCell } from '@saitec/ui/table';

Shared types are exposed from:

import { SuiOption } from '@saitec/ui/core';

Do not import internal source files.

Bad:

import { SuiButton } from '@saitec/ui/button/src/button.component';

Good:

import { SuiButton } from '@saitec/ui/button';

Themes

SUI uses the data-theme attribute.

Light:

<html data-theme="light"></html>

Dark:

<html data-theme="dark"></html>

Runtime switch:

document.documentElement.setAttribute('data-theme', 'dark');

SUI components consume semantic variables such as:

--sui-color-background
--sui-color-surface
--sui-color-content
--sui-color-border
--sui-color-primary
--sui-color-danger

Changing the theme updates those semantic values globally.

Design tokens

The design-token system is organized into layers:

Primitive tokens
    ↓
Theme semantic tokens
    ↓
Foundation tokens
    ↓
Component tokens
    ↓
Component CSS

Main files:

src/lib/core/tokens/
├── primitives.css
├── foundations.css
├── components.css
└── components/
    ├── button.css
    ├── input.css
    ├── table.css
    └── ...

src/lib/core/themes/
├── light.css
└── dark.css

Primitive tokens

Raw design values:

--sui-palette-brand-600
--sui-palette-neutral-900
--sui-radius-md
--sui-shadow-sm

Semantic theme tokens

Theme-level meaning:

--sui-color-primary
--sui-color-surface
--sui-color-content
--sui-color-success
--sui-color-warning
--sui-color-danger
--sui-color-info

Foundation tokens

Shared control and layout values:

--sui-control-height-md
--sui-control-padding-x-md
--sui-space-4
--sui-focus-ring-width
--sui-duration-normal
--sui-z-dialog

Component tokens

Each component exposes its own styling contract:

--sui-button-primary-background
--sui-button-radius
--sui-table-header-background
--sui-dialog-background

Customization

Global brand customization

:root {
    --sui-color-primary: #0057b8;
    --sui-color-primary-hover: #004a9d;
    --sui-color-primary-active: #003d82;
}

Component-level customization

:root {
    --sui-button-radius: 9999px;
}

Single-instance customization

<button suiButton class="special-button">Save</button>
.special-button {
    --sui-button-primary-background: #7c3aed;
    --sui-button-primary-background-hover: #6d28d9;
    --sui-button-radius: 0;
}

This avoids ::ng-deep and keeps consumers independent from internal component markup.

Forms

Form controls implement Angular ControlValueAccessor where appropriate.

<sui-input formControlName="customerName" placeholder="Customer name"> </sui-input>

Shared options

Selection components share a common option contract:

import { SuiOption } from '@saitec/ui/core';

const countries: SuiOption<string>[] = [
    {
        label: 'Colombia',
        value: 'CO',
    },
    {
        label: 'Ecuador',
        value: 'EC',
    },
    {
        label: 'Peru',
        value: 'PE',
    },
];

The same collection can be used with components such as:

<sui-select [options]="countries" />
<sui-autocomplete [options]="countries" />
<sui-multiselect [options]="countries" />

Table

import { SuiCell, SuiColumn, SuiTable } from '@saitec/ui/table';

import { SuiTag } from '@saitec/ui/tag';
<sui-table [value]="products" [striped]="true" [hoverable]="true">
    <sui-column field="code" header="Product" [sortable]="true"> </sui-column>

    <sui-column field="weight" header="Weight" align="right" [sortable]="true"> </sui-column>

    <sui-column field="status" header="Status">
        <ng-template suiCell let-value="value">
            <sui-tag severity="success"> {{ value }} </sui-tag>
        </ng-template>
    </sui-column>
</sui-table>

When using suiCell, remember to import SuiCell.

Toast and confirm

Place one instance near the root of the application:

<router-outlet />

<sui-toast />
<sui-confirm />

Then inject the corresponding service:

private readonly toast =
    inject(SuiToastService);

private readonly confirm =
    inject(SuiConfirmService);

File upload

SuiFileUpload manages file selection and UI behavior. HTTP upload remains the responsibility of the consuming application.

<sui-file-upload
    [multiple]="true"
    accept=".pdf,.png,.jpg"
    [maxFileSize]="10 * 1024 * 1024"
    (filesChange)="files = $event"
>
</sui-file-upload>

Available components

| Category | Components | | ---------- | --------------------------------------------------------------------------- | | Form | FormField, Input, Textarea, Checkbox, ToggleSwitch, InputNumber, DatePicker | | Selection | Select, Autocomplete, MultiSelect | | Actions | Button | | Data | Table | | Navigation | Menu, Menubar, Tabs | | Status | Badge, Tag, Message, ProgressSpinner | | Containers | Card, Panel, Fieldset, Toolbar, Divider | | Overlay | Dialog, Drawer, Tooltip, Toast, Confirm | | Files | FileUpload | | Content | Chip |

Development

Build the library in watch mode:

ng build ui --watch --configuration development

Run the showcase separately:

ng serve showcase

Production build:

ng build ui --configuration production

The distributable package is generated under:

dist/ui

Publishing

Publish the compiled package, not projects/ui.

ng build ui --configuration production

cd dist/ui

npm publish --dry-run --access public
npm publish --access public

The version must be incremented before publishing another release.

Recommended versioning while the API is still evolving:

0.1.x

Then move to 1.0.0 when the public API is considered stable.

Architecture guidelines

When adding components:

  1. Expose a small application-focused API instead of cloning a third-party component API.
  2. Prefer native HTML semantics when they already provide good accessibility and behavior.
  3. Use Angular CDK where robust overlay, focus, or positioning infrastructure is needed.
  4. Implement ControlValueAccessor for form controls.
  5. Keep Angular components standalone.
  6. Prefer signals for inputs, models, outputs, and internal state where appropriate.
  7. Reuse shared contracts such as SuiOption<T>.
  8. Keep visual design decisions in design tokens.
  9. Keep component CSS focused on layout, structure, and state behavior.
  10. Never require consuming applications to import internal source paths.

Styling rule

A core SUI rule is:

Component CSS describes how a component behaves and is laid out. Design tokens describe what it looks like.

Prefer:

.sui-button--primary {
    background-color: var(--sui-button-primary-background);

    color: var(--sui-button-primary-text);
}

instead of:

.sui-button--primary {
    background-color: #2563eb;
    color: #ffffff;
}

License

@saitec/ui is released under the MIT License.

Copyright © 2026 SAITEC Ingeniería S.A.S.