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

@fiscal-io/ds-components

v8.0.1

Published

Design System Angular da Fiscal.io. A partir da **v8**, o pacote é fatiado em entry points para o bundler não puxar Gantt, PDF Viewer, File Manager, Charts etc. quando a aplicação só usa botão, grid ou layout.

Readme

@fiscal-io/ds-components

Design System Angular da Fiscal.io. A partir da v8, o pacote é fatiado em entry points para o bundler não puxar Gantt, PDF Viewer, File Manager, Charts etc. quando a aplicação só usa botão, grid ou layout.

Breaking change (v7 → v8)

O barrel único import { DsButtonComponent, DsGridModule } from '@fiscal-io/ds-components' acabou. Serviços de tema/locale/toast/sidebar continuam no entry principal; cada componente vive no seu path.

import { ThemeService, DS_THEME_CONFIG, DsToastService } from '@fiscal-io/ds-components';
import { DsButtonComponent } from '@fiscal-io/ds-components/button';
import { DsGridModule, GridComponent, ColumnModel } from '@fiscal-io/ds-components/grid';
import { DsPdfViewerModule } from '@fiscal-io/ds-components/pdf-viewer';
import { DsNavbarComponent } from '@fiscal-io/ds-components/navbar';
import { DsSidebarComponent } from '@fiscal-io/ds-components/sidebar';

O consumidor declara só a lib (+ Angular). Syncfusion, Bootstrap e bootstrap-icons vêm como dependencies do pacote — não precisa listar @syncfusion/* no app. Continue importando por entry point (@fiscal-io/ds-components/button, /grid, …) para o bundler tree-shakar.

Os widgets Syncfusion não usam o CSS stock dos pacotes ej2-* (isso quebrava hover da grid e botões outline). O visual vem dos temas custom:

  • assets/themes/syncfusion-light.css
  • assets/themes/syncfusion-dark.css

Copie esses arquivos no angular.json e deixe o ThemeService carregar o <link id="sf-theme"> (ele cria/reordena o link sozinho).

Estilos

// styles.scss — Bootstrap + ícones + overrides DS (sem CSS stock Syncfusion)
@use '@fiscal-io/ds-components/styles';
@use '@fiscal-io/ds-components/styles/variables' as ds;
// angular.json — assets
{
  "glob": "syncfusion-*.css",
  "input": "node_modules/@fiscal-io/ds-components/src/lib/assets/themes/",
  "output": "assets/themes"
}

| Export | Conteúdo | | --- | --- | | styles / styles/chrome | Bootstrap + ícones + overrides DS (toast, color-picker, uploader, toolbar da grid) | | styles/core | Bootstrap, fontes, ícones, resets | | styles/all | Alias de chrome (Storybook / playground) |

O CSS dos widgets Syncfusion fica nos temas em assets/themes/, não nos exports styles/*.

Entry points

| Path | Exporta | | --- | --- | | @fiscal-io/ds-components | ThemeService, DS_THEME_CONFIG, DsLocaleService, DsSidebarService, DsToastService | | /button /checkbox /radio-button /toggle-switch /chips | Controles de botão/seleção | | /input /color-picker /uploader | Inputs | | /datepicker /daterangepicker | Calendários | | /dropdown-list /dropdown-button | Dropdowns | | /navbar /sidebar /breadcrumb /avatar /user-menu /apps-menu | Layout | | /toast /stepper /tab /accordion | Navegação / feedback | | /grid | DsGridModule, diretiva dsGrid, tipos do EJ2 Grid | | /pdf-viewer /charts /gantt /file-manager /spreadsheet /scheduler /kanban /maps /diagram /document-editor /ribbon /rich-text-editor /query-builder /tree-grid /in-place-editor | Passthroughs Syncfusion (*Module, sem *AllModule) | | /feature-card /error-page /form-validator | Sem Syncfusion pesado |

Grid: EJ2 nativo com defaults do Design System

dsGrid não encapsula nem traduz a API da Syncfusion. Ele é uma diretiva aplicada ao próprio ejs-grid, portanto inputs, outputs, métodos, colunas, templates e comportamentos são exatamente os documentados para o EJ2 Grid.

Importe DsGridModule e acrescente o atributo dsGrid:

import { DsGridModule } from '@fiscal-io/ds-components/grid';

@Component({
  imports: [DsGridModule],
})
export class OrdersComponent {}
<ejs-grid dsGrid #grid id="orders-grid-v1" [dataSource]="orders()" [allowReordering]="true" [enablePersistence]="true" (recordClick)="openOrder($event.rowData)">
  <e-columns>
    <e-column field="id" headerText="ID" isPrimaryKey="true"></e-column>
    <e-column field="status" headerText="Status">
      <ng-template #template let-order>
        <strong>{{ order.status }}</strong>
      </ng-template>
    </e-column>
  </e-columns>
</ejs-grid>

O #grid acima é o GridComponent original. Métodos da documentação funcionam diretamente, sem helpers do Design System:

grid.autoFitColumns();
grid.clearFiltering();
grid.reorderColumns("status", "id");
grid.excelExport();

Defaults preservados

A diretiva mantém os defaults booleanos históricos da antiga ds-grid. Um binding explícito sempre vence o default:

<ejs-grid dsGrid [allowPaging]="false"></ejs-grid>

Os defaults DS são exportados em DS_GRID_DEFAULTS e incluem filtro, ordenação, resize e paginação habilitados por padrão. Persistência e reordenação continuam desabilitadas até serem habilitadas pelo consumidor.

Persistência

Use a persistência nativa exatamente como na Syncfusion:

<ejs-grid dsGrid id="orders-grid-v2" [enablePersistence]="true" [allowReordering]="true" [allowResizing]="true"> </ejs-grid>

Não existem aliases, estado inicial ou adapters próprios do Design System. Use diretamente a API nativa: id, enablePersistence, getPersistData() e os demais recursos documentados pela Syncfusion.

Custom binding

Entregue o formato nativo { result, count } e trate dataStateChange conforme a documentação da Syncfusion. Mantenha o objeto em um campo ou signal estável, em vez de criar um literal novo a cada ciclo de detecção:

<ejs-grid dsGrid #grid [dataSource]="dataSource()" (created)="loadInitial(grid)" (dataStateChange)="load($event)"></ejs-grid>

O EJ2 não dispara dataStateChange no primeiro render. Quando a primeira busca também precisa respeitar sort, filtro, página ou estado persistido, obtenha o estado inicial pela própria API nativa:

readonly dataSource = signal({ result: [], count: 0 });

loadInitial(grid: GridComponent): void {
  const data = grid.getDataModule();
  this.load(data.getStateEventArgument(data.generateQuery()));
}

Nenhuma busca, paginação, ordenação ou filtragem é executada pelo Design System. Essa decisão pertence ao consumidor da grid.

Toolbar, ações em lote e contador de seleção

Ações em lote e contadores usam a toolbar nativa do EJ2, configurada no próprio ejs-grid via [toolbar] ou #toolbarTemplate, exatamente como na documentação oficial. A diretiva expõe selectedCount (via exportAs: 'dsGrid') com a contagem de linhas selecionadas na página atual:

<ejs-grid dsGrid #ds="dsGrid" [dataSource]="rows()">
  <ng-template #toolbarTemplate>
    <div class="d-flex align-items-center gap-2 w-100">
      <button type="button" (click)="removeSelected()" [disabled]="ds.selectedCount() === 0">
        Remover
      </button>
      <span>{{ ds.selectedCount() }} itens selecionados</span>
    </div>
  </ng-template>
  <e-columns>
    <e-column type="checkbox" width="48"></e-column>
    <e-column field="id" headerText="ID"></e-column>
  </e-columns>
</ejs-grid>

Para toolbars com itens padrão (edição, exportação etc.), use [toolbar]:

<ejs-grid dsGrid [toolbar]="['Add', 'Edit', 'Delete', 'Update', 'Cancel']"></ejs-grid>

Building

npx ng build @fiscal-io/ds-components

Publishing

cd dist/fiscal-io/ds-components
npm publish --access public