Materializr
오픈소스 파라메트릭 3D CAD로 제약 스케치·솔리드 모델·나사·SVG·텍스트 조각·STL/STEP 내보내기를 지원합니다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Angular Material v19 (M3) theme library. Provides brand colors, typography, shape, and elevation tokens — ready to apply to any Angular project. Add both font families to your index.html: Point the SCSS preprocessor to the library source so imports resolve correctly: Do the same under "test" if you run component tests with SCSS. That's it. The theme is now active. Pass a CSS selector to dark-theme-setup(). Toggle the class on from your app code. [README 설치·사용 부분 발췌] Usage example:README 전문 보기 ↗
Angular Material v20 (M3) theme library. Provides brand colors, typography, shape and elevation tokens, DS utility classes (status chips, alerts, condensed form field), a ThemeService for dark mode and Spanish i18n for Material components.
Package name: estela-angular · Monorepo: projects/estela (library) + projects/showcase (demo app).
@angular/core, @angular/common)@angular/material and @angular/cdk 20The library is distributed as the estela-angular npm package (built from dist/estela).
It can't be installed with npm install git+… because the repo root is the monorepo, not the library.
Option A — GitHub Release (recommended): each release attaches the tarball.
npm install https://github.com/dann-pixel/estela-ds/releases/download/v1.1.1/estela-angular-1.1.1.tgz
Option B — local tarball:
# In this repo: builds the lib and writes dist/estela-angular-<version>.tgz
npm run pack:lib
# In your project (or attach the .tgz to a GitHub Release and install from its URL)
npm install /path/to/estela-ds-angular/dist/estela-angular-1.1.1.tgz
Option C — private registry (GitHub Packages, Verdaccio, etc.): npm run build:lib, then cd dist/estela && npm publish.
index.html<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700&family=Instrument+Sans:wght@400;500;600&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,[email protected],100..700,0..1,-50..200" rel="stylesheet">
styles.scssNo includePaths needed — the package exposes its SCSS as estela-angular/theme.
Call the mixins at root level (not inside a selector):
@use 'estela-angular/theme' as estela;
// Light theme (required)
@include estela.light-theme-setup();
// Dark theme (optional) — active when <html> has .dark-theme
@include estela.dark-theme-setup();
// Base typography, Material Symbols axes, .form-field-sm, .status-chip, .estela-alert
@include estela.global-styles();
app.config.tsimport { provideEstela } from 'estela-angular';
import { provideEstelaIntl } from 'estela-angular/intl';
import { provideNativeDateAdapter } from '@angular/material/core';
export const appConfig: ApplicationConfig = {
providers: [
provideEstela(), // Material Symbols for <mat-icon>, MAT_DATE_LOCALE 'es-CL'
provideEstelaIntl(), // Paginator, Datepicker and Stepper texts in Spanish
provideNativeDateAdapter(), // only if you use mat-datepicker
],
};
provideEstela({ dateLocale, darkThemeClass, storageKey }) accepts overrides.estela-angular/intl is a separate entry point because it pulls Paginator, Datepicker and Stepper into the bundle where it's registered. If those components only live in lazy routes, register provideEstelaPaginatorIntl() / provideEstelaDatepickerIntl() / provideEstelaStepperIntl() in those components' providers instead.Date.parse (US order). If users type dates (dd/mm/yyyy), use a date-fns or Luxon adapter.import { ThemeService } from 'estela-angular';
readonly theme = inject(ThemeService);
theme.isDark(); // signal<boolean>
theme.toggle(); // toggles .dark-theme on <html> and persists in localStorage
theme.icon(); // 'dark_mode' | 'light_mode'
theme.tooltip(); // Spanish label for the toggle button
Initial value: localStorage['estela-theme'] → prefers-color-scheme → light.
If you pass a custom selector to dark-theme-setup('.my-dark'), also pass provideEstela({ darkThemeClass: 'my-dark' }).
| Token group | Value |
|---|---|
| Brand primary | #00b5cc (cyan). As text/icon on light surfaces: --estela-primary-on-surface (#006a92, AA) |
| Brand tertiary | #4255ff (indigo) |
| Neutrals | Blue Gray ramp (--mat-sys-surface*, --mat-sys-outline*, --mat-sys-background) |
| Border radius | 4px on all components. Switch, slider, badge and avatar stay circular |
| Elevation (level 1) | none — surfaces use border, not shadow |
| Elevation (level 2–5) | preserved — menus, dialogs, snackbars |
| Letter-spacing | 0 on all type roles |
M3 does not define warning, success or info roles. Estela exposes them as CSS custom properties (light + dark):
--estela-{warning|success|info}
--estela-{warning|success|info}-container
--estela-on-{warning|success|info}
--estela-on-{warning|success|info}-container
--estela-chip-{default|info|success|error|warning}-container
--estela-chip-on-{default|info|success|error|warning}-container
--estela-dark, --estela-on-dark, --estela-dark-container, --estela-on-dark-container
Error is handled natively by M3 via --mat-sys-error*.
global-styles())<!-- Status chip -->
<mat-chip class="status-chip status-completado" disableRipple>Completado</mat-chip>
<!-- status-no-iniciado | status-en-progreso | status-completado | status-cancelado | status-en-implementacion -->
<!-- Alert -->
<div class="estela-alert estela-alert--success">
<mat-icon>check_circle</mat-icon>
<div class="alert-body"><strong>Listo</strong><span>Los cambios se guardaron.</span></div>
</div>
<!-- --info | --success | --warning | --error -->
<!-- 40px form field, aligned with buttons (use placeholder, no mat-label) -->
<mat-form-field class="form-field-sm">
<input matInput placeholder="Buscar" />
</mat-form-field>
Each group can also be included separately: base-styles(), form-field-sm(), status-chips(), alerts().
| Mixin | Description |
|---|---|
light-theme-setup($selector: html, $primary?, $tertiary?, $density?) | Recommended. Full light theme |
dark-theme-setup($selector: '.dark-theme', $primary?, $tertiary?) | Recommended. Full dark theme (color only; typography/density are inherited from the light theme) |
global-styles() | All utility classes + base typography |
light-theme() / dark-theme() | Advanced: base M3 tokens only |
light-brand-overrides() / dark-brand-overrides() | Advanced: all Estela overrides. Required after light-theme() / dark-theme(), in a separate block |
@use 'estela-angular/theme' as estela;
// Block 1 — mat.theme() output
.my-shell { @include estela.light-theme(); }
// Block 2 — Estela overrides (must be a separate block, after block 1)
.my-shell { @include estela.light-brand-overrides(); }
Angular Material defers part of mat.theme()'s output until the selector closes; overrides in the same block would lose the cascade.
npm start # Showcase at http://localhost:4200 (uses the lib source directly)
npm run build # Library + showcase
npm run pack:lib # Library tarball in dist/
npm test # Library + showcase unit tests (ChromeHeadless)
On macOS without Chrome on the PATH: export CHROME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome".
Release:
version in projects/estela/package.json and ESTELA_VERSION in projects/estela/src/public-api.tsnpm run pack:libgh release create vX.Y.Z dist/estela-angular-X.Y.Z.tgz