├── .editorconfig ├── .githooks ├── commit-msg ├── pre-commit └── pre-push ├── .github ├── ISSUE_TEMPLATE │ ├── 01-bug-report.yml │ └── 02-feature-request.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── chromatic.yml │ ├── ci.yml │ └── nightly-release.yml ├── .gitignore ├── .node-version ├── .prettierignore ├── .prettierrc.mjs ├── .verdaccio └── config.yml ├── .vscode ├── extensions.json └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── apps ├── .gitkeep ├── app │ ├── drizzle.config.ts │ ├── drizzle │ │ ├── 0000_melted_weapon_omega.sql │ │ └── meta │ │ │ ├── 0000_snapshot.json │ │ │ └── _journal.json │ ├── eslint.config.cjs │ ├── index.html │ ├── nitro.config.ts │ ├── package.json │ ├── postcss.config.cjs │ ├── project.json │ ├── src │ │ ├── app.config.server.ts │ │ ├── app.config.ts │ │ ├── app │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── core │ │ │ │ ├── models │ │ │ │ │ └── ui-docs.model.ts │ │ │ │ └── services │ │ │ │ │ └── api-docs.service.ts │ │ │ ├── pages │ │ │ │ ├── (components) │ │ │ │ │ ├── components.page.ts │ │ │ │ │ ├── components.server.ts │ │ │ │ │ └── components │ │ │ │ │ │ ├── (accordion) │ │ │ │ │ │ ├── accordion--multiple-opened.example.ts │ │ │ │ │ │ ├── accordion.page.ts │ │ │ │ │ │ └── accordion.preview.ts │ │ │ │ │ │ ├── (alert) │ │ │ │ │ │ ├── alert--destructive.example.ts │ │ │ │ │ │ ├── alert.page.ts │ │ │ │ │ │ └── alert.preview.ts │ │ │ │ │ │ ├── (alert-dialog) │ │ │ │ │ │ ├── alert-dialog.page.ts │ │ │ │ │ │ └── alert-dialog.preview.ts │ │ │ │ │ │ ├── (aspect-ratio) │ │ │ │ │ │ ├── aspect-ratio.page.ts │ │ │ │ │ │ └── aspect-ratio.preview.ts │ │ │ │ │ │ ├── (avatar) │ │ │ │ │ │ ├── avatar.page.ts │ │ │ │ │ │ └── avatar.preview.ts │ │ │ │ │ │ ├── (badge) │ │ │ │ │ │ ├── badge--destructive.example.ts │ │ │ │ │ │ ├── badge--outline.example.ts │ │ │ │ │ │ ├── badge--secondary.example.ts │ │ │ │ │ │ ├── badge.page.ts │ │ │ │ │ │ └── badge.preview.ts │ │ │ │ │ │ ├── (breadcrumb) │ │ │ │ │ │ ├── breadcrumb--collapsed.example.ts │ │ │ │ │ │ ├── breadcrumb--custom-separator.example.ts │ │ │ │ │ │ ├── breadcrumb--dropdown.example.ts │ │ │ │ │ │ ├── breadcrumb.page.ts │ │ │ │ │ │ └── breadcrumb.preview.ts │ │ │ │ │ │ ├── (button) │ │ │ │ │ │ ├── button--anchor.example.ts │ │ │ │ │ │ ├── button--destructive.example.ts │ │ │ │ │ │ ├── button--ghost.example.ts │ │ │ │ │ │ ├── button--icon.example.ts │ │ │ │ │ │ ├── button--link.example.ts │ │ │ │ │ │ ├── button--loading.example.ts │ │ │ │ │ │ ├── button--outline.example.ts │ │ │ │ │ │ ├── button--secondary.example.ts │ │ │ │ │ │ ├── button--with-icon.example.ts │ │ │ │ │ │ ├── button.page.ts │ │ │ │ │ │ └── button.preview.ts │ │ │ │ │ │ ├── (calendar) │ │ │ │ │ │ ├── calendar--multiple.example.ts │ │ │ │ │ │ ├── calendar.page.ts │ │ │ │ │ │ └── calendar.preview.ts │ │ │ │ │ │ ├── (card) │ │ │ │ │ │ ├── card--notifications.example.ts │ │ │ │ │ │ ├── card.page.ts │ │ │ │ │ │ └── card.preview.ts │ │ │ │ │ │ ├── (carousel) │ │ │ │ │ │ ├── carousel--orientation.example.ts │ │ │ │ │ │ ├── carousel--plugins.example.ts │ │ │ │ │ │ ├── carousel--sizes.example.ts │ │ │ │ │ │ ├── carousel--slide-count.example.ts │ │ │ │ │ │ ├── carousel--spacing.example.ts │ │ │ │ │ │ ├── carousel.page.ts │ │ │ │ │ │ └── carousel.preview.ts │ │ │ │ │ │ ├── (checkbox) │ │ │ │ │ │ ├── checkbox.page.ts │ │ │ │ │ │ └── checkbox.preview.ts │ │ │ │ │ │ ├── (collapsible) │ │ │ │ │ │ ├── collapsible.page.ts │ │ │ │ │ │ └── collapsible.preview.ts │ │ │ │ │ │ ├── (combobox) │ │ │ │ │ │ ├── combobox.page.ts │ │ │ │ │ │ └── combobox.preview.ts │ │ │ │ │ │ ├── (command) │ │ │ │ │ │ ├── command--dialog.example.ts │ │ │ │ │ │ ├── command.page.ts │ │ │ │ │ │ └── command.preview.ts │ │ │ │ │ │ ├── (context-menu) │ │ │ │ │ │ ├── context-menu-with-state.preview.ts │ │ │ │ │ │ ├── context-menu.page.ts │ │ │ │ │ │ └── context-menu.preview.ts │ │ │ │ │ │ ├── (data-table) │ │ │ │ │ │ ├── data-table.page.ts │ │ │ │ │ │ └── data-table.preview.ts │ │ │ │ │ │ ├── (date-picker) │ │ │ │ │ │ ├── date-picker--config.example.ts │ │ │ │ │ │ ├── date-picker--form-multi.example.ts │ │ │ │ │ │ ├── date-picker--form.example.ts │ │ │ │ │ │ ├── date-picker--format.example.ts │ │ │ │ │ │ ├── date-picker--multi.example.ts │ │ │ │ │ │ ├── date-picker.page.ts │ │ │ │ │ │ └── date-picker.preview.ts │ │ │ │ │ │ ├── (dialog) │ │ │ │ │ │ ├── dialog-close.preview.ts │ │ │ │ │ │ ├── dialog-context-menu.preview.ts │ │ │ │ │ │ ├── dialog-declarative.preview.ts │ │ │ │ │ │ ├── dialog-dynamic-component.preview.ts │ │ │ │ │ │ ├── dialog.page.ts │ │ │ │ │ │ └── dialog.preview.ts │ │ │ │ │ │ ├── (dropdown-menu) │ │ │ │ │ │ ├── dropdown-menu.page.ts │ │ │ │ │ │ ├── dropdown-menu.preview.ts │ │ │ │ │ │ ├── dropdown-with-context.preview.ts │ │ │ │ │ │ └── dropdown-with-state.preview.ts │ │ │ │ │ │ ├── (form-field) │ │ │ │ │ │ ├── form-field--error.preview.ts │ │ │ │ │ │ ├── form-field--with-form-dirty.preview.ts │ │ │ │ │ │ ├── form-field--with-form.preview.ts │ │ │ │ │ │ ├── form-field.page.ts │ │ │ │ │ │ └── form-field.preview.ts │ │ │ │ │ │ ├── (hover-card) │ │ │ │ │ │ ├── hover-card.page.ts │ │ │ │ │ │ └── hover-card.preview.ts │ │ │ │ │ │ ├── (icon) │ │ │ │ │ │ ├── icon.page.ts │ │ │ │ │ │ └── icon.preview.ts │ │ │ │ │ │ ├── (input) │ │ │ │ │ │ ├── input--button.preview.ts │ │ │ │ │ │ ├── input--disabled.preview.ts │ │ │ │ │ │ ├── input--file.preview.ts │ │ │ │ │ │ ├── input--label.preview.ts │ │ │ │ │ │ ├── input.page.ts │ │ │ │ │ │ └── input.preview.ts │ │ │ │ │ │ ├── (input-otp) │ │ │ │ │ │ ├── input-otp--form.example.ts │ │ │ │ │ │ ├── input-otp.page.ts │ │ │ │ │ │ └── input-otp.preview.ts │ │ │ │ │ │ ├── (label) │ │ │ │ │ │ ├── label.page.ts │ │ │ │ │ │ └── label.preview.ts │ │ │ │ │ │ ├── (menubar) │ │ │ │ │ │ ├── menubar.page.ts │ │ │ │ │ │ └── menubar.preview.ts │ │ │ │ │ │ ├── (pagination) │ │ │ │ │ │ ├── pagination--advanced.example.ts │ │ │ │ │ │ ├── pagination--icon-only.example.ts │ │ │ │ │ │ ├── pagination--query-params.example.ts │ │ │ │ │ │ ├── pagination.page.ts │ │ │ │ │ │ └── pagination.preview.ts │ │ │ │ │ │ ├── (popover) │ │ │ │ │ │ ├── popover.page.ts │ │ │ │ │ │ └── popover.preview.ts │ │ │ │ │ │ ├── (progress) │ │ │ │ │ │ ├── progress--indeterminate.preview.ts │ │ │ │ │ │ ├── progress.page.ts │ │ │ │ │ │ └── progress.preview.ts │ │ │ │ │ │ ├── (radio-group) │ │ │ │ │ │ ├── radio-group--card.example.ts │ │ │ │ │ │ ├── radio-group.page.ts │ │ │ │ │ │ └── radio-group.preview.ts │ │ │ │ │ │ ├── (scroll-area) │ │ │ │ │ │ ├── scroll-area.page.ts │ │ │ │ │ │ └── scroll-area.preview.ts │ │ │ │ │ │ ├── (select) │ │ │ │ │ │ ├── select--multiple.preview.ts │ │ │ │ │ │ ├── select--scrollable.preview.ts │ │ │ │ │ │ ├── select--value-template.preview.ts │ │ │ │ │ │ ├── select.page.ts │ │ │ │ │ │ └── select.preview.ts │ │ │ │ │ │ ├── (separator) │ │ │ │ │ │ ├── separator.page.ts │ │ │ │ │ │ └── separator.preview.ts │ │ │ │ │ │ ├── (sheet) │ │ │ │ │ │ ├── sheet--side.preview.ts │ │ │ │ │ │ ├── sheet-close.preview.ts │ │ │ │ │ │ ├── sheet.page.ts │ │ │ │ │ │ └── sheet.preview.ts │ │ │ │ │ │ ├── (skeleton) │ │ │ │ │ │ ├── skeleton.page.ts │ │ │ │ │ │ └── skeleton.preview.ts │ │ │ │ │ │ ├── (slider) │ │ │ │ │ │ ├── slider.page.ts │ │ │ │ │ │ └── slider.preview.ts │ │ │ │ │ │ ├── (sonner) │ │ │ │ │ │ ├── sonner.page.ts │ │ │ │ │ │ └── sonner.preview.ts │ │ │ │ │ │ ├── (spinner) │ │ │ │ │ │ ├── spinner.page.ts │ │ │ │ │ │ └── spinner.preview.ts │ │ │ │ │ │ ├── (switch) │ │ │ │ │ │ ├── switch.page.ts │ │ │ │ │ │ └── switch.preview.ts │ │ │ │ │ │ ├── (table) │ │ │ │ │ │ ├── table.page.ts │ │ │ │ │ │ └── table.preview.ts │ │ │ │ │ │ ├── (tabs) │ │ │ │ │ │ ├── tabs--paginated.preview.ts │ │ │ │ │ │ ├── tabs--vertical.preview.ts │ │ │ │ │ │ ├── tabs.page.ts │ │ │ │ │ │ └── tabs.preview.ts │ │ │ │ │ │ ├── (textarea) │ │ │ │ │ │ ├── textarea.page.ts │ │ │ │ │ │ └── textarea.preview.ts │ │ │ │ │ │ ├── (toggle) │ │ │ │ │ │ ├── toggle--disabled.preview.ts │ │ │ │ │ │ ├── toggle--large.preview.ts │ │ │ │ │ │ ├── toggle--outline.preview.ts │ │ │ │ │ │ ├── toggle--small.preview.ts │ │ │ │ │ │ ├── toggle--with-text.preview.ts │ │ │ │ │ │ ├── toggle.page.ts │ │ │ │ │ │ └── toggle.preview.ts │ │ │ │ │ │ ├── (toggle-group) │ │ │ │ │ │ ├── toggle-group--disabled.preview.ts │ │ │ │ │ │ ├── toggle-group--large.preview.ts │ │ │ │ │ │ ├── toggle-group--outline.preview.ts │ │ │ │ │ │ ├── toggle-group--small.preview.ts │ │ │ │ │ │ ├── toggle-group.page.ts │ │ │ │ │ │ └── toggle-group.preview.ts │ │ │ │ │ │ ├── (tooltip) │ │ │ │ │ │ ├── tooltip--simple.example.ts │ │ │ │ │ │ ├── tooltip.page.ts │ │ │ │ │ │ └── tooltip.preview.ts │ │ │ │ │ │ ├── [...not-found].page.ts │ │ │ │ │ │ ├── index.page.ts │ │ │ │ │ │ └── installation-cs.component.ts │ │ │ │ ├── (documentation) │ │ │ │ │ ├── documentation.page.ts │ │ │ │ │ └── documentation │ │ │ │ │ │ ├── (ui) │ │ │ │ │ │ ├── (typography) │ │ │ │ │ │ │ ├── typography.page.ts │ │ │ │ │ │ │ └── typography.preview.ts │ │ │ │ │ │ ├── dark-mode.page.ts │ │ │ │ │ │ ├── figma.page.ts │ │ │ │ │ │ ├── health-checks.page.ts │ │ │ │ │ │ ├── installation.page.ts │ │ │ │ │ │ ├── theming.page.ts │ │ │ │ │ │ └── update-guide.page.ts │ │ │ │ │ │ ├── [...not-found].page.ts │ │ │ │ │ │ ├── about.page.ts │ │ │ │ │ │ ├── changelog.page.ts │ │ │ │ │ │ ├── cli.page.ts │ │ │ │ │ │ ├── components-json.page.ts │ │ │ │ │ │ ├── index.page.ts │ │ │ │ │ │ └── introduction.page.ts │ │ │ │ ├── (examples) │ │ │ │ │ ├── examples.page.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── authentication │ │ │ │ │ │ ├── (authentication).page.ts │ │ │ │ │ │ └── components │ │ │ │ │ │ │ └── form.component.ts │ │ │ │ │ │ ├── index.page.ts │ │ │ │ │ │ ├── music │ │ │ │ │ │ ├── (music).page.ts │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── side-menu │ │ │ │ │ │ │ │ ├── side-menu-button.component.ts │ │ │ │ │ │ │ │ └── side-menu.component.ts │ │ │ │ │ │ │ └── top-menu.component.ts │ │ │ │ │ │ └── directives │ │ │ │ │ │ │ └── fallback-img.directive.ts │ │ │ │ │ │ ├── notes │ │ │ │ │ │ ├── (notes).page.ts │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── note-skeleton.component.ts │ │ │ │ │ │ │ ├── note.component.ts │ │ │ │ │ │ │ └── notes-empty.component.ts │ │ │ │ │ │ ├── tasks │ │ │ │ │ │ ├── (tasks).page.ts │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ └── table-actions.component.ts │ │ │ │ │ │ ├── pipes │ │ │ │ │ │ │ ├── priority-icon.pipe.ts │ │ │ │ │ │ │ └── status-icon.pipe.ts │ │ │ │ │ │ └── services │ │ │ │ │ │ │ ├── local-storage.service.ts │ │ │ │ │ │ │ └── tasks.service.ts │ │ │ │ │ │ └── typography │ │ │ │ │ │ └── (typography).page.ts │ │ │ │ ├── (home).page.ts │ │ │ │ ├── (home) │ │ │ │ │ └── components │ │ │ │ │ │ ├── th-item-placeholder.component.ts │ │ │ │ │ │ ├── th-item.component.ts │ │ │ │ │ │ ├── three-hundred.component.ts │ │ │ │ │ │ └── zerops-logo.component.ts │ │ │ │ ├── (stack) │ │ │ │ │ ├── stack.page.ts │ │ │ │ │ └── stack │ │ │ │ │ │ ├── (overview) │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ └── architecture-diagram.component.ts │ │ │ │ │ │ └── overview.page.ts │ │ │ │ │ │ ├── (technologies) │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── architecture-diagram-analog.component.ts │ │ │ │ │ │ │ ├── architecture-diagram-angular.component.ts │ │ │ │ │ │ │ ├── architecture-diagram-drizzle.component.ts │ │ │ │ │ │ │ ├── architecture-diagram-nx.component.ts │ │ │ │ │ │ │ ├── architecture-diagram-supabase.component.ts │ │ │ │ │ │ │ └── architecture-diagram-trpc.component.ts │ │ │ │ │ │ └── technologies.page.ts │ │ │ │ │ │ ├── [...not-found].page.ts │ │ │ │ │ │ ├── index.page.ts │ │ │ │ │ │ └── installation.page.ts │ │ │ │ ├── [...not-found].page.ts │ │ │ │ └── alpha.page.ts │ │ │ └── shared │ │ │ │ ├── breadcrumbs │ │ │ │ ├── breadcrumb-shared.service.ts │ │ │ │ ├── breadcrumb.service.ts │ │ │ │ └── breadcrumbs.component.ts │ │ │ │ ├── cli-mode.service.ts │ │ │ │ ├── code │ │ │ │ ├── code-preview.directive.ts │ │ │ │ └── code.component.ts │ │ │ │ ├── footer │ │ │ │ └── footer.component.ts │ │ │ │ ├── header │ │ │ │ ├── header-dark-mode.component.ts │ │ │ │ ├── header-mobile-nav.component.ts │ │ │ │ ├── header-theme-picker.component.ts │ │ │ │ └── header.component.ts │ │ │ │ ├── input-error │ │ │ │ ├── input-error.component.ts │ │ │ │ └── input-error.directive.ts │ │ │ │ ├── layout │ │ │ │ ├── coming-soon.component.ts │ │ │ │ ├── container.directive.ts │ │ │ │ ├── main-section.directive.ts │ │ │ │ ├── package-installer-tabs.component.ts │ │ │ │ ├── page-bottom-nav-placeholder.component.ts │ │ │ │ ├── page-bottom-nav │ │ │ │ │ ├── page-bottom-nav-link.component.ts │ │ │ │ │ └── page-bottom-nav.component.ts │ │ │ │ ├── page-nav │ │ │ │ │ ├── page-nav-link.component.ts │ │ │ │ │ ├── page-nav-outlet.component.ts │ │ │ │ │ └── page-nav.component.ts │ │ │ │ ├── page.component.ts │ │ │ │ ├── section-intro.component.ts │ │ │ │ ├── section-sub-heading.component.ts │ │ │ │ ├── side-nav │ │ │ │ │ ├── side-nav-coming-soon.component.ts │ │ │ │ │ ├── side-nav-content.component.ts │ │ │ │ │ ├── side-nav-heading.directive.ts │ │ │ │ │ ├── side-nav-link.directive.ts │ │ │ │ │ ├── side-nav-links.directive.ts │ │ │ │ │ └── side-nav.component.ts │ │ │ │ ├── tabs-cli.component.ts │ │ │ │ ├── tabs.component.ts │ │ │ │ ├── ui-api-docs-table │ │ │ │ │ └── ui-api-docs-table.component.ts │ │ │ │ └── ui-docs-section │ │ │ │ │ └── ui-docs-section.component.ts │ │ │ │ ├── meta │ │ │ │ └── meta.util.ts │ │ │ │ ├── spartan-logo.component.ts │ │ │ │ ├── spartan-nav-link.directive.ts │ │ │ │ ├── theme.service.ts │ │ │ │ └── typography │ │ │ │ └── link.ts │ │ ├── db.ts │ │ ├── main.server.ts │ │ ├── main.ts │ │ ├── public │ │ │ ├── assets │ │ │ │ ├── .gitkeep │ │ │ │ ├── avatar.png │ │ │ │ ├── mountains.jpg │ │ │ │ ├── music_img_fallback.svg │ │ │ │ ├── og-image.png │ │ │ │ └── spartan.svg │ │ │ └── robots.txt │ │ ├── server │ │ │ ├── routes │ │ │ │ ├── primitive-api.get.ts │ │ │ │ └── trpc │ │ │ │ │ └── [trpc].ts │ │ │ └── trpc │ │ │ │ ├── context.ts │ │ │ │ ├── routers │ │ │ │ ├── index.ts │ │ │ │ └── notes.ts │ │ │ │ └── trpc.ts │ │ ├── styles.css │ │ ├── test-setup.ts │ │ ├── trpc-client.ts │ │ └── vite-env.d.ts │ ├── tailwind.config.cjs │ ├── tsconfig.app.json │ ├── tsconfig.editor.json │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── vite.config.ts ├── trpc-app-e2e │ ├── eslint.config.cjs │ ├── project.json │ ├── tests │ │ ├── app.spec.ts │ │ └── fixtures │ │ │ ├── notes.po.ts │ │ │ └── notes.ts │ ├── tsconfig.json │ └── vite.config.ts ├── ui-storybook-e2e │ ├── cypress.config.cjs │ ├── eslint.config.cjs │ ├── project.json │ ├── src │ │ ├── fixtures │ │ │ └── example.json │ │ ├── integration │ │ │ ├── accordion │ │ │ │ └── accordion.cy.ts │ │ │ ├── alert-dialog │ │ │ │ └── alert-dialog.cy.ts │ │ │ ├── breadcrumb │ │ │ │ └── breadcrumb.cy.ts │ │ │ ├── calendar │ │ │ │ └── calendar.cy.ts │ │ │ ├── carousel │ │ │ │ └── carousel.cy.ts │ │ │ ├── checkbox │ │ │ │ └── checkbox.cy.ts │ │ │ ├── combobox │ │ │ │ └── combobox.cy.ts │ │ │ ├── command │ │ │ │ ├── command--default.cy.ts │ │ │ │ └── command--dynamic.cy.ts │ │ │ ├── dialog │ │ │ │ └── dialog.cy.ts │ │ │ ├── label │ │ │ │ └── label.cy.ts │ │ │ ├── menu │ │ │ │ ├── context-menu.cy.ts │ │ │ │ ├── dropdown-menu.cy.ts │ │ │ │ └── menubar.cy.ts │ │ │ ├── popover │ │ │ │ └── popover.cy.ts │ │ │ ├── progress │ │ │ │ └── progress.cy.ts │ │ │ ├── radio-group │ │ │ │ └── radio-group.cy.ts │ │ │ ├── select │ │ │ │ └── select.cy.ts │ │ │ ├── separator │ │ │ │ └── separator.cy.ts │ │ │ ├── sheet │ │ │ │ └── sheet.cy.ts │ │ │ ├── slider │ │ │ │ └── slider.cy.ts │ │ │ ├── switch │ │ │ │ └── switch.cy.ts │ │ │ ├── tabs │ │ │ │ ├── tabs--brnonly.cy.ts │ │ │ │ ├── tabs--default--manual.cy.ts │ │ │ │ ├── tabs--default.cy.ts │ │ │ │ └── tabs--vertical.cy.ts │ │ │ └── toggle-group │ │ │ │ ├── toggle--toggle-group-form.cy.ts │ │ │ │ ├── toggle--toggle-group-multiple-nullable.cy.ts │ │ │ │ ├── toggle--toggle-group-multiple.cy.ts │ │ │ │ ├── toggle--toggle-group-single--dynamic-options.cy.ts │ │ │ │ ├── toggle--toggle-group-single-nullable.cy.ts │ │ │ │ └── toggle--toggle-group-single.cy.ts │ │ └── support │ │ │ ├── commands.ts │ │ │ └── e2e.ts │ └── tsconfig.json └── ui-storybook │ ├── .storybook │ ├── main.js │ ├── preview.js │ ├── tailwind.css │ └── tsconfig.json │ ├── README.md │ ├── postcss.config.js │ ├── project.json │ ├── public │ └── mountains.jpg │ ├── src │ └── index.ts │ ├── stories │ ├── accordion.stories.ts │ ├── alert-dialog.stories.ts │ ├── alert.stories.ts │ ├── aspect-ratio.stories.ts │ ├── avatar.stories.ts │ ├── badge.stories.ts │ ├── breadcrumb.stories.ts │ ├── button.stories.ts │ ├── calendar.stories.ts │ ├── card.stories.ts │ ├── carousel.stories.ts │ ├── checkbox.stories.ts │ ├── collapsible.stories.ts │ ├── combobox.stories.ts │ ├── command.stories.ts │ ├── context-menu.stories.ts │ ├── date-picker.stories.ts │ ├── dialog.stories.ts │ ├── dropdown-menu-bar.stories.ts │ ├── dropdown-menu.stories.ts │ ├── form-field.stories.ts │ ├── hover-card.stories.ts │ ├── icon.stories.ts │ ├── input-otp.stories.ts │ ├── input.stories.ts │ ├── label.stories.ts │ ├── pagination.stories.ts │ ├── popover.stories.ts │ ├── progress.stories.ts │ ├── radio-group.stories.ts │ ├── scroll-area.stories.ts │ ├── select.stories.ts │ ├── separator.stories.ts │ ├── sheet.stories.ts │ ├── skeleton.stories.ts │ ├── slider.stories.ts │ ├── sonner.stories.ts │ ├── spinner.stories.ts │ ├── switch.stories.ts │ ├── table.stories.ts │ ├── tabs.stories.ts │ ├── toggle-group.stories.ts │ ├── toggle.stories.ts │ ├── tooltip.stories.ts │ └── typography.stories.ts │ ├── tailwind.config.js │ ├── tsconfig.json │ └── tsconfig.lib.json ├── commitlint.config.cjs ├── eslint.config.cjs ├── jest.config.ts ├── jest.preset.cjs ├── libs ├── .gitkeep ├── brain │ ├── README.md │ ├── accordion │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-accordion-content.component.ts │ │ │ ├── brn-accordion.directive.spec.ts │ │ │ └── brn-accordion.directive.ts │ ├── alert-dialog │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-alert-dialog-content.directive.ts │ │ │ ├── brn-alert-dialog-description.directive.ts │ │ │ ├── brn-alert-dialog-overlay.component.ts │ │ │ ├── brn-alert-dialog-title.directive.ts │ │ │ ├── brn-alert-dialog-trigger.directive.ts │ │ │ └── brn-alert-dialog.component.ts │ ├── avatar │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-avatar.component.spec.ts │ │ │ ├── brn-avatar.component.ts │ │ │ ├── fallback │ │ │ ├── brn-avatar-fallback.directive.spec.ts │ │ │ ├── brn-avatar-fallback.directive.ts │ │ │ └── index.ts │ │ │ ├── image │ │ │ ├── brn-avatar-image.directive.spec.ts │ │ │ ├── brn-avatar-image.directive.ts │ │ │ └── index.ts │ │ │ └── util │ │ │ ├── hex-color-for.spec.ts │ │ │ ├── hex-color-for.ts │ │ │ ├── index.ts │ │ │ ├── initials.pipe.spec.ts │ │ │ ├── initials.pipe.ts │ │ │ ├── is-bright.spec.ts │ │ │ └── is-bright.ts │ ├── calendar │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-calendar-cell-button.directive.ts │ │ │ ├── brn-calendar-cell.directive.ts │ │ │ ├── brn-calendar-grid.directive.ts │ │ │ ├── brn-calendar-header.directive.ts │ │ │ ├── brn-calendar-next-button.directive.ts │ │ │ ├── brn-calendar-previous-button.directive.ts │ │ │ ├── brn-calendar-week.directive.ts │ │ │ ├── brn-calendar-weekday.directive.ts │ │ │ ├── brn-calendar.directive.ts │ │ │ ├── brn-calendar.token.ts │ │ │ ├── i18n │ │ │ └── calendar-i18n.ts │ │ │ └── mode │ │ │ └── brn-calendar-multiple.directive.ts │ ├── checkbox │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-checkbox-ng-model.spec.ts │ │ │ ├── brn-checkbox.component.spec.ts │ │ │ └── brn-checkbox.component.ts │ ├── collapsible │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-collapsible-content.component.ts │ │ │ ├── brn-collapsible-trigger.directive.ts │ │ │ ├── brn-collapsible.component.spec.ts │ │ │ └── brn-collapsible.component.ts │ ├── command │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-command-empty.directive.ts │ │ │ ├── brn-command-group.directive.ts │ │ │ ├── brn-command-item.directive.ts │ │ │ ├── brn-command-item.token.ts │ │ │ ├── brn-command-list.directive.ts │ │ │ ├── brn-command-search-input.directive.ts │ │ │ ├── brn-command-search-input.token.ts │ │ │ ├── brn-command.directive.ts │ │ │ └── brn-command.token.ts │ ├── core │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── helpers │ │ │ ├── create-injection-token.ts │ │ │ ├── custom-element-class-settable.ts │ │ │ ├── dev-mode.ts │ │ │ ├── exposes-side.ts │ │ │ ├── exposes-state.ts │ │ │ ├── hlm.ts │ │ │ ├── table-classes-settable.ts │ │ │ └── zone-free.ts │ │ │ └── index.ts │ ├── date-time-luxon │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── date-adapter.spec.ts │ │ │ └── date-adapter.ts │ ├── date-time │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── date-adapter.ts │ │ │ ├── native-date-adapter.spec.ts │ │ │ └── native-date-adapter.ts │ ├── dialog │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-dialog-close.directive.ts │ │ │ ├── brn-dialog-content.directive.ts │ │ │ ├── brn-dialog-description.directive.ts │ │ │ ├── brn-dialog-options.ts │ │ │ ├── brn-dialog-overlay.component.ts │ │ │ ├── brn-dialog-ref.ts │ │ │ ├── brn-dialog-state.ts │ │ │ ├── brn-dialog-title.directive.ts │ │ │ ├── brn-dialog-token.ts │ │ │ ├── brn-dialog-trigger.directive.ts │ │ │ ├── brn-dialog-utils.ts │ │ │ ├── brn-dialog.component.ts │ │ │ └── brn-dialog.service.ts │ ├── eslint.config.cjs │ ├── form-field │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── brn-form-field-control.ts │ ├── forms │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── control-value-accessor.ts │ │ │ ├── error-options.ts │ │ │ └── error-state-tracker.ts │ ├── hlm-tailwind-preset.css │ ├── hlm-tailwind-preset.js │ ├── hover-card │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-hover-card-content.service.ts │ │ │ ├── brn-hover-card.component.ts │ │ │ └── createHoverObservable.ts │ ├── input-otp │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-input-otp-slot.component.ts │ │ │ ├── brn-input-otp.component.ts │ │ │ └── brn-input-otp.token.ts │ ├── jest.config.ts │ ├── label │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── brn-label.directive.ts │ ├── menu │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-context-menu-trigger.directive.ts │ │ │ ├── brn-menu-align.ts │ │ │ ├── brn-menu-bar.directive.ts │ │ │ ├── brn-menu-group.directive.ts │ │ │ ├── brn-menu-item-checkbox.directive.ts │ │ │ ├── brn-menu-item-radio.directive.ts │ │ │ ├── brn-menu-item.directive.ts │ │ │ ├── brn-menu-trigger.directive.ts │ │ │ └── brn-menu.directive.ts │ ├── ng-package.json │ ├── package.json │ ├── popover │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-popover-close.directive.ts │ │ │ ├── brn-popover-content.directive.ts │ │ │ ├── brn-popover-trigger.directive.ts │ │ │ └── brn-popover.component.ts │ ├── progress │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-progress-indicator.component.ts │ │ │ ├── brn-progress.component.spec.ts │ │ │ ├── brn-progress.component.ts │ │ │ └── brn-progress.token.ts │ ├── project.json │ ├── radio-group │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-radio-group.directive.ts │ │ │ ├── brn-radio-group.token.ts │ │ │ ├── brn-radio.component.spec.ts │ │ │ └── brn-radio.component.ts │ ├── select │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-select-content.component.ts │ │ │ ├── brn-select-content.token.ts │ │ │ ├── brn-select-group.directive.ts │ │ │ ├── brn-select-label.directive.ts │ │ │ ├── brn-select-option.directive.ts │ │ │ ├── brn-select-placeholder.directive.ts │ │ │ ├── brn-select-trigger.directive.ts │ │ │ ├── brn-select-value.component.ts │ │ │ ├── brn-select-value.directive.ts │ │ │ ├── brn-select.component.ts │ │ │ ├── brn-select.token.ts │ │ │ └── tests │ │ │ ├── brn-select.component.numbers.spec.ts │ │ │ ├── brn-select.component.spec.ts │ │ │ ├── select-multi-mode.spec.ts │ │ │ ├── select-ng-model-form.ts │ │ │ ├── select-reactive-form.ts │ │ │ ├── select-single-mode.spec.ts │ │ │ └── utils.ts │ ├── separator │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── brn-separator.component.ts │ ├── sheet │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-sheet-close.directive.ts │ │ │ ├── brn-sheet-content.directive.ts │ │ │ ├── brn-sheet-description.directive.ts │ │ │ ├── brn-sheet-overlay.component.ts │ │ │ ├── brn-sheet-title.directive.ts │ │ │ ├── brn-sheet-trigger.directive.ts │ │ │ └── brn-sheet.component.ts │ ├── slider │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-slider-range.directive.ts │ │ │ ├── brn-slider-thumb.directive.ts │ │ │ ├── brn-slider-tick.directive.ts │ │ │ ├── brn-slider-track.directive.ts │ │ │ ├── brn-slider-track.token.ts │ │ │ ├── brn-slider.directive.ts │ │ │ ├── brn-slider.token.ts │ │ │ └── tests │ │ │ ├── brn-slider-reactive-form.spec.ts │ │ │ ├── brn-slider-states.component.ts │ │ │ └── brn-slider-template-driven-form.spec.ts │ ├── src │ │ ├── index.ts │ │ └── test-setup.ts │ ├── switch │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-switch-ng-model.spec.ts │ │ │ ├── brn-switch-thumb.component.ts │ │ │ ├── brn-switch.component.spec.ts │ │ │ └── brn-switch.component.ts │ ├── table │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-cell-def.directive.ts │ │ │ ├── brn-column-def.component.ts │ │ │ ├── brn-column-manager.spec.ts │ │ │ ├── brn-column-manager.ts │ │ │ ├── brn-footer-def.directive.ts │ │ │ ├── brn-header-def.directive.ts │ │ │ ├── brn-paginator.directive.ts │ │ │ └── brn-table.component.ts │ ├── tabs │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-tabs-content.directive.ts │ │ │ ├── brn-tabs-list.directive.ts │ │ │ ├── brn-tabs-paginated-list.directive.ts │ │ │ ├── brn-tabs-trigger.directive.ts │ │ │ └── brn-tabs.directive.ts │ ├── toggle-group │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-toggle-group.component.spec.ts │ │ │ ├── brn-toggle-group.component.ts │ │ │ ├── brn-toggle-group.token.ts │ │ │ └── brn-toggle-item.directive.ts │ ├── toggle │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-toggle.directive.spec.ts │ │ │ └── brn-toggle.directive.ts │ ├── tooltip │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── brn-tooltip-content.component.ts │ │ │ ├── brn-tooltip-content.directive.ts │ │ │ ├── brn-tooltip-trigger.directive.ts │ │ │ ├── brn-tooltip.directive.ts │ │ │ ├── brn-tooltip.token.ts │ │ │ ├── computed-previous.spec.ts │ │ │ └── computed-previous.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ └── tsconfig.spec.json ├── cli │ ├── README.md │ ├── eslint.config.cjs │ ├── executors.json │ ├── generators.json │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── generators │ │ │ ├── base │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── lib │ │ │ │ │ ├── build-dependency-array.ts │ │ │ │ │ ├── deleteFiles.ts │ │ │ │ │ ├── get-target-library-directory.ts │ │ │ │ │ └── initialize-angular-library.ts │ │ │ │ ├── schema.d.ts │ │ │ │ ├── schema.json │ │ │ │ └── versions.ts │ │ │ ├── healthcheck │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── healthchecks.ts │ │ │ │ ├── healthchecks │ │ │ │ │ ├── brain-imports.ts │ │ │ │ │ ├── brn-radio.ts │ │ │ │ │ ├── brn-toggle-group.ts │ │ │ │ │ ├── core-imports.ts │ │ │ │ │ ├── helm-imports.ts │ │ │ │ │ ├── hlm-icon.ts │ │ │ │ │ ├── hlm-scroll-area.ts │ │ │ │ │ ├── hlm-select.ts │ │ │ │ │ └── version.ts │ │ │ │ ├── schema.d.ts │ │ │ │ ├── schema.json │ │ │ │ └── utils │ │ │ │ │ ├── prompt.ts │ │ │ │ │ ├── reporter.ts │ │ │ │ │ └── runner.ts │ │ │ ├── migrate-brain-imports │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── import-map.ts │ │ │ │ ├── schema.d.ts │ │ │ │ ├── schema.json │ │ │ │ └── utils │ │ │ │ │ └── binary-extensions.ts │ │ │ ├── migrate-core │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-helm-imports │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── import-map.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-helm-libraries │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-icon │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-radio │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-scroll-area │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-select │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── migrate-toggle-group │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── theme │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── libs │ │ │ │ │ ├── add-theme-to-application-styles.ts │ │ │ │ │ └── supported-theme-generator-map.ts │ │ │ │ └── schema.json │ │ │ └── ui │ │ │ │ ├── add-dependent-primitive.ts │ │ │ │ ├── compat.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── libs │ │ │ │ ├── ui-accordion-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-accordion-content.component.ts.template │ │ │ │ │ │ │ ├── hlm-accordion-icon.directive.ts.template │ │ │ │ │ │ │ ├── hlm-accordion-item.directive.ts.template │ │ │ │ │ │ │ ├── hlm-accordion-trigger.directive.ts.template │ │ │ │ │ │ │ └── hlm-accordion.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-alert-dialog-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-alert-dialog-action-button.directive.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-cancel-button.directive.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-content.component.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-description.directive.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-footer.component.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-header.component.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-overlay.directive.ts.template │ │ │ │ │ │ │ ├── hlm-alert-dialog-title.directive.ts.template │ │ │ │ │ │ │ └── hlm-alert-dialog.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-alert-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-alert-description.directive.ts.template │ │ │ │ │ │ │ ├── hlm-alert-icon.directive.ts.template │ │ │ │ │ │ │ ├── hlm-alert-title.directive.ts.template │ │ │ │ │ │ │ └── hlm-alert.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-aspect-ratio-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── helm-aspect-ratio.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-avatar-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── fallback │ │ │ │ │ │ │ ├── hlm-avatar-fallback.directive.ts.template │ │ │ │ │ │ │ └── index.ts.template │ │ │ │ │ │ │ ├── hlm-avatar.component.ts.template │ │ │ │ │ │ │ └── image │ │ │ │ │ │ │ ├── hlm-avatar-image.directive.ts.template │ │ │ │ │ │ │ └── index.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-badge-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-badge.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-breadcrumb-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-breadcrumb-ellipsis.component.ts.template │ │ │ │ │ │ │ ├── hlm-breadcrumb-item.directive.ts.template │ │ │ │ │ │ │ ├── hlm-breadcrumb-link.directive.ts.template │ │ │ │ │ │ │ ├── hlm-breadcrumb-list.directive.ts.template │ │ │ │ │ │ │ ├── hlm-breadcrumb-page.directive.ts.template │ │ │ │ │ │ │ ├── hlm-breadcrumb-separator.component.ts.template │ │ │ │ │ │ │ └── hlm-breadcrumb.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-button-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-button.directive.ts.template │ │ │ │ │ │ │ └── hlm-button.token.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-calendar-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-calendar-multi.component.ts.template │ │ │ │ │ │ │ └── hlm-calendar.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-card-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-card-content.directive.ts.template │ │ │ │ │ │ │ ├── hlm-card-description.directive.ts.template │ │ │ │ │ │ │ ├── hlm-card-footer.directive.ts.template │ │ │ │ │ │ │ ├── hlm-card-header.directive.ts.template │ │ │ │ │ │ │ ├── hlm-card-title.directive.ts.template │ │ │ │ │ │ │ └── hlm-card.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-carousel-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-carousel-content.component.ts.template │ │ │ │ │ │ │ ├── hlm-carousel-item.component.ts.template │ │ │ │ │ │ │ ├── hlm-carousel-next.component.ts.template │ │ │ │ │ │ │ ├── hlm-carousel-previous.component.ts.template │ │ │ │ │ │ │ ├── hlm-carousel-slide-display.component.ts.template │ │ │ │ │ │ │ └── hlm-carousel.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-checkbox-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-checkbox.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-command-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-command-dialog-close-button.directive.ts.template │ │ │ │ │ │ │ ├── hlm-command-dialog.directive.ts.template │ │ │ │ │ │ │ ├── hlm-command-empty.directive.ts.template │ │ │ │ │ │ │ ├── hlm-command-group-label.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-group.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-icon.directive.ts.template │ │ │ │ │ │ │ ├── hlm-command-item.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-list.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-search-input.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-search.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-separator.component.ts.template │ │ │ │ │ │ │ ├── hlm-command-shortcut.component.ts.template │ │ │ │ │ │ │ └── hlm-command.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-date-picker-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-date-picker-multi.component.ts.template │ │ │ │ │ │ │ ├── hlm-date-picker-multi.token.ts.template │ │ │ │ │ │ │ ├── hlm-date-picker.component.ts.template │ │ │ │ │ │ │ └── hlm-date-picker.token.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-dialog-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-dialog-close.directive.ts.template │ │ │ │ │ │ │ ├── hlm-dialog-content.component.ts.template │ │ │ │ │ │ │ ├── hlm-dialog-description.directive.ts.template │ │ │ │ │ │ │ ├── hlm-dialog-footer.component.ts.template │ │ │ │ │ │ │ ├── hlm-dialog-header.component.ts.template │ │ │ │ │ │ │ ├── hlm-dialog-overlay.directive.ts.template │ │ │ │ │ │ │ ├── hlm-dialog-title.directive.ts.template │ │ │ │ │ │ │ ├── hlm-dialog.component.ts.template │ │ │ │ │ │ │ └── hlm-dialog.service.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-form-field-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-error.directive.ts.template │ │ │ │ │ │ │ ├── hlm-form-field.component.ts.template │ │ │ │ │ │ │ └── hlm-hint.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-hover-card-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-hover-card-content.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-icon-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-icon.directive.ts.template │ │ │ │ │ │ │ └── hlm-icon.token.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-input-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-input-error.directive.ts.template │ │ │ │ │ │ │ └── hlm-input.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-input-otp-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-input-otp-fake-caret.component.ts.template │ │ │ │ │ │ │ ├── hlm-input-otp-group.directive.ts.template │ │ │ │ │ │ │ ├── hlm-input-otp-separator.component.ts.template │ │ │ │ │ │ │ ├── hlm-input-otp-slot.component.ts.template │ │ │ │ │ │ │ └── hlm-input-otp.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-label-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-label.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-menu-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-menu-bar-item.directive.ts.template │ │ │ │ │ │ │ ├── hlm-menu-bar.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-group.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item-check.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item-checkbox.directive.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item-icon.directive.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item-radio.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item-radio.directive.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item-sub-indicator.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-item.directive.ts.template │ │ │ │ │ │ │ ├── hlm-menu-label.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-separator.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu-shortcut.component.ts.template │ │ │ │ │ │ │ ├── hlm-menu.component.ts.template │ │ │ │ │ │ │ └── hlm-sub-menu.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-pagination-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-numbered-pagination.component.ts.template │ │ │ │ │ │ │ ├── hlm-pagination-content.directive.ts.template │ │ │ │ │ │ │ ├── hlm-pagination-ellipsis.component.ts.template │ │ │ │ │ │ │ ├── hlm-pagination-item.directive.ts.template │ │ │ │ │ │ │ ├── hlm-pagination-link.directive.ts.template │ │ │ │ │ │ │ ├── hlm-pagination-next.component.ts.template │ │ │ │ │ │ │ ├── hlm-pagination-previous.component.ts.template │ │ │ │ │ │ │ └── hlm-pagination.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-popover-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-popover-close.directive.ts.template │ │ │ │ │ │ │ └── hlm-popover-content.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-progress-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-progress-indicator.directive.ts.template │ │ │ │ │ │ │ └── hlm-progress.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-radio-group-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-radio-group.component.ts.template │ │ │ │ │ │ │ ├── hlm-radio-indicator.component.ts.template │ │ │ │ │ │ │ └── hlm-radio.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-scroll-area-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-scroll-area.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-select-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-select-content.directive.ts.template │ │ │ │ │ │ │ ├── hlm-select-group.directive.ts.template │ │ │ │ │ │ │ ├── hlm-select-label.directive.ts.template │ │ │ │ │ │ │ ├── hlm-select-option.component.ts.template │ │ │ │ │ │ │ ├── hlm-select-scroll-down.component.ts.template │ │ │ │ │ │ │ ├── hlm-select-scroll-up.component.ts.template │ │ │ │ │ │ │ ├── hlm-select-trigger.component.ts.template │ │ │ │ │ │ │ ├── hlm-select-value.directive.ts.template │ │ │ │ │ │ │ └── hlm-select.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-separator-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-separator.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-sheet-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-sheet-close.directive.ts.template │ │ │ │ │ │ │ ├── hlm-sheet-content.component.ts.template │ │ │ │ │ │ │ ├── hlm-sheet-description.directive.ts.template │ │ │ │ │ │ │ ├── hlm-sheet-footer.component.ts.template │ │ │ │ │ │ │ ├── hlm-sheet-header.component.ts.template │ │ │ │ │ │ │ ├── hlm-sheet-overlay.directive.ts.template │ │ │ │ │ │ │ ├── hlm-sheet-title.directive.ts.template │ │ │ │ │ │ │ └── hlm-sheet.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-skeleton-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-skeleton.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-slider-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-slider.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-sonner-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-toaster.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-spinner-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-spinner.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-switch-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-switch-thumb.directive.ts.template │ │ │ │ │ │ │ └── hlm-switch.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-table-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-caption.component.ts.template │ │ │ │ │ │ │ ├── hlm-table.component.ts.template │ │ │ │ │ │ │ ├── hlm-table.directive.ts.template │ │ │ │ │ │ │ ├── hlm-td.component.ts.template │ │ │ │ │ │ │ ├── hlm-th.component.ts.template │ │ │ │ │ │ │ └── hlm-trow.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-tabs-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-tabs-content.directive.ts.template │ │ │ │ │ │ │ ├── hlm-tabs-list.component.ts.template │ │ │ │ │ │ │ ├── hlm-tabs-paginated-list.component.ts.template │ │ │ │ │ │ │ ├── hlm-tabs-trigger.directive.ts.template │ │ │ │ │ │ │ └── hlm-tabs.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-toggle-group-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-toggle-group.directive.ts.template │ │ │ │ │ │ │ ├── hlm-toggle-group.token.ts.template │ │ │ │ │ │ │ └── hlm-toggle-item.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-toggle-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ └── hlm-toggle.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── ui-tooltip-helm │ │ │ │ │ ├── files │ │ │ │ │ │ ├── index.ts.template │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ ├── hlm-tooltip-trigger.directive.ts.template │ │ │ │ │ │ │ └── hlm-tooltip.component.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ └── ui-typography-helm │ │ │ │ │ ├── files │ │ │ │ │ ├── index.ts.template │ │ │ │ │ └── lib │ │ │ │ │ │ ├── hlm-blockquote.directive.ts.template │ │ │ │ │ │ ├── hlm-code.directive.ts.template │ │ │ │ │ │ ├── hlm-h1.directive.ts.template │ │ │ │ │ │ ├── hlm-h2.directive.ts.template │ │ │ │ │ │ ├── hlm-h3.directive.ts.template │ │ │ │ │ │ ├── hlm-h4.directive.ts.template │ │ │ │ │ │ ├── hlm-large.directive.ts.template │ │ │ │ │ │ ├── hlm-lead.directive.ts.template │ │ │ │ │ │ ├── hlm-muted.directive.ts.template │ │ │ │ │ │ ├── hlm-p.directive.ts.template │ │ │ │ │ │ ├── hlm-small.directive.ts.template │ │ │ │ │ │ └── hlm-ul.directive.ts.template │ │ │ │ │ └── generator.ts │ │ │ │ ├── primitive-deps.ts │ │ │ │ ├── primitives.ts │ │ │ │ ├── schema.d.ts │ │ │ │ ├── schema.json │ │ │ │ └── supported-ui-libraries.json │ │ ├── index.ts │ │ └── utils │ │ │ ├── config.ts │ │ │ ├── get-project-names.ts │ │ │ ├── hlm-class.ts │ │ │ ├── tsconfig.ts │ │ │ ├── version-utils.ts │ │ │ └── visit-files.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── helm │ ├── README.md │ ├── accordion │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── alert-dialog │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-alert-dialog-action-button.directive.ts │ │ │ ├── hlm-alert-dialog-cancel-button.directive.ts │ │ │ ├── hlm-alert-dialog-content.component.ts │ │ │ ├── hlm-alert-dialog-description.directive.ts │ │ │ ├── hlm-alert-dialog-footer.component.ts │ │ │ ├── hlm-alert-dialog-header.component.ts │ │ │ ├── hlm-alert-dialog-overlay.directive.ts │ │ │ ├── hlm-alert-dialog-title.directive.ts │ │ │ └── hlm-alert-dialog.component.ts │ ├── alert │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-alert-description.directive.ts │ │ │ ├── hlm-alert-icon.directive.ts │ │ │ ├── hlm-alert-title.directive.ts │ │ │ └── hlm-alert.directive.ts │ ├── aspect-ratio │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── helm-aspect-ratio.directive.spec.ts │ │ │ └── helm-aspect-ratio.directive.ts │ ├── avatar │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── badge │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-badge.directive.ts │ ├── breadcrumb │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-breadcrumb-ellipsis.component.ts │ │ │ ├── hlm-breadcrumb-item.directive.ts │ │ │ ├── hlm-breadcrumb-link.directive.ts │ │ │ ├── hlm-breadcrumb-list.directive.ts │ │ │ ├── hlm-breadcrumb-page.directive.ts │ │ │ ├── hlm-breadcrumb-separator.component.ts │ │ │ └── hlm-breadcrumb.directive.ts │ ├── button │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-button.directive.ts │ │ │ └── hlm-button.token.ts │ ├── calendar │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-calendar-multi.component.ts │ │ │ └── hlm-calendar.component.ts │ ├── card │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── carousel │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-carousel-content.component.ts │ │ │ ├── hlm-carousel-item.component.ts │ │ │ ├── hlm-carousel-next.component.ts │ │ │ ├── hlm-carousel-previous.component.ts │ │ │ ├── hlm-carousel-slide-display.component.ts │ │ │ └── hlm-carousel.component.ts │ ├── checkbox │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-checkbox.component.ts │ ├── command │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-command-dialog-close-button.directive.ts │ │ │ ├── hlm-command-dialog.directive.ts │ │ │ ├── hlm-command-empty.directive.ts │ │ │ ├── hlm-command-group-label.component.ts │ │ │ ├── hlm-command-group.component.ts │ │ │ ├── hlm-command-icon.directive.ts │ │ │ ├── hlm-command-item.component.ts │ │ │ ├── hlm-command-list.component.ts │ │ │ ├── hlm-command-search-input.component.ts │ │ │ ├── hlm-command-search.component.ts │ │ │ ├── hlm-command-separator.component.ts │ │ │ ├── hlm-command-shortcut.component.ts │ │ │ └── hlm-command.component.ts │ ├── date-picker │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-date-picker-multi.component.ts │ │ │ ├── hlm-date-picker-multi.token.ts │ │ │ ├── hlm-date-picker.component.ts │ │ │ └── hlm-date-picker.token.ts │ ├── dialog │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── eslint.config.cjs │ ├── form-field │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── form-field.spec.ts │ │ │ ├── hlm-error.directive.ts │ │ │ ├── hlm-form-field.component.ts │ │ │ └── hlm-hint.directive.ts │ ├── hover-card │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-hover-card-content.component.ts │ ├── icon │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-icon.directive.spec.ts │ │ │ ├── hlm-icon.directive.ts │ │ │ └── hlm-icon.token.ts │ ├── input-otp │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── input │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-input-error.directive.ts │ │ │ └── hlm-input.directive.ts │ ├── jest.config.ts │ ├── label │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-label.directive.ts │ ├── menu │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── ng-package.json │ ├── package.json │ ├── pagination │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-numbered-pagination.component.ts │ │ │ ├── hlm-pagination-content.directive.ts │ │ │ ├── hlm-pagination-ellipsis.component.ts │ │ │ ├── hlm-pagination-item.directive.ts │ │ │ ├── hlm-pagination-link.directive.ts │ │ │ ├── hlm-pagination-next.component.ts │ │ │ ├── hlm-pagination-previous.component.ts │ │ │ └── hlm-pagination.directive.ts │ ├── popover │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-popover-close.directive.ts │ │ │ └── hlm-popover-content.directive.ts │ ├── progress │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-progress-indicator.directive.ts │ │ │ └── hlm-progress.directive.ts │ ├── project.json │ ├── radio-group │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-radio-group.component.ts │ │ │ ├── hlm-radio-indicator.component.ts │ │ │ └── hlm-radio.component.ts │ ├── scroll-area │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-scroll-area.directive.ts │ ├── select │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── separator │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-separator.directive.ts │ ├── sheet │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-sheet-close.directive.ts │ │ │ ├── hlm-sheet-content.component.ts │ │ │ ├── hlm-sheet-description.directive.ts │ │ │ ├── hlm-sheet-footer.component.ts │ │ │ ├── hlm-sheet-header.component.ts │ │ │ ├── hlm-sheet-overlay.directive.ts │ │ │ ├── hlm-sheet-title.directive.ts │ │ │ └── hlm-sheet.component.ts │ ├── skeleton │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-skeleton.component.ts │ ├── slider │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-slider.component.ts │ ├── sonner │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-toaster.component.ts │ ├── spinner │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-spinner.component.ts │ ├── src │ │ ├── index.ts │ │ └── test-setup.ts │ ├── switch │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-switch-thumb.directive.ts │ │ │ └── hlm-switch.component.ts │ ├── table │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── tabs │ │ ├── README.md │ │ ├── ng-package.json │ │ └── 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 │ ├── toggle-group │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-toggle-group.directive.ts │ │ │ ├── hlm-toggle-group.token.ts │ │ │ └── hlm-toggle-item.directive.ts │ ├── toggle │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ └── hlm-toggle.directive.ts │ ├── tooltip │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ ├── hlm-tooltip-trigger.directive.ts │ │ │ └── hlm-tooltip.component.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ ├── tsconfig.spec.json │ └── typography │ │ ├── README.md │ │ ├── ng-package.json │ │ └── src │ │ ├── index.ts │ │ └── lib │ │ ├── hlm-blockquote.directive.ts │ │ ├── hlm-code.directive.ts │ │ ├── hlm-h1.directive.ts │ │ ├── hlm-h2.directive.ts │ │ ├── hlm-h3.directive.ts │ │ ├── hlm-h4.directive.ts │ │ ├── hlm-large.directive.ts │ │ ├── hlm-lead.directive.ts │ │ ├── hlm-muted.directive.ts │ │ ├── hlm-p.directive.ts │ │ ├── hlm-small.directive.ts │ │ └── hlm-ul.directive.ts ├── tools │ ├── README.md │ ├── eslint.config.cjs │ ├── executors.json │ ├── generators.json │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── executors │ │ │ ├── docs │ │ │ │ └── generate-ui-docs │ │ │ │ │ ├── executor.spec.ts │ │ │ │ │ ├── executor.ts │ │ │ │ │ ├── schema.d.ts │ │ │ │ │ └── schema.json │ │ │ └── release │ │ │ │ ├── build-update-publish │ │ │ │ ├── executor.spec.ts │ │ │ │ ├── executor.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ │ ├── helpers │ │ │ │ ├── projects.helpers.spec.ts │ │ │ │ └── projects.helpers.ts │ │ │ │ └── npm-publish │ │ │ │ ├── executor.spec.ts │ │ │ │ ├── executor.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ ├── generators │ │ │ ├── auto-increment-version │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ └── schema.json │ │ │ ├── brain-secondary-entrypoint │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── helm-component │ │ │ │ ├── files │ │ │ │ │ └── hlm-__fileName__.component.ts.template │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── helm-directive │ │ │ │ ├── files │ │ │ │ │ └── hlm-__fileName__.directive.ts.template │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── helm-documentation │ │ │ │ ├── files │ │ │ │ │ └── (__fileName__) │ │ │ │ │ │ ├── __fileName__.page.ts.template │ │ │ │ │ │ └── __fileName__.preview.ts.template │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── helm-secondary-entrypoint │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── helm-story │ │ │ │ ├── files │ │ │ │ │ └── __fileName__.stories.ts.template │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── hlm-to-cli-generator │ │ │ │ ├── files │ │ │ │ │ └── generator.ts.template │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── lib │ │ │ │ │ ├── add-primitive-to-supported-ui-libraries.ts │ │ │ │ │ └── file-management.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ ├── replace-cli-version │ │ │ │ ├── generator.ts │ │ │ │ └── schema.json │ │ │ ├── replace-ui-version │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ └── schema.json │ │ │ └── utils │ │ │ │ └── ast.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json └── trpc │ ├── README.md │ ├── eslint.config.cjs │ ├── migrations │ └── migration.json │ ├── ng-package.json │ ├── package.json │ ├── project.json │ ├── src │ ├── index.ts │ ├── lib │ │ ├── client │ │ │ ├── cache-state.ts │ │ │ ├── client.ts │ │ │ ├── links │ │ │ │ └── transfer-state-link.ts │ │ │ ├── shared-internal.ts │ │ │ └── trpc-rxjs-proxy.ts │ │ ├── server │ │ │ └── server.ts │ │ └── utils │ │ │ └── wait-for.ts │ └── test-setup.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ └── vite.config.ts ├── nx.json ├── package.json ├── pnpm-lock.yaml ├── project.json ├── release.config.mjs ├── spartan.svg ├── tools ├── eslint-rules │ ├── index.ts │ ├── jest.config.ts │ ├── project.json │ ├── rules │ │ ├── prefer-rxjs-operator-compat.ts │ │ └── prefer-signals.ts │ ├── tsconfig.json │ ├── tsconfig.lint.json │ └── tsconfig.spec.json ├── scripts │ └── drizzle-migrate.config.ts └── tsconfig.tools.json ├── tsconfig.base.json ├── zerops-import-example.yml └── zerops.yml /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = tab 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.githooks/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | pnpx commitlint -e 4 | -------------------------------------------------------------------------------- /.githooks/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | pnpm nx format:write 4 | -------------------------------------------------------------------------------- /.githooks/pre-push: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | pnpm nx affected -t lint --parallel 4 | pnpm nx format:check 5 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 22.9.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Add files here to ignore them from prettier formatting 2 | /dist 3 | /coverage 4 | .angular 5 | .prettierignore 6 | .vercel 7 | /tmp 8 | /node_modules 9 | /stats.html 10 | pnpm-lock.yaml 11 | 12 | /.nx/cache 13 | 14 | /.nx/workspace-data 15 | 16 | *.css 17 | -------------------------------------------------------------------------------- /.prettierrc.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | printWidth: 120, 3 | singleQuote: true, 4 | useTabs: true, 5 | bracketSpacing: true, 6 | htmlWhitespaceSensitivity: 'ignore', 7 | plugins: ['prettier-plugin-organize-imports', 'prettier-plugin-packagejson', 'prettier-plugin-tailwindcss'], 8 | }; 9 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "nrwl.angular-console", 4 | "esbenp.prettier-vscode", 5 | "firsttris.vscode-jest-runner", 6 | "dbaeumer.vscode-eslint" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /apps/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/apps/.gitkeep -------------------------------------------------------------------------------- /apps/app/drizzle.config.ts: -------------------------------------------------------------------------------- 1 | // drizzle.config.ts 2 | import { defineConfig } from 'drizzle-kit'; 3 | 4 | export default defineConfig({ 5 | out: './apps/app/drizzle', 6 | dialect: 'postgresql', 7 | schema: './apps/app/src/db.ts', 8 | 9 | dbCredentials: { 10 | url: `${process.env['DATABASE_URL']}`, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /apps/app/drizzle/0000_melted_weapon_omega.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS "note" ( 2 | "id" serial PRIMARY KEY NOT NULL, 3 | "title" text NOT NULL, 4 | "content" text, 5 | "created_at" timestamp DEFAULT now() NOT NULL 6 | ); 7 | -------------------------------------------------------------------------------- /apps/app/drizzle/meta/_journal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "7", 3 | "dialect": "postgresql", 4 | "entries": [ 5 | { 6 | "idx": 0, 7 | "version": "7", 8 | "when": 1733318438843, 9 | "tag": "0000_melted_weapon_omega", 10 | "breakpoints": true 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@spartan-ng/app", 3 | "type": "module" 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | const { join } = require('node:path'); 2 | 3 | module.exports = { 4 | plugins: { 5 | tailwindcss: { 6 | config: join(__dirname, 'tailwind.config.cjs'), 7 | }, 8 | autoprefixer: {}, 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /apps/app/src/app.config.server.ts: -------------------------------------------------------------------------------- 1 | import { type ApplicationConfig, mergeApplicationConfig } from '@angular/core'; 2 | import { provideClientHydration } from '@angular/platform-browser'; 3 | import { provideServerRendering } from '@angular/platform-server'; 4 | import { appConfig } from './app.config'; 5 | 6 | const serverConfig: ApplicationConfig = { 7 | providers: [provideServerRendering(), provideClientHydration()], 8 | }; 9 | 10 | export const config = mergeApplicationConfig(appConfig, serverConfig); 11 | -------------------------------------------------------------------------------- /apps/app/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async () => { 7 | await TestBed.configureTestingModule({ 8 | imports: [RouterTestingModule, AppComponent], 9 | }).compileComponents(); 10 | }); 11 | 12 | it('should create the app', () => { 13 | const fixture = TestBed.createComponent(AppComponent); 14 | const app = fixture.componentInstance; 15 | expect(app).toBeTruthy(); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(components)/components.server.ts: -------------------------------------------------------------------------------- 1 | import { PageServerLoad } from '@analogjs/router'; 2 | 3 | export const load = async ({ fetch }: PageServerLoad) => { 4 | return await fetch('/api/primitive-api'); 5 | }; 6 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(components)/components/index.page.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from '@analogjs/router'; 2 | 3 | export const routeMeta: RouteMeta = { 4 | redirectTo: '/components/accordion', 5 | pathMatch: 'full', 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(components)/components/installation-cs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'spartan-installation-cs', 5 | standalone: true, 6 | host: { 7 | class: 'p-20 flex items-center justify-center ', 8 | }, 9 | template: ` 10 | Coming soon... 11 | `, 12 | }) 13 | export class InstallationCsComponent {} 14 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(documentation)/documentation.page.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from '@analogjs/router'; 2 | import { Component } from '@angular/core'; 3 | import { PageComponent } from '@spartan-ng/app/app/shared/layout/page.component'; 4 | 5 | export const routeMeta: RouteMeta = { 6 | data: { 7 | breadcrumb: 'Docs', 8 | }, 9 | }; 10 | @Component({ 11 | selector: 'spartan-documentation', 12 | imports: [PageComponent], 13 | template: ` 14 | 15 | `, 16 | }) 17 | export default class ExamplesPageComponent {} 18 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(documentation)/documentation/index.page.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from '@analogjs/router'; 2 | 3 | export const routeMeta: RouteMeta = { 4 | redirectTo: '/documentation/introduction', 5 | pathMatch: 'full', 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(examples)/examples/index.page.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from '@analogjs/router'; 2 | 3 | export const routeMeta: RouteMeta = { 4 | redirectTo: '/examples/notes', 5 | pathMatch: 'full', 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/(stack)/stack/index.page.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from '@analogjs/router'; 2 | 3 | export const routeMeta: RouteMeta = { 4 | redirectTo: '/stack/overview', 5 | pathMatch: 'full', 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/src/app/pages/alpha.page.ts: -------------------------------------------------------------------------------- 1 | import type { RouteMeta } from '@analogjs/router'; 2 | 3 | export const routeMeta: RouteMeta = { 4 | redirectTo: '/documentation/changelog#initial-alpha', 5 | pathMatch: 'full', 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/cli-mode.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, signal } from '@angular/core'; 2 | 3 | export type CLIMode = 'cli' | 'nx'; 4 | 5 | @Injectable({ 6 | providedIn: 'root', 7 | }) 8 | export class CLIModeService { 9 | private readonly _cliMode = signal('nx'); 10 | 11 | public setCliMode(value: CLIMode): void { 12 | this._cliMode.set(value); 13 | } 14 | 15 | public cliMode = this._cliMode.asReadonly(); 16 | } 17 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/code/code-preview.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[spartanCodePreview]', 5 | standalone: true, 6 | host: { 7 | class: 'preview flex min-h-[350px] w-full justify-center p-10 items-center', 8 | }, 9 | }) 10 | export class CodePreviewDirective {} 11 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/coming-soon.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { hlmMuted } from '@spartan-ng/helm/typography'; 3 | 4 | @Component({ 5 | selector: 'spartan-coming-soon', 6 | standalone: true, 7 | host: { 8 | class: 'justify-center relative flex-1 flex items-center mb-8', 9 | }, 10 | template: ` 11 |

Coming soon...

12 | `, 13 | }) 14 | export class ComingSoonComponent {} 15 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/container.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[spartanContainer]', 5 | standalone: true, 6 | host: { 7 | class: 8 | 'w-full mx-auto px-4 sm:px-8 flex flex-1 items-start md:grid md:grid-cols-[220px_minmax(0,1fr)] lg:grid-cols-[240px_minmax(0,1fr)] md:gap-6 lg:gap-10', 9 | }, 10 | }) 11 | export class ContainerDirective {} 12 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/main-section.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[spartanMainSection]', 5 | standalone: true, 6 | host: { 7 | class: 'flex flex-col p-1 sm:p-0 w-full min-h-[calc(100vh-3.5rem)]', 8 | }, 9 | }) 10 | export class MainSectionDirective {} 11 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/page-bottom-nav-placeholder.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'spartan-page-bottom-nav-placeholder', 5 | standalone: true, 6 | template: '', 7 | }) 8 | export class PageBottomNavPlaceholderComponent {} 9 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/page-bottom-nav/page-bottom-nav.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'spartan-page-bottom-nav', 5 | standalone: true, 6 | host: { 7 | class: 'mt-12 flex flex-row-reverse items-center justify-between', 8 | }, 9 | template: ` 10 | 11 | `, 12 | }) 13 | export class PageBottomNavComponent {} 14 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/section-intro.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { hlmLead } from '@spartan-ng/helm/typography'; 3 | 4 | @Component({ 5 | selector: 'spartan-section-intro', 6 | standalone: true, 7 | host: { 8 | class: 'mb-8 block space-y-2', 9 | }, 10 | template: ` 11 |

{{ name }}

12 |

{{ lead }}

13 | `, 14 | }) 15 | export class SectionIntroComponent { 16 | @Input() 17 | public name = ''; 18 | @Input() 19 | public lead = ''; 20 | } 21 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/side-nav/side-nav-coming-soon.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'spartan-side-nav-cs', 5 | host: { 6 | class: 'inline-block', 7 | }, 8 | template: ` 9 | soon 10 | `, 11 | }) 12 | export class SideNavComponent {} 13 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/side-nav/side-nav-heading.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[spartanSideNavHeading]', 5 | standalone: true, 6 | host: { 7 | class: 'flex items-center justify-between mb-1 rounded-md px-2 py-1 font-semibold', 8 | }, 9 | }) 10 | export class SideNavHeadingDirective {} 11 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/layout/side-nav/side-nav-links.directive.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'spartan-side-nav-links', 5 | standalone: true, 6 | host: { 7 | tabindex: '-1', 8 | class: 'grid grid-flow-row auto-rows-max', 9 | }, 10 | template: '', 11 | }) 12 | export class SideNavLinksComponent {} 13 | -------------------------------------------------------------------------------- /apps/app/src/app/shared/typography/link.ts: -------------------------------------------------------------------------------- 1 | export const link = 'h-6 underline text-base px-0.5'; 2 | -------------------------------------------------------------------------------- /apps/app/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import 'zone.js'; 3 | 4 | import { appConfig } from './app.config'; 5 | import { AppComponent } from './app/app.component'; 6 | 7 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); 8 | -------------------------------------------------------------------------------- /apps/app/src/public/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/apps/app/src/public/assets/.gitkeep -------------------------------------------------------------------------------- /apps/app/src/public/assets/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/apps/app/src/public/assets/avatar.png -------------------------------------------------------------------------------- /apps/app/src/public/assets/mountains.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/apps/app/src/public/assets/mountains.jpg -------------------------------------------------------------------------------- /apps/app/src/public/assets/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/apps/app/src/public/assets/og-image.png -------------------------------------------------------------------------------- /apps/app/src/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | 4 | sitemap: http://localhost:4200/sitemap.xml 5 | -------------------------------------------------------------------------------- /apps/app/src/server/routes/primitive-api.get.ts: -------------------------------------------------------------------------------- 1 | import { defineEventHandler } from 'h3'; 2 | import docsData from '../../public/data/ui-api.json'; 3 | 4 | export default defineEventHandler(() => { 5 | return docsData; 6 | }); 7 | -------------------------------------------------------------------------------- /apps/app/src/server/routes/trpc/[trpc].ts: -------------------------------------------------------------------------------- 1 | import { createTrpcNitroHandler } from '@spartan-ng/trpc'; 2 | import { createContext } from '../../trpc/context'; 3 | import { appRouter } from '../../trpc/routers'; 4 | // export API handler 5 | export default createTrpcNitroHandler({ 6 | router: appRouter, 7 | createContext, 8 | }); 9 | -------------------------------------------------------------------------------- /apps/app/src/server/trpc/context.ts: -------------------------------------------------------------------------------- 1 | import type { inferAsyncReturnType } from '@trpc/server'; 2 | /** 3 | * Creates context for an incoming request 4 | * @link https://trpc.io/docs/context 5 | */ 6 | export const createContext = () => ({}); 7 | export type Context = inferAsyncReturnType; 8 | -------------------------------------------------------------------------------- /apps/app/src/server/trpc/routers/index.ts: -------------------------------------------------------------------------------- 1 | import { router } from '../trpc'; 2 | import { noteRouter } from './notes'; 3 | 4 | export const appRouter = router({ 5 | note: noteRouter, 6 | }); 7 | // export type definition of API 8 | export type AppRouter = typeof appRouter; 9 | -------------------------------------------------------------------------------- /apps/app/src/server/trpc/trpc.ts: -------------------------------------------------------------------------------- 1 | import { initTRPC } from '@trpc/server'; 2 | import superjson from 'superjson'; 3 | import type { Context } from './context'; 4 | 5 | const t = initTRPC.context().create({ 6 | transformer: superjson, 7 | }); 8 | /** 9 | * Unprotected procedure 10 | **/ 11 | export const publicProcedure = t.procedure; 12 | export const router = t.router; 13 | export const middleware = t.middleware; 14 | -------------------------------------------------------------------------------- /apps/app/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@analogjs/vite-plugin-angular/setup-vitest'; 2 | 3 | import { getTestBed } from '@angular/core/testing'; 4 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; 5 | 6 | getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); 7 | -------------------------------------------------------------------------------- /apps/app/src/trpc-client.ts: -------------------------------------------------------------------------------- 1 | import { inject } from '@angular/core'; 2 | import { createTrpcClient } from '@spartan-ng/trpc'; 3 | import superjson from 'superjson'; 4 | import type { AppRouter } from './server/trpc/routers'; 5 | 6 | export const { provideTrpcClient, tRPCClient } = createTrpcClient({ 7 | url: '/api/trpc', 8 | options: { 9 | transformer: superjson, 10 | }, 11 | }); 12 | 13 | export function injectTRPCClient() { 14 | return inject(tRPCClient); 15 | } 16 | -------------------------------------------------------------------------------- /apps/app/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /apps/app/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); 2 | const { join } = require('node:path'); 3 | 4 | /** @type {import('tailwindcss').Config} */ 5 | module.exports = { 6 | darkMode: 'class', 7 | presets: [require('../../libs/brain/hlm-tailwind-preset.js')], 8 | content: [ 9 | join(__dirname, 'index.html'), 10 | join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), 11 | ...createGlobPatternsForDependencies(__dirname), 12 | ], 13 | }; 14 | -------------------------------------------------------------------------------- /apps/app/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": ["node"], 6 | "target": "ES2022", 7 | "useDefineForClassFields": false, 8 | "resolveJsonModule": true 9 | }, 10 | "files": ["src/main.ts", "src/main.server.ts"], 11 | "include": ["src/**/*.d.ts", "src/app/routes/**/*.ts", "src/app/pages/**/*.page.ts"], 12 | "exclude": ["**/*.test.ts", "**/*.spec.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["node", "vitest/globals"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": ["node", "vitest/globals"] 6 | }, 7 | "files": ["src/test-setup.ts"], 8 | "include": ["src/**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /apps/trpc-app-e2e/eslint.config.cjs: -------------------------------------------------------------------------------- 1 | const cypress = require('eslint-plugin-cypress/flat'); 2 | const baseConfig = require('../../eslint.config.cjs'); 3 | 4 | module.exports = [ 5 | cypress.configs['recommended'], 6 | ...baseConfig, 7 | { 8 | files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], 9 | rules: { 10 | '@angular-eslint/prefer-output-readonly': 'off', 11 | '@angular-eslint/prefer-on-push-component-change-detection': 'off', 12 | }, 13 | }, 14 | ]; 15 | -------------------------------------------------------------------------------- /apps/trpc-app-e2e/tests/fixtures/notes.ts: -------------------------------------------------------------------------------- 1 | type Note = { 2 | note: string; 3 | }; 4 | 5 | export const notes: Record<'first', Note> = { 6 | first: { 7 | note: 'I am the first note', 8 | }, 9 | } as const; 10 | -------------------------------------------------------------------------------- /apps/trpc-app-e2e/vite.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { defineConfig } from 'vite'; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig(({ mode }) => { 7 | return { 8 | root: __dirname, 9 | test: { 10 | globals: true, 11 | environment: 'node', 12 | include: ['**/*.spec.ts'], 13 | cache: { 14 | dir: '../../node_modules/.vitest', 15 | }, 16 | }, 17 | define: { 18 | 'import.meta.vitest': mode !== 'production', 19 | }, 20 | }; 21 | }); 22 | -------------------------------------------------------------------------------- /apps/ui-storybook-e2e/cypress.config.cjs: -------------------------------------------------------------------------------- 1 | const { nxE2EStorybookPreset } = require('@nx/storybook/presets/cypress'); 2 | const { defineConfig } = require('cypress'); 3 | 4 | module.exports = defineConfig({ 5 | e2e: { 6 | ...nxE2EStorybookPreset(__dirname), 7 | // Please ensure you use `cy.origin()` when navigating between domains and remove this option. 8 | // See https://docs.cypress.io/app/references/migration-guide#Changes-to-cyorigin 9 | injectDocumentDomain: true, 10 | experimentalRunAllSpecs: true, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /apps/ui-storybook-e2e/eslint.config.cjs: -------------------------------------------------------------------------------- 1 | const cypress = require('eslint-plugin-cypress/flat'); 2 | const baseConfig = require('../../eslint.config.cjs'); 3 | 4 | module.exports = [ 5 | cypress.configs['recommended'], 6 | 7 | ...baseConfig, 8 | { 9 | // Override or add rules here 10 | files: ['**/*.ts'], 11 | rules: { 12 | '@angular-eslint/prefer-output-readonly': 'off', 13 | '@angular-eslint/prefer-on-push-component-change-detection': 'off', 14 | }, 15 | }, 16 | ]; 17 | -------------------------------------------------------------------------------- /apps/ui-storybook-e2e/src/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /apps/ui-storybook-e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "sourceMap": false, 5 | "outDir": "../../dist/out-tsc", 6 | "allowJs": true, 7 | "types": ["cypress", "node", "@testing-library/cypress", "cypress-real-events"] 8 | }, 9 | "include": ["src/**/*.ts", "src/**/*.js", "cypress.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/ui-storybook/.storybook/preview.js: -------------------------------------------------------------------------------- 1 | import { withThemeByClassName } from '@storybook/addon-themes'; 2 | 3 | export const decorators = [ 4 | withThemeByClassName({ 5 | themes: { 6 | light: 'light', 7 | dark: 'dark', 8 | }, 9 | defaultTheme: 'light', 10 | }), 11 | ]; 12 | 13 | const preview = { 14 | decorators, 15 | 16 | parameters: { 17 | options: { 18 | storySort: { 19 | method: 'alphabetical', 20 | }, 21 | }, 22 | }, 23 | 24 | tags: ['autodocs'], 25 | }; 26 | 27 | export default preview; 28 | -------------------------------------------------------------------------------- /apps/ui-storybook/.storybook/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "emitDecoratorMetadata": true 5 | }, 6 | 7 | "exclude": ["../**/*.spec.ts"], 8 | "include": [ 9 | "../**/*.stories.ts", 10 | "../**/*.stories.js", 11 | "../**/*.stories.jsx", 12 | "../**/*.stories.tsx", 13 | "../**/*.stories.mdx", 14 | "*.js" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /apps/ui-storybook/README.md: -------------------------------------------------------------------------------- 1 | # ui-storybook 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running Storybook 6 | 7 | Run `nx storybook ui-storybook` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /apps/ui-storybook/postcss.config.js: -------------------------------------------------------------------------------- 1 | const { join } = require('node:path'); 2 | 3 | module.exports = { 4 | plugins: { 5 | tailwindcss: { 6 | config: join(__dirname, 'tailwind.config.js'), 7 | }, 8 | autoprefixer: {}, 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /apps/ui-storybook/public/mountains.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/apps/ui-storybook/public/mountains.jpg -------------------------------------------------------------------------------- /apps/ui-storybook/src/index.ts: -------------------------------------------------------------------------------- 1 | // placeholder as this project is simply a wrapper for 2 | // running storybook for all ui primitives 3 | 4 | console.log('I should not be an empty file!'); 5 | -------------------------------------------------------------------------------- /apps/ui-storybook/tailwind.config.js: -------------------------------------------------------------------------------- 1 | const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); 2 | const { join } = require('node:path'); 3 | 4 | /** @type {import('tailwindcss').Config} */ 5 | module.exports = { 6 | darkMode: ['class', '[data-mode="dark"]'], 7 | presets: [require('../../libs/brain/hlm-tailwind-preset.js')], 8 | content: [join(__dirname, '../**/!(*.spec).{ts,html}'), ...createGlobPatternsForDependencies(__dirname)], 9 | theme: { 10 | extend: {}, 11 | }, 12 | plugins: [], 13 | }; 14 | -------------------------------------------------------------------------------- /apps/ui-storybook/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "declarationMap": true, 7 | "inlineSources": true, 8 | "types": [] 9 | }, 10 | "exclude": [ 11 | "src/**/*.spec.ts", 12 | "src/test-setup.ts", 13 | "jest.config.ts", 14 | "src/**/*.test.ts", 15 | "**/*.stories.ts", 16 | "**/*.stories.js" 17 | ], 18 | "include": ["**/*.ts"] 19 | } 20 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | import { getJestProjectsAsync } from '@nx/jest'; 2 | 3 | export default async () => ({ 4 | projects: await getJestProjectsAsync(), 5 | }); 6 | -------------------------------------------------------------------------------- /jest.preset.cjs: -------------------------------------------------------------------------------- 1 | const nxPreset = require('@nx/jest/preset').default; 2 | 3 | module.exports = { ...nxPreset }; 4 | -------------------------------------------------------------------------------- /libs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spartan-ng/spartan/96aa303eef52309cdbd957bb21d178b37b76319d/libs/.gitkeep -------------------------------------------------------------------------------- /libs/brain/README.md: -------------------------------------------------------------------------------- 1 | # brain 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test brain` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/brain/accordion/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/accordion 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/accordion`. 4 | -------------------------------------------------------------------------------- /libs/brain/accordion/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/alert-dialog/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/alert-dialog 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/alert-dialog`. 4 | -------------------------------------------------------------------------------- /libs/brain/alert-dialog/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/alert-dialog/src/lib/brn-alert-dialog-content.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { provideExposesStateProviderExisting } from '@spartan-ng/brain/core'; 3 | import { BrnDialogContentDirective } from '@spartan-ng/brain/dialog'; 4 | 5 | @Directive({ 6 | selector: '[brnAlertDialogContent]', 7 | standalone: true, 8 | providers: [provideExposesStateProviderExisting(() => BrnAlertDialogContentDirective)], 9 | }) 10 | export class BrnAlertDialogContentDirective extends BrnDialogContentDirective {} 11 | -------------------------------------------------------------------------------- /libs/brain/alert-dialog/src/lib/brn-alert-dialog-description.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { BrnDialogDescriptionDirective } from '@spartan-ng/brain/dialog'; 3 | 4 | @Directive({ 5 | selector: '[brnAlertDialogDescription]', 6 | standalone: true, 7 | host: { 8 | '[id]': '_id()', 9 | }, 10 | }) 11 | export class BrnAlertDialogDescriptionDirective extends BrnDialogDescriptionDirective {} 12 | -------------------------------------------------------------------------------- /libs/brain/alert-dialog/src/lib/brn-alert-dialog-title.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { BrnDialogTitleDirective } from '@spartan-ng/brain/dialog'; 3 | 4 | @Directive({ 5 | selector: '[brnAlertDialogTitle]', 6 | standalone: true, 7 | host: { 8 | '[id]': '_id()', 9 | }, 10 | }) 11 | export class BrnAlertDialogTitleDirective extends BrnDialogTitleDirective {} 12 | -------------------------------------------------------------------------------- /libs/brain/avatar/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/avatar 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/avatar`. 4 | -------------------------------------------------------------------------------- /libs/brain/avatar/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/avatar/src/lib/fallback/index.ts: -------------------------------------------------------------------------------- 1 | export * from './brn-avatar-fallback.directive'; 2 | -------------------------------------------------------------------------------- /libs/brain/avatar/src/lib/image/brn-avatar-image.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, HostListener, computed, signal } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: 'img[brnAvatarImage]', 5 | standalone: true, 6 | exportAs: 'avatarImage', 7 | }) 8 | export class BrnAvatarImageDirective { 9 | private readonly _loaded = signal(false); 10 | 11 | @HostListener('error') 12 | private onError() { 13 | this._loaded.set(false); 14 | } 15 | 16 | @HostListener('load') 17 | private onLoad() { 18 | this._loaded.set(true); 19 | } 20 | 21 | public canShow = computed(() => this._loaded()); 22 | } 23 | -------------------------------------------------------------------------------- /libs/brain/avatar/src/lib/image/index.ts: -------------------------------------------------------------------------------- 1 | export * from './brn-avatar-image.directive'; 2 | -------------------------------------------------------------------------------- /libs/brain/avatar/src/lib/util/index.ts: -------------------------------------------------------------------------------- 1 | export * from './hex-color-for'; 2 | export * from './initials.pipe'; 3 | export * from './is-bright'; 4 | -------------------------------------------------------------------------------- /libs/brain/avatar/src/lib/util/is-bright.ts: -------------------------------------------------------------------------------- 1 | const isShortHand = (hex: string) => hex.length === 3; 2 | 3 | const cleanup = (hex: string) => { 4 | const noHash = hex.replace('#', '').trim().toLowerCase(); 5 | 6 | if (!isShortHand(noHash)) return noHash; 7 | 8 | return noHash 9 | .split('') 10 | .map((char) => char + char) 11 | .join(''); 12 | }; 13 | 14 | export const isBright = (hex: string) => Number.parseInt(cleanup(hex), 16) > 0xffffff / 1.25; 15 | -------------------------------------------------------------------------------- /libs/brain/calendar/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/calendar 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/calendar`. 4 | -------------------------------------------------------------------------------- /libs/brain/calendar/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/calendar/src/lib/brn-calendar-cell.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[brnCalendarCell]', 5 | standalone: true, 6 | host: { 7 | role: 'presentation', 8 | }, 9 | }) 10 | export class BrnCalendarCellDirective {} 11 | -------------------------------------------------------------------------------- /libs/brain/calendar/src/lib/brn-calendar-grid.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { injectBrnCalendar } from './brn-calendar.token'; 3 | 4 | @Directive({ 5 | selector: '[brnCalendarGrid]', 6 | standalone: true, 7 | host: { 8 | role: 'grid', 9 | '[attr.aria-labelledby]': 'calendar.header()?.id()', 10 | }, 11 | }) 12 | export class BrnCalendarGridDirective { 13 | /** Access the calendar component */ 14 | protected readonly calendar = injectBrnCalendar(); 15 | } 16 | -------------------------------------------------------------------------------- /libs/brain/calendar/src/lib/brn-calendar-header.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, input } from '@angular/core'; 2 | 3 | let uniqueId = 0; 4 | 5 | @Directive({ 6 | selector: '[brnCalendarHeader]', 7 | standalone: true, 8 | host: { 9 | '[id]': 'id()', 10 | 'aria-live': 'polite', 11 | role: 'presentation', 12 | }, 13 | }) 14 | export class BrnCalendarHeaderDirective { 15 | /** The unique id for the header */ 16 | public readonly id = input(`brn-calendar-header-${uniqueId++}`); 17 | } 18 | -------------------------------------------------------------------------------- /libs/brain/checkbox/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/checkbox 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/checkbox`. 4 | -------------------------------------------------------------------------------- /libs/brain/checkbox/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/checkbox/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { BrnCheckboxComponent } from './lib/brn-checkbox.component'; 4 | 5 | export * from './lib/brn-checkbox.component'; 6 | 7 | export const BrnCheckboxImports = [BrnCheckboxComponent] as const; 8 | 9 | @NgModule({ 10 | imports: [...BrnCheckboxImports], 11 | exports: [...BrnCheckboxImports], 12 | }) 13 | export class BrnCheckboxModule {} 14 | -------------------------------------------------------------------------------- /libs/brain/collapsible/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/collapsible 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/collapsible`. 4 | -------------------------------------------------------------------------------- /libs/brain/collapsible/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/command/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/command 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/command`. 4 | -------------------------------------------------------------------------------- /libs/brain/command/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/command/src/lib/brn-command-item.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, InjectionToken, Type } from '@angular/core'; 2 | import type { BrnCommandItemDirective } from './brn-command-item.directive'; 3 | 4 | export const BrnCommandItemToken = new InjectionToken('BrnCommandItemToken'); 5 | 6 | export function provideBrnCommandItem(command: Type): ExistingProvider { 7 | return { provide: BrnCommandItemToken, useExisting: command }; 8 | } 9 | -------------------------------------------------------------------------------- /libs/brain/command/src/lib/brn-command-list.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, input } from '@angular/core'; 2 | 3 | @Directive({ 4 | standalone: true, 5 | selector: '[brnCommandList]', 6 | host: { 7 | role: 'listbox', 8 | '[id]': 'id()', 9 | }, 10 | }) 11 | export class BrnCommandListDirective { 12 | private static _id = 0; 13 | 14 | /** The id of the command list */ 15 | public readonly id = input(`brn-command-list-${BrnCommandListDirective._id++}`); 16 | } 17 | -------------------------------------------------------------------------------- /libs/brain/command/src/lib/brn-command-search-input.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, InjectionToken, Type } from '@angular/core'; 2 | import type { BrnCommandSearchInputDirective } from './brn-command-search-input.directive'; 3 | 4 | export const BrnCommandSearchInputToken = new InjectionToken( 5 | 'BrnCommandSearchInputToken', 6 | ); 7 | 8 | export function provideBrnCommandSearchInput(command: Type): ExistingProvider { 9 | return { provide: BrnCommandSearchInputToken, useExisting: command }; 10 | } 11 | -------------------------------------------------------------------------------- /libs/brain/command/src/lib/brn-command.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, inject, InjectionToken, Type } from '@angular/core'; 2 | import type { BrnCommandDirective } from './brn-command.directive'; 3 | 4 | export const BrnCommandToken = new InjectionToken('BrnCommandToken'); 5 | 6 | export function provideBrnCommand(command: Type): ExistingProvider { 7 | return { provide: BrnCommandToken, useExisting: command }; 8 | } 9 | 10 | export function injectBrnCommand(): BrnCommandDirective { 11 | return inject(BrnCommandToken); 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/core/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/core 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/core`. 4 | -------------------------------------------------------------------------------- /libs/brain/core/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/core/src/helpers/custom-element-class-settable.ts: -------------------------------------------------------------------------------- 1 | import { createInjectionToken } from './create-injection-token'; 2 | 3 | export interface CustomElementClassSettable { 4 | setClassToCustomElement: (newClass: string) => void; 5 | } 6 | 7 | export const [ 8 | injectCustomClassSettable, 9 | provideCustomClassSettable, 10 | provideCustomClassSettableExisting, 11 | SET_CLASS_TO_CUSTOM_ELEMENT_TOKEN, 12 | ] = createInjectionToken('@spartan-ng SET_CLASS_TO_CUSTOM_ELEMENT_TOKEN'); 13 | -------------------------------------------------------------------------------- /libs/brain/core/src/helpers/dev-mode.ts: -------------------------------------------------------------------------------- 1 | declare const ngDevMode: boolean; 2 | /** 3 | * Set by Angular to true when in development mode. 4 | * Allows for tree-shaking code that is only used in development. 5 | */ 6 | export const brnDevMode = ngDevMode; 7 | -------------------------------------------------------------------------------- /libs/brain/core/src/helpers/exposes-side.ts: -------------------------------------------------------------------------------- 1 | import type { Signal } from '@angular/core'; 2 | import { createInjectionToken } from './create-injection-token'; 3 | 4 | export interface ExposesSide { 5 | side: Signal<'top' | 'bottom' | 'left' | 'right'>; 6 | } 7 | 8 | export const [ 9 | injectExposedSideProvider, 10 | provideExposedSideProvider, 11 | provideExposedSideProviderExisting, 12 | EXPOSES_SIDE_TOKEN, 13 | ] = createInjectionToken('@spartan-ng EXPOSES_SIDE_TOKEN'); 14 | -------------------------------------------------------------------------------- /libs/brain/core/src/helpers/exposes-state.ts: -------------------------------------------------------------------------------- 1 | import type { Signal } from '@angular/core'; 2 | import { createInjectionToken } from './create-injection-token'; 3 | 4 | export interface ExposesState { 5 | state: Signal<'open' | 'closed'>; 6 | } 7 | 8 | export const [ 9 | injectExposesStateProvider, 10 | provideExposesStateProvider, 11 | provideExposesStateProviderExisting, 12 | EXPOSES_STATE_TOKEN, 13 | ] = createInjectionToken('@spartan-ng EXPOSES_STATE_TOKEN'); 14 | -------------------------------------------------------------------------------- /libs/brain/core/src/helpers/hlm.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function hlm(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /libs/brain/core/src/helpers/table-classes-settable.ts: -------------------------------------------------------------------------------- 1 | import { createInjectionToken } from './create-injection-token'; 2 | 3 | export interface TableClassesSettable { 4 | setTableClasses: (classes: Partial<{ table: string; headerRow: string; bodyRow: string }>) => void; 5 | } 6 | 7 | export const [ 8 | injectTableClassesSettable, 9 | provideTableClassesSettable, 10 | provideTableClassesSettableExisting, 11 | SET_TABLE_CLASSES_TOKEN, 12 | ] = createInjectionToken('@spartan-ng SET_TABLE_CLASSES_TOKEN'); 13 | -------------------------------------------------------------------------------- /libs/brain/core/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './helpers/custom-element-class-settable'; 2 | export * from './helpers/dev-mode'; 3 | export * from './helpers/exposes-side'; 4 | export * from './helpers/exposes-state'; 5 | export * from './helpers/hlm'; 6 | export * from './helpers/table-classes-settable'; 7 | export * from './helpers/zone-free'; 8 | -------------------------------------------------------------------------------- /libs/brain/date-time-luxon/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/date-time-luxon 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/date-time-luxon`. 4 | -------------------------------------------------------------------------------- /libs/brain/date-time-luxon/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/date-time-luxon/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/date-adapter'; 2 | -------------------------------------------------------------------------------- /libs/brain/date-time/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/date-time 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/date-time`. 4 | -------------------------------------------------------------------------------- /libs/brain/date-time/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/date-time/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/date-adapter'; 2 | export * from './lib/native-date-adapter'; 3 | -------------------------------------------------------------------------------- /libs/brain/dialog/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/dialog 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/dialog`. 4 | -------------------------------------------------------------------------------- /libs/brain/dialog/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/dialog/src/lib/brn-dialog-state.ts: -------------------------------------------------------------------------------- 1 | export type BrnDialogState = 'closed' | 'open'; 2 | -------------------------------------------------------------------------------- /libs/brain/dialog/src/lib/brn-dialog-title.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, effect, inject, signal } from '@angular/core'; 2 | import { BrnDialogRef } from './brn-dialog-ref'; 3 | 4 | @Directive({ 5 | selector: '[brnDialogTitle]', 6 | standalone: true, 7 | host: { 8 | '[id]': '_id()', 9 | }, 10 | }) 11 | export class BrnDialogTitleDirective { 12 | private readonly _brnDialogRef = inject(BrnDialogRef); 13 | 14 | protected _id = signal(`brn-dialog-title-${this._brnDialogRef?.dialogId}`); 15 | 16 | constructor() { 17 | effect(() => { 18 | this._brnDialogRef.setAriaLabelledBy(this._id()); 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /libs/brain/dialog/src/lib/brn-dialog-utils.ts: -------------------------------------------------------------------------------- 1 | // brn-dialog-utils.ts 2 | 3 | export const cssClassesToArray = (classes: string | string[] | undefined | null, defaultClass = ''): string[] => { 4 | if (typeof classes === 'string') { 5 | const splitClasses = classes.trim().split(' '); 6 | if (splitClasses.length === 0) { 7 | return [defaultClass]; 8 | } 9 | return splitClasses; 10 | } 11 | return classes ?? []; 12 | }; 13 | -------------------------------------------------------------------------------- /libs/brain/form-field/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/form-field 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/form-field`. 4 | -------------------------------------------------------------------------------- /libs/brain/form-field/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/form-field/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/brn-form-field-control'; 2 | -------------------------------------------------------------------------------- /libs/brain/form-field/src/lib/brn-form-field-control.ts: -------------------------------------------------------------------------------- 1 | import { Directive, type Signal, signal } from '@angular/core'; 2 | import type { AbstractControlDirective, NgControl } from '@angular/forms'; 3 | 4 | @Directive() 5 | export class BrnFormFieldControl { 6 | /** Gets the AbstractControlDirective for this control. */ 7 | public readonly ngControl: NgControl | AbstractControlDirective | null = null; 8 | 9 | /** Whether the control is in an error state. */ 10 | public readonly errorState: Signal = signal(false); 11 | } 12 | -------------------------------------------------------------------------------- /libs/brain/forms/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/forms 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/forms`. 4 | -------------------------------------------------------------------------------- /libs/brain/forms/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/forms/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/control-value-accessor'; 2 | export * from './lib/error-options'; 3 | export * from './lib/error-state-tracker'; 4 | -------------------------------------------------------------------------------- /libs/brain/forms/src/lib/control-value-accessor.ts: -------------------------------------------------------------------------------- 1 | export type ChangeFn = (value: T) => void; 2 | export type TouchFn = () => void; 3 | -------------------------------------------------------------------------------- /libs/brain/hover-card/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/hover-card 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/hover-card`. 4 | -------------------------------------------------------------------------------- /libs/brain/hover-card/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/input-otp/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/input-otp 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/input-otp`. 4 | -------------------------------------------------------------------------------- /libs/brain/input-otp/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/input-otp/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrnInputOtpSlotComponent } from './lib/brn-input-otp-slot.component'; 3 | import { BrnInputOtpComponent } from './lib/brn-input-otp.component'; 4 | 5 | export * from './lib/brn-input-otp-slot.component'; 6 | export * from './lib/brn-input-otp.component'; 7 | 8 | @NgModule({ 9 | imports: [BrnInputOtpComponent, BrnInputOtpSlotComponent], 10 | exports: [BrnInputOtpComponent, BrnInputOtpSlotComponent], 11 | }) 12 | export class BrnInputOtpModule {} 13 | -------------------------------------------------------------------------------- /libs/brain/input-otp/src/lib/brn-input-otp.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, inject, InjectionToken, Type } from '@angular/core'; 2 | import { BrnInputOtpComponent } from './brn-input-otp.component'; 3 | 4 | export const BrnInputOtpToken = new InjectionToken('BrnInputOtpToken'); 5 | 6 | export function injectBrnInputOtp(): BrnInputOtpComponent { 7 | return inject(BrnInputOtpToken) as BrnInputOtpComponent; 8 | } 9 | 10 | export function provideBrnInputOtp(inputOtp: Type): ExistingProvider { 11 | return { provide: BrnInputOtpToken, useExisting: inputOtp }; 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/label/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/label 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/label`. 4 | -------------------------------------------------------------------------------- /libs/brain/label/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/label/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrnLabelDirective } from './lib/brn-label.directive'; 3 | 4 | export * from './lib/brn-label.directive'; 5 | 6 | @NgModule({ 7 | imports: [BrnLabelDirective], 8 | exports: [BrnLabelDirective], 9 | }) 10 | export class BrnLabelModule {} 11 | -------------------------------------------------------------------------------- /libs/brain/menu/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/menu 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/menu`. 4 | -------------------------------------------------------------------------------- /libs/brain/menu/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/menu/src/lib/brn-menu-align.ts: -------------------------------------------------------------------------------- 1 | import { ConnectedPosition } from '@angular/cdk/overlay'; 2 | 3 | export type BrnMenuAlign = 'start' | 'center' | 'end' | undefined; 4 | export const getBrnMenuAlign = (align: Exclude): ConnectedPosition[] => [ 5 | { 6 | originX: align, 7 | originY: 'bottom', 8 | overlayX: align, 9 | overlayY: 'top', 10 | }, 11 | { 12 | originX: align, 13 | originY: 'top', 14 | overlayX: align, 15 | overlayY: 'bottom', 16 | }, 17 | ]; 18 | -------------------------------------------------------------------------------- /libs/brain/menu/src/lib/brn-menu-bar.directive.ts: -------------------------------------------------------------------------------- 1 | import { CdkMenuBar } from '@angular/cdk/menu'; 2 | import { Directive } from '@angular/core'; 3 | 4 | @Directive({ 5 | selector: '[brnMenuBar]', 6 | standalone: true, 7 | hostDirectives: [CdkMenuBar], 8 | }) 9 | export class BrnMenuBarDirective {} 10 | -------------------------------------------------------------------------------- /libs/brain/menu/src/lib/brn-menu-group.directive.ts: -------------------------------------------------------------------------------- 1 | import { CdkMenuGroup } from '@angular/cdk/menu'; 2 | import { Directive } from '@angular/core'; 3 | 4 | @Directive({ 5 | selector: '[brnMenuGroup]', 6 | standalone: true, 7 | hostDirectives: [CdkMenuGroup], 8 | }) 9 | export class BrnMenuGroupDirective {} 10 | -------------------------------------------------------------------------------- /libs/brain/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/brain", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | }, 7 | "assets": ["hlm-tailwind-preset.js", "hlm-tailwind-preset.css"] 8 | } 9 | -------------------------------------------------------------------------------- /libs/brain/popover/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/popover 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/popover`. 4 | -------------------------------------------------------------------------------- /libs/brain/popover/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/popover/src/lib/brn-popover-close.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { BrnDialogCloseDirective } from '@spartan-ng/brain/dialog'; 3 | 4 | @Directive({ 5 | selector: 'button[brnPopoverClose]', 6 | standalone: true, 7 | }) 8 | export class BrnPopoverCloseDirective extends BrnDialogCloseDirective {} 9 | -------------------------------------------------------------------------------- /libs/brain/popover/src/lib/brn-popover-content.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { provideExposesStateProviderExisting } from '@spartan-ng/brain/core'; 3 | import { BrnDialogContentDirective } from '@spartan-ng/brain/dialog'; 4 | 5 | @Directive({ 6 | selector: '[brnPopoverContent]', 7 | standalone: true, 8 | providers: [provideExposesStateProviderExisting(() => BrnPopoverContentDirective)], 9 | }) 10 | export class BrnPopoverContentDirective extends BrnDialogContentDirective {} 11 | -------------------------------------------------------------------------------- /libs/brain/progress/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/progress 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/progress`. 4 | -------------------------------------------------------------------------------- /libs/brain/progress/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/progress/src/lib/brn-progress-indicator.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { injectBrnProgress } from './brn-progress.token'; 3 | 4 | @Component({ 5 | selector: 'brn-progress-indicator', 6 | standalone: true, 7 | template: '', 8 | host: { 9 | '[attr.data-state]': 'progress.state()', 10 | '[attr.data-value]': 'progress.value()', 11 | '[attr.data-max]': 'progress.max()', 12 | }, 13 | changeDetection: ChangeDetectionStrategy.OnPush, 14 | }) 15 | export class BrnProgressIndicatorComponent { 16 | protected readonly progress = injectBrnProgress(); 17 | } 18 | -------------------------------------------------------------------------------- /libs/brain/progress/src/lib/brn-progress.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, InjectionToken, Type, inject } from '@angular/core'; 2 | import type { BrnProgressComponent } from './brn-progress.component'; 3 | 4 | const BrnProgressToken = new InjectionToken('BrnProgressComponent'); 5 | 6 | export function provideBrnProgress(progress: Type): ExistingProvider { 7 | return { provide: BrnProgressToken, useExisting: progress }; 8 | } 9 | 10 | export function injectBrnProgress(): BrnProgressComponent { 11 | return inject(BrnProgressToken); 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/radio-group/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/radio-group 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/radio-group`. 4 | -------------------------------------------------------------------------------- /libs/brain/radio-group/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/radio-group/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { BrnRadioGroupDirective } from './lib/brn-radio-group.directive'; 4 | import { BrnRadioComponent } from './lib/brn-radio.component'; 5 | 6 | export * from './lib/brn-radio-group.directive'; 7 | export * from './lib/brn-radio.component'; 8 | 9 | export const BrnRadioGroupImports = [BrnRadioGroupDirective, BrnRadioComponent] as const; 10 | 11 | @NgModule({ 12 | imports: [...BrnRadioGroupImports], 13 | exports: [...BrnRadioGroupImports], 14 | }) 15 | export class BrnRadioGroupModule {} 16 | -------------------------------------------------------------------------------- /libs/brain/select/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/select 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/select`. 4 | -------------------------------------------------------------------------------- /libs/brain/select/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/select/src/lib/brn-select-group.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, signal } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[brnSelectGroup]', 5 | standalone: true, 6 | host: { 7 | role: 'group', 8 | '[attr.aria-labelledby]': 'labelledBy()', 9 | }, 10 | }) 11 | export class BrnSelectGroupDirective { 12 | public readonly labelledBy = signal(''); 13 | } 14 | -------------------------------------------------------------------------------- /libs/brain/select/src/lib/brn-select-placeholder.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, inject, TemplateRef } from '@angular/core'; 2 | 3 | @Directive({ 4 | standalone: true, 5 | selector: '[brnSelectPlaceholder], [hlmSelectPlaceholder]', 6 | }) 7 | export class BrnSelectPlaceholderDirective { 8 | /** @internale */ 9 | public readonly templateRef = inject>(TemplateRef); 10 | } 11 | -------------------------------------------------------------------------------- /libs/brain/select/src/lib/brn-select-value.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, inject, TemplateRef } from '@angular/core'; 2 | 3 | @Directive({ 4 | standalone: true, 5 | selector: '[brnSelectValue], [hlmSelectValue]', 6 | }) 7 | export class BrnSelectValueDirective { 8 | /** @internale */ 9 | public readonly templateRef = inject>>(TemplateRef); 10 | } 11 | 12 | export interface BrnSelectValueContext { 13 | $implicit: T | T[]; 14 | } 15 | -------------------------------------------------------------------------------- /libs/brain/select/src/lib/brn-select.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, inject, InjectionToken, Type } from '@angular/core'; 2 | import type { BrnSelectComponent } from './brn-select.component'; 3 | 4 | const BrnSelectToken = new InjectionToken('BrnSelectToken'); 5 | 6 | export function injectBrnSelect(): BrnSelectComponent { 7 | return inject(BrnSelectToken) as BrnSelectComponent; 8 | } 9 | 10 | export function provideBrnSelect(select: Type): ExistingProvider { 11 | return { provide: BrnSelectToken, useExisting: select }; 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/separator/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/separator 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/separator`. 4 | -------------------------------------------------------------------------------- /libs/brain/separator/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/separator/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrnSeparatorComponent } from './lib/brn-separator.component'; 3 | 4 | export * from './lib/brn-separator.component'; 5 | 6 | @NgModule({ 7 | imports: [BrnSeparatorComponent], 8 | exports: [BrnSeparatorComponent], 9 | }) 10 | export class BrnSeparatorModule {} 11 | -------------------------------------------------------------------------------- /libs/brain/sheet/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/sheet 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/sheet`. 4 | -------------------------------------------------------------------------------- /libs/brain/sheet/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/sheet/src/lib/brn-sheet-close.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { BrnDialogCloseDirective } from '@spartan-ng/brain/dialog'; 3 | 4 | @Directive({ 5 | selector: 'button[brnSheetClose]', 6 | standalone: true, 7 | }) 8 | export class BrnSheetCloseDirective extends BrnDialogCloseDirective {} 9 | -------------------------------------------------------------------------------- /libs/brain/sheet/src/lib/brn-sheet-description.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { BrnDialogDescriptionDirective } from '@spartan-ng/brain/dialog'; 3 | 4 | @Directive({ 5 | selector: '[brnSheetDescription]', 6 | standalone: true, 7 | host: { 8 | '[id]': '_id()', 9 | }, 10 | }) 11 | export class BrnSheetDescriptionDirective extends BrnDialogDescriptionDirective {} 12 | -------------------------------------------------------------------------------- /libs/brain/sheet/src/lib/brn-sheet-title.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { BrnDialogTitleDirective } from '@spartan-ng/brain/dialog'; 3 | 4 | @Directive({ 5 | selector: '[brnSheetTitle]', 6 | standalone: true, 7 | host: { 8 | '[id]': '_id()', 9 | }, 10 | }) 11 | export class BrnSheetTitleDirective extends BrnDialogTitleDirective {} 12 | -------------------------------------------------------------------------------- /libs/brain/slider/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/slider 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/slider`. 4 | -------------------------------------------------------------------------------- /libs/brain/slider/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/slider/src/lib/brn-slider-range.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { injectBrnSlider } from './brn-slider.token'; 3 | 4 | @Directive({ 5 | selector: '[brnSliderRange]', 6 | host: { 7 | '[attr.data-disabled]': 'slider.disabled()', 8 | '[style.width.%]': 'slider.percentage()', 9 | }, 10 | }) 11 | export class BrnSliderRangeDirective { 12 | /** Access the slider */ 13 | protected readonly slider = injectBrnSlider(); 14 | } 15 | -------------------------------------------------------------------------------- /libs/brain/slider/src/lib/brn-slider-track.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, inject, InjectionToken, Type } from '@angular/core'; 2 | import type { BrnSliderTrackDirective } from './brn-slider-track.directive'; 3 | 4 | export const BrnSliderTrackToken = new InjectionToken('BrnSliderTrackToken'); 5 | 6 | export function provideBrnSliderTrack(slider: Type): ExistingProvider { 7 | return { provide: BrnSliderTrackToken, useExisting: slider }; 8 | } 9 | 10 | export function injectBrnSliderTrack(): BrnSliderTrackDirective { 11 | return inject(BrnSliderTrackToken); 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/slider/src/lib/brn-slider.token.ts: -------------------------------------------------------------------------------- 1 | import { ExistingProvider, inject, InjectionToken, Type } from '@angular/core'; 2 | import type { BrnSliderDirective } from './brn-slider.directive'; 3 | 4 | const BrnSliderToken = new InjectionToken('BrnSliderToken'); 5 | 6 | export function provideBrnSlider(slider: Type): ExistingProvider { 7 | return { provide: BrnSliderToken, useExisting: slider }; 8 | } 9 | 10 | export function injectBrnSlider(): BrnSliderDirective { 11 | return inject(BrnSliderToken); 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/src/index.ts: -------------------------------------------------------------------------------- 1 | // this file can't be empty, otherwise the build will fail 2 | export default true; 3 | -------------------------------------------------------------------------------- /libs/brain/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; 3 | 4 | setupZoneTestEnv(); 5 | 6 | import { toHaveNoViolations } from 'jest-axe'; 7 | 8 | expect.extend(toHaveNoViolations); 9 | -------------------------------------------------------------------------------- /libs/brain/switch/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/switch 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/switch`. 4 | -------------------------------------------------------------------------------- /libs/brain/switch/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/switch/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { BrnSwitchThumbComponent } from './lib/brn-switch-thumb.component'; 4 | import { BrnSwitchComponent } from './lib/brn-switch.component'; 5 | 6 | export * from './lib/brn-switch-thumb.component'; 7 | export * from './lib/brn-switch.component'; 8 | 9 | export const BrnSwitchImports = [BrnSwitchComponent, BrnSwitchThumbComponent] as const; 10 | 11 | @NgModule({ 12 | imports: [...BrnSwitchImports], 13 | exports: [...BrnSwitchImports], 14 | }) 15 | export class BrnSwitchModule {} 16 | -------------------------------------------------------------------------------- /libs/brain/switch/src/lib/brn-switch-thumb.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'brn-switch-thumb', 5 | template: '', 6 | host: { 7 | role: 'presentation', 8 | '(click)': '$event.preventDefault()', 9 | }, 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BrnSwitchThumbComponent {} 13 | -------------------------------------------------------------------------------- /libs/brain/table/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/table 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/table`. 4 | -------------------------------------------------------------------------------- /libs/brain/table/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/table/src/lib/brn-cell-def.directive.ts: -------------------------------------------------------------------------------- 1 | import { CdkCellDef } from '@angular/cdk/table'; 2 | import { Directive, TemplateRef, inject } from '@angular/core'; 3 | 4 | @Directive({ 5 | standalone: true, 6 | selector: '[brnCellDef]', 7 | exportAs: 'brnCellDef', 8 | }) 9 | export class BrnCellDefDirective extends CdkCellDef { 10 | public override template: TemplateRef; 11 | 12 | constructor() { 13 | const template = inject>(TemplateRef); 14 | 15 | super(template); 16 | this.template = template; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /libs/brain/table/src/lib/brn-footer-def.directive.ts: -------------------------------------------------------------------------------- 1 | import { CdkFooterCellDef } from '@angular/cdk/table'; 2 | import { Directive, TemplateRef, inject } from '@angular/core'; 3 | 4 | @Directive({ 5 | standalone: true, 6 | selector: '[brnFooterDef]', 7 | exportAs: 'brnFooterDef', 8 | }) 9 | export class BrnFooterDefDirective extends CdkFooterCellDef { 10 | public override template: TemplateRef; 11 | 12 | constructor() { 13 | const template = inject>(TemplateRef); 14 | 15 | super(template); 16 | this.template = template; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /libs/brain/table/src/lib/brn-header-def.directive.ts: -------------------------------------------------------------------------------- 1 | import { CdkHeaderCellDef } from '@angular/cdk/table'; 2 | import { Directive, TemplateRef, inject } from '@angular/core'; 3 | 4 | @Directive({ 5 | standalone: true, 6 | selector: '[brnHeaderDef]', 7 | exportAs: 'brnHeaderDef', 8 | }) 9 | export class BrnHeaderDefDirective extends CdkHeaderCellDef { 10 | public override template: TemplateRef; 11 | 12 | constructor() { 13 | const template = inject>(TemplateRef); 14 | 15 | super(template); 16 | this.template = template; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /libs/brain/tabs/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/tabs 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/tabs`. 4 | -------------------------------------------------------------------------------- /libs/brain/tabs/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/toggle-group/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/toggle-group 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/toggle-group`. 4 | -------------------------------------------------------------------------------- /libs/brain/toggle-group/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/toggle/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/toggle 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/toggle`. 4 | -------------------------------------------------------------------------------- /libs/brain/toggle/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/toggle/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrnToggleDirective } from './lib/brn-toggle.directive'; 3 | 4 | export * from './lib/brn-toggle.directive'; 5 | 6 | @NgModule({ 7 | imports: [BrnToggleDirective], 8 | exports: [BrnToggleDirective], 9 | }) 10 | export class BrnToggleModule {} 11 | -------------------------------------------------------------------------------- /libs/brain/tooltip/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/brain/tooltip 2 | 3 | Secondary entry point of `@spartan-ng/brain`. It can be used by importing from `@spartan-ng/brain/tooltip`. 4 | -------------------------------------------------------------------------------- /libs/brain/tooltip/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/brain/tooltip/src/lib/brn-tooltip-content.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, TemplateRef, inject } from '@angular/core'; 2 | import { BrnTooltipDirective } from './brn-tooltip.directive'; 3 | 4 | @Directive({ 5 | selector: '[brnTooltipContent]', 6 | standalone: true, 7 | }) 8 | export class BrnTooltipContentDirective { 9 | private readonly _brnTooltipDirective = inject(BrnTooltipDirective, { optional: true }); 10 | private readonly _tpl = inject(TemplateRef); 11 | 12 | constructor() { 13 | if (!this._brnTooltipDirective || !this._tpl) return; 14 | this._brnTooltipDirective.tooltipTemplate.set(this._tpl); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /libs/brain/tooltip/src/lib/brn-tooltip.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, type TemplateRef, signal } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[brnTooltip]', 5 | standalone: true, 6 | }) 7 | export class BrnTooltipDirective { 8 | public readonly tooltipTemplate = signal | null>(null); 9 | } 10 | -------------------------------------------------------------------------------- /libs/brain/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "declarationMap": true, 7 | "inlineSources": true, 8 | "types": [] 9 | }, 10 | "exclude": ["**/*.spec.ts", "test-setup.ts", "jest.config.ts", "**/*.test.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/brain/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": { 7 | "compilationMode": "partial" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /libs/brain/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "target": "es2016", 7 | "types": ["jest", "node"] 8 | }, 9 | "files": ["src/test-setup.ts"], 10 | "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/cli/README.md: -------------------------------------------------------------------------------- 1 | # cli 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Building 6 | 7 | Run `nx build cli` to build the library. 8 | 9 | ## Running unit tests 10 | 11 | Run `nx test cli` to execute the unit tests via [Jest](https://jestjs.io). 12 | -------------------------------------------------------------------------------- /libs/cli/executors.json: -------------------------------------------------------------------------------- 1 | { 2 | "executors": {} 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/jest.config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | displayName: 'cli', 3 | preset: '../../jest.preset.cjs', 4 | testEnvironment: 'node', 5 | transform: { 6 | '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], 7 | }, 8 | moduleFileExtensions: ['ts', 'js', 'html'], 9 | coverageDirectory: '../../coverage/libs/cli', 10 | }; 11 | -------------------------------------------------------------------------------- /libs/cli/src/generators/base/lib/deleteFiles.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import { join } from 'path/posix'; 3 | 4 | export function deleteFiles(tree: Tree, path: string) { 5 | if (tree.isFile(path)) { 6 | tree.delete(path); 7 | return; 8 | } 9 | 10 | const files = tree.children(path); 11 | 12 | for (const file of files) { 13 | deleteFiles(tree, join(path, file)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /libs/cli/src/generators/base/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HlmBaseGeneratorSchema { 2 | primitiveName: string; 3 | internalName: string; 4 | publicName: string; 5 | directory?: string; 6 | rootProject?: boolean; 7 | tags?: string; 8 | peerDependencies?: Record; 9 | angularCli?: boolean; 10 | } 11 | -------------------------------------------------------------------------------- /libs/cli/src/generators/base/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "HlmBaseGeneratorSchema", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "directory": { 8 | "type": "string", 9 | "description": "A directory where the lib is placed.", 10 | "x-priority": "important" 11 | }, 12 | "tags": { 13 | "type": "string", 14 | "description": "Add tags to the library (used for linting)." 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /libs/cli/src/generators/base/versions.ts: -------------------------------------------------------------------------------- 1 | // angular dependency 2 | export const FALLBACK_ANGULAR_VERSION = '^18.0.0'; 3 | // ng-icon dependency 4 | export const NG_ICONS_VERSION = '^29.10.0'; 5 | // spartan dependencies 6 | export const SPARTAN_BRAIN_VERSION = '0.0.1-alpha.381'; 7 | // dev dependencies 8 | export const TAILWIND_MERGE_VERSION = '^2.2.0'; 9 | export const TAILWINDCSS_VERSION = '^3.0.2'; 10 | export const TAILWIND_ANIMATE_VERSION = '^1.0.6'; 11 | -------------------------------------------------------------------------------- /libs/cli/src/generators/healthcheck/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import { healthcheckGenerator } from './generator'; 3 | import { HealthcheckGeneratorSchema } from './schema'; 4 | 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 6 | export default convertNxGenerator((tree: any, schema: HealthcheckGeneratorSchema & { angularCli?: boolean }) => 7 | healthcheckGenerator(tree, { ...schema, angularCli: true }), 8 | ); 9 | -------------------------------------------------------------------------------- /libs/cli/src/generators/healthcheck/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HealthcheckGeneratorSchema { 2 | autoFix?: boolean; 3 | skipFormat?: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/healthcheck/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "Healthcheck", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "autoFix": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Automatically fix any issues" 11 | }, 12 | "skipFormat": { 13 | "type": "boolean", 14 | "default": false, 15 | "description": "Skip formatting files" 16 | } 17 | }, 18 | "required": [] 19 | } 20 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-brain-imports/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import { migrateBrainImportsGenerator } from './generator'; 3 | 4 | export default convertNxGenerator(migrateBrainImportsGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-brain-imports/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateBrainImportsGeneratorSchema { 2 | skipInstall?: boolean; 3 | skipFormat?: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-brain-imports/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "MigrateBrainImports", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "description": "Skip formatting the code after migration." 10 | }, 11 | "skipInstall": { 12 | "type": "boolean", 13 | "description": "Whether to verify the brain package is installed." 14 | } 15 | }, 16 | "required": [] 17 | } 18 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-core/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import { migrateCoreGenerator } from './generator'; 3 | 4 | export default convertNxGenerator(migrateCoreGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-core/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateCoreGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-core/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "MigrateCore", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Skip formatting files" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-helm-imports/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import { migrateHelmImportsGenerator } from './generator'; 3 | 4 | export default convertNxGenerator(migrateHelmImportsGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-helm-imports/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateHelmImportsGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-helm-imports/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "MigrateHelmImports", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "description": "Skip formatting the code after migration." 10 | } 11 | }, 12 | "required": [] 13 | } 14 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-helm-libraries/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import migrateHelmLibrariesGenerator from './generator'; 3 | import { MigrateHelmLibrariesGeneratorSchema } from './schema'; 4 | 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 6 | export default convertNxGenerator((tree: any, schema: MigrateHelmLibrariesGeneratorSchema & { angularCli?: boolean }) => 7 | migrateHelmLibrariesGenerator(tree, { ...schema, angularCli: true }), 8 | ); 9 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-helm-libraries/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateHelmLibrariesGeneratorSchema { 2 | directory?: string; 3 | rootProject?: boolean; 4 | tags?: string; 5 | angularCli?: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-helm-libraries/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "MigrateHelmLibraries", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "directory": { 8 | "type": "string", 9 | "description": "A directory where the libraries are placed. If not specified, the default directory will be used." 10 | }, 11 | "tags": { 12 | "type": "string", 13 | "description": "Add tags to the library (used for linting)." 14 | } 15 | }, 16 | "required": [] 17 | } 18 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-icon/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import { migrateIconGenerator } from './generator'; 3 | 4 | export default convertNxGenerator(migrateIconGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-icon/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateIconGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-icon/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "MigrateIcon", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Skip formatting files" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-radio/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import migrateRadioGenerator from './generator'; 3 | 4 | export default convertNxGenerator(migrateRadioGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-radio/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateRadioGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-radio/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "MigrateRadio", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Skip formatting files" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-scroll-area/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import { migrateScrollAreaGenerator } from './generator'; 3 | 4 | export default convertNxGenerator(migrateScrollAreaGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-scroll-area/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateScrollAreaGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-scroll-area/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "MigrateScrollArea", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Skip formatting files" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-select/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import migrateSelectGenerator from './generator'; 3 | 4 | export default convertNxGenerator(migrateSelectGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-select/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateSelectGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-select/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "MigrateSelect", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Skip formatting files" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-toggle-group/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import migrateRadioGenerator from './generator'; 3 | 4 | export default convertNxGenerator(migrateRadioGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-toggle-group/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface MigrateToggleGroupGeneratorSchema { 2 | skipFormat?: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/migrate-toggle-group/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "MigrateRadio", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "skipFormat": { 8 | "type": "boolean", 9 | "default": false, 10 | "description": "Skip formatting files" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/theme/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import addThemeToApplicationGenerator from './generator'; 3 | 4 | export default convertNxGenerator(addThemeToApplicationGenerator); 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/theme/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "HlmThemeGeneratorSchema", 4 | "title": "", 5 | "type": "object", 6 | "properties": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/compat.ts: -------------------------------------------------------------------------------- 1 | import { convertNxGenerator } from '@nx/devkit'; 2 | import hlmUIGenerator from './generator'; 3 | import type { HlmUIGeneratorSchema } from './schema'; 4 | 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 6 | export default convertNxGenerator((tree: any, schema: HlmUIGeneratorSchema & { angularCli?: boolean }) => 7 | hlmUIGenerator(tree, { ...schema, angularCli: true }), 8 | ); 9 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-accordion-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'accordion', 9 | internalName: 'ui-accordion-helm', 10 | publicName: 'ui-accordion-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-alert-dialog-helm/files/lib/hlm-alert-dialog-action-button.directive.ts.template: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { HlmButtonDirective } from '@spartan-ng/helm/button'; 3 | 4 | @Directive({ 5 | selector: 'button[hlmAlertDialogAction]', 6 | standalone: true, 7 | hostDirectives: [HlmButtonDirective], 8 | }) 9 | export class HlmAlertDialogActionButtonDirective {} 10 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-alert-dialog-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'alert-dialog', 9 | internalName: 'ui-alert-dialog-helm', 10 | publicName: 'ui-alert-dialog-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-alert-helm/files/lib/hlm-alert-icon.directive.ts.template: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { provideHlmIconConfig } from '@spartan-ng/helm/icon'; 3 | 4 | @Directive({ 5 | selector: '[hlmAlertIcon]', 6 | standalone: true, 7 | providers: [provideHlmIconConfig({ size: 'sm' })], 8 | }) 9 | export class HlmAlertIconDirective {} 10 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-alert-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'alert', 9 | internalName: 'ui-alert-helm', 10 | publicName: 'ui-alert-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-aspect-ratio-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-aspect-ratio-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'aspect-ratio', 9 | internalName: 'ui-aspect-ratio-helm', 10 | publicName: 'ui-aspect-ratio-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-avatar-helm/files/lib/fallback/index.ts.template: -------------------------------------------------------------------------------- 1 | export * from './hlm-avatar-fallback.directive'; 2 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-avatar-helm/files/lib/image/index.ts.template: -------------------------------------------------------------------------------- 1 | export * from './hlm-avatar-image.directive'; 2 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-avatar-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'avatar', 9 | internalName: 'ui-avatar-helm', 10 | publicName: 'ui-avatar-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-badge-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-badge-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'badge', 9 | internalName: 'ui-badge-helm', 10 | publicName: 'ui-badge-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-breadcrumb-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'breadcrumb', 9 | internalName: 'ui-breadcrumb-helm', 10 | publicName: 'ui-breadcrumb-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-button-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-button-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'button', 9 | internalName: 'ui-button-helm', 10 | publicName: 'ui-button-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-calendar-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmCalendarMultiComponent } from './lib/hlm-calendar-multi.component'; 3 | import { HlmCalendarComponent } from './lib/hlm-calendar.component'; 4 | 5 | export * from './lib/hlm-calendar-multi.component'; 6 | export * from './lib/hlm-calendar.component'; 7 | 8 | export const HlmCalendarImports = [HlmCalendarComponent, HlmCalendarMultiComponent] as const; 9 | 10 | @NgModule({ 11 | imports: [...HlmCalendarImports], 12 | exports: [...HlmCalendarImports], 13 | }) 14 | export class HlmCalendarModule {} 15 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-calendar-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'calendar', 9 | internalName: 'ui-calendar-helm', 10 | publicName: 'ui-calendar-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-card-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'card', 9 | internalName: 'ui-card-helm', 10 | publicName: 'ui-card-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-carousel-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'carousel', 9 | internalName: 'ui-carousel-helm', 10 | publicName: 'ui-carousel-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-checkbox-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-checkbox-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'checkbox', 9 | internalName: 'ui-checkbox-helm', 10 | publicName: 'ui-checkbox-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-empty.directive.ts.template: -------------------------------------------------------------------------------- 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: '[hlmCommandEmpty]', 7 | standalone: true, 8 | host: { 9 | '[class]': '_computedClass()', 10 | }, 11 | }) 12 | export class HlmCommandEmptyDirective { 13 | public readonly userClass = input('', { alias: 'class' }); 14 | protected readonly _computedClass = computed(() => hlm('py-6 text-center text-sm', this.userClass())); 15 | } 16 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-icon.directive.ts.template: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { provideHlmIconConfig } from '@spartan-ng/helm/icon'; 3 | 4 | @Directive({ 5 | standalone: true, 6 | selector: '[hlmCommandIcon]', 7 | host: { 8 | class: 'inline-flex mr-2 w-4 h-4', 9 | }, 10 | providers: [provideHlmIconConfig({ size: 'sm' })], 11 | }) 12 | export class HlmCommandIconDirective {} 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-shortcut.component.ts.template: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | standalone: true, 5 | selector: 'hlm-command-shortcut', 6 | template: '', 7 | host: { 8 | class: 'font-light ml-auto opacity-60 text-xs tracking-widest', 9 | }, 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class HlmCommandShortcutComponent {} 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-command-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'command', 9 | internalName: 'ui-command-helm', 10 | publicName: 'ui-command-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-date-picker-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'date-picker', 9 | internalName: 'ui-date-picker-helm', 10 | publicName: 'ui-date-picker-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-dialog-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'dialog', 9 | internalName: 'ui-dialog-helm', 10 | publicName: 'ui-dialog-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-form-field-helm/files/lib/hlm-error.directive.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-form-field-helm/files/lib/hlm-hint.directive.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-form-field-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'form-field', 9 | internalName: 'ui-form-field-helm', 10 | publicName: 'ui-form-field-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-hover-card-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmHoverCardContentComponent } from './lib/hlm-hover-card-content.component'; 3 | 4 | export { HlmHoverCardContentComponent } from './lib/hlm-hover-card-content.component'; 5 | 6 | export const HlmHoverCardImports = [HlmHoverCardContentComponent] as const; 7 | 8 | @NgModule({ 9 | imports: [...HlmHoverCardImports], 10 | exports: [...HlmHoverCardImports], 11 | }) 12 | export class HlmHoverCardModule {} 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-hover-card-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'hover-card', 9 | internalName: 'ui-hover-card-helm', 10 | publicName: 'ui-hover-card-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-icon-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-icon-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'icon', 9 | internalName: 'ui-icon-helm', 10 | publicName: 'ui-icon-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-input-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-input-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'input', 9 | internalName: 'ui-input-helm', 10 | publicName: 'ui-input-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-input-otp-helm/files/lib/hlm-input-otp-fake-caret.component.ts.template: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'hlm-input-otp-fake-caret', 5 | standalone: true, 6 | template: ` 7 |
8 | 9 |
10 | `, 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class HlmInputOtpFakeCaretComponent {} 14 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-input-otp-helm/files/lib/hlm-input-otp-group.directive.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-input-otp-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'input-otp', 9 | internalName: 'ui-input-otp-helm', 10 | publicName: 'ui-input-otp-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-label-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-label-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'label', 9 | internalName: 'ui-label-helm', 10 | publicName: 'ui-label-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-menu-helm/files/lib/hlm-menu-group.component.ts.template: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, 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 | changeDetection: ChangeDetectionStrategy.OnPush, 15 | }) 16 | export class HlmMenuGroupComponent {} 17 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-menu-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'menu', 9 | internalName: 'ui-menu-helm', 10 | publicName: 'ui-menu-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-pagination-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'pagination', 9 | internalName: 'ui-pagination-helm', 10 | publicName: 'ui-pagination-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-popover-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'popover', 9 | internalName: 'ui-popover-helm', 10 | publicName: 'ui-popover-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-progress-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'progress', 9 | internalName: 'ui-progress-helm', 10 | publicName: 'ui-progress-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-radio-group-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'radio-group', 9 | internalName: 'ui-radio-group-helm', 10 | publicName: 'ui-radio-group-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-scroll-area-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-scroll-area-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'scroll-area', 9 | internalName: 'ui-scroll-area-helm', 10 | publicName: 'ui-scroll-area-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-select-helm/files/lib/hlm-select.directive.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-select-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'select', 9 | internalName: 'ui-select-helm', 10 | publicName: 'ui-select-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-separator-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmSeparatorDirective } from './lib/hlm-separator.directive'; 3 | 4 | export * from './lib/hlm-separator.directive'; 5 | 6 | @NgModule({ 7 | imports: [HlmSeparatorDirective], 8 | exports: [HlmSeparatorDirective], 9 | }) 10 | export class HlmSeparatorModule {} 11 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-separator-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'separator', 9 | internalName: 'ui-separator-helm', 10 | publicName: 'ui-separator-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-sheet-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'sheet', 9 | internalName: 'ui-sheet-helm', 10 | publicName: 'ui-sheet-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-skeleton-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmSkeletonComponent } from './lib/hlm-skeleton.component'; 3 | 4 | export * from './lib/hlm-skeleton.component'; 5 | 6 | @NgModule({ 7 | imports: [HlmSkeletonComponent], 8 | exports: [HlmSkeletonComponent], 9 | }) 10 | export class HlmSkeletonModule {} 11 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-skeleton-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'skeleton', 9 | internalName: 'ui-skeleton-helm', 10 | publicName: 'ui-skeleton-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-slider-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | export * from './lib/hlm-slider.component'; 2 | import { HlmSliderComponent } from './lib/hlm-slider.component'; 3 | 4 | export const HlmSliderImports = [HlmSliderComponent] as const; 5 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-slider-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'slider', 9 | internalName: 'ui-slider-helm', 10 | publicName: 'ui-slider-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-sonner-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { HlmToasterComponent } from './lib/hlm-toaster.component'; 4 | 5 | export * from './lib/hlm-toaster.component'; 6 | 7 | export const HlmToasterImports = [HlmToasterComponent] as const; 8 | 9 | @NgModule({ 10 | imports: [...HlmToasterImports], 11 | exports: [...HlmToasterImports], 12 | }) 13 | export class HlmToasterModule {} 14 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-sonner-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'sonner', 9 | internalName: 'ui-sonner-helm', 10 | publicName: 'ui-sonner-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-spinner-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-spinner-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'spinner', 9 | internalName: 'ui-spinner-helm', 10 | publicName: 'ui-spinner-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-switch-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-switch-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'switch', 9 | internalName: 'ui-switch-helm', 10 | publicName: 'ui-switch-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-table-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'table', 9 | internalName: 'ui-table-helm', 10 | publicName: 'ui-table-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-tabs-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'tabs', 9 | internalName: 'ui-tabs-helm', 10 | publicName: 'ui-tabs-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-toggle-group-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-toggle-group-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'toggle-group', 9 | internalName: 'ui-toggle-group-helm', 10 | publicName: 'ui-toggle-group-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-toggle-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmToggleDirective } from './lib/hlm-toggle.directive'; 3 | 4 | export * from './lib/hlm-toggle.directive'; 5 | @NgModule({ 6 | imports: [HlmToggleDirective], 7 | exports: [HlmToggleDirective], 8 | }) 9 | export class HlmToggleModule {} 10 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-toggle-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'toggle', 9 | internalName: 'ui-toggle-helm', 10 | publicName: 'ui-toggle-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-tooltip-helm/files/index.ts.template: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-tooltip-helm/files/lib/hlm-tooltip.component.ts.template: -------------------------------------------------------------------------------- 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 | host: { 9 | '[style]': '{display: "contents"}', 10 | }, 11 | hostDirectives: [BrnTooltipDirective], 12 | template: ` 13 | 14 | `, 15 | }) 16 | export class HlmTooltipComponent {} 17 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-tooltip-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'tooltip', 9 | internalName: 'ui-tooltip-helm', 10 | publicName: 'ui-tooltip-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-typography-helm/files/index.ts.template: -------------------------------------------------------------------------------- 1 | export * from './lib/hlm-blockquote.directive'; 2 | export * from './lib/hlm-code.directive'; 3 | export * from './lib/hlm-h1.directive'; 4 | export * from './lib/hlm-h2.directive'; 5 | export * from './lib/hlm-h3.directive'; 6 | export * from './lib/hlm-h4.directive'; 7 | export * from './lib/hlm-large.directive'; 8 | export * from './lib/hlm-lead.directive'; 9 | export * from './lib/hlm-muted.directive'; 10 | export * from './lib/hlm-p.directive'; 11 | export * from './lib/hlm-small.directive'; 12 | export * from './lib/hlm-ul.directive'; 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/libs/ui-typography-helm/generator.ts: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, { 7 | ...options, 8 | primitiveName: 'typography', 9 | internalName: 'ui-typography-helm', 10 | publicName: 'ui-typography-helm', 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /libs/cli/src/generators/ui/schema.d.ts: -------------------------------------------------------------------------------- 1 | import { Primitive } from './primitives'; 2 | 3 | export interface HlmUIGeneratorSchema { 4 | name?: Primitive; 5 | directory?: string; 6 | rootProject?: boolean; 7 | tags?: string; 8 | } 9 | -------------------------------------------------------------------------------- /libs/cli/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './generators/migrate-brain-imports/generator'; 2 | -------------------------------------------------------------------------------- /libs/cli/src/utils/get-project-names.ts: -------------------------------------------------------------------------------- 1 | import { type Tree, getProjects } from '@nx/devkit'; 2 | 3 | export const getProjectsAndNames = (tree: Tree) => { 4 | const projectNames: string[] = []; 5 | const projects = getProjects(tree); 6 | 7 | projects.forEach((projectConfiguration, projectName) => { 8 | if (projectConfiguration.projectType === 'application') { 9 | projectNames.push(projectName); 10 | } 11 | }); 12 | return { projects, projectNames }; 13 | }; 14 | -------------------------------------------------------------------------------- /libs/cli/src/utils/visit-files.ts: -------------------------------------------------------------------------------- 1 | import { Tree, visitNotIgnoredFiles } from '@nx/devkit'; 2 | 3 | export function visitFiles(tree: Tree, dirPath: string, visitor: (path: string) => void): void { 4 | visitNotIgnoredFiles(tree, dirPath, (path) => { 5 | // if the file is part of the generators we want to skip as we don't want it updating the code that is performing the updates 6 | if (path.includes('libs/cli/src/generators')) { 7 | return; 8 | } 9 | visitor(path); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /libs/cli/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "module": "commonjs" 5 | }, 6 | "files": [], 7 | "include": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | }, 12 | { 13 | "path": "./tsconfig.spec.json" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /libs/cli/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "types": ["node"], 7 | "resolveJsonModule": true 8 | }, 9 | "include": ["src/**/*.ts"], 10 | "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/cli/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"], 7 | "resolveJsonModule": true 8 | }, 9 | "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /libs/helm/README.md: -------------------------------------------------------------------------------- 1 | # helm 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test helm` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/helm/accordion/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/accordion 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/accordion`. 4 | -------------------------------------------------------------------------------- /libs/helm/accordion/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/alert-dialog/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/alert-dialog 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/alert-dialog`. 4 | -------------------------------------------------------------------------------- /libs/helm/alert-dialog/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/alert-dialog/src/lib/hlm-alert-dialog-action-button.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { HlmButtonDirective } from '@spartan-ng/helm/button'; 3 | 4 | @Directive({ 5 | selector: 'button[hlmAlertDialogAction]', 6 | standalone: true, 7 | hostDirectives: [HlmButtonDirective], 8 | }) 9 | export class HlmAlertDialogActionButtonDirective {} 10 | -------------------------------------------------------------------------------- /libs/helm/alert/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/alert 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/alert`. 4 | -------------------------------------------------------------------------------- /libs/helm/alert/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/alert/src/lib/hlm-alert-icon.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { provideHlmIconConfig } from '@spartan-ng/helm/icon'; 3 | 4 | @Directive({ 5 | selector: '[hlmAlertIcon]', 6 | standalone: true, 7 | providers: [provideHlmIconConfig({ size: 'sm' })], 8 | }) 9 | export class HlmAlertIconDirective {} 10 | -------------------------------------------------------------------------------- /libs/helm/aspect-ratio/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/aspect-ratio 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/aspect-ratio`. 4 | -------------------------------------------------------------------------------- /libs/helm/aspect-ratio/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/aspect-ratio/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 | -------------------------------------------------------------------------------- /libs/helm/avatar/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/avatar 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/avatar`. 4 | -------------------------------------------------------------------------------- /libs/helm/avatar/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/avatar/src/lib/fallback/index.ts: -------------------------------------------------------------------------------- 1 | export * from './hlm-avatar-fallback.directive'; 2 | -------------------------------------------------------------------------------- /libs/helm/avatar/src/lib/image/index.ts: -------------------------------------------------------------------------------- 1 | export * from './hlm-avatar-image.directive'; 2 | -------------------------------------------------------------------------------- /libs/helm/badge/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/badge 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/badge`. 4 | -------------------------------------------------------------------------------- /libs/helm/badge/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/badge/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 | -------------------------------------------------------------------------------- /libs/helm/breadcrumb/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/breadcrumb 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/breadcrumb`. 4 | -------------------------------------------------------------------------------- /libs/helm/breadcrumb/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/breadcrumb/src/lib/hlm-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 | -------------------------------------------------------------------------------- /libs/helm/breadcrumb/src/lib/hlm-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 | }, 12 | }) 13 | export class HlmBreadcrumbPageDirective { 14 | public readonly userClass = input('', { alias: 'class' }); 15 | 16 | protected readonly _computedClass = computed(() => hlm('font-normal text-foreground', this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/button/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/button 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/button`. 4 | -------------------------------------------------------------------------------- /libs/helm/button/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/button/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 | -------------------------------------------------------------------------------- /libs/helm/calendar/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/calendar 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/calendar`. 4 | -------------------------------------------------------------------------------- /libs/helm/calendar/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/calendar/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmCalendarMultiComponent } from './lib/hlm-calendar-multi.component'; 3 | import { HlmCalendarComponent } from './lib/hlm-calendar.component'; 4 | 5 | export * from './lib/hlm-calendar-multi.component'; 6 | export * from './lib/hlm-calendar.component'; 7 | 8 | export const HlmCalendarImports = [HlmCalendarComponent, HlmCalendarMultiComponent] as const; 9 | 10 | @NgModule({ 11 | imports: [...HlmCalendarImports], 12 | exports: [...HlmCalendarImports], 13 | }) 14 | export class HlmCalendarModule {} 15 | -------------------------------------------------------------------------------- /libs/helm/card/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/card 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/card`. 4 | -------------------------------------------------------------------------------- /libs/helm/card/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/carousel/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/carousel 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/carousel`. 4 | -------------------------------------------------------------------------------- /libs/helm/carousel/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/checkbox/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/checkbox 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/checkbox`. 4 | -------------------------------------------------------------------------------- /libs/helm/checkbox/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/checkbox/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 | -------------------------------------------------------------------------------- /libs/helm/command/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/command 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/command`. 4 | -------------------------------------------------------------------------------- /libs/helm/command/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/command/src/lib/hlm-command-empty.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: '[hlmCommandEmpty]', 7 | standalone: true, 8 | host: { 9 | '[class]': '_computedClass()', 10 | }, 11 | }) 12 | export class HlmCommandEmptyDirective { 13 | public readonly userClass = input('', { alias: 'class' }); 14 | protected readonly _computedClass = computed(() => hlm('py-6 text-center text-sm', this.userClass())); 15 | } 16 | -------------------------------------------------------------------------------- /libs/helm/command/src/lib/hlm-command-icon.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | import { provideHlmIconConfig } from '@spartan-ng/helm/icon'; 3 | 4 | @Directive({ 5 | standalone: true, 6 | selector: '[hlmCommandIcon]', 7 | host: { 8 | class: 'inline-flex mr-2 w-4 h-4', 9 | }, 10 | providers: [provideHlmIconConfig({ size: 'sm' })], 11 | }) 12 | export class HlmCommandIconDirective {} 13 | -------------------------------------------------------------------------------- /libs/helm/command/src/lib/hlm-command-shortcut.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | standalone: true, 5 | selector: 'hlm-command-shortcut', 6 | template: '', 7 | host: { 8 | class: 'font-light ml-auto opacity-60 text-xs tracking-widest', 9 | }, 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class HlmCommandShortcutComponent {} 13 | -------------------------------------------------------------------------------- /libs/helm/date-picker/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/date-picker 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/date-picker`. 4 | -------------------------------------------------------------------------------- /libs/helm/date-picker/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/dialog/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/dialog 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/dialog`. 4 | -------------------------------------------------------------------------------- /libs/helm/dialog/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/form-field/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/form-field 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/form-field`. 4 | -------------------------------------------------------------------------------- /libs/helm/form-field/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/form-field/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 | -------------------------------------------------------------------------------- /libs/helm/form-field/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 | -------------------------------------------------------------------------------- /libs/helm/hover-card/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/hover-card 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/hover-card`. 4 | -------------------------------------------------------------------------------- /libs/helm/hover-card/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/hover-card/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmHoverCardContentComponent } from './lib/hlm-hover-card-content.component'; 3 | 4 | export { HlmHoverCardContentComponent } from './lib/hlm-hover-card-content.component'; 5 | 6 | export const HlmHoverCardImports = [HlmHoverCardContentComponent] as const; 7 | 8 | @NgModule({ 9 | imports: [...HlmHoverCardImports], 10 | exports: [...HlmHoverCardImports], 11 | }) 12 | export class HlmHoverCardModule {} 13 | -------------------------------------------------------------------------------- /libs/helm/icon/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/icon 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/icon`. 4 | -------------------------------------------------------------------------------- /libs/helm/icon/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/icon/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 | -------------------------------------------------------------------------------- /libs/helm/input-otp/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/input-otp 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/input-otp`. 4 | -------------------------------------------------------------------------------- /libs/helm/input-otp/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/input-otp/src/lib/hlm-input-otp-fake-caret.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'hlm-input-otp-fake-caret', 5 | standalone: true, 6 | template: ` 7 |
8 | 9 |
10 | `, 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class HlmInputOtpFakeCaretComponent {} 14 | -------------------------------------------------------------------------------- /libs/helm/input-otp/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 | -------------------------------------------------------------------------------- /libs/helm/input-otp/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 | -------------------------------------------------------------------------------- /libs/helm/input/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/input 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/input`. 4 | -------------------------------------------------------------------------------- /libs/helm/input/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/input/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 | -------------------------------------------------------------------------------- /libs/helm/label/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/label 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/label`. 4 | -------------------------------------------------------------------------------- /libs/helm/label/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/label/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 | -------------------------------------------------------------------------------- /libs/helm/menu/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/menu 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/menu`. 4 | -------------------------------------------------------------------------------- /libs/helm/menu/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/menu/src/lib/hlm-menu-group.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, 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 | changeDetection: ChangeDetectionStrategy.OnPush, 15 | }) 16 | export class HlmMenuGroupComponent {} 17 | -------------------------------------------------------------------------------- /libs/helm/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/helm", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/helm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@spartan-ng/helm", 3 | "version": "0.0.1-alpha.461", 4 | "sideEffects": false, 5 | "peerDependencies": { 6 | "@angular/cdk": ">=19.0.0", 7 | "@angular/common": ">=19.0.0", 8 | "@angular/core": ">=19.0.0", 9 | "@angular/forms": ">=19.0.0", 10 | "@angular/router": ">=19.0.0", 11 | "@ng-icons/core": ">=29.0.0", 12 | "@ng-icons/lucide": ">=29.0.0", 13 | "@spartan-ng/brain": "0.0.1-alpha.471", 14 | "class-variance-authority": "^0.7.0", 15 | "clsx": "^2.1.1", 16 | "embla-carousel-angular": ">=19.0.0", 17 | "ngx-sonner": ">=3.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /libs/helm/pagination/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/pagination 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/pagination`. 4 | -------------------------------------------------------------------------------- /libs/helm/pagination/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/popover/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/popover 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/popover`. 4 | -------------------------------------------------------------------------------- /libs/helm/popover/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/popover/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { HlmPopoverCloseDirective } from './lib/hlm-popover-close.directive'; 4 | import { HlmPopoverContentDirective } from './lib/hlm-popover-content.directive'; 5 | 6 | export * from './lib/hlm-popover-close.directive'; 7 | export * from './lib/hlm-popover-content.directive'; 8 | 9 | export const HlmPopoverImports = [HlmPopoverContentDirective, HlmPopoverCloseDirective] as const; 10 | 11 | @NgModule({ 12 | imports: [...HlmPopoverImports], 13 | exports: [...HlmPopoverImports], 14 | }) 15 | export class HlmPopoverModule {} 16 | -------------------------------------------------------------------------------- /libs/helm/progress/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/progress 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/progress`. 4 | -------------------------------------------------------------------------------- /libs/helm/progress/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/progress/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 | -------------------------------------------------------------------------------- /libs/helm/radio-group/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/radio-group 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/radio-group`. 4 | -------------------------------------------------------------------------------- /libs/helm/radio-group/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/scroll-area/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/scroll-area 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/scroll-area`. 4 | -------------------------------------------------------------------------------- /libs/helm/scroll-area/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/scroll-area/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 | -------------------------------------------------------------------------------- /libs/helm/select/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/select 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/select`. 4 | -------------------------------------------------------------------------------- /libs/helm/select/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/select/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 | -------------------------------------------------------------------------------- /libs/helm/separator/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/separator 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/separator`. 4 | -------------------------------------------------------------------------------- /libs/helm/separator/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/separator/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmSeparatorDirective } from './lib/hlm-separator.directive'; 3 | 4 | export * from './lib/hlm-separator.directive'; 5 | 6 | @NgModule({ 7 | imports: [HlmSeparatorDirective], 8 | exports: [HlmSeparatorDirective], 9 | }) 10 | export class HlmSeparatorModule {} 11 | -------------------------------------------------------------------------------- /libs/helm/sheet/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/sheet 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/sheet`. 4 | -------------------------------------------------------------------------------- /libs/helm/sheet/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/skeleton/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/skeleton 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/skeleton`. 4 | -------------------------------------------------------------------------------- /libs/helm/skeleton/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/skeleton/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmSkeletonComponent } from './lib/hlm-skeleton.component'; 3 | 4 | export * from './lib/hlm-skeleton.component'; 5 | 6 | @NgModule({ 7 | imports: [HlmSkeletonComponent], 8 | exports: [HlmSkeletonComponent], 9 | }) 10 | export class HlmSkeletonModule {} 11 | -------------------------------------------------------------------------------- /libs/helm/slider/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/slider 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/slider`. 4 | -------------------------------------------------------------------------------- /libs/helm/slider/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/slider/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 | -------------------------------------------------------------------------------- /libs/helm/sonner/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/sonner 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/sonner`. 4 | -------------------------------------------------------------------------------- /libs/helm/sonner/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/sonner/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { HlmToasterComponent } from './lib/hlm-toaster.component'; 4 | 5 | export * from './lib/hlm-toaster.component'; 6 | 7 | export const HlmToasterImports = [HlmToasterComponent] as const; 8 | 9 | @NgModule({ 10 | imports: [...HlmToasterImports], 11 | exports: [...HlmToasterImports], 12 | }) 13 | export class HlmToasterModule {} 14 | -------------------------------------------------------------------------------- /libs/helm/spinner/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/spinner 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/spinner`. 4 | -------------------------------------------------------------------------------- /libs/helm/spinner/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/spinner/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 | -------------------------------------------------------------------------------- /libs/helm/src/index.ts: -------------------------------------------------------------------------------- 1 | // This file is intentionally left empty. Import from the respective entrypoints. 2 | export default null; 3 | -------------------------------------------------------------------------------- /libs/helm/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; 2 | 3 | setupZoneTestEnv({ 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }); 7 | -------------------------------------------------------------------------------- /libs/helm/switch/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/switch 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/switch`. 4 | -------------------------------------------------------------------------------- /libs/helm/switch/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/switch/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 | -------------------------------------------------------------------------------- /libs/helm/table/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/table 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/table`. 4 | -------------------------------------------------------------------------------- /libs/helm/table/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/tabs/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/tabs 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/tabs`. 4 | -------------------------------------------------------------------------------- /libs/helm/tabs/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/toggle-group/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/toggle-group 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/toggle-group`. 4 | -------------------------------------------------------------------------------- /libs/helm/toggle-group/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/toggle-group/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 | -------------------------------------------------------------------------------- /libs/helm/toggle/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/toggle 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/toggle`. 4 | -------------------------------------------------------------------------------- /libs/helm/toggle/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/toggle/src/index.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { HlmToggleDirective } from './lib/hlm-toggle.directive'; 3 | 4 | export * from './lib/hlm-toggle.directive'; 5 | @NgModule({ 6 | imports: [HlmToggleDirective], 7 | exports: [HlmToggleDirective], 8 | }) 9 | export class HlmToggleModule {} 10 | -------------------------------------------------------------------------------- /libs/helm/tooltip/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/tooltip 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/tooltip`. 4 | -------------------------------------------------------------------------------- /libs/helm/tooltip/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/tooltip/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 | -------------------------------------------------------------------------------- /libs/helm/tooltip/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 | host: { 9 | '[style]': '{display: "contents"}', 10 | }, 11 | hostDirectives: [BrnTooltipDirective], 12 | template: ` 13 | 14 | `, 15 | }) 16 | export class HlmTooltipComponent {} 17 | -------------------------------------------------------------------------------- /libs/helm/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "declarationMap": true, 7 | "inlineSources": true, 8 | "types": [] 9 | }, 10 | "exclude": ["**/*.spec.ts", "test-setup.ts", "jest.config.ts", "**/*.test.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/helm/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": { 7 | "compilationMode": "partial" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /libs/helm/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "target": "es2016", 7 | "types": ["jest", "node"] 8 | }, 9 | "files": ["src/test-setup.ts"], 10 | "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/helm/typography/README.md: -------------------------------------------------------------------------------- 1 | # @spartan-ng/helm/typography 2 | 3 | Secondary entry point of `@spartan-ng/helm`. It can be used by importing from `@spartan-ng/helm/typography`. 4 | -------------------------------------------------------------------------------- /libs/helm/typography/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "lib": { 3 | "entryFile": "src/index.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /libs/helm/typography/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/hlm-blockquote.directive'; 2 | export * from './lib/hlm-code.directive'; 3 | export * from './lib/hlm-h1.directive'; 4 | export * from './lib/hlm-h2.directive'; 5 | export * from './lib/hlm-h3.directive'; 6 | export * from './lib/hlm-h4.directive'; 7 | export * from './lib/hlm-large.directive'; 8 | export * from './lib/hlm-lead.directive'; 9 | export * from './lib/hlm-muted.directive'; 10 | export * from './lib/hlm-p.directive'; 11 | export * from './lib/hlm-small.directive'; 12 | export * from './lib/hlm-ul.directive'; 13 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-h1.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 | export const hlmH1 = 'scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl'; 6 | 7 | @Directive({ 8 | selector: '[hlmH1]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmH1Directive { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmH1, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-h3.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 | export const hlmH3 = 'scroll-m-20 text-2xl font-semibold tracking-tight'; 6 | 7 | @Directive({ 8 | selector: '[hlmH3]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmH3Directive { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmH3, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-h4.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 | export const hlmH4 = 'scroll-m-20 text-xl font-semibold tracking-tight'; 6 | 7 | @Directive({ 8 | selector: '[hlmH4]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmH4Directive { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmH4, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-large.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 | export const hlmLarge = 'text-lg font-semibold'; 6 | 7 | @Directive({ 8 | selector: '[hlmLarge]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmLargeDirective { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmLarge, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-lead.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 | export const hlmLead = 'text-xl text-muted-foreground'; 6 | 7 | @Directive({ 8 | selector: '[hlmLead]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmLeadDirective { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmLead, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-muted.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 | export const hlmMuted = 'text-sm text-muted-foreground'; 6 | 7 | @Directive({ 8 | selector: '[hlmMuted]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmMutedDirective { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmMuted, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-p.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 | export const hlmP = 'leading-7 [&:not(:first-child)]:mt-6'; 6 | 7 | @Directive({ 8 | selector: '[hlmP]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmPDirective { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmP, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-small.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 | export const hlmSmall = 'text-sm font-medium leading-none'; 6 | 7 | @Directive({ 8 | selector: '[hlmSmall]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmSmallDirective { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmSmall, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/helm/typography/src/lib/hlm-ul.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 | export const hlmUl = 'my-6 ml-6 list-disc [&>li]:mt-2'; 6 | 7 | @Directive({ 8 | selector: '[hlmUl]', 9 | standalone: true, 10 | host: { 11 | '[class]': '_computedClass()', 12 | }, 13 | }) 14 | export class HlmUlDirective { 15 | public readonly userClass = input('', { alias: 'class' }); 16 | protected _computedClass = computed(() => hlm(hlmUl, this.userClass())); 17 | } 18 | -------------------------------------------------------------------------------- /libs/tools/README.md: -------------------------------------------------------------------------------- 1 | # tools 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Building 6 | 7 | Run `nx build tools` to build the library. 8 | 9 | ## Running unit tests 10 | 11 | Run `nx test tools` to execute the unit tests via [Jest](https://jestjs.io). 12 | -------------------------------------------------------------------------------- /libs/tools/jest.config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | displayName: 'tools', 3 | preset: '../../jest.preset.cjs', 4 | transform: { 5 | '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], 6 | }, 7 | moduleFileExtensions: ['ts', 'js', 'html'], 8 | coverageDirectory: '../../coverage/libs/tools', 9 | }; 10 | -------------------------------------------------------------------------------- /libs/tools/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@spartan-ng/tools", 3 | "version": "0.0.1-alpha.380", 4 | "private": true, 5 | "type": "commonjs", 6 | "dependencies": { 7 | "@angular/core": "19.2.1", 8 | "@nx/angular": "20.5.0", 9 | "@nx/devkit": "20.5.0", 10 | "@phenomnomnominal/tsquery": "^6.1.3", 11 | "enquirer": "2.3.6", 12 | "jsonc-eslint-parser": "^2.1.0", 13 | "nx": "20.5.0", 14 | "process": "0.11.10", 15 | "ts-morph": "25.0.1", 16 | "tslib": "~2.7.0", 17 | "typescript": "~5.7.3" 18 | }, 19 | "executors": "./executors.json", 20 | "generators": "./generators.json" 21 | } 22 | -------------------------------------------------------------------------------- /libs/tools/src/executors/docs/generate-ui-docs/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface GenerateUiDocsExecutorSchema { 2 | outputDir: string; 3 | outputFile: string; 4 | brainDir: string; 5 | uiDir: string; 6 | } 7 | -------------------------------------------------------------------------------- /libs/tools/src/executors/release/build-update-publish/schema.d.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-empty-object-type 2 | export type BuildUpdatePublishExecutorSchema = {}; 3 | -------------------------------------------------------------------------------- /libs/tools/src/executors/release/build-update-publish/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "version": 2, 4 | "title": "BuildUpdatePublish executor", 5 | "description": "", 6 | "type": "object", 7 | "properties": {} 8 | } 9 | -------------------------------------------------------------------------------- /libs/tools/src/executors/release/helpers/projects.helpers.ts: -------------------------------------------------------------------------------- 1 | import type { ExecutorContext } from '@nx/devkit'; 2 | 3 | export function getProjectName(context: ExecutorContext): string { 4 | return context.projectName; 5 | } 6 | 7 | export function getRoot(context: ExecutorContext): string { 8 | const projectsConfiguration = context.projectsConfigurations.projects; 9 | const projectName = getProjectName(context); 10 | return projectsConfiguration[projectName].root; 11 | } 12 | -------------------------------------------------------------------------------- /libs/tools/src/executors/release/npm-publish/schema.d.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-empty-object-type 2 | export type NpmPublishExecutorSchema = {}; 3 | -------------------------------------------------------------------------------- /libs/tools/src/executors/release/npm-publish/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "version": 2, 4 | "title": "NPM publish executor", 5 | "description": "", 6 | "type": "object", 7 | "properties": {} 8 | } 9 | -------------------------------------------------------------------------------- /libs/tools/src/generators/auto-increment-version/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "AutoIncrementVersionGenerator", 4 | "title": "", 5 | "type": "object", 6 | "properties": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/tools/src/generators/brain-secondary-entrypoint/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface BrainSecondaryEntrypointGeneratorSchema { 2 | name: string; 3 | } 4 | -------------------------------------------------------------------------------- /libs/tools/src/generators/brain-secondary-entrypoint/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "BrainSecondaryEntrypoint", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "name": { 8 | "type": "string", 9 | "description": "The name of the secondary entrypoint to create.", 10 | "$default": { 11 | "$source": "argv", 12 | "index": 0 13 | }, 14 | "x-prompt": "What name would you like to use?" 15 | } 16 | }, 17 | "required": ["name"] 18 | } 19 | -------------------------------------------------------------------------------- /libs/tools/src/generators/helm-component/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HelmComponentGeneratorSchema { 2 | entrypoint: string; 3 | componentName: string; 4 | } 5 | -------------------------------------------------------------------------------- /libs/tools/src/generators/helm-directive/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HelmDirectiveGeneratorSchema { 2 | entrypoint: string; 3 | directiveName: string; 4 | } 5 | -------------------------------------------------------------------------------- /libs/tools/src/generators/helm-documentation/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HelmDocumentationGeneratorSchema { 2 | name: string; 3 | description: string; 4 | } 5 | -------------------------------------------------------------------------------- /libs/tools/src/generators/helm-documentation/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json-schema.org/schema", 3 | "$id": "HelmDocumentation", 4 | "title": "", 5 | "type": "object", 6 | "properties": { 7 | "name": { 8 | "type": "string", 9 | "description": "", 10 | "$default": { 11 | "$source": "argv", 12 | "index": 0 13 | }, 14 | "x-prompt": "What name would you like to use?" 15 | }, 16 | "description": { 17 | "type": "string", 18 | "description": "The description of the library." 19 | } 20 | }, 21 | "required": ["name"] 22 | } 23 | -------------------------------------------------------------------------------- /libs/tools/src/generators/helm-secondary-entrypoint/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HelmSecondaryEntrypointGeneratorSchema { 2 | name: string; 3 | story?: boolean; 4 | documentation?: boolean; 5 | generate?: 'component' | 'directive' | 'none'; 6 | description?: string; 7 | } 8 | -------------------------------------------------------------------------------- /libs/tools/src/generators/helm-story/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HelmStoryGeneratorSchema { 2 | entrypoint: string; 3 | componentName: string; 4 | } 5 | -------------------------------------------------------------------------------- /libs/tools/src/generators/hlm-to-cli-generator/files/generator.ts.template: -------------------------------------------------------------------------------- 1 | import { Tree } from '@nx/devkit'; 2 | import hlmBaseGenerator from '../../../base/generator'; 3 | import type { HlmBaseGeneratorSchema } from '../../../base/schema'; 4 | 5 | export async function generator(tree: Tree, options: HlmBaseGeneratorSchema) { 6 | return await hlmBaseGenerator(tree, {...options, primitiveName: '<%= primitiveName %>', internalName: '<%= internalName %>', publicName: '<%= publicName %>'}); 7 | } 8 | -------------------------------------------------------------------------------- /libs/tools/src/generators/hlm-to-cli-generator/lib/add-primitive-to-supported-ui-libraries.ts: -------------------------------------------------------------------------------- 1 | import type { Tree } from '@nx/devkit'; 2 | import { updateJson } from 'nx/src/generators/utils/json'; 3 | 4 | export const addPrimitiveToSupportedUILibraries = ( 5 | tree: Tree, 6 | supportedJsonPath: string, 7 | generatorName: string, 8 | internalName: string, 9 | peerDependencies: Record, 10 | ) => { 11 | updateJson(tree, supportedJsonPath, (old) => ({ 12 | ...old, 13 | [generatorName]: { 14 | internalName, 15 | peerDependencies, 16 | }, 17 | })); 18 | }; 19 | -------------------------------------------------------------------------------- /libs/tools/src/generators/hlm-to-cli-generator/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface HlmToCliGeneratorGeneratorSchema { 2 | additionalDependencies?: string; 3 | } 4 | -------------------------------------------------------------------------------- /libs/tools/src/generators/hlm-to-cli-generator/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "$id": "HlmToCliGenerator", 4 | "title": "", 5 | "type": "object", 6 | "properties": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/tools/src/generators/replace-cli-version/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "ReplaceCliVersionGenerator", 4 | "title": "", 5 | "type": "object", 6 | "properties": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/tools/src/generators/replace-ui-version/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "version": 2, 4 | "title": "Update version executor", 5 | "description": "", 6 | "type": "object", 7 | "properties": {} 8 | } 9 | -------------------------------------------------------------------------------- /libs/tools/src/index.ts: -------------------------------------------------------------------------------- 1 | console.log('I should not be blank.'); 2 | -------------------------------------------------------------------------------- /libs/tools/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "module": "commonjs" 5 | }, 6 | "files": [], 7 | "include": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | }, 12 | { 13 | "path": "./tsconfig.spec.json" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /libs/tools/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "types": ["node"] 7 | }, 8 | "include": ["src/**/*.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /libs/tools/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /libs/trpc/README.md: -------------------------------------------------------------------------------- 1 | # tRPC 2 | 3 | Spartan tRPC integration 4 | 5 | Learn more at [spartan.ng](https://spartan.ng) 6 | -------------------------------------------------------------------------------- /libs/trpc/migrations/migration.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", 3 | "schematics": {}, 4 | "packageJsonUpdates": { 5 | "0.2.30": { 6 | "version": "0.2.29", 7 | "description": "Updates the superjson dependency from 1.x to 2.x", 8 | "packages": { 9 | "superjson": { 10 | "version": "^2.2.1", 11 | "alwaysAddToPackageJson": true 12 | } 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /libs/trpc/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/trpc", 4 | "assets": ["*.md", "migrations/migration.json"], 5 | "lib": { 6 | "entryFile": "src/index.ts" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /libs/trpc/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/client/client'; 2 | export * from './lib/server/server'; 3 | export * from './lib/utils/wait-for'; 4 | 5 | export { CreateTrpcProxyClient } from './lib/client/trpc-rxjs-proxy'; 6 | -------------------------------------------------------------------------------- /libs/trpc/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@analogjs/vite-plugin-angular/setup-vitest'; 2 | import '@angular/compiler'; 3 | 4 | /** 5 | * Initialize TestBed for all tests inside of router 6 | */ 7 | import { TestBed } from '@angular/core/testing'; 8 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); 11 | -------------------------------------------------------------------------------- /libs/trpc/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "declarationMap": true, 7 | "inlineSources": true, 8 | "types": ["node"] 9 | }, 10 | "exclude": ["src/**/*.spec.ts", "jest.config.ts", "src/**/*.test.ts"], 11 | "include": ["src/**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/trpc/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": { 7 | "compilationMode": "partial" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /libs/trpc/vite.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { defineConfig } from 'vite'; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig(({ mode }) => { 7 | return { 8 | root: 'src', 9 | test: { 10 | passWithNoTests: true, 11 | globals: true, 12 | environment: 'jsdom', 13 | setupFiles: ['src/test-setup.ts'], 14 | include: ['**/*.spec.ts'], 15 | cache: { 16 | dir: '../../node_modules/.vitest', 17 | }, 18 | }, 19 | define: { 20 | 'import.meta.vitest': mode !== 'production', 21 | }, 22 | }; 23 | }); 24 | -------------------------------------------------------------------------------- /tools/eslint-rules/jest.config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | displayName: 'eslint-rules', 3 | preset: '../../jest.preset.cjs', 4 | transform: { 5 | '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], 6 | }, 7 | moduleFileExtensions: ['ts', 'js', 'html'], 8 | coverageDirectory: '../../coverage/tools/eslint-rules', 9 | }; 10 | -------------------------------------------------------------------------------- /tools/eslint-rules/project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-rules", 3 | "$schema": "../../node_modules/nx/schemas/project-schema.json", 4 | "sourceRoot": "tools/eslint-rules", 5 | "targets": { 6 | "test": { 7 | "executor": "@nx/jest:jest", 8 | "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], 9 | "options": { 10 | "jestConfig": "tools/eslint-rules/jest.config.ts" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tools/eslint-rules/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "moduleResolution": "node16", 5 | "module": "node16" 6 | }, 7 | "files": [], 8 | "include": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.lint.json" 12 | }, 13 | { 14 | "path": "./tsconfig.spec.json" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /tools/eslint-rules/tsconfig.lint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": ["node"] 6 | }, 7 | "exclude": ["**/*.spec.ts"], 8 | "include": ["**/*.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /tools/eslint-rules/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": ["jest", "node"] 6 | }, 7 | "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /tools/scripts/drizzle-migrate.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'drizzle-kit'; 2 | 3 | export default defineConfig({ 4 | dialect: 'postgresql', 5 | dbCredentials: { 6 | url: `${process.env['DATABASE_URL']}`, 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /tools/tsconfig.tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../dist/out-tsc/tools", 5 | "rootDir": ".", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": ["node"], 9 | "importHelpers": false 10 | }, 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /zerops-import-example.yml: -------------------------------------------------------------------------------- 1 | project: 2 | name: spartan-ng 3 | corePackage: LIGHT 4 | tags: 5 | - spartan-recipe 6 | 7 | services: 8 | - hostname: db 9 | type: postgresql@16 10 | mode: NON_HA 11 | priority: 100 12 | 13 | - hostname: spartanng 14 | type: nodejs@22 15 | buildFromGit: https://github.com/spartan-ng/spartan 16 | enableSubdomainAccess: true 17 | verticalAutoscaling: 18 | minRam: 0.50 19 | --------------------------------------------------------------------------------