
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@praxisui/core
Advanced tools
Core library for Praxis UI Workspace: types, tokens, services and utilities shared across @praxisui/* packages.
Biblioteca central com interfaces e serviços fundamentais para o Praxis UI Workspace
Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
@praxisui/* em um app Angular, incluindo instalação, configuração e uso em telas reais.A biblioteca @praxisui/core é o núcleo do Praxis UI Workspace, fornecendo interfaces robustas, serviços base e utilitários essenciais para todas as outras bibliotecas do ecossistema. Com a arquitetura unificada, oferece uma experiência de desenvolvimento consistente e type-safe.
npm install @praxisui/core
Exemplo completo (app de referência)
@angular/core ^20.0.0@angular/common ^20.0.0angular-gridster2 ^20.2.2 (necessário apenas para widgets baseados em Gridster)PraxisIconDirectiveimport { Component } from '@angular/core';
import { MatIconModule } from '@angular/material/icon';
import { PraxisIconDirective } from '@praxisui/core';
@Component({
selector: 'app-icons-demo',
standalone: true,
imports: [MatIconModule, PraxisIconDirective],
template: `
<!-- Material Icons (ligatures) -->
<mat-icon [praxisIcon]="'mi:pending'"></mat-icon>
<!-- Material Symbols Outlined -->
<mat-icon [praxisIcon]="'mso:right_click'"></mat-icon>
`,
})
export class IconsDemoComponent {}
DynamicGridPageComponentimport { Component } from '@angular/core';
import { DynamicGridPageComponent, GridPageDefinition } from '@praxisui/core';
@Component({
selector: 'app-grid-demo',
standalone: true,
imports: [DynamicGridPageComponent],
template: `
<praxis-dynamic-grid-page [page]="page"></praxis-dynamic-grid-page>
`,
})
export class GridDemoComponent {
page: GridPageDefinition = {
options: { cols: 12, rowHeight: 80, gap: 12 },
widgets: [
{
key: 'w1',
layout: { col: 1, colSpan: 6, row: 1, rowSpan: 2 },
definition: {
// Substitua pelo ID de um componente registrado no ComponentMetadataRegistry
id: 'your-registered-widget-id',
inputs: { title: 'Hello' },
outputs: { loaded: 'emit' },
},
},
],
};
}
Observação: os IDs de widgets usados na página devem estar registrados via ComponentMetadataRegistry para que o carregador dinâmico resolva os componentes.
public-api.ts
para a lista consolidada de serviços, tokens, modelos e utilitários disponíveis para importação.Para exibir os metadados e schemas usados por um exemplo (ex.: na aba “Schema” de um showcase), use o componente SchemaViewerComponent e (opcionalmente) injete o contexto via SCHEMA_VIEWER_CONTEXT.
import { Component, Provider } from '@angular/core';
import { PraxisTabs, TabsMetadata } from '@praxisui/tabs';
import { SchemaViewerComponent, SCHEMA_VIEWER_CONTEXT } from '@praxisui/core';
@Component({
standalone: true,
selector: 'app-tabs-showcase',
imports: [PraxisTabs, SchemaViewerComponent],
template: `
<!-- Aba Preview -->
<praxis-tabs [config]="tabs"></praxis-tabs>
<!-- Aba Schema -->
<praxis-schema-viewer [context]="schemaCtx"></praxis-schema-viewer>
`,
providers: [
{
provide: SCHEMA_VIEWER_CONTEXT,
useFactory: () => ({
componentId: 'praxis-tabs',
title: 'Tabs — Schema & Metadata',
rawConfig: {
group: { alignTabs: 'center', dynamicHeight: true },
tabs: [ { id: 't1', textLabel: 'Dados', content: [] } ],
} satisfies TabsMetadata,
}),
} as Provider,
],
})
export class TabsShowcaseComponent {
tabs: TabsMetadata = { group: { dynamicHeight: true }, tabs: [] };
schemaCtx = {
componentId: 'praxis-tabs',
rawConfig: this.tabs,
};
}
Campos opcionais do contexto (SchemaViewerContext):
rawConfig (JSON usado pelo exemplo), effectiveConfig (se houver merge de defaults);backendSchema (OpenAPI/JSON Schema) e schemaMeta (path/operation/schemaType/schemaHash);normalizedFields (se já normalizado; caso contrário, o componente aplica SchemaNormalizerService).@praxisui/core 1.0.0-beta.x → Angular 20.xng-packagr.Apache-2.0 — veja o arquivo LICENSE incluído no pacote.
ESM2022const workShift: MaterialTimepickerMetadata = {
name: "workStart",
label: "Início do expediente",
controlType: "timePicker",
min: "08:00",
max: "18:00",
stepMinute: 30,
format: "24h",
};
interface TableConfig {
/** Metadados da configuração */
meta?: ConfigMetadata;
/** Definições de colunas */
columns: ColumnDefinition[];
/** Configurações de comportamento */
behavior?: TableBehaviorConfig;
/** Configurações de aparência */
appearance?: TableAppearanceConfig;
/** Configurações de toolbar */
toolbar?: ToolbarConfig;
/** Configurações de ações */
actions?: TableActionsConfig;
/** Configurações de exportação */
export?: ExportConfig;
/** Mensagens e textos */
messages?: MessagesConfig;
/** Localização e i18n */
localization?: LocalizationConfig;
/** Configurações de performance */
performance?: PerformanceConfig;
/** Configurações de acessibilidade */
accessibility?: AccessibilityConfig;
}
interface ColumnDefinition {
/** Campo da fonte de dados */
field: string;
/** Cabeçalho da coluna */
header: string;
/** Tipo de dados para formatação */
type?: "string" | "number" | "date" | "boolean" | "currency" | "percentage" | "custom";
/** Largura da coluna */
width?: string;
/** Visibilidade da coluna */
visible?: boolean;
/** Permitir ordenação */
sortable?: boolean;
/** Permitir filtragem */
filterable?: boolean;
/** Permitir redimensionamento */
resizable?: boolean;
/** Coluna fixa (sticky) */
sticky?: boolean;
/** Alinhamento do conteúdo */
align?: "left" | "center" | "right";
/** Ordem de exibição */
order?: number;
/** Estilo CSS personalizado */
style?: string;
/** Formato de exibição dos dados */
format?: any;
/** Mapeamento de valores para exibição */
valueMapping?: { [key: string | number]: string };
}
interface ConfigMetadata {
/** Versão da configuração */
version?: string;
/** Identificador único */
id?: string;
/** Nome amigável */
name?: string;
/** Descrição */
description?: string;
/** Tags para categorização */
tags?: string[];
/** Data de criação */
createdAt?: string;
/** Data de última modificação */
updatedAt?: string;
/** Autor da configuração */
author?: string;
}
interface TableBehaviorConfig {
/** Configurações de paginação */
pagination?: PaginationConfig;
/** Configurações de ordenação */
sorting?: SortingConfig;
/** Configurações de filtragem */
filtering?: FilteringConfig;
/** Configurações de seleção */
selection?: SelectionConfig;
/** Configurações de interação */
interaction?: InteractionConfig;
/** Configurações de redimensionamento */
resizing?: ResizingConfig;
/** Configurações de arrastar e soltar */
dragging?: DraggingConfig;
}
interface PaginationConfig {
/** Habilitar paginação */
enabled: boolean;
/** Tamanho da página */
pageSize: number;
/** Opções de tamanho de página */
pageSizeOptions: number[];
/** Mostrar botões primeira/última */
showFirstLastButtons: boolean;
/** Mostrar números das páginas */
showPageNumbers: boolean;
/** Mostrar informações da página */
showPageInfo: boolean;
/** Posição do paginador */
position: "top" | "bottom" | "both";
/** Estilo do paginador */
style: "default" | "minimal" | "advanced";
/** Estratégia de paginação */
strategy: "client" | "server";
}
interface SortingConfig {
/** Habilitar ordenação */
enabled: boolean;
/** Permitir ordenação múltipla */
multiSort: boolean;
/** Estratégia de ordenação */
strategy: "client" | "server";
/** Mostrar indicadores de ordenação */
showSortIndicators: boolean;
/** Posição do indicador */
indicatorPosition: "start" | "end";
/** Permitir limpar ordenação */
allowClearSort: boolean;
}
interface TableAppearanceConfig {
/** Densidade da tabela */
density: "compact" | "comfortable" | "spacious";
/** Configurações de bordas */
borders?: BorderConfig;
/** Configurações de elevação */
elevation?: ElevationConfig;
/** Configurações de espaçamento */
spacing?: SpacingConfig;
/** Configurações de tipografia */
typography?: TypographyConfig;
}
interface BorderConfig {
/** Mostrar bordas entre linhas */
showRowBorders: boolean;
/** Mostrar bordas entre colunas */
showColumnBorders: boolean;
/** Mostrar borda externa */
showOuterBorder: boolean;
/** Estilo da borda */
style: "solid" | "dashed" | "dotted";
/** Largura da borda */
width: number;
/** Cor da borda */
color: string;
}
interface PerformanceConfig {
/** Configurações de virtualização */
virtualization?: VirtualizationConfig;
/** Configurações de lazy loading */
lazyLoading?: LazyLoadingConfig;
}
interface VirtualizationConfig {
/** Habilitar virtualização */
enabled: boolean;
/** Altura do item */
itemHeight: number;
/** Tamanho do buffer */
bufferSize: number;
/** Altura mínima do container */
minContainerHeight: number;
/** Estratégia de virtualização */
strategy: "fixed" | "dynamic";
}
interface AccessibilityConfig {
/** Habilitar recursos de acessibilidade */
enabled: boolean;
/** Configurações de anúncios */
announcements?: AnnouncementConfig;
/** Navegação por teclado */
keyboard?: KeyboardAccessibilityConfig;
/** Contraste alto */
highContrast?: boolean;
/** Reduzir movimento */
reduceMotion?: boolean;
/** Labels ARIA personalizados */
ariaLabels?: { [key: string]: string };
}
interface AnnouncementConfig {
/** Anunciar mudanças de dados */
dataChanges: boolean;
/** Anunciar ações do usuário */
userActions: boolean;
/** Anunciar estados de carregamento */
loadingStates: boolean;
/** Tipo de live region */
liveRegion: "polite" | "assertive";
}
class TableConfigService {
/** Definir configuração atual */
setConfig(config: TableConfig): void;
/** Obter configuração atual */
getCurrentConfig(): TableConfig;
/** Verificar se um recurso está habilitado */
isFeatureEnabled(feature: string): boolean;
/** Obter resumo da configuração */
getConfigSummary(): ConfigSummary;
/** Obter configurações de paginação */
getPaginationConfig(): PaginationConfig | undefined;
/** Obter configurações de ordenação */
getSortingConfig(): SortingConfig | undefined;
/** Obter configurações de filtragem */
getFilteringConfig(): FilteringConfig | undefined;
}
import { TableConfigService } from '@praxisui/core';
@Component({...})
export class MyComponent {
constructor(private configService: TableConfigService) {}
ngOnInit() {
// Definir configuração
this.configService.setConfig(this.tableConfig);
// Verificar recursos
const hasMultiSort = this.configService.isFeatureEnabled('multiSort');
const hasBulkActions = this.configService.isFeatureEnabled('bulkActions');
const hasExport = this.configService.isFeatureEnabled('export');
// Obter configurações específicas
const paginationConfig = this.configService.getPaginationConfig();
const sortingConfig = this.configService.getSortingConfig();
}
}
import { createDefaultTableConfig } from "@praxisui/core";
// Criar configuração padrão
const defaultConfig = createDefaultTableConfig();
console.log(defaultConfig);
// {
// meta: { version: '2.0.0', ... },
// columns: [],
// behavior: { pagination: { enabled: true, ... }, ... },
// ...
// }
import { isValidTableConfig, isTableConfigV2 } from '@praxisui/core';
// Validar configuração
const config = { columns: [...] };
if (isValidTableConfig(config)) {
console.log('Configuração válida');
}
if (isTableConfigV2(config)) {
console.log('Configuração V2 detectada');
}
import { cloneTableConfig, mergeTableConfigs, getEssentialConfig } from "@praxisui/core";
// Clonar configuração
const clonedConfig = cloneTableConfig(originalConfig);
// Merge configurações
const mergedConfig = mergeTableConfigs(baseConfig, {
behavior: {
pagination: { pageSize: 25 },
},
});
// Extrair configurações essenciais
const essentialConfig = getEssentialConfig(fullConfig);
// Verificar se é configuração V2
function isTableConfigV2(config: any): config is TableConfig;
// Validar estrutura da configuração
function isValidTableConfig(config: any): config is TableConfig;
// Criar configuração padrão
function createDefaultTableConfig(): TableConfig;
// Clonar configuração profundamente
function cloneTableConfig(config: TableConfig): TableConfig;
// Merge duas configurações
function mergeTableConfigs(base: TableConfig, override: Partial<TableConfig>): TableConfig;
// Extrair configurações essenciais
function getEssentialConfig(config: TableConfig): Partial<TableConfig>;
import { TestBed } from "@angular/core/testing";
import { TableConfigService } from "@praxisui/core";
describe("TableConfigService", () => {
let service: TableConfigService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [TableConfigService],
});
service = TestBed.inject(TableConfigService);
});
it("should create", () => {
expect(service).toBeTruthy();
});
it("should set and get config", () => {
const config: TableConfig = {
columns: [{ field: "test", header: "Test" }],
};
service.setConfig(config);
expect(service.getCurrentConfig()).toEqual(config);
});
});
import { createDefaultTableConfig, isValidTableConfig, cloneTableConfig } from "@praxisui/core";
describe("Helper Functions", () => {
it("should create valid default config", () => {
const config = createDefaultTableConfig();
expect(isValidTableConfig(config)).toBe(true);
});
it("should clone config correctly", () => {
const original: TableConfig = {
columns: [{ field: "test", header: "Test" }],
behavior: { pagination: { enabled: true } },
};
const cloned = cloneTableConfig(original);
expect(cloned).toEqual(original);
expect(cloned).not.toBe(original); // Different reference
});
});
Interface Unificada:
// Antes
import { TableConfigV1, TableConfigV2, TableConfigUnified } from "@praxisui/core";
// Depois
import { TableConfig } from "@praxisui/core";
Serviços Simplificados:
// Antes
import { TableConfigAdapterService, TableConfigMigrationService } from "@praxisui/core";
// Depois
import { TableConfigService } from "@praxisui/core";
Type Guards Atualizados:
// Antes
isTableConfigV1(config) || isTableConfigV2(config);
// Depois
isTableConfigV2(config); // Sempre true para a nova arquitetura
// Problema: Type error em propriedades opcionais
// Solução: Usar optional chaining
const pageSize = config.behavior?.pagination?.pageSize ?? 10;
// Verificar se configuração é válida antes de usar
import { isValidTableConfig } from "@praxisui/core";
if (!isValidTableConfig(userConfig)) {
console.error("Configuração inválida:", userConfig);
userConfig = createDefaultTableConfig();
}
// Para grandes volumes de dados, usar configuração otimizada
const optimizedConfig: TableConfig = {
columns: [...],
performance: {
virtualization: {
enabled: true,
itemHeight: 48,
bufferSize: 20
}
}
};
// Interfaces
export interface TableConfig;
export interface ColumnDefinition;
export interface ConfigMetadata;
export interface TableBehaviorConfig;
export interface TableAppearanceConfig;
export interface ToolbarConfig;
export interface TableActionsConfig;
export interface ExportConfig;
export interface MessagesConfig;
export interface LocalizationConfig;
export interface PerformanceConfig;
export interface AccessibilityConfig;
// Serviços
export class TableConfigService;
// Helper Functions
export function createDefaultTableConfig(): TableConfig;
export function isValidTableConfig(config: any): config is TableConfig;
export function isTableConfigV2(config: any): config is TableConfig;
export function cloneTableConfig(config: TableConfig): TableConfig;
export function mergeTableConfigs(base: TableConfig, override: Partial<TableConfig>): TableConfig;
export function getEssentialConfig(config: TableConfig): Partial<TableConfig>;
// Type Aliases
export type TableConfig = TableConfigV2;
export type TableConfigModern = TableConfigV2;
// Legacy (Deprecated)
export type LegacyTableConfig = TableConfig;
export const DEFAULT_TABLE_CONFIG = createDefaultTableConfig();
git checkout -b feature/nova-interface)git commit -m 'Add: nova interface para X')git push origin feature/nova-interface)Apache-2.0 – veja o LICENSE empacotado com esta biblioteca ou o arquivo LICENSE na raiz do repositório.
Biblioteca Central do Praxis UI Workspace
Versão: 2.0.0 (Unified Architecture)
Compatibilidade: Angular 20.x | TypeScript 5.8+
FAQs
Core library for Praxis UI Workspace: types, tokens, services and utilities shared across @praxisui/* packages.
The npm package @praxisui/core receives a total of 724 weekly downloads. As such, @praxisui/core popularity was classified as not popular.
We found that @praxisui/core demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.