@m1z23r/ngx-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +446 -0
- package/fesm2022/m1z23r-ngx-ui.mjs +584 -0
- package/fesm2022/m1z23r-ngx-ui.mjs.map +1 -0
- package/package.json +53 -0
- package/src/lib/styles/_variables.scss +77 -0
- package/src/styles.scss +52 -0
- package/types/m1z23r-ngx-ui.d.ts +124 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"m1z23r-ngx-ui.mjs","sources":["../../../projects/ngx-ui/src/lib/services/sidebar.service.ts","../../../projects/ngx-ui/src/lib/components/button/button.component.ts","../../../projects/ngx-ui/src/lib/components/input/input.component.ts","../../../projects/ngx-ui/src/lib/components/table/table.component.ts","../../../projects/ngx-ui/src/lib/components/layout/shell/shell.component.ts","../../../projects/ngx-ui/src/lib/components/layout/navbar/navbar.component.ts","../../../projects/ngx-ui/src/lib/components/layout/sidebar/sidebar.component.ts","../../../projects/ngx-ui/src/lib/components/layout/content/content.component.ts","../../../projects/ngx-ui/src/lib/components/layout/footer/footer.component.ts","../../../projects/ngx-ui/src/lib/components/layout/sidebar-toggle/sidebar-toggle.component.ts","../../../projects/ngx-ui/src/public-api.ts","../../../projects/ngx-ui/src/m1z23r-ngx-ui.ts"],"sourcesContent":["import { Injectable, signal, computed, effect, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({ providedIn: 'root' })\nexport class SidebarService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly MOBILE_BREAKPOINT = 768;\n\n readonly collapsed = signal(false);\n readonly mobileOpen = signal(false);\n readonly isMobile = signal(false);\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.checkMobile();\n window.addEventListener('resize', () => this.checkMobile());\n }\n }\n\n private checkMobile(): void {\n const wasMobile = this.isMobile();\n const nowMobile = window.innerWidth < this.MOBILE_BREAKPOINT;\n this.isMobile.set(nowMobile);\n\n // Close mobile sidebar when switching to desktop\n if (wasMobile && !nowMobile) {\n this.mobileOpen.set(false);\n }\n }\n\n toggle(): void {\n if (this.isMobile()) {\n this.mobileOpen.update(v => !v);\n } else {\n this.collapsed.update(v => !v);\n }\n }\n\n expand(): void {\n this.collapsed.set(false);\n }\n\n collapse(): void {\n this.collapsed.set(true);\n }\n\n openMobile(): void {\n this.mobileOpen.set(true);\n }\n\n closeMobile(): void {\n this.mobileOpen.set(false);\n }\n}\n","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'ui-button',\n standalone: true,\n template: `\n <button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [class]=\"buttonClasses()\"\n (click)=\"handleClick($event)\"\n >\n @if (loading()) {\n <span class=\"ui-button__spinner\"></span>\n }\n <span class=\"ui-button__content\" [class.ui-button__content--hidden]=\"loading()\">\n <ng-content />\n </span>\n </button>\n `,\n styles: [`\n :host {\n display: inline-block;\n }\n\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ui-spacing-sm);\n font-family: inherit;\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all var(--ui-transition-fast);\n position: relative;\n }\n\n button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n\n button:focus-visible {\n outline: 2px solid var(--ui-primary);\n outline-offset: 2px;\n }\n\n /* Sizes */\n .ui-button--sm {\n padding: var(--ui-spacing-xs) var(--ui-spacing-sm);\n font-size: var(--ui-font-sm);\n border-radius: var(--ui-radius-sm);\n }\n\n .ui-button--md {\n padding: var(--ui-spacing-sm) var(--ui-spacing-md);\n font-size: var(--ui-font-md);\n border-radius: var(--ui-radius-md);\n }\n\n .ui-button--lg {\n padding: var(--ui-spacing-md) var(--ui-spacing-lg);\n font-size: var(--ui-font-lg);\n border-radius: var(--ui-radius-md);\n }\n\n /* Primary variant */\n .ui-button--primary {\n background-color: var(--ui-primary);\n color: var(--ui-primary-text);\n }\n\n .ui-button--primary:hover:not(:disabled) {\n background-color: var(--ui-primary-hover);\n }\n\n .ui-button--primary:active:not(:disabled) {\n background-color: var(--ui-primary-active);\n }\n\n /* Secondary variant */\n .ui-button--secondary {\n background-color: var(--ui-secondary);\n color: var(--ui-secondary-text);\n }\n\n .ui-button--secondary:hover:not(:disabled) {\n background-color: var(--ui-secondary-hover);\n }\n\n .ui-button--secondary:active:not(:disabled) {\n background-color: var(--ui-secondary-active);\n }\n\n /* Outline variant */\n .ui-button--outline {\n background-color: transparent;\n border-color: var(--ui-border);\n color: var(--ui-text);\n }\n\n .ui-button--outline:hover:not(:disabled) {\n background-color: var(--ui-bg-secondary);\n border-color: var(--ui-border-hover);\n }\n\n .ui-button--outline:active:not(:disabled) {\n background-color: var(--ui-bg-tertiary);\n }\n\n /* Ghost variant */\n .ui-button--ghost {\n background-color: transparent;\n color: var(--ui-text);\n }\n\n .ui-button--ghost:hover:not(:disabled) {\n background-color: var(--ui-bg-secondary);\n }\n\n .ui-button--ghost:active:not(:disabled) {\n background-color: var(--ui-bg-tertiary);\n }\n\n /* Loading spinner */\n .ui-button__spinner {\n position: absolute;\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spin 0.75s linear infinite;\n }\n\n .ui-button__content--hidden {\n visibility: hidden;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonComponent {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('md');\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n readonly disabled = input(false);\n readonly loading = input(false);\n\n readonly clicked = output<MouseEvent>();\n\n protected buttonClasses(): string {\n return `ui-button--${this.variant()} ui-button--${this.size()}`;\n }\n\n protected handleClick(event: MouseEvent): void {\n if (!this.disabled() && !this.loading()) {\n this.clicked.emit(event);\n }\n }\n}\n","import { Component, input, model, computed, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nexport type InputType = 'text' | 'password' | 'email' | 'number' | 'tel' | 'url';\n\n@Component({\n selector: 'ui-input',\n standalone: true,\n imports: [FormsModule],\n template: `\n <div class=\"ui-input-wrapper\" [class.ui-input-wrapper--error]=\"error()\" [class.ui-input-wrapper--disabled]=\"disabled()\">\n @if (label()) {\n <label class=\"ui-input__label\" [attr.for]=\"inputId()\">\n {{ label() }}\n @if (required()) {\n <span class=\"ui-input__required\">*</span>\n }\n </label>\n }\n <div class=\"ui-input__container\">\n <input\n class=\"ui-input\"\n [id]=\"inputId()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [(ngModel)]=\"value\"\n />\n </div>\n @if (error()) {\n <span class=\"ui-input__error\">{{ error() }}</span>\n }\n @if (hint() && !error()) {\n <span class=\"ui-input__hint\">{{ hint() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .ui-input-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--ui-spacing-xs);\n }\n\n .ui-input__label {\n font-size: var(--ui-font-sm);\n font-weight: 500;\n color: var(--ui-text);\n }\n\n .ui-input__required {\n color: var(--ui-danger);\n margin-left: 2px;\n }\n\n .ui-input__container {\n position: relative;\n }\n\n .ui-input {\n width: 100%;\n padding: var(--ui-spacing-sm) var(--ui-spacing-md);\n font-family: inherit;\n font-size: var(--ui-font-md);\n color: var(--ui-text);\n background-color: var(--ui-bg);\n border: 1px solid var(--ui-border);\n border-radius: var(--ui-radius-md);\n transition: border-color var(--ui-transition-fast), box-shadow var(--ui-transition-fast);\n\n &::placeholder {\n color: var(--ui-text-muted);\n }\n\n &:hover:not(:disabled):not(:read-only) {\n border-color: var(--ui-border-hover);\n }\n\n &:focus {\n outline: none;\n border-color: var(--ui-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--ui-primary) 20%, transparent);\n }\n\n &:disabled {\n background-color: var(--ui-bg-secondary);\n color: var(--ui-text-disabled);\n cursor: not-allowed;\n }\n\n &:read-only {\n background-color: var(--ui-bg-secondary);\n }\n }\n\n .ui-input-wrapper--error .ui-input {\n border-color: var(--ui-danger);\n\n &:focus {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--ui-danger) 20%, transparent);\n }\n }\n\n .ui-input__error {\n font-size: var(--ui-font-sm);\n color: var(--ui-danger);\n }\n\n .ui-input__hint {\n font-size: var(--ui-font-sm);\n color: var(--ui-text-muted);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputComponent {\n readonly type = input<InputType>('text');\n readonly label = input<string>('');\n readonly placeholder = input<string>('');\n readonly hint = input<string>('');\n readonly error = input<string>('');\n readonly disabled = input(false);\n readonly readonly = input(false);\n readonly required = input(false);\n readonly id = input<string>('');\n\n readonly value = model<string | number>('');\n\n private static nextId = 0;\n private readonly generatedId = `ui-input-${++InputComponent.nextId}`;\n\n protected readonly inputId = computed(() => this.id() || this.generatedId);\n}\n","import {\n Component,\n input,\n signal,\n computed,\n contentChildren,\n TemplateRef,\n ChangeDetectionStrategy,\n Directive,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nexport interface TableColumn<T = unknown> {\n key: keyof T | string;\n header: string;\n sortable?: boolean;\n width?: string;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\n@Directive({\n selector: '[uiCellTemplate]',\n standalone: true,\n})\nexport class CellTemplateDirective {\n readonly column = input.required<string>({ alias: 'uiCellTemplate' });\n\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n@Component({\n selector: 'ui-table',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"ui-table-container\">\n <table class=\"ui-table\">\n <thead>\n <tr>\n @for (col of columns(); track col.key) {\n <th\n [style.width]=\"col.width\"\n [class.ui-table__th--sortable]=\"col.sortable\"\n (click)=\"handleHeaderClick(col)\"\n >\n <span class=\"ui-table__th-content\">\n {{ col.header }}\n @if (col.sortable) {\n <span class=\"ui-table__sort-icon\">\n @if (sortState().column === col.key) {\n @if (sortState().direction === 'asc') {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7 14l5-5 5 5H7z\"/>\n </svg>\n } @else if (sortState().direction === 'desc') {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7 10l5 5 5-5H7z\"/>\n </svg>\n }\n } @else {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\" opacity=\"0.3\">\n <path d=\"M7 10l5-5 5 5H7zm0 4l5 5 5-5H7z\"/>\n </svg>\n }\n </span>\n }\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of sortedData(); track trackByFn()(row); let i = $index) {\n <tr>\n @for (col of columns(); track col.key) {\n <td>\n @if (getCellTemplate(getKeyAsString(col.key)); as template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: row, row: row, index: i, value: getValueInternal(row, getKeyAsString(col.key)) }\" />\n } @else {\n {{ getValueInternal(row, getKeyAsString(col.key)) }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"columns().length\" class=\"ui-table__empty\">\n <ng-content select=\"[slot=empty]\">No data available</ng-content>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .ui-table-container {\n overflow-x: auto;\n border: 1px solid var(--ui-border);\n border-radius: var(--ui-radius-md);\n }\n\n .ui-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--ui-font-sm);\n }\n\n thead {\n background-color: var(--ui-bg-secondary);\n }\n\n th {\n padding: var(--ui-spacing-sm) var(--ui-spacing-md);\n text-align: left;\n font-weight: 600;\n color: var(--ui-text);\n border-bottom: 1px solid var(--ui-border);\n white-space: nowrap;\n }\n\n .ui-table__th--sortable {\n cursor: pointer;\n user-select: none;\n }\n\n .ui-table__th--sortable:hover {\n background-color: var(--ui-bg-tertiary);\n }\n\n .ui-table__th-content {\n display: inline-flex;\n align-items: center;\n gap: var(--ui-spacing-xs);\n }\n\n .ui-table__sort-icon {\n display: inline-flex;\n align-items: center;\n }\n\n td {\n padding: var(--ui-spacing-sm) var(--ui-spacing-md);\n color: var(--ui-text);\n border-bottom: 1px solid var(--ui-border);\n }\n\n tbody tr:last-child td {\n border-bottom: none;\n }\n\n tbody tr:hover {\n background-color: var(--ui-bg-secondary);\n }\n\n .ui-table__empty {\n text-align: center;\n padding: var(--ui-spacing-xl);\n color: var(--ui-text-muted);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent<T extends object> {\n readonly data = input<T[]>([]);\n readonly columns = input<TableColumn<T>[]>([]);\n readonly trackByFn = input<(item: T) => unknown>((item: T) => item);\n\n readonly cellTemplates = contentChildren(CellTemplateDirective);\n\n readonly sortState = signal<SortState>({ column: null, direction: null });\n\n readonly sortedData = computed(() => {\n const items = this.data();\n const { column, direction } = this.sortState();\n\n if (!column || !direction) {\n return items;\n }\n\n return [...items].sort((a, b) => {\n const aVal = this.getValueInternal(a, column);\n const bVal = this.getValueInternal(b, column);\n\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return direction === 'asc' ? -1 : 1;\n if (bVal == null) return direction === 'asc' ? 1 : -1;\n\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n return direction === 'asc'\n ? aVal.localeCompare(bVal)\n : bVal.localeCompare(aVal);\n }\n\n if (aVal < bVal) return direction === 'asc' ? -1 : 1;\n if (aVal > bVal) return direction === 'asc' ? 1 : -1;\n return 0;\n });\n });\n\n protected handleHeaderClick(col: TableColumn<T>): void {\n if (col.sortable) {\n this.toggleSort(this.getKeyAsString(col.key));\n }\n }\n\n protected getKeyAsString(key: keyof T | string): string {\n return String(key);\n }\n\n toggleSort(column: string): void {\n this.sortState.update(state => {\n if (state.column !== column) {\n return { column, direction: 'asc' };\n }\n if (state.direction === 'asc') {\n return { column, direction: 'desc' };\n }\n return { column: null, direction: null };\n });\n }\n\n protected getValueInternal(row: T, key: string): unknown {\n const keys = key.split('.');\n let value: unknown = row;\n for (const k of keys) {\n if (value == null) return undefined;\n value = (value as Record<string, unknown>)[k];\n }\n return value;\n }\n\n protected getCellTemplate(column: string): TemplateRef<unknown> | null {\n const templates = this.cellTemplates();\n const directive = templates.find(t => t.column() === column);\n return directive?.templateRef ?? null;\n }\n}\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { SidebarService } from '../../../services/sidebar.service';\n\n@Component({\n selector: 'ui-shell',\n standalone: true,\n template: `\n <div class=\"ui-shell\"\n [class.ui-shell--sidebar-collapsed]=\"sidebarService.collapsed()\"\n [class.ui-shell--mobile]=\"sidebarService.isMobile()\"\n [class.ui-shell--mobile-open]=\"sidebarService.mobileOpen()\">\n <ng-content />\n @if (sidebarService.isMobile() && sidebarService.mobileOpen()) {\n <div class=\"ui-shell__backdrop\" (click)=\"sidebarService.closeMobile()\"></div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100vh;\n overflow: hidden;\n }\n\n .ui-shell {\n display: grid;\n grid-template-areas:\n \"sidebar navbar\"\n \"sidebar content\"\n \"sidebar footer\";\n grid-template-columns: var(--ui-sidebar-width) 1fr;\n grid-template-rows: var(--ui-navbar-height) 1fr auto;\n height: 100%;\n transition: grid-template-columns var(--ui-transition-normal);\n }\n\n .ui-shell--sidebar-collapsed {\n grid-template-columns: var(--ui-sidebar-collapsed-width) 1fr;\n }\n\n /* Mobile layout - sidebar is removed from grid flow */\n .ui-shell--mobile {\n grid-template-areas:\n \"navbar\"\n \"content\"\n \"footer\";\n grid-template-columns: 1fr;\n }\n\n .ui-shell__backdrop {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 40;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShellComponent {\n protected readonly sidebarService = inject(SidebarService);\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ui-navbar',\n standalone: true,\n template: `\n <header class=\"ui-navbar\">\n <div class=\"ui-navbar__start\">\n <ng-content select=\"[slot=start]\" />\n </div>\n <div class=\"ui-navbar__center\">\n <ng-content select=\"[slot=center]\" />\n </div>\n <div class=\"ui-navbar__end\">\n <ng-content select=\"[slot=end]\" />\n </div>\n <ng-content />\n </header>\n `,\n styles: [`\n :host {\n display: block;\n grid-area: navbar;\n }\n\n .ui-navbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--ui-navbar-height);\n padding: 0 var(--ui-spacing-md);\n background-color: var(--ui-bg);\n border-bottom: 1px solid var(--ui-border);\n }\n\n .ui-navbar__start,\n .ui-navbar__center,\n .ui-navbar__end {\n display: flex;\n align-items: center;\n gap: var(--ui-spacing-sm);\n }\n\n .ui-navbar__start {\n justify-content: flex-start;\n }\n\n .ui-navbar__center {\n flex: 1;\n justify-content: center;\n }\n\n .ui-navbar__end {\n justify-content: flex-end;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NavbarComponent {}\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { SidebarService } from '../../../services/sidebar.service';\n\n@Component({\n selector: 'ui-sidebar',\n standalone: true,\n template: `\n <aside class=\"ui-sidebar\"\n [class.ui-sidebar--collapsed]=\"sidebarService.collapsed()\"\n [class.ui-sidebar--mobile]=\"sidebarService.isMobile()\"\n [class.ui-sidebar--mobile-open]=\"sidebarService.mobileOpen()\">\n <div class=\"ui-sidebar__header\">\n <ng-content select=\"[slot=header]\" />\n </div>\n <nav class=\"ui-sidebar__nav\">\n <ng-content />\n </nav>\n <div class=\"ui-sidebar__footer\">\n <ng-content select=\"[slot=footer]\" />\n </div>\n </aside>\n `,\n styles: [`\n :host {\n display: block;\n grid-area: sidebar;\n }\n\n .ui-sidebar {\n display: flex;\n flex-direction: column;\n width: var(--ui-sidebar-width);\n height: 100%;\n background-color: var(--ui-bg);\n border-right: 1px solid var(--ui-border);\n transition: width var(--ui-transition-normal), transform var(--ui-transition-normal);\n overflow: hidden;\n }\n\n .ui-sidebar--collapsed {\n width: var(--ui-sidebar-collapsed-width);\n }\n\n .ui-sidebar__header {\n display: flex;\n align-items: center;\n height: var(--ui-navbar-height);\n padding: 0 var(--ui-spacing-md);\n border-bottom: 1px solid var(--ui-border);\n flex-shrink: 0;\n }\n\n .ui-sidebar__nav {\n flex: 1;\n padding: var(--ui-spacing-sm);\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .ui-sidebar__footer {\n padding: var(--ui-spacing-sm);\n border-top: 1px solid var(--ui-border);\n flex-shrink: 0;\n }\n\n /* Collapsed state padding */\n .ui-sidebar--collapsed .ui-sidebar__header,\n .ui-sidebar--collapsed .ui-sidebar__nav,\n .ui-sidebar--collapsed .ui-sidebar__footer {\n padding-inline: var(--ui-spacing-xs);\n }\n\n /* Mobile styles */\n .ui-sidebar--mobile {\n position: fixed;\n top: 0;\n left: 0;\n height: 100vh;\n z-index: 50;\n transform: translateX(-100%);\n box-shadow: var(--ui-shadow-lg);\n }\n\n .ui-sidebar--mobile.ui-sidebar--mobile-open {\n transform: translateX(0);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarComponent {\n protected readonly sidebarService = inject(SidebarService);\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ui-content',\n standalone: true,\n template: `\n <main class=\"ui-content\">\n <ng-content />\n </main>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n grid-area: content;\n min-height: 0;\n overflow: hidden;\n }\n\n .ui-content {\n flex: 1;\n padding: var(--ui-spacing-lg);\n background-color: var(--ui-bg-secondary);\n overflow-y: auto;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContentComponent {}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ui-footer',\n standalone: true,\n template: `\n <footer class=\"ui-footer\">\n <ng-content />\n </footer>\n `,\n styles: [`\n :host {\n display: block;\n grid-area: footer;\n }\n\n .ui-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: var(--ui-footer-height);\n padding: var(--ui-spacing-sm) var(--ui-spacing-md);\n background-color: var(--ui-bg);\n border-top: 1px solid var(--ui-border);\n color: var(--ui-text-muted);\n font-size: var(--ui-font-sm);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FooterComponent {}\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { SidebarService } from '../../../services/sidebar.service';\n\n@Component({\n selector: 'ui-sidebar-toggle',\n standalone: true,\n template: `\n <button class=\"ui-sidebar-toggle\"\n type=\"button\"\n [class.ui-sidebar-toggle--mobile-only]=\"mobileOnly()\"\n [attr.aria-expanded]=\"sidebarService.isMobile() ? sidebarService.mobileOpen() : !sidebarService.collapsed()\"\n aria-label=\"Toggle sidebar\"\n (click)=\"sidebarService.toggle()\">\n <svg class=\"ui-sidebar-toggle__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n </button>\n `,\n styles: [`\n .ui-sidebar-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--ui-radius-md);\n cursor: pointer;\n color: var(--ui-text);\n transition: background-color var(--ui-transition-fast);\n }\n\n .ui-sidebar-toggle:hover {\n background-color: var(--ui-bg-hover);\n }\n\n .ui-sidebar-toggle:focus-visible {\n outline: 2px solid var(--ui-primary);\n outline-offset: 2px;\n }\n\n .ui-sidebar-toggle__icon {\n width: 24px;\n height: 24px;\n }\n\n .ui-sidebar-toggle--mobile-only {\n display: none;\n }\n\n @media (max-width: 767px) {\n .ui-sidebar-toggle--mobile-only {\n display: inline-flex;\n }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarToggleComponent {\n protected readonly sidebarService = inject(SidebarService);\n readonly mobileOnly = input(true);\n}\n","/*\n * Public API Surface of @m1z23r/ngx-ui\n */\n\n// Services\nexport { SidebarService } from './lib/services/sidebar.service';\n\n// Components\nexport { ButtonComponent } from './lib/components/button/button.component';\nexport type { ButtonVariant, ButtonSize } from './lib/components/button/button.component';\n\nexport { InputComponent } from './lib/components/input/input.component';\nexport type { InputType } from './lib/components/input/input.component';\n\nexport { TableComponent, CellTemplateDirective } from './lib/components/table/table.component';\nexport type { TableColumn, SortDirection, SortState } from './lib/components/table/table.component';\n\n// Layout Components\nexport { ShellComponent } from './lib/components/layout/shell/shell.component';\nexport { NavbarComponent } from './lib/components/layout/navbar/navbar.component';\nexport { SidebarComponent } from './lib/components/layout/sidebar/sidebar.component';\nexport { ContentComponent } from './lib/components/layout/content/content.component';\nexport { FooterComponent } from './lib/components/layout/footer/footer.component';\nexport { SidebarToggleComponent } from './lib/components/layout/sidebar-toggle/sidebar-toggle.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@m1z23r/ngx-ui",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A modern Angular UI component library with themeable components and responsive layout system",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "m1z23r",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/m1z23r/ngx-ui.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/m1z23r/ngx-ui/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/m1z23r/ngx-ui#readme",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"angular",
|
|
17
|
+
"ui",
|
|
18
|
+
"components",
|
|
19
|
+
"library",
|
|
20
|
+
"button",
|
|
21
|
+
"input",
|
|
22
|
+
"table",
|
|
23
|
+
"layout",
|
|
24
|
+
"sidebar",
|
|
25
|
+
"navbar",
|
|
26
|
+
"angular21",
|
|
27
|
+
"standalone",
|
|
28
|
+
"signals"
|
|
29
|
+
],
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@angular/common": "^21.0.0",
|
|
32
|
+
"@angular/core": "^21.0.0",
|
|
33
|
+
"@angular/forms": "^21.0.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"tslib": "^2.3.0"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": [
|
|
39
|
+
"*.scss",
|
|
40
|
+
"*.css"
|
|
41
|
+
],
|
|
42
|
+
"module": "fesm2022/m1z23r-ngx-ui.mjs",
|
|
43
|
+
"typings": "types/m1z23r-ngx-ui.d.ts",
|
|
44
|
+
"exports": {
|
|
45
|
+
"./package.json": {
|
|
46
|
+
"default": "./package.json"
|
|
47
|
+
},
|
|
48
|
+
".": {
|
|
49
|
+
"types": "./types/m1z23r-ngx-ui.d.ts",
|
|
50
|
+
"default": "./fesm2022/m1z23r-ngx-ui.mjs"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Theme CSS Custom Properties
|
|
2
|
+
:root {
|
|
3
|
+
// Primary colors
|
|
4
|
+
--ui-primary: #3b82f6;
|
|
5
|
+
--ui-primary-hover: #2563eb;
|
|
6
|
+
--ui-primary-active: #1d4ed8;
|
|
7
|
+
--ui-primary-text: #ffffff;
|
|
8
|
+
|
|
9
|
+
// Secondary colors
|
|
10
|
+
--ui-secondary: #64748b;
|
|
11
|
+
--ui-secondary-hover: #475569;
|
|
12
|
+
--ui-secondary-active: #334155;
|
|
13
|
+
--ui-secondary-text: #ffffff;
|
|
14
|
+
|
|
15
|
+
// Semantic colors
|
|
16
|
+
--ui-success: #22c55e;
|
|
17
|
+
--ui-success-hover: #16a34a;
|
|
18
|
+
--ui-danger: #ef4444;
|
|
19
|
+
--ui-danger-hover: #dc2626;
|
|
20
|
+
--ui-warning: #f59e0b;
|
|
21
|
+
--ui-warning-hover: #d97706;
|
|
22
|
+
|
|
23
|
+
// Background colors
|
|
24
|
+
--ui-bg: #ffffff;
|
|
25
|
+
--ui-bg-secondary: #f8fafc;
|
|
26
|
+
--ui-bg-tertiary: #f1f5f9;
|
|
27
|
+
--ui-bg-hover: rgba(0, 0, 0, 0.05);
|
|
28
|
+
|
|
29
|
+
// Text colors
|
|
30
|
+
--ui-text: #1e293b;
|
|
31
|
+
--ui-text-muted: #64748b;
|
|
32
|
+
--ui-text-disabled: #94a3b8;
|
|
33
|
+
|
|
34
|
+
// Border colors
|
|
35
|
+
--ui-border: #e2e8f0;
|
|
36
|
+
--ui-border-hover: #cbd5e1;
|
|
37
|
+
--ui-border-focus: var(--ui-primary);
|
|
38
|
+
|
|
39
|
+
// Border radius
|
|
40
|
+
--ui-radius-sm: 0.25rem;
|
|
41
|
+
--ui-radius-md: 0.375rem;
|
|
42
|
+
--ui-radius-lg: 0.5rem;
|
|
43
|
+
--ui-radius-xl: 0.75rem;
|
|
44
|
+
|
|
45
|
+
// Spacing
|
|
46
|
+
--ui-spacing-xs: 0.25rem;
|
|
47
|
+
--ui-spacing-sm: 0.5rem;
|
|
48
|
+
--ui-spacing-md: 1rem;
|
|
49
|
+
--ui-spacing-lg: 1.5rem;
|
|
50
|
+
--ui-spacing-xl: 2rem;
|
|
51
|
+
|
|
52
|
+
// Layout dimensions
|
|
53
|
+
--ui-sidebar-width: 16rem;
|
|
54
|
+
--ui-sidebar-collapsed-width: 4rem;
|
|
55
|
+
--ui-navbar-height: 4rem;
|
|
56
|
+
--ui-footer-height: 3rem;
|
|
57
|
+
|
|
58
|
+
// Breakpoints
|
|
59
|
+
--ui-breakpoint-mobile: 768px;
|
|
60
|
+
|
|
61
|
+
// Shadows
|
|
62
|
+
--ui-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
63
|
+
--ui-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
64
|
+
--ui-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
65
|
+
|
|
66
|
+
// Transitions
|
|
67
|
+
--ui-transition-fast: 150ms ease;
|
|
68
|
+
--ui-transition-normal: 200ms ease;
|
|
69
|
+
--ui-transition-slow: 300ms ease;
|
|
70
|
+
|
|
71
|
+
// Font sizes
|
|
72
|
+
--ui-font-xs: 0.75rem;
|
|
73
|
+
--ui-font-sm: 0.875rem;
|
|
74
|
+
--ui-font-md: 1rem;
|
|
75
|
+
--ui-font-lg: 1.125rem;
|
|
76
|
+
--ui-font-xl: 1.25rem;
|
|
77
|
+
}
|
package/src/styles.scss
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Main entry point for @m1z23r/ngx-ui styles
|
|
2
|
+
@use 'lib/styles/variables';
|
|
3
|
+
|
|
4
|
+
// Reset and base styles
|
|
5
|
+
*,
|
|
6
|
+
*::before,
|
|
7
|
+
*::after {
|
|
8
|
+
box-sizing: border-box;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Custom scrollbar styling
|
|
12
|
+
.ui-scrollbar,
|
|
13
|
+
.ui-content,
|
|
14
|
+
.ui-sidebar__nav {
|
|
15
|
+
// Firefox
|
|
16
|
+
scrollbar-width: thin;
|
|
17
|
+
scrollbar-color: var(--ui-border-hover) transparent;
|
|
18
|
+
|
|
19
|
+
// WebKit (Chrome, Safari, Edge)
|
|
20
|
+
&::-webkit-scrollbar {
|
|
21
|
+
width: 8px;
|
|
22
|
+
height: 8px;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&::-webkit-scrollbar-track {
|
|
26
|
+
background: transparent;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&::-webkit-scrollbar-thumb {
|
|
30
|
+
background-color: var(--ui-border);
|
|
31
|
+
border-radius: 4px;
|
|
32
|
+
border: 2px solid transparent;
|
|
33
|
+
background-clip: padding-box;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&::-webkit-scrollbar-thumb:hover {
|
|
37
|
+
background-color: var(--ui-border-hover);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Utility classes
|
|
42
|
+
.ui-visually-hidden {
|
|
43
|
+
position: absolute;
|
|
44
|
+
width: 1px;
|
|
45
|
+
height: 1px;
|
|
46
|
+
padding: 0;
|
|
47
|
+
margin: -1px;
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
clip: rect(0, 0, 0, 0);
|
|
50
|
+
white-space: nowrap;
|
|
51
|
+
border: 0;
|
|
52
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
declare class SidebarService {
|
|
5
|
+
private readonly platformId;
|
|
6
|
+
private readonly MOBILE_BREAKPOINT;
|
|
7
|
+
readonly collapsed: _angular_core.WritableSignal<boolean>;
|
|
8
|
+
readonly mobileOpen: _angular_core.WritableSignal<boolean>;
|
|
9
|
+
readonly isMobile: _angular_core.WritableSignal<boolean>;
|
|
10
|
+
constructor();
|
|
11
|
+
private checkMobile;
|
|
12
|
+
toggle(): void;
|
|
13
|
+
expand(): void;
|
|
14
|
+
collapse(): void;
|
|
15
|
+
openMobile(): void;
|
|
16
|
+
closeMobile(): void;
|
|
17
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarService, never>;
|
|
18
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<SidebarService>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost';
|
|
22
|
+
type ButtonSize = 'sm' | 'md' | 'lg';
|
|
23
|
+
declare class ButtonComponent {
|
|
24
|
+
readonly variant: _angular_core.InputSignal<ButtonVariant>;
|
|
25
|
+
readonly size: _angular_core.InputSignal<ButtonSize>;
|
|
26
|
+
readonly type: _angular_core.InputSignal<"reset" | "submit" | "button">;
|
|
27
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
28
|
+
readonly loading: _angular_core.InputSignal<boolean>;
|
|
29
|
+
readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
|
|
30
|
+
protected buttonClasses(): string;
|
|
31
|
+
protected handleClick(event: MouseEvent): void;
|
|
32
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
|
|
33
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "ui-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type InputType = 'text' | 'password' | 'email' | 'number' | 'tel' | 'url';
|
|
37
|
+
declare class InputComponent {
|
|
38
|
+
readonly type: _angular_core.InputSignal<InputType>;
|
|
39
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
40
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
41
|
+
readonly hint: _angular_core.InputSignal<string>;
|
|
42
|
+
readonly error: _angular_core.InputSignal<string>;
|
|
43
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
44
|
+
readonly readonly: _angular_core.InputSignal<boolean>;
|
|
45
|
+
readonly required: _angular_core.InputSignal<boolean>;
|
|
46
|
+
readonly id: _angular_core.InputSignal<string>;
|
|
47
|
+
readonly value: _angular_core.ModelSignal<string | number>;
|
|
48
|
+
private static nextId;
|
|
49
|
+
private readonly generatedId;
|
|
50
|
+
protected readonly inputId: _angular_core.Signal<string>;
|
|
51
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
|
|
52
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "ui-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface TableColumn<T = unknown> {
|
|
56
|
+
key: keyof T | string;
|
|
57
|
+
header: string;
|
|
58
|
+
sortable?: boolean;
|
|
59
|
+
width?: string;
|
|
60
|
+
}
|
|
61
|
+
type SortDirection = 'asc' | 'desc' | null;
|
|
62
|
+
interface SortState {
|
|
63
|
+
column: string | null;
|
|
64
|
+
direction: SortDirection;
|
|
65
|
+
}
|
|
66
|
+
declare class CellTemplateDirective {
|
|
67
|
+
templateRef: TemplateRef<unknown>;
|
|
68
|
+
readonly column: _angular_core.InputSignal<string>;
|
|
69
|
+
constructor(templateRef: TemplateRef<unknown>);
|
|
70
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CellTemplateDirective, never>;
|
|
71
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CellTemplateDirective, "[uiCellTemplate]", never, { "column": { "alias": "uiCellTemplate"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
72
|
+
}
|
|
73
|
+
declare class TableComponent<T extends object> {
|
|
74
|
+
readonly data: _angular_core.InputSignal<T[]>;
|
|
75
|
+
readonly columns: _angular_core.InputSignal<TableColumn<T>[]>;
|
|
76
|
+
readonly trackByFn: _angular_core.InputSignal<(item: T) => unknown>;
|
|
77
|
+
readonly cellTemplates: _angular_core.Signal<readonly CellTemplateDirective[]>;
|
|
78
|
+
readonly sortState: _angular_core.WritableSignal<SortState>;
|
|
79
|
+
readonly sortedData: _angular_core.Signal<T[]>;
|
|
80
|
+
protected handleHeaderClick(col: TableColumn<T>): void;
|
|
81
|
+
protected getKeyAsString(key: keyof T | string): string;
|
|
82
|
+
toggleSort(column: string): void;
|
|
83
|
+
protected getValueInternal(row: T, key: string): unknown;
|
|
84
|
+
protected getCellTemplate(column: string): TemplateRef<unknown> | null;
|
|
85
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableComponent<any>, never>;
|
|
86
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableComponent<any>, "ui-table", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "trackByFn": { "alias": "trackByFn"; "required": false; "isSignal": true; }; }, {}, ["cellTemplates"], ["[slot=empty]"], true, never>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
declare class ShellComponent {
|
|
90
|
+
protected readonly sidebarService: SidebarService;
|
|
91
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShellComponent, never>;
|
|
92
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShellComponent, "ui-shell", never, {}, {}, never, ["*"], true, never>;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
declare class NavbarComponent {
|
|
96
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavbarComponent, never>;
|
|
97
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NavbarComponent, "ui-navbar", never, {}, {}, never, ["[slot=start]", "[slot=center]", "[slot=end]", "*"], true, never>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
declare class SidebarComponent {
|
|
101
|
+
protected readonly sidebarService: SidebarService;
|
|
102
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarComponent, never>;
|
|
103
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidebarComponent, "ui-sidebar", never, {}, {}, never, ["[slot=header]", "*", "[slot=footer]"], true, never>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
declare class ContentComponent {
|
|
107
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentComponent, never>;
|
|
108
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentComponent, "ui-content", never, {}, {}, never, ["*"], true, never>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
declare class FooterComponent {
|
|
112
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FooterComponent, never>;
|
|
113
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FooterComponent, "ui-footer", never, {}, {}, never, ["*"], true, never>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
declare class SidebarToggleComponent {
|
|
117
|
+
protected readonly sidebarService: SidebarService;
|
|
118
|
+
readonly mobileOnly: _angular_core.InputSignal<boolean>;
|
|
119
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarToggleComponent, never>;
|
|
120
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidebarToggleComponent, "ui-sidebar-toggle", never, { "mobileOnly": { "alias": "mobileOnly"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export { ButtonComponent, CellTemplateDirective, ContentComponent, FooterComponent, InputComponent, NavbarComponent, ShellComponent, SidebarComponent, SidebarService, SidebarToggleComponent, TableComponent };
|
|
124
|
+
export type { ButtonSize, ButtonVariant, InputType, SortDirection, SortState, TableColumn };
|