├── .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 | Mathilde Lewis 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 | Mathilde Lewis 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 |
11 |
12 | Badge 13 |
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 |
30 |
31 | Badge 32 |
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 |
11 |
12 | Badge 13 |
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 |
30 |
31 | Badge 32 |
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 |
11 |
12 | Badge 13 |
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 |
30 |
31 | Badge 32 |
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 |
11 |
12 | Badge 13 |
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 |
30 |
31 | Badge 32 |
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 |
11 |
12 | Badge 13 |
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 |
30 |
31 | Badge 32 |
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 |
11 |
12 | Badge 13 |
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 |
30 |
31 | Badge 32 |
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 |
11 |
Button
12 |
13 |
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 |
9 |
10 | 11 |
12 |
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 | 2 | 3 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/flags/JP.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/flags/VN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/logos/logo-base.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/logos/logo-solid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /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 |
10 |

11 | 12 |

13 |
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 | Avatar image 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 | 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 |
8 | 9 |
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 | --------------------------------------------------------------------------------