@star-ng/ui 0.0.0-placeholder.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +147 -3
- package/fesm2022/star-ng-ui-accordion.mjs +376 -0
- package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
- package/fesm2022/star-ng-ui-autocomplete.mjs +782 -0
- package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
- package/fesm2022/star-ng-ui-avatar.mjs +154 -0
- package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
- package/fesm2022/star-ng-ui-badge.mjs +153 -0
- package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
- package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
- package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/star-ng-ui-button.mjs +282 -0
- package/fesm2022/star-ng-ui-button.mjs.map +1 -0
- package/fesm2022/star-ng-ui-card.mjs +112 -0
- package/fesm2022/star-ng-ui-card.mjs.map +1 -0
- package/fesm2022/star-ng-ui-chart.mjs +1904 -0
- package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
- package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
- package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
- package/fesm2022/star-ng-ui-core.mjs +392 -0
- package/fesm2022/star-ng-ui-core.mjs.map +1 -0
- package/fesm2022/star-ng-ui-data-display.mjs +1556 -0
- package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
- package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
- package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
- package/fesm2022/star-ng-ui-dialog.mjs +948 -0
- package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
- package/fesm2022/star-ng-ui-drawer.mjs +158 -0
- package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
- package/fesm2022/star-ng-ui-editor.mjs +416 -0
- package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
- package/fesm2022/star-ng-ui-field.mjs +378 -0
- package/fesm2022/star-ng-ui-field.mjs.map +1 -0
- package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
- package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
- package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
- package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
- package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
- package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-group.mjs +188 -0
- package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
- package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-number.mjs +691 -0
- package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
- package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
- package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
- package/fesm2022/star-ng-ui-knob.mjs +514 -0
- package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
- package/fesm2022/star-ng-ui-layout.mjs +608 -0
- package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
- package/fesm2022/star-ng-ui-listbox.mjs +978 -0
- package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
- package/fesm2022/star-ng-ui-media.mjs +833 -0
- package/fesm2022/star-ng-ui-media.mjs.map +1 -0
- package/fesm2022/star-ng-ui-menu.mjs +1840 -0
- package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
- package/fesm2022/star-ng-ui-message.mjs +191 -0
- package/fesm2022/star-ng-ui-message.mjs.map +1 -0
- package/fesm2022/star-ng-ui-paginator.mjs +387 -0
- package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
- package/fesm2022/star-ng-ui-panel.mjs +324 -0
- package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
- package/fesm2022/star-ng-ui-password.mjs +517 -0
- package/fesm2022/star-ng-ui-password.mjs.map +1 -0
- package/fesm2022/star-ng-ui-popover.mjs +241 -0
- package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
- package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
- package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
- package/fesm2022/star-ng-ui-radio.mjs +411 -0
- package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
- package/fesm2022/star-ng-ui-rating.mjs +211 -0
- package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
- package/fesm2022/star-ng-ui-select-button.mjs +613 -0
- package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
- package/fesm2022/star-ng-ui-select.mjs +2523 -0
- package/fesm2022/star-ng-ui-select.mjs.map +1 -0
- package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
- package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
- package/fesm2022/star-ng-ui-slider.mjs +552 -0
- package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
- package/fesm2022/star-ng-ui-spinner.mjs +148 -0
- package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
- package/fesm2022/star-ng-ui-stepper.mjs +360 -0
- package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
- package/fesm2022/star-ng-ui-table.mjs +3477 -0
- package/fesm2022/star-ng-ui-table.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tabs.mjs +464 -0
- package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tag.mjs +129 -0
- package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
- package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
- package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
- package/fesm2022/star-ng-ui-theme.mjs +98 -0
- package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
- package/fesm2022/star-ng-ui-toast.mjs +298 -0
- package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
- package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
- package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
- package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
- package/fesm2022/star-ng-ui-transloco.mjs +40 -0
- package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tree.mjs +1446 -0
- package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
- package/fesm2022/star-ng-ui-utility.mjs +2134 -0
- package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
- package/fesm2022/star-ng-ui.mjs +51 -0
- package/package.json +281 -5
- package/styles/_base.scss +70 -0
- package/styles/_shared.scss +2 -0
- package/styles/_tokens.scss +190 -0
- package/styles/controls/_accordion.scss +75 -0
- package/styles/controls/_autocomplete.scss +44 -0
- package/styles/controls/_avatar.scss +39 -0
- package/styles/controls/_breadcrumb.scss +45 -0
- package/styles/controls/_button.scss +137 -0
- package/styles/controls/_card.scss +38 -0
- package/styles/controls/_chart.scss +214 -0
- package/styles/controls/_chip.scss +51 -0
- package/styles/controls/_choice.scss +153 -0
- package/styles/controls/_data-display.scss +118 -0
- package/styles/controls/_date-picker.scss +300 -0
- package/styles/controls/_dialog.scss +123 -0
- package/styles/controls/_drawer.scss +118 -0
- package/styles/controls/_editor.scss +74 -0
- package/styles/controls/_field.scss +92 -0
- package/styles/controls/_file-upload.scss +136 -0
- package/styles/controls/_input-group.scss +104 -0
- package/styles/controls/_input-mask.scss +46 -0
- package/styles/controls/_input-number.scss +125 -0
- package/styles/controls/_knob.scss +76 -0
- package/styles/controls/_layout.scss +182 -0
- package/styles/controls/_listbox.scss +38 -0
- package/styles/controls/_media.scss +222 -0
- package/styles/controls/_menu.scss +254 -0
- package/styles/controls/_message.scss +48 -0
- package/styles/controls/_org-chart.scss +128 -0
- package/styles/controls/_paginator.scss +59 -0
- package/styles/controls/_panel.scss +83 -0
- package/styles/controls/_popover.scss +40 -0
- package/styles/controls/_progress-bar.scss +74 -0
- package/styles/controls/_select-button.scss +61 -0
- package/styles/controls/_select.scss +216 -0
- package/styles/controls/_skeleton.scss +43 -0
- package/styles/controls/_slider.scss +163 -0
- package/styles/controls/_spinner.scss +34 -0
- package/styles/controls/_stepper.scss +109 -0
- package/styles/controls/_table.scss +523 -0
- package/styles/controls/_tabs.scss +93 -0
- package/styles/controls/_tag.scss +84 -0
- package/styles/controls/_toast.scss +141 -0
- package/styles/controls/_tooltip.scss +14 -0
- package/styles/controls/_tree.scss +113 -0
- package/styles/controls/_utility.scss +654 -0
- package/styles/star-ng.css +5803 -0
- package/styles/star-ng.min.css +1 -0
- package/styles/star-ng.scss +50 -0
- package/theme/star-theme-first-paint.js +1 -0
- package/types/star-ng-ui-accordion.d.ts +82 -0
- package/types/star-ng-ui-autocomplete.d.ts +171 -0
- package/types/star-ng-ui-avatar.d.ts +43 -0
- package/types/star-ng-ui-badge.d.ts +46 -0
- package/types/star-ng-ui-breadcrumb.d.ts +39 -0
- package/types/star-ng-ui-button.d.ts +79 -0
- package/types/star-ng-ui-card.d.ts +29 -0
- package/types/star-ng-ui-chart.d.ts +337 -0
- package/types/star-ng-ui-checkbox.d.ts +92 -0
- package/types/star-ng-ui-core.d.ts +310 -0
- package/types/star-ng-ui-data-display.d.ts +339 -0
- package/types/star-ng-ui-date-picker.d.ts +701 -0
- package/types/star-ng-ui-dialog.d.ts +254 -0
- package/types/star-ng-ui-drawer.d.ts +29 -0
- package/types/star-ng-ui-editor.d.ts +96 -0
- package/types/star-ng-ui-field.d.ts +146 -0
- package/types/star-ng-ui-file-upload.d.ts +192 -0
- package/types/star-ng-ui-i18n-de.d.ts +7 -0
- package/types/star-ng-ui-i18n-es.d.ts +7 -0
- package/types/star-ng-ui-input-group.d.ts +58 -0
- package/types/star-ng-ui-input-mask.d.ts +126 -0
- package/types/star-ng-ui-input-number.d.ts +193 -0
- package/types/star-ng-ui-input-otp.d.ts +86 -0
- package/types/star-ng-ui-input-tags.d.ts +159 -0
- package/types/star-ng-ui-knob.d.ts +121 -0
- package/types/star-ng-ui-layout.d.ts +154 -0
- package/types/star-ng-ui-listbox.d.ts +197 -0
- package/types/star-ng-ui-media.d.ts +161 -0
- package/types/star-ng-ui-menu.d.ts +332 -0
- package/types/star-ng-ui-message.d.ts +52 -0
- package/types/star-ng-ui-paginator.d.ts +85 -0
- package/types/star-ng-ui-panel.d.ts +65 -0
- package/types/star-ng-ui-password.d.ts +129 -0
- package/types/star-ng-ui-popover.d.ts +57 -0
- package/types/star-ng-ui-progress-bar.d.ts +49 -0
- package/types/star-ng-ui-radio.d.ts +116 -0
- package/types/star-ng-ui-rating.d.ts +52 -0
- package/types/star-ng-ui-select-button.d.ts +169 -0
- package/types/star-ng-ui-select.d.ts +540 -0
- package/types/star-ng-ui-skeleton.d.ts +47 -0
- package/types/star-ng-ui-slider.d.ts +145 -0
- package/types/star-ng-ui-spinner.d.ts +29 -0
- package/types/star-ng-ui-stepper.d.ts +89 -0
- package/types/star-ng-ui-table.d.ts +829 -0
- package/types/star-ng-ui-tabs.d.ts +109 -0
- package/types/star-ng-ui-tag.d.ts +35 -0
- package/types/star-ng-ui-theme-switch.d.ts +36 -0
- package/types/star-ng-ui-theme.d.ts +95 -0
- package/types/star-ng-ui-toast.d.ts +84 -0
- package/types/star-ng-ui-toggle-switch.d.ts +81 -0
- package/types/star-ng-ui-tooltip.d.ts +66 -0
- package/types/star-ng-ui-transloco.d.ts +14 -0
- package/types/star-ng-ui-tree.d.ts +310 -0
- package/types/star-ng-ui-utility.d.ts +533 -0
- package/types/star-ng-ui.d.ts +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-ng-ui-menu.mjs","names":[],"sources":["../../../projects/star-ng/menu/menu.ts","../../../projects/star-ng/menu/mega-menu.ts","../../../projects/star-ng/menu/menubar.ts","../../../projects/star-ng/menu/panel-menu.ts"],"sourcesContent":["import { CdkContextMenuTrigger, CdkMenu, CdkMenuItem, CdkMenuTrigger } from '@angular/cdk/menu';\nimport { ConnectedPosition, FlexibleConnectedPositionStrategy } from '@angular/cdk/overlay';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n output,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink } from '@angular/router';\nimport { StarButton, StarButtonSize, StarButtonVariant } from '@star-ng/ui/button';\nimport { STAR_UI_TEXT, StarDirectionService } from '@star-ng/ui/core';\n\n/** One menu entry (PrimeNG `MenuItem`). `items` makes a submenu (tiered menu). */\nexport interface StarMenuItem {\n readonly label?: string;\n /** Phosphor icon class, for example `ph-bold ph-pencil-simple`. */\n readonly icon?: string;\n readonly command?: (item: StarMenuItem) => void;\n /** Router link; renders the entry as an `<a>`. */\n readonly routerLink?: string | readonly unknown[];\n /** External link; renders an `<a href>`. */\n readonly url?: string;\n readonly disabled?: boolean;\n /** Renders a divider instead of an entry. */\n readonly separator?: boolean;\n /** Danger styling, for destructive actions. */\n readonly danger?: boolean;\n /** Keyboard hint shown at the end, for example `Ctrl+E`. */\n readonly shortcut?: string;\n readonly items?: readonly StarMenuItem[];\n}\n\nexport const STAR_MENU_POSITIONS: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n];\n\n/**\n * Makes the popup of a CDK menu trigger usable inside a modal `<dialog>`.\n *\n * A modal dialog makes the rest of the page inert. CDK puts a menu popup in the overlay\n * container, outside the dialog, so the popup shows but takes no click and no key. When the\n * trigger is inside a `<dialog>`, the popup goes into that dialog instead.\n *\n * CDK has no public option for this on `CdkMenuTrigger`, so this wraps its position\n * strategy factory. If a CDK update removes that factory, this does nothing and the e2e test\n * \"popups inside a modal dialog\" fails.\n */\nexport function keepMenuInsideDialog(\n trigger: CdkMenuTrigger | CdkContextMenuTrigger,\n element: HTMLElement,\n): void {\n const target = trigger as unknown as {\n // The context menu trigger passes the pointer coordinates; the menu trigger passes nothing.\n _getOverlayPositionStrategy?: (...args: unknown[]) => FlexibleConnectedPositionStrategy;\n };\n const create = target._getOverlayPositionStrategy;\n if (typeof create !== 'function') return;\n target._getOverlayPositionStrategy = (...args: unknown[]) => {\n const strategy = create.apply(trigger, args);\n const dialog = element.closest('dialog');\n return dialog ? strategy.withPopoverLocation({ type: 'parent', element: dialog }) : strategy;\n };\n}\n\n/**\n * Applies `keepMenuInsideDialog` to every `cdkMenuTriggerFor` in a template that imports it\n * (submenus, menu bar items, cascade select).\n */\n// The selector is the CDK attribute on purpose: the directive adds behaviour to that trigger.\n// eslint-disable-next-line @angular-eslint/directive-selector\n@Directive({ selector: '[cdkMenuTriggerFor]' })\nexport class StarMenuInDialog {\n constructor() {\n keepMenuInsideDialog(\n inject(CdkMenuTrigger),\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement,\n );\n }\n}\n\n/**\n * Menu (PrimeNG `p-menu` + `p-tieredmenu`) on CDK Menu: roving focus, typeahead, submenus\n * with pointer aim, Escape and focus return come from `@angular/cdk/menu`.\n *\n * Popup: `<star-button [starMenuTrigger]=\"rowMenu\">…</star-button> <star-menu #rowMenu [items]=\"actions\" />`\n * Inline: `<star-menu inline [items]=\"nav\" />`\n *\n * The popup is a native popover. Inside a modal `star-dialog` it goes into the dialog\n * (`keepMenuInsideDialog`), so it stays usable there.\n */\n@Component({\n selector: 'star-menu',\n imports: [CdkMenu, CdkMenuItem, CdkMenuTrigger, NgTemplateOutlet, RouterLink, StarMenuInDialog],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-menu-host' },\n template: `\n <ng-template #menu let-items>\n <!-- Items must be direct template children of cdkMenu: CDK resolves the menu by DI. -->\n <div class=\"star-menu\" cdkMenu [attr.aria-label]=\"ariaLabel()\">\n @for (item of items; track $index) {\n @if (item.separator) {\n <div class=\"star-menu__separator\" role=\"separator\"></div>\n } @else if (item.items?.length) {\n <button\n type=\"button\"\n class=\"star-menu__item\"\n cdkMenuItem\n [cdkMenuTriggerFor]=\"menu\"\n [cdkMenuTriggerData]=\"{ $implicit: item.items }\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n <i\n class=\"ph-bold ph-caret-right star-menu__sub star-icon-mirror\"\n aria-hidden=\"true\"\n ></i>\n </button>\n } @else if (item.routerLink) {\n <a\n class=\"star-menu__item\"\n cdkMenuItem\n [class.star-menu__item--danger]=\"item.danger\"\n [routerLink]=\"item.routerLink\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </a>\n } @else if (item.url) {\n <a\n class=\"star-menu__item\"\n cdkMenuItem\n [href]=\"item.url\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"star-menu__item\"\n cdkMenuItem\n [class.star-menu__item--danger]=\"item.danger\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </button>\n }\n }\n </div>\n </ng-template>\n\n <ng-template #content let-item>\n @if (item.icon) {\n <i class=\"star-menu__icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-menu__label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <kbd class=\"star-menu__shortcut\">{{ item.shortcut }}</kbd>\n }\n </ng-template>\n\n @if (inline()) {\n <ng-container *ngTemplateOutlet=\"menu; context: { $implicit: items() }\" />\n }\n `,\n})\nexport class StarMenu {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n readonly items = input<readonly StarMenuItem[]>([]);\n /** Renders the menu in place instead of as a popup. */\n readonly inline = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null);\n readonly itemClick = output<StarMenuItem>();\n\n /** Root menu template, opened by `starMenuTrigger`. */\n readonly template = viewChild.required<TemplateRef<unknown>>('menu');\n\n protected run(item: StarMenuItem): void {\n if (item.disabled) return;\n item.command?.(item);\n this.itemClick.emit(item);\n }\n}\n\n/**\n * Opens an `star-menu` as a popup from any element (button, icon button, row action).\n * Adds `aria-haspopup`, `aria-expanded`, Arrow Down / Enter / Space to open.\n */\n@Directive({\n selector: '[starMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkMenuTrigger,\n outputs: ['cdkMenuOpened: menuOpened', 'cdkMenuClosed: menuClosed'],\n },\n ],\n})\nexport class StarMenuTrigger {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n readonly starMenuTrigger = input.required<StarMenu>();\n private readonly trigger = inject(CdkMenuTrigger);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n constructor() {\n this.trigger.menuPosition = STAR_MENU_POSITIONS;\n keepMenuInsideDialog(this.trigger, this.host.nativeElement);\n effect(() => {\n const menu = this.starMenuTrigger();\n this.trigger.menuTemplateRef = menu.template();\n this.trigger.menuData = { $implicit: menu.items() };\n });\n afterNextRender(() => this.syncInnerButton(false));\n this.trigger.opened.pipe(takeUntilDestroyed()).subscribe(() => this.syncInnerButton(true));\n this.trigger.closed.pipe(takeUntilDestroyed()).subscribe(() => this.syncInnerButton(false));\n this.adaptWrapperHost();\n }\n\n /**\n * CDK opens a menu on Enter or Space itself, unless the host is a native button (then the\n * native click does it). On a wrapper such as `<star-button>` the host is no button, so CDK\n * would toggle on the key and the native click of the inner button would toggle again: the\n * menu opens and closes at once. The key stays with the inner button; its click opens the menu.\n * (Arrow down and Arrow up are still handled by CDK.)\n *\n * CDK also calls `focus()` on the host to return the focus when the menu closes. A wrapper\n * cannot take focus, so the call goes to the inner button.\n */\n private adaptWrapperHost(): void {\n const host = this.host.nativeElement;\n if (host.matches('button, a')) return;\n host.focus = (options?: FocusOptions) => host.querySelector('button')?.focus(options);\n host.addEventListener(\n 'keydown',\n (event) => {\n const inner = (event.target as HTMLElement | null)?.closest('button');\n if (inner && host.contains(inner) && (event.key === 'Enter' || event.key === ' ')) {\n event.stopPropagation();\n }\n },\n true,\n );\n }\n\n /**\n * On a wrapper such as `<star-button>`, the real button is inside the host. CDK gives the\n * host `role=\"button\"`, which makes two nested buttons for assistive technology. The host\n * becomes presentational and the inner button gets the popup state.\n */\n private syncInnerButton(open: boolean): void {\n const host = this.host.nativeElement;\n if (host.matches('button, a')) return;\n const inner = host.querySelector('button');\n if (!inner) return;\n host.setAttribute('role', 'none');\n inner.setAttribute('aria-haspopup', 'menu');\n inner.setAttribute('aria-expanded', String(open));\n }\n}\n\n/**\n * Split button (PrimeNG `p-splitbutton`): a main action plus a menu of related actions.\n * `<star-split-button label=\"Send response\" [items]=\"sendOptions\" (pressed)=\"send()\" />`\n */\n@Component({\n selector: 'star-split-button',\n imports: [StarButton, StarMenu, StarMenuTrigger],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-split' },\n template: `\n <star-button\n class=\"star-split__main\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [leadingIcon]=\"icon()\"\n [disabled]=\"disabled()\"\n (pressed)=\"pressed.emit($event)\"\n >\n {{ label() }}\n </star-button>\n <button\n type=\"button\"\n class=\"star-btn star-split__toggle\"\n [class]=\"'star-btn star-split__toggle star-btn--' + variant() + ' star-btn--' + size()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"text.moreActions\"\n [starMenuTrigger]=\"menu\"\n >\n <i class=\"ph-bold ph-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <star-menu #menu [items]=\"items()\" (itemClick)=\"itemClick.emit($event)\" />\n `,\n})\nexport class StarSplitButton {\n protected readonly text = inject(STAR_UI_TEXT);\n readonly label = input.required<string>();\n readonly icon = input<string | null>(null);\n readonly items = input<readonly StarMenuItem[]>([]);\n readonly variant = input<StarButtonVariant>('primary');\n readonly size = input<StarButtonSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly pressed = output<MouseEvent>();\n readonly itemClick = output<StarMenuItem>();\n}\n","import { CdkMenu, CdkMenuBar, CdkMenuGroup, CdkMenuItem, CdkMenuTrigger } from '@angular/cdk/menu';\nimport { ChangeDetectionStrategy, Component, inject, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { StarDirectionService } from '@star-ng/ui/core';\nimport { STAR_MENU_POSITIONS, StarMenuInDialog, StarMenuItem } from './menu';\n\n/**\n * Mega menu (PrimeNG `p-megamenu`) on CDK Menu Bar: a top-level item opens one wide panel\n * with its child items as columns. Three levels of `StarMenuItem`:\n *\n * 1. top-level item (the bar),\n * 2. its `items`: the columns (`label` is the column heading),\n * 3. each column's `items`: the links or actions.\n *\n * A top-level item without `items` is a plain link or action. Keyboard: Left / Right on the\n * bar, Down opens a panel, Up / Down move through all items of the panel, Escape closes.\n *\n * `<star-mega-menu ariaLabel=\"Products\" [items]=\"catalogue\" />`\n */\n@Component({\n selector: 'star-mega-menu',\n imports: [\n CdkMenu,\n CdkMenuBar,\n CdkMenuGroup,\n CdkMenuItem,\n CdkMenuTrigger,\n RouterLink,\n StarMenuInDialog,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-menubar star-mega-menu' },\n // CDK resolves the menu of an item by DI, so every `cdkMenuItem` is written in place:\n // a shared `ng-template` for the items would be outside the menu.\n template: `\n <div class=\"star-menubar__bar\" cdkMenuBar [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track $index) {\n @if (item.items?.length) {\n <button\n type=\"button\"\n class=\"star-menubar__item\"\n cdkMenuItem\n [cdkMenuTriggerFor]=\"panel\"\n [cdkMenuTriggerData]=\"{ $implicit: item.items }\"\n [cdkMenuPosition]=\"positions\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n <i class=\"ph-bold ph-caret-down star-menubar__caret\" aria-hidden=\"true\"></i>\n </button>\n } @else if (item.routerLink) {\n <a\n class=\"star-menubar__item\"\n cdkMenuItem\n [routerLink]=\"item.routerLink\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"star-menubar__item\"\n cdkMenuItem\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n </button>\n }\n }\n </div>\n\n <ng-template #panel let-columns>\n <div class=\"star-menu star-mega-menu__panel\" cdkMenu>\n @for (column of columns; track $index; let c = $index) {\n <div\n class=\"star-mega-menu__column\"\n cdkMenuGroup\n [attr.aria-labelledby]=\"column.label ? panelId + '-' + c : null\"\n >\n @if (column.label) {\n <div class=\"star-mega-menu__heading\" [id]=\"panelId + '-' + c\">{{ column.label }}</div>\n }\n @for (entry of column.items ?? []; track $index) {\n @if (entry.separator) {\n <div class=\"star-menu__separator\" role=\"separator\"></div>\n } @else if (entry.routerLink) {\n <a\n class=\"star-menu__item\"\n cdkMenuItem\n [routerLink]=\"entry.routerLink\"\n [cdkMenuItemDisabled]=\"!!entry.disabled\"\n (cdkMenuItemTriggered)=\"run(entry)\"\n >\n @if (entry.icon) {\n <i class=\"star-menu__icon\" [class]=\"entry.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-menu__label\">{{ entry.label }}</span>\n </a>\n } @else if (entry.url) {\n <a\n class=\"star-menu__item\"\n cdkMenuItem\n [href]=\"entry.url\"\n [cdkMenuItemDisabled]=\"!!entry.disabled\"\n (cdkMenuItemTriggered)=\"run(entry)\"\n >\n @if (entry.icon) {\n <i class=\"star-menu__icon\" [class]=\"entry.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-menu__label\">{{ entry.label }}</span>\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"star-menu__item\"\n cdkMenuItem\n [class.star-menu__item--danger]=\"entry.danger\"\n [cdkMenuItemDisabled]=\"!!entry.disabled\"\n (cdkMenuItemTriggered)=\"run(entry)\"\n >\n @if (entry.icon) {\n <i class=\"star-menu__icon\" [class]=\"entry.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-menu__label\">{{ entry.label }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n `,\n})\nexport class StarMegaMenu {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n readonly items = input<readonly StarMenuItem[]>([]);\n readonly ariaLabel = input<string | null>(null);\n readonly itemClick = output<StarMenuItem>();\n\n protected readonly positions = STAR_MENU_POSITIONS;\n protected readonly panelId = `star-mega-${Math.random().toString(36).slice(2)}`;\n\n protected run(item: StarMenuItem): void {\n if (item.disabled) return;\n item.command?.(item);\n this.itemClick.emit(item);\n }\n}\n","import { CdkContextMenuTrigger, CdkMenuBar, CdkMenuItem, CdkMenuTrigger } from '@angular/cdk/menu';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { StarDirectionService } from '@star-ng/ui/core';\nimport {\n keepMenuInsideDialog,\n STAR_MENU_POSITIONS,\n StarMenu,\n StarMenuInDialog,\n StarMenuItem,\n} from './menu';\n\n/**\n * Menu bar (PrimeNG `p-menubar`) on CDK Menu Bar: top-level items with dropdown submenus,\n * Left / Right between items, Down opens, typeahead, Escape closes. Uses `star-menu` for the\n * submenus, so nesting works to any depth.\n *\n * `<star-menubar ariaLabel=\"Main\" [items]=\"nav\"><star-button starMenubarEnd>…</star-button></star-menubar>`\n */\n@Component({\n selector: 'star-menubar',\n imports: [\n CdkMenuBar,\n CdkMenuItem,\n CdkMenuTrigger,\n RouterLink,\n RouterLinkActive,\n StarMenu,\n StarMenuInDialog,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-menubar' },\n template: `\n <ng-content select=\"[starMenubarStart]\" />\n <div class=\"star-menubar__bar\" cdkMenuBar [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track $index) {\n @if (item.items?.length) {\n <button\n type=\"button\"\n class=\"star-menubar__item\"\n cdkMenuItem\n [cdkMenuTriggerFor]=\"submenu.template()\"\n [cdkMenuTriggerData]=\"{ $implicit: item.items }\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n <i class=\"ph-bold ph-caret-down star-menubar__caret\" aria-hidden=\"true\"></i>\n </button>\n } @else if (item.routerLink) {\n <a\n class=\"star-menubar__item\"\n cdkMenuItem\n routerLinkActive=\"star-menubar__item--active\"\n [routerLink]=\"item.routerLink\"\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"star-menubar__item\"\n cdkMenuItem\n [cdkMenuItemDisabled]=\"!!item.disabled\"\n (cdkMenuItemTriggered)=\"run(item)\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n </button>\n }\n }\n </div>\n <span class=\"star-menubar__end\"><ng-content select=\"[starMenubarEnd]\" /></span>\n <star-menu #submenu (itemClick)=\"itemClick.emit($event)\" />\n `,\n})\nexport class StarMenubar {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n readonly items = input<readonly StarMenuItem[]>([]);\n readonly ariaLabel = input<string | null>(null);\n readonly itemClick = output<StarMenuItem>();\n\n protected run(item: StarMenuItem): void {\n if (item.disabled) return;\n item.command?.(item);\n this.itemClick.emit(item);\n }\n}\n\n/**\n * Right-click (and Shift+F10 / context-menu key) menu on any element (PrimeNG `p-contextmenu`).\n * `<tr [starContextMenu]=\"rowMenu\">…</tr> <star-menu #rowMenu [items]=\"rowActions\" />`\n *\n * Inside a modal `star-dialog` the menu goes into the dialog (`keepMenuInsideDialog`).\n */\n@Directive({\n selector: '[starContextMenu]',\n hostDirectives: [\n {\n directive: CdkContextMenuTrigger,\n outputs: ['cdkContextMenuOpened: menuOpened', 'cdkContextMenuClosed: menuClosed'],\n },\n ],\n})\nexport class StarContextMenu {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n readonly starContextMenu = input.required<StarMenu>();\n private readonly trigger = inject(CdkContextMenuTrigger);\n\n constructor() {\n this.trigger.menuPosition = STAR_MENU_POSITIONS;\n keepMenuInsideDialog(this.trigger, inject<ElementRef<HTMLElement>>(ElementRef).nativeElement);\n effect(() => {\n const menu = this.starContextMenu();\n this.trigger.menuTemplateRef = menu.template();\n this.trigger.menuData = { $implicit: menu.items() };\n });\n }\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { StarMenuItem } from './menu';\n\n/**\n * Panel menu (PrimeNG `p-panelmenu`): a vertical menu where an item with child items opens\n * and closes in place, to any depth. Use it for side navigation with sections.\n *\n * Each parent is a button with `aria-expanded`; each leaf is a link or a button. Tab moves\n * through the open items; Enter or Space opens a section or runs an item.\n *\n * `<star-panel-menu ariaLabel=\"Settings\" [items]=\"sections\" [(expandedKeys)]=\"open\" />`\n *\n * An item is identified by its position (`0`, `0.2`, `1.0.3`) in `expandedKeys`.\n */\n@Component({\n selector: 'star-panel-menu',\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-panel-menu' },\n template: `\n <nav [attr.aria-label]=\"ariaLabel()\">\n <ng-container *ngTemplateOutlet=\"list; context: { $implicit: items(), path: '', level: 0 }\" />\n </nav>\n\n <ng-template #list let-entries let-path=\"path\" let-level=\"level\">\n <ul class=\"star-panel-menu__list\" [class.star-panel-menu__list--nested]=\"level > 0\">\n @for (item of entries; track $index; let i = $index) {\n @let key = path ? path + '.' + i : '' + i;\n @if (item.separator) {\n <li class=\"star-panel-menu__separator\" role=\"separator\"></li>\n } @else if (item.items?.length) {\n <li>\n <button\n type=\"button\"\n class=\"star-panel-menu__item star-panel-menu__item--parent\"\n [class.star-panel-menu__item--root]=\"level === 0\"\n [style.--star-level]=\"level\"\n [disabled]=\"item.disabled\"\n [attr.aria-expanded]=\"isOpen(key)\"\n [attr.aria-controls]=\"isOpen(key) ? regionId(key) : null\"\n (click)=\"toggle(key)\"\n >\n @if (item.icon) {\n <i class=\"star-panel-menu__icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-panel-menu__label\">{{ item.label }}</span>\n <i class=\"ph-bold ph-caret-down star-panel-menu__caret\" aria-hidden=\"true\"></i>\n </button>\n @if (isOpen(key)) {\n <div [id]=\"regionId(key)\">\n <ng-container\n *ngTemplateOutlet=\"\n list;\n context: { $implicit: item.items, path: key, level: level + 1 }\n \"\n />\n </div>\n }\n </li>\n } @else if (item.routerLink) {\n <li>\n <a\n class=\"star-panel-menu__item\"\n routerLinkActive=\"star-panel-menu__item--active\"\n ariaCurrentWhenActive=\"page\"\n [style.--star-level]=\"level\"\n [routerLink]=\"item.disabled ? null : item.routerLink\"\n [attr.aria-disabled]=\"item.disabled || null\"\n (click)=\"run(item)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </a>\n </li>\n } @else if (item.url) {\n <li>\n <a\n class=\"star-panel-menu__item\"\n [style.--star-level]=\"level\"\n [attr.href]=\"item.disabled ? null : item.url\"\n [attr.aria-disabled]=\"item.disabled || null\"\n (click)=\"run(item)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </a>\n </li>\n } @else {\n <li>\n <button\n type=\"button\"\n class=\"star-panel-menu__item\"\n [class.star-panel-menu__item--danger]=\"item.danger\"\n [style.--star-level]=\"level\"\n [disabled]=\"item.disabled\"\n (click)=\"run(item)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </button>\n </li>\n }\n }\n </ul>\n </ng-template>\n\n <ng-template #content let-item>\n @if (item.icon) {\n <i class=\"star-panel-menu__icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-panel-menu__label\">{{ item.label }}</span>\n </ng-template>\n `,\n})\nexport class StarPanelMenu {\n private readonly id = inject(_IdGenerator).getId('star-panel-menu-');\n\n readonly items = input<readonly StarMenuItem[]>([]);\n readonly ariaLabel = input<string | null>(null);\n /** Open one section at a time: opening a section closes its sibling sections. */\n readonly single = input(false, { transform: booleanAttribute });\n /** Positions of the open sections (`'0'`, `'0.2'`). Two-way. */\n readonly expandedKeys = model<readonly string[]>([]);\n readonly itemClick = output<StarMenuItem>();\n\n protected isOpen(key: string): boolean {\n return this.expandedKeys().includes(key);\n }\n\n protected regionId(key: string): string {\n return `${this.id}-${key.replaceAll('.', '-')}`;\n }\n\n /** Opens or closes the section at a position. */\n toggle(key: string): void {\n if (this.isOpen(key)) {\n // Closing a section also closes the sections inside it.\n this.expandedKeys.update((keys) =>\n keys.filter((open) => open !== key && !open.startsWith(`${key}.`)),\n );\n return;\n }\n const parent = key.includes('.') ? key.slice(0, key.lastIndexOf('.')) : '';\n const isSibling = (open: string) =>\n (open.includes('.') ? open.slice(0, open.lastIndexOf('.')) : '') === parent;\n this.expandedKeys.update((keys) => [\n ...(this.single()\n ? keys.filter(\n (open) =>\n !isSibling(open) && !keys.some((k) => isSibling(k) && open.startsWith(`${k}.`)),\n )\n : keys),\n key,\n ]);\n }\n\n protected run(item: StarMenuItem): void {\n if (item.disabled) return;\n item.command?.(item);\n this.itemClick.emit(item);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, booleanAttribute, computed, inject, input, output, signal } from "@angular/core";
|
|
3
|
+
import { STAR_UI_TEXT } from "@star-ng/ui/core";
|
|
4
|
+
const ICONS = {
|
|
5
|
+
success: "ph-fill ph-check-circle",
|
|
6
|
+
info: "ph-fill ph-info",
|
|
7
|
+
warn: "ph-fill ph-warning",
|
|
8
|
+
error: "ph-fill ph-warning-circle"
|
|
9
|
+
};
|
|
10
|
+
var StarMessage = class StarMessage {
|
|
11
|
+
text = inject(STAR_UI_TEXT);
|
|
12
|
+
destroyRef = inject(DestroyRef);
|
|
13
|
+
severity = input("info", ...ngDevMode ? [{ debugName: "severity" }] : /* istanbul ignore next */ []);
|
|
14
|
+
variant = input("soft", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
|
|
15
|
+
icon = input(null, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
|
|
16
|
+
closable = input(false, {
|
|
17
|
+
...ngDevMode ? { debugName: "closable" } : /* istanbul ignore next */ {},
|
|
18
|
+
transform: booleanAttribute
|
|
19
|
+
});
|
|
20
|
+
life = input(0, ...ngDevMode ? [{ debugName: "life" }] : /* istanbul ignore next */ []);
|
|
21
|
+
closed = output();
|
|
22
|
+
visible = signal(true, ...ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []);
|
|
23
|
+
iconClass = computed(() => this.icon() ?? ICONS[this.severity()], ...ngDevMode ? [{ debugName: "iconClass" }] : /* istanbul ignore next */ []);
|
|
24
|
+
ngOnInit() {
|
|
25
|
+
const life = this.life();
|
|
26
|
+
if (life > 0) {
|
|
27
|
+
const timer = setTimeout(() => this.close(), life);
|
|
28
|
+
this.destroyRef.onDestroy(() => clearTimeout(timer));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
close() {
|
|
32
|
+
this.visible.set(false);
|
|
33
|
+
this.closed.emit();
|
|
34
|
+
}
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
36
|
+
minVersion: "12.0.0",
|
|
37
|
+
version: "22.2.6",
|
|
38
|
+
ngImport: i0,
|
|
39
|
+
type: StarMessage,
|
|
40
|
+
deps: [],
|
|
41
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
42
|
+
});
|
|
43
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
44
|
+
minVersion: "17.0.0",
|
|
45
|
+
version: "22.2.6",
|
|
46
|
+
type: StarMessage,
|
|
47
|
+
isStandalone: true,
|
|
48
|
+
selector: "star-message",
|
|
49
|
+
inputs: {
|
|
50
|
+
severity: {
|
|
51
|
+
classPropertyName: "severity",
|
|
52
|
+
publicName: "severity",
|
|
53
|
+
isSignal: true,
|
|
54
|
+
isRequired: false,
|
|
55
|
+
transformFunction: null
|
|
56
|
+
},
|
|
57
|
+
variant: {
|
|
58
|
+
classPropertyName: "variant",
|
|
59
|
+
publicName: "variant",
|
|
60
|
+
isSignal: true,
|
|
61
|
+
isRequired: false,
|
|
62
|
+
transformFunction: null
|
|
63
|
+
},
|
|
64
|
+
icon: {
|
|
65
|
+
classPropertyName: "icon",
|
|
66
|
+
publicName: "icon",
|
|
67
|
+
isSignal: true,
|
|
68
|
+
isRequired: false,
|
|
69
|
+
transformFunction: null
|
|
70
|
+
},
|
|
71
|
+
closable: {
|
|
72
|
+
classPropertyName: "closable",
|
|
73
|
+
publicName: "closable",
|
|
74
|
+
isSignal: true,
|
|
75
|
+
isRequired: false,
|
|
76
|
+
transformFunction: null
|
|
77
|
+
},
|
|
78
|
+
life: {
|
|
79
|
+
classPropertyName: "life",
|
|
80
|
+
publicName: "life",
|
|
81
|
+
isSignal: true,
|
|
82
|
+
isRequired: false,
|
|
83
|
+
transformFunction: null
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
outputs: { closed: "closed" },
|
|
87
|
+
host: { properties: {
|
|
88
|
+
"class": "'star-message star-message--' + severity() + ' star-message--' + variant()",
|
|
89
|
+
"attr.role": "severity() === 'error' ? 'alert' : 'status'",
|
|
90
|
+
"hidden": "!visible()"
|
|
91
|
+
} },
|
|
92
|
+
ngImport: i0,
|
|
93
|
+
template: `
|
|
94
|
+
<i class="star-message__icon" [class]="iconClass()" aria-hidden="true"></i>
|
|
95
|
+
<div class="star-message__text"><ng-content /></div>
|
|
96
|
+
@if (closable()) {
|
|
97
|
+
<button
|
|
98
|
+
type="button"
|
|
99
|
+
class="star-message__close"
|
|
100
|
+
[attr.aria-label]="text.close"
|
|
101
|
+
(click)="close()"
|
|
102
|
+
>
|
|
103
|
+
<i class="ph-bold ph-x" aria-hidden="true"></i>
|
|
104
|
+
</button>
|
|
105
|
+
}
|
|
106
|
+
`,
|
|
107
|
+
isInline: true,
|
|
108
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
112
|
+
minVersion: "12.0.0",
|
|
113
|
+
version: "22.2.6",
|
|
114
|
+
ngImport: i0,
|
|
115
|
+
type: StarMessage,
|
|
116
|
+
decorators: [{
|
|
117
|
+
type: Component,
|
|
118
|
+
args: [{
|
|
119
|
+
selector: "star-message",
|
|
120
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
121
|
+
host: {
|
|
122
|
+
"[class]": "'star-message star-message--' + severity() + ' star-message--' + variant()",
|
|
123
|
+
"[attr.role]": "severity() === 'error' ? 'alert' : 'status'",
|
|
124
|
+
"[hidden]": "!visible()"
|
|
125
|
+
},
|
|
126
|
+
template: `
|
|
127
|
+
<i class="star-message__icon" [class]="iconClass()" aria-hidden="true"></i>
|
|
128
|
+
<div class="star-message__text"><ng-content /></div>
|
|
129
|
+
@if (closable()) {
|
|
130
|
+
<button
|
|
131
|
+
type="button"
|
|
132
|
+
class="star-message__close"
|
|
133
|
+
[attr.aria-label]="text.close"
|
|
134
|
+
(click)="close()"
|
|
135
|
+
>
|
|
136
|
+
<i class="ph-bold ph-x" aria-hidden="true"></i>
|
|
137
|
+
</button>
|
|
138
|
+
}
|
|
139
|
+
`
|
|
140
|
+
}]
|
|
141
|
+
}],
|
|
142
|
+
propDecorators: {
|
|
143
|
+
severity: [{
|
|
144
|
+
type: i0.Input,
|
|
145
|
+
args: [{
|
|
146
|
+
isSignal: true,
|
|
147
|
+
alias: "severity",
|
|
148
|
+
required: false
|
|
149
|
+
}]
|
|
150
|
+
}],
|
|
151
|
+
variant: [{
|
|
152
|
+
type: i0.Input,
|
|
153
|
+
args: [{
|
|
154
|
+
isSignal: true,
|
|
155
|
+
alias: "variant",
|
|
156
|
+
required: false
|
|
157
|
+
}]
|
|
158
|
+
}],
|
|
159
|
+
icon: [{
|
|
160
|
+
type: i0.Input,
|
|
161
|
+
args: [{
|
|
162
|
+
isSignal: true,
|
|
163
|
+
alias: "icon",
|
|
164
|
+
required: false
|
|
165
|
+
}]
|
|
166
|
+
}],
|
|
167
|
+
closable: [{
|
|
168
|
+
type: i0.Input,
|
|
169
|
+
args: [{
|
|
170
|
+
isSignal: true,
|
|
171
|
+
alias: "closable",
|
|
172
|
+
required: false
|
|
173
|
+
}]
|
|
174
|
+
}],
|
|
175
|
+
life: [{
|
|
176
|
+
type: i0.Input,
|
|
177
|
+
args: [{
|
|
178
|
+
isSignal: true,
|
|
179
|
+
alias: "life",
|
|
180
|
+
required: false
|
|
181
|
+
}]
|
|
182
|
+
}],
|
|
183
|
+
closed: [{
|
|
184
|
+
type: i0.Output,
|
|
185
|
+
args: ["closed"]
|
|
186
|
+
}]
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
export { StarMessage };
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=star-ng-ui-message.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-ng-ui-message.mjs","names":[],"sources":["../../../projects/star-ng/message/message.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\n\nexport type StarMessageSeverity = 'success' | 'info' | 'warn' | 'error';\n\nconst ICONS: Record<StarMessageSeverity, string> = {\n success: 'ph-fill ph-check-circle',\n info: 'ph-fill ph-info',\n warn: 'ph-fill ph-warning',\n error: 'ph-fill ph-warning-circle',\n};\n\n/**\n * Inline message (PrimeNG `p-message`): severity, icon, optional close and auto-hide `life`.\n * `<star-message severity=\"warn\" closable>Draft not saved.</star-message>`\n */\n@Component({\n selector: 'star-message',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': \"'star-message star-message--' + severity() + ' star-message--' + variant()\",\n '[attr.role]': \"severity() === 'error' ? 'alert' : 'status'\",\n '[hidden]': '!visible()',\n },\n template: `\n <i class=\"star-message__icon\" [class]=\"iconClass()\" aria-hidden=\"true\"></i>\n <div class=\"star-message__text\"><ng-content /></div>\n @if (closable()) {\n <button\n type=\"button\"\n class=\"star-message__close\"\n [attr.aria-label]=\"text.close\"\n (click)=\"close()\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n `,\n})\nexport class StarMessage implements OnInit {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly severity = input<StarMessageSeverity>('info');\n readonly variant = input<'soft' | 'outlined'>('soft');\n readonly icon = input<string | null>(null);\n readonly closable = input(false, { transform: booleanAttribute });\n /** Milliseconds before the message hides itself (0 = stays). */\n readonly life = input(0);\n readonly closed = output<void>();\n\n protected readonly visible = signal(true);\n protected readonly iconClass = computed(() => this.icon() ?? ICONS[this.severity()]);\n\n ngOnInit(): void {\n const life = this.life();\n if (life > 0) {\n const timer = setTimeout(() => this.close(), life);\n this.destroyRef.onDestroy(() => clearTimeout(timer));\n }\n }\n\n close(): void {\n this.visible.set(false);\n this.closed.emit();\n }\n}\n"],"mappings":";;;AAgBA,MAAM,QAA6C;CACjD,SAAS;CACT,MAAM;CACN,MAAM;CACN,OAAO;AACR;AA6BD,IAAa,cAAb,MAAa,YAAW;CACH,OAAO,OAAO,YAAY;CAC5B,aAAa,OAAO,UAAU;CAEtC,WAAW,MAA2B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,UAAU,MAA2B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,OAAO,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,OAAO,MAAM,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACf,SAAS,OAAM;CAEL,UAAU,OAAO,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,YAAY,eAAe,KAAK,KAAI,KAAM,MAAM,KAAK,SAAQ,IAAI,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEpF,WAAQ;EACN,MAAM,OAAO,KAAK,KAAI;EACtB,IAAI,OAAO,GAAG;GACZ,MAAM,QAAQ,iBAAiB,KAAK,MAAK,GAAI,IAAI;GACjD,KAAK,WAAW,gBAAgB,aAAa,KAAK,CAAC;EACrD;CACF;CAEA,QAAK;EACH,KAAK,QAAQ,IAAI,KAAK;EACtB,KAAK,OAAO,KAAI;CAClB;CA1BW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAX,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAW,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,QAAA,SAAA;EAAA,MAAA,EAAA,YAAA;GAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UAfZ;;;;;;;;;;;;;;EAaT,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAW,YAAA,CAAA;EAvBvB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,WAAW;IACX,eAAe;IACf,YAAY;GACb;GACD,UAAU;;;;;;;;;;;;;;EAcX,CAAA"}
|