├── .editorconfig
├── .gitignore
├── .postcssrc.json
├── .prettierignore
├── .prettierrc.mjs
├── .vscode
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
├── LICENSE
├── README.md
├── angular.json
├── components.json
├── eslint.config.js
├── netlify.toml
├── package.json
├── public
└── favicon.ico
├── src
├── app
│ ├── app.component.ts
│ ├── app.config.server.ts
│ ├── app.config.ts
│ ├── app.routes.ts
│ ├── components
│ │ ├── accordion
│ │ │ ├── accordion-01.component.ts
│ │ │ ├── accordion-02.component.ts
│ │ │ ├── accordion-03.component.ts
│ │ │ ├── accordion-04.component.ts
│ │ │ ├── accordion-05.component.ts
│ │ │ ├── accordion-06.component.ts
│ │ │ ├── accordion-07.component.ts
│ │ │ ├── accordion-08.component.ts
│ │ │ ├── accordion-09.component.ts
│ │ │ ├── accordion-10.component.ts
│ │ │ ├── accordion-11.component.ts
│ │ │ ├── accordion-12.component.ts
│ │ │ ├── accordion-13.component.ts
│ │ │ ├── accordion-14.component.ts
│ │ │ ├── accordion-15.component.ts
│ │ │ ├── accordion-16.component.ts
│ │ │ ├── accordion-17.component.ts
│ │ │ ├── accordion-18.component.ts
│ │ │ ├── accordion-19.component.ts
│ │ │ ├── accordion-20.component.ts
│ │ │ ├── accordion-21.component.ts
│ │ │ ├── accordion-22.component.ts
│ │ │ └── index.ts
│ │ ├── alert
│ │ │ ├── alert-01.component.ts
│ │ │ ├── alert-02.component.ts
│ │ │ ├── alert-03.component.ts
│ │ │ ├── alert-04.component.ts
│ │ │ ├── alert-05.component.ts
│ │ │ ├── alert-06.component.ts
│ │ │ ├── alert-07.component.ts
│ │ │ ├── alert-08.component.ts
│ │ │ ├── alert-09.component.ts
│ │ │ ├── alert-10.component.ts
│ │ │ ├── alert-11.component.ts
│ │ │ ├── alert-12.component.ts
│ │ │ ├── alert-13.component.ts
│ │ │ ├── alert-14.component.ts
│ │ │ ├── alert-15.component.ts
│ │ │ ├── alert-16.component.ts
│ │ │ ├── alert-17.component.ts
│ │ │ ├── alert-18.component.ts
│ │ │ └── index.ts
│ │ ├── avatar
│ │ │ ├── avatar-01.component.ts
│ │ │ ├── avatar-02.component.ts
│ │ │ ├── avatar-03.component.ts
│ │ │ ├── avatar-04.component.ts
│ │ │ ├── avatar-05.component.ts
│ │ │ ├── avatar-06.component.ts
│ │ │ ├── avatar-07.component.ts
│ │ │ ├── avatar-08.component.ts
│ │ │ ├── avatar-09.component.ts
│ │ │ ├── avatar-10.component.ts
│ │ │ ├── avatar-11.component.ts
│ │ │ ├── avatar-12.component.ts
│ │ │ ├── avatar-13.component.ts
│ │ │ ├── avatar-14.component.ts
│ │ │ ├── avatar-15.component.ts
│ │ │ ├── avatar-16.component.ts
│ │ │ ├── avatar-17.component.ts
│ │ │ ├── avatar-18.component.ts
│ │ │ ├── avatar-19.component.ts
│ │ │ ├── avatar-20.component.ts
│ │ │ ├── avatar-21.component.ts
│ │ │ ├── avatar-22.component.ts
│ │ │ └── index.ts
│ │ ├── badge
│ │ │ ├── badge-01.component.ts
│ │ │ ├── badge-02.component.ts
│ │ │ ├── badge-03.component.ts
│ │ │ ├── badge-04.component.ts
│ │ │ ├── badge-05.component.ts
│ │ │ ├── badge-06.component.ts
│ │ │ ├── badge-07.component.ts
│ │ │ ├── badge-08.component.ts
│ │ │ ├── badge-09.component.ts
│ │ │ ├── badge-10.component.ts
│ │ │ ├── badge-11.component.ts
│ │ │ ├── badge-12.component.ts
│ │ │ ├── badge-13.component.ts
│ │ │ ├── badge-14.component.ts
│ │ │ ├── badge-15.component.ts
│ │ │ ├── badge-16.component.ts
│ │ │ ├── badge-17.component.ts
│ │ │ ├── badge-18.component.ts
│ │ │ ├── badge-19.component.ts
│ │ │ ├── badge-20.component.ts
│ │ │ ├── badge-21.component.ts
│ │ │ ├── badge-22.component.ts
│ │ │ ├── badge-23.component.ts
│ │ │ └── index.ts
│ │ ├── banner
│ │ │ ├── banner-01.component.ts
│ │ │ ├── banner-02.component.ts
│ │ │ ├── banner-03.component.ts
│ │ │ ├── banner-04.component.ts
│ │ │ ├── banner-05.component.ts
│ │ │ ├── banner-06.component.ts
│ │ │ ├── banner-07.component.ts
│ │ │ ├── banner-08.component.ts
│ │ │ ├── banner-09.component.ts
│ │ │ ├── banner-10.component.ts
│ │ │ ├── banner-11.component.ts
│ │ │ └── index.ts
│ │ ├── breadcrumb
│ │ │ ├── breadcrumb-01.component.ts
│ │ │ ├── breadcrumb-02.component.ts
│ │ │ ├── breadcrumb-03.component.ts
│ │ │ ├── breadcrumb-04.component.ts
│ │ │ ├── breadcrumb-05.component.ts
│ │ │ ├── breadcrumb-06.component.ts
│ │ │ ├── breadcrumb-07.component.ts
│ │ │ ├── breadcrumb-08.component.ts
│ │ │ ├── breadcrumb-09.component.ts
│ │ │ └── index.ts
│ │ ├── button
│ │ │ ├── button-01.component.ts
│ │ │ ├── button-02.component.ts
│ │ │ ├── button-03.component.ts
│ │ │ ├── button-04.component.ts
│ │ │ ├── button-05.component.ts
│ │ │ ├── button-06.component.ts
│ │ │ ├── button-07.component.ts
│ │ │ ├── button-08.component.ts
│ │ │ ├── button-09.component.ts
│ │ │ ├── button-10.component.ts
│ │ │ ├── button-11.component.ts
│ │ │ ├── button-12.component.ts
│ │ │ ├── button-13.component.ts
│ │ │ ├── button-14.component.ts
│ │ │ ├── button-15.component.ts
│ │ │ ├── button-16.component.ts
│ │ │ ├── button-17.component.ts
│ │ │ ├── button-18.component.ts
│ │ │ ├── button-19.component.ts
│ │ │ ├── button-20.component.ts
│ │ │ ├── button-21.component.ts
│ │ │ ├── button-22.component.ts
│ │ │ ├── button-23.component.ts
│ │ │ ├── button-24.component.ts
│ │ │ ├── button-25.component.ts
│ │ │ ├── button-26.component.ts
│ │ │ ├── button-27.component.ts
│ │ │ ├── button-28.component.ts
│ │ │ ├── button-29.component.ts
│ │ │ ├── button-30.component.ts
│ │ │ ├── button-31.component.ts
│ │ │ ├── button-32.component.ts
│ │ │ ├── button-33.component.ts
│ │ │ ├── button-34.component.ts
│ │ │ ├── button-35.component.ts
│ │ │ ├── button-36.component.ts
│ │ │ ├── button-37.component.ts
│ │ │ ├── button-38.component.ts
│ │ │ ├── button-39.component.ts
│ │ │ ├── button-40.component.ts
│ │ │ ├── button-41.component.ts
│ │ │ ├── button-42.component.ts
│ │ │ ├── button-43.component.ts
│ │ │ ├── button-44.component.ts
│ │ │ ├── button-45.component.ts
│ │ │ ├── button-46.component.ts
│ │ │ ├── button-47.component.ts
│ │ │ ├── button-48.component.ts
│ │ │ ├── button-49.component.ts
│ │ │ ├── button-50.component.ts
│ │ │ ├── button-51.component.ts
│ │ │ ├── button-52.component.ts
│ │ │ ├── button-53.component.ts
│ │ │ ├── button-54.component.ts
│ │ │ └── index.ts
│ │ ├── card
│ │ │ ├── card-01.component.ts
│ │ │ ├── card-02.component.ts
│ │ │ ├── card-03.component.ts
│ │ │ ├── card-04.component.ts
│ │ │ ├── card-05.component.ts
│ │ │ ├── card-06.component.ts
│ │ │ ├── card-07.component.ts
│ │ │ ├── card-08.component.ts
│ │ │ ├── card-09.component.ts
│ │ │ ├── card-10.component.ts
│ │ │ ├── card-11.component.ts
│ │ │ └── index.ts
│ │ ├── checkbox
│ │ │ ├── checkbox-01.component.ts
│ │ │ ├── checkbox-02.component.ts
│ │ │ ├── checkbox-03.component.ts
│ │ │ ├── checkbox-04.component.ts
│ │ │ ├── checkbox-05.component.ts
│ │ │ ├── checkbox-06.component.ts
│ │ │ ├── checkbox-07.component.ts
│ │ │ ├── checkbox-08.component.ts
│ │ │ ├── checkbox-09.component.ts
│ │ │ ├── checkbox-10.component.ts
│ │ │ ├── checkbox-11.component.ts
│ │ │ ├── checkbox-12.component.ts
│ │ │ ├── checkbox-13.component.ts
│ │ │ ├── checkbox-14.component.ts
│ │ │ ├── checkbox-15.component.ts
│ │ │ ├── checkbox-16.component.ts
│ │ │ ├── checkbox-17.component.ts
│ │ │ ├── checkbox-18.component.ts
│ │ │ ├── checkbox-19.component.ts
│ │ │ ├── checkbox-20.component.ts
│ │ │ ├── checkbox-21.component.ts
│ │ │ ├── checkbox-22.component.ts
│ │ │ └── index.ts
│ │ ├── dialog
│ │ │ ├── dialog-01.component.ts
│ │ │ ├── dialog-02.component.ts
│ │ │ ├── dialog-03.component.ts
│ │ │ ├── dialog-04.component.ts
│ │ │ ├── dialog-05.component.ts
│ │ │ ├── dialog-06.component.ts
│ │ │ ├── dialog-07.component.ts
│ │ │ ├── dialog-08.component.ts
│ │ │ ├── dialog-09.component.ts
│ │ │ ├── dialog-10.component.ts
│ │ │ ├── dialog-11.component.ts
│ │ │ ├── dialog-12.component.ts
│ │ │ ├── dialog-13.component.ts
│ │ │ ├── dialog-14.component.ts
│ │ │ ├── dialog-15.component.ts
│ │ │ ├── dialog-16.component.ts
│ │ │ ├── dialog-17.component.ts
│ │ │ ├── dialog-18.component.ts
│ │ │ ├── dialog-19.component.ts
│ │ │ ├── dialog-20.component.ts
│ │ │ ├── dialog-21.component.ts
│ │ │ ├── dialog-22.component.ts
│ │ │ ├── dialog-23.component.ts
│ │ │ ├── dialog-24.component.ts
│ │ │ ├── dialog-25.component.ts
│ │ │ ├── dialog-26.component.ts
│ │ │ ├── dialog-27.component.ts
│ │ │ ├── dialog-28.component.ts
│ │ │ ├── dialog-29.component.ts
│ │ │ ├── dialog-30.component.ts
│ │ │ ├── dialog-31.component.ts
│ │ │ ├── dialog-32.component.ts
│ │ │ ├── dialog-33.component.ts
│ │ │ ├── dialog-34.component.ts
│ │ │ ├── dialog-35.component.ts
│ │ │ └── index.ts
│ │ ├── file-upload
│ │ │ ├── file-upload-01.component.ts
│ │ │ ├── file-upload-02.component.ts
│ │ │ ├── file-upload-03.component.ts
│ │ │ ├── file-upload-04.component.ts
│ │ │ ├── file-upload-05.component.ts
│ │ │ ├── file-upload-06.component.ts
│ │ │ ├── file-upload-07.component.ts
│ │ │ ├── file-upload-08.component.ts
│ │ │ ├── file-upload-09.component.ts
│ │ │ ├── file-upload-10.component.ts
│ │ │ ├── file-upload-11.component.ts
│ │ │ ├── file-upload-12.component.ts
│ │ │ ├── file-upload-13.component.ts
│ │ │ └── index.ts
│ │ ├── notification
│ │ │ ├── index.ts
│ │ │ ├── notification-01.component.ts
│ │ │ ├── notification-02.component.ts
│ │ │ ├── notification-03.component.ts
│ │ │ ├── notification-04.component.ts
│ │ │ ├── notification-05.component.ts
│ │ │ ├── notification-06.component.ts
│ │ │ ├── notification-07.component.ts
│ │ │ ├── notification-08.component.ts
│ │ │ ├── notification-09.component.ts
│ │ │ ├── notification-10.component.ts
│ │ │ ├── notification-11.component.ts
│ │ │ ├── notification-12.component.ts
│ │ │ ├── notification-13.component.ts
│ │ │ ├── notification-14.component.ts
│ │ │ ├── notification-15.component.ts
│ │ │ ├── notification-16.component.ts
│ │ │ ├── notification-17.component.ts
│ │ │ ├── notification-18.component.ts
│ │ │ ├── notification-19.component.ts
│ │ │ ├── notification-20.component.ts
│ │ │ ├── notification-21.component.ts
│ │ │ ├── notification-22.component.ts
│ │ │ ├── notification-23.component.ts
│ │ │ ├── notification-24.component.ts
│ │ │ ├── notification-25.component.ts
│ │ │ ├── notification-26.component.ts
│ │ │ ├── notification-27.component.ts
│ │ │ ├── notification-28.component.ts
│ │ │ ├── notification-29.component.ts
│ │ │ ├── notification-30.component.ts
│ │ │ ├── notification-31.component.ts
│ │ │ ├── notification-32.component.ts
│ │ │ └── notification-33.component.ts
│ │ └── tabs
│ │ │ ├── index.ts
│ │ │ ├── tabs-01.component.ts
│ │ │ ├── tabs-02.component.ts
│ │ │ ├── tabs-03.component.ts
│ │ │ ├── tabs-04.component.ts
│ │ │ ├── tabs-05.component.ts
│ │ │ ├── tabs-06.component.ts
│ │ │ ├── tabs-07.component.ts
│ │ │ ├── tabs-08.component.ts
│ │ │ ├── tabs-09.component.ts
│ │ │ ├── tabs-10.component.ts
│ │ │ ├── tabs-11.component.ts
│ │ │ ├── tabs-12.component.ts
│ │ │ ├── tabs-13.component.ts
│ │ │ ├── tabs-14.component.ts
│ │ │ ├── tabs-15.component.ts
│ │ │ ├── tabs-16.component.ts
│ │ │ ├── tabs-17.component.ts
│ │ │ ├── tabs-18.component.ts
│ │ │ ├── tabs-19.component.ts
│ │ │ └── tabs-20.component.ts
│ ├── constants
│ │ ├── accordion.constant.ts
│ │ ├── alert.constant.ts
│ │ ├── avatar.constant.ts
│ │ ├── badge.constant.ts
│ │ ├── banner.constant.ts
│ │ ├── breadcrumb.constant.ts
│ │ ├── button.constant.ts
│ │ ├── card.constant.ts
│ │ ├── checkbox.constant.ts
│ │ ├── dialog.constant.ts
│ │ ├── file-upload.constant.ts
│ │ ├── home.constant.ts
│ │ ├── index.ts
│ │ ├── notification.constant.ts
│ │ └── tabs.constant.ts
│ ├── core
│ │ ├── card
│ │ │ ├── card-background.directive.ts
│ │ │ ├── card-body.directive.ts
│ │ │ ├── card-footer.directive.ts
│ │ │ ├── card.directive.ts
│ │ │ └── index.ts
│ │ ├── code-preview.component.ts
│ │ ├── component-card.component.ts
│ │ ├── component-header.component.ts
│ │ ├── constants.ts
│ │ ├── footer.component.ts
│ │ ├── header.component.ts
│ │ ├── index.ts
│ │ ├── navigation.service.ts
│ │ ├── page-grid.component.ts
│ │ ├── suggestion.component.ts
│ │ ├── theme.service.ts
│ │ └── types.ts
│ ├── pages
│ │ ├── accordion.component.ts
│ │ ├── alert.component.ts
│ │ ├── avatar.component.ts
│ │ ├── badge.component.ts
│ │ ├── banner.component.ts
│ │ ├── breadcrumb.component.ts
│ │ ├── button.component.ts
│ │ ├── card.component.ts
│ │ ├── checkbox.component.ts
│ │ ├── comp-layout.component.ts
│ │ ├── dialog.component.ts
│ │ ├── file-upload.component.ts
│ │ ├── home.component.ts
│ │ ├── index.ts
│ │ ├── intro.component.ts
│ │ ├── notification.component.ts
│ │ └── tabs.component.ts
│ └── types
│ │ ├── component-info.type.ts
│ │ └── index.ts
├── assets
│ ├── avatars
│ │ ├── alan-cooper.png
│ │ ├── alex-stanton.png
│ │ ├── alexis-sears.png
│ │ ├── anna-white.png
│ │ ├── annie-stanley-large.jpg
│ │ ├── annie-stanley-square.jpg
│ │ ├── james-gouse.jpg
│ │ ├── jessica-lambert.png
│ │ ├── julia-philips.png
│ │ ├── marcus-levin.png
│ │ ├── mathilde-lewis.png
│ │ └── skylar-dias.png
│ ├── backgrounds
│ │ ├── bg-01.jpg
│ │ ├── bg-02.jpg
│ │ ├── bg-03.jpg
│ │ ├── bg-04.jpg
│ │ ├── bg-05.jpg
│ │ └── bg-06.jpg
│ ├── flags
│ │ ├── AU.svg
│ │ ├── CH.svg
│ │ ├── CN.svg
│ │ ├── JP.svg
│ │ ├── KR.svg
│ │ ├── US.svg
│ │ └── VN.svg
│ ├── logos
│ │ ├── logo-base.svg
│ │ ├── logo-solid.svg
│ │ ├── logo-square.svg
│ │ └── logo-with-bg.png
│ ├── products
│ │ ├── concert.webp
│ │ ├── disc.webp
│ │ └── product-1.webp
│ ├── qr-code.jpg
│ └── thumbnails
│ │ ├── accordion.png
│ │ ├── alert.png
│ │ ├── avatar.png
│ │ ├── badge.png
│ │ ├── banner.png
│ │ ├── breadcrumb.png
│ │ ├── button.png
│ │ ├── card.png
│ │ ├── checkbox.png
│ │ ├── dark-accordion.png
│ │ ├── dark-alert.png
│ │ ├── dark-avatar.png
│ │ ├── dark-badge.png
│ │ ├── dark-banner.png
│ │ ├── dark-breadcrumb.png
│ │ ├── dark-button.png
│ │ ├── dark-card.png
│ │ ├── dark-checkbox.png
│ │ ├── dark-dialog.png
│ │ ├── dark-file-upload.png
│ │ ├── dark-notification.png
│ │ ├── dark-popover.png
│ │ ├── dark-tabs.png
│ │ ├── dialog.png
│ │ ├── dropdown.png
│ │ ├── file-upload.png
│ │ ├── notification.png
│ │ ├── popover.png
│ │ └── tabs.png
├── index.html
├── libs
│ ├── sim
│ │ └── ui-file-helm
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── file-drag-drop.directive.ts
│ └── ui
│ │ ├── ui-accordion-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-accordion-content.component.ts
│ │ │ ├── hlm-accordion-icon.directive.ts
│ │ │ ├── hlm-accordion-item.directive.ts
│ │ │ ├── hlm-accordion-trigger.directive.ts
│ │ │ └── hlm-accordion.directive.ts
│ │ ├── ui-alert-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-alert-description.directive.ts
│ │ │ ├── hlm-alert-icon.directive.ts
│ │ │ ├── hlm-alert-title.directive.ts
│ │ │ └── hlm-alert.directive.ts
│ │ ├── ui-aspectratio-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── helm-aspect-ratio.directive.spec.ts
│ │ │ └── helm-aspect-ratio.directive.ts
│ │ ├── ui-avatar-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── fallback
│ │ │ ├── hlm-avatar-fallback.directive.spec.ts
│ │ │ ├── hlm-avatar-fallback.directive.ts
│ │ │ └── index.ts
│ │ │ ├── hlm-avatar.component.spec.ts
│ │ │ ├── hlm-avatar.component.ts
│ │ │ └── image
│ │ │ ├── hlm-avatar-image.directive.spec.ts
│ │ │ ├── hlm-avatar-image.directive.ts
│ │ │ └── index.ts
│ │ ├── ui-badge-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── hlm-badge.directive.ts
│ │ ├── ui-breadcrumb-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── breadcrumb-ellipsis.component.ts
│ │ │ ├── breadcrumb-item.directive.ts
│ │ │ ├── breadcrumb-link.directive.ts
│ │ │ ├── breadcrumb-list.directive.ts
│ │ │ ├── breadcrumb-page.directive.ts
│ │ │ ├── breadcrumb-separator.component.ts
│ │ │ └── breadcrumb.directive.ts
│ │ ├── ui-button-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-button.directive.ts
│ │ │ └── hlm-button.token.ts
│ │ ├── ui-card-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-card-content.directive.ts
│ │ │ ├── hlm-card-description.directive.ts
│ │ │ ├── hlm-card-footer.directive.ts
│ │ │ ├── hlm-card-header.directive.ts
│ │ │ ├── hlm-card-title.directive.ts
│ │ │ └── hlm-card.directive.ts
│ │ ├── ui-checkbox-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── hlm-checkbox.component.ts
│ │ ├── ui-dialog-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-dialog-close.directive.ts
│ │ │ ├── hlm-dialog-content.component.ts
│ │ │ ├── hlm-dialog-description.directive.ts
│ │ │ ├── hlm-dialog-footer.component.ts
│ │ │ ├── hlm-dialog-header.component.ts
│ │ │ ├── hlm-dialog-overlay.directive.ts
│ │ │ ├── hlm-dialog-title.directive.ts
│ │ │ ├── hlm-dialog.component.ts
│ │ │ └── hlm-dialog.service.ts
│ │ ├── ui-formfield-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── form-field.spec.ts
│ │ │ ├── hlm-error.directive.ts
│ │ │ ├── hlm-form-field.component.ts
│ │ │ └── hlm-hint.directive.ts
│ │ ├── ui-icon-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-icon.directive.spec.ts
│ │ │ ├── hlm-icon.directive.ts
│ │ │ └── hlm-icon.token.ts
│ │ ├── ui-input-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-input-error.directive.ts
│ │ │ └── hlm-input.directive.ts
│ │ ├── ui-inputotp-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-input-otp-fake-caret.component.ts
│ │ │ ├── hlm-input-otp-group.directive.ts
│ │ │ ├── hlm-input-otp-separator.component.ts
│ │ │ ├── hlm-input-otp-slot.component.ts
│ │ │ └── hlm-input-otp.directive.ts
│ │ ├── ui-label-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── hlm-label.directive.ts
│ │ ├── ui-menu-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-menu-bar-item.directive.ts
│ │ │ ├── hlm-menu-bar.component.ts
│ │ │ ├── hlm-menu-group.component.ts
│ │ │ ├── hlm-menu-item-check.component.ts
│ │ │ ├── hlm-menu-item-checkbox.directive.ts
│ │ │ ├── hlm-menu-item-icon.directive.ts
│ │ │ ├── hlm-menu-item-radio.component.ts
│ │ │ ├── hlm-menu-item-radio.directive.ts
│ │ │ ├── hlm-menu-item-sub-indicator.component.ts
│ │ │ ├── hlm-menu-item.directive.ts
│ │ │ ├── hlm-menu-label.component.ts
│ │ │ ├── hlm-menu-separator.component.ts
│ │ │ ├── hlm-menu-shortcut.component.ts
│ │ │ ├── hlm-menu.component.ts
│ │ │ └── hlm-sub-menu.component.ts
│ │ ├── ui-progress-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-progress-indicator.directive.ts
│ │ │ └── hlm-progress.directive.ts
│ │ ├── ui-radiogroup-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-radio-group.component.ts
│ │ │ ├── hlm-radio-indicator.component.ts
│ │ │ └── hlm-radio.component.ts
│ │ ├── ui-scrollarea-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── hlm-scroll-area.directive.ts
│ │ ├── ui-select-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-select-content.directive.ts
│ │ │ ├── hlm-select-group.directive.ts
│ │ │ ├── hlm-select-label.directive.ts
│ │ │ ├── hlm-select-option.component.ts
│ │ │ ├── hlm-select-scroll-down.component.ts
│ │ │ ├── hlm-select-scroll-up.component.ts
│ │ │ ├── hlm-select-trigger.component.ts
│ │ │ ├── hlm-select-value.directive.ts
│ │ │ └── hlm-select.directive.ts
│ │ ├── ui-slider-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── hlm-slider.component.ts
│ │ ├── ui-spinner-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ └── hlm-spinner.component.ts
│ │ ├── ui-switch-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-switch-ng-model.component.ignore.spec.ts
│ │ │ ├── hlm-switch-thumb.directive.ts
│ │ │ └── hlm-switch.component.ts
│ │ ├── ui-table-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-caption.component.ts
│ │ │ ├── hlm-table.component.ts
│ │ │ ├── hlm-table.directive.ts
│ │ │ ├── hlm-td.component.ts
│ │ │ ├── hlm-th.component.ts
│ │ │ └── hlm-trow.component.ts
│ │ ├── ui-tabs-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-tabs-content.directive.ts
│ │ │ ├── hlm-tabs-list.component.ts
│ │ │ ├── hlm-tabs-paginated-list.component.ts
│ │ │ ├── hlm-tabs-trigger.directive.ts
│ │ │ └── hlm-tabs.component.ts
│ │ ├── ui-toggle-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-toggle-group.directive.ts
│ │ │ └── hlm-toggle.directive.ts
│ │ ├── ui-togglegroup-helm
│ │ └── src
│ │ │ ├── index.ts
│ │ │ └── lib
│ │ │ ├── hlm-toggle-group.directive.ts
│ │ │ ├── hlm-toggle-group.token.ts
│ │ │ └── hlm-toggle-item.directive.ts
│ │ └── ui-tooltip-helm
│ │ └── src
│ │ ├── index.ts
│ │ └── lib
│ │ ├── hlm-tooltip-trigger.directive.ts
│ │ └── hlm-tooltip.component.ts
├── main.server.ts
├── main.ts
├── server.ts
└── styles.css
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.spec.json
└── yarn.lock
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see https://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.ts]
12 | quote_type = single
13 | ij_typescript_use_double_quotes = false
14 |
15 | [*.md]
16 | max_line_length = off
17 | trim_trailing_whitespace = false
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
2 |
3 | # Compiled output
4 | /dist
5 | /tmp
6 | /out-tsc
7 | /bazel-out
8 |
9 | # Node
10 | /node_modules
11 | npm-debug.log
12 | yarn-error.log
13 |
14 | # IDEs and editors
15 | .idea/
16 | .project
17 | .classpath
18 | .c9/
19 | *.launch
20 | .settings/
21 | *.sublime-workspace
22 |
23 | # Visual Studio Code
24 | .vscode/*
25 | !.vscode/settings.json
26 | !.vscode/tasks.json
27 | !.vscode/launch.json
28 | !.vscode/extensions.json
29 | .history/*
30 |
31 | # Miscellaneous
32 | /.angular/cache
33 | .sass-cache/
34 | /connect.lock
35 | /coverage
36 | /libpeerconnection.log
37 | testem.log
38 | /typings
39 |
40 | # System files
41 | .DS_Store
42 | Thumbs.db
43 |
--------------------------------------------------------------------------------
/.postcssrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": {
3 | "@tailwindcss/postcss": {}
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore artifacts:
2 | build
3 | coverage
4 | src/libs/ui
5 | .vscode
--------------------------------------------------------------------------------
/.prettierrc.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | tabWidth: 2,
3 | singleQuote: true,
4 | semi: true,
5 | bracketSpacing: true,
6 | bracketSameLine: true,
7 | printWidth: 120,
8 | singleQuote: true,
9 | useTabs: true,
10 | bracketSpacing: true,
11 | htmlWhitespaceSensitivity: 'ignore',
12 | plugins: ['prettier-plugin-organize-imports', 'prettier-plugin-packagejson', 'prettier-plugin-tailwindcss'],
13 | };
14 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
3 | "recommendations": ["angular.ng-template"]
4 | }
5 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
3 | "version": "0.2.0",
4 | "configurations": [
5 | {
6 | "name": "ng serve",
7 | "type": "chrome",
8 | "request": "launch",
9 | "preLaunchTask": "npm: start",
10 | "url": "http://localhost:4200/"
11 | },
12 | {
13 | "name": "ng test",
14 | "type": "chrome",
15 | "request": "launch",
16 | "preLaunchTask": "npm: test",
17 | "url": "http://localhost:9876/debug.html"
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cSpell.words": [
3 | "maskito",
4 | "postprocessors"
5 | ]
6 | }
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
3 | "version": "2.0.0",
4 | "tasks": [
5 | {
6 | "type": "npm",
7 | "script": "start",
8 | "isBackground": true,
9 | "problemMatcher": {
10 | "owner": "typescript",
11 | "pattern": "$tsc",
12 | "background": {
13 | "activeOnStart": true,
14 | "beginsPattern": {
15 | "regexp": "(.*?)"
16 | },
17 | "endsPattern": {
18 | "regexp": "bundle generation complete"
19 | }
20 | }
21 | }
22 | },
23 | {
24 | "type": "npm",
25 | "script": "test",
26 | "isBackground": true,
27 | "problemMatcher": {
28 | "owner": "typescript",
29 | "pattern": "$tsc",
30 | "background": {
31 | "activeOnStart": true,
32 | "beginsPattern": {
33 | "regexp": "(.*?)"
34 | },
35 | "endsPattern": {
36 | "regexp": "bundle generation complete"
37 | }
38 | }
39 | }
40 | }
41 | ]
42 | }
43 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Phuong Tran Dong
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Sim UI
2 |
3 | **Beautiful Angular UI components built with Tailwind CSS and Spartan.**
4 |
5 | A curated collection of ready-to-use components to quickly build modern application UIs.
6 |
7 | **Demo: [https://simui.dev](https://simui.dev)**
8 |
9 | ## Getting Started
10 |
11 | Sim UI is built on top of Spartan UI, but the components are designed to work seamlessly with any Angular application. Following a consistent component architecture, Sim UI will feel familiar to Angular developers while providing the visual polish of Tailwind CSS.
12 |
13 | **Set up Spartan UI**
14 |
15 | You can follow this documentation to setup Spartan UI in your project: [https://spartan.ng/documentation/installation](https://spartan.ng/documentation/installation)
16 |
17 | **Prerequisites**
18 |
19 | - Angular 19+
20 | - Tailwind CSS 4.x
21 |
22 | ## Tailwind v4 support
23 |
24 | Sim UI is built with Tailwind CSS v4, while maintaining backward compatibility with Tailwind v3 for most components.
25 |
26 | ## Contributing
27 |
28 | We welcome contributions to Sim UI! Please read our [contributing guidelines](CONTRIBUTING.md) on how to submit improvements and new components.
29 |
30 | ## License
31 |
32 | Licensed under the [MIT License](https://github.com/dofu-lab/simui/blob/main/LICENSE).
33 |
34 | If you have any questions or just want to say hi, feel free to reach out to us on X 👉 [@PhuongTranDong](https://x.com/PhuongTranDong)
35 |
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "componentsPath": "src/libs/ui"
3 | }
4 |
--------------------------------------------------------------------------------
/eslint.config.js:
--------------------------------------------------------------------------------
1 | // @ts-check
2 | const eslint = require('@eslint/js');
3 | const tseslint = require('typescript-eslint');
4 | const angular = require('angular-eslint');
5 | const prettier = require('eslint-config-prettier');
6 |
7 | module.exports = tseslint.config(
8 | {
9 | files: ['**/*.ts'],
10 | extends: [
11 | eslint.configs.recommended,
12 | ...tseslint.configs.recommended,
13 | ...tseslint.configs.stylistic,
14 | ...angular.configs.tsRecommended,
15 | prettier,
16 | ],
17 | processor: angular.processInlineTemplates,
18 | rules: {
19 | '@angular-eslint/template/interactive-supports-focus': [
20 | 'warn',
21 | {
22 | mouse: false,
23 | keyboard: false,
24 | touch: false,
25 | },
26 | ],
27 | '@angular-eslint/directive-selector': [
28 | 'error',
29 | {
30 | type: 'attribute',
31 | prefix: ['app', 'sim', 'hlm'],
32 | style: 'camelCase',
33 | },
34 | ],
35 | '@angular-eslint/component-selector': [
36 | 'error',
37 | {
38 | type: 'element',
39 | prefix: ['app', 'sim', 'hlm'],
40 | style: 'kebab-case',
41 | },
42 | ],
43 | },
44 | },
45 | {
46 | files: ['**/*.html'],
47 | extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility],
48 | rules: {},
49 | },
50 | );
51 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | command = "ng build"
3 | functions = "netlify/functions"
4 | publish = "dist/simui/browser"
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/public/favicon.ico
--------------------------------------------------------------------------------
/src/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, signal } from '@angular/core';
2 | import { RouterOutlet } from '@angular/router';
3 | import { NgxSonnerToaster } from 'ngx-sonner';
4 | import { FooterComponent, HeaderComponent } from './core';
5 |
6 | @Component({
7 | selector: 'app-root',
8 | standalone: true,
9 | imports: [RouterOutlet, NgxSonnerToaster, FooterComponent, HeaderComponent],
10 | template: `
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | `,
20 | })
21 | export class AppComponent {
22 | isNavbarOpen = signal(true);
23 |
24 | onNavbarChange(isOpen: boolean) {
25 | this.isNavbarOpen.set(isOpen);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/app/app.config.server.ts:
--------------------------------------------------------------------------------
1 | import { ApplicationConfig, mergeApplicationConfig } from '@angular/core';
2 | import { provideServerRendering } from '@angular/platform-server';
3 | import { appConfig } from './app.config';
4 |
5 | const serverConfig: ApplicationConfig = {
6 | providers: [provideServerRendering()],
7 | };
8 |
9 | export const config = mergeApplicationConfig(appConfig, serverConfig);
10 |
--------------------------------------------------------------------------------
/src/app/app.config.ts:
--------------------------------------------------------------------------------
1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
2 | import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
3 | import { provideRouter } from '@angular/router';
4 | import { routes } from './app.routes';
5 |
6 | export const appConfig: ApplicationConfig = {
7 | providers: [
8 | provideZoneChangeDetection({ eventCoalescing: true }),
9 | provideRouter(routes),
10 | provideClientHydration(withEventReplay()),
11 | ],
12 | };
13 |
--------------------------------------------------------------------------------
/src/app/components/accordion/index.ts:
--------------------------------------------------------------------------------
1 | export * from './accordion-01.component';
2 | export * from './accordion-02.component';
3 | export * from './accordion-03.component';
4 | export * from './accordion-04.component';
5 | export * from './accordion-05.component';
6 | export * from './accordion-06.component';
7 | export * from './accordion-07.component';
8 | export * from './accordion-08.component';
9 | export * from './accordion-09.component';
10 | export * from './accordion-10.component';
11 | export * from './accordion-11.component';
12 | export * from './accordion-12.component';
13 | export * from './accordion-13.component';
14 | export * from './accordion-14.component';
15 | export * from './accordion-15.component';
16 | export * from './accordion-16.component';
17 | export * from './accordion-17.component';
18 | export * from './accordion-18.component';
19 | export * from './accordion-19.component';
20 | export * from './accordion-20.component';
21 | export * from './accordion-21.component';
22 | export * from './accordion-22.component';
23 |
--------------------------------------------------------------------------------
/src/app/components/alert/index.ts:
--------------------------------------------------------------------------------
1 | export * from './alert-01.component';
2 | export * from './alert-02.component';
3 | export * from './alert-03.component';
4 | export * from './alert-04.component';
5 | export * from './alert-05.component';
6 | export * from './alert-06.component';
7 | export * from './alert-07.component';
8 | export * from './alert-08.component';
9 | export * from './alert-09.component';
10 | export * from './alert-10.component';
11 | export * from './alert-11.component';
12 | export * from './alert-12.component';
13 | export * from './alert-13.component';
14 | export * from './alert-14.component';
15 | export * from './alert-15.component';
16 | export * from './alert-16.component';
17 | export * from './alert-17.component';
18 | export * from './alert-18.component';
19 |
--------------------------------------------------------------------------------
/src/app/components/avatar/avatar-01.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmAvatarComponent, HlmAvatarFallbackDirective, HlmAvatarImageDirective } from '@spartan-ng/ui-avatar-helm';
3 |
4 | @Component({
5 | selector: 'sim-avatar-01',
6 | standalone: true,
7 | imports: [HlmAvatarComponent, HlmAvatarImageDirective, HlmAvatarFallbackDirective],
8 | template: `
9 |
10 |
11 | ML
12 |
13 | `,
14 | })
15 | export class Avatar01Component {}
16 |
17 | export const avatar01Code = `
18 | import { Component } from '@angular/core';
19 | import {
20 | HlmAvatarComponent,
21 | HlmAvatarFallbackDirective,
22 | HlmAvatarImageDirective,
23 | } from '@spartan-ng/ui-avatar-helm';
24 |
25 | @Component({
26 | selector: 'sim-avatar-01',
27 | standalone: true,
28 | imports: [
29 | HlmAvatarComponent,
30 | HlmAvatarImageDirective,
31 | HlmAvatarFallbackDirective,
32 | ],
33 | template: \`
34 |
35 |
40 |
41 | ML
42 |
43 |
44 | \`,
45 | })
46 | export class Avatar01Component {}
47 | `;
48 |
--------------------------------------------------------------------------------
/src/app/components/avatar/avatar-02.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmAvatarComponent, HlmAvatarFallbackDirective } from '@spartan-ng/ui-avatar-helm';
3 |
4 | @Component({
5 | selector: 'sim-avatar-02',
6 | standalone: true,
7 | imports: [HlmAvatarComponent, HlmAvatarFallbackDirective],
8 | template: `
9 |
10 | ML
11 |
12 | `,
13 | })
14 | export class Avatar02Component {}
15 |
16 | export const avatar02Code = `
17 | import { Component } from '@angular/core';
18 | import {
19 | HlmAvatarComponent,
20 | HlmAvatarFallbackDirective,
21 | } from '@spartan-ng/ui-avatar-helm';
22 |
23 | @Component({
24 | selector: 'sim-avatar-02',
25 | standalone: true,
26 | imports: [HlmAvatarComponent, HlmAvatarFallbackDirective],
27 | template: \`
28 |
29 | ML
30 |
31 | \`,
32 | })
33 | export class Avatar02Component {}
34 | `;
35 |
--------------------------------------------------------------------------------
/src/app/components/avatar/index.ts:
--------------------------------------------------------------------------------
1 | export * from './avatar-01.component';
2 | export * from './avatar-02.component';
3 | export * from './avatar-03.component';
4 | export * from './avatar-04.component';
5 | export * from './avatar-05.component';
6 | export * from './avatar-06.component';
7 | export * from './avatar-07.component';
8 | export * from './avatar-08.component';
9 | export * from './avatar-09.component';
10 | export * from './avatar-10.component';
11 | export * from './avatar-11.component';
12 | export * from './avatar-12.component';
13 | export * from './avatar-13.component';
14 | export * from './avatar-14.component';
15 | export * from './avatar-15.component';
16 | export * from './avatar-16.component';
17 | export * from './avatar-17.component';
18 | export * from './avatar-18.component';
19 | export * from './avatar-19.component';
20 | export * from './avatar-20.component';
21 | export * from './avatar-21.component';
22 | export * from './avatar-22.component';
23 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-01.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-01',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 | Badge
10 | `,
11 | })
12 | export class Badge01Component {}
13 |
14 | export const badge01Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
17 |
18 | @Component({
19 | selector: 'sim-badge-01',
20 | standalone: true,
21 | imports: [HlmBadgeDirective],
22 | template: \` Badge \`,
23 | })
24 | export class Badge01Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-02.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-02',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 | Badge
10 | `,
11 | })
12 | export class Badge02Component {}
13 |
14 | export const badge02Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
17 |
18 | @Component({
19 | selector: 'sim-badge-02',
20 | standalone: true,
21 | imports: [HlmBadgeDirective],
22 | template: \` Badge \`,
23 | })
24 | export class Badge02Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-03.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-03',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 | Badge
10 | `,
11 | })
12 | export class Badge03Component {}
13 |
14 | export const badge03Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
17 |
18 | @Component({
19 | selector: 'sim-badge-03',
20 | standalone: true,
21 | imports: [HlmBadgeDirective],
22 | template: \` Badge \`,
23 | })
24 | export class Badge03Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-04.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-04',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 | Badge
10 | `,
11 | })
12 | export class Badge04Component {}
13 |
14 | export const badge04Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
17 |
18 | @Component({
19 | selector: 'sim-badge-04',
20 | standalone: true,
21 | imports: [HlmBadgeDirective],
22 | template: \` Badge \`,
23 | })
24 | export class Badge04Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-05.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-05',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 | Badge
10 | `,
11 | })
12 | export class Badge05Component {}
13 |
14 | export const badge05Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
17 |
18 | @Component({
19 | selector: 'sim-badge-05',
20 | standalone: true,
21 | imports: [HlmBadgeDirective],
22 | template: \` Badge \`,
23 | })
24 | export class Badge05Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-07.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-07',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
11 | Messages
12 | 12
13 |
14 |
15 | `,
16 | })
17 | export class Badge07Component {}
18 |
19 | export const badge07Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-07',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
30 | Messages
31 | 12
32 |
33 |
34 | \`,
35 | })
36 | export class Badge07Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-08.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-08',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class Badge08Component {}
18 |
19 | export const badge08Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-08',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
33 |
34 | \`,
35 | })
36 | export class Badge08Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-09.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-09',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class Badge09Component {}
18 |
19 | export const badge09Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-09',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
33 |
34 | \`,
35 | })
36 | export class Badge09Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-10.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-10',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class Badge10Component {}
18 |
19 | export const badge10Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-10',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
33 |
34 | \`,
35 | })
36 | export class Badge10Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-13.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-13',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class Badge13Component {}
18 |
19 | export const badge13Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-13',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
33 |
34 | \`,
35 | })
36 | export class Badge13Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-14.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-14',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class Badge14Component {}
18 |
19 | export const badge14Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-14',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
33 |
34 | \`,
35 | })
36 | export class Badge14Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/badge-15.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
3 |
4 | @Component({
5 | selector: 'sim-badge-15',
6 | standalone: true,
7 | imports: [HlmBadgeDirective],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class Badge15Component {}
18 |
19 | export const badge15Code = `
20 | import { Component } from '@angular/core';
21 | import { HlmBadgeDirective } from '@spartan-ng/ui-badge-helm';
22 |
23 | @Component({
24 | selector: 'sim-badge-15',
25 | standalone: true,
26 | imports: [HlmBadgeDirective],
27 | template: \`
28 |
29 |
33 |
34 | \`,
35 | })
36 | export class Badge15Component {}
37 | `;
38 |
--------------------------------------------------------------------------------
/src/app/components/badge/index.ts:
--------------------------------------------------------------------------------
1 | export * from './badge-01.component';
2 | export * from './badge-02.component';
3 | export * from './badge-03.component';
4 | export * from './badge-04.component';
5 | export * from './badge-05.component';
6 | export * from './badge-06.component';
7 | export * from './badge-07.component';
8 | export * from './badge-08.component';
9 | export * from './badge-09.component';
10 | export * from './badge-10.component';
11 | export * from './badge-11.component';
12 | export * from './badge-12.component';
13 | export * from './badge-13.component';
14 | export * from './badge-14.component';
15 | export * from './badge-15.component';
16 | export * from './badge-16.component';
17 | export * from './badge-17.component';
18 | export * from './badge-18.component';
19 | export * from './badge-19.component';
20 | export * from './badge-20.component';
21 | export * from './badge-21.component';
22 | export * from './badge-22.component';
23 | export * from './badge-23.component';
24 |
--------------------------------------------------------------------------------
/src/app/components/banner/index.ts:
--------------------------------------------------------------------------------
1 | export * from './banner-01.component';
2 | export * from './banner-02.component';
3 | export * from './banner-03.component';
4 | export * from './banner-04.component';
5 | export * from './banner-05.component';
6 | export * from './banner-06.component';
7 | export * from './banner-07.component';
8 | export * from './banner-08.component';
9 | export * from './banner-09.component';
10 | export * from './banner-10.component';
11 | export * from './banner-11.component';
12 |
--------------------------------------------------------------------------------
/src/app/components/breadcrumb/index.ts:
--------------------------------------------------------------------------------
1 | export * from './breadcrumb-01.component';
2 | export * from './breadcrumb-02.component';
3 | export * from './breadcrumb-03.component';
4 | export * from './breadcrumb-04.component';
5 | export * from './breadcrumb-05.component';
6 | export * from './breadcrumb-06.component';
7 | export * from './breadcrumb-07.component';
8 | export * from './breadcrumb-08.component';
9 | export * from './breadcrumb-09.component';
10 |
--------------------------------------------------------------------------------
/src/app/components/button/button-01.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 |
4 | @Component({
5 | selector: 'sim-button-01',
6 | standalone: true,
7 | imports: [HlmButtonDirective],
8 | template: `
9 |
10 | `,
11 | })
12 | export class Button01Component {}
13 |
14 | export const button01Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
17 |
18 | @Component({
19 | selector: 'sim-button-01',
20 | standalone: true,
21 | imports: [HlmButtonDirective],
22 | template: \` \`,
23 | })
24 | export class Button01Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/button/button-02.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideTrash } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-02',
9 | standalone: true,
10 | imports: [NgIcon, HlmButtonDirective, HlmIconDirective],
11 | providers: [provideIcons({ lucideTrash })],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Button02Component {}
20 |
21 | export const button02Code = `
22 | import { Component } from '@angular/core';
23 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
24 | import { NgIcon, provideIcons } from '@ng-icons/core';
25 | import { lucideTrash } from '@ng-icons/lucide';
26 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
27 |
28 | @Component({
29 | selector: 'sim-button-02',
30 | standalone: true,
31 | imports: [NgIcon, HlmButtonDirective, HlmIconDirective],
32 | providers: [provideIcons({ lucideTrash })],
33 | template: \`
34 |
38 | \`,
39 | })
40 | export class Button02Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/button/button-03.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 |
4 | @Component({
5 | selector: 'sim-button-03',
6 | standalone: true,
7 | imports: [HlmButtonDirective],
8 | template: `
9 |
10 | `,
11 | })
12 | export class Button03Component {}
13 |
14 | export const button03Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
17 |
18 | @Component({
19 | selector: 'sim-button-03',
20 | standalone: true,
21 | imports: [HlmButtonDirective],
22 | template: \` \`,
23 | })
24 | export class Button03Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/button/button-04.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideArchive } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-04',
9 | standalone: true,
10 | imports: [NgIcon, HlmButtonDirective, HlmIconDirective],
11 | providers: [provideIcons({ lucideArchive })],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Button04Component {}
20 |
21 | export const button04Code = `
22 | import { Component } from '@angular/core';
23 | import { NgIcon, provideIcons } from '@ng-icons/core';
24 | import { lucideArchive } from '@ng-icons/lucide';
25 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
26 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
27 |
28 | @Component({
29 | selector: 'sim-button-04',
30 | standalone: true,
31 | imports: [NgIcon, HlmButtonDirective, HlmIconDirective],
32 | providers: [provideIcons({ lucideArchive })],
33 | template: \`
34 |
38 | \`,
39 | })
40 | export class Button04Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/button/button-05.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 |
4 | @Component({
5 | selector: 'sim-button-05',
6 | standalone: true,
7 | imports: [HlmButtonDirective],
8 | template: `
9 |
10 | `,
11 | })
12 | export class Button05Component {}
13 |
14 | export const button05Code = `
15 | import { Component } from '@angular/core';
16 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
17 |
18 | @Component({
19 | selector: 'sim-button-05',
20 | standalone: true,
21 | imports: [HlmButtonDirective],
22 | template: \` \`,
23 | })
24 | export class Button05Component {}
25 | `;
26 |
--------------------------------------------------------------------------------
/src/app/components/button/button-06.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideX } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-06',
9 | standalone: true,
10 | providers: [provideIcons({ lucideX })],
11 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Button06Component {}
20 |
21 | export const button06Code = `
22 | import { Component } from '@angular/core';
23 | import { NgIcon, provideIcons } from '@ng-icons/core';
24 | import { lucideX } from '@ng-icons/lucide';
25 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
26 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
27 |
28 | @Component({
29 | selector: 'sim-button-06',
30 | standalone: true,
31 | providers: [provideIcons({ lucideX })],
32 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
33 | template: \`
34 |
38 | \`,
39 | })
40 | export class Button06Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/button/button-07.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideFlame } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-07',
9 | standalone: true,
10 | providers: [provideIcons({ lucideFlame })],
11 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Button07Component {}
20 |
21 | export const button07Code = `
22 | import { Component } from '@angular/core';
23 | import { NgIcon, provideIcons } from '@ng-icons/core';
24 | import { lucideFlame } from '@ng-icons/lucide';
25 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
26 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
27 |
28 | @Component({
29 | selector: 'sim-button-07',
30 | standalone: true,
31 | providers: [provideIcons({ lucideFlame })],
32 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
33 | template: \`
34 |
38 | \`,
39 | })
40 | export class Button07Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/button/button-11.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideChevronDown } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-11',
9 | standalone: true,
10 | providers: [provideIcons({ lucideChevronDown })],
11 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Button11Component {}
20 |
21 | export const button11Code = `
22 | import { Component } from '@angular/core';
23 | import { NgIcon, provideIcons } from '@ng-icons/core';
24 | import { lucideChevronDown } from '@ng-icons/lucide';
25 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
26 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
27 |
28 | @Component({
29 | selector: 'sim-button-11',
30 | standalone: true,
31 | providers: [provideIcons({ lucideChevronDown })],
32 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
33 | template: \`
34 |
38 | \`,
39 | })
40 | export class Button11Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/button/button-12.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 |
4 | @Component({
5 | selector: 'sim-button-12',
6 | standalone: true,
7 | imports: [HlmButtonDirective],
8 | template: `
9 |
10 |
11 |
12 |
13 | `,
14 | })
15 | export class Button12Component {}
16 |
17 | export const button12Code = `
18 | import { Component } from '@angular/core';
19 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
20 |
21 | @Component({
22 | selector: 'sim-button-12',
23 | standalone: true,
24 | imports: [HlmButtonDirective],
25 | template: \`
26 |
27 |
28 |
29 |
30 | \`,
31 | })
32 | export class Button12Component {}
33 | `;
34 |
--------------------------------------------------------------------------------
/src/app/components/button/button-13.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 | import { HlmSpinnerComponent } from '@spartan-ng/ui-spinner-helm';
4 |
5 | @Component({
6 | selector: 'sim-button-13',
7 | standalone: true,
8 | imports: [HlmButtonDirective, HlmSpinnerComponent],
9 | template: `
10 |
14 | `,
15 | })
16 | export class Button13Component {}
17 |
18 | export const button13Code = `
19 | import { Component } from '@angular/core';
20 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
21 | import { HlmSpinnerComponent } from '@spartan-ng/ui-spinner-helm';
22 |
23 | @Component({
24 | selector: 'sim-button-13',
25 | standalone: true,
26 | imports: [HlmButtonDirective, HlmSpinnerComponent],
27 | template: \`
28 |
32 | \`,
33 | })
34 | export class Button13Component {}
35 | `;
36 |
--------------------------------------------------------------------------------
/src/app/components/button/button-15.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 |
4 | @Component({
5 | selector: 'sim-button-15',
6 | standalone: true,
7 | imports: [HlmButtonDirective],
8 | template: `
9 |
16 | `,
17 | })
18 | export class Button15Component {}
19 |
20 | export const button15Code = `
21 | import { Component } from '@angular/core';
22 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
23 |
24 | @Component({
25 | selector: 'sim-button-15',
26 | standalone: true,
27 | imports: [HlmButtonDirective],
28 | template: \`
29 |
37 | \`,
38 | })
39 | export class Button15Component {}
40 | `;
41 |
--------------------------------------------------------------------------------
/src/app/components/button/button-19.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucidePlus } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-19',
9 | standalone: true,
10 | providers: [provideIcons({ lucidePlus })],
11 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Button19Component {}
20 |
21 | export const button19Code = `
22 | import { Component } from '@angular/core';
23 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
24 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
25 | import { NgIcon, provideIcons } from '@ng-icons/core';
26 | import { lucidePlus } from '@ng-icons/lucide';
27 |
28 | @Component({
29 | selector: 'sim-button-19',
30 | standalone: true,
31 | providers: [provideIcons({ lucidePlus })],
32 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
33 | template: \`
34 |
38 | \`,
39 | })
40 | export class Button19Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/button/button-20.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucidePlus } from '@ng-icons/lucide';
4 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 |
7 | @Component({
8 | selector: 'sim-button-20',
9 | standalone: true,
10 | providers: [provideIcons({ lucidePlus })],
11 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
12 | template: `
13 |
16 | `,
17 | })
18 | export class Button20Component {}
19 |
20 | export const button20Code = `
21 | import { Component } from '@angular/core';
22 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
23 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
24 | import { NgIcon, provideIcons } from '@ng-icons/core';
25 | import { lucidePlus } from '@ng-icons/lucide';
26 |
27 | @Component({
28 | selector: 'sim-button-20',
29 | standalone: true,
30 | providers: [provideIcons({ lucidePlus })],
31 | imports: [HlmButtonDirective, NgIcon, HlmIconDirective],
32 | template: \`
33 |
36 | \`,
37 | })
38 | export class Button20Component {}
39 | `;
40 |
--------------------------------------------------------------------------------
/src/app/components/card/index.ts:
--------------------------------------------------------------------------------
1 | export * from './card-01.component';
2 | export * from './card-02.component';
3 | export * from './card-03.component';
4 | export * from './card-04.component';
5 | export * from './card-05.component';
6 | export * from './card-06.component';
7 | export * from './card-07.component';
8 | export * from './card-08.component';
9 | export * from './card-09.component';
10 | export * from './card-10.component';
11 | export * from './card-11.component';
12 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-01.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
3 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
4 |
5 | @Component({
6 | selector: 'sim-checkbox-01',
7 | standalone: true,
8 | imports: [HlmCheckboxComponent, HlmLabelDirective],
9 | template: `
10 |
14 | `,
15 | })
16 | export class Checkbox01Component {}
17 |
18 | export const checkbox01Code = `
19 | import { Component } from '@angular/core';
20 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
21 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
22 |
23 | @Component({
24 | selector: 'sim-checkbox-01',
25 | standalone: true,
26 | imports: [HlmCheckboxComponent, HlmLabelDirective],
27 | template: \`
28 |
32 | \`,
33 | })
34 | export class Checkbox01Component {}
35 | `;
36 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-03.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { provideIcons } from '@ng-icons/core';
3 | import { lucideMoon } from '@ng-icons/lucide';
4 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
5 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
6 |
7 | @Component({
8 | selector: 'sim-checkbox-03',
9 | standalone: true,
10 | imports: [HlmCheckboxComponent, HlmLabelDirective],
11 | providers: [provideIcons({ lucideMoon })],
12 | template: `
13 |
17 | `,
18 | })
19 | export class Checkbox03Component {}
20 |
21 | export const checkbox03Code = `
22 | import { provideIcons } from '@ng-icons/core';
23 | import { lucideMoon } from '@ng-icons/lucide';
24 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
25 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
26 |
27 | @Component({
28 | selector: 'sim-checkbox-03',
29 | standalone: true,
30 | imports: [HlmCheckboxComponent, HlmLabelDirective],
31 | providers: [provideIcons({ lucideMoon })],
32 | template: \`
33 |
37 | \`,
38 | })
39 | export class Checkbox03Component {}
40 | `;
41 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-04.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, model } from '@angular/core';
2 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
3 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
4 |
5 | @Component({
6 | selector: 'sim-checkbox-04',
7 | standalone: true,
8 | imports: [HlmCheckboxComponent, HlmLabelDirective],
9 | template: `
10 |
14 | `,
15 | })
16 | export class Checkbox04Component {
17 | public readonly checked = model('indeterminate');
18 | }
19 |
20 | export const checkbox04Code = `
21 | import { Component, model } from '@angular/core';
22 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
23 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
24 |
25 | @Component({
26 | selector: 'sim-checkbox-04',
27 | standalone: true,
28 | imports: [HlmCheckboxComponent, HlmLabelDirective],
29 | template: \`
30 |
34 | \`,
35 | })
36 | export class Checkbox04Component {
37 | public readonly checked = model('indeterminate');
38 | }
39 | `;
40 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-05.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
3 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
4 |
5 | @Component({
6 | selector: 'sim-checkbox-05',
7 | standalone: true,
8 | imports: [HlmCheckboxComponent, HlmLabelDirective],
9 | template: `
10 |
14 | `,
15 | })
16 | export class Checkbox05Component {}
17 |
18 | export const checkbox05Code = `
19 | import { Component } from '@angular/core';
20 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
21 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
22 |
23 | @Component({
24 | selector: 'sim-checkbox-05',
25 | standalone: true,
26 | imports: [HlmCheckboxComponent, HlmLabelDirective],
27 | template: \`
28 |
32 | \`,
33 | })
34 | export class Checkbox05Component {}
35 | `;
36 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-06.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
3 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
4 |
5 | @Component({
6 | selector: 'sim-checkbox-06',
7 | standalone: true,
8 | imports: [HlmCheckboxComponent, HlmLabelDirective],
9 | template: `
10 |
14 | `,
15 | })
16 | export class Checkbox06Component {}
17 |
18 | export const checkbox06Code = `
19 | import { Component } from '@angular/core';
20 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
21 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
22 |
23 | @Component({
24 | selector: 'sim-checkbox-06',
25 | standalone: true,
26 | imports: [HlmCheckboxComponent, HlmLabelDirective],
27 | template: \`
28 |
32 | \`,
33 | })
34 | export class Checkbox06Component {}
35 | `;
36 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-11.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
3 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
4 |
5 | @Component({
6 | selector: 'sim-checkbox-11',
7 | standalone: true,
8 | imports: [HlmCheckboxComponent, HlmLabelDirective],
9 | host: {
10 | class: 'w-full',
11 | },
12 | template: `
13 |
14 |
15 |
16 |
17 | `,
18 | })
19 | export class Checkbox11Component {}
20 |
21 | export const checkbox11Code = `
22 | import { Component } from '@angular/core';
23 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
24 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
25 |
26 | @Component({
27 | selector: 'sim-checkbox-11',
28 | standalone: true,
29 | imports: [HlmCheckboxComponent, HlmLabelDirective],
30 | host: {
31 | class: 'w-full',
32 | },
33 | template: \`
34 |
35 |
36 |
37 |
38 | \`,
39 | })
40 | export class Checkbox11Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/checkbox-13.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
3 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
4 |
5 | @Component({
6 | selector: 'sim-checkbox-13',
7 | standalone: true,
8 | imports: [HlmCheckboxComponent, HlmLabelDirective],
9 | template: `
10 |
17 | `,
18 | })
19 | export class Checkbox13Component {}
20 |
21 | export const checkbox13Code = `
22 | import { Component } from '@angular/core';
23 | import { HlmCheckboxComponent } from '@spartan-ng/ui-checkbox-helm';
24 | import { HlmLabelDirective } from '@spartan-ng/ui-label-helm';
25 |
26 | @Component({
27 | selector: 'sim-checkbox-13',
28 | standalone: true,
29 | imports: [HlmCheckboxComponent, HlmLabelDirective],
30 | template: \`
31 |
38 | \`,
39 | })
40 | export class Checkbox13Component {}
41 | `;
42 |
--------------------------------------------------------------------------------
/src/app/components/checkbox/index.ts:
--------------------------------------------------------------------------------
1 | export * from './checkbox-01.component';
2 | export * from './checkbox-02.component';
3 | export * from './checkbox-03.component';
4 | export * from './checkbox-04.component';
5 | export * from './checkbox-05.component';
6 | export * from './checkbox-06.component';
7 | export * from './checkbox-07.component';
8 | export * from './checkbox-08.component';
9 | export * from './checkbox-09.component';
10 | export * from './checkbox-10.component';
11 | export * from './checkbox-11.component';
12 | export * from './checkbox-12.component';
13 | export * from './checkbox-13.component';
14 | export * from './checkbox-14.component';
15 | export * from './checkbox-15.component';
16 | export * from './checkbox-16.component';
17 | export * from './checkbox-17.component';
18 | export * from './checkbox-18.component';
19 | export * from './checkbox-19.component';
20 | export * from './checkbox-20.component';
21 | export * from './checkbox-21.component';
22 | export * from './checkbox-22.component';
23 |
--------------------------------------------------------------------------------
/src/app/components/dialog/index.ts:
--------------------------------------------------------------------------------
1 | export * from './dialog-01.component';
2 | export * from './dialog-02.component';
3 | export * from './dialog-03.component';
4 | export * from './dialog-04.component';
5 | export * from './dialog-05.component';
6 | export * from './dialog-06.component';
7 | export * from './dialog-07.component';
8 | export * from './dialog-08.component';
9 | export * from './dialog-09.component';
10 | export * from './dialog-10.component';
11 | export * from './dialog-11.component';
12 | export * from './dialog-12.component';
13 | export * from './dialog-13.component';
14 | export * from './dialog-14.component';
15 | export * from './dialog-15.component';
16 | export * from './dialog-16.component';
17 | export * from './dialog-17.component';
18 | export * from './dialog-18.component';
19 | export * from './dialog-19.component';
20 | export * from './dialog-20.component';
21 | export * from './dialog-21.component';
22 | export * from './dialog-22.component';
23 | export * from './dialog-23.component';
24 | export * from './dialog-24.component';
25 | export * from './dialog-25.component';
26 | export * from './dialog-26.component';
27 | export * from './dialog-27.component';
28 | export * from './dialog-28.component';
29 | export * from './dialog-29.component';
30 | export * from './dialog-30.component';
31 | export * from './dialog-31.component';
32 | export * from './dialog-32.component';
33 | export * from './dialog-33.component';
34 | export * from './dialog-34.component';
35 | export * from './dialog-35.component';
36 |
--------------------------------------------------------------------------------
/src/app/components/file-upload/index.ts:
--------------------------------------------------------------------------------
1 | export * from './file-upload-01.component';
2 | export * from './file-upload-02.component';
3 | export * from './file-upload-03.component';
4 | export * from './file-upload-04.component';
5 | export * from './file-upload-05.component';
6 | export * from './file-upload-06.component';
7 | export * from './file-upload-07.component';
8 | export * from './file-upload-08.component';
9 | export * from './file-upload-09.component';
10 | export * from './file-upload-10.component';
11 | export * from './file-upload-11.component';
12 | export * from './file-upload-12.component';
13 | export * from './file-upload-13.component';
14 |
--------------------------------------------------------------------------------
/src/app/components/notification/notification-31.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 | import { toast } from 'ngx-sonner';
4 |
5 | @Component({
6 | selector: 'sim-notification-31',
7 | standalone: true,
8 | imports: [HlmButtonDirective],
9 | template: `
10 |
11 | `,
12 | })
13 | export class Notification31Component {
14 | showNotification() {
15 | toast.success('Saved your changes', { position: 'bottom-center' });
16 | }
17 | }
18 |
19 | export const notification31Code = `
20 | import { Component } from '@angular/core';
21 | import { toast } from 'ngx-sonner';
22 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
23 |
24 | @Component({
25 | selector: 'sim-notification-31',
26 | standalone: true,
27 | imports: [HlmButtonDirective],
28 | template: \`
29 |
38 | \`,
39 | })
40 | export class Notification31Component {
41 | showNotification() {
42 | toast.success('Saved your changes', { position: 'bottom-center' });
43 | }
44 | }
45 | `;
46 |
--------------------------------------------------------------------------------
/src/app/components/notification/notification-32.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
3 | import { toast } from 'ngx-sonner';
4 |
5 | @Component({
6 | selector: 'sim-notification-32',
7 | standalone: true,
8 | imports: [HlmButtonDirective],
9 | template: `
10 |
11 | `,
12 | })
13 | export class Notification32Component {
14 | showNotification() {
15 | toast.success('Saved your changes', {
16 | closeButton: true,
17 | });
18 | }
19 | }
20 |
21 | export const notification32Code = `
22 | import { Component } from '@angular/core';
23 | import { toast } from 'ngx-sonner';
24 | import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
25 |
26 | @Component({
27 | selector: 'sim-notification-32',
28 | standalone: true,
29 | imports: [HlmButtonDirective],
30 | template: \`
31 |
40 | \`,
41 | })
42 | export class Notification32Component {
43 | showNotification() {
44 | toast.success('Saved your changes', {
45 | closeButton: true,
46 | });
47 | }
48 | }
49 | `;
50 |
--------------------------------------------------------------------------------
/src/app/components/tabs/index.ts:
--------------------------------------------------------------------------------
1 | export * from './tabs-01.component';
2 | export * from './tabs-02.component';
3 | export * from './tabs-03.component';
4 | export * from './tabs-04.component';
5 | export * from './tabs-05.component';
6 | export * from './tabs-06.component';
7 | export * from './tabs-07.component';
8 | export * from './tabs-08.component';
9 | export * from './tabs-09.component';
10 | export * from './tabs-10.component';
11 | export * from './tabs-11.component';
12 | export * from './tabs-12.component';
13 | export * from './tabs-13.component';
14 | export * from './tabs-14.component';
15 | export * from './tabs-15.component';
16 | export * from './tabs-16.component';
17 | export * from './tabs-17.component';
18 | export * from './tabs-18.component';
19 | export * from './tabs-19.component';
20 | export * from './tabs-20.component';
21 |
--------------------------------------------------------------------------------
/src/app/constants/index.ts:
--------------------------------------------------------------------------------
1 | export * from './accordion.constant';
2 | export * from './alert.constant';
3 | export * from './avatar.constant';
4 | export * from './badge.constant';
5 | export * from './banner.constant';
6 | export * from './breadcrumb.constant';
7 | export * from './button.constant';
8 | export * from './card.constant';
9 | export * from './checkbox.constant';
10 | export * from './dialog.constant';
11 | export * from './file-upload.constant';
12 | export * from './notification.constant';
13 | export * from './tabs.constant';
14 |
--------------------------------------------------------------------------------
/src/app/core/card/card-background.directive.ts:
--------------------------------------------------------------------------------
1 | import { computed, Directive, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[dfCardBackground]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class CardBackgroundDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm('relative rounded-xl bg-bg-secondary-subtle border-border-secondary border-[1px] shadow-xs', this.userClass()),
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/core/card/card-body.directive.ts:
--------------------------------------------------------------------------------
1 | import { computed, Directive, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[dfCardBody]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class CardBodyDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() => hlm('p-5', this.userClass()));
16 | }
17 |
--------------------------------------------------------------------------------
/src/app/core/card/card-footer.directive.ts:
--------------------------------------------------------------------------------
1 | import { computed, Directive, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[dfCardFooter]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class CardFooterDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm('px-4 py-3 border-t-[1px] border-border-secondary', this.userClass()),
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/core/card/card.directive.ts:
--------------------------------------------------------------------------------
1 | import { computed, Directive, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[dfCard]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class CardDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm('rounded-xl bg-background border-secondary border-[1px] shadow-xs overflow-hidden', this.userClass()),
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/core/card/index.ts:
--------------------------------------------------------------------------------
1 | export * from './card-background.directive';
2 | export * from './card-body.directive';
3 | export * from './card-footer.directive';
4 | export * from './card.directive';
5 |
--------------------------------------------------------------------------------
/src/app/core/component-header.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'component-header',
5 | standalone: true,
6 | template: `
7 |
8 |
{{ name() }}
9 |
10 | {{ description() }}
11 |
12 |
13 | `,
14 | })
15 | export class ComponentHeaderComponent {
16 | name = input.required();
17 | description = input.required();
18 | constructor() {}
19 | }
20 |
--------------------------------------------------------------------------------
/src/app/core/constants.ts:
--------------------------------------------------------------------------------
1 | export const REPO_LINK = 'https://github.com/dofu-lab/simui';
2 | export const X_LINK = 'https://x.com/PhuongTranDong';
3 | export const DISCUSSION_LINK = 'https://github.com/dofu-lab/simui/discussions/categories/ideas';
4 |
--------------------------------------------------------------------------------
/src/app/core/footer.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-footer',
5 | standalone: true,
6 | template: `
7 |
21 | `,
22 | })
23 | export class FooterComponent {}
24 |
--------------------------------------------------------------------------------
/src/app/core/index.ts:
--------------------------------------------------------------------------------
1 | export * from './code-preview.component';
2 | export * from './component-card.component';
3 | export * from './component-header.component';
4 | export * from './footer.component';
5 | export * from './header.component';
6 | export * from './page-grid.component';
7 | export * from './theme.service';
8 | export * from './types';
9 |
--------------------------------------------------------------------------------
/src/app/core/navigation.service.ts:
--------------------------------------------------------------------------------
1 | import { inject, Injectable } from '@angular/core';
2 | import { Router } from '@angular/router';
3 |
4 | @Injectable({ providedIn: 'root' })
5 | export class NavigationService {
6 | router = inject(Router);
7 |
8 | navigateTo(route: string): void {
9 | this.router.navigate([route]);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/app/core/page-grid.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, input } from '@angular/core';
2 | import { ComponentCardComponent } from './component-card.component';
3 | import { SuggestionComponent } from './suggestion.component';
4 | import { ComponentCardItem } from './types';
5 |
6 | @Component({
7 | selector: 'page-grid',
8 | standalone: true,
9 | template: `
10 |
11 |
12 |
13 | @for (component of components(); track component.id) {
14 |
20 | }
21 |
22 |
23 |
24 |
25 | `,
26 | imports: [ComponentCardComponent, SuggestionComponent],
27 | })
28 | export class PageGridComponent {
29 | components = input([]);
30 | }
31 |
--------------------------------------------------------------------------------
/src/app/core/suggestion.component.ts:
--------------------------------------------------------------------------------
1 | import { HlmButtonDirective } from '@/libs/ui/ui-button-helm/src';
2 | import { Component } from '@angular/core';
3 | import { DISCUSSION_LINK } from './constants';
4 |
5 | @Component({
6 | selector: 'app-suggestion',
7 | imports: [HlmButtonDirective],
8 | template: `
9 |
10 | Didn't find what you were looking for?
11 |
12 |
13 | `,
14 | })
15 | export class SuggestionComponent {
16 | goToDiscussion() {
17 | window.open(DISCUSSION_LINK, '_blank');
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/app/core/types.ts:
--------------------------------------------------------------------------------
1 | import { Type } from '@angular/core';
2 |
3 | export type ComponentCardItem = {
4 | id: string;
5 | component: Type;
6 | colNumber: number;
7 | itemStyle: number;
8 | code?: string;
9 | };
10 |
--------------------------------------------------------------------------------
/src/app/pages/accordion.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { accordionComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-accordion',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
12 |
13 | `,
14 | })
15 | export class AccordionComponent {
16 | components = accordionComponents;
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/pages/alert.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { alertComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-alert',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
10 |
11 | `,
12 | })
13 | export class AlertComponent {
14 | components = alertComponents;
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/pages/avatar.component.ts:
--------------------------------------------------------------------------------
1 | import { ComponentHeaderComponent, PageGridComponent } from '@/app/core';
2 | import { Component } from '@angular/core';
3 | import { avatarComponents } from '../constants';
4 |
5 | @Component({
6 | selector: 'app-avatar',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
10 |
11 | `,
12 | })
13 | export class AvatarComponent {
14 | components = avatarComponents;
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/pages/badge.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { badgeComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-badge',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
13 |
14 | `,
15 | })
16 | export class BadgeComponent {
17 | components = badgeComponents;
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/pages/banner.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { bannerComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-banner',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
13 |
14 | `,
15 | })
16 | export class BannerComponent {
17 | components = bannerComponents;
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/pages/breadcrumb.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { breadcrumbComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-breadcrumb',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
13 |
14 | `,
15 | })
16 | export class BreadcrumbComponent {
17 | components = breadcrumbComponents;
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/pages/button.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { buttonComponents } from '../constants/button.constant';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-button',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
10 |
14 |
15 | `,
16 | })
17 | export class ButtonComponent {
18 | components = buttonComponents;
19 | }
20 |
--------------------------------------------------------------------------------
/src/app/pages/card.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { cardComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-card',
7 | standalone: true,
8 | imports: [PageGridComponent, ComponentHeaderComponent],
9 | template: `
10 |
13 |
14 | `,
15 | })
16 | export class CardComponent {
17 | components = cardComponents;
18 | }
19 |
--------------------------------------------------------------------------------
/src/app/pages/checkbox.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { checkBoxComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-checkbox',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
12 |
13 | `,
14 | })
15 | export class CheckboxComponent {
16 | components = checkBoxComponents;
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/pages/comp-layout.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { RouterOutlet } from '@angular/router';
3 |
4 | @Component({
5 | selector: 'app-comp-layout',
6 | imports: [RouterOutlet],
7 | template: `
8 |
13 | `,
14 | })
15 | export class CompLayoutComponent {}
16 |
--------------------------------------------------------------------------------
/src/app/pages/dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { dialogComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-dialog',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
12 |
13 | `,
14 | })
15 | export class DialogComponent {
16 | components = dialogComponents;
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/pages/file-upload.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { fileUploadComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-file-upload',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
12 |
13 | `,
14 | })
15 | export class FileUploadComponent {
16 | components = fileUploadComponents;
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './accordion.component';
2 | export * from './alert.component';
3 | export * from './avatar.component';
4 | export * from './badge.component';
5 | export * from './banner.component';
6 | export * from './breadcrumb.component';
7 | export * from './button.component';
8 | export * from './card.component';
9 | export * from './checkbox.component';
10 | export * from './comp-layout.component';
11 | export * from './dialog.component';
12 | export * from './file-upload.component';
13 | export * from './home.component';
14 | export * from './intro.component';
15 | export * from './notification.component';
16 | export * from './tabs.component';
17 |
--------------------------------------------------------------------------------
/src/app/pages/notification.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { notificationComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-notification',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
10 |
11 | `,
12 | })
13 | export class NotificationComponent {
14 | components = notificationComponents;
15 | }
16 |
--------------------------------------------------------------------------------
/src/app/pages/tabs.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { tabsComponents } from '../constants';
3 | import { ComponentHeaderComponent, PageGridComponent } from '../core';
4 |
5 | @Component({
6 | selector: 'app-tabs',
7 | imports: [PageGridComponent, ComponentHeaderComponent],
8 | template: `
9 |
12 |
13 | `,
14 | })
15 | export class TabsComponent {
16 | components = tabsComponents;
17 | }
18 |
--------------------------------------------------------------------------------
/src/app/types/component-info.type.ts:
--------------------------------------------------------------------------------
1 | export type ComponentInfo = {
2 | name: string;
3 | description?: string;
4 | compNumber: number;
5 | image: string;
6 | path: string;
7 | isNew?: boolean;
8 | };
9 |
--------------------------------------------------------------------------------
/src/app/types/index.ts:
--------------------------------------------------------------------------------
1 | export * from './component-info.type';
2 |
--------------------------------------------------------------------------------
/src/assets/avatars/alan-cooper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/alan-cooper.png
--------------------------------------------------------------------------------
/src/assets/avatars/alex-stanton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/alex-stanton.png
--------------------------------------------------------------------------------
/src/assets/avatars/alexis-sears.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/alexis-sears.png
--------------------------------------------------------------------------------
/src/assets/avatars/anna-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/anna-white.png
--------------------------------------------------------------------------------
/src/assets/avatars/annie-stanley-large.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/annie-stanley-large.jpg
--------------------------------------------------------------------------------
/src/assets/avatars/annie-stanley-square.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/annie-stanley-square.jpg
--------------------------------------------------------------------------------
/src/assets/avatars/james-gouse.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/james-gouse.jpg
--------------------------------------------------------------------------------
/src/assets/avatars/jessica-lambert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/jessica-lambert.png
--------------------------------------------------------------------------------
/src/assets/avatars/julia-philips.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/julia-philips.png
--------------------------------------------------------------------------------
/src/assets/avatars/marcus-levin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/marcus-levin.png
--------------------------------------------------------------------------------
/src/assets/avatars/mathilde-lewis.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/mathilde-lewis.png
--------------------------------------------------------------------------------
/src/assets/avatars/skylar-dias.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/avatars/skylar-dias.png
--------------------------------------------------------------------------------
/src/assets/backgrounds/bg-01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/backgrounds/bg-01.jpg
--------------------------------------------------------------------------------
/src/assets/backgrounds/bg-02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/backgrounds/bg-02.jpg
--------------------------------------------------------------------------------
/src/assets/backgrounds/bg-03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/backgrounds/bg-03.jpg
--------------------------------------------------------------------------------
/src/assets/backgrounds/bg-04.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/backgrounds/bg-04.jpg
--------------------------------------------------------------------------------
/src/assets/backgrounds/bg-05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/backgrounds/bg-05.jpg
--------------------------------------------------------------------------------
/src/assets/backgrounds/bg-06.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/backgrounds/bg-06.jpg
--------------------------------------------------------------------------------
/src/assets/flags/CH.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/flags/JP.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/flags/VN.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/logos/logo-base.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/logos/logo-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/logos/logo-with-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/logos/logo-with-bg.png
--------------------------------------------------------------------------------
/src/assets/products/concert.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/products/concert.webp
--------------------------------------------------------------------------------
/src/assets/products/disc.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/products/disc.webp
--------------------------------------------------------------------------------
/src/assets/products/product-1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/products/product-1.webp
--------------------------------------------------------------------------------
/src/assets/qr-code.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/qr-code.jpg
--------------------------------------------------------------------------------
/src/assets/thumbnails/accordion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/accordion.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/alert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/alert.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/avatar.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/badge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/badge.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/banner.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/breadcrumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/breadcrumb.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/button.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/card.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/checkbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/checkbox.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-accordion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-accordion.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-alert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-alert.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-avatar.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-badge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-badge.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-banner.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-breadcrumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-breadcrumb.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-button.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-card.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-checkbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-checkbox.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-dialog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-dialog.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-file-upload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-file-upload.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-notification.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-popover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-popover.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dark-tabs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dark-tabs.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dialog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dialog.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/dropdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/dropdown.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/file-upload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/file-upload.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/notification.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/popover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/popover.png
--------------------------------------------------------------------------------
/src/assets/thumbnails/tabs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dofu-lab/simui/ce71ae42309379416b49062a2a229d873e28deb9/src/assets/thumbnails/tabs.png
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Simui
6 |
7 |
8 |
9 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/libs/sim/ui-file-helm/index.ts:
--------------------------------------------------------------------------------
1 | export * from './lib/file-drag-drop.directive';
--------------------------------------------------------------------------------
/src/libs/ui/ui-accordion-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmAccordionContentComponent } from './lib/hlm-accordion-content.component';
4 | import { HlmAccordionIconDirective } from './lib/hlm-accordion-icon.directive';
5 | import { HlmAccordionItemDirective } from './lib/hlm-accordion-item.directive';
6 | import { HlmAccordionTriggerDirective } from './lib/hlm-accordion-trigger.directive';
7 | import { HlmAccordionDirective } from './lib/hlm-accordion.directive';
8 |
9 | export * from './lib/hlm-accordion-content.component';
10 | export * from './lib/hlm-accordion-icon.directive';
11 | export * from './lib/hlm-accordion-item.directive';
12 | export * from './lib/hlm-accordion-trigger.directive';
13 | export * from './lib/hlm-accordion.directive';
14 |
15 | export const HlmAccordionImports = [
16 | HlmAccordionDirective,
17 | HlmAccordionItemDirective,
18 | HlmAccordionTriggerDirective,
19 | HlmAccordionIconDirective,
20 | HlmAccordionContentComponent,
21 | ] as const;
22 |
23 | @NgModule({
24 | imports: [...HlmAccordionImports],
25 | exports: [...HlmAccordionImports],
26 | })
27 | export class HlmAccordionModule {}
28 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-accordion-helm/src/lib/hlm-accordion-content.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, input } from '@angular/core';
2 | import { BrnAccordionContentComponent } from '@spartan-ng/brain/accordion';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Component({
7 | selector: 'hlm-accordion-content',
8 | template: `
9 |
14 | `,
15 | standalone: true,
16 | changeDetection: ChangeDetectionStrategy.OnPush,
17 | encapsulation: ViewEncapsulation.None,
18 | host: {
19 | '[class]': '_computedClass()',
20 | },
21 | })
22 | export class HlmAccordionContentComponent extends BrnAccordionContentComponent {
23 | public readonly userClass = input('', { alias: 'class' });
24 | protected readonly _computedClass = computed(() => {
25 | const gridRows = this.state() === 'open' ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]';
26 | return hlm('text-sm transition-all grid', gridRows, this.userClass());
27 | });
28 |
29 | constructor() {
30 | super();
31 | this.setClassToCustomElement('pt-1 pb-4');
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-accordion-helm/src/lib/hlm-accordion-icon.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { provideIcons } from '@ng-icons/core';
3 | import { lucideChevronDown } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import { provideHlmIconConfig } from '@spartan-ng/ui-icon-helm';
6 | import type { ClassValue } from 'clsx';
7 |
8 | @Directive({
9 | selector: 'ng-icon[hlmAccordionIcon], ng-icon[hlmAccIcon]',
10 | standalone: true,
11 | providers: [provideIcons({ lucideChevronDown }), provideHlmIconConfig({ size: 'sm' })],
12 | host: {
13 | '[class]': '_computedClass()',
14 | },
15 | })
16 | export class HlmAccordionIconDirective {
17 | public readonly userClass = input('', { alias: 'class' });
18 | protected readonly _computedClass = computed(() =>
19 | hlm('inline-block h-4 w-4 transition-transform [animation-duration:200]', this.userClass()),
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-accordion-helm/src/lib/hlm-accordion-item.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { BrnAccordionItemDirective } from '@spartan-ng/brain/accordion';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmAccordionItem],brn-accordion-item[hlm],hlm-accordion-item',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [
13 | {
14 | directive: BrnAccordionItemDirective,
15 | inputs: ['isOpened'],
16 | },
17 | ],
18 | })
19 | export class HlmAccordionItemDirective {
20 | public readonly userClass = input('', { alias: 'class' });
21 | protected readonly _computedClass = computed(() =>
22 | hlm('flex flex-1 flex-col border-b border-border', this.userClass()),
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-accordion-helm/src/lib/hlm-accordion-trigger.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { BrnAccordionTriggerDirective } from '@spartan-ng/brain/accordion';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmAccordionTrigger]',
8 | standalone: true,
9 | host: {
10 | '[style.--tw-ring-offset-shadow]': '"0 0 #000"',
11 | '[class]': '_computedClass()',
12 | },
13 | hostDirectives: [BrnAccordionTriggerDirective],
14 | })
15 | export class HlmAccordionTriggerDirective {
16 | public readonly userClass = input('', { alias: 'class' });
17 | protected _computedClass = computed(() =>
18 | hlm(
19 | 'w-full focus-visible:outline-none text-sm focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 flex flex-1 items-center justify-between py-4 px-0.5 font-medium underline-offset-4 hover:underline [&[data-state=open]>[hlmAccordionIcon]]:rotate-180 [&[data-state=open]>[hlmAccIcon]]:rotate-180',
20 | this.userClass(),
21 | ),
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-accordion-helm/src/lib/hlm-accordion.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, inject, input } from '@angular/core';
2 | import { BrnAccordionDirective } from '@spartan-ng/brain/accordion';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmAccordion], hlm-accordion',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [{ directive: BrnAccordionDirective, inputs: ['type', 'dir', 'orientation'] }],
13 | })
14 | export class HlmAccordionDirective {
15 | private readonly _brn = inject(BrnAccordionDirective);
16 |
17 | public readonly userClass = input('', { alias: 'class' });
18 | protected readonly _computedClass = computed(() =>
19 | hlm('flex', this._brn.orientation() === 'horizontal' ? 'flex-row' : 'flex-col', this.userClass()),
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-alert-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmAlertDescriptionDirective } from './lib/hlm-alert-description.directive';
4 | import { HlmAlertIconDirective } from './lib/hlm-alert-icon.directive';
5 | import { HlmAlertTitleDirective } from './lib/hlm-alert-title.directive';
6 | import { HlmAlertDirective } from './lib/hlm-alert.directive';
7 |
8 | export * from './lib/hlm-alert-description.directive';
9 | export * from './lib/hlm-alert-icon.directive';
10 | export * from './lib/hlm-alert-title.directive';
11 | export * from './lib/hlm-alert.directive';
12 |
13 | export const HlmAlertImports = [
14 | HlmAlertDirective,
15 | HlmAlertTitleDirective,
16 | HlmAlertDescriptionDirective,
17 | HlmAlertIconDirective,
18 | ] as const;
19 |
20 | @NgModule({
21 | imports: [...HlmAlertImports],
22 | exports: [...HlmAlertImports],
23 | })
24 | export class HlmAlertModule {}
25 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-alert-helm/src/lib/hlm-alert-description.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const alertDescriptionVariants = cva('text-sm [&_p]:leading-relaxed', {
7 | variants: {},
8 | });
9 | export type AlertDescriptionVariants = VariantProps;
10 |
11 | @Directive({
12 | selector: '[hlmAlertDesc],[hlmAlertDescription]',
13 | standalone: true,
14 | host: {
15 | '[class]': '_computedClass()',
16 | },
17 | })
18 | export class HlmAlertDescriptionDirective {
19 | public readonly userClass = input('', { alias: 'class' });
20 | protected readonly _computedClass = computed(() => hlm(alertDescriptionVariants(), this.userClass()));
21 | }
22 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-alert-helm/src/lib/hlm-alert-icon.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '@angular/core';
2 | import { provideHlmIconConfig } from '@spartan-ng/ui-icon-helm';
3 |
4 | @Directive({
5 | selector: '[hlmAlertIcon]',
6 | standalone: true,
7 | providers: [provideHlmIconConfig({ size: 'sm' })],
8 | })
9 | export class HlmAlertIconDirective {}
10 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-alert-helm/src/lib/hlm-alert-title.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const alertTitleVariants = cva('mb-1 font-medium leading-none tracking-tight', {
7 | variants: {},
8 | });
9 | export type AlertTitleVariants = VariantProps;
10 |
11 | @Directive({
12 | selector: '[hlmAlertTitle]',
13 | standalone: true,
14 | host: {
15 | '[class]': '_computedClass()',
16 | },
17 | })
18 | export class HlmAlertTitleDirective {
19 | public readonly userClass = input('', { alias: 'class' });
20 | protected readonly _computedClass = computed(() => hlm(alertTitleVariants(), this.userClass()));
21 | }
22 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-alert-helm/src/lib/hlm-alert.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const alertVariants = cva(
7 | 'relative w-full rounded-lg border border-border p-4 [&>[hlmAlertIcon]]:absolute [&>[hlmAlertIcon]]:text-foreground [&>[hlmAlertIcon]]:left-4 [&>[hlmAlertIcon]]:top-4 [&>[hlmAlertIcon]+div]:translate-y-[-3px] [&>[hlmAlertIcon]~*]:pl-7',
8 | {
9 | variants: {
10 | variant: {
11 | default: 'bg-background text-foreground',
12 | destructive:
13 | 'text-destructive border-destructive/50 dark:border-destructive [&>[hlmAlertIcon]]:text-destructive',
14 | },
15 | },
16 | defaultVariants: {
17 | variant: 'default',
18 | },
19 | },
20 | );
21 | export type AlertVariants = VariantProps;
22 |
23 | @Directive({
24 | selector: '[hlmAlert]',
25 | standalone: true,
26 | host: {
27 | role: 'alert',
28 | '[class]': '_computedClass()',
29 | },
30 | })
31 | export class HlmAlertDirective {
32 | public readonly userClass = input('', { alias: 'class' });
33 | protected readonly _computedClass = computed(() => hlm(alertVariants({ variant: this.variant() }), this.userClass()));
34 |
35 | public readonly variant = input('default');
36 | }
37 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-aspectratio-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmAspectRatioDirective } from './lib/helm-aspect-ratio.directive';
3 |
4 | export * from './lib/helm-aspect-ratio.directive';
5 |
6 | @NgModule({
7 | imports: [HlmAspectRatioDirective],
8 | exports: [HlmAspectRatioDirective],
9 | })
10 | export class HlmAspectRatioModule {}
11 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-avatar-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmAvatarFallbackDirective } from './lib/fallback';
4 | import { HlmAvatarComponent } from './lib/hlm-avatar.component';
5 | import { HlmAvatarImageDirective } from './lib/image';
6 |
7 | export * from './lib/fallback';
8 | export * from './lib/hlm-avatar.component';
9 | export * from './lib/image';
10 |
11 | export const HlmAvatarImports = [HlmAvatarFallbackDirective, HlmAvatarImageDirective, HlmAvatarComponent] as const;
12 |
13 | @NgModule({
14 | imports: [...HlmAvatarImports],
15 | exports: [...HlmAvatarImports],
16 | })
17 | export class HlmAvatarModule {}
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-avatar-helm/src/lib/fallback/hlm-avatar-fallback.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, inject } from '@angular/core';
2 | import { BrnAvatarFallbackDirective, hexColorFor, isBright } from '@spartan-ng/brain/avatar';
3 | import { hlm } from '@spartan-ng/brain/core';
4 |
5 | @Directive({
6 | selector: '[hlmAvatarFallback]',
7 | standalone: true,
8 | exportAs: 'avatarFallback',
9 | hostDirectives: [
10 | {
11 | directive: BrnAvatarFallbackDirective,
12 | inputs: ['class:class', 'autoColor:autoColor'],
13 | },
14 | ],
15 | host: {
16 | '[class]': '_computedClass()',
17 | '[style.backgroundColor]': "_hex() || ''",
18 | },
19 | })
20 | export class HlmAvatarFallbackDirective {
21 | private readonly _brn = inject(BrnAvatarFallbackDirective);
22 | private readonly _hex = computed(() => {
23 | if (!this._brn.autoColor() || !this._brn.getTextContent()) return;
24 | return hexColorFor(this._brn.getTextContent());
25 | });
26 |
27 | private readonly _autoColorTextCls = computed(() => {
28 | const hex = this._hex();
29 | if (!hex) return;
30 | return `${isBright(hex) ? 'text-black' : 'text-white'}`;
31 | });
32 |
33 | protected readonly _computedClass = computed(() => {
34 | return hlm(
35 | 'flex h-full w-full items-center justify-center rounded-full',
36 | this._autoColorTextCls() ?? 'bg-muted',
37 | this._brn?.userClass(),
38 | );
39 | });
40 | }
41 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-avatar-helm/src/lib/fallback/index.ts:
--------------------------------------------------------------------------------
1 | export * from './hlm-avatar-fallback.directive';
2 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-avatar-helm/src/lib/image/hlm-avatar-image.directive.spec.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { type ComponentFixture, TestBed } from '@angular/core/testing';
3 | import { HlmAvatarImageDirective } from './hlm-avatar-image.directive';
4 |
5 | @Component({
6 | selector: 'hlm-mock',
7 | standalone: true,
8 | imports: [HlmAvatarImageDirective],
9 | template: `
10 |
11 | `,
12 | })
13 | class HlmMockComponent {
14 | public userCls = '';
15 | }
16 |
17 | describe('HlmAvatarImageDirective', () => {
18 | let component: HlmMockComponent;
19 | let fixture: ComponentFixture;
20 |
21 | beforeEach(() => {
22 | fixture = TestBed.createComponent(HlmMockComponent);
23 | component = fixture.componentInstance;
24 | });
25 |
26 | it('should compile', () => {
27 | expect(component).toBeTruthy();
28 | });
29 |
30 | it('should add the default classes if no inputs are provided', () => {
31 | fixture.detectChanges();
32 | expect(fixture.nativeElement.querySelector('img').className).toBe('aspect-square h-full object-cover w-full');
33 | });
34 |
35 | it('should add any user defined classes', async () => {
36 | component.userCls = 'test-class';
37 | fixture.detectChanges();
38 |
39 | // fallback uses Promise.resolve().then() so we need to wait for the next tick
40 | setTimeout(() => {
41 | expect(fixture.nativeElement.querySelector('img').className).toContain('test-class');
42 | });
43 | });
44 | });
45 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-avatar-helm/src/lib/image/hlm-avatar-image.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, inject, input } from '@angular/core';
2 | import { BrnAvatarImageDirective } from '@spartan-ng/brain/avatar';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: 'img[hlmAvatarImage]',
8 | standalone: true,
9 | exportAs: 'avatarImage',
10 | hostDirectives: [BrnAvatarImageDirective],
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | })
15 | export class HlmAvatarImageDirective {
16 | public canShow = inject(BrnAvatarImageDirective).canShow;
17 |
18 | public readonly userClass = input('', { alias: 'class' });
19 | protected _computedClass = computed(() => hlm('aspect-square object-cover h-full w-full', this.userClass()));
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-avatar-helm/src/lib/image/index.ts:
--------------------------------------------------------------------------------
1 | export * from './hlm-avatar-image.directive';
2 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-badge-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmBadgeDirective } from './lib/hlm-badge.directive';
3 |
4 | export * from './lib/hlm-badge.directive';
5 |
6 | @NgModule({
7 | imports: [HlmBadgeDirective],
8 | exports: [HlmBadgeDirective],
9 | })
10 | export class HlmBadgeModule {}
11 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmBreadcrumbEllipsisComponent } from './lib/breadcrumb-ellipsis.component';
3 | import { HlmBreadcrumbItemDirective } from './lib/breadcrumb-item.directive';
4 | import { HlmBreadcrumbLinkDirective } from './lib/breadcrumb-link.directive';
5 | import { HlmBreadcrumbListDirective } from './lib/breadcrumb-list.directive';
6 | import { HlmBreadcrumbPageDirective } from './lib/breadcrumb-page.directive';
7 | import { HlmBreadcrumbSeparatorComponent } from './lib/breadcrumb-separator.component';
8 | import { HlmBreadcrumbDirective } from './lib/breadcrumb.directive';
9 |
10 | export * from './lib/breadcrumb-ellipsis.component';
11 | export * from './lib/breadcrumb-item.directive';
12 | export * from './lib/breadcrumb-link.directive';
13 | export * from './lib/breadcrumb-list.directive';
14 | export * from './lib/breadcrumb-page.directive';
15 | export * from './lib/breadcrumb-separator.component';
16 | export * from './lib/breadcrumb.directive';
17 |
18 | export const HlmBreadCrumbImports = [
19 | HlmBreadcrumbDirective,
20 | HlmBreadcrumbEllipsisComponent,
21 | HlmBreadcrumbSeparatorComponent,
22 | HlmBreadcrumbItemDirective,
23 | HlmBreadcrumbLinkDirective,
24 | HlmBreadcrumbPageDirective,
25 | HlmBreadcrumbListDirective,
26 | ] as const;
27 |
28 | @NgModule({
29 | imports: [...HlmBreadCrumbImports],
30 | exports: [...HlmBreadCrumbImports],
31 | })
32 | export class HlmBreadCrumbModule {}
33 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb-ellipsis.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideEllipsis } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 | import type { ClassValue } from 'clsx';
7 |
8 | @Component({
9 | selector: 'hlm-breadcrumb-ellipsis',
10 | imports: [NgIcon, HlmIconDirective],
11 | providers: [provideIcons({ lucideEllipsis })],
12 | template: `
13 |
14 |
15 | More
16 |
17 | `,
18 | })
19 | export class HlmBreadcrumbEllipsisComponent {
20 | public readonly userClass = input('', { alias: 'class' });
21 |
22 | protected readonly _computedClass = computed(() => hlm('flex h-9 w-9 items-center justify-center', this.userClass()));
23 | }
24 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb-item.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmBreadcrumbItem]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmBreadcrumbItemDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() => hlm('inline-flex items-center gap-1.5', this.userClass()));
16 | }
17 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb-link.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { RouterLink } from '@angular/router';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmBreadcrumbLink]',
8 | standalone: true,
9 | hostDirectives: [
10 | {
11 | directive: RouterLink,
12 | inputs: [
13 | 'target',
14 | 'queryParams',
15 | 'fragment',
16 | 'queryParamsHandling',
17 | 'state',
18 | 'info',
19 | 'relativeTo',
20 | 'preserveFragment',
21 | 'skipLocationChange',
22 | 'replaceUrl',
23 | 'routerLink: link',
24 | ],
25 | },
26 | ],
27 | host: {
28 | '[class]': '_computedClass()',
29 | },
30 | })
31 | export class HlmBreadcrumbLinkDirective {
32 | public readonly userClass = input('', { alias: 'class' });
33 | public readonly link = input();
34 |
35 | protected readonly _computedClass = computed(() => hlm('transition-colors hover:text-foreground', this.userClass()));
36 | }
37 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb-list.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmBreadcrumbList]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmBreadcrumbListDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm('flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5', this.userClass()),
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb-page.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmBreadcrumbPage]',
7 | standalone: true,
8 | host: {
9 | role: 'link',
10 | '[class]': '_computedClass()',
11 | '[attr.aria-disabled]': 'disabled',
12 | '[attr.aria-current]': 'page',
13 | },
14 | })
15 | export class HlmBreadcrumbPageDirective {
16 | public readonly userClass = input('', { alias: 'class' });
17 |
18 | protected readonly _computedClass = computed(() => hlm('font-normal text-foreground', this.userClass()));
19 | }
20 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb-separator.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideChevronRight } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import type { ClassValue } from 'clsx';
6 |
7 | @Component({
8 | // eslint-disable-next-line @angular-eslint/component-selector
9 | selector: '[hlmBreadcrumbSeparator]',
10 | imports: [NgIcon],
11 | providers: [provideIcons({ lucideChevronRight })],
12 | host: {
13 | role: 'presentation',
14 | '[class]': '_computedClass()',
15 | '[attr.aria-hidden]': 'true',
16 | },
17 | template: `
18 |
19 |
20 |
21 | `,
22 | })
23 | export class HlmBreadcrumbSeparatorComponent {
24 | public readonly userClass = input('', { alias: 'class' });
25 |
26 | protected readonly _computedClass = computed(() =>
27 | hlm('[&>ng-icon]:text-[14px] [&>ng-icon]:flex!', this.userClass())
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-breadcrumb-helm/src/lib/breadcrumb.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmBreadcrumb]',
7 | standalone: true,
8 | host: {
9 | role: 'navigation',
10 | '[class]': '_computedClass()',
11 | '[attr.aria-label]': 'ariaLabel()',
12 | },
13 | })
14 | export class HlmBreadcrumbDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | public readonly ariaLabel = input('breadcrumb', { alias: 'aria-label' });
17 |
18 | protected readonly _computedClass = computed(() => hlm(this.userClass()));
19 | }
20 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-button-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmButtonDirective } from './lib/hlm-button.directive';
3 | export * from './lib/hlm-button.token';
4 |
5 | export * from './lib/hlm-button.directive';
6 |
7 | @NgModule({
8 | imports: [HlmButtonDirective],
9 | exports: [HlmButtonDirective],
10 | })
11 | export class HlmButtonModule {}
12 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-button-helm/src/lib/hlm-button.token.ts:
--------------------------------------------------------------------------------
1 | import { InjectionToken, ValueProvider, inject } from '@angular/core';
2 | import type { ButtonVariants } from './hlm-button.directive';
3 |
4 | export interface BrnButtonConfig {
5 | variant: ButtonVariants['variant'];
6 | size: ButtonVariants['size'];
7 | }
8 |
9 | const defaultConfig: BrnButtonConfig = {
10 | variant: 'default',
11 | size: 'default',
12 | };
13 |
14 | const BrnButtonConfigToken = new InjectionToken('BrnButtonConfig');
15 |
16 | export function provideBrnButtonConfig(config: Partial): ValueProvider {
17 | return { provide: BrnButtonConfigToken, useValue: { ...defaultConfig, ...config } };
18 | }
19 |
20 | export function injectBrnButtonConfig(): BrnButtonConfig {
21 | return inject(BrnButtonConfigToken, { optional: true }) ?? defaultConfig;
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmCardContentDirective } from './lib/hlm-card-content.directive';
4 | import { HlmCardDescriptionDirective } from './lib/hlm-card-description.directive';
5 | import { HlmCardFooterDirective } from './lib/hlm-card-footer.directive';
6 | import { HlmCardHeaderDirective } from './lib/hlm-card-header.directive';
7 | import { HlmCardTitleDirective } from './lib/hlm-card-title.directive';
8 | import { HlmCardDirective } from './lib/hlm-card.directive';
9 |
10 | export * from './lib/hlm-card-content.directive';
11 | export * from './lib/hlm-card-description.directive';
12 | export * from './lib/hlm-card-footer.directive';
13 | export * from './lib/hlm-card-header.directive';
14 | export * from './lib/hlm-card-title.directive';
15 | export * from './lib/hlm-card.directive';
16 |
17 | export const HlmCardImports = [
18 | HlmCardDirective,
19 | HlmCardHeaderDirective,
20 | HlmCardFooterDirective,
21 | HlmCardTitleDirective,
22 | HlmCardDescriptionDirective,
23 | HlmCardContentDirective,
24 | ] as const;
25 |
26 | @NgModule({
27 | imports: [...HlmCardImports],
28 | exports: [...HlmCardImports],
29 | })
30 | export class HlmCardModule {}
31 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/lib/hlm-card-content.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const cardContentVariants = cva('p-6 pt-0', {
7 | variants: {},
8 | defaultVariants: {},
9 | });
10 | export type CardContentVariants = VariantProps;
11 |
12 | @Directive({
13 | selector: '[hlmCardContent]',
14 | standalone: true,
15 | host: {
16 | '[class]': '_computedClass()',
17 | },
18 | })
19 | export class HlmCardContentDirective {
20 | public readonly userClass = input('', { alias: 'class' });
21 | protected _computedClass = computed(() => hlm(cardContentVariants(), this.userClass()));
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/lib/hlm-card-description.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const cardDescriptionVariants = cva('text-sm text-muted-foreground', {
7 | variants: {},
8 | defaultVariants: {},
9 | });
10 | export type CardDescriptionVariants = VariantProps;
11 |
12 | @Directive({
13 | selector: '[hlmCardDescription]',
14 | standalone: true,
15 | host: {
16 | '[class]': '_computedClass()',
17 | },
18 | })
19 | export class HlmCardDescriptionDirective {
20 | public readonly userClass = input('', { alias: 'class' });
21 | protected _computedClass = computed(() => hlm(cardDescriptionVariants(), this.userClass()));
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/lib/hlm-card-footer.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const cardFooterVariants = cva('flex p-6 pt-0', {
7 | variants: {
8 | direction: {
9 | row: 'flex-row items-center space-x-1.5',
10 | column: 'flex-col space-y-1.5',
11 | },
12 | },
13 | defaultVariants: {
14 | direction: 'row',
15 | },
16 | });
17 | export type CardFooterVariants = VariantProps;
18 |
19 | @Directive({
20 | selector: '[hlmCardFooter]',
21 | standalone: true,
22 | host: {
23 | '[class]': '_computedClass()',
24 | },
25 | })
26 | export class HlmCardFooterDirective {
27 | public readonly userClass = input('', { alias: 'class' });
28 | protected _computedClass = computed(() => hlm(cardFooterVariants({ direction: this.direction() }), this.userClass()));
29 |
30 | public readonly direction = input('row');
31 | }
32 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/lib/hlm-card-header.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const cardHeaderVariants = cva('flex p-6', {
7 | variants: {
8 | direction: {
9 | row: 'flex-row items-center space-x-1.5',
10 | column: 'flex-col space-y-1.5',
11 | },
12 | },
13 | defaultVariants: {
14 | direction: 'column',
15 | },
16 | });
17 | export type CardHeaderVariants = VariantProps;
18 |
19 | @Directive({
20 | selector: '[hlmCardHeader]',
21 | standalone: true,
22 | host: {
23 | '[class]': '_computedClass()',
24 | },
25 | })
26 | export class HlmCardHeaderDirective {
27 | public readonly userClass = input('', { alias: 'class' });
28 | protected _computedClass = computed(() => hlm(cardHeaderVariants({ direction: this.direction() }), this.userClass()));
29 |
30 | public readonly direction = input('column');
31 | }
32 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/lib/hlm-card-title.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const cardTitleVariants = cva('text-lg font-semibold leading-none tracking-tight', {
7 | variants: {},
8 | defaultVariants: {},
9 | });
10 | export type CardTitleVariants = VariantProps;
11 |
12 | @Directive({
13 | selector: '[hlmCardTitle]',
14 | standalone: true,
15 | host: {
16 | '[class]': '_computedClass()',
17 | },
18 | })
19 | export class HlmCardTitleDirective {
20 | public readonly userClass = input('', { alias: 'class' });
21 | protected _computedClass = computed(() => hlm(cardTitleVariants(), this.userClass()));
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-card-helm/src/lib/hlm-card.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const cardVariants = cva(
7 | 'rounded-lg border border-border bg-card focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-card-foreground shadow-sm',
8 | {
9 | variants: {},
10 | defaultVariants: {},
11 | },
12 | );
13 | export type CardVariants = VariantProps;
14 |
15 | @Directive({
16 | selector: '[hlmCard]',
17 | standalone: true,
18 | host: {
19 | '[class]': '_computedClass()',
20 | },
21 | })
22 | export class HlmCardDirective {
23 | public readonly userClass = input('', { alias: 'class' });
24 | protected _computedClass = computed(() => hlm(cardVariants(), this.userClass()));
25 | }
26 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-checkbox-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmCheckboxComponent } from './lib/hlm-checkbox.component';
4 |
5 | export * from './lib/hlm-checkbox.component';
6 |
7 | export const HlmCheckboxImports = [HlmCheckboxComponent] as const;
8 | @NgModule({
9 | imports: [...HlmCheckboxImports],
10 | exports: [...HlmCheckboxImports],
11 | })
12 | export class HlmCheckboxModule {}
13 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog-close.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmDialogClose],[brnDialogClose][hlm]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmDialogCloseDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm(
17 | 'absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground',
18 | this.userClass(),
19 | ),
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog-description.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnDialogDescriptionDirective } from '@spartan-ng/brain/dialog';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmDialogDescription]',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [BrnDialogDescriptionDirective],
13 | })
14 | export class HlmDialogDescriptionDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | protected _computedClass = computed(() => hlm('text-sm text-muted-foreground', this.userClass()));
17 | }
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog-footer.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Component({
6 | selector: 'hlm-dialog-footer',
7 | standalone: true,
8 | template: `
9 |
10 | `,
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | })
15 | export class HlmDialogFooterComponent {
16 | public readonly userClass = input('', { alias: 'class' });
17 | protected _computedClass = computed(() =>
18 | hlm('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', this.userClass()),
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog-header.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Component({
6 | selector: 'hlm-dialog-header',
7 | standalone: true,
8 | template: `
9 |
10 | `,
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | })
15 | export class HlmDialogHeaderComponent {
16 | public readonly userClass = input('', { alias: 'class' });
17 | protected _computedClass = computed(() =>
18 | hlm('flex flex-col space-y-1.5 text-center sm:text-left', this.userClass()),
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog-overlay.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, effect, input, untracked } from '@angular/core';
2 | import { hlm, injectCustomClassSettable } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | export const hlmDialogOverlayClass =
6 | 'bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0';
7 |
8 | @Directive({
9 | selector: '[hlmDialogOverlay],brn-dialog-overlay[hlm]',
10 | standalone: true,
11 | })
12 | export class HlmDialogOverlayDirective {
13 | private readonly _classSettable = injectCustomClassSettable({ optional: true, host: true });
14 |
15 | public readonly userClass = input('', { alias: 'class' });
16 | protected readonly _computedClass = computed(() => hlm(hlmDialogOverlayClass, this.userClass()));
17 |
18 | constructor() {
19 | effect(() => {
20 | const newClass = this._computedClass();
21 | untracked(() => this._classSettable?.setClassToCustomElement(newClass));
22 | });
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog-title.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnDialogTitleDirective } from '@spartan-ng/brain/dialog';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmDialogTitle]',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [BrnDialogTitleDirective],
13 | })
14 | export class HlmDialogTitleDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | protected _computedClass = computed(() => hlm('text-lg font-semibold leading-none tracking-tight', this.userClass()));
17 | }
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectionStrategy, Component, forwardRef, ViewEncapsulation } from '@angular/core';
2 | import {
3 | BrnDialogComponent,
4 | BrnDialogOverlayComponent,
5 | provideBrnDialogDefaultOptions,
6 | } from '@spartan-ng/brain/dialog';
7 | import { HlmDialogOverlayDirective } from './hlm-dialog-overlay.directive';
8 |
9 | @Component({
10 | selector: 'hlm-dialog',
11 | imports: [BrnDialogOverlayComponent, HlmDialogOverlayDirective],
12 | providers: [
13 | {
14 | provide: BrnDialogComponent,
15 | useExisting: forwardRef(() => HlmDialogComponent),
16 | },
17 | provideBrnDialogDefaultOptions({
18 | // add custom options here
19 | }),
20 | ],
21 | template: `
22 |
23 |
24 | `,
25 | changeDetection: ChangeDetectionStrategy.OnPush,
26 | encapsulation: ViewEncapsulation.None,
27 | exportAs: 'hlmDialog',
28 | })
29 | export class HlmDialogComponent extends BrnDialogComponent {}
30 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-dialog-helm/src/lib/hlm-dialog.service.ts:
--------------------------------------------------------------------------------
1 | import type { ComponentType } from '@angular/cdk/portal';
2 | import { Injectable, type TemplateRef, inject } from '@angular/core';
3 | import {
4 | type BrnDialogOptions,
5 | BrnDialogService,
6 | DEFAULT_BRN_DIALOG_OPTIONS,
7 | cssClassesToArray,
8 | } from '@spartan-ng/brain/dialog';
9 | import { HlmDialogContentComponent } from './hlm-dialog-content.component';
10 | import { hlmDialogOverlayClass } from './hlm-dialog-overlay.directive';
11 |
12 | export type HlmDialogOptions = BrnDialogOptions & {
13 | contentClass?: string;
14 | context?: DialogContext;
15 | };
16 |
17 | @Injectable({
18 | providedIn: 'root',
19 | })
20 | export class HlmDialogService {
21 | private readonly _brnDialogService = inject(BrnDialogService);
22 |
23 | public open(component: ComponentType | TemplateRef, options?: Partial) {
24 | const mergedOptions = {
25 | ...DEFAULT_BRN_DIALOG_OPTIONS,
26 |
27 | ...(options ?? {}),
28 | backdropClass: cssClassesToArray(`${hlmDialogOverlayClass} ${options?.backdropClass ?? ''}`),
29 | context: { ...(options?.context ?? {}), $component: component, $dynamicComponentClass: options?.contentClass },
30 | };
31 |
32 | return this._brnDialogService.open(HlmDialogContentComponent, undefined, mergedOptions.context, mergedOptions);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-formfield-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmErrorDirective } from './lib/hlm-error.directive';
3 | import { HlmFormFieldComponent } from './lib/hlm-form-field.component';
4 | import { HlmHintDirective } from './lib/hlm-hint.directive';
5 |
6 | export * from './lib/hlm-error.directive';
7 | export * from './lib/hlm-form-field.component';
8 | export * from './lib/hlm-hint.directive';
9 |
10 | @NgModule({
11 | imports: [HlmFormFieldComponent, HlmErrorDirective, HlmHintDirective],
12 | exports: [HlmFormFieldComponent, HlmErrorDirective, HlmHintDirective],
13 | })
14 | export class HlmFormFieldModule {}
15 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-formfield-helm/src/lib/hlm-error.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '@angular/core';
2 |
3 | @Directive({
4 | standalone: true,
5 | // eslint-disable-next-line @angular-eslint/directive-selector
6 | selector: 'hlm-error',
7 | host: {
8 | class: 'block text-destructive text-sm font-medium',
9 | },
10 | })
11 | export class HlmErrorDirective {}
12 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-formfield-helm/src/lib/hlm-form-field.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, contentChild, contentChildren, effect } from '@angular/core';
2 | import { BrnFormFieldControl } from '@spartan-ng/brain/form-field';
3 | import { HlmErrorDirective } from './hlm-error.directive';
4 |
5 | @Component({
6 | selector: 'hlm-form-field',
7 | template: `
8 |
9 |
10 | @switch (hasDisplayedMessage()) {
11 | @case ('error') {
12 |
13 | }
14 | @default {
15 |
16 | }
17 | }
18 | `,
19 | standalone: true,
20 | host: {
21 | class: 'space-y-2 block',
22 | },
23 | })
24 | export class HlmFormFieldComponent {
25 | public readonly control = contentChild(BrnFormFieldControl);
26 |
27 | public readonly errorChildren = contentChildren(HlmErrorDirective);
28 |
29 | protected readonly hasDisplayedMessage = computed<'error' | 'hint'>(() =>
30 | this.errorChildren() && this.errorChildren().length > 0 && this.control()?.errorState() ? 'error' : 'hint',
31 | );
32 |
33 | constructor() {
34 | effect(() => {
35 | if (!this.control()) {
36 | throw new Error('hlm-form-field must contain a BrnFormFieldControl.');
37 | }
38 | });
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-formfield-helm/src/lib/hlm-hint.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '@angular/core';
2 |
3 | @Directive({
4 | // eslint-disable-next-line @angular-eslint/directive-selector
5 | selector: 'hlm-hint',
6 | standalone: true,
7 | host: {
8 | class: 'block text-sm text-muted-foreground',
9 | },
10 | })
11 | export class HlmHintDirective {}
12 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-icon-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmIconDirective } from './lib/hlm-icon.directive';
3 |
4 | export * from './lib/hlm-icon.directive';
5 | export * from './lib/hlm-icon.token';
6 |
7 | @NgModule({
8 | imports: [HlmIconDirective],
9 | exports: [HlmIconDirective],
10 | })
11 | export class HlmIconModule {}
12 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-icon-helm/src/lib/hlm-icon.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { injectHlmIconConfig } from './hlm-icon.token';
3 |
4 | export type IconSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | 'none' | (Record & string);
5 |
6 | @Directive({
7 | selector: 'ng-icon[hlm]',
8 | standalone: true,
9 | host: {
10 | '[style.--ng-icon__size]': '_computedSize()',
11 | },
12 | })
13 | export class HlmIconDirective {
14 | private readonly _config = injectHlmIconConfig();
15 | public readonly size = input(this._config.size);
16 |
17 | protected readonly _computedSize = computed(() => {
18 | const size = this.size();
19 |
20 | switch (size) {
21 | case 'xs':
22 | return '12px';
23 | case 'sm':
24 | return '16px';
25 | case 'base':
26 | return '24px';
27 | case 'lg':
28 | return '32px';
29 | case 'xl':
30 | return '48px';
31 | default: {
32 | return size;
33 | }
34 | }
35 | });
36 | }
37 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-icon-helm/src/lib/hlm-icon.token.ts:
--------------------------------------------------------------------------------
1 | import { InjectionToken, ValueProvider, inject } from '@angular/core';
2 | import type { IconSize } from './hlm-icon.directive';
3 |
4 | export interface HlmIconConfig {
5 | size: IconSize;
6 | }
7 |
8 | const defaultConfig: HlmIconConfig = {
9 | size: 'base',
10 | };
11 |
12 | const HlmIconConfigToken = new InjectionToken('HlmIconConfig');
13 |
14 | export function provideHlmIconConfig(config: Partial): ValueProvider {
15 | return { provide: HlmIconConfigToken, useValue: { ...defaultConfig, ...config } };
16 | }
17 |
18 | export function injectHlmIconConfig(): HlmIconConfig {
19 | return inject(HlmIconConfigToken, { optional: true }) ?? defaultConfig;
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-input-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmInputErrorDirective } from './lib/hlm-input-error.directive';
3 | import { HlmInputDirective } from './lib/hlm-input.directive';
4 |
5 | export * from './lib/hlm-input-error.directive';
6 | export * from './lib/hlm-input.directive';
7 |
8 | @NgModule({
9 | imports: [HlmInputDirective, HlmInputErrorDirective],
10 | exports: [HlmInputDirective, HlmInputErrorDirective],
11 | })
12 | export class HlmInputModule {}
13 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-input-helm/src/lib/hlm-input-error.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type VariantProps, cva } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 |
6 | export const inputErrorVariants = cva('text-destructive text-sm font-medium', {
7 | variants: {},
8 | defaultVariants: {},
9 | });
10 | export type InputErrorVariants = VariantProps;
11 |
12 | @Directive({
13 | selector: '[hlmInputError]',
14 | standalone: true,
15 | host: {
16 | '[class]': '_computedClass()',
17 | },
18 | })
19 | export class HlmInputErrorDirective {
20 | public readonly userClass = input('', { alias: 'class' });
21 | protected _computedClass = computed(() => hlm(inputErrorVariants(), this.userClass()));
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-inputotp-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmInputOtpFakeCaretComponent } from './lib/hlm-input-otp-fake-caret.component';
3 | import { HlmInputOtpGroupDirective } from './lib/hlm-input-otp-group.directive';
4 | import { HlmInputOtpSeparatorComponent } from './lib/hlm-input-otp-separator.component';
5 | import { HlmInputOtpSlotComponent } from './lib/hlm-input-otp-slot.component';
6 | import { HlmInputOtpDirective } from './lib/hlm-input-otp.directive';
7 |
8 | export * from './lib/hlm-input-otp-fake-caret.component';
9 | export * from './lib/hlm-input-otp-group.directive';
10 | export * from './lib/hlm-input-otp-separator.component';
11 | export * from './lib/hlm-input-otp-slot.component';
12 | export * from './lib/hlm-input-otp.directive';
13 |
14 | @NgModule({
15 | imports: [
16 | HlmInputOtpDirective,
17 | HlmInputOtpGroupDirective,
18 | HlmInputOtpSeparatorComponent,
19 | HlmInputOtpSlotComponent,
20 | HlmInputOtpFakeCaretComponent,
21 | ],
22 | exports: [
23 | HlmInputOtpDirective,
24 | HlmInputOtpGroupDirective,
25 | HlmInputOtpSeparatorComponent,
26 | HlmInputOtpSlotComponent,
27 | HlmInputOtpFakeCaretComponent,
28 | ],
29 | })
30 | export class HlmInputOtpModule {}
31 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-inputotp-helm/src/lib/hlm-input-otp-fake-caret.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'hlm-input-otp-fake-caret',
5 | standalone: true,
6 | template: `
7 |
10 | `,
11 | })
12 | export class HlmInputOtpFakeCaretComponent {}
13 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-inputotp-helm/src/lib/hlm-input-otp-group.directive.ts:
--------------------------------------------------------------------------------
1 | import { computed, Directive, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmInputOtpGroup]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmInputOtpGroupDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() => hlm('flex items-center', this.userClass()));
16 | }
17 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-inputotp-helm/src/lib/hlm-input-otp-separator.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideDot } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 | import { type ClassValue } from 'clsx';
7 |
8 | @Component({
9 | selector: 'hlm-input-otp-separator',
10 | standalone: true,
11 | imports: [HlmIconDirective, NgIcon],
12 | providers: [provideIcons({ lucideDot })],
13 | template: `
14 |
15 | `,
16 | host: {
17 | role: 'separator',
18 | '[class]': '_computedClass()',
19 | },
20 | })
21 | export class HlmInputOtpSeparatorComponent {
22 | public readonly userClass = input('', { alias: 'class' });
23 |
24 | protected readonly _computedClass = computed(() => hlm(this.userClass()));
25 | }
26 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-inputotp-helm/src/lib/hlm-input-otp-slot.component.ts:
--------------------------------------------------------------------------------
1 | import { NumberInput } from '@angular/cdk/coercion';
2 | import { Component, computed, input, numberAttribute } from '@angular/core';
3 | import { hlm } from '@spartan-ng/brain/core';
4 | import { BrnInputOtpSlotComponent } from '@spartan-ng/brain/input-otp';
5 | import { type ClassValue } from 'clsx';
6 | import { HlmInputOtpFakeCaretComponent } from './hlm-input-otp-fake-caret.component';
7 |
8 | @Component({
9 | selector: 'hlm-input-otp-slot',
10 | standalone: true,
11 | imports: [BrnInputOtpSlotComponent, HlmInputOtpFakeCaretComponent],
12 | template: `
13 |
14 |
15 |
16 | `,
17 | host: {
18 | '[class]': '_computedClass()',
19 | },
20 | })
21 | export class HlmInputOtpSlotComponent {
22 | public readonly userClass = input('', { alias: 'class' });
23 |
24 | public readonly index = input.required({ transform: numberAttribute });
25 |
26 | protected readonly _computedClass = computed(() =>
27 | hlm(
28 | 'relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md',
29 | 'has-[brn-input-otp-slot[data-active="true"]]:z-10 has-[brn-input-otp-slot[data-active="true"]]:ring-2 has-[brn-input-otp-slot[data-active="true"]]:ring-ring has-[brn-input-otp-slot[data-active="true"]]:ring-offset-background',
30 | this.userClass(),
31 | ),
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-inputotp-helm/src/lib/hlm-input-otp.directive.ts:
--------------------------------------------------------------------------------
1 | import { computed, Directive, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { type ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: 'brn-input-otp [hlm]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmInputOtpDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm('flex items-center gap-2 has-[:disabled]:opacity-50', this.userClass()),
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-label-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmLabelDirective } from './lib/hlm-label.directive';
3 |
4 | export * from './lib/hlm-label.directive';
5 |
6 | @NgModule({
7 | imports: [HlmLabelDirective],
8 | exports: [HlmLabelDirective],
9 | })
10 | export class HlmLabelModule {}
11 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-bar-item.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnMenuItemDirective } from '@spartan-ng/brain/menu';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmMenuBarItem]',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [BrnMenuItemDirective],
13 | })
14 | export class HlmMenuBarItemDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | protected _computedClass = computed(() =>
17 | hlm(
18 | 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground aria-expanded:bg-accent aria-expanded:text-accent-foreground',
19 | this.userClass(),
20 | ),
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-bar.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnMenuBarDirective } from '@spartan-ng/brain/menu';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Component({
7 | selector: 'hlm-menu-bar',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [BrnMenuBarDirective],
13 | template: '',
14 | })
15 | export class HlmMenuBarComponent {
16 | public readonly userClass = input('', { alias: 'class' });
17 | protected _computedClass = computed(() =>
18 | hlm('border-border flex h-10 items-center space-x-1 rounded-md border bg-background p-1', this.userClass()),
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-group.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { BrnMenuGroupDirective } from '@spartan-ng/brain/menu';
3 |
4 | @Component({
5 | selector: 'hlm-menu-group',
6 | standalone: true,
7 | host: {
8 | class: 'block',
9 | },
10 | hostDirectives: [BrnMenuGroupDirective],
11 | template: `
12 |
13 | `,
14 | })
15 | export class HlmMenuGroupComponent {}
16 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-item-check.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideCheck } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 | import type { ClassValue } from 'clsx';
7 |
8 | @Component({
9 | selector: 'hlm-menu-item-check',
10 | providers: [provideIcons({ lucideCheck })],
11 | imports: [NgIcon, HlmIconDirective],
12 | template: `
13 |
14 |
15 | `,
16 | host: {
17 | '[class]': '_computedClass()',
18 | },
19 | })
20 | export class HlmMenuItemCheckComponent {
21 | public readonly userClass = input('', { alias: 'class' });
22 | protected _computedClass = computed(() =>
23 | hlm(
24 | 'group-[.checked]:opacity-100 opacity-0 absolute left-2 flex h-3.5 w-3.5 items-center justify-center',
25 | this.userClass(),
26 | ),
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-item-checkbox.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnMenuItemCheckboxDirective } from '@spartan-ng/brain/menu';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmMenuItemCheckbox]',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [
13 | {
14 | directive: BrnMenuItemCheckboxDirective,
15 | inputs: ['disabled: disabled', 'checked: checked'],
16 | outputs: ['triggered: triggered'],
17 | },
18 | ],
19 | })
20 | export class HlmMenuItemCheckboxDirective {
21 | public readonly userClass = input('', { alias: 'class' });
22 | protected _computedClass = computed(() =>
23 | hlm(
24 | 'group w-full relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50',
25 | this.userClass(),
26 | ),
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-item-icon.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { provideHlmIconConfig } from '@spartan-ng/ui-icon-helm';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmMenuIcon]',
8 | standalone: true,
9 | providers: [provideHlmIconConfig({ size: 'sm' })],
10 | host: {
11 | '[class]': '_computedClass()',
12 | },
13 | })
14 | export class HlmMenuItemIconDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | protected _computedClass = computed(() => hlm('mr-2', this.userClass()));
17 | }
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-item-radio.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideCircle } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 | import type { ClassValue } from 'clsx';
7 |
8 | @Component({
9 | selector: 'hlm-menu-item-radio',
10 | providers: [provideIcons({ lucideCircle })],
11 | imports: [NgIcon, HlmIconDirective],
12 | template: `
13 |
14 |
15 | `,
16 | host: {
17 | '[class]': '_computedClass()',
18 | },
19 | })
20 | export class HlmMenuItemRadioComponent {
21 | public readonly userClass = input('', { alias: 'class' });
22 | protected _computedClass = computed(() =>
23 | hlm(
24 | 'group-[.checked]:opacity-100 opacity-0 absolute left-2 flex h-3.5 w-3.5 items-center justify-center',
25 | this.userClass(),
26 | ),
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-item-radio.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnMenuItemRadioDirective } from '@spartan-ng/brain/menu';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmMenuItemRadio]',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [
13 | {
14 | directive: BrnMenuItemRadioDirective,
15 | inputs: ['disabled: disabled', 'checked: checked'],
16 | outputs: ['triggered: triggered'],
17 | },
18 | ],
19 | })
20 | export class HlmMenuItemRadioDirective {
21 | public readonly userClass = input('', { alias: 'class' });
22 | protected _computedClass = computed(() =>
23 | hlm(
24 | 'group w-full relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50',
25 | this.userClass(),
26 | ),
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-item-sub-indicator.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideChevronRight } from '@ng-icons/lucide';
4 | import { hlm } from '@spartan-ng/brain/core';
5 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
6 | import type { ClassValue } from 'clsx';
7 |
8 | @Component({
9 | selector: 'hlm-menu-item-sub-indicator',
10 | providers: [provideIcons({ lucideChevronRight })],
11 | imports: [NgIcon, HlmIconDirective],
12 | template: `
13 |
14 | `,
15 | host: {
16 | '[class]': '_computedClass()',
17 | },
18 | })
19 | export class HlmMenuItemSubIndicatorComponent {
20 | public readonly userClass = input('', { alias: 'class' });
21 | protected _computedClass = computed(() => hlm('inline-block ml-auto h-4 w-4', this.userClass()));
22 | }
23 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-label.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input, booleanAttribute, computed, input, signal } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Component({
6 | selector: 'hlm-menu-label',
7 | standalone: true,
8 | template: `
9 |
10 | `,
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | })
15 | export class HlmMenuLabelComponent {
16 | public readonly userClass = input('', { alias: 'class' });
17 | protected _computedClass = computed(() =>
18 | hlm('block px-2 py-1.5 text-sm font-semibold', this._inset() && 'pl-8', this.userClass()),
19 | );
20 |
21 | private readonly _inset = signal(false);
22 | @Input({ transform: booleanAttribute })
23 | public set inset(value: boolean) {
24 | this._inset.set(value);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-separator.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Component({
6 | selector: 'hlm-menu-separator',
7 | standalone: true,
8 | template: '',
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | })
13 | export class HlmMenuSeparatorComponent {
14 | public readonly userClass = input('', { alias: 'class' });
15 | protected _computedClass = computed(() => hlm('block -mx-1 my-1 h-px bg-muted', this.userClass()));
16 | }
17 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-menu-shortcut.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Component({
6 | selector: 'hlm-menu-shortcut',
7 | standalone: true,
8 | template: `
9 |
10 | `,
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | })
15 | export class HlmMenuShortcutComponent {
16 | public readonly userClass = input('', { alias: 'class' });
17 | protected _computedClass = computed(() =>
18 | hlm('ml-auto font-light text-xs tracking-widest opacity-60', this.userClass()),
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-menu-helm/src/lib/hlm-sub-menu.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnMenuDirective } from '@spartan-ng/brain/menu';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Component({
7 | selector: 'hlm-sub-menu',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | },
12 | hostDirectives: [BrnMenuDirective],
13 | template: `
14 |
15 | `,
16 | })
17 | export class HlmSubMenuComponent {
18 | public readonly userClass = input('', { alias: 'class' });
19 | protected _computedClass = computed(() =>
20 | hlm(
21 | 'border-border min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
22 | this.userClass(),
23 | ),
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-progress-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmProgressIndicatorDirective } from './lib/hlm-progress-indicator.directive';
4 | import { HlmProgressDirective } from './lib/hlm-progress.directive';
5 |
6 | export * from './lib/hlm-progress-indicator.directive';
7 | export * from './lib/hlm-progress.directive';
8 |
9 | export const HlmProgressImports = [HlmProgressDirective, HlmProgressIndicatorDirective] as const;
10 |
11 | @NgModule({
12 | imports: [...HlmProgressImports],
13 | exports: [...HlmProgressImports],
14 | })
15 | export class HlmProgressModule {}
16 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-progress-helm/src/lib/hlm-progress-indicator.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { injectBrnProgress } from '@spartan-ng/brain/progress';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmProgressIndicator],brn-progress-indicator[hlm]',
8 | standalone: true,
9 | host: {
10 | '[class]': '_computedClass()',
11 | '[class.animate-indeterminate]': 'indeterminate()',
12 | '[style.transform]': 'transform()',
13 | },
14 | })
15 | export class HlmProgressIndicatorDirective {
16 | private readonly _progress = injectBrnProgress();
17 | public readonly userClass = input('', { alias: 'class' });
18 |
19 | protected readonly _computedClass = computed(() =>
20 | hlm('inline-flex transform-gpu h-full w-full flex-1 bg-primary transition-all', this.userClass()),
21 | );
22 |
23 | protected readonly transform = computed(() => `translateX(-${100 - (this._progress.value() ?? 100)}%)`);
24 |
25 | protected readonly indeterminate = computed(
26 | () => this._progress.value() === null || this._progress.value() === undefined,
27 | );
28 | }
29 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-progress-helm/src/lib/hlm-progress.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmProgress],brn-progress[hlm]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmProgressDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 | protected readonly _computedClass = computed(() =>
15 | hlm('inline-flex relative h-4 w-full overflow-hidden rounded-full bg-secondary', this.userClass()),
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-radiogroup-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmRadioGroupComponent } from './lib/hlm-radio-group.component';
4 | import { HlmRadioIndicatorComponent } from './lib/hlm-radio-indicator.component';
5 | import { HlmRadioComponent } from './lib/hlm-radio.component';
6 |
7 | export * from './lib/hlm-radio-group.component';
8 | export * from './lib/hlm-radio-indicator.component';
9 | export * from './lib/hlm-radio.component';
10 |
11 | export const HlmRadioGroupImports = [HlmRadioGroupComponent, HlmRadioComponent, HlmRadioIndicatorComponent];
12 |
13 | @NgModule({
14 | imports: [...HlmRadioGroupImports],
15 | exports: [...HlmRadioGroupImports],
16 | })
17 | export class HlmRadioGroupModule {}
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-radiogroup-helm/src/lib/hlm-radio-group.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnRadioGroupDirective } from '@spartan-ng/brain/radio-group';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Component({
7 | selector: 'hlm-radio-group',
8 | standalone: true,
9 | hostDirectives: [
10 | {
11 | directive: BrnRadioGroupDirective,
12 | inputs: ['name', 'value', 'disabled', 'required', 'direction'],
13 | },
14 | ],
15 | host: {
16 | '[class]': '_computedClass()',
17 | },
18 | template: '',
19 | })
20 | export class HlmRadioGroupComponent {
21 | public readonly userClass = input('', { alias: 'class' });
22 | protected _computedClass = computed(() => hlm('grid gap-2', this.userClass()));
23 | }
24 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-radiogroup-helm/src/lib/hlm-radio-indicator.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | const btnLike =
6 | 'aspect-square rounded-full ring-offset-background group-[.cdk-keyboard-focused]:ring-2 group-[.cdk-keyboard-focused]:ring-ring group-[.cdk-keyboard-focused]:ring-offset-2 group-[.brn-radio-disabled]:cursor-not-allowed group-[.brn-radio-disabled]:opacity-50';
7 |
8 | @Component({
9 | selector: 'hlm-radio-indicator',
10 | standalone: true,
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | template: `
15 |
18 |
19 | `,
20 | })
21 | export class HlmRadioIndicatorComponent {
22 | public readonly userClass = input('', { alias: 'class' });
23 | protected _computedClass = computed(() => hlm('relative inline-flex h-4 w-4', this.userClass()));
24 | }
25 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-scrollarea-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmScrollAreaDirective } from './lib/hlm-scroll-area.directive';
3 |
4 | export * from './lib/hlm-scroll-area.directive';
5 |
6 | @NgModule({
7 | imports: [HlmScrollAreaDirective],
8 | exports: [HlmScrollAreaDirective],
9 | })
10 | export class HlmScrollAreaModule {}
11 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-scrollarea-helm/src/lib/hlm-scroll-area.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: 'ng-scrollbar[hlm]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | '[style.--scrollbar-border-radius.px]': '100',
11 | '[style.--scrollbar-offset]': '3',
12 | '[style.--scrollbar-thumb-color]': '"hsl(var(--border))"',
13 | '[style.--scrollbar-thumb-hover-color]': '"hsl(var(--border))"',
14 | '[style.--scrollbar-thickness]': '7',
15 | },
16 | })
17 | export class HlmScrollAreaDirective {
18 | protected readonly _computedClass = computed(() => hlm('block', this.userClass()));
19 | public readonly userClass = input('', { alias: 'class' });
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select-content.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm, injectExposedSideProvider, injectExposesStateProvider } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: '[hlmSelectContent], hlm-select-content',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | '[attr.data-state]': '_stateProvider?.state() ?? "open"',
11 | '[attr.data-side]': '_sideProvider?.side() ?? "bottom"',
12 | },
13 | })
14 | export class HlmSelectContentDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | public readonly stickyLabels = input(false);
17 | protected readonly _stateProvider = injectExposesStateProvider({ optional: true });
18 | protected readonly _sideProvider = injectExposedSideProvider({ optional: true });
19 |
20 | protected readonly _computedClass = computed(() =>
21 | hlm(
22 | 'w-full relative z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md p-1 data-[side=bottom]:top-[2px] data-[side=top]:bottom-[2px] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
23 | this.userClass(),
24 | ),
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select-group.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnSelectGroupDirective } from '@spartan-ng/brain/select';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmSelectGroup], hlm-select-group',
8 | hostDirectives: [BrnSelectGroupDirective],
9 | standalone: true,
10 | host: {
11 | '[class]': '_computedClass()',
12 | },
13 | })
14 | export class HlmSelectGroupDirective {
15 | public readonly userClass = input('', { alias: 'class' });
16 | protected readonly _computedClass = computed(() => hlm(this.userClass()));
17 | }
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select-label.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, inject, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnSelectLabelDirective } from '@spartan-ng/brain/select';
4 | import type { ClassValue } from 'clsx';
5 | import { HlmSelectContentDirective } from './hlm-select-content.directive';
6 |
7 | @Directive({
8 | selector: '[hlmSelectLabel], hlm-select-label',
9 | hostDirectives: [BrnSelectLabelDirective],
10 | standalone: true,
11 | host: {
12 | '[class]': '_computedClass()',
13 | },
14 | })
15 | export class HlmSelectLabelDirective {
16 | private readonly _selectContent = inject(HlmSelectContentDirective);
17 | private readonly _stickyLabels = computed(() => this._selectContent.stickyLabels());
18 | public readonly userClass = input('', { alias: 'class' });
19 | protected _computedClass = computed(() =>
20 | hlm(
21 | 'pl-8 pr-2 text-sm font-semibold rtl:pl-2 rtl:pr-8',
22 | this._stickyLabels() ? 'sticky top-0 bg-popover block z-[2]' : '',
23 | this.userClass(),
24 | ),
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select-scroll-down.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideChevronDown } from '@ng-icons/lucide';
4 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
5 |
6 | @Component({
7 | selector: 'hlm-select-scroll-down',
8 | imports: [NgIcon, HlmIconDirective],
9 | providers: [provideIcons({ lucideChevronDown })],
10 | host: {
11 | class: 'flex cursor-default items-center justify-center py-1',
12 | },
13 | template: `
14 |
15 | `,
16 | })
17 | export class HlmSelectScrollDownComponent {}
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select-scroll-up.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgIcon, provideIcons } from '@ng-icons/core';
3 | import { lucideChevronUp } from '@ng-icons/lucide';
4 | import { HlmIconDirective } from '@spartan-ng/ui-icon-helm';
5 |
6 | @Component({
7 | selector: 'hlm-select-scroll-up',
8 | imports: [NgIcon, HlmIconDirective],
9 | providers: [provideIcons({ lucideChevronUp })],
10 | host: {
11 | class: 'flex cursor-default items-center justify-center py-1',
12 | },
13 | template: `
14 |
15 | `,
16 | })
17 | export class HlmSelectScrollUpComponent {}
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select-value.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: 'hlm-select-value,[hlmSelectValue], brn-select-value[hlm]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmSelectValueDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 | protected readonly _computedClass = computed(() =>
15 | hlm(
16 | '!inline-block ltr:text-left rtl:text-right border-border w-[calc(100%)]] min-w-0 pointer-events-none truncate',
17 | this.userClass(),
18 | ),
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-select-helm/src/lib/hlm-select.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: 'hlm-select, brn-select [hlm]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmSelectDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 | protected readonly _computedClass = computed(() => hlm('space-y-2', this.userClass()));
15 | }
16 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-slider-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './lib/hlm-slider.component';
2 | import { HlmSliderComponent } from './lib/hlm-slider.component';
3 |
4 | export const HlmSliderImports = [HlmSliderComponent] as const;
5 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-spinner-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmSpinnerComponent } from './lib/hlm-spinner.component';
3 |
4 | export * from './lib/hlm-spinner.component';
5 |
6 | @NgModule({
7 | imports: [HlmSpinnerComponent],
8 | exports: [HlmSpinnerComponent],
9 | })
10 | export class HlmSpinnerModule {}
11 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-switch-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmSwitchThumbDirective } from './lib/hlm-switch-thumb.directive';
4 | import { HlmSwitchComponent } from './lib/hlm-switch.component';
5 |
6 | export * from './lib/hlm-switch-thumb.directive';
7 | export * from './lib/hlm-switch.component';
8 |
9 | export const HlmSwitchImports = [HlmSwitchComponent, HlmSwitchThumbDirective] as const;
10 | @NgModule({
11 | imports: [...HlmSwitchImports],
12 | exports: [...HlmSwitchImports],
13 | })
14 | export class HlmSwitchModule {}
15 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-switch-helm/src/lib/hlm-switch-ng-model.component.ignore.spec.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 | import { FormsModule } from '@angular/forms';
3 | import { HlmSwitchComponent } from './hlm-switch.component';
4 | @Component({
5 | selector: 'hlm-switch-ng-model',
6 | standalone: true,
7 | template: `
8 |
9 |
17 |
18 | {{ switchValue }}
19 | {{ changedValueTo }}
20 | `,
21 | imports: [HlmSwitchComponent, FormsModule],
22 | })
23 | export class SwitchFormComponent {
24 | @Input()
25 | public switchValue = false;
26 |
27 | protected changedValueTo: boolean | undefined;
28 |
29 | handleChange(value: boolean) {
30 | this.changedValueTo = value;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-switch-helm/src/lib/hlm-switch-thumb.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: 'brn-switch-thumb[hlm],[hlmSwitchThumb]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmSwitchThumbDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 |
15 | protected readonly _computedClass = computed(() =>
16 | hlm(
17 | 'block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform group-data-[state=checked]:translate-x-5 group-data-[state=unchecked]:translate-x-0',
18 | this.userClass(),
19 | ),
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmCaptionComponent } from './lib/hlm-caption.component';
4 | import { HlmTableComponent } from './lib/hlm-table.component';
5 | import { HlmTableDirective } from './lib/hlm-table.directive';
6 | import { HlmTdComponent } from './lib/hlm-td.component';
7 | import { HlmThComponent } from './lib/hlm-th.component';
8 | import { HlmTrowComponent } from './lib/hlm-trow.component';
9 |
10 | export { HlmCaptionComponent } from './lib/hlm-caption.component';
11 | export { HlmTableComponent } from './lib/hlm-table.component';
12 | export { HlmTableDirective } from './lib/hlm-table.directive';
13 | export { HlmTdComponent } from './lib/hlm-td.component';
14 | export { HlmThComponent } from './lib/hlm-th.component';
15 | export { HlmTrowComponent } from './lib/hlm-trow.component';
16 |
17 | export const HlmTableImports = [
18 | HlmTableComponent,
19 | HlmTableDirective,
20 | HlmCaptionComponent,
21 | HlmThComponent,
22 | HlmTdComponent,
23 | HlmTrowComponent,
24 | ] as const;
25 |
26 | @NgModule({
27 | imports: [...HlmTableImports],
28 | exports: [...HlmTableImports],
29 | })
30 | export class HlmTableModule {}
31 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/lib/hlm-caption.component.ts:
--------------------------------------------------------------------------------
1 | import {
2 | ChangeDetectionStrategy,
3 | Component,
4 | ViewEncapsulation,
5 | booleanAttribute,
6 | computed,
7 | effect,
8 | inject,
9 | input,
10 | untracked,
11 | } from '@angular/core';
12 | import { hlm } from '@spartan-ng/brain/core';
13 | import type { ClassValue } from 'clsx';
14 | import { HlmTableComponent } from './hlm-table.component';
15 |
16 | let captionIdSequence = 0;
17 |
18 | @Component({
19 | selector: 'hlm-caption',
20 | standalone: true,
21 | host: {
22 | '[class]': '_computedClass()',
23 | '[id]': 'id()',
24 | },
25 | template: `
26 |
27 | `,
28 | changeDetection: ChangeDetectionStrategy.OnPush,
29 | encapsulation: ViewEncapsulation.None,
30 | })
31 | export class HlmCaptionComponent {
32 | private readonly _table = inject(HlmTableComponent, { optional: true });
33 |
34 | protected readonly id = input(`${captionIdSequence++}`);
35 |
36 | public readonly hidden = input(false, { transform: booleanAttribute });
37 | public readonly userClass = input('', { alias: 'class' });
38 | protected readonly _computedClass = computed(() =>
39 | hlm(
40 | 'text-center block mt-4 text-sm text-muted-foreground',
41 | this.hidden() ? 'sr-only' : 'order-last',
42 | this.userClass(),
43 | ),
44 | );
45 |
46 | constructor() {
47 | effect(() => {
48 | const id = this.id();
49 | untracked(() => {
50 | if (!this._table) return;
51 | this._table.labeledBy.set(id);
52 | });
53 | });
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/lib/hlm-table.component.ts:
--------------------------------------------------------------------------------
1 | import {
2 | ChangeDetectionStrategy,
3 | Component,
4 | ViewEncapsulation,
5 | computed,
6 | effect,
7 | input,
8 | signal,
9 | untracked,
10 | } from '@angular/core';
11 | import { hlm } from '@spartan-ng/brain/core';
12 | import type { ClassValue } from 'clsx';
13 |
14 | @Component({
15 | selector: 'hlm-table',
16 | standalone: true,
17 | host: {
18 | '[class]': '_computedClass()',
19 | role: 'table',
20 | '[attr.aria-labelledby]': 'labeledBy()',
21 | },
22 | template: `
23 |
24 | `,
25 | changeDetection: ChangeDetectionStrategy.OnPush,
26 | encapsulation: ViewEncapsulation.None,
27 | })
28 | export class HlmTableComponent {
29 | public readonly userClass = input('', { alias: 'class' });
30 | protected readonly _computedClass = computed(() =>
31 | hlm('flex flex-col text-sm [&_hlm-trow:last-child]:border-0', this.userClass()),
32 | );
33 |
34 | // we aria-labelledby to be settable from outside but use the input by default.
35 | public readonly _labeledByInput = input(undefined, { alias: 'aria-labelledby' });
36 | public readonly labeledBy = signal(undefined);
37 |
38 | constructor() {
39 | effect(() => {
40 | const labeledBy = this._labeledByInput();
41 | untracked(() => {
42 | this.labeledBy.set(labeledBy);
43 | });
44 | });
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/lib/hlm-table.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '@angular/core';
2 | import { injectTableClassesSettable } from '@spartan-ng/brain/core';
3 |
4 | @Directive({ standalone: true, selector: '[hlmTable],brn-table[hlm]' })
5 | export class HlmTableDirective {
6 | private readonly _tableClassesSettable = injectTableClassesSettable({ host: true, optional: true });
7 |
8 | constructor() {
9 | this._tableClassesSettable?.setTableClasses({
10 | table: 'flex flex-col text-sm [&_cdk-row:last-child]:border-0',
11 | headerRow:
12 | 'flex min-w-[100%] w-fit border-b border-border [&.cdk-table-sticky]:bg-background ' +
13 | '[&.cdk-table-sticky>*]:z-[101] [&.cdk-table-sticky]:before:z-0 [&.cdk-table-sticky]:before:block [&.cdk-table-sticky]:hover:before:bg-muted/50 [&.cdk-table-sticky]:before:absolute [&.cdk-table-sticky]:before:inset-0',
14 | bodyRow:
15 | 'flex min-w-[100%] w-fit border-b border-border transition-[background-color] hover:bg-muted/50 [&:has([role=checkbox][aria-checked=true])]:bg-muted',
16 | });
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/lib/hlm-td.component.ts:
--------------------------------------------------------------------------------
1 | import { NgTemplateOutlet } from '@angular/common';
2 | import {
3 | ChangeDetectionStrategy,
4 | Component,
5 | ViewEncapsulation,
6 | booleanAttribute,
7 | computed,
8 | inject,
9 | input,
10 | } from '@angular/core';
11 | import { hlm } from '@spartan-ng/brain/core';
12 | import { BrnColumnDefComponent } from '@spartan-ng/brain/table';
13 | import type { ClassValue } from 'clsx';
14 |
15 | @Component({
16 | selector: 'hlm-td',
17 | imports: [NgTemplateOutlet],
18 | host: {
19 | '[class]': '_computedClass()',
20 | },
21 | template: `
22 |
23 |
24 |
25 | @if (truncate()) {
26 |
27 |
28 |
29 | } @else {
30 |
31 | }
32 | `,
33 | changeDetection: ChangeDetectionStrategy.OnPush,
34 | encapsulation: ViewEncapsulation.None,
35 | })
36 | export class HlmTdComponent {
37 | private readonly _columnDef? = inject(BrnColumnDefComponent, { optional: true });
38 | public readonly truncate = input(false, { transform: booleanAttribute });
39 |
40 | public readonly userClass = input('', { alias: 'class' });
41 | protected readonly _computedClass = computed(() =>
42 | hlm('flex flex-none p-4 items-center [&:has([role=checkbox])]:pr-0', this._columnDef?.class(), this.userClass()),
43 | );
44 | }
45 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/lib/hlm-th.component.ts:
--------------------------------------------------------------------------------
1 | import { NgTemplateOutlet } from '@angular/common';
2 | import {
3 | ChangeDetectionStrategy,
4 | Component,
5 | ViewEncapsulation,
6 | booleanAttribute,
7 | computed,
8 | inject,
9 | input,
10 | } from '@angular/core';
11 | import { hlm } from '@spartan-ng/brain/core';
12 | import { BrnColumnDefComponent } from '@spartan-ng/brain/table';
13 | import type { ClassValue } from 'clsx';
14 |
15 | @Component({
16 | selector: 'hlm-th',
17 | imports: [NgTemplateOutlet],
18 | host: {
19 | '[class]': '_computedClass()',
20 | },
21 | template: `
22 |
23 |
24 |
25 | @if (truncate()) {
26 |
27 |
28 |
29 | } @else {
30 |
31 | }
32 | `,
33 | changeDetection: ChangeDetectionStrategy.OnPush,
34 | encapsulation: ViewEncapsulation.None,
35 | })
36 | export class HlmThComponent {
37 | private readonly _columnDef? = inject(BrnColumnDefComponent, { optional: true });
38 | public readonly truncate = input(false, { transform: booleanAttribute });
39 |
40 | public readonly userClass = input('', { alias: 'class' });
41 | protected readonly _computedClass = computed(() =>
42 | hlm(
43 | 'flex flex-none h-12 px-4 text-sm items-center font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0',
44 | this._columnDef?.class(),
45 | this.userClass(),
46 | ),
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-table-helm/src/lib/hlm-trow.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Component({
6 | selector: 'hlm-trow',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | role: 'row',
11 | },
12 | template: `
13 |
14 | `,
15 | changeDetection: ChangeDetectionStrategy.OnPush,
16 | encapsulation: ViewEncapsulation.None,
17 | })
18 | export class HlmTrowComponent {
19 | public readonly userClass = input('', { alias: 'class' });
20 | protected _computedClass = computed(() =>
21 | hlm(
22 | 'flex flex border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',
23 | this.userClass(),
24 | ),
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tabs-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 |
3 | import { HlmTabsContentDirective } from './lib/hlm-tabs-content.directive';
4 | import { HlmTabsListComponent } from './lib/hlm-tabs-list.component';
5 | import { HlmTabsPaginatedListComponent } from './lib/hlm-tabs-paginated-list.component';
6 | import { HlmTabsTriggerDirective } from './lib/hlm-tabs-trigger.directive';
7 | import { HlmTabsComponent } from './lib/hlm-tabs.component';
8 |
9 | export * from './lib/hlm-tabs-content.directive';
10 | export * from './lib/hlm-tabs-list.component';
11 | export * from './lib/hlm-tabs-paginated-list.component';
12 | export * from './lib/hlm-tabs-trigger.directive';
13 | export * from './lib/hlm-tabs.component';
14 |
15 | export const HlmTabsImports = [
16 | HlmTabsComponent,
17 | HlmTabsListComponent,
18 | HlmTabsTriggerDirective,
19 | HlmTabsContentDirective,
20 | HlmTabsPaginatedListComponent,
21 | ] as const;
22 |
23 | @NgModule({
24 | imports: [...HlmTabsImports],
25 | exports: [...HlmTabsImports],
26 | })
27 | export class HlmTabsModule {}
28 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tabs-helm/src/lib/hlm-tabs-content.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnTabsContentDirective } from '@spartan-ng/brain/tabs';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmTabsContent]',
8 | standalone: true,
9 | hostDirectives: [{ directive: BrnTabsContentDirective, inputs: ['brnTabsContent: hlmTabsContent'] }],
10 | host: {
11 | '[class]': '_computedClass()',
12 | },
13 | })
14 | export class HlmTabsContentDirective {
15 | public readonly contentFor = input.required({ alias: 'hlmTabsContent' });
16 |
17 | public readonly userClass = input('', { alias: 'class' });
18 | protected _computedClass = computed(() =>
19 | hlm(
20 | 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
21 | this.userClass(),
22 | ),
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tabs-helm/src/lib/hlm-tabs-list.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnTabsListDirective } from '@spartan-ng/brain/tabs';
4 | import { type VariantProps, cva } from 'class-variance-authority';
5 | import type { ClassValue } from 'clsx';
6 |
7 | export const listVariants = cva(
8 | 'inline-flex items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',
9 | {
10 | variants: {
11 | orientation: {
12 | horizontal: 'h-10 space-x-1',
13 | vertical: 'mt-2 flex-col h-fit space-y-1',
14 | },
15 | },
16 | defaultVariants: {
17 | orientation: 'horizontal',
18 | },
19 | },
20 | );
21 | type ListVariants = VariantProps;
22 |
23 | @Component({
24 | selector: 'hlm-tabs-list',
25 | standalone: true,
26 | hostDirectives: [BrnTabsListDirective],
27 | template: '',
28 | host: {
29 | '[class]': '_computedClass()',
30 | },
31 | })
32 | export class HlmTabsListComponent {
33 | public readonly orientation = input('horizontal');
34 |
35 | public readonly userClass = input('', { alias: 'class' });
36 | protected _computedClass = computed(() => hlm(listVariants({ orientation: this.orientation() }), this.userClass()));
37 | }
38 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tabs-helm/src/lib/hlm-tabs-trigger.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { BrnTabsTriggerDirective } from '@spartan-ng/brain/tabs';
4 | import type { ClassValue } from 'clsx';
5 |
6 | @Directive({
7 | selector: '[hlmTabsTrigger]',
8 | standalone: true,
9 | hostDirectives: [{ directive: BrnTabsTriggerDirective, inputs: ['brnTabsTrigger: hlmTabsTrigger', 'disabled'] }],
10 | host: {
11 | '[class]': '_computedClass()',
12 | },
13 | })
14 | export class HlmTabsTriggerDirective {
15 | public readonly triggerFor = input.required({ alias: 'hlmTabsTrigger' });
16 |
17 | public readonly userClass = input('', { alias: 'class' });
18 | protected _computedClass = computed(() =>
19 | hlm(
20 | 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',
21 | this.userClass(),
22 | ),
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tabs-helm/src/lib/hlm-tabs.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, input } from '@angular/core';
2 | import { BrnTabsDirective } from '@spartan-ng/brain/tabs';
3 |
4 | @Component({
5 | selector: 'hlm-tabs',
6 | standalone: true,
7 | hostDirectives: [
8 | {
9 | directive: BrnTabsDirective,
10 | inputs: ['orientation', 'direction', 'activationMode', 'brnTabs: tab'],
11 | outputs: ['tabActivated'],
12 | },
13 | ],
14 | template: '',
15 | })
16 | export class HlmTabsComponent {
17 | public readonly tab = input.required();
18 | }
19 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-toggle-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmToggleGroupDirective } from './lib/hlm-toggle-group.directive';
3 | import { HlmToggleDirective } from './lib/hlm-toggle.directive';
4 |
5 | export * from './lib/hlm-toggle-group.directive';
6 | export * from './lib/hlm-toggle.directive';
7 | @NgModule({
8 | imports: [HlmToggleDirective],
9 | exports: [HlmToggleDirective],
10 | })
11 | export class HlmToggleModule {}
12 |
13 | @NgModule({
14 | imports: [HlmToggleDirective, HlmToggleGroupDirective],
15 | exports: [HlmToggleDirective, HlmToggleGroupDirective],
16 | })
17 | export class HlmToggleGroupModule {}
18 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-toggle-helm/src/lib/hlm-toggle-group.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import type { ClassValue } from 'clsx';
4 |
5 | @Directive({
6 | selector: 'brn-toggle-group[hlm],[hlmToggleGroup]',
7 | standalone: true,
8 | host: {
9 | '[class]': '_computedClass()',
10 | },
11 | })
12 | export class HlmToggleGroupDirective {
13 | public readonly userClass = input('', { alias: 'class' });
14 | protected readonly _computedClass = computed(() =>
15 | hlm(
16 | 'inline-flex items-center rounded-md [&>[hlm][brnToggle][variant="outline"]]:-mx-[0.5px] [&>[hlm][brnToggle]]:rounded-none focus:[&>[hlm][brnToggle]]:z-10 first-of-type:[&>[hlm][brnToggle]]:rounded-l-md last-of-type:[&>[hlm][brnToggle]]:rounded-r-md',
17 | this.userClass(),
18 | ),
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-togglegroup-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmToggleGroupDirective } from './lib/hlm-toggle-group.directive';
3 | import { HlmToggleGroupItemDirective } from './lib/hlm-toggle-item.directive';
4 |
5 | export * from './lib/hlm-toggle-group.directive';
6 | export * from './lib/hlm-toggle-item.directive';
7 |
8 | @NgModule({
9 | imports: [HlmToggleGroupItemDirective, HlmToggleGroupDirective],
10 | exports: [HlmToggleGroupItemDirective, HlmToggleGroupDirective],
11 | })
12 | export class HlmToggleGroupModule {}
13 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-togglegroup-helm/src/lib/hlm-toggle-group.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, computed, input } from '@angular/core';
2 | import { hlm } from '@spartan-ng/brain/core';
3 | import { VariantProps } from 'class-variance-authority';
4 | import type { ClassValue } from 'clsx';
5 | import { provideHlmToggleGroup } from './hlm-toggle-group.token';
6 | import { toggleGroupItemVariants } from './hlm-toggle-item.directive';
7 |
8 | type ToggleGroupItemVariants = VariantProps;
9 | @Directive({
10 | selector: 'brn-toggle-group[hlm],[hlmToggleGroup]',
11 | standalone: true,
12 | host: {
13 | '[class]': '_computedClass()',
14 | },
15 | providers: [provideHlmToggleGroup(HlmToggleGroupDirective)],
16 | })
17 | export class HlmToggleGroupDirective {
18 | public readonly variant = input('default');
19 | public readonly size = input('default');
20 | public readonly userClass = input('', { alias: 'class' });
21 |
22 | protected readonly _computedClass = computed(() =>
23 | hlm('inline-flex items-center gap-x-2 focus:[&>[hlm][brnToggle]]:z-10', {
24 | 'gap-x-0 rounded-md first-of-type:[&>[hlmToggleGroupItem]]:rounded-l-md last-of-type:[&>[hlmToggleGroupItem]]:rounded-r-md [&>[hlmToggleGroupItem][variant="outline"]]:-mx-[0.5px] [&>[hlmToggleGroupItem]]:rounded-none':
25 | this.variant() === 'merged',
26 | [String(this.userClass())]: !!this.userClass(),
27 | }),
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-togglegroup-helm/src/lib/hlm-toggle-group.token.ts:
--------------------------------------------------------------------------------
1 | import { ExistingProvider, InjectionToken, Type, inject } from '@angular/core';
2 | import type { HlmToggleGroupDirective } from './hlm-toggle-group.directive';
3 |
4 | const HlmToggleGroupToken = new InjectionToken('HlmToggleGroupToken');
5 |
6 | export function provideHlmToggleGroup(config: Type): ExistingProvider {
7 | return { provide: HlmToggleGroupToken, useExisting: config };
8 | }
9 |
10 | export function injectHlmToggleGroup(): HlmToggleGroupDirective {
11 | return inject(HlmToggleGroupToken, { optional: true }) as HlmToggleGroupDirective;
12 | }
13 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tooltip-helm/src/index.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { HlmTooltipTriggerDirective } from './lib/hlm-tooltip-trigger.directive';
3 | import { HlmTooltipComponent } from './lib/hlm-tooltip.component';
4 |
5 | export * from './lib/hlm-tooltip-trigger.directive';
6 | export * from './lib/hlm-tooltip.component';
7 |
8 | export const HlmTooltipImports = [HlmTooltipComponent, HlmTooltipTriggerDirective] as const;
9 |
10 | @NgModule({
11 | imports: [...HlmTooltipImports],
12 | exports: [...HlmTooltipImports],
13 | })
14 | export class HlmTooltipModule {}
15 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tooltip-helm/src/lib/hlm-tooltip-trigger.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '@angular/core';
2 | import { BrnTooltipTriggerDirective, provideBrnTooltipDefaultOptions } from '@spartan-ng/brain/tooltip';
3 |
4 | const DEFAULT_TOOLTIP_CONTENT_CLASSES =
5 | 'overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md fade-in-0 zoom-in-95 ' +
6 | 'data-[state=open]:animate-in ' +
7 | 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 ' +
8 | 'data-[side=below]:slide-in-from-top-2 data-[side=above]:slide-in-from-bottom-2 ' +
9 | 'data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 ';
10 |
11 | @Directive({
12 | selector: '[hlmTooltipTrigger]',
13 | standalone: true,
14 | providers: [
15 | provideBrnTooltipDefaultOptions({
16 | showDelay: 150,
17 | hideDelay: 300,
18 | exitAnimationDuration: 150,
19 | tooltipContentClasses: DEFAULT_TOOLTIP_CONTENT_CLASSES,
20 | }),
21 | ],
22 | hostDirectives: [
23 | {
24 | directive: BrnTooltipTriggerDirective,
25 | inputs: [
26 | 'brnTooltipDisabled: hlmTooltipDisabled',
27 | 'brnTooltipTrigger: hlmTooltipTrigger',
28 | 'aria-describedby',
29 | 'position',
30 | 'positionAtOrigin',
31 | 'hideDelay',
32 | 'showDelay',
33 | 'exitAnimationDuration',
34 | 'touchGestures',
35 | ],
36 | },
37 | ],
38 | })
39 | export class HlmTooltipTriggerDirective {}
40 |
--------------------------------------------------------------------------------
/src/libs/ui/ui-tooltip-helm/src/lib/hlm-tooltip.component.ts:
--------------------------------------------------------------------------------
1 | import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
2 | import { BrnTooltipDirective } from '@spartan-ng/brain/tooltip';
3 |
4 | @Component({
5 | selector: 'hlm-tooltip',
6 | encapsulation: ViewEncapsulation.None,
7 | changeDetection: ChangeDetectionStrategy.OnPush,
8 | imports: [],
9 | providers: [],
10 | host: {
11 | '[style]': '{display: "contents"}',
12 | },
13 | hostDirectives: [BrnTooltipDirective],
14 | template: `
15 |
16 | `,
17 | })
18 | export class HlmTooltipComponent {}
19 |
--------------------------------------------------------------------------------
/src/main.server.ts:
--------------------------------------------------------------------------------
1 | import { bootstrapApplication } from '@angular/platform-browser';
2 | import { AppComponent } from './app/app.component';
3 | import { config } from './app/app.config.server';
4 |
5 | const bootstrap = () => bootstrapApplication(AppComponent, config);
6 |
7 | export default bootstrap;
8 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { bootstrapApplication } from '@angular/platform-browser';
2 | import { AppComponent } from './app/app.component';
3 | import { appConfig } from './app/app.config';
4 |
5 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));
6 |
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3 | {
4 | "extends": "./tsconfig.json",
5 | "compilerOptions": {
6 | "outDir": "./out-tsc/app",
7 | "types": ["node"]
8 | },
9 | "files": ["src/main.ts", "src/main.server.ts", "src/server.ts"],
10 | "include": ["src/**/*.d.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3 | {
4 | "extends": "./tsconfig.json",
5 | "compilerOptions": {
6 | "outDir": "./out-tsc/spec",
7 | "types": ["jasmine"]
8 | },
9 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"]
10 | }
11 |
--------------------------------------------------------------------------------