Monorepo Angular 21 com biblioteca de componentes UI e utilitários.
| Pacote | Caminho | Descrição |
|---|---|---|
@shyland-dev/ui |
src/ui |
Biblioteca de componentes UI reutilizáveis |
@shyland-dev/utils |
src/utils |
Serviços e utilitários Angular |
npm ci # Instala as dependências e cria os symlinks de workspace
npm run build # Compila as libs para dist/Em desenvolvimento, as libs são resolvidas via
tsconfig.json— não é necessário fazer build antes de usar o showcase externo.
| Comando | Descrição |
|---|---|
npm run build |
Build de @shyland-dev/ui e @shyland-dev/utils |
npm run build:ui |
Build da biblioteca @shyland-dev/ui |
npm run build:utils |
Build da biblioteca @shyland-dev/utils |
npm run generate:icons |
Gera icons.ts a partir dos SVGs em src/ui/src/assets/svg/ |
| Componente | Selector | Descrição |
|---|---|---|
| Icon | <shy-icon> |
Ícones SVG inline com suporte a hover fill e tamanho customizável |
| Snackbar | <shy-snackbar> |
Notificação temporária no topo ou rodapé da página |
import { IconComponent } from '@shyland-dev/ui';O nome do ícone é passado como conteúdo da tag (content projection):
<!-- básico -->
<shy-icon>home</shy-icon>
<!-- com hover fill (troca para versão preenchida ao passar o mouse) -->
<shy-icon [hoverFill]="true">heart</shy-icon>
<!-- com delay na transição de hover (em ms) -->
<shy-icon [hoverFill]="true" [hoverFillDelay]="200">star</shy-icon>Customização via CSS:
shy-icon {
--shyIconSize: 2rem; /* tamanho (padrão: 1em) */
color: red; /* cor via currentColor */
}Ícones disponíveis (traçado e preenchido *-filled):
alert, bell, box, check, chevron-down, chevron-right, download, edit, eye, grid, heart, help, home, info, layers, lock, mail, menu, minus, palette, plus, search, settings, star, trash, type, upload, user, x, zap
Ícones com versão
-filled:alert,bell,box,grid,heart,help,home,info,lock,star
Para adicionar ícones, coloque o .svg em src/ui/src/assets/svg/ e execute:
npm run generate:iconsimport { SnackbarComponent, SnackbarService } from '@shyland-dev/ui';No template:
<!-- texto inline -->
<shy-snackbar #snackbar1>Copiado com sucesso!</shy-snackbar>
<!-- posição e delay configurados no template -->
<shy-snackbar #snackbar2 position="top" [dismissDelay]="5000"></shy-snackbar>No TypeScript:
constructor(private snackbarService: SnackbarService) {}
// exibe com texto inline e configurações do template
this.snackbarService.show({ element: this.snackbar1 });
// sobrescreve posição, delay e texto em runtime
this.snackbarService.show({
element: this.snackbar2,
position: 'top',
delay: 3000,
text: `Hoje é ${new Date().toLocaleDateString()}`,
});| Input | Tipo | Padrão | Descrição |
|---|---|---|---|
position |
'top' | 'bottom' |
'bottom' |
Posição da snackbar na tela |
dismissDelay |
number |
3000 |
Tempo em ms até fechar automaticamente (0 = manual) |
Customização via CSS:
shy-snackbar {
--shySnackbarBg: #{$success}; /* cor de fundo */
--shySnackbarColor: #{$white}; /* cor do texto e ícone */
--shySnackbarMinWidth: 250px; /* largura mínima */
--shySnackbarMaxWidth: 600px; /* largura máxima */
}| Export | Descrição |
|---|---|
DebugService |
Logs de componente com nome e método, ativos apenas em dev mode |
import { DebugService } from '@shyland-dev/utils';
constructor(private debugService: DebugService) {
this.debugService.log(this); // [debug] @MeuComponent#constructor
}
ngOnInit(): void {
this.debugService.log(this); // [debug] @MeuComponent#ngOnInit
}npm install @shyland-dev/ui @shyland-dev/utilsNo arquivo src/styles.scss da aplicação, importe os estilos base:
/* Sass variables, CSS custom properties (design tokens) e mixins */
@use '@shyland-dev/ui/styles' as *;
/* Reset global, estilos de scrollbar e height do app-root */
@use '@shyland-dev/ui/styles/base';Nenhuma configuração adicional no
angular.jsoné necessária. O Angular CLI (esbuild) resolve automaticamente os caminhos@shyland-dev/...vianode_modules.
Em qualquer arquivo SCSS de componente que precise das Sass variables ou mixins:
@use '@shyland-dev/ui/styles' as *;
.meu-elemento {
color: $primary;
@include fixedHeight(200px);
}Importe os componentes standalone diretamente nos imports do seu componente ou módulo:
import { IconComponent, SnackbarComponent, SnackbarService } from '@shyland-dev/ui';
@Component({
imports: [IconComponent, SnackbarComponent],
providers: [SnackbarService],
})
export class MeuComponent {}import { DebugService } from '@shyland-dev/utils';
@Component({ providers: [DebugService] })
export class MeuComponent {
constructor(private debug: DebugService) {
this.debug.log(this); // [debug] @MeuComponent#constructor
}
}Propriedades CSS definidas em src/lib/styles/_tokens.scss, incluídas automaticamente ao importar @shyland-dev/ui/styles ou @shyland-dev/ui/styles/base.
Cores:
--primary, --secondary, --tertiary, --success, --warning, --danger, --dark, --medium, --light, --black, --white
Layout:
--headerHeight, --footerHeight, --defaultContentHeight, --responsiveUnit, --scrollbarWidth
Sass variables (disponíveis ao @use '@shyland-dev/ui/styles' as *):
$primary, $secondary, $tertiary, $success, $warning, $danger, $dark, $medium, $light, $black, $white
npm/
├── src/
│ ├── ui/ # @shyland-dev/ui — componentes
│ │ └── src/
│ │ ├── assets/svg/ # Arquivos SVG fonte dos ícones
│ │ ├── lib/
│ │ │ ├── components/
│ │ │ │ ├── icon/ # IconComponent
│ │ │ │ └── snackbar/ # SnackbarComponent
│ │ │ ├── services/
│ │ │ │ └── snackbar.service.ts
│ │ │ └── styles/ # tokens, variables, mixins, base
│ │ └── public-api.ts
│ └── utils/ # @shyland-dev/utils — utilitários
│ └── src/
│ ├── lib/services/
│ │ └── debug.service.ts
│ └── public-api.ts
├── scripts/
│ └── generate-icons.mjs # Gera icons.ts a partir dos SVGs
└── angular.json