Component Catalog

August 20, 2026 · View on GitHub

Auto-generated component reference for the base-theme Angular library. All components, directives, pipes, and services are standalone by default.


Styling & Customization Rules

Read these before composing components into pages — they prevent the most common integration mistakes.

Utility-class conflicts with component base classes

Button directives (base-button, base-stroked-button, base-icon-button, base-icon-stroked-button) apply their own base classes through a host [class] binding, including relative (position) and rounded-lg. Angular merges your static class attribute with the directive's host classes, so both end up on the element — and the winner of a conflict is decided by the order of the utilities inside the generated Tailwind stylesheet, not by their order in the class attribute. In practice the base classes win, so this silently fails:

<!-- WRONG: stays `relative` and `rounded-lg` -->
<button base-icon-button color="white" class="absolute right-3 top-3 rounded-full">…</button>

Use Tailwind v4's important suffix (utility!) whenever you override position, radius, or any other utility the component already sets:

<!-- RIGHT: anchored white circle, e.g. a wishlist button floating on a product image -->
<button base-icon-button color="white" class="absolute! right-3 top-3 rounded-full! shadow-md">…</button>

The same rule applies to any component whose host binding sets layout utilities (position, radius, width/height, display): when an override "doesn't apply", inspect the element for a conflicting base class first — don't debug your own CSS.

Icons: line vs. filled

<base-icon> renders symbols from assets/icons.svg. The outline symbols hard-code fill="none", which always beats an inherited CSS fill — a fill-* class can never fill a line icon. For solid glyphs (active wishlist heart, rating stars) use the filled input, which switches to assets/icons-filled.svg whose symbols use fill="currentColor", and color them with text-* classes:

<base-icon name="heart" [filled]="wishlisted()" class="text-red-500"></base-icon>

base-drawer requires an animations provider

The drawer animates with @angular/animations triggers. Without a provider, opening it throws NG05105: Unexpected synthetic property @slideLeft. Register provideAnimationsAsync() in app.config.ts.

Closing popovers and drawers on navigation

Overlays do not close themselves when the user clicks a link inside them:

  • base-popover exposes a public close() method — capture the component as a template ref and call it from panel links:

    <base-popover #menu>
    
      <a routerLink="…" (click)="menu.close()">Link</a>
    </base-popover>
    
  • base-drawer is closed by emitting its closed output (the trigger directive subscribes to it and detaches the overlay):

    <base-drawer #drawer>
    
      <a routerLink="…" (click)="drawer.closed.emit()">Link</a>
    </base-drawer>
    

Layout Components

BaseLayoutHeroFeaturesComponent

Selector: base-layout-hero-features Standalone: true

A complete marketing landing page layout: sticky header with anchor navigation and scroll shadow, hero with tilt-on-scroll product mockup, animated stats strip, logo cloud, features grid with scroll reveal, testimonials carousel, pricing with monthly/yearly toggle, install snippet tabs, roadmap timeline, FAQ accordion, CTA band and footer with newsletter signup. Renders a full page out of the box from demo defaults; sections whose array input is empty are omitted. Includes a built-in theme toggle (ThemeService) and a focus-trapped mobile drawer navigation.

Inputs:

NameTypeDefaultDescription
brandNamestring'Acme'Brand name shown in header, footer and copy.
badgeTextstring'New — v2.0 is out'Announcement badge above the hero title.
heroTitlestring'Build your next product,'First line of the hero title.
heroHighlightstring'faster than ever'Colored second line of the hero title.
heroSubtitlestring(demo copy)Hero subtitle paragraph.
primaryCtaTextstring'Get Started for Free'Primary hero CTA label.
secondaryCtaTextstring'View Demo'Secondary hero button label.
finePrintstring(demo copy)Fine print under the hero buttons.
showThemeTogglebooleantrueShows the light/dark toggle in the header.
navLinksHeroFeaturesNavLink[]Features/Testimonials/Pricing/FAQAnchor links to section ids.
statsHeroFeaturesStat[]4 demo statsAnimated counters strip. Empty hides section.
logosHeroFeaturesLogo[]6 demo brands"Trusted by" logo cloud. Empty hides section.
featuresHeroFeaturesFeature[]6 demo cardsFeatures grid. Empty hides section.
testimonialsHeroFeaturesTestimonial[]5 demo quotesTestimonials carousel. Empty hides section.
plansHeroFeaturesPlan[]3 demo tiersPricing tiers. Empty hides section.
installTabsHeroFeaturesInstallTab[]npm/yarn/pnpmInstall command tabs. Empty hides section.
usageSnippetstring(demo snippet)TypeScript usage snippet under the install tabs. Empty string hides it.
roadmapHeroFeaturesRoadmapItem[]4 demo itemsRoadmap timeline. Empty hides section.
faqsHeroFeaturesFaq[]5 demo entriesFAQ accordion. Empty hides section.

Outputs:

NamePayloadDescription
primaryCtaClickvoidPrimary CTA clicked (hero, header, drawer or CTA band).
secondaryCtaClickvoidSecondary hero button clicked (e.g. open a demo dialog).
signInClickvoid"Sign in" clicked.
planSelectedHeroFeaturesPlanA pricing plan CTA clicked.
newsletterSubmitstringNewsletter form submitted, payload is the email.
navClickedstringNavigation link clicked, payload is the section id.

Content projection:

  • [hero-media] — replaces the default browser mockup in the hero.
  • [header-actions] — extra elements in the header action area.

Exported interfaces: HeroFeaturesNavLink, HeroFeaturesStat, HeroFeaturesFeature, HeroFeaturesLogo, HeroFeaturesTestimonial, HeroFeaturesPlan, HeroFeaturesFaq, HeroFeaturesInstallTab, HeroFeaturesRoadmapItem.


HeroDemoDialogComponent

Selector: base-hero-demo-dialog Standalone: true

Product-demo dialog opened by BaseLayoutHeroFeaturesComponent's "View Demo" secondary CTA (secondaryCtaClick). Shows a gradient video-placeholder panel with a play button and a caption, plus a footer with "Close" and "Get Started" buttons that both close the dialog via base-dialog-close. Has no inputs or outputs; all content is static demo copy.


PageMainComponent

Selector: base-page-main Standalone: true

The primary layout wrapper for a main page view. Sets up a full-width/height flex column container. Free shell (npx base-ui-cli add page-main).

No inputs or outputs. Use with <base-page-main-header>, <base-page-main-body>, <base-page-main-footer>.


PageMainHeaderComponent

Selector: base-page-main-header Standalone: true

A header section for base-page-main.

No inputs or outputs.


PageMainBodyComponent

Selector: base-page-main-body Standalone: true

A body content section for base-page-main.

No inputs or outputs.


PageMainFooterComponent

Selector: base-page-main-footer Standalone: true

A footer section for base-page-main.

No inputs or outputs.


CardComponent

Selector: base-card Standalone: true

A flexible card container component used for grouping related content.

Inputs:

NameTypeDefaultDescription
horizontalbooleanfalseIf true, the card lays out its children horizontally instead of vertically.

CardHeaderComponent

Selector: base-card-header Standalone: true

The header section of a base-card. Usually contains the title and optional actions.

No inputs or outputs.


CardBodyComponent

Selector: base-card-body Standalone: true

The main content container of a base-card. Provides correct padding and spacing.

No inputs or outputs.


CardFooterComponent

Selector: base-card-footer Standalone: true

The footer section of a base-card. Usually contains action buttons (Save, Cancel, etc).

No inputs or outputs.


AccordionComponent

Selector: base-accordion Standalone: true

A container component for accordion items. Allows users to toggle sections of content.

Inputs:

NameTypeDefaultDescription
multibooleanfalseWhether multiple accordion items can be open simultaneously.

AccordionItemComponent

Selector: base-accordion-item Standalone: true

A single item within a base-accordion containing a header and body.

Inputs:

NameTypeDefaultDescription
isOpenbooleanfalseWhether the accordion item is expanded.
disabledbooleanfalsePrevents toggling of the item.

Outputs:

NameEmit TypeDescription
toggledbooleanEmitted when the item is opened or closed.

AccordionItemHeaderComponent

Selector: base-accordion-item-header Standalone: true

The clickable header of an accordion item that toggles the body visibility.

No inputs or outputs.


AccordionItemBodyComponent

Selector: base-accordion-item-body Standalone: true

The body content of an accordion item.

No inputs or outputs.


TabsComponent

Selector: base-tabs Standalone: true

A container component for rendering tabbed navigation and content. Manages active states, handles tab switching, and provides scrollable tabs if they overflow horizontally.

Inputs:

NameTypeDefaultDescription
defaultTabnumber0The zero-based index of the tab to open by default.
type'pills' | 'underline' | 'default' | stringThe visual style type of the tabs.
position'top' | 'left' | 'right' | 'bottom' | stringThe positioning of the tab list relative to the content.
iconstringA global icon to apply if applicable.
scrollRestrictedbooleanfalseIf true, restricts automatic scrolling behavior on the tab list.

Outputs:

NameEmit TypeDescription
tabChangedSubject<TabComponent>Emitted whenever the active tab changes.

TabComponent

Selector: base-tab Standalone: true

The wrapper element for a single tab in a base-tabs group.

Inputs:

NameTypeDefaultDescription
labelstring''A simple string label for the tab. If complex HTML is needed, project a base-tab-label inside instead.
isActivebooleanfalseTracks whether this tab is currently selected.
tabClassstring'cursor-pointer'Additional CSS classes to apply to the tab trigger.

TabLabelComponent

Selector: base-tab-label Standalone: true

A custom label for a base-tab. Allows you to add rich content (icons, badges, etc.) as the tab label.

No inputs or outputs.


TabBodyComponent

Selector: base-tab-body Standalone: true

The actual content wrapper for a base-tab. Content inside this tag is only rendered/visible when the parent tab is active.

No inputs or outputs.


DividerComponent

Selector: base-divider Standalone: true

A layout component used to separate content visually. Can be rendered horizontally (default) or vertically.

Inputs:

NameTypeDefaultDescription
verticalbooleanfalseIf true, renders the divider vertically instead of horizontally.


BaseLayoutAdminDataTableComponent

Selector: base-layout-admin-data-table Standalone: true

Full-page admin CRUD layout (pro tier) rendering a self-contained "Team Members" management screen backed by 24 seeded demo UserRecord rows: a debounce-free search box, status/role select filters, sortable column headers (asc → desc → unsorted cycle), page-size-8 pagination, and multi-row checkbox selection with a bulk-action bar (activate, deactivate, export selected, delete). Rows open a right-side base-drawer with a read-only detail view and a reactive-forms create/edit mode (simulated 500ms save); deletes go through a confirm dialog via injected DialogService, mutations surface injected ToastService toasts, and Export downloads a CSV of the selected (or all filtered) rows. Shows skeleton rows during a simulated 700ms initial load and a base-empty-state when filters match nothing; sortable headers and rows are keyboard-operable (Enter/Space) with aria-sort and per-row aria-labels, and an effect clamps the current page when mutations shrink the record set. Has no inputs or outputs — all state is internal signals; also exports the UserRecord interface and RecordStatus/RecordRole union types.

BaseAdminDataTableConfirmDialogComponent

Selector: base-admin-data-table-confirm-dialog Standalone: true

Confirmation dialog used by the admin data table for single and bulk deletes, opened via DialogService.open with a ConfirmDialogData payload (title, message, confirmLabel, optional danger flag that switches the confirm button from primary to danger color). Receives its data through an injected DialogContext<ConfirmDialogData, boolean> and closes with true on confirm; Cancel and the close icon dismiss via base-dialog-close. In ngAfterViewInit it upgrades the ancestor dialog container's role to alertdialog and wires aria-labelledby/aria-describedby to the rendered title and message. Has no inputs or outputs; the ConfirmDialogData interface is exported from this file.


BaseLayoutBentoGridComponent

Selector: base-layout-bento-grid Standalone: true

Self-contained full-page marketing/dashboard layout (pro tier) for a fictional "Arc" platform: sticky navbar, hero section, an interactive bento grid, a CTA band, and a footer. The grid's seven cards (performance stats, code-deploy terminal, activity bar chart, integrations, security, changelog, global regions map) are drag-reorderable via CDK DragDrop handles, with a "Reset Layout" button restoring the default order and a comfortable/compact density toggle that switches gap and padding classes. All state is signal-based with OnPush change detection; a skeleton placeholder grid is shown for the first 700ms via a constructor setTimeout. Injects ToastService to confirm integration connect/disconnect toggles, clipboard copies of the code snippet (navigator.clipboard), and layout resets; the changelog card expands/collapses between 3 and all 6 entries, and activity bars show tooltips via base-tooltip. Has no inputs or outputs; host is styled with a static w-full h-full overflow-y-scroll block class (no class input / cn() merge).


BaseLayoutBlogSidebarComponent

Selector: base-layout-blog-sidebar Standalone: true

Full-page blog article layout with a sticky navbar, article body, and a sticky right sidebar (table of contents, tags, newsletter signup, related posts) — all content is hardcoded demo data. The host element scrolls (overflow-y-scroll) and listens to its own scroll events to drive a reading-progress bar in the navbar and toggle a floating "back to top" button; an IntersectionObserver keeps the active table-of-contents entry highlighted as sections scroll into view, and TOC clicks smooth-scroll to the target section. Below the xl breakpoint the sidebar is hidden and a collapsible mobile TOC is shown instead; injects ToastService for copy-link and newsletter-subscribe feedback (with basic email validation). Uses OnPush change detection with signal-based state.


BaseLayoutDashboardComponent

Selector: base-layout-dashboard Standalone: true

Full-page admin dashboard layout (pro tier) with a responsive dark sidebar (fixed slide-in on mobile, icon-only mini rail on lg, full labels on xl), a sticky header (breadcrumb, order search, theme toggle, notifications popover, profile dropdown menu), and six switchable views driven by internal signals: an Overview view (stat cards, CSS bar chart with monthly/yearly toggle, top-products list, and a recent-orders table that opens a right-side order-details drawer and a per-row actions dropdown), an Analytics view (animated KPI counters plus sortable/pageable data tables in pill tabs), and empty-state placeholders for Projects/Team/Messages/Settings. Includes a Cmd/Ctrl+K command palette (document-level keydown listener) for navigation and actions, and a simulated 900ms loading state rendered with skeletons. All content is hardcoded demo data — the component takes no inputs and emits no outputs; it injects ThemeService (dark-mode toggle) and ToastService (feedback for demo actions like export, refund, refresh), and uses OnPush change detection with a static host class w-full h-full overflow-y-scroll block.


BaseLayoutDocsKbComponent

Selector: base-layout-docs-kb Standalone: true

Full-page documentation / knowledge-base layout template (pro tier) with a sticky header, a left base-tree navigation sidebar, a center content column of documentation sections with base-code snippets, and a right "On this page" TOC that scrollspies the reader's position via an IntersectionObserver rooted on the scrollable host. Opens a base-command-palette on Cmd+K / Ctrl+K (palette commands scroll to sections, toggle the theme via the injected ThemeService, or copy the page URL to the clipboard with a ToastService confirmation); a back-to-top button appears after the host scrolls past 400px. On smaller viewports the nav tree and TOC collapse into fixed overlay drawers that use cdkTrapFocus cdkTrapFocusAutoCapture, close on Escape or backdrop click, and restore focus to their toggle buttons. Uses OnPush change detection with all mutable state held in signals; has no inputs or outputs — all content and navigation data is defined internally.


BaseLayoutEcommerceGridComponent

Selector: base-layout-ecommerce-grid Standalone: true

Full-page e-commerce storefront layout (pro tier) with a sticky navbar (cart/wishlist count badges), breadcrumb + sort/view-mode toolbar, a filter sidebar (categories, price-range checkboxes, color swatches, star ratings — rendered as a desktop column and a mobile slide-in panel), a paginated product grid/list with active-filter chips, a 300ms loading skeleton, an empty state, cart and wishlist base-drawer panels (with a free-shipping progress bar at a $75 threshold), and a footer. Entirely self-contained: it renders a hardcoded demo Product[] and manages all filter/sort/cart/wishlist state internally with signals and computed values (OnPush, zoneless-safe) — it has no inputs or outputs. Injects DialogService to open BaseProductQuickViewComponent for product quick view and ToastService for add-to-cart/wishlist notifications; also exports the Product and CartItem interfaces. Host class: w-full h-full overflow-y-scroll block.

BaseProductQuickViewComponent

Selector: base-product-quick-view-dialog Standalone: true

Product quick-view dialog body built from the base-dialog sub-components (header with close icon-button, body, footer). It is opened via DialogService.open() and receives its Product through the injected DialogContext rather than an input; it renders the badge/discount, star rating, price with strikethrough original price, color, and stock status, and closes the dialog with result 'add-to-cart' or 'wishlist' (the Add to Cart button is disabled when the product is out of stock). No inputs or outputs.


BaseLayoutInboxMessagingComponent

Selector: base-layout-inbox-messaging Standalone: true

A three-pane inbox / support-ticket messaging layout: a searchable, status-filterable conversation list (All / Unread / Open / Closed), a message thread with an @-mention reply composer (auto-growing textarea, Enter sends, Shift+Enter for a newline, Enter is ignored while the mention dropdown is open) plus multi-file attachments, and a collapsible contact/ticket detail panel showing tags, participants, and all thread attachments. Fully self-contained demo component with no inputs or outputs — conversation data is seeded internally in signals, and actions (select, send, mark unread, archive) mutate that local state; on small screens it switches between list/thread/detail as single mobile panes, list rows are keyboard-activatable (Enter/Space), and the thread uses role="log" with aria-live="polite". Empty states render via base-empty-state when no conversations match the search/filter or no conversation is selected; exports the InboxConversation, InboxMessage, InboxAttachment, TicketStatus, and InboxConversationFilter types.


BaseLayoutSchedulerComponent

Selector: base-layout-scheduler Standalone: true

Full-page scheduler / full-calendar application layout (pro tier): month, week, and day views with seeded demo events, Work/Personal/Team calendar filters, search, a mini base-calendar sidebar, create/edit/delete via BaseSchedulerEventFormDialogComponent + DialogService, toasts via ToastService, and CDK drag-and-drop to reschedule events across days (time preserved). Install: npx base-ui-cli add layout-scheduler.


BaseSchedulerEventFormDialogComponent

Selector: base-scheduler-event-form-dialog Standalone: true

Create/edit dialog for scheduler events. Opened via DialogService.open with SchedulerEventFormData; closes with SchedulerEventFormResult (or delete: true when editing). Reactive form fields: title, description, start/end (datetime-local), calendar, color, all-day.


BaseLayoutFileManagerComponent

Selector: base-layout-file-manager Standalone: true

Full-page file manager application layout (pro tier): base-tree folder sidebar, path breadcrumbs, grid/list views, search + starred filter, base-file-upload dropzone, item actions (open/rename/star/download/delete) via dropdown menus, rename via BaseFileManagerRenameDialogComponent, and file preview in a right base-drawer. Install: npx base-ui-cli add layout-file-manager.


BaseFileManagerRenameDialogComponent

Selector: base-file-manager-rename-dialog Standalone: true

Rename dialog for file manager items. Opened via DialogService.open with FileManagerRenameData (name, kind); closes with FileManagerRenameResult.


BaseLayoutKanbanBoardComponent

Selector: base-layout-kanban-board Standalone: true

Full-page kanban board demo layout (pro tier) with hardcoded sample data: a sticky app-shell top bar (project selector, task search, member avatar stack, notification button, New Task button), a filter toolbar, and horizontally scrollable columns of task cards. Cards are draggable within and across columns via @angular/cdk/drag-drop (cdkDropList/cdkDrag); state lives in internal signals (columns, searchQuery, activePriorities) with OnPush change detection, and a skeleton loading state is shown for 700ms on init. Injects DialogService to open BaseTaskDetailDialogComponent (card click; supports delete) and BaseTaskFormDialogComponent (New Task / per-column Add task), and ToastService for success toasts on task create/delete. Search filters by task title, the filter menu toggles per-priority chips (removable in the toolbar), filtered-out cards are hidden with a "No matching tasks" empty state per column, and an inline Add Column form supports Enter to confirm and Escape to cancel. Has no inputs or outputs — the component is self-contained demo content; the file also exports the Priority, Task, and Column types. Host classes are static (w-full h-full overflow-y-scroll block), with no class input override.

BaseTaskDetailDialogComponent

Selector: base-task-detail-dialog Standalone: true

Read-only task detail dialog for the kanban board, designed to be opened via DialogService.open() with a Task as dialog data (injects DialogContext<Task, TaskDetailResult>) rather than placed in templates — it has no inputs or outputs. Renders the task's tags, priority badge, title, description, and a metadata grid (assignee, due date, comments, attachments) inside base-dialog chrome. The Delete Task button closes the dialog with { action: 'delete' } (TaskDetailResult); the header X and Close buttons dismiss via base-dialog-close without a result.

BaseTaskFormDialogComponent

Selector: base-task-form-dialog

Standalone: true

New-task creation dialog for the kanban board, opened via DialogService.open() with TaskFormData (members list, column list, default column id) as dialog data — injects DialogContext<TaskFormData, TaskFormResult> and has no inputs or outputs. Hosts a reactive FormGroup with fields for title (required), description, column (required, defaults to defaultColumnId), priority (required, defaults to 'medium'), assignee (required, defaults to the first member), due date, and optional tag label, built from base-input-group/base-select library controls. Submitting an invalid form calls markAllAsTouched() and shows the title error; a valid submit closes the dialog with the form value as TaskFormResult.


BaseLayoutMagazineGridComponent

Selector: base-layout-magazine-grid Standalone: true

Full-page magazine/blog landing layout ("Meridian") with a sticky blurred navbar, mobile slide-in category menu, featured hero article (with expandable "reader mode" excerpt), secondary article stack, numbered Editor's Picks strip, a Latest Stories grid with 2-column/3-column/list view toggle, skeleton loading state (simulated 900ms delay), and "Load more" pagination (4 articles per page). A desktop-only sidebar provides trending-tag filtering, a newsletter signup with regex email validation, and social links; a category nav, tag toggle, and text search combine into filters with a sticky active-filter chip bar and empty states when nothing matches. Injects ToastService for feedback on bookmarking (per-article reading list held in an internal Set signal), opening articles, and newsletter subscription. All article data is hardcoded demo content and all state is internal signals — the component has no inputs or outputs; the host is styled w-full h-full overflow-y-scroll block and uses OnPush change detection.


BaseLayoutOnboardingFlowComponent

Selector: base-onboarding-flow-layout Standalone: true

Full-page four-step signup/onboarding layout (Account, Verify, Workspace, Invite) built on BaseStepper/BaseStep with hidden built-in navigation and its own Back/Next/Submit controls; step progression is gated per step (account created, OTP verified, workspace form valid) and clicking the stepper only allows jumping back to completed steps. Includes a reactive account form with password-match validation, show/hide password toggles and a base-password-strength meter, a 6-digit base-otp-input verification step with a 30-second resend cooldown timer (cleared in ngOnDestroy), workspace industry/team-size selects, and chip-based teammate invites (validated, deduplicated, max 5). Injects ToastService for feedback; account creation, OTP verification, and finalization are simulated with setTimeout, ending in a finalizing spinner and a welcome screen whose button routes to /layouts/dashboard via RouterLink. All internal state is signal-based (OnPush change detection); the component exposes no inputs or outputs.


BaseLayoutPortfolioGalleryComponent

Selector: base-layout-portfolio-gallery Standalone: true

Full-page portfolio/agency layout ("Aria Studio") with sticky navbar, mobile slide-in menu, hero with featured project card, stats strip, services grid, filterable masonry project gallery, testimonials, process steps, gradient CTA, and footer. All content (projects, stats, clients, services, testimonials, process steps) is hard-coded demo data; the gallery supports category filter tabs with counts, an empty state when a filter has no matches, and incremental "load more" pagination (6 projects initially, +3 per click) driven by signals/computed with OnPush change detection. Injects DialogService to open BaseProjectCaseStudyComponent (per-project case study) and BaseContactDialogComponent (contact form, showing a success toast on submit), and ToastService for demo "visit live site"/client-click actions; in-page navigation uses smooth scrollIntoView. Host is styled w-full h-full overflow-y-scroll block. No inputs or outputs.

BaseProjectCaseStudyComponent

Selector: base-project-case-study-dialog Standalone: true

Case-study dialog (width 640) for a single Project, opened via DialogService — reads the project from an injected DialogContext<Project> rather than inputs. Renders a gradient banner with the project icon, category badge and year, plus title, client, description, and tag pills; the footer offers a Close button (base-dialog-close) and a "Visit Live Site" button that shows an info toast via ToastService (demo action). No inputs or outputs.

BaseContactDialogComponent

Selector: base-portfolio-contact-dialog Standalone: true

Contact-form dialog (width 480) opened via DialogService. Contains a reactive FormGroup with name (required), email (required + email), project type select (defaults to 'Branding'), and message (required, min length 10), showing inline validation errors once fields are touched. On valid submit it closes the dialog through the injected DialogContext, resolving with a ContactFormResult; if invalid it marks all controls touched instead. No inputs or outputs.


BaseLayoutPricingComponent

Selector: base-layout-pricing-page Standalone: true

Full-page pricing layout (pro tier): sticky navbar, hero with a monthly/annual billing toggle and a team-size base-input-spinner (1–500 seats), three hardcoded plan cards (Starter/Professional/Enterprise), a trusted-by logo strip, a feature comparison table, an FAQ accordion, a gradient CTA band, and a footer. Prices react to billing cycle and seat count via signals (billingCycle, seatCount); annual view shows a "Save N%" line and multi-seat totals. Injects DialogService and ToastService: every plan CTA opens BasePlanSignupDialogComponent (mode 'contact' when the plan's cta is "Contact Sales", otherwise 'trial') and shows a success toast when the dialog returns a PlanSignupResult. Simulates loading with skeleton cards for 700ms after construction. All plan/comparison/FAQ content is internal — the component has no inputs or outputs; host is a full-size scrollable block.

BasePlanSignupDialogComponent

Selector: base-plan-signup-dialog Standalone: true

Dialog content component intended to be opened through DialogService.open() rather than placed in templates — it injects DialogContext<PlanSignupData, PlanSignupResult> for its data (planName plus mode 'trial' | 'contact', which switches the heading, intro copy, and submit label). Renders a reactive form (name required, email required + valid format, company optional) inside a 440px base-dialog with close/cancel buttons; submit() marks all fields touched when invalid, otherwise closes the dialog with the form value as PlanSignupResult (name, email, company). Has no inputs or outputs.


BaseLayoutSettingsAccountComponent

Selector: base-layout-settings-account Standalone: true

Full-page account settings layout with a desktop sidebar (avatar/user header, "Back to Dashboard" routerLink to /layouts/dashboard) and a sticky mobile tab bar, switching between five tabs — Profile, Billing, Notifications, and Team delegate to base-form-profile-settings, base-form-billing, base-form-notifications, and base-form-team-invite, while the Security tab is built inline: a change-password reactive form (required current password, min-length-8 new password, cross-field passwords-match validator, per-field show/hide toggles, base-password-strength meter, aria-invalid/aria-describedby error wiring), a two-factor base-toggle, an active-sessions list with per-session and "Sign out all others" actions, and a base-form-delete-account danger zone. Injects FormBuilder and ToastService (success/info toasts on password save, 2FA toggle, and session sign-out) and uses OnPush change detection with signal-based state. All data is hard-coded demo content (user "Sarah Mitchell", three sessions); on init it renders base-skeleton placeholders for ~700ms before showing content, and the simulated password save resets the form after ~800ms. Has no inputs or outputs.


BaseLayoutSplitScreenComponent

Selector: base-layout-split-screen Standalone: true

Full-page SaaS marketing landing layout (fictional "Pulse" product) built from alternating 50/50 split sections: sticky navbar, hero split with a simulated dashboard card (Deployments/Analytics/Logs tabs driven by a signal), "trusted by" logo strip, terminal-simulation feature split with numbered steps, 6-card features grid, testimonial split with a carousel (auto-advances every 5s via setInterval, cleared in ngOnDestroy; prev/next/dot controls), gradient CTA band, and footer. Shows a skeleton placeholder for ~700ms on init before revealing content, and the host element is a full-size scroll container (w-full h-full overflow-y-scroll block). Injects DialogService to open the demo and signup dialogs and ToastService to show a success toast with the submitted name/email after signup; a "Features" nav button smooth-scrolls to the features section. No inputs or outputs — all content is hardcoded demo data.

BaseSplitScreenDemoDialogComponent

Selector: base-split-screen-demo-dialog

Static 640px-wide dialog opened from the landing page's "Watch Demo" buttons. Renders a gradient video-placeholder panel with a decorative play button and duration label, a short description paragraph, and a footer whose Close and "Get Started Free" buttons both close the dialog via base-dialog-close. No inputs, outputs, or logic.

BaseSplitScreenSignupDialogComponent

Selector: base-split-screen-signup-dialog

420px-wide signup dialog with a reactive form (name required, email required + email-validated, company optional) rendered with base-input-group fields and inline error messages shown once a control is touched. Injects DialogContext<unknown, SignupResult>; on submit, an invalid form is marked all-touched, while a valid form closes the dialog with a SignupResult ({ name, email, company }) that the opener receives. Cancel and the header close button dismiss without a result. No inputs or outputs.

Data Display

AvatarComponent

Selector: base-avatar Standalone: true

A highly customizable avatar component for displaying user profile images or initials. Includes support for presence indicators (active/inactive) and various shapes/sizes.

Inputs:

NameTypeDefaultDescription
avatarUrlstring''The URL of the image to display. Falls back to initials or a placeholder icon.
shape'circle' | 'square''square'The geometric shape of the avatar.
status'active' | 'inactive'Optional presence status to display an indicator dot (e.g. green for active).
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full''md'The size of the avatar.
initialsstring''Text initials to display if no avatarUrl is provided.

BadgeComponent

Selector: base-badge Standalone: true

A configurable badge component to display tiny statuses, counts, or tags.

Inputs:

NameTypeDefaultDescription
color'primary' | 'danger' | 'success' | 'accent' | 'warning' | 'slate-light' | 'primary-light' | 'danger-light' | 'success-light' | 'accent-light' | 'warning-light''primary'The visual color mapping.
size'sm' | 'md' | 'lg' | 'xl''md'The size of the badge.
shape'rectangular' | 'circle''circle'The shape (roundness) of the badge.

KbdComponent

Selector: base-kbd Standalone: true

Inline keyboard glyph for shortcuts in copy, menus, and docs. Renders a native <kbd> so assistive tech treats it as a key.

Inputs:

NameTypeDefaultDescription
classstring''Extra Tailwind classes merged onto the inner <kbd> via cn().

AspectRatioComponent

Selector: base-aspect-ratio Standalone: true

Box that preserves a width-to-height ratio via CSS aspect-ratio. Project media or any block inside; the inner slot is stretched to fill the box.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
ratiostring'16/9'CSS aspect-ratio value (16/9, 1, 4/3, …).

ScrollAreaComponent

Selector: base-scroll-area Standalone: true

Overflow container with a thin, theme-aware scrollbar. Give it an explicit height (for example class="h-64") so the inner content can scroll.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn(). Include a height so overflow can scroll.

TreeComponent

Selector: base-tree Standalone: true

A hierarchical tree view component for displaying nested data structures. Supports expanding/collapsing folders and node selection. Pro tier.

Inputs:

NameTypeDefaultDescription
nodes{ label: string; icon?: string; children?: TreeNode[]; expanded?: boolean; selected?: boolean; data?: Record<string, unknown> }[][]The hierarchical array of nodes to render.

Outputs:

NameEmit TypeDescription
nodeClick{ label: string; icon?: string; children?: TreeNode[]; expanded?: boolean; selected?: boolean; data?: Record<string, unknown> }Emitted when a user clicks on a node's label/body.
nodeExpand{ label: string; icon?: string; children?: TreeNode[]; expanded?: boolean; selected?: boolean; data?: Record<string, unknown> }Emitted when a folder node is expanded.
nodeCollapse{ label: string; icon?: string; children?: TreeNode[]; expanded?: boolean; selected?: boolean; data?: Record<string, unknown> }Emitted when a folder node is collapsed.

SelectTreeComponent

Selector: base-select-tree Standalone: true

Pro single-select dropdown that presents options as an expandable tree (combobox trigger + fixed panel). Supports label search (auto-expands ancestors of matches), leaf-only selection, clearable reset to null, disabled nodes, and keyboard navigation. Implements ControlValueAccessor — the form value is the selected node’s value.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host via cn().
nodesSelectTreeNode[][]Hierarchical options (label, value, optional children / icon / expanded / disabled / data).
placeholderstring'Select…'Shown when nothing is selected; also used as the trigger aria-label.
onlyLeafbooleanfalseWhen true, only nodes without children can be selected (folders still expand/collapse).
clearablebooleanfalseShows a clear control that writes null.
disabledbooleanfalse(two-way) Disables the control; also set by forms via setDisabledState.

Outputs:

NamePayloadDescription
selectionChangeunknown | nullEmitted whenever the selected value changes (including clear).

CalendarComponent

Selector: base-calendar Standalone: true

A date picker calendar component that supports single date and date-range selection. Free tier. (base-datepicker and base-date-range-picker remain Pro.) Month view, day grid, and keyboard focus are signals (viewDate, days, focusedDate) so the grid stays current under OnPush / zoneless. The grid is a keyboard-operable date grid: arrows move by day/week, Home/End jump to month start/end, PageUp/PageDown change month, Enter/Space select.

Inputs:

NameTypeDefaultDescription
mode'single' | 'range''single'The selection mode. 'single' allows picking one day, 'range' allows picking start and end dates.
selectedDateDate | nullnullThe currently selected date (only used in 'single' mode).
rangeStartDate | nullnullThe start date of the selected range (only used in 'range' mode).
rangeEndDate | nullnullThe end date of the selected range (only used in 'range' mode).

Outputs:

NameEmit TypeDescription
dateSelectedDateEmits the selected Date when mode is 'single' and a day is clicked.
rangeSelected{ start: Date | null; end: Date | null }Emits an object containing start and end Dates when mode is 'range'.


AnimatedCounterComponent

Selector: base-animated-counter Standalone: true

Free tier. Animates a number from a start value to the target the first time the host element enters the viewport (IntersectionObserver, threshold 0.2). The count runs on requestAnimationFrame outside the Angular zone with a cubic ease-out curve, re-entering the zone to update a displayed signal rendered in a tabular-nums span; formatting supports fixed decimals, a thousands separator, and prefix/suffix strings. On the server (non-browser platform) it skips animation and renders the final formatted value immediately; on any input change it resets the display to the formatted from value. Host classes are merged via cn() with a base inline-block class.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's inline-block class via cn().
valuenumber0Target number to count up to.
fromnumber0Starting number the animation begins from.
durationnumber1500Animation duration in milliseconds.
decimalsnumber0Number of decimal places shown in the formatted output.
prefixstring''String prepended to the formatted number (e.g. $).
suffixstring''String appended to the formatted number (e.g. %).
separatorstring','Thousands separator; pass an empty string to disable grouping.

AvatarGroupComponent

Selector: base-avatar-group Standalone: true

Displays a stack of overlapping circular avatars with an overflow count badge. Renders at most max items; the remainder collapses into a "+N" bubble. Each avatar shows its image when avatarUrl is set, otherwise falls back to initials, then the uppercased first letter of name, then "?". Avatars overlap tightly at rest and spread apart on hover of the group (animated margin transition). Uses OnPush change detection with signal inputs; host classes are merged with the class input via cn().

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's base classes (flex items-center group) via cn().
itemsAvatarGroupItem[][]Avatar entries (avatarUrl/initials/name) to render. Empty array renders nothing.
maxnumber4Maximum avatars shown before the rest collapse into a "+N" counter bubble.
sizeAvatarSize'md'Avatar size (xsxl or full); controls width/height and text size. Unknown values fall back to md.

CountdownComponent

Selector: base-countdown Standalone: true

Countdown timer that renders a horizontal row (flex gap-2 host) of boxed digit tiles — days, hours, minutes, seconds — each with a label underneath. Remaining time is computed once for SSR/prerender HTML; the 1s client ticker starts in afterNextRender (gated on a clientReady signal) so it survives hydration on static hosts where ngOnInit does not re-run. Ticks toward targetDate (clamped at zero, values zero-padded, state held in signals for zoneless CD); the timer restarts whenever targetDate changes and the interval is cleared on finish and on destroy. Also exports the CountdownTime interface (days, hours, minutes, seconds, total ms).

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes, merged with the base flex gap-2 via cn().
targetDateDate | stringrequiredDate/time to count down to; changing it restarts the timer.
showDaysbooleantrueWhether to render the days tile (booleanAttribute transform).
daysLabelstring'Days'Label under the days tile.
hoursLabelstring'Hours'Label under the hours tile.
minutesLabelstring'Min'Label under the minutes tile.
secondsLabelstring'Sec'Label under the seconds tile.

Outputs:

NamePayloadDescription
tickCountdownTimeEmitted every second (and immediately on start) with the remaining time breakdown.
finishedvoidEmitted once when the countdown reaches zero; the interval then stops.

DataTableComponent

Selector: base-data-table Standalone: true

Pro tier. Install: npx base-ui-cli add data-table. Feature-rich table (generic over row type T extends DataTableRow) that renders cells as raw row[column.key] values from TableColumn[] — no custom cell templates. Client-side sort/page by default; set serverSide to skip client sort/slice (parent fetches the current page into data and the full count into totalItems). Sortable headers (requires both the sortable input and column.sortable) cycle asc → desc → unsorted, reset to page 1, set aria-sort, and support Enter/Space. Pagination is a windowed paginator (max 5 page buttons) when pageable is true. selectable adds a checkbox column bound to selected (identity via rowKey, default 'id'). resizable lets users drag header edges (column.width start width, column.minWidth, per-column resizable: false to lock). virtualize windows rows in a fixed-height viewport (viewportHeight, rowHeight) — best with pageable off and large data. loading shows skeleton rows (capped at 5); empty pages show emptyMessage. Checkbox clicks do not emit rowClick. OnPush; host class block merged with class via cn(). Cookbook: /cookbooks/invoice-table/.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's block class via cn().
columnsTableColumn[][]Column definitions (key, label, optional sortable / width / minWidth / resizable / align).
dataT[][]Row objects. When serverSide is set, pass the current page only.
sortablebooleanfalseEnables header click sorting for columns with sortable: true. Accepts attribute shorthand via booleanAttribute.
pageablebooleanfalseShows the paginator when the row count exceeds pageSize (or when serverSide + totalItems require it).
pageSizenumber10Rows per page (client slice, or the page size advertised to the server).
loadingbooleanfalseShows pulsing skeleton rows instead of data.
stripedbooleanfalseTints odd rows with a subtle background.
borderedbooleanfalseAdds outer table border and per-row bottom borders.
hoverablebooleantrueApplies a hover background to body rows.
emptyMessagestring'No data available'Text shown when data is empty and not loading.
selectablebooleanfalseAdds a checkbox column. Bind selected to an array of rowKey values.
rowKeystring'id'Property used as the selection identity.
selectedArray<string | number>[]Selected row ids (or whatever rowKey points at). Two-way (model).
resizablebooleanfalseDrag the header edge to resize columns. Uses column.width as the start width.
serverSidebooleanfalseSkip client sort/slice. Parent fetches; pass the current page in data and the full count in totalItems.
totalItemsnumber0Total rows across all pages. Required for the paginator when serverSide is set.
virtualizebooleanfalseWindow rows in a fixed-height viewport. Best with pageable off and large data.
rowHeightnumber44Fixed row height in pixels used for windowing. Must match the rendered row.
viewportHeightnumber400Viewport height in pixels when virtualize is set.
currentPagenumber1Current page (1-based). Two-way (model) for server-driven tables.

Outputs:

NamePayloadDescription
rowClickTEmitted with the row object when a body row is clicked. Checkbox clicks do not fire this.
sortChangeDataTableSortChange ({ key: string; direction: TableSortDirection })Emitted after each sort toggle; key is '' and direction is '' when sorting is cleared (third click).
pageChangeDataTablePageChange ({ page: number; pageSize: number })Emitted when the paginator changes page. Always fired in serverSide mode.
selectionChangeT[]Emitted with the selected row objects whenever the checkbox column changes.

SkeletonComponent

Selector: base-skeleton Standalone: true

Loading-placeholder skeleton that renders count pulsing gray blocks (animate-pulse, light/dark aware) in the chosen variant. text, circular, and rectangular render simple blocks sized via the width/height inputs (circular defaults to 40px × 40px); card renders a composite card layout (avatar circle, title/subtitle bars, three text lines) and table-row renders avatar + text + trailing-cell rows, both repeated count times. Uses OnPush change detection and signal inputs; the host gets block merged with the class input via cn().

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host element's class list via cn() (aliased to internal extraClass).
variantSkeletonVariant'text'Skeleton shape: 'text' | 'circular' | 'rectangular' | 'card' | 'table-row'.
countnumber1Number of skeleton items to repeat.
widthstring | undefinedInline CSS width applied to simple variants (text/circular/rectangular); ignored by card and table-row layouts.
heightstring | undefinedInline CSS height applied to simple variants; ignored by card and table-row layouts.
animatedbooleantrueToggles the animate-pulse shimmer animation (accepts boolean attribute via booleanAttribute transform).

StatCardComponent

Selector: base-stat-card Standalone: true

Dashboard metric card with two layouts. Classic (default): large value over a label, optional tinted icon bubble on the left, and an optional trend row (green arrow-up or red arrow-down with preformatted trend text) plus a muted caption. Metric (variant="metric"): Motif Admin–style vertical KPI — uppercase micro-label, delta pill from a ratio (delta), large value, inline SVG sparkline from series (no Pro base-chart dependency), and footer caption. Host classes merge via cn() (block for classic; bordered flex column with hover for metric). OnPush with signal inputs. Exports StatCardVariant ('classic' | 'metric').

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host classes via cn().
variantStatCardVariant'classic'classic = icon-left tile; metric = delta pill + sparkline stack.
valuestring''The large metric value (e.g. "$48,295").
labelstring''Label above the value (classic) or uppercase header (metric).
trendstring | undefinedClassic: preformatted trend text (e.g. "+12.5%"); omitting it hides the trend row.
trendUpboolean | undefinedClassic: true = green up arrow, false = red down arrow.
iconstring | undefinedClassic: optional icon name in a tinted bubble.
colorStatCardColor'primary'Classic: tint for the icon bubble and stroke.
captionstring | undefinedClassic: beside trend when set. Metric: under sparkline when non-empty.
deltanumber | undefinedMetric: period change as a ratio (0.062 → "+6.2%"); drives the pill and sparkline color.
seriesreadonly number[][]Metric: sparkline values; empty hides the chart.

TimelineComponent

Selector: base-timeline Standalone: true

Vertical timeline container (flex flex-col host) that projects base-timeline-item children via ng-content. OnPush change detection.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host classes via cn().

TimelineItemComponent

Selector: base-timeline-item Standalone: true

A single event within a base-timeline: a colored dot (optionally containing a sprite icon) with a connecting line to the next item, an optional timestamp label, and projected content. OnPush change detection.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host classes via cn().
colorTimelineColor'primary'Dot color (primary/success/danger/warning/accent/default).
iconstring | undefinedOptional icon name from the sprite displayed inside the dot.
timestring | undefinedOptional timestamp label shown above the content.
lastbooleanfalseSet on the final item to hide the connecting line (booleanAttribute — bare attribute works).

Form Controls

CustomSelectComponent

Selector: base-custom-select Standalone: true

A highly customizable dropdown select component. Allows mapping arrays of objects to display labels and selection values.

Inputs:

NameTypeDefaultDescription
labelstring''Optional label text displayed above the select field.
placeholderstring'Select an option'Text shown when no option is selected.
optionsunknown[][]The array of items to show in the dropdown.
displayKeystring'label'The object property key to display as the label.
valueKeystring'value'The object property key to use as the emitted value.
disabledbooleanfalseDisables the dropdown from opening.
multiplebooleanfalse(Experimental) Set to true to allow multiple selection.

Outputs:

NameEmit TypeDescription
selectionChangeunknownEmits the selected value whenever the user clicks an option.

ComboboxComponent

Selector: base-combobox Standalone: true

Searchable single-select with keyboard navigation, optional create, local or async filtering, and Angular Forms (string | null). The results panel is a CDK overlay attached to the viewport (not position: absolute inside the field), aligned to the trigger’s start edge, so it is not clipped by a parent overflow: hidden. Use filterMode="none" with (queryChange) for server search.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
labelstring''Visible label above the field.
placeholderstring'Search…'Placeholder when nothing is selected.
optionsComboboxOption[][]Listbox options (value, label, optional description / disabled).
filterMode'local' | 'none''local'local filters by label; none shows options as-is.
loadingbooleanfalseSpinner in the panel (async search).
allowCreatebooleanfalseCreate the current query when it matches no option.
emptyTextstring'No results'Empty-state copy.
disabledbooleanfalseDisables the field (also set by forms).

Outputs:

NameEmit TypeDescription
queryChangestringTyped query on every change.
createstringEmitted when the user creates a value not in options.
selectionChangestring | nullSelected option value.

TagsInputComponent

Selector: base-tags-input Standalone: true

Tag field bound to string[] via Angular Forms. Enter, comma, or Tab adds a tag; Backspace removes the last. Optional suggestions dropdown.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
labelstring''Visible label above the field.
placeholderstring'Add a tag…'Placeholder when there are no tags.
suggestionsstring[][]Optional suggestion list.
maxnumber0Maximum tags; 0 is unlimited.
allowCreatebooleantrueAllow tags that are not in suggestions.
disabledbooleanfalseDisables the field (also set by forms).

Outputs:

NameEmit TypeDescription
tagsChangestring[]Emits whenever the tag list changes.

TimePickerComponent

Selector: base-time-picker Standalone: true

Overlay time picker bound to an HH:mm string via Angular Forms. Pair with base-datepicker showTime for a full datetime. The dropdown is a CDK overlay with a transparent backdrop, aligned to the field’s start edge; it opens below the input and flips above when there is not enough space. [inline]="true" keeps the panel in-flow (used by the datepicker datetime overlay).

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
labelstring''Visible label above the field.
placeholderstring'Select time'Placeholder when no time is selected.
hourCycle'12' | '24''24'12-hour or 24-hour clock.
minuteStepnumber5Minute increment.
inlinebooleanfalseInline panel instead of an overlay.
disabledbooleanfalseDisables the field (also set by forms).

Outputs:

NameEmit TypeDescription
timeChangestringEmits HH:mm when the time changes.

ChatComponent

Selector: base-chat Standalone: true

AI chat kit: message list, streaming cursor, tool-call rows, and a prompt composer. Bind [messages], handle (send), and set [streaming] while a reply is in flight. Related: base-chat-message, base-chat-prompt.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
messagesChatMessage[][]Ordered conversation turns.
streamingbooleanfalseTrue while an assistant reply is streaming.
placeholderstring'Send a message…'Composer placeholder.
disabledbooleanfalseDisables the composer.
emptyTitlestring'How can I help?'Empty-state title.
emptyDescriptionstring'Send a message to start the conversation.'Empty-state description.

Outputs:

NameEmit TypeDescription
sendstringUser prompt.
stopvoidUser stopped generation.

ChatMessageComponent

Selector: base-chat-message Standalone: true

A single chat turn — user, assistant, system, or tool call. Used by base-chat; can also be composed on its own.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
messageChatMessagerequiredMessage to render (id, role, content, optional name / avatarUrl / streaming / toolName / toolStatus).

No outputs.


ChatPromptComponent

Selector: base-chat-prompt Standalone: true

Composer for base-chat: textarea, send, and stop while streaming. Enter sends; Shift+Enter inserts a newline.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
placeholderstring'Send a message…'Composer placeholder.
streamingbooleanfalseWhen true, Enter emits Stop instead of Send.
disabledbooleanfalseDisables the composer.

Outputs:

NameEmit TypeDescription
sendstringTrimmed user prompt.
stopvoidUser stopped generation.

SelectComponent

Selector: base-select Standalone: true

A native HTML <select> wrapper component. Integrates natively with Angular Forms.

Inputs:

NameTypeDefaultDescription
placeholderstring''Placeholder text shown when no valid option is selected.
disabledbooleanfalseDisables the select input.
valueunknownThe current selected value.

No outputs.


CheckboxComponent

Selector: base-checkbox Standalone: true

A custom styled checkbox component that integrates seamlessly with Angular Forms.

Inputs:

NameTypeDefaultDescription
color'primary' | 'danger' | 'success' | 'accent' | 'warning''primary'The semantic visual color.
disabledbooleanfalseDisables the checkbox.
checkedbooleanfalseThe checked state of the checkbox. Bound via ngModel.
indeterminatebooleanfalseParent-driven mixed visual state (e.g. select-all).

No outputs.


TriStateCheckboxComponent

Selector: base-tri-state-checkbox Standalone: true

Free three-state checkbox that cycles unchecked → checked → indeterminate on each click. Implements ControlValueAccessor; the form value is TriCheckboxState (true | false | 'indeterminate'). Use base-checkbox with [indeterminate] when a parent derives the mixed state instead.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
color'primary' | 'danger' | 'success' | 'accent' | 'warning''primary'Semantic visual color.
disabledbooleanfalse(two-way) Disables the control; also set by forms via setDisabledState.
stateTriCheckboxStatefalse(two-way) Current value; prefer [(ngModel)] / formControlName in forms.
ariaLabelstringAccessible name when there is no projected label text.

Two-way: [(state)] / [(ngModel)] — value is TriCheckboxState.


ToggleComponent

Selector: base-toggle Standalone: true

A highly customizable toggle/switch component. Integrates natively with Angular Forms.

Inputs:

NameTypeDefaultDescription
color'primary' | 'danger' | 'success' | 'accent' | 'warning''primary'The semantic color variant applied when the toggle is checked.
size'sm' | 'md' | 'lg''md'The physical size of the toggle switch.
shape'rounded' | 'square' | 'smooth''smooth'The border-radius style of the toggle track and thumb.
disabledbooleanfalseDisables the toggle, preventing interaction.
checkedbooleanfalseThe current checked/unchecked state.

No outputs.


RadioGroupComponent

Selector: base-radio-group Standalone: true

A container component for a group of base-radio-button elements. Manages the selected state and integrates with Angular Forms.

Inputs:

NameTypeDefaultDescription
valueunknownThe currently selected value within the group.
disabledbooleanfalseDisables all radio buttons within this group when true.

No outputs.


RadioButtonComponent

Selector: base-radio-button Standalone: true

An individual radio option inside a base-radio-group.

Inputs:

NameTypeDefaultDescription
namestringThe native name attribute for the radio input.
valueunknownThe value represented by this radio button.
color'primary' | 'danger' | 'success' | 'accent' | 'warning''primary'Semantic color variant.
disabledbooleanfalseDisables this specific radio button.

No outputs.


DatepickerComponent

Selector: base-datepicker Standalone: true

A standard date picker input field that opens an overlay calendar popup. Supports Angular Forms with Date objects.

Inputs:

NameTypeDefaultDescription
placeholderstring'Select date'The placeholder text shown when no date is selected.
labelstring''An optional label text displayed above the input.
disabledbooleanfalseDisables the input and prevents the calendar from opening.

No outputs.


DateRangePickerComponent

Selector: base-date-range-picker Standalone: true

An input field that opens a calendar popup specifically for picking start and end date ranges.

Inputs:

NameTypeDefaultDescription
placeholderstring'Select range'The placeholder text shown when no date range is selected.
labelstring''An optional label text displayed above the input.
disabledbooleanfalseDisables the input and prevents the calendar from opening.

No outputs.


InputGroupComponent

Selector: base-input-group Standalone: true

A structural container component that wraps form controls like inputs, selects, and textareas. Can automatically detect Angular FormControl state to conditionally display nested base-error components.

No inputs or outputs.


LabelComponent

Selector: base-label Standalone: true

A label element for use inside a base-input-group.

No inputs or outputs.


LightboxComponent

Selector: base-lightbox Standalone: true

Free lightbox gallery. Project one or more [base-lightbox-thumb] images; thumb size and aspect ratio are controlled with Tailwind on each thumb (class on base-lightbox lays out the thumbs wrapper — host itself is contents). Clicking a thumb opens a focus-trapped full-viewport overlay (cdkTrapFocus) with body scroll lock. Toolbar: flip horizontal/vertical, rotate 90°, zoom in/out (also mouse wheel), download, and browser fullscreen (maximize/minimize). Prev/next and a counter appear when there is more than one thumb. Keyboard: Esc closes, ←/→ navigate, +/− zoom. Transforms reset on index change and close. When a thumb or overlay image fails to load, initials from alt are shown ("Jane Doe"JD) unless initialsFallback is false. Also exports lightboxInitialsFromAlt(). SSR-safe (PLATFORM_ID / injected DOCUMENT). Public methods: open(index?), close(), next(), prev().

Inputs:

NameTypeDefaultDescription
classstring''Classes for the thumbs layout wrapper (e.g. grid grid-cols-3 gap-2).
loopbooleantrueWrap prev/next at the ends (booleanAttribute).
showToolbarbooleantrueShow the transform / download toolbar (booleanAttribute).
showCounterbooleantrueShow n / total when there is more than one image (booleanAttribute).
closeOnBackdropbooleantrueClose when the backdrop is clicked (booleanAttribute).
dialogLabelstring'Image lightbox'Accessible name for the dialog.
initialsFallbackbooleantrueShow alt-derived initials in the overlay when the image is missing/broken (booleanAttribute).

Outputs:

NamePayloadDescription
openednumberEmitted when the lightbox opens, with the active index.
closedvoidEmitted when the lightbox closes.
indexChangenumberEmitted whenever the active index changes while open.

LightboxThumbDirective

Selector: [base-lightbox-thumb] Standalone: true

Marks a projected image (or other host with a resolvable URL) as a lightbox thumbnail. Click or Enter/Space opens the parent base-lightbox at this thumb's index. Size and aspect ratio are entirely Tailwind on the host element. On <img>, use native src / alt so the thumbnail paints — do not bind directive inputs that shadow those attributes. On load error (or empty src), replaces the broken thumb with an initials placeholder from alt when initialsFallback is true.

Inputs:

NameTypeDefaultDescription
fullSrcstring''Full-resolution URL for the overlay; falls back to native src / imageSrc.
imageSrcstring''URL for non-<img> hosts only.
imageAltstring''Alt/label override for non-<img> hosts; on <img> use native alt.
downloadNamestring''Suggested filename for the download action.
initialsFallbackbooleantrueShow alt-derived initials when the thumb image is missing/broken (booleanAttribute).

ErrorComponent

Selector: base-error Standalone: true

An error message element for use inside a base-input-group.

No inputs or outputs.


InfoTextComponent

Selector: base-info-text Standalone: true

A helper/info text element for use inside a base-input-group.

No inputs or outputs.


InputAutocompleteComponent

Selector: base-input-autocomplete Standalone: true

A wrapper component that combines an input field with a native HTML datalist for autocomplete suggestions.

Inputs:

NameTypeDefaultDescription
suggestionsstring''A unique ID string to link the input list attribute with the datalist id.

InputSpinnerComponent

Selector: base-input-spinner Standalone: true

A numeric input component with increment and decrement buttons. Integrates directly with Angular Forms.

Inputs:

NameTypeDefaultDescription
disabledbooleanfalseDisables the entire input and its buttons.
classesstring''Additional CSS classes to apply to the input field wrapper.
minnumber0The minimum allowed value.
maxnumberInfinityThe maximum allowed value.
stepnumber1The numeric step size for incrementing/decrementing.

No outputs.


ButtonGroupComponent

Selector: base-button-group Standalone: true

A container for grouping multiple toggle buttons. Integrates with Angular Forms via ControlValueAccessor.

Inputs:

NameTypeDefaultDescription
ngModelunknownConnects to Angular FormsModule for two-way data binding.

Outputs:

NameEmit TypeDescription
changeunknownEmits the value of the clicked button when the selection changes.

GroupButtonComponent

Selector: base-group-button-item Standalone: true

An individual button item designed to be used inside a base-button-group.

Inputs:

NameTypeDefaultDescription
iconstringOptional icon name to display inside the button.
disabledbooleanfalseDisables the button, preventing interaction.
activebooleanfalseWhether the button is currently in the toggled/active state.
valueunknownThe specific value this button represents.

No outputs.



ChipComponent

Selector: base-chip Standalone: true

Pill-shaped chip that projects its label via ng-content, with an optional leading base-icon and an optional remove button. The inner span gets role="button" and tabindex="0" (removed when disabled) and activates on click, Enter, or Space; active swaps to a solid filled color variant and is reflected via aria-pressed, while disabled applies opacity/pointer-events-none styling and suppresses both outputs. Host element receives inline-block merged with the class input via cn(); uses OnPush change detection.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged onto the host element via cn().
colorChipColor''Color variant; empty string renders the neutral slate style. Maps to tinted background/border with a solid variant when active.
sizeChipSize'md'Size variant (sm/md/lg) controlling text size, padding, and icon dimensions.
removablebooleanfalseShows a close button that emits removed on click (accepts boolean attribute).
disabledbooleanfalseDisables interaction: removes role/tabindex, dims the chip, blocks pointer events, and suppresses output emissions (accepts boolean attribute).
iconstring | undefinedName of a leading base-icon rendered before the projected content.
activebooleanfalseRenders the solid "selected" color variant and sets aria-pressed (accepts boolean attribute).
removeLabelstring'Remove'aria-label for the remove button.

Outputs:

NamePayloadDescription
removedvoidEmitted when the remove button is clicked (click propagation is stopped); not emitted while disabled.
clickedvoidEmitted when the chip is clicked or activated via Enter/Space; not emitted while disabled.

ColorPickerComponent

Selector: base-color-picker Standalone: true

Color picker rendered as a swatch trigger button that opens a position: fixed panel containing a native <input type="color">, a hex text field (validated against #RRGGBB before committing), and a grid of preset swatches. Implements ControlValueAccessor for ngModel/reactive forms (internal value defaults to #3b82f6); the panel repositions itself on window scroll/resize, flips above the trigger when there is no room below, and closes on outside click or Escape. When disabled is set (or via setDisabledState), the trigger is dimmed and the panel will not open.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's inline-block class via cn() (input alias for extraClass).
pickerLabelstring'Color picker'Accessible label prefix for the trigger button's aria-label (combined with the current value).
swatchesstring[]12 preset hex colorsHex color strings rendered as the preset swatch grid; the active swatch is highlighted and marked aria-pressed.
disabledbooleanfalse(two-way) Disables the trigger and prevents the panel from opening; also driven by the forms API via setDisabledState.

FloatingInputComponent

Selector: base-floating-input Standalone: true

Text input with a material-style floating label: the label sits inside the field and shrinks/floats up (via Tailwind peer classes) when the input is focused or has a value. Implements ControlValueAccessor, so it works with [(ngModel)] and reactive forms, including disabled state (setDisabledState renders the native input disabled with reduced opacity). Host element gets block w-full merged with the class input via cn(); internal state (value, isDisabled) is signal-based with OnPush change detection.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's block w-full classes via cn().
labelstring'Label'Floating label text displayed inside the field.
typestring'text'Native input type attribute (e.g. text, email, password).

MentionInputComponent

Selector: base-mention-input Standalone: true

Pro tier. Wrapper that adds @-mention autocomplete to a projected native <input> or <textarea> (via <ng-content>). Typing @ followed by word characters opens a fixed-position suggestion panel anchored at the text caret (measured with a hidden mirror element), filtering users by username or name; the panel repositions on scroll/resize, flips above the caret when space below is insufficient, and hides when no users match. Full keyboard support (ArrowUp/ArrowDown, Home, End, Enter to select, Escape to close) plus click-outside dismissal; ARIA combobox/listbox attributes (role, aria-expanded, aria-activedescendant, etc.) are applied to the projected input while open. Selecting a user inserts @username at the caret and dispatches a bubbling input event so Angular forms bindings on the projected control stay in sync. Implements ControlValueAccessor — bind [(ngModel)] on the wrapper (do not also bind the projected field to the same model). Exports the MentionUser interface (id, username, optional avatar/name); options render an avatar image or an initial-letter fallback bubble.

Inputs:

NameTypeDefaultDescription
usersMentionUser[][]Candidate users for mention suggestions; filtered case-insensitively against the text typed after @ (matches username or name).

MultiSelectComponent

Selector: base-multi-select Standalone: true

Searchable multi-select dropdown that renders selected values as removable chips inside a combobox trigger. Opening the trigger reveals a text search box that filters options by label (already-selected options are hidden from the list); the option panel is position-fixed, repositions itself on window scroll/resize, and flips to a drop-up when there is not enough space below. Implements ControlValueAccessor (NG_VALUE_ACCESSOR) for Angular Forms integration, supports full keyboard navigation (ArrowUp/ArrowDown, Enter/Space to toggle, Home/End, Escape to close), closes on outside document click, and shows a "No options found" message when the filtered list is empty. Option values are typed via the exported MultiSelectOption interface ({ label, value, disabled? }).

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host classes via cn() (aliased to internal extraClass).
optionsMultiSelectOption[][]Options to display; entries with disabled: true cannot be toggled. Empty array yields the "No options found" state when open.
placeholderstring'Select options…'Placeholder text shown when nothing is selected; also used as the trigger's aria-label and the search input placeholder.
maxnumber0Maximum number of selections; further selections are ignored once reached. 0 means unlimited.
disabledbooleanfalse(two-way) Disables the control (also set by forms via setDisabledState); prevents opening and dims the trigger.

Outputs:

NamePayloadDescription
selectionChangeunknown[]Emitted with the full array of selected values whenever an option is added or a chip is removed.

PickListComponent

Selector: base-pick-list Standalone: true

Pro dual-listbox that moves items between available (source) and selected (target) panes. Click highlights items (⌘/Ctrl-click for multi-select), transfer buttons move highlighted or all items, and double-click moves a single item. Optional per-pane filters. Implements ControlValueAccessor — the form value is unknown[] of selected option values. Option model: exported PickListItem ({ label, value, disabled? }).

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
optionsPickListItem[][]Full option catalog; selected values are hidden from the source pane.
sourceHeaderstring'Available'Title above the source list.
targetHeaderstring'Selected'Title above the target list.
filterbooleanfalseShows filter inputs above each list.
disabledbooleanfalse(two-way) Disables the control; also set by forms via setDisabledState.

Outputs:

NamePayloadDescription
selectionChangeunknown[]Emitted whenever the selected values array changes.

KnobComponent

Selector: base-knob Standalone: true

Pro rotary dial for selecting a numeric value along a 270° arc. Pointer drag and keyboard (arrows, PageUp/PageDown, Home/End). Implements ControlValueAccessor for Angular Forms. Exported size type: KnobSize ('sm' | 'default' | 'lg').

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
minnumber0Minimum value.
maxnumber100Maximum value.
stepnumber1Step increment for drag and keyboard.
colorSliderColor'primary'Accent color for track and indicator.
sizeKnobSize'default'Dial diameter (sm 96px / default 128px / lg 160px).
showValuebooleanfalseShows the current value in the dial center.
disabledbooleanfalse(two-way) Disables interaction; also set by forms via setDisabledState.
ariaLabelstring'Knob'Accessible name (role="slider").

Outputs:

NamePayloadDescription
valueChangenumberEmitted whenever the value changes.

OtpInputComponent

Selector: base-otp-input Standalone: true

PIN / OTP input rendering length individually-focusable single-character boxes. Implements ControlValueAccessor (registers NG_VALUE_ACCESSOR) so it works with Angular Forms; typing auto-advances focus, Backspace clears and moves back, ArrowLeft/ArrowRight navigate, and paste distributes characters across boxes. Boxes use autocomplete="one-time-code" and switch to type="password" when masked; setDisabledState writes to the disabled model.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's flex gap-2 classes via cn().
lengthnumber6Number of digit boxes to render.
maskbooleanfalseRenders boxes as type="password" to hide entered characters (accepts boolean attribute).
numbersOnlybooleantrueStrips non-digit characters on input/paste and uses type="tel" with numeric inputmode (accepts boolean attribute).
disabledbooleanfalse(two-way) Disables all boxes; also set by Angular Forms via setDisabledState.

Outputs:

NamePayloadDescription
completedstringEmitted with the full code string once every box is filled.

PasswordStrengthComponent

Selector: base-password-strength Standalone: true

Four-segment password strength meter bar with a text label below it. Computes a 0–4 score from the password input (one point each for length ≥ 8, mixed upper/lowercase, a digit, and a special character) and colors the active segments red/orange/yellow/green accordingly, with a matching "Weak" / "Fair" / "Good" / "Strong" label. When password is empty, all segments render inactive (slate) and the label is hidden. Uses OnPush change detection; purely presentational — no outputs and no form integration.

Inputs:

NameTypeDefaultDescription
passwordstring''The password value to evaluate; the strength score and label are recomputed whenever it changes.

PhoneInputComponent

Selector: base-phone-input Standalone: true

Phone number field with a country dial-code selector. Renders a trigger button (flag emoji + dial code + chevron) beside a type="tel" input; clicking the trigger opens a fixed-position dropdown listing 14 hardcoded countries (COMMON_COUNTRIES: Country[], also exported from this file) that flips above the trigger when viewport space below is insufficient, repositions on scroll/resize, and closes on outside click. Implements ControlValueAccessor: keystrokes are sanitized to digits/spaces/hyphens, and the emitted value is the dial code plus the stripped digits (e.g. +15551234), or '' when the local part is empty; writeValue parses an incoming value's dial-code prefix (longest match first) to restore the country selection, and setDisabledState dims and disables the whole control. Has no inputs or outputs — the country list is not configurable.


CurrencyInputComponent

Selector: base-currency-input Standalone: true

Locale-aware currency field. Stores a number | null via Angular forms (ControlValueAccessor). Shows a formatted value when idle and a raw editable amount while focused. Do not nest inside base-input-group — it is a composite control (the group only projects [base-input], [base-textarea], and base-mention-input). Prefixes the ISO currency symbol from Intl.NumberFormat formatToParts.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
currencystring'USD'ISO 4217 currency code used for formatting and the prefix symbol.
localestring'en-US'BCP 47 locale passed to Intl.NumberFormat.
placeholderstring'0.00'Placeholder when the value is empty and the field is not focused.
ariaLabelstring'Amount'Accessible name for the inner text field.
minnumber | nullnullMinimum allowed value (applied on blur).
maxnumber | nullnullMaximum allowed value (applied on blur).
showSymbolbooleantrueHide the currency symbol prefix when false (the formatted value still uses the currency).

RangeSliderComponent

Selector: base-range-slider Standalone: true

Single-value range slider built on a native <input type="range">, styled with Tailwind accent-color classes per color. Implements ControlValueAccessor (registered via NG_VALUE_ACCESSOR), so it works with ngModel and reactive forms; non-numeric written values coerce to 0. Optionally renders the min/max bounds beside the track and the current value (shown with one decimal place when non-integer). Sets aria-label, aria-valuemin, aria-valuemax, and aria-valuenow on the input.

Inputs:

NameTypeDefaultDescription
minnumber0Minimum value of the slider.
maxnumber100Maximum value of the slider.
stepnumber1Step increment between selectable values.
colorSliderColor'primary'Accent color of the slider track/thumb (primary/success/danger/warning/accent).
disabledbooleanfalse(two-way) Disables the slider; also set by forms via setDisabledState.
showValuebooleanfalseShows the current value label after the track (accepts boolean attribute).
showMinMaxbooleanfalseShows the min and max labels on either side of the track (accepts boolean attribute).
ariaLabelstring'Slider'Accessible label applied to the native range input.

DualRangeSliderComponent

Selector: base-dual-range-slider Standalone: true

Dual-thumb range slider for selecting a numeric span ({ start, end }) within minmax. Thumbs cannot cross. On hover/focus, tip bubbles appear above each thumb (disable with [showTip]="false"). Implements ControlValueAccessor for Angular Forms.

Inputs:

NameTypeDefaultDescription
minnumber0Track minimum.
maxnumber100Track maximum.
stepnumber1Step increment.
colorSliderColor'primary'Accent for fill and thumbs.
disabledbooleanfalse(two-way) Disables both thumbs.
showValuebooleanfalseShows start – end after the track.
showMinMaxbooleanfalseShows track min/max labels.
showTipbooleantrueHover/focus tips above each thumb.
ariaLabelstring'Range'Accessible name for the control group.
classstring''Extra host classes.

Form value: DualRangeValue = { start: number; end: number }

SplitterComponent

Selector: base-splitter Standalone: true

Two-pane resizable layout. Project panes with attributes base-splitter-start and base-splitter-end. Drag the gutter, use arrow keys (Home/End for min/max), or double-click to reset to 50%. Supports nesting. Pro tier. Install: npx base-ui-cli add splitter.

Inputs:

NameTypeDefaultDescription
sizenumber (model)50Primary (start) pane size as a percentage.
orientation'horizontal' | 'vertical''horizontal'Side-by-side or stacked panes.
minnumber10Minimum primary size (%).
maxnumber90Maximum primary size (%).
stepnumber2Keyboard arrow step (%).
disabledbooleanfalseLocks resizing.
ariaLabelstring'Resize panels'Accessible name for the separator.
classstring''Extra host classes (set height for vertical).

Projection: [base-splitter-start], [base-splitter-end]

Overlay

DialogComponent

Selector: base-dialog Standalone: true

The main wrapper component for dialog/modal content. Should be used inside a component that is passed to DialogService.open(). Pair with loading/disabled footer actions (base-progress-button) when a submit cannot be retried.

Inputs:

NameTypeDefaultDescription
widthnumberExplicit width in pixels.
heightnumberExplicit height in pixels.

DialogContainerComponent

Selector: base-dialog-container Standalone: true

Internal container component that renders the dialog overlay and handles click-outside behavior. Created dynamically by DialogService. Traps keyboard focus with Angular CDK FocusTrapFactory while open.

No inputs or outputs.


DialogHeaderComponent

Selector: base-dialog-header Standalone: true

A header section for a dialog, rendered as part of base-dialog.

No inputs or outputs.


DialogBodyComponent

Selector: base-dialog-body Standalone: true

A body section for a dialog, rendered as part of base-dialog.

Inputs:

NameTypeDefaultDescription
heightnumberExplicit height in pixels. Usually set automatically by parent base-dialog.

DialogFooterComponent

Selector: base-dialog-footer Standalone: true

A footer section for a dialog, rendered as part of base-dialog.

No inputs or outputs.


DrawerComponent

Selector: base-drawer Standalone: true

A side-drawer/offcanvas component that slides in from the edge of the screen.

Inputs:

NameTypeDefaultDescription
size'sm' | 'md' | 'lg' | 'xl' | string'md'The size of the drawer.
position'left' | 'right' | 'top' | 'bottom''right'The edge of the screen to slide in from.
closebooleanfalseTriggers the closing animation when set to true.

Outputs:

NameEmit TypeDescription
closedvoidEvent emitted when the drawer has fully closed.

Selector: base-dropdown-menu Standalone: true

The container component for a dropdown menu. Designed to be passed into a [base-dropdown-menu-trigger] directive.

Inputs:

NameTypeDefaultDescription
sizestringOptional custom width size for the dropdown container.

Outputs:

NameEmit TypeDescription
closedvoidEvent emitted when the menu has fully closed.

ScrollTopComponent

Selector: base-scroll-top Standalone: true

Floating scroll-to-top button. Shows after scrollTop exceeds threshold. Targets window, nearest scrollable ancestor, or a CSS selector. Install: npx base-ui-cli add scroll-buttons.

Inputs: target, threshold, color, size, position, fixed, behavior, ariaLabel, class


ScrollBottomComponent

Selector: base-scroll-bottom Standalone: true

Floating scroll-to-bottom button. Shows when more than threshold pixels remain below the viewport. Same targeting API as base-scroll-top. Install: npx base-ui-cli add scroll-buttons.

Inputs: target, threshold, color, size, position, fixed, behavior, ariaLabel, class


SpeedDialComponent

Selector: base-speed-dial Standalone: true

Free floating action button that expands a stack of secondary actions. Supports up / down / left / right expansion, corner position, fixed or absolute placement, optional labels, and closes on outside click, Escape, or action press (configurable).

Inputs:

NameTypeDefaultDescription
actionsSpeedDialAction[][]Secondary actions (icon, optional label / color / disabled / id / ariaLabel).
direction'up' | 'down' | 'left' | 'right''up'Expansion direction from the trigger.
position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left''bottom-right'Corner placement.
fixedbooleantruetrue = viewport fixed; false = absolute inside a relative parent.
colorIconButtonColor | string'primary'Trigger button color.
sizeIconButtonSize'lg'Trigger and action button size.
openIconstring'plus'Trigger icon when closed.
closeIconstring'x'Trigger icon when open.
showLabelsbooleanfalseShows each action’s label beside the button.
closeOnActionbooleantrueCloses the dial after an action click.
ariaLabelstring'Speed dial'Accessible name for the group / trigger.
classstring''Extra host classes merged via cn().
openbooleanfalse(two-way) Open state.

Outputs:

NamePayloadDescription
actionClickSpeedDialActionEmitted when an enabled action is clicked.

ContextMenuComponent

Selector: base-context-menu Standalone: true

Right-click context menu panel. Pass into [base-context-menu-trigger]. Opens at the pointer (or host center for Shift+F10 / ContextMenu key). Install: npx base-ui-cli add context-menu.

Inputs:

NameTypeDefaultDescription
sizestringOptional custom width for the menu panel.

Outputs:

NameEmit TypeDescription
closedvoidEmitted when the menu should close.

ContextMenuDirective

Selector: [base-context-menu-trigger] Standalone: true

Opens a base-context-menu on contextmenu, Shift+F10, or the ContextMenu key. Positions via CDK Overlay at the pointer.

Inputs:

NameTypeDefaultDescription
base-context-menu-triggerContextMenuPanelMenu panel reference.
disabledbooleanfalseDisables the custom menu.

BaseContextMenuItemDirective

Selector: [base-context-menu-item] Standalone: true

Styles a button or link as a context menu item (role="menuitem").


Selector: base-dropdown-menu-item Standalone: true

An individual item within a base-dropdown-menu. Clicking a normal item closes the menu. Bind checked (or set stayOpen) for selectable items that toggle without dismissing the dropdown.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
stayOpenbooleanfalseKeep the dropdown open after this item is clicked. Implied when checked is bound.
checkedboolean | undefinedundefinedWhen set, renders as menuitemcheckbox and two-way toggles without closing the menu.

Outputs:

NameEmit TypeDescription
checkedChangeboolean | undefinedEmitted when a checkbox item is toggled.

AlertComponent

Selector: base-alert Standalone: true

A highly configurable alert component for displaying important messages. Includes support for auto-dismissal, manual closing, and multiple visual variants.

Inputs:

NameTypeDefaultDescription
color'' | 'primary' | 'success' | 'danger' | 'accent' | 'warning'''The semantic color variant.
variant'soft' | 'solid' | 'outline''soft'The stylistic appearance (soft, solid, outline).
iconstringAn optional icon name to display at the start of the alert.
closebooleanfalseWhether the alert should display a close button.
durationnumber0Auto-dismiss duration in milliseconds. 0 disables auto-dismiss.

Outputs:

NameEmit TypeDescription
closedvoidEmitted when the alert is closed (either manually or via timeout).

AlertActionsComponent

Selector: base-alert-actions Standalone: true

Container for action buttons within an alert component.

No inputs or outputs.


TooltipDirective

Selector: [base-tooltip] Standalone: true

An attribute directive that attaches a floating tooltip to any element. Hover or focus shows the tooltip; mouse leave, blur, Escape, or scroll (window or nested overflow containers) hides it.

Important: use tooltipPlacement for position — never bare placement. Dropdown, popover, and drawer also bind placement on the same host; a value like end breaks tooltip positioning.

Inputs:

NameTypeDefaultDescription
tooltipTitle (via [base-tooltip])string''The text content to display inside the tooltip.
tooltipPlacementTooltipPlacement | string ('top' | 'bottom' | 'left' | 'right')'top'Tooltip position relative to the host. Namespaced so it does not collide with dropdown/popover/drawer placement.
tooltipClassstring''Additional custom CSS classes to apply to the tooltip element.
delaystring'0'Milliseconds to delay before showing the tooltip.
type'dark' | 'light' | string'dark'The visual theme variant.
canShowbooleantrueWhether the tooltip is permitted to show at all.

Example:

<button
  base-tooltip="Account"
  tooltipPlacement="bottom"
  [base-dropdown-menu-trigger]="menu"
  placement="end"
>

</button>

RippleDirective

Selector: [base-ripple] Standalone: true

Material-style ink ripple on pointer press (primary button) or Enter/Space. Ensures the host is positioned and clips overflow so the ink stays inside rounded corners. Skips when disabled / aria-disabled, rippleDisabled, SSR, or prefers-reduced-motion. Free tier. CLI: npx base-ui-cli add ripple.

Inputs:

NameTypeDefaultDescription
rippleColorstring'rgba(255, 255, 255, 0.55)'Ink color (use a dark rgba on light surfaces).
rippleCenteredbooleanfalseAlways expand from the host center.
rippleDisabledbooleanfalseDisables ripple creation while the directive stays attached.
rippleDurationnumber550Animation duration in milliseconds.


BottomSheetComponent

Selector: base-bottom-sheet Standalone: true

Mobile-style modal panel that slides up from the bottom of the screen with a fading, blurred backdrop. Supports swipe-down-to-dismiss via a drag handle (closes after 120px of drag or a fast flick), Escape-key and backdrop-click dismissal (all gated by dismissible), an optional close button, and focus trapping via cdkTrapFocus cdkTrapFocusAutoCapture with role="dialog"/aria-modal. Locks body scroll while open and restores it on destroy. Host class is contents and can be extended via the class input.

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host class via cn() (alias for extraClass).
openbooleanfalse(two-way) Open state of the sheet; bind with [(open)].
heightBottomSheetHeight'auto'Sheet height: 'auto' (max 85vh), 'half' (50vh), 'full' (94vh), or any custom CSS height string applied as an inline style.
showHandlebooleantrueShows the drag handle bar at the top (the swipe-down-to-dismiss target). Accepts boolean attribute.
showClosebooleanfalseShows a close (X) icon button in the top-right corner. Accepts boolean attribute.
sheetLabelstring'Bottom sheet'Accessible name applied as aria-label on the dialog.
dismissiblebooleantrueWhether backdrop click, swipe-down gesture, or Escape key can dismiss the sheet. Accepts boolean attribute.

Outputs:

NamePayloadDescription
closedvoidEmitted when the sheet closes, regardless of how the close was triggered.

CommandPaletteComponent

Selector: base-command-palette Standalone: true

Cmd+K style command palette: when open is true it renders a full-screen backdrop plus a centered dialog panel with a search input, grouped command list, and keyboard-hints footer. Filters items by substring match against label, description, and group; supports two-way binding via [(open)] (input + openChange output pair), traps focus with cdkTrapFocus, and restores focus to the previously focused element on close. Keyboard support via a document:keydown listener: ArrowUp/ArrowDown/Home/End move the active option, Enter selects it (emits selected then closes), Escape closes; when no items match the query a "No results" status message is shown. The CommandItem interface (id, label, optional group/icon/shortcut/description) is exported from the same file.

Inputs:

NameTypeDefaultDescription
openbooleanfalseWhether the palette overlay is shown; uses booleanAttribute transform. Pair with openChange for [(open)] two-way binding.
itemsCommandItem[][]Commands to list, optionally grouped via each item's group field. Empty array renders the "No results" message.
placeholderstring'Type a command or search…'Placeholder text for the search input.

Outputs:

NamePayloadDescription
openChangebooleanEmits false when the palette closes (Escape, backdrop click, item selection, or component destroy).
selectedCommandItemEmitted when a command is chosen via click or Enter; the palette closes afterwards.

PopoverComponent

Selector: base-popover Standalone: true

Self-contained popover with a trigger slot and a panel slot: project the trigger element into [popover-trigger] and the panel content as default children. The panel is a CDK overlay on the viewport (not position: fixed inside the host), so it stays next to the trigger even inside overflow: hidden cards. Placement (bottom-start default) flips when there is not enough room. Opens/closes on trigger click, Enter, or Space; closes on backdrop click and Escape; on open it moves focus to the first focusable element inside the panel and restores focus on close. The trigger wrapper carries role="button" and aria-haspopup/aria-expanded/aria-controls; the panel has role="dialog".

Inputs:

NameTypeDefaultDescription
classstring''Extra Tailwind classes merged into the host element via cn().
minWidthstring'200px'CSS min-width applied to the panel.
placementPopoverPlacement'bottom-start'Preferred panel position relative to the trigger; may be overridden at runtime by an external trigger directive.

PopoverTriggerDirective

Selector: [base-popover-trigger] Standalone: true

Alternative external trigger for base-popover, for when the trigger button must live outside the <base-popover> element. On host click it calls toggleWithPlacement() on the referenced PopoverComponent, passing its own placement as an override. Closes the referenced popover when the directive is destroyed.

Inputs:

NameTypeDefaultDescription
base-popover-triggerPopoverComponentrequiredReference to the popover instance to toggle (bind a template reference variable).
placementPopoverPlacement'bottom-start'Placement override applied to the popover when opened via this trigger.

HoverCardComponent

Selector: base-hover-card Standalone: true

Rich preview panel that opens when the pointer (or keyboard focus) rests on the trigger. Unlike base-popover, there is no backdrop — the pointer can move into the panel. Closes after closeDelay on leave, on outside pointer down, and on Escape. Project the trigger into [hover-card-trigger] and panel content as default children. The panel is a CDK overlay on the viewport so it is not clipped by overflow: hidden parents.

Inputs:

NameTypeDefaultDescription
classstring''Extra Tailwind classes merged into the host element via cn().
minWidthstring'240px'CSS min-width applied to the panel.
placementPopoverPlacement'bottom-start'Preferred panel position relative to the trigger; flips when there is not enough room.
openDelaynumber200Milliseconds to wait after pointer enter / focus before opening.
closeDelaynumber150Milliseconds to wait after pointer leave before closing.

Outputs:

NamePayloadDescription
openChangebooleanEmits whenever the panel opens or closes.

LoadingOverlayComponent

Selector: base-loading-overlay Standalone: true

Blocks a region (or the viewport) with base-spinner while work is in progress. Sets aria-busy on the host and a polite live region on the overlay. Prefer this over base-spinner-wrapper when you need a message, scroll locking, or fullscreen. Contained mode wraps projected content in a relative host; fullscreen covers the viewport with position: fixed.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn(). Include a min-height for contained overlays.
visiblebooleanfalseShows the blocking overlay (boolean attribute).
fullscreenbooleanfalseCover the viewport instead of wrapping projected content.
lockScrollbooleanfalseSet overflow: hidden on document.body while visible. Also applied when fullscreen is true.
messagestring''Optional status text announced via the live region.
sizeSpinnerSize'lg'Spinner diameter.
colorSpinnerColor'primary'Spinner color. Use inverted on a dark backdrop.

CookieBannerComponent

Selector: base-cookie-banner Standalone: true

Fixed consent banner. Hidden until the client confirms localStorage has no stored choice (afterNextRender, SSR-safe). Accept / Reject persist 'accepted' or 'rejected' under storageKey and emit. Call reset() to clear storage and show the banner again.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
storageKeystring'base-cookie-consent'localStorage key used to remember the choice.
titlestring'We use cookies'Heading shown beside the cookie icon.
messagestring(default copy)Supporting copy under the title.
acceptLabelstring'Accept'Label for the accept button.
rejectLabelstring'Reject'Label for the reject button.
policyHrefstring''Optional privacy policy URL. Hidden when empty.
policyLabelstring'Privacy policy'Label for the privacy policy link.

Outputs:

NamePayloadDescription
acceptedvoidEmitted after the user accepts (and the choice is stored).
rejectedvoidEmitted after the user rejects (and the choice is stored).
consentChangeCookieConsentEmitted with 'accepted' or 'rejected' after accept, reject, or a successful choice.

ToastComponent

Selector: base-toast-container Standalone: true

Toast renderer used programmatically by ToastService — you normally never place this selector yourself. The service creates one container attached to document.body (with aria-live="polite"), and the component groups active toasts by position (top-right, top-left, top-center, bottom-right, bottom-left, bottom-center), rendering each as a colored, bordered card with an icon, message, and dismiss button, animating out over 300ms. State is held in a toasts signal with addToast/removeToast/cleanToast/dismissToast methods called by the service. No inputs or outputs.

Use via ToastService (documented under Services): show(message, { color, duration, icon, position, action }) plus success/error/warning/info shorthands, promise(promiseOrFn, { loading, success, error }), dismiss(id), and clearAll(). Duration defaults to 4000ms; duration: 0 keeps a toast until dismissed. action is { label, onClick, dismiss? } and renders an inline button (Undo-style).

ResponsiveNavComponent

Selector: base-responsive-nav Standalone: true

Progressive (priority+) horizontal navigation. Project base-responsive-nav-item children; as many as fit stay visible and the rest spill into a "More" dropdown from the right. Leftmost items have the highest priority.

Inputs:

NameTypeDefaultDescription
linkClassstring(styled default)Tailwind classes applied to each item link.
moreLabelstring'More navigation links'Accessible label for the overflow trigger.
classstring''Extra host classes merged via cn().

Example:

<base-responsive-nav>
  <base-responsive-nav-item routerLink="/docs">
    <base-icon name="book" class="h-4 w-4 stroke-slate-500"></base-icon>
    Docs
  </base-responsive-nav-item>
  <base-responsive-nav-item routerLink="/blog">Blog</base-responsive-nav-item>
  <base-responsive-nav-item href="https://github.com" target="_blank">GitHub</base-responsive-nav-item>
</base-responsive-nav>

ResponsiveNavItemComponent

Selector: base-responsive-nav-item Standalone: true

Projected nav link for base-responsive-nav. Put the label and optional icon in the content.

Inputs:

NameTypeDefaultDescription
routerLinkstring | any[]In-app route (RouterLink). Wins over href.
hrefstringExternal or hash URL when not using routerLink.
targetstringOptional target for href (e.g. _blank).
menuLabelstringOverflow menu text; defaults to projected text.
classstring''Extra classes merged onto the inner link.

Selector: base-menubar Standalone: true

Horizontal application menubar. Project base-menubar-menu children; each menu opens a base-dropdown-menu of actions. Click a top-level trigger to open the first menu; after that, hover switches menus and opens nested submenus. Click a leaf / link or outside to close. Bind checked (or stayOpen) on items that should toggle without dismissing the menu. Arrow Left/Right move between menus (and switch the open menu); Arrow Down / Enter / Space open; Escape closes.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().

Selector: base-menubar-menu Standalone: true

One top-level menu inside base-menubar. Project base-dropdown-menu-item children, plus nested base-dropdown-menu panels on items that use [base-dropdown-menu-trigger] with placement="right" (or left).

Inputs:

NameTypeDefaultDescription
labelstring''Visible label on the menubar trigger.
classstring''Extra host classes merged via cn().
disabledbooleanfalseDisables the trigger so the menu cannot open.

Selector: base-breadcrumb Standalone: true

A container component for breadcrumb navigation. Usually contains multiple base-breadcrumb-item components.

No inputs or outputs.


Selector: base-breadcrumb-item Standalone: true

An individual breadcrumb link within a base-breadcrumb.

Inputs:

NameTypeDefaultDescription
iconstringOptional icon name to display before the label.
linkstringOptional URL link for this breadcrumb segment.
labelstring''The text label of the breadcrumb segment.
separatorstringOptional custom separator string.

Selector: base-nav-list Standalone: true

A navigation list container. Usually used inside sidebars or drawer menus. Expects base-list-item or similar navigation links as children.

No inputs or outputs.


ScrollNavComponent

Selector: base-scroll-nav Standalone: true

A highly interactive layout component that synchronizes a sidebar navigation list with scrollable content. As the user scrolls the content area, the active navigation link updates automatically. Free shell (npx base-ui-cli add scroll-nav).

No inputs or outputs.


ScrollNavSidebarComponent

Selector: base-scroll-nav-sidebar Standalone: true

A sidebar navigation panel for base-scroll-nav.

No inputs or outputs.


ScrollNavContentComponent

Selector: base-scroll-nav-content Standalone: true

The scrollable content area for base-scroll-nav.

No inputs or outputs.


ShellComponent

Selector: base-shell Standalone: true

Unified Pro application shell. mode="page" is a marketing/content frame (hamburger push drawer under 991px, optional footer). mode="dashboard" is an admin rail (expanded / mini / mobile at 1080px / 1360px). Project base-shell-sidebar, base-shell-header, base-shell-content, and optional base-shell-footer. Install: npx base-ui-cli add shell. Free-tier alternatives: sidenav, scroll-nav, page-main.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().
mode'page' | 'dashboard''page'Product mode.
layout'auto' | 'mobile' | 'desktop''auto'Force chrome for demos, or follow breakpoints.
widthnumber280Dashboard expanded rail width (px).
miniWidthnumber76Dashboard mini rail width (px).
collapsedbooleanfalseDashboard icons-only rail (two-way bindable).
OutputTypeDescription
collapsedChangebooleanEmits when dashboard collapsed state changes.

ShellSidebarComponent

Selector: base-shell-sidebar Standalone: true

Sidebar for base-shell. Page mode: off-canvas push panel (side left/right). Dashboard mode: expanded / mini / mobile rail.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().
side'left' | 'right''left'Edge for page-mode panels.
widthnumber280Panel / expanded rail width (px).

ShellHeaderComponent

Selector: base-shell-header Standalone: true

Top bar for base-shell. Built-in hamburger (page under 991px / dashboard mobile) and optional dashboard collapse toggle.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().
showMenuTogglebooleantrueShow built-in hamburger.
showCollapseTogglebooleantrueShow dashboard mini↔expanded control.

ShellContentComponent

Selector: base-shell-content Standalone: true

Main content slot for base-shell. Place <router-outlet> here. Page mode scrolls with the parent column; dashboard mode scrolls this host.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().

ShellFooterComponent

Selector: base-shell-footer Standalone: true

Optional footer slot for base-shell (typically page mode).

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().

ShellToggleComponent

Selector: base-shell-toggle Standalone: true

Optional panel toggle for page-mode sidebars (e.g. a right panel). Transparent hamburger (menu / close) matching the header control. Prefer the built-in header hamburger for the primary left nav — do not add a second left toggle.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().
side'left' | 'right''left'Which panel to toggle.

ShellNavComponent

Selector: base-shell-nav Standalone: true

Navigation list container for shell sidebar items.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().

ShellNavItemComponent

Selector: a[base-shell-nav-item], button[base-shell-nav-item], base-shell-nav-item Standalone: true

Nav item with icon + label. In dashboard mini mode the label hides. Clicking closes mobile / page drawers. Pair with routerLink / routerLinkActive.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().
iconstring''Icon sprite name.

ShellNavSectionComponent

Selector: base-shell-nav-section Standalone: true

Labeled group inside base-shell-nav. The heading fades out with the dashboard mini-rail width; a small gap still separates groups. Project base-shell-nav-item children.

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
labelstring''Visible section heading. Hidden when the dashboard rail is collapsed.

SidenavComponent

Selector: base-sidenav Standalone: true

Responsive section shell with a left nav rail and scrollable body. Pair with base-sidenav-nav and base-sidenav-body. Free shell (npx base-ui-cli add sidenav).

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().
colorstringundefinedColor for the mobile nav toggle button.
layout'auto' | 'mobile' | 'desktop''auto'Force mobile/desktop chrome, or follow the viewport lg breakpoint.

SidenavNavComponent

Selector: base-sidenav-nav Standalone: true

Left navigation slot for base-sidenav.

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().

SidenavBodyComponent

Selector: base-sidenav-body Standalone: true

Main content slot for base-sidenav (typically hosts a router outlet).

InputTypeDefaultDescription
classstring''Extra host classes merged via cn().

ScrollNavItemComponent

Selector: base-scroll-nav-item Standalone: true

A section within a scroll-nav component that is linked to a sidebar item.

No inputs or outputs.


PaginatorComponent

Selector: base-paginator Standalone: true

A pagination control component. Allows users to navigate between pages of data and change the page size.

Inputs:

NameTypeDefaultDescription
basePaginatorbooleanfalseIf true, applies a distinct "base" visual variant.
arrowsbooleanfalseIf true, shows explicit previous/next arrow buttons instead of standard pagination.
itemsPerPagestring | number | nullnullThe currently selected number of items per page.
pageSizeOptionsnumber[][10, 25, 50, 100]The available options for "items per page" dropdown.

PPageComponent

Selector: base-p-page Standalone: true

Represents an individual page number button inside a base-paginator.

Inputs:

NameTypeDefaultDescription
activebooleanfalseIndicates if this page is currently the active/selected page.

StepperComponent

Selector: base-stepper Standalone: true

A multi-step workflow container component. Automatically handles step transitions, active state, and visual progress lines.

Inputs:

NameTypeDefaultDescription
activeStepIndexnumber0The zero-based index of the currently active step.
linearbooleanfalseIf true, the user is restricted from jumping ahead to uncompleted steps.
successTitlestring'All done!'The title displayed on the success screen after submission.
successMessagestring'Your request has been successfully submitted.'The message displayed on the success screen after submission.

Outputs:

NameEmit TypeDescription
stepChangenumberEmitted whenever the active step index changes.
stepperSubmitvoidEmitted when the stepper is submitted on the final step.

StepComponent

Selector: base-step Standalone: true

An individual step within a base-stepper. Contains the label, icon, and template content to render when active.

Inputs:

NameTypeDefaultDescription
labelstring''The primary title text for this step.
iconstring''Optional SVG icon name to display instead of a number.
descriptionstring''Optional secondary subtitle text for this step.


MegaMenuComponent

Selector: base-mega-menu Standalone: true

Full-width mega menu with a trigger slot and a dropdown panel. Content projected into [mega-menu-trigger] becomes the clickable trigger (wrapped with role="button", toggled by click, Enter, or Space, with aria-haspopup/aria-expanded/aria-controls); default projected content becomes the panel body. The panel renders position: fixed at a fixed 1200px width, horizontally centered in the viewport (minimum 16px from the left edge) and 8px below the trigger, with z-index 9900, a slide-down enter/leave animation, and max-h-[85vh] scrolling. While open it repositions on window scroll/resize, closes on Escape or on clicks outside the trigger/panel, moves focus to the panel's first focusable element on open, and restores focus to the previously focused element (or the trigger) on close; the open listener teardown also runs in ngOnDestroy. The panel has role="navigation" labelled by menuLabel. Uses OnPush change detection with signal-based open state, and merges host classes (inline-block relative) with the class input via cn().

Inputs:

NameTypeDefaultDescription
classstring''Extra classes merged into the host's inline-block relative classes via cn() (signal input, aliased from extraClass).
menuLabelstring'Mega menu'Accessible name applied to the panel's role="navigation" region via aria-label.

Media

IconComponent

Selector: base-icon Standalone: true

A highly optimized SVG icon component. By default it pulls SVG definitions from assets/icons.svg using the provided name. Inherits the current text color if not explicitly provided.

Inputs:

NameTypeDefaultDescription
namestring''The SVG id/name of the icon to render (e.g. 'chevron-right').
pathstring'assets/icons.svg'The path to the SVG sprite file.
colorstring''Optional explicit CSS color.
sizestring | number''The size of the icon in pixels or CSS units.

StarRatingComponent

Selector: base-star-rating Standalone: true

A flexbox container wrapper for base-star components. Aligns stars horizontally with appropriate gap spacing.

No inputs or outputs.


StarComponent

Selector: base-star Standalone: true

A single star in the StarRatingComponent. Handles the SVG rendering for each star segment.

Inputs:

NameTypeDefaultDescription
ratingnumber0The rating value.
editablebooleanfalseWhether the star rating is editable.

Outputs:

NameEmit TypeDescription
ratingChangednumberEmitted when the rating changes (if editable).

GallerySliderComponent

Selector: base-gallery-slider, base-carousel Standalone: true

A highly configurable image/content carousel component. Supports auto-play, touch swiping, and slide/crossfade transitions.

Inputs:

NameTypeDefaultDescription
activeIndexnumber0The zero-based index of the currently active slide.
animatebooleantrueWhether transitions are animated.
darkbooleanfalseApplies a dark-themed visual overlay/buttons.
direction'next' | 'prev''next'Defines the transition direction explicitly.
intervalnumber5000Milliseconds before auto-advancing to the next slide. 0 to disable.
pause'hover' | false'hover'Whether to pause autoplay on hover.
touchbooleantrueWhether touch swipe navigation is enabled.
transition'slide' | 'crossfade''slide'The animation transition style.
wrapbooleantrueWhether the carousel loops back to the start at the end.
slidesstring[][]Optional array of image source URLs for a quick image-only slider.

Outputs:

NameEmit TypeDescription
itemChangenumberEmitted whenever the active slide index changes.

CarouselItemComponent

Selector: base-carousel-item Standalone: true

An individual slide item within a gallery slider. Can contain arbitrary content, typically an image and an optional base-carousel-caption.

Inputs:

NameTypeDefaultDescription
intervalnumber-1Optional override for the auto-play interval when this specific slide is active.

CarouselCaptionComponent

Selector: base-carousel-caption Standalone: true

A caption overlay for a gallery slider or carousel item, typically positioned over the image.

No inputs or outputs.


HorizontalCarouselComponent

Selector: base-horizontal-carousel Standalone: true

A horizontally scrollable container component for presenting multiple items in a row. Includes built-in smooth scrolling, mouse drag-to-scroll, and touch swipe support.

Inputs:

NameTypeDefaultDescription
titlestring''Optional title to display above the carousel controls.

No outputs.


FileUploadComponent

Selector: base-file-upload Standalone: true

A highly versatile file upload component supporting buttons, standard inputs, and drag-and-drop zones. Implements ControlValueAccessor — the form value is File[]. disabled (input or setDisabledState) blocks the native picker and dropzone. Do not nest inside base-input-group.

Inputs:

NameTypeDefaultDescription
acceptstring'/'The accepted file types.
multiplebooleanfalseWhether multiple files can be selected at once.
disabledbooleanfalseDisables the file input and drag-and-drop zones.
variant'input' | 'button' | 'dropzone''input'The visual presentation style of the uploader.
buttonColor'primary' | 'danger' | 'success' | 'warning' | 'accent' | '''primary'Semantic color variant (only applies when variant is 'button').
buttonVariant'solid' | 'stroked''stroked'Solid or stroked styling (only applies when variant is 'button').
labelstring'Choose file'Text label displayed on the button or input field.

Outputs:

NameEmit TypeDescription
fileSelectedFile[]Emitted when files are selected via dialog or drag-and-drop.

CropImageComponent

Selector: base-crop-image Standalone: true

Pro tier. A component for cropping images, typically used for avatars or profile pictures.

Inputs:

NameTypeDefaultDescription
imageFileFile | undefinedFile object from base-file-upload or programmatic use.
imageChangedEventEvent | nullnullNative file input change event (alternative to imageFile).
maintainAspectRatiobooleantrueWhether to maintain aspect ratio during cropping.
aspectRationumber1The aspect ratio (width/height) for the crop box.
hideIfEmptybooleantrueWhether to hide the component when no image is loaded.
cropperHeightstring'400px'Height of the crop viewport (CSS value).

Outputs:

NameEmit TypeDescription
croppedBlob | nullEmitted with the cropped image as a Blob when confirmed.
canceledvoidEmitted when the crop is canceled.

ProductGalleryComponent

Selector: base-product-gallery Standalone: true

Pro tier. A highly interactive product gallery component supporting images, videos, thumbnails, and zooming.

Inputs:

NameTypeDefaultDescription
items{ id?: string | number; src: string; thumbSrc?: string; alt?: string; type?: 'image' | 'video' }[][]The array of media items to display in the gallery.
thumbnailsPosition'left' | 'right' | 'top' | 'bottom''left'Position of the thumbnails strip relative to the main viewer.
showArrowsbooleantrueWhether to show previous/next navigation arrows on the main viewer.
objectFit'cover' | 'contain''cover'CSS object-fit rule for the main image.
zoomOnClickbooleantrueEnables an interactive magnifying zoom effect when clicking the main image.
aspectRatiostring'16/9'Aspect ratio constraint for the main viewer.
mainViewWidthstring'100%'Width of the main view container.
mainViewHeightstring'auto'Height of the main view container.

Outputs:

NameEmit TypeDescription
indexChangenumberEmitted whenever the active selected item changes.

Form Blocks

Pre-built, self-contained form flows (login, signup, checkout, billing, wizard, …). Free tier.

FormBillingComponent

Selector: base-form-billing Standalone: true

Pre-built billing/plan form block rendered inside a base-card: three selectable plan cards (Starter $9, Pro $29, Enterprise $99) with a "Popular" badge on Pro, a seat stepper, a promo-code input with Apply button, and a full-width "Upgrade Plan" button. Plan selection and seat count are internal signals (selectedPlan defaults to 'pro', seats defaults to 5, clamped 1–100 with the stepper buttons disabled at the bounds); the displayed monthly total is computed as seats × $29. Uses OnPush change detection and has no inputs or outputs — it is a static showcase composition of CardComponent, InputGroupComponent, LabelComponent, BaseInputDirective, BaseButtonDirective, BadgeComponent, and IconComponent.


FormCartComponent

Selector: base-form-cart Standalone: true

Prebuilt static shopping-cart card block composed of base-card/base-card-body with a "Cart" header showing two overlapping avatar images, two hardcoded product line items (thumbnail, name, quantity with +/- buttons, price), a totals breakdown (subtotal, promo code, tax, total), and "Pay with Card" (base-stroked-button) plus "Checkout" (base-button) action buttons. Purely presentational template with OnPush change detection and an empty class body — all content is hardcoded and the quantity/checkout buttons have no click handlers wired up.


FormCheckoutSummaryComponent

Selector: base-form-checkout-summary Standalone: true

Pre-built checkout confirmation/order summary block composed from base-card, base-card-body, base-icon, base-checkbox, and [base-button]. Renders a "Confirmation" header with three check-circle step icons, a hardcoded item list, shipping/delivery/payment sections (including static native radio buttons for VISA/PayPal selection), an itemized totals breakdown with promo-code discount, a Terms and Conditions base-checkbox, and "Proceed to Checkout" (primary button) plus "Back" actions. All content is static demo copy — the component has no inputs or outputs and no wired-up event handlers; it is a copyable layout template rather than a configurable widget. Uses OnPush change detection.


FormDeleteAccountComponent

Selector: base-form-delete-account Standalone: true

Pre-built "delete account" danger-zone form rendered inside a base-card: a red warning banner with an alert-triangle icon, static consequence bullet points (deleted projects, lost team access, cancelled subscriptions) with links to export data or transfer ownership, a type-to-confirm text input, and a full-width red "Delete Account Permanently" button. The confirmation value is tracked in an internal signal via the input's (input) event, and the delete button stays disabled until the user types exactly DELETE. Uses OnPush change detection; the button performs no action itself (no output is emitted on click), and the displayed counts/links are static demo content.


FormFeedbackComponent

Selector: base-form-feedback Standalone: true

Pre-composed "Feedback" form card built from library primitives: a base-card containing a heading, side-by-side Name and Email inputs, a feedback-type <select> (single "General" option) with a chevron-down end-addon icon, a 5-row Message textarea, and a full-width primary "Send Feedback" button. Purely presentational (OnPush) — it has no inputs, outputs, form bindings, or submit handling; the button performs no action.


FormFilterComponent

Selector: base-form-filter Standalone: true

Self-contained filter/search panel rendered inside a base-card: a search input with a start-addon icon, toggleable status chips, a from/to date range, a sort-by <select> with a chevron end-addon, toggleable tag chips, and Apply Filters / Reset actions. Chip data (statuses, tags) is hardcoded in internal signals and toggled on click; a computed activeCount shows a "Clear all (N)" button only when at least one chip is active, and clearAll() deactivates every chip. Uses OnPush change detection; has no inputs or outputs, so it is a fixed showcase widget rather than a configurable control.


FormLoginComponent

Selector: base-form-login Standalone: true

Prebuilt login form block rendered inside a base-card: email and password base-input-group fields, a "Keep me logged in" base-checkbox with a "Forgot password?" link, a full-width primary "Sign In" base-button, and a "Sign up" footer link. Purely presentational — the template is static markup with no form bindings, no submit handling, and no configurable state; uses OnPush change detection. Composes CardComponent, InputGroupComponent, LabelComponent, BaseInputDirective, CheckboxComponent, and BaseButtonDirective.


FormLoginTabsComponent

Selector: base-form-login-tabs Standalone: true

Prebuilt authentication block: a base-card containing an underline-style base-tabs with two tabs — "Sign Up" (name, lastname, phone, email, password, confirm-password inputs, a Terms and Conditions checkbox, and a primary Sign Up button) and "Login" (login and password inputs with an eye-icon addon button, a "Remember me" checkbox, a "Forgot password?" link, and a full-width primary Sign In button). Both tabs end with a row of stroked icon buttons for facebook, linkedin, and x-twitter social sign-in. Purely presentational static markup with OnPush change detection — no form bindings, no configurable inputs, and no outputs; composed from Card, Tabs, InputGroup, Label, Checkbox, Icon, and the button/input/link/addon directives.


FormNewsletterComponent

Selector: base-form-newsletter Standalone: true

Pre-built newsletter signup card: a base-card containing a centered email icon in a rounded tile, a "Subscribe to Our Weekly Newsletter" heading, a "no spam" tagline, a base-input-group with a center-aligned email text input, and a full-width primary Subscribe button. All copy is hardcoded and the component has no logic — the input is not bound to any form model and the button emits no events, so it serves as a static template/starting point rather than a functional form. Uses ChangeDetectionStrategy.OnPush.


FormNotificationsComponent

Selector: base-form-notifications Standalone: true

Prebuilt notification-settings card widget. Renders a base-card with a "Notifications" header, two toggle sections ("Activity notifications" and "Marketing", each row pairing a label with a base-toggle), and an "Add more contacts" panel containing name/email base-input-group fields (the email field shows a green check-circle icon via base-addon-end), a radio option, and Add (base-button color="primary") / Cancel (base-stroked-button) buttons. Purely presentational: it has no inputs, outputs, or component state — toggle/input values are not bound or emitted, so consumers must copy or wrap the template to wire up real behavior. Uses ChangeDetectionStrategy.OnPush.


FormPaymentComponent

Selector: base-form-payment Standalone: true

Prebuilt static payment form section: a base-card with a "Payment Info" header showing a 3-step progress indicator (two check-circle icons and a numbered dot), payment-method selector buttons (VISA active, PayPal dimmed), and inputs for cardholder name, card number, expiry date, and CVV via base-input-group/base-label/base-input. Footer holds a stroked "Back" button (with arrow-left icon) and a primary "Pay Now" button. Purely presentational template with no bound state, form logic, or validation — composes CardComponent, CardBodyComponent, InputGroupComponent, LabelComponent, BaseInputDirective, IconComponent, BaseButtonDirective, and StrokedButtonDirective; uses OnPush change detection.


FormProfileSettingsComponent

Selector: base-form-profile-settings Standalone: true

Prebuilt profile-settings form block rendered inside a base-card: a cover-image header with an overlaid title, avatar, and round icon-button actions (edit, delete, user, more), followed by a card body with two-column text inputs (first/last name, phone, email with a green check-circle end addon, zipcode, area), country/state <select> fields styled via base-input with chevron end addons, a bio textarea, and full-width Save (primary) / Cancel buttons. Entirely static template with hard-coded sample values (no Angular Forms wiring, no configurable state); uses OnPush change detection.


FormReviewComponent

Selector: base-form-review Standalone: true

Pre-composed "Write a Review" form card. Renders a base-card containing a header row with title and a close-icon button, a hardcoded product summary (watch image and name), a read-only star rating display (base-star-rating with a single base-star fixed at rating 4), a Title text input, a Review textarea, and a full-width primary "Write a Review" submit button. The component class is empty — it has no inputs, outputs, or form wiring; all content is static template markup (uses OnPush change detection), so it serves as a copyable layout block rather than a configurable widget.


FormShippingComponent

Selector: base-form-shipping Standalone: true

Prebuilt shipping-information form block rendered inside a base-card. The card header shows a "Shipping Info" title with a 3-step progress indicator (check icon, current step "2", x icon); the body contains two delivery-method toggle buttons (Free Delivery / Express Delivery), base-input-group fields for street address, first/last name, phone, email, and zipcode, native <select> dropdowns (with base-addon-end chevron icons) for country/state/city, an "Area" textarea, and Back / Next Step stroked buttons. All content is static demo markup — the component class is empty, with no inputs, outputs, form bindings, or event handlers; uses OnPush change detection.


FormSignupComponent

Selector: base-form-signup Standalone: true

Pre-built static sign-up form rendered inside a base-card: side-by-side First Name / Last Name inputs, Email and Password fields (each a base-input-group with base-label and base-input), a full-width primary base-button "Sign Up" button, and an "Already have an account? Log in" footer link. Purely presentational with OnPush change detection — no inputs, outputs, form bindings, or submit handling; the fields are plain uncontrolled native inputs and the button has no click handler.


FormSignupTabsComponent

Selector: base-form-signup-tabs Standalone: true

Pre-built signup/login form block: a base-card containing underline-style base-tabs with two tabs — "Sign Up" (name, lastname, phone, email, password and confirm-password inputs with eye-icon end addons, a Terms and Conditions checkbox, a primary Sign Up button, and Facebook/LinkedIn/X social sign-in icon buttons) and "Login" (login/password inputs, "Remember me" checkbox, "Forgot password?" link, full-width Sign In button, and the same social buttons). The template is purely static markup composed from library components (Card, Tabs, InputGroup, Label, Checkbox, Button/IconButton directives, Icon) — no form model, validation, or event wiring is included, so consumers copy or wrap it to add real form logic. Uses OnPush change detection.


FormSuccessMessageComponent

Selector: base-form-success-message Standalone: true

Pre-built order-confirmation success card (OnPush). Renders a base-card containing a large circled green check icon, a "Congratulations! Your order is accepted." message, a two-column summary strip (order number and delivery date), a primary "Track Your Order" button, and a "Back to home" text link. All content is hardcoded — there are no inputs or outputs; it is a static template block intended to be copied/customized rather than configured. Composes CardComponent, IconComponent, and BaseButtonDirective.


FormTeamInviteComponent

Selector: base-form-team-invite Standalone: true

Pre-composed "Invite Team Members" form block rendered inside a base-card: an email input paired with a role <select> (Admin/Member/Viewer, with a chevron-down icon via base-addon-end), a full-width primary "Send Invitation" button, and a static "Pending Invitations" list showing initial-avatar rows with status badges (Pending/Accepted/Expired). Purely presentational with hardcoded demo content — no inputs, outputs, form bindings, or injected services; uses OnPush change detection.


FormWizardComponent

Selector: base-form-wizard Standalone: true

Self-contained three-step account signup wizard rendered inside a base-card, with a progress stepper (completed steps show a check icon, the active step is highlighted), an account-details form step, a plan-selection step (Starter/Pro cards with a "Popular" badge), and a confirmation summary step with a terms base-checkbox. Navigation is driven by internal signals (currentStep, selectedPlan) via Back/Continue buttons; step labels and form content are hardcoded, and the component exposes no inputs or outputs. Uses OnPush change detection and composes CardComponent, InputGroupComponent, LabelComponent, BaseInputDirective, BaseButtonDirective, BadgeComponent, IconComponent, and CheckboxComponent.


Blog Cards

Editorial blog/article card variants. Pro tier — requires a license (BASE_UI_LICENSE_KEY).

BlogCardCenteredHeroComponent

Selector: base-blog-card-centered-hero Standalone: true

Static blog-post card with a centered hero layout, composed from base-card, base-card-body, and base-card-footer. The body centers a category eyebrow label, title, and excerpt; the footer shows an author base-avatar with name on the left and calendar/comment-count base-icon metadata on the right (the date hides below the sm breakpoint). All text, avatar, and metadata content is hardcoded in the template — there are no inputs or outputs; the card uses OnPush change detection and has hover lift/shadow styling with dark-mode classes.


BlogCardCollageComponent

Selector: base-blog-card-collage Standalone: true

Pre-composed blog post card with a two-image collage header, a category eyebrow label ("Feature"), a title, and a footer showing an author avatar/name plus date and comment-count icon stats. All content (images, text, avatar URL, stats) is hard-coded in the template — this is a static pro-tier showcase block with no configurable API. Built by composing base-card, base-card-body, base-card-footer, base-avatar, and base-icon; uses OnPush change detection, lazy-loaded images, and hover effects (card lift, shadow, image zoom).


BlogCardCompactComponent

Selector: base-blog-card-compact Standalone: true

Compact blog-post card block (pro tier) composed from base-card, base-card-body, base-card-footer, base-avatar, and base-icon. Renders a lazy-loaded cover image that zooms on hover (with card lift/shadow), a category label, a title, and a footer row with author avatar/name plus calendar-date and comment-count icon groups. All content (image, category, title, author, date, comment count) is hardcoded in the template — the component has no inputs or outputs and uses OnPush change detection.


BlogCardFloatingPanelComponent

Selector: base-blog-card-floating-panel Standalone: true

Preset blog-post card rendering a full-height cover image with a frosted-glass (backdrop-blur) panel floating over its bottom edge; the panel shows a category eyebrow, post title, and a footer with author avatar/name plus calendar-date and comment-count icon stats. Hovering lifts the card, deepens the shadow, and zooms the image. All content (image, text, avatar URL, icons) is hardcoded — the component has no inputs or outputs — and it composes CardComponent, CardBodyComponent, CardFooterComponent, AvatarComponent, and IconComponent with OnPush change detection.


BlogCardGradientHeroComponent

Selector: base-blog-card-gradient-hero Standalone: true

Pre-composed blog hero card (pro tier) built from base-card, base-card-body, base-card-footer, base-avatar, and base-icon. Renders a full-bleed background image with a bottom-anchored dark gradient overlay containing a category eyebrow, headline, and a footer row with author avatar/name plus date and comment-count icons; on hover the card lifts and the image zooms. All content (image, text, author, date, comment count) is hard-coded in the template — there are no inputs or outputs, and the component uses OnPush change detection.


BlogCardHorizontalFeatureComponent

Selector: base-blog-card-horizontal-feature Standalone: true

Static horizontal featured blog card composed from base-card, base-card-body, base-card-footer, base-avatar, and base-icon. Renders a wide cover image (left 3/5 on lg screens, stacked above the text on smaller viewports) beside an eyebrow label, headline, excerpt, and a footer with author avatar/name plus calendar-date and comment-count metadata (date hidden below sm). All content (image, text, avatar URL, date, counts) is hardcoded in the template — the component has no inputs or outputs; hover applies a lift/shadow on the card and a slow zoom on the image, and it uses OnPush change detection.


BlogCardImageTopComponent

Selector: base-blog-card-image-top Standalone: true

Pre-composed blog/article preview card with a top cover image, built from base-card, base-card-body, base-card-footer, base-avatar, and base-icon. Renders a lazy-loaded cover image that zooms on hover (with card lift and shadow), a category label, an article title, and a footer with author avatar/name plus calendar-date and comment-count icon stats. All content (image, category, title, author, date, comment count) is hard-coded in the template — there are no inputs or outputs; it serves as a static pro-tier block meant to be copied and customized. Uses ChangeDetectionStrategy.OnPush.


BlogCardInlineImageComponent

Selector: base-blog-card-inline-image Standalone: true

Blog post card with the article image inset between the title block and the footer (title above, full-width 180px cover image in the middle, meta footer below). Composes base-card, base-card-body, base-card-footer, base-avatar, and base-icon; hover applies a lift, shadow, and a slow image zoom. All content is hard-coded in the template (a "Latest" tag, title, assets/images/office.jpeg image, author avatar/name, calendar date, and comment count) — it is a copy-and-adapt pro-tier template with no configurable API. Uses OnPush change detection.


BlogCardMiniGridComponent

Selector: base-blog-card-mini-grid Standalone: true

Compact blog-list card built on base-card/base-card-body, rendering four hardcoded mini blog entries (64px square thumbnail plus bold title) in a responsive grid — single column on small screens, 2x2 on lg. Content is entirely static (no inputs): image paths and titles are baked into the template, images are lazy-loaded, and each item shows a hover effect (image zoom, title tint to indigo) via group/item. Uses OnPush change detection.


BlogCardNewsletterComponent

Selector: base-blog-card-newsletter Standalone: true

Static newsletter signup promo card styled as an indigo gradient panel, composed from base-card, base-card-body, and base-card-footer with a large decorative base-icon ("mail") watermark. Renders a fixed "Join the Club" heading and tagline, a plain email <input>, and a "Subscribe Now" button — none of which are wired to Angular forms, bindings, or events; consumers must attach their own submit handling. Uses OnPush change detection and has no configurable API.


BlogCardOverlayFeaturedComponent

Selector: base-blog-card-overlay-featured Standalone: true

Featured blog card with a full-bleed background image and a left-side gradient overlay panel (dark slate to transparent) containing an eyebrow label, large title, and excerpt, plus a footer row with author avatar, name, and a publish date (date hidden below the sm breakpoint). Composed from base-card, base-card-body, base-card-footer, base-avatar, and base-icon; on hover the card lifts with a shadow and the image scales up. All content (image, text, avatar URL, date) is hardcoded in the template — the component has no inputs or outputs and uses OnPush change detection, so it serves as a copy-and-customize pro-tier template.


BlogCardOverlayMarketingComponent

Selector: base-blog-card-overlay-marketing Standalone: true

Pre-styled marketing blog card with a full-bleed cover image and a bottom-anchored text overlay on a dark gradient. Renders a hardcoded category label ("Marketing"), title, author avatar/name, date, and comment count — all content is static in the template (no inputs). Composes base-card, base-card-body, base-card-footer, base-avatar, and base-icon, with hover effects (lift, shadow, image zoom) and OnPush change detection; the date/calendar segment is hidden below the sm breakpoint.


BlogCardQuoteComponent

Selector: base-blog-card-quote Standalone: true

Pre-styled blog quote card with fully static content: an orange-tinted base-card (left orange accent border, light/dark variants) containing a large serif italic pull-quote, a decorative rotated quotation-mark SVG watermark, and a footer with a base-avatar plus hardcoded author role/name attribution. Composes CardComponent, CardBodyComponent, CardFooterComponent, and AvatarComponent; uses OnPush change detection. Has no inputs or outputs — the quote text, avatar URL, and attribution are hardcoded in the template, and hover applies a lift/shadow transition.


BlogCardSplitImageComponent

Selector: base-blog-card-split-image Standalone: true

Pre-composed blog post card with a split two-image header: two side-by-side cover images (each 50% width) above a category label, title, and a footer with author avatar/name plus date and comment-count icon stats. Built from base-card, base-card-body, base-card-footer, base-avatar, and base-icon; on hover the card lifts with a shadow and both images zoom slightly. All content (images, category, title, author, date, comment count) is hard-coded in the template — the component exposes no inputs or outputs, so customization requires copying the template. Uses OnPush change detection.


BlogCardStatsComponent

Selector: base-blog-card-stats Standalone: true

Preset statistic blog card built from base-card, base-card-body, and base-card-footer. Renders a large hardcoded stat number ("837") with a caption, and a footer row of three overlapping base-avatar circles (hardcoded pravatar.cc image URLs) that spread apart on hover. Fully static — all content is baked into the template with no inputs, outputs, or content projection; uses OnPush change detection and includes hover lift/shadow styling with light/dark theme classes.


BlogCardVideoComponent

Selector: base-blog-card-video Standalone: true

Static video-teaser blog card built on base-card/base-card-body: a full-bleed cover image (hardcoded to assets/images/modern_office_architecture_1776362675453.png) under a dark overlay with a centered frosted-glass "Play Video" pill containing a play-circle icon. On hover the card lifts with a larger shadow, the image scales up, and the overlay fades out. Uses OnPush change detection; it has no inputs or outputs, so the image, label, and click handling cannot be configured — consumers must bind their own click listener on the host.


Article Cards

Long-form article presentation blocks. Pro tier — requires a license.

ArticleCardEditorialComponent

Selector: base-article-card-editorial Standalone: true

Editorial-style article card with fully hard-coded demo content, composed from base-card/base-card-body. Renders a timestamp header with share/more icon buttons, a headline, lead paragraph, a base-quote pull quote with author attribution, a lazy-loaded hero image with photo credit and carousel-dot indicators, an author byline row (base-avatar + name) with Facebook/X/LinkedIn share icons, and a comments footer with a count and an outline "View comments" button. Uses OnPush change detection; it has no inputs or outputs, so it serves as a copyable layout template rather than a configurable component.


ArticleCardFullReaderComponent

Selector: base-article-card-full-reader Standalone: true

Full article reading experience rendered inside a base-card: byline header with prev/more icon buttons, centered title, view/comment/share stats, hero image with caption, numbered content sections (one with a side-by-side image layout), an avatar-left base-quote block, an author/share footer with social icons, a 3-column "Related News" grid, a threaded comments list (including a highlighted reply), and a comment composer (base-textarea with an attach icon button and a full-width "Post Comment" button). All content is hardcoded demo copy — the component has no inputs or outputs and uses OnPush change detection. Composes CardComponent, CardBodyComponent, QuoteComponent, AvatarComponent, IconComponent, InputGroupComponent, and the base-button / base-icon-button / base-textarea directives.


ArticleCardHeroGalleryComponent

Selector: base-article-card-hero-gallery Standalone: true

Static, pre-composed article card (pro tier) with a full-width hero image section and a mini image gallery. The hero area layers a dark overlay over the image and shows an "Explore" label, share/more icon buttons, date, title, and author avatar; the card body renders a lead paragraph, a base-quote (icon-top variant), a 3-image gallery grid with a hover zoom overlay on the middle image, a bullet list section, tag badges, a views/share row, and a comments footer with an "Add Comment" button. All content (text, images, counts) is hardcoded in the template — the component has no inputs or outputs and uses OnPush change detection; it composes CardComponent, CardBodyComponent, IconButtonDirective, IconComponent, QuoteComponent, AvatarComponent, BaseButtonDirective, and BadgeComponent.


ArticleCardHeroTagsComponent

Selector: base-article-card-hero-tags Standalone: true

Pre-composed article/blog-post card with a full-bleed hero image header (dark overlay, back/share/more icon buttons, date, title, and view count rendered over the image). The body contains static article copy with an inline image split, a tag row of base-badge chips, a share bar with social icons, and a comments section featuring a text comment, a mock voice-note comment with a play button and audio-waveform bars, and a "Login to add comment" footer. All content is hardcoded (no inputs/outputs); uses OnPush change detection and composes base-card, base-card-body, base-icon, base-avatar, base-badge, and the base-button/base-icon-button directives.


Ecommerce Blocks

Storefront sections (hero banners, product detail, promos). Pro tier — requires a license.

EcommerceBlockDualPromoComponent

Selector: base-ecommerce-block-dual-promo Standalone: true

Static two-column promo row (stacking to one column below lg): a product spotlight card with a "Just In" base-badge, product title, price, image, and a primary "Shop Now" button, alongside a full-bleed image sale banner with a dark overlay, headline, and a white "Shop Sale" button. The banner image zooms slightly on hover. All content (copy, prices, /assets/demo/ images) is hardcoded in the template — the component has no configurable API. Uses OnPush change detection; composes BadgeComponent and BaseButtonDirective.


EcommerceBlockHeroBannerComponent

Selector: base-ecommerce-block-hero-banner Standalone: true

Full-width ecommerce hero banner block with a fixed-height (600px) rounded background image, a dark overlay, and centered content: a heading, a subtitle, and a pill-shaped "Explore Now" CTA rendered with [base-button] (color="primary"). All content is hardcoded (including the background image at /assets/demo/drone.png) — the component exposes no inputs, outputs, or content projection. Uses OnPush change detection.


EcommerceBlockLifestyleGridComponent

Selector: base-ecommerce-block-lifestyle-grid Standalone: true

Static, presentational ecommerce lifestyle grid block with hardcoded demo content: a large hero image tile ("Denim Collection") with a gradient overlay and a "Shop Collection" button (via BaseButtonDirective), a featured product card (portable speaker with name and price), and a stacked column of two smaller cards (a wireless headphones product card and an "Accessories" lifestyle image tile). Responsive layout goes from a single column to 2 columns at md and 4 columns at lg, with hover scale/shadow transitions on each tile; uses OnPush change detection. Images are loaded lazily from /assets/demo/, and all content is fixed in the template — the component has no inputs, outputs, or content projection.


EcommerceBlockProductDetailComponent

Selector: base-ecommerce-block-product-detail Standalone: true

Pre-built (pro tier) horizontal product detail block: a two-column card with product info on the left and a full-bleed product image on the right. Renders a fixed 4.5-star rating (base-star) with review count, hardcoded product title/price/description, a size selector built from base-radio-group/base-radio-button, color swatch buttons, a quantity base-input-spinner (min 1, max 10), an "Add to Bag" base-button, and a heart base-icon-button wishlist action. All content is static demo copy — the component has no configurable API; uses OnPush change detection.


EcommerceBlockProductTabsComponent

Selector: base-ecommerce-block-product-tabs Standalone: true

Static pro-tier ecommerce block rendering a split product detail layout: a large product image panel on the left and, on the right, the product name, price with an "In Stock" tonal success badge, and an underline-type base-tabs group with three tabs — Overview (description plus a check-icon feature list), Specifications (label/value spec rows), and Reviews (a base-star 4.8 rating and a quoted review). Below the tabs it renders a full-width primary "Add to Cart" button and "Share" / "Ask a question" link buttons. All content (copy, price, rating, image) is hardcoded in the template; the component class is empty with ChangeDetectionStrategy.OnPush and composes BadgeComponent, IconComponent, StarComponent, the tabs family, and the base-button/base-link directives.


EcommerceBlockSplitBannerComponent

Selector: base-ecommerce-block-split-banner Standalone: true

Split ecommerce banner block with marketing copy on one side and a product image on the other, arranged in a responsive two-column grid (stacked on small screens) inside a rounded container. The copy side renders a "Limited Edition" base-badge, product heading, description, price, and a rounded "Shop Now" base-button; the image side shows a lazily loaded demo speaker image (/assets/demo/speaker.png). All content is hardcoded — the component has no inputs, outputs, or projected content, and uses OnPush change detection.


Media Widgets

Audio/video players, playlists and media cards. Pro tier — requires a license.

MediaWidgetAlbumCarouselComponent

Selector: base-media-widget-album-carousel Standalone: true

Pre-built media widget (pro tier) rendering a base-card containing a base-horizontal-carousel titled "Albums" with eight hard-coded album items. Each item shows a lazy-loaded square cover image with hover effects (lift, image zoom, dark blurred overlay revealing Play and Bookmark base-icon-buttons), album title, artist name, and a base-star-rating/base-star rating with a base-tooltip showing the numeric value. Uses OnPush change detection; entirely static content with no configurable API — customize by copying the template.


MediaWidgetAlbumPlayerComponent

Selector: base-media-widget-album-player Standalone: true

Static album-player media widget rendered inside a base-card: a cover-image panel with share/bookmark/download icon buttons and an album info overlay (artist, title, stats), beside a scrollable track list where the active track shows animated equalizer bars, plus a footer bar with previous/pause/next icon buttons and a mock volume slider (hidden below the sm breakpoint). All content (image, artist, tracks, durations) is hardcoded in the template — the component has no inputs, outputs, or state, uses OnPush change detection, and composes CardComponent, IconButtonDirective, and IconComponent. The playback controls and track rows are visual only; clicking them triggers no behavior.


MediaWidgetAudioPlayerCompactComponent

Selector: base-media-widget-audio-player-compact Standalone: true

Compact audio-player media widget rendered inside a base-card: a round stroked pause icon-button, hard-coded track title/artist ("Hold On, We're Going Home" / "Drake"), a "more" icon-button, a decorative static waveform made of bars, elapsed/total time labels, like and play-count stats, and a hover-revealed volume slider mock. Entirely presentational with all content hard-coded — no inputs, outputs, or playback logic; uses OnPush change detection and composes CardComponent, IconButtonDirective, IconStrokedButtonDirective, and IconComponent from the library.


MediaWidgetAudioPlayerDarkComponent

Selector: base-media-widget-audio-player-dark Standalone: true

Static dark-themed audio player widget rendered inside a base-card with a forced bg-slate-900! background (always dark regardless of theme). Displays hardcoded demo content: a "Radio NRJ 104.2" station header with a "more" icon button, a round stroked pause button, track title/artist ("Freedom" — Pharrell Williams), a decorative six-bar equalizer visualization, a listener count line, and a purely visual volume slider whose thumb appears on hover. Uses OnPush change detection; purely presentational — no inputs, outputs, or playback logic.


MediaWidgetAudioPlayerHeroComponent

Selector: base-media-widget-audio-player-hero Standalone: true

Full-height hero audio player card (pro tier) built on base-card. Renders a cover image with a dark gradient overlay containing a bookmark icon button, a genre badge, and the track title/artist, above a control panel with a static progress bar (hardcoded times and 1/3 progress) and shuffle/backward/play/forward/refresh icon buttons. Purely presentational: all content (image, track metadata, times) is hardcoded, the control buttons have aria-labels but no click handlers, and the component uses OnPush change detection with no state.


MediaWidgetPlaylistComponent

Selector: base-media-widget-playlist Standalone: true

Static (display-only) music playlist widget rendered inside a base-card: a "Playlist" header with a more-options icon button, a transport bar with backward/pause/forward icon buttons and a decorative hover-reveal volume slider (shown only at smlg and xl+ breakpoints), and a vertically scrollable list of ten hard-coded demo tracks, each with a play/pause icon button, artist/title text, and duration — one track is styled as active. Uses OnPush change detection and composes CardComponent, IconButtonDirective, and IconComponent; all content is fixed in the template, so the component has no inputs, outputs, or interactive logic beyond the static markup.


MediaWidgetRelatedVideosComponent

Selector: base-media-widget-related-videos Standalone: true

Static "Related Videos" showcase widget rendered inside a base-card: a header row with a "Related Videos" title and a transparent base-icon-button ("More"), above a vertically scrollable list of seven hardcoded video entries. Each entry shows a lazy-loaded thumbnail with a hover play-icon overlay and duration badge, a two-line clamped title, and views/age metadata, with hover scale/shadow/color transitions and full light/dark styling. Uses OnPush change detection; it has no inputs or outputs — all content (titles, durations, assets/images/gallery/slide-*.png thumbnails) is fixed demo data.


MediaWidgetTopSinglesComponent

Selector: base-media-widget-top-singles Standalone: true

Music chart card ("Top Singles") built on base-card, with a header row containing a "More" icon button, a Week/Month/Year tab strip (static, non-interactive — "Week" is styled as selected), and a hardcoded ranked list of 5 tracks showing rank number, cover image, title/artist, and an up/down/steady trend icon. Uses ChangeDetectionStrategy.OnPush; all content is static demo data (no inputs, outputs, or injected services) — track images load from assets/images/gallery/. Fully styled for light and dark mode.


MediaWidgetVideoHeroComponent

Selector: base-media-widget-video-hero Standalone: true

Pro-tier showcase widget rendering a static video-player hero inside a base-card with a 16:9 (aspect-video) frame. Shows a cover image with a centered play button that fades out on hover, while hover reveals a top overlay (avatar, title, share/info icon buttons) and a bottom control bar (backward/pause/forward transport buttons, timestamps, a decorative progress bar with hover scrubber thumb, a volume slider hidden below md, a quality base-select, and a maximize button). Purely presentational with hardcoded demo content — no inputs, outputs, or playback logic; composes CardComponent, IconButtonDirective, IconStrokedButtonDirective, IconComponent, AvatarComponent, and SelectComponent, and uses OnPush change detection.


MediaWidgetVideoPostComponent

Selector: base-media-widget-video-post Standalone: true

Pre-composed social video post card (pro tier) built on base-card, using OnPush change detection. Renders a hardcoded demo layout: a 21/10 cover image (loaded from assets/images/gallery/slide-3.png, with the avatar from assets/images/avatar2.jpeg) with gradient overlay, author avatar/name/follower count, a white "Follow" stroked button, a centered play icon button that fades out on hover, a faux red playback progress bar, hover-revealed duration and volume/settings/maximize control icons, followed by a date, title, clamped description, and a footer with likes/views/comments counters plus share/link/flag icon buttons. All content is static — the component class is empty with no inputs or outputs; customization requires editing the template or overriding classes.


Social Widgets

Social feed, profile, chat and engagement blocks. Pro tier — requires a license.

SocialWidgetActivityComponent

Selector: base-social-widget-activity Standalone: true

Static, presentational social activity feed widget built on base-card with OnPush change detection. Renders a card header with an "Activity" title and a "Mark all read" button (visual only — no click handler is wired), followed by three hardcoded activity entries (a like, a comment with a quoted reply bubble, and a new follower), each with a colored circular base-icon bubble (heart, message, user-plus) joined by a dashed vertical timeline and an uppercase relative timestamp. All content is fixed in the template; there is no data binding, so it serves as a demo/showcase widget rather than a configurable component.


SocialWidgetArticleCommentsComponent

Selector: base-social-widget-article-comments Standalone: true

Static social-feed article card with a comment thread, composed from base-card, base-avatar, base-icon, base-icon-button, and base-button. Renders a hardcoded publisher header, article title/excerpt with hero image, an engagement row (overlapping liker avatars, like/comment/share counts), Like and Comment action buttons, two sample comments (the second indented as a reply), and a "Write a comment..." input with star and plus-circle icon buttons. Uses OnPush change detection; all content is placeholder copy with no inputs, outputs, or interactive logic — customize by editing the template.


SocialWidgetCalendarComponent

Selector: base-social-widget-calendar Standalone: true

Pro-tier social widget that renders the library's CalendarComponent (<base-calendar>) horizontally centered via mx-auto. A thin presentational wrapper with OnPush change detection; it exposes no configuration of its own — all calendar behavior comes from the embedded base-calendar.


SocialWidgetChatComponent

Selector: base-social-widget-chat Standalone: true

Static, fixed-height (540px) one-to-one chat conversation mockup rendered inside a base-card. Shows a header with the contact's avatar, green online-status dot, back and "more" buttons; a scrollable message thread with a "Today" date separator, incoming text and image bubbles, an outgoing bubble with timestamp and read-receipt check icon; and a composer footer with a text input plus attach, star, and send buttons. All content is hardcoded placeholder data — the component has no inputs, outputs, or interactive logic (buttons and input are visual only), and uses OnPush change detection. Composes CardComponent, AvatarComponent, IconComponent, and IconButtonDirective.


SocialWidgetFeedPostComponent

Selector: base-social-widget-feed-post Standalone: true

Pre-built social feed post widget: a base-card with a header row (avatar, author name, timestamp, and a "more" icon button), a fixed-height cover image, and a footer action bar with like, comment, and share buttons showing hardcoded counts. All content (avatar URL, name, image, counts) is static — the component has no inputs or outputs and uses OnPush change detection. Composes CardComponent, AvatarComponent, IconComponent, and IconButtonDirective; the action buttons apply hover color transitions but emit no events.


SocialWidgetFollowSuggestionsComponent

Selector: base-social-widget-follow-suggestions Standalone: true

Static "Who to follow" social suggestion card built from base-card, base-card-header, and base-card-body, with a "View All" text button in the header. Renders three hardcoded suggestion rows, each with a small circular base-avatar, name, @handle, and a Follow (base-stroked-button) or Following (base-button color="primary") action button. Uses OnPush change detection; all user data is hardcoded in the template and no click handlers are wired — it is a presentational demo widget with no configurable API.


SocialWidgetImageCaptionComponent

Selector: base-social-widget-image-caption Standalone: true

Social-media style image card (pro tier) rendering a fixed-height (h-80) base-card with a full-bleed background photo and gradient overlays. The top overlay shows a base-avatar with a username and a "more" icon button (base-icon-button with the more-horisontal icon); the bottom overlay shows a caption headline, a location row with a map-pin icon, and a heart icon with a like count. All content (image path, avatar URL, texts, counts) is hardcoded in the template — the component is a static showcase block with OnPush change detection and no configurable API.


SocialWidgetImageOverlayComponent

Selector: base-social-widget-image-overlay Standalone: true

Social media post card with a full-bleed background image and gradient overlays (fixed height h-80, OnPush). The top overlay shows a hardcoded author avatar (base-avatar), name ("Philip Drake"), and a "more-horisontal" stroked icon button; the bottom overlay shows hardcoded like (2.6k) and comment (384) counts with heart/message icons. All content is static — the component has no configurable API and composes CardComponent, AvatarComponent, IconComponent, and IconStrokedButtonDirective from the library.


SocialWidgetInboxComponent

Selector: base-social-widget-inbox Standalone: true

Compact inbox/message-list card: a header with an "Inbox" title, unread-count base-badge, and a search icon button, above a divided list of three conversation rows (avatar with online dot, sender name, one-line message preview, timestamp). The first row is styled as unread/active with a blue left border and tinted background. All conversations are hardcoded demo content — no inputs or outputs; OnPush change detection; composes base-card, base-card-header, base-card-body, base-avatar, base-badge, base-icon, and base-icon-button.


SocialWidgetPlatformStatsComponent

Selector: `base-social-widget-platform-stats$ \text{Standalone}: \text{true}

2 \times 2 \text{grid} \text{of} \text{social}-\text{platform} \text{stat} \text{tiles} (\text{Facebook} \text{likes}, \text{X}/\text{Twitter} \text{followers}, \text{Instagram} \text{tags}, \text{video} \text{subs}), \text{each} \text{a} $base-cardwith a platformbase-icon`, a large count, and an uppercase label, with hover lift/shadow effects. All four tiles are hardcoded demo content — no inputs or outputs; OnPush change detection.


SocialWidgetProfileCenteredComponent

Selector: base-social-widget-profile-centered Standalone: true

Centered profile card: gradient cover strip with a settings icon button, an overlapping circular base-avatar, name, @handle, an italic bio quote, and a 3-column Posts/Followers/Following stats row divided by hairlines. All profile content is hardcoded demo copy — no inputs or outputs; OnPush change detection; composes base-card, base-card-body, base-avatar, and base-icon.


SocialWidgetProfileCoverComponent

Selector: base-social-widget-profile-cover Standalone: true

Profile card with a photo cover: a 160px lazy-loaded cover image (hover zoom, dark gradient overlay) with the avatar, name, and role overlaid bottom-left; below it a 3-column Photos/Followers/Following stats row, "Send Message" (base-button primary) and "Follow" (base-stroked-button) actions, and a footer with a location pin and X/Instagram/link social icons. All content is hardcoded demo copy — no inputs or outputs; OnPush change detection. Note: the cover references assets/images/breathtaking_nature_mountain_*.png, which ships with the demo app, not the icon sprites — swap in your own image.


SocialWidgetSettingsMenuComponent

Selector: base-social-widget-settings-menu Standalone: true

Account/settings menu card: a blue gradient header with avatar, name, plan label and an "Upgrade to Pro" base-stroked-button, followed by a divided menu of three rows (Account Settings, Notifications with an unread dot, Privacy) each with a tinted icon bubble, title, subtitle, and chevron, and a "Log Out Everywhere" footer action. All content is hardcoded demo copy — no inputs or outputs; OnPush change detection; composes base-card, base-avatar, base-icon, and base-stroked-button.


SocialWidgetTextPostComponent

Selector: base-social-widget-text-post Standalone: true

Text-only social post card: author header (avatar, name, @handle · time, more icon button), a short text body, and a footer bar with reply/repost/like buttons and counts. All post content is hardcoded demo copy — no inputs or outputs; OnPush change detection; composes base-card, base-card-body, base-card-footer, base-avatar, base-icon, and base-icon-button.


SocialWidgetTrendingTopicsComponent

Selector: base-social-widget-trending-topics Standalone: true

"Trending Topics" card with a wrap of hashtag pill chips (#photography, #uiux, #angular highlighted in blue, #frontend, #webdesign) with hover states. All chips are hardcoded demo content — no inputs or outputs; OnPush change detection; composes base-card.


SocialWidgetUploadDropzoneComponent

Selector: base-social-widget-upload-dropzone Standalone: true

Thin preset wrapper around base-file-upload configured as a multi-file dropzone ("Drop files here to upload"). It exposes no inputs or outputs of its own — use FileUploadComponent directly for events and configuration; this block exists as a copy-ready showcase variant. OnPush change detection.


Utilities

SpinnerComponent

Selector: base-spinner Standalone: true

A standard circular loading spinner component. Uses CSS animations for a smooth spinning effect.

Inputs:

NameTypeDefaultDescription
size'sm' | 'md' | 'lg' | 'xl''md'The diameter/thickness of the loading spinner.
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'inverted''primary'The semantic color variant. Use 'inverted' for white spinners on dark backgrounds.

SpinnerWrapperComponent

Selector: base-spinner-wrapper Standalone: true

A wrapper to center a spinner within a block or the entire page. Provides a backdrop that can be dark or light.

Inputs:

NameTypeDefaultDescription
backdrop'dark' | 'light''light'The backdrop style behind the spinner.

ProgressComponent

Selector: base-progress Standalone: true

A linear progress bar. On hover (or keyboard focus), a tip bubble appears at the leading edge of the fill showing the current percentage. Disable with [showTip]="false".

Inputs:

NameTypeDefaultDescription
valuenumber0The current progress value (0 to 100).
color'primary' | 'success' | 'danger' | 'warning' | 'accent''primary'The semantic color variant of the progress bar.
size'sm' | 'md' | 'lg' | 'xl''md'The height/thickness of the progress bar.
showTipbooleantrueShow the value tip at the fill edge on hover/focus.
classstring''Extra host classes.

MeterGroupComponent

Selector: base-meter-group Standalone: true

Stacked multi-value meter with optional legend. Pass MeterGroupItem[] (label, value, optional color / icon). Segment widths are proportional to values (or to optional max). Free tier. Install: npx base-ui-cli add meter-group.

Inputs:

NameTypeDefaultDescription
valueMeterGroupItem[][]Segments to render.
size'sm' | 'md' | 'lg' | 'xl''md'Bar thickness.
maxnumbersum of valuesOptional capacity baseline.
showLegendbooleantrueShow legend under the bar.
showValuebooleantrueShow absolute values in the legend.
showPercentbooleantrueShow percentage share in the legend.
classstring''Extra host classes.

CodeComponent

Selector: base-code Standalone: true

A component to display formatted code blocks with syntax highlighting and a copy-to-clipboard button. Supports HTML, TypeScript, JavaScript, and Bash highlighting.

Inputs:

NameTypeDefaultDescription
languagestring''The programming language of the code (e.g. 'HTML', 'TypeScript', 'Bash'). Used for syntax highlighting.
showCodebooleanfalseIf true, the code block is expanded and visible by default.

ComingSoonComponent

Selector: base-coming-soon Standalone: true

A placeholder component used to indicate that a feature or page is under construction. Displays a shimmer effect and customizable text.

Inputs:

NameTypeDefaultDescription
titlestring''The primary heading text to display.
descriptionstring''The secondary descriptive text providing more context.

EmptyStateComponent

Selector: base-empty-state Standalone: true

A standard layout component to display when a list or view has no data. Centers an icon, title, and description.

Inputs:

NameTypeDefaultDescription
iconNamestringThe name of the SVG icon to display at the top.
titlestringThe primary heading text.
descriptionstringThe secondary body text explaining the empty state.

QuoteComponent

Selector: base-quote Standalone: true

A stylized blockquote component for displaying testimonials, reviews, or pull quotes.

Inputs:

NameTypeDefaultDescription
variant'default' | 'border-left' | 'icon-top' | 'avatar-left''default'The structural and visual layout variant of the quote.
authorNamestringThe name of the person being quoted.
authorRolestringThe subtitle or role of the author.
avatarUrlstringThe URL to the author's avatar image.
iconColor'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'default' | string'primary'The semantic color name for the quote icon.

RichTextEditorComponent

Selector: base-rich-text-editor Standalone: true

Lightweight WYSIWYG editor with a themed toolbar (base-stroked-icon-button, tooltips, dropdown, divider) and a contenteditable body. Implements ControlValueAccessor — value is an HTML string. Toolbar: undo/redo, block style (p/h1–h3), bold/italic/underline/strike, bullet/numbered lists, alignment, link, clear formatting. Pro tier (npx base-ui-cli add rich-text-editor).

Inputs:

NameTypeDefaultDescription
classstring''Extra host classes merged via cn().
placeholderstring'Write something...'Shown when the editor is empty.
minHeightnumber180Minimum editable area height in pixels.
ariaLabelstring'Rich text editor'Accessible label for the editable region.

Directives

BaseButtonDirective

Selector: [base-button] Standalone: true

A standard button directive applying Lussos theme styles.

Inputs:

NameTypeDefaultDescription
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'white' | 'black' | 'default' | 'transparent' | string'default'The semantic visual color.
size'sm' | 'default' | 'lg' | 'xl' | 'xxl''default'The size of the button.
widthstringOptional custom width (e.g. '100%').

StrokedButtonDirective

Selector: [base-stroked-button] Standalone: true

A stroked button directive applying Lussos theme styles.

Inputs:

NameTypeDefaultDescription
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'white' | 'black' | 'default''default'The semantic visual color.
size'sm' | 'default' | 'lg' | 'xl' | 'xxl''default'The size of the button.
widthstringOptional custom width (e.g. '100%').

IconButtonDirective

Selector: [base-icon-button] Standalone: true

An icon-only button directive applying Lussos theme styles.

Inputs:

NameTypeDefaultDescription
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'white' | 'black' | 'default' | 'transparent' | string'default'The semantic visual color.
size'sm' | 'default' | 'lg' | 'xl' | 'xxl''default'The size of the button.

IconStrokedButtonDirective

Selector: [base-stroked-icon-button] Standalone: true

A stroked icon-only button directive applying Lussos theme styles.

Inputs:

NameTypeDefaultDescription
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'white' | 'black' | 'default''default'The semantic visual color.
size'sm' | 'default' | 'lg' | 'xl' | 'xxl''default'The size of the button.

BaseLinkDirective

Selector: [base-link] Standalone: true

A link directive applying Lussos theme styles. Use this to style inline anchors and links.

Inputs:

NameTypeDefaultDescription
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'default''default'The semantic visual color.
size'sm' | 'default' | 'lg' | 'xl''default'The size of the link.
widthstringOptional custom width (e.g. '100%').

BaseInputDirective

Selector: [base-input] Standalone: true

A standard input directive that applies consistent Lussos theme styling to native text inputs. Supports disabled and readonly states.

No inputs.


BaseMaskDirective

Selector: input[baseMask] Standalone: true

Dynamically masks a native <input> while typing. Pair with [base-input] for styling. Form controls receive the masked display value; use unmaskInputValue() / unmaskedValue() for raw characters.

Tokens: 0 digit, A letter, S alphanumeric; any other character is a literal.

Inputs:

NameTypeDefaultDescription
baseMaskstring— (required)Mask pattern, e.g. (000) 000-0000, 00/00/0000, AAAA-0000.

Helpers (exported): applyInputMask(value, pattern), unmaskInputValue(masked, pattern).


BaseTextareaDirective

Selector: [base-textarea] Standalone: true

A standard textarea directive that applies consistent Lussos theme styling.

No inputs.


BaseAddonStartDirective

Selector: [base-addon-start] Standalone: true

An element positioned at the start of an input group.

No inputs.


BaseAddonEndDirective

Selector: [base-addon-end] Standalone: true

An element positioned at the end of an input group.

No inputs.


BaseHeadingDirective

Selector: [baseHeadingText] Standalone: true

Applies standardized heading typography styles to an element.

No inputs.


BaseListItemDirective

Selector: [base-list-item] Standalone: true

A stylistic directive that applies standardized padding, height, and hover effects for an item within a generic list view.

No inputs.


BaseGroupButtonDirective

Selector: [base-group-button] Standalone: true

A standard group button directive applying Lussos theme styles.

Inputs:

NameTypeDefaultDescription
color'primary' | 'success' | 'danger' | 'warning' | 'accent' | 'transparent' | 'default' | string'default'The semantic visual color.
size'sm' | 'default' | 'lg' | 'xl' | 'xxl' | string'default'The size of the group button.
widthstring''Optional custom width (e.g. '100%').

ContainerDirective

Selector: [container] Standalone: true

A structural directive that forces the host element to act as a centered, max-width container. Limits width to 1280px and provides standard horizontal padding.

No inputs.


CodeDirective

Selector: [code] Standalone: true

A stylistic directive that applies monospace font and code-block styling to inline elements.

No inputs.


Selector: [base-dropdown-menu-trigger] Standalone: true

A directive that attaches a base-dropdown-menu to a trigger element (like a button). Automatically handles overlay positioning, backdrop clicks, and detachment. Supports cascading submenus: put [base-dropdown-menu-trigger] on a menu item with placement="right" (or left). Nested menus open on hover once the parent cascade is open; leaf clicks and outside clicks close.

Inputs:

NameTypeDefaultDescription
placement'start' | 'end' | 'left' | 'right' | 'top-start' | 'top-end''end'The physical placement of the dropdown relative to the trigger.
dropdownPanel (via [base-dropdown-menu-trigger])DropdownPanel<T>The reference to the base-dropdown-menu component to open.

BaseDropdownMenuItemDirective

Selector: [base-dropdown-menu-item] Standalone: true

A stylistic directive that applies standard padding, hover effects, and typography to an element to make it look like a dropdown menu item.

Inputs:

NameTypeDefaultDescription
stayOpenbooleanfalseKeep the dropdown open after this item is clicked.

DrawerDirective

Selector: [base-drawer] Standalone: true

A directive that attaches a base-drawer to a trigger element (like a button). Automatically handles the overlay backdrop and click-to-open behavior.

Inputs:

NameTypeDefaultDescription
placement'left' | 'right' | 'top' | 'bottom' | string'right'The edge of the screen to slide the drawer in from.
drawerPanel (via [base-drawer])DrawerPanel<T>The reference to the base-drawer component to open.

ClickOutsideDirective

Selector: [baseClickOutside] Standalone: true

A behavior directive that emits an event whenever the user clicks outside the host element's bounds. Useful for closing dropdowns, drawers, or modals.

Outputs:

NameEmit TypeDescription
baseClickOutsideMouseEventEvent emitted when a click occurs outside the host element.

RevealDirective

Selector: [baseReveal] Standalone: true

Reveals the host element with a fade + slide-up animation the first time it scrolls into the viewport (IntersectionObserver). Respects prefers-reduced-motion and is a no-op during SSR.

Inputs:

NameTypeDefaultDescription
revealDelaynumber0Delay in ms before the animation starts once visible. Use for staggering grids.
revealTranslatenumber24Distance in px the element travels upward while revealing.
revealDurationnumber600Animation duration in ms.

ScrollToDirective

Selector: [baseScrollTo] Standalone: true

A behavior directive that smoothly scrolls the window to a target element when the host is clicked.

Inputs:

NameTypeDefaultDescription
target (via [baseScrollTo])string''A valid CSS selector (like an ID '#my-div') specifying the target to scroll to.

ScrollNavItemDirective

Selector: [base-scroll-nav-item] Standalone: true

A directive to link a navigation item to a specific element ID in a base-scroll-nav layout. Automatically receives an active class when its target element is scrolled into view.

Inputs:

NameTypeDefaultDescription
elementId (via [base-scroll-nav-item])string''The HTML id of the target element in the content area to scroll to.
isActivebooleanWhether this nav item is currently active.

Outputs:

NameEmit TypeDescription
clickedScrollNavItemDirectiveEmitted when the nav item is clicked.

BaseTabIconDirective

Selector: [baseTabIcon] Standalone: true

A structural directive that styles a <base-icon> projected inside a base-tab-label. Automatically applies the correct sizing and stroke colors.

Inputs:

NameTypeDefaultDescription
typestring'default'Optional variant type for the icon style.

BaseBadgeIconDirective

Selector: [badge-icon] Standalone: true

Applies badge styling to an icon.

Inputs:

NameTypeDefaultDescription
colorstring'red'Tailwind color name (e.g. 'red', 'blue', 'green').
sizestring'16'Numeric Tailwind spacing size for width and height.

BaseBadgeAddon

Selector: [base-badge-addon] Standalone: true

An addon element for a badge, typically used for small icons or indicators inside the badge.

Inputs:

NameTypeDefaultDescription
colorstring'primary'The color variant.
sizestring'md'The size variant.
widthstring''Optional custom width.

SliderDirective

Selector: [baseSlider] Standalone: true

A structural directive that wraps elements inside a slider/carousel, adding touch-swipe support.

Outputs:

NameEmit TypeDescription
slideActionbooleanEmitted when a swipe gesture is detected (true = prev, false = next).

AlertDismissDirective

Selector: [baseAlertDismiss] Standalone: true

A directive that dismisses the parent base-alert when clicked.

No inputs or outputs.


DialogCloseDirective

Selector: [base-dialog-close] Standalone: true

A directive that automatically closes the current open dialog when the host element is clicked. Injects DialogContext to find the active dialog reference.

Inputs:

NameTypeDefaultDescription
ariaLabelstringOptional aria-label for accessibility.
typestring'button'The native button type.

DrawerPanel (Interface)

Selector: N/A (Interface)

Interface that a drawer component must satisfy for use with the [base-drawer-trigger] directive.

Properties:

  • templateRef: TemplateRef<T>
  • closed: EventEmitter<void>

Selector: N/A (Interface)

Interface that a dropdown component must satisfy for use with the [base-dropdown-menu-trigger] directive.

Properties:

  • templateRef: TemplateRef<T>
  • closed: EventEmitter<void>

DialogContainer (Interface)

Selector: N/A (Interface)

Interface that a dialog container must satisfy. The default implementation is DialogContainerComponent.

Properties:

  • context: DialogContext<any>
  • container: ViewContainerRef
  • className: string

DialogContext (Injectable)

Selector: N/A (Injectable)

Injected into every dynamically-opened dialog component to provide data and close/reject controls.

Properties:

  • data?: T

Methods:

  • close(result?: T): void — Closes the dialog with an optional result.
  • reject(reason?: T): void — Rejects the dialog with an optional reason.

Pipes

FilterPipe

Name: filter Standalone: true

A generic data transformation pipe that filters an array of objects or strings based on a search term. Capable of searching across multiple object properties recursively.

Usage:

{{ items | filter: searchQuery }}
{{ items | filter: searchQuery: 'name' }}
{{ items | filter: searchQuery: ['name', 'email'] }}

Services

ThemeService

providedIn: 'root'

A service that manages the application's light/dark mode state. SSR-safe: localStorage is only touched in the browser; the dark class is still applied to <html> during server render (default theme is dark).

Properties:

  • isDarkMode: Signal<boolean> — Whether the current theme is dark.

Methods:

  • toggleTheme(): void — Toggles between light and dark mode.
  • setTheme(theme: 'light' | 'dark'): void — Sets the theme explicitly and persists to localStorage (browser only).

SidebarService

providedIn: 'root'

A service to control the visibility state of the application sidebar.

Properties:

  • isOpen$: Observable<boolean> — Observable that emits sidebar open/close state.
  • isOpen: boolean — Current sidebar open state (synchronous getter).

Methods:

  • toggle(): void — Toggles the sidebar open/closed.
  • setOpen(open: boolean): void — Sets the sidebar open state explicitly.

CurrentScreenSizeService

providedIn: 'root'

A service that monitors viewport resizing and provides the current Tailwind breakpoint (XSmall, Small, Medium, Large, XLarge).

Properties:

  • currentScreenSize: string — The current screen size name.
  • size$: Observable<string> — Observable that emits on breakpoint changes.

DialogService

providedIn: 'root'

A service for dynamically rendering and managing dialogs/modals. SSR-safe: open() is a no-op on the server (returns of(undefined)). Overlay hosts are appended via injected DOCUMENT, not the global document.

Methods:

  • open<T>(type: Type<any>, data?: T, className?: string, options?: { hideOnBackdropClick?: boolean; containerType?: Type<any> }): Observable<TResult | undefined> — Opens a component dynamically inside a dialog container. Returns an Observable that emits the result when the dialog is closed. On the server, emits undefined immediately.

ToastService

providedIn: 'root'

Imperative toast API. Mounts a live region on first use — do not place base-toast-container in templates. Inject with inject(ToastService); do not add the service to imports. SSR-safe: skips DOM work off the browser and creates/appends the host via injected DOCUMENT.

Methods:

  • show(message: string, config?: ToastConfig): number — Shows a toast and returns its id. duration defaults to 4000ms; duration: 0 keeps it until dismissed.
  • success(message: string, config?: ToastConfig): number — Success toast (color: 'success', icon: 'check').
  • error(message: string, config?: ToastConfig): number — Error toast (color: 'danger').
  • warning(message: string, config?: ToastConfig): number — Warning toast.
  • info(message: string, config?: ToastConfig): number — Info toast.
  • promise<T>(promiseOrFn: Promise<T> | (() => Promise<T>), messages: ToastPromiseMessages<T>, config?: ToastConfig): Promise<T> — Loading toast that resolves to success or error when the promise settles.
  • dismiss(id: number): void — Dismisses a toast by id.
  • clearAll(): void — Dismisses every visible toast.

ToastConfig: color, duration, icon, position, action ({ label, onClick, dismiss? }).


ToggleButtonService

providedIn: 'root'

An internal service used by ButtonGroupComponent to coordinate toggle state among child GroupButtonComponent instances. You do not normally inject it directly.


Animations

All animations are exported as Angular animation triggers from animations.ts.

NameTypeDescription
dropdowntriggerSlide-down fade-in animation for dropdown menus and overlays.
openClosetriggerExpand/collapse animation for accordions and collapsible panels.
rotate180trigger180-degree rotation animation, useful for chevron toggles.
tabAnimationtriggerHorizontal slide animation for tab content panes.
buttonSlideRightToLefttriggerSlide-right-to-left animation for action buttons.
slideLefttriggerSlide-in from the left animation.
slideRighttriggerSlide-in from the right animation.
slideBottomtriggerSlide-in from the bottom animation.
slideToptriggerSlide-in from the top animation.

Utility Functions

cn()

cn(...inputs: ClassValue[]): string

Merges Tailwind classes safely, resolving conflicts using tailwind-merge and clsx. Use this to allow users to override default tailwind classes on components.


Token Exports

NameTypeDescription
GALLERY_SLIDER_TOKENInjectionTokenInjection token used internally by gallery slider components to share state.
RADIO_GROUPInjectionTokenInjection token for radio group coordination.

Type Exports

NameTypeDescription
CookieConsent'accepted' | 'rejected'Choice stored by base-cookie-banner and emitted on consentChange.