@raintonic/formaui 0.4.0 → 0.9.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/CHANGELOG.md +80 -35
- package/README.md +22 -26
- package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +39 -41
- package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-cdk-form-field.mjs +207 -3
- package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs +19 -1
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +5 -12
- package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-accordion.mjs +8 -5
- package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-alert.mjs +16 -2
- package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs +255 -462
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-avatar.mjs +34 -59
- package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button.mjs +15 -20
- package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-card.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-chip.mjs +97 -0
- package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-data-table.mjs +69 -29
- package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-date-picker.mjs +223 -144
- package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-drawer.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +888 -0
- package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +774 -0
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-form-field.mjs +81 -50
- package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-input.mjs +47 -12
- package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -12
- package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-password-input.mjs +35 -110
- package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-popover.mjs +3 -2
- package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-progressbar.mjs +3 -2
- package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-radio.mjs +5 -6
- package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-select.mjs +257 -412
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +525 -0
- package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-stepper.mjs +50 -45
- package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-strength-meter.mjs +149 -0
- package/fesm2022/raintonic-formaui-components-strength-meter.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-time-picker.mjs +194 -154
- package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs +302 -0
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tooltip.mjs +10 -4
- package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-topbar.mjs +60 -0
- package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tree-select.mjs +59 -69
- package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree.mjs +31 -5
- package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-core.mjs +279 -1
- package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-breakpoint.mjs +93 -0
- package/fesm2022/raintonic-formaui-services-breakpoint.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-services-dialog.mjs +314 -16
- package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-notification.mjs +93 -29
- package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-theme.mjs +46 -196
- package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
- package/fesm2022/raintonic-formaui.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/llms-full.txt +2329 -450
- package/llms.txt +36 -33
- package/package.json +42 -19
- package/styles/fonts/Geist-Bold.woff2 +0 -0
- package/styles/fonts/Geist-Italic.woff2 +0 -0
- package/styles/fonts/Geist-Light.woff2 +0 -0
- package/styles/fonts/Geist-Medium.woff2 +0 -0
- package/styles/fonts/Geist-Regular.woff2 +0 -0
- package/styles/fonts/Geist-SemiBold.woff2 +0 -0
- package/styles/fonts/GeistMono-Regular.woff2 +0 -0
- package/styles/generated/_tokens.scss +906 -0
- package/styles/index.scss +11 -10
- package/styles/partials/_brand.scss +46 -0
- package/styles/partials/_constants.scss +22 -20
- package/styles/partials/_fonts.scss +54 -10
- package/styles/partials/_grid.scss +29 -18
- package/styles/partials/_mixins.scss +69 -27
- package/styles/partials/_motion.scss +28 -33
- package/styles/partials/_theme.scss +28 -255
- package/styles/partials/_type.scss +117 -0
- package/styles/partials/_typography.scss +45 -45
- package/styles/partials/_utilities.scss +198 -98
- package/styles/partials/components/_button.scss +144 -75
- package/styles/partials/components/_dialog.scss +181 -180
- package/styles/partials/components/_overlay.scss +87 -87
- package/styles/partials/themes/_dark.scss +3 -268
- package/styles/partials/themes/_light.scss +4 -268
- package/styles/styles.css +7744 -0
- package/styles/styles.entry.scss +3 -0
- package/styles/utilities.css +4802 -0
- package/styles/utilities.entry.scss +3 -0
- package/types/raintonic-formaui-cdk-drag-drop.d.ts +0 -1
- package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -1
- package/types/raintonic-formaui-cdk-form-field.d.ts +118 -2
- package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-cdk-overlay.d.ts +2 -0
- package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
- package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +0 -1
- package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -1
- package/types/raintonic-formaui-components-accordion.d.ts +1 -1
- package/types/raintonic-formaui-components-accordion.d.ts.map +1 -1
- package/types/raintonic-formaui-components-alert.d.ts +6 -1
- package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
- package/types/raintonic-formaui-components-autocomplete.d.ts +73 -116
- package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
- package/types/raintonic-formaui-components-avatar.d.ts +13 -31
- package/types/raintonic-formaui-components-avatar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-button.d.ts +4 -10
- package/types/raintonic-formaui-components-button.d.ts.map +1 -1
- package/types/raintonic-formaui-components-chip.d.ts +43 -0
- package/types/raintonic-formaui-components-chip.d.ts.map +1 -0
- package/types/raintonic-formaui-components-data-table.d.ts +48 -11
- package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
- package/types/raintonic-formaui-components-date-picker.d.ts +59 -23
- package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
- package/types/raintonic-formaui-components-dropdown-menu.d.ts +394 -0
- package/types/raintonic-formaui-components-dropdown-menu.d.ts.map +1 -0
- package/types/raintonic-formaui-components-dual-tier-navigation.d.ts +87 -0
- package/types/raintonic-formaui-components-dual-tier-navigation.d.ts.map +1 -0
- package/types/raintonic-formaui-components-form-field.d.ts +51 -21
- package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-components-input.d.ts +20 -11
- package/types/raintonic-formaui-components-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-number-input.d.ts +5 -3
- package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-password-input.d.ts +18 -32
- package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-popover.d.ts.map +1 -1
- package/types/raintonic-formaui-components-progressbar.d.ts +1 -1
- package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-radio.d.ts +1 -2
- package/types/raintonic-formaui-components-radio.d.ts.map +1 -1
- package/types/raintonic-formaui-components-select.d.ts +107 -76
- package/types/raintonic-formaui-components-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts +223 -0
- package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts.map +1 -0
- package/types/raintonic-formaui-components-stepper.d.ts +4 -2
- package/types/raintonic-formaui-components-stepper.d.ts.map +1 -1
- package/types/raintonic-formaui-components-strength-meter.d.ts +78 -0
- package/types/raintonic-formaui-components-strength-meter.d.ts.map +1 -0
- package/types/raintonic-formaui-components-time-picker.d.ts +44 -24
- package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toggle-group.d.ts +100 -0
- package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tooltip.d.ts +2 -1
- package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
- package/types/raintonic-formaui-components-topbar.d.ts +48 -0
- package/types/raintonic-formaui-components-topbar.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tree-select.d.ts +25 -9
- package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tree.d.ts +12 -1
- package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
- package/types/raintonic-formaui-core.d.ts +243 -5
- package/types/raintonic-formaui-core.d.ts.map +1 -1
- package/types/raintonic-formaui-services-breakpoint.d.ts +44 -0
- package/types/raintonic-formaui-services-breakpoint.d.ts.map +1 -0
- package/types/raintonic-formaui-services-dialog.d.ts +141 -2
- package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
- package/types/raintonic-formaui-services-notification.d.ts +24 -2
- package/types/raintonic-formaui-services-notification.d.ts.map +1 -1
- package/types/raintonic-formaui-services-theme.d.ts +13 -103
- package/types/raintonic-formaui-services-theme.d.ts.map +1 -1
- package/types/raintonic-formaui.d.ts +1 -1
- package/fesm2022/raintonic-formaui-components-big-menu.mjs +0 -86
- package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +0 -1
- package/fesm2022/raintonic-formaui-components-menu.mjs +0 -896
- package/fesm2022/raintonic-formaui-components-menu.mjs.map +0 -1
- package/fesm2022/raintonic-formaui-components-sidebar.mjs +0 -275
- package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +0 -1
- package/fesm2022/raintonic-formaui-components-tag.mjs +0 -95
- package/fesm2022/raintonic-formaui-components-tag.mjs.map +0 -1
- package/styles/_fonts-entry.scss +0 -3
- package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
- package/styles/fonts/inter-tight-latin.woff2 +0 -0
- package/types/raintonic-formaui-components-big-menu.d.ts +0 -73
- package/types/raintonic-formaui-components-big-menu.d.ts.map +0 -1
- package/types/raintonic-formaui-components-menu.d.ts +0 -403
- package/types/raintonic-formaui-components-menu.d.ts.map +0 -1
- package/types/raintonic-formaui-components-sidebar.d.ts +0 -185
- package/types/raintonic-formaui-components-sidebar.d.ts.map +0 -1
- package/types/raintonic-formaui-components-tag.d.ts +0 -43
- package/types/raintonic-formaui-components-tag.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-tooltip.mjs","sources":["../../../lib/components/tooltip/tooltip.types.ts","../../../lib/components/tooltip/tooltip.component.ts","../../../lib/components/tooltip/tooltip.component.html","../../../lib/components/tooltip/tooltip.directive.ts","../../../lib/components/tooltip/index.ts","../../../lib/components/tooltip/raintonic-formaui-components-tooltip.ts"],"sourcesContent":["/**\r\n * Available tooltip positions relative to the trigger element\r\n */\r\nexport type TooltipPosition =\r\n | 'top'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\n/**\r\n * Available tooltip sizes\r\n */\r\nexport type TooltipSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Tooltip trigger events\r\n */\r\nexport type TooltipTrigger = 'hover' | 'focus' | 'click' | 'manual';\r\n\r\n/**\r\n * Constants for validation\r\n */\r\nexport const TOOLTIP_POSITIONS = [\r\n 'top',\r\n 'top-start',\r\n 'top-end',\r\n 'bottom',\r\n 'bottom-start',\r\n 'bottom-end',\r\n 'left',\r\n 'left-start',\r\n 'left-end',\r\n 'right',\r\n 'right-start',\r\n 'right-end',\r\n] as const;\r\n\r\nexport const TOOLTIP_SIZES = ['sm', 'md', 'lg'] as const;\r\nexport const TOOLTIP_TRIGGERS = ['hover', 'focus', 'click', 'manual'] as const;\r\n\r\n/**\r\n * Tooltip configuration interface\r\n */\r\nexport interface TooltipConfig {\r\n position?: TooltipPosition;\r\n size?: TooltipSize;\r\n trigger?: TooltipTrigger;\r\n showDelay?: number;\r\n hideDelay?: number;\r\n disabled?: boolean;\r\n maxWidth?: string;\r\n offset?: number;\r\n arrow?: boolean;\r\n}\r\n","import { Component, input, computed, Signal, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { TooltipPosition, TooltipSize } from './tooltip.types';\r\n\r\n/**\r\n * @component FuiTooltipComponent\r\n * @selector fui-tooltip\r\n * @description Internal tooltip component rendered by FuiTooltipDirective via the overlay system.\r\n * Not intended for direct use; created programmatically by the directive.\r\n *\r\n * @input content - (required) Tooltip text content.\r\n * @input position - (required) Tooltip position relative to the trigger element.\r\n * @input size - (required) Tooltip size variant.\r\n * @input maxWidth - (required) Maximum CSS width of the tooltip.\r\n * @input arrow - (required) Whether to render an arrow indicator.\r\n * @input tooltipId - (required) Unique ID for ARIA accessibility linking.\r\n *\r\n * @example\r\n * <!-- Used internally by FuiTooltipDirective -->\r\n * <button fuiTooltip=\"Save your changes\">Save</button>\r\n *\r\n * @internal\r\n */\r\n@Component({\r\n selector: 'fui-tooltip',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './tooltip.component.html',\r\n styleUrl: './tooltip.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-tooltip',\r\n '[class]': 'computedClasses()',\r\n '[id]': 'tooltipId()',\r\n '[attr.role]': '\"tooltip\"',\r\n '[style.max-width]': 'maxWidth()',\r\n },\r\n})\r\nexport class FuiTooltipComponent {\r\n /**\r\n * Tooltip content text\r\n */\r\n readonly content = input.required<string>();\r\n\r\n /**\r\n * Tooltip position\r\n */\r\n readonly position = input.required<TooltipPosition>();\r\n\r\n /**\r\n * Tooltip size\r\n */\r\n readonly size = input.required<TooltipSize>();\r\n\r\n /**\r\n * Maximum width of the tooltip\r\n */\r\n readonly maxWidth = input.required<string>();\r\n\r\n /**\r\n * Whether to show arrow\r\n */\r\n readonly arrow = input.required<boolean>();\r\n\r\n /**\r\n * Tooltip ID for accessibility\r\n */\r\n readonly tooltipId = input.required<string>();\r\n\r\n /**\r\n * Computed CSS classes for the tooltip\r\n */\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const classes: string[] = ['fui-tooltip', `fui-tooltip--${this.size()}`, `fui-tooltip--${this.position()}`];\r\n\r\n if (this.arrow()) {\r\n classes.push('fui-tooltip--with-arrow');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /**\r\n * Computed arrow classes based on position\r\n */\r\n readonly arrowClasses: Signal<string> = computed(() => {\r\n const position = this.position();\r\n const baseClass = 'fui-tooltip__arrow';\r\n\r\n if (position.startsWith('top')) {\r\n return `${baseClass} ${baseClass}--bottom`;\r\n } else if (position.startsWith('bottom')) {\r\n return `${baseClass} ${baseClass}--top`;\r\n } else if (position.startsWith('left')) {\r\n return `${baseClass} ${baseClass}--right`;\r\n } else if (position.startsWith('right')) {\r\n return `${baseClass} ${baseClass}--left`;\r\n }\r\n\r\n return baseClass;\r\n });\r\n}\r\n","<div class=\"fui-tooltip__content\">\r\n {{ content() }}\r\n</div>\r\n@if (arrow()) {\r\n <div [class]=\"arrowClasses()\"></div>\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n input,\r\n computed,\r\n effect,\r\n HostListener,\r\n inject,\r\n Signal,\r\n OnDestroy,\r\n booleanAttribute,\r\n numberAttribute,\r\n ComponentRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport {\r\n TooltipPosition,\r\n TooltipSize,\r\n TooltipTrigger,\r\n TOOLTIP_POSITIONS,\r\n TOOLTIP_SIZES,\r\n TOOLTIP_TRIGGERS,\r\n} from './tooltip.types';\r\nimport { FuiTooltipComponent } from './tooltip.component';\r\nimport { FuiOverlayService, FuiOverlayRef, FuiConnectedPosition } from '@raintonic/formaui/cdk/overlay';\r\n\r\n/**\r\n * # Tooltip Directive\r\n *\r\n * A professional tooltip directive that provides contextual information on hover, focus, or click.\r\n * Follows Material Design patterns with full accessibility support and advanced positioning.\r\n *\r\n * ## Features\r\n * - Multiple positioning options (12 positions)\r\n * - Configurable trigger events (hover, focus, click, manual)\r\n * - Multiple variants for different semantic meanings\r\n * - Flexible sizing options\r\n * - Smart positioning with collision detection\r\n * - Customizable delays and animations\r\n * - Full accessibility support (ARIA attributes, keyboard navigation)\r\n * - Arrow indicator support\r\n * - Responsive design with max-width control\r\n * - Theme support (light/dark)\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Tooltip\r\n * ```html\r\n * <button fuiTooltip=\"Save your changes\">Save</button>\r\n * ```\r\n *\r\n * ### Advanced Configuration\r\n * ```html\r\n * <button fuiTooltip=\"Delete this item permanently\"\r\n * fuiTooltipPosition=\"top\"\r\n * fuiTooltipVariant=\"error\"\r\n * fuiTooltipSize=\"lg\"\r\n * [fuiTooltipShowDelay]=\"500\">\r\n * Delete\r\n * </button>\r\n * ```\r\n *\r\n * ### Click Trigger\r\n * ```html\r\n * <span fuiTooltip=\"Click to copy\"\r\n * fuiTooltipTrigger=\"click\"\r\n * fuiTooltipPosition=\"bottom\">\r\n * 📋 Copy to clipboard\r\n * </span>\r\n * ```\r\n *\r\n * ### Manual Control\r\n * ```html\r\n * <div fuiTooltip=\"Manual tooltip\"\r\n * fuiTooltipTrigger=\"manual\"\r\n * [fuiTooltipShow]=\"showTooltip\">\r\n * Hover me\r\n * </div>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiTooltipDirective],\r\n * template: `\r\n * <button fuiTooltip=\"This will save your work\"\r\n * fuiTooltipPosition=\"top\"\r\n * fuiTooltipVariant=\"info\">\r\n * Save Document\r\n * </button>\r\n * `\r\n * })\r\n * export class MyComponent { }\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiTooltip]',\r\n standalone: true,\r\n host: {\r\n '[attr.aria-describedby]': 'isVisible() ? tooltipId() : null',\r\n },\r\n})\r\nexport class FuiTooltipDirective implements OnDestroy {\r\n private static _nextId = 0;\r\n /**\r\n * Tooltip content text\r\n */\r\n readonly fuiTooltip = input.required<string>();\r\n\r\n /**\r\n * Tooltip position relative to the trigger element\r\n * @default 'top'\r\n */\r\n readonly fuiTooltipPosition = input<TooltipPosition, TooltipPosition | string>('top', {\r\n transform: (v) => ((TOOLTIP_POSITIONS as readonly string[]).includes(v) ? (v as TooltipPosition) : 'top'),\r\n });\r\n\r\n /**\r\n * Tooltip size\r\n * @default 'md'\r\n */\r\n readonly fuiTooltipSize = input<TooltipSize, TooltipSize | string>('md', {\r\n transform: (v) => ((TOOLTIP_SIZES as readonly string[]).includes(v) ? (v as TooltipSize) : 'md'),\r\n });\r\n\r\n /**\r\n * Tooltip trigger event\r\n * @default 'hover'\r\n */\r\n readonly fuiTooltipTrigger = input<TooltipTrigger, TooltipTrigger | string>('hover', {\r\n transform: (v) => ((TOOLTIP_TRIGGERS as readonly string[]).includes(v) ? (v as TooltipTrigger) : 'hover'),\r\n });\r\n\r\n /**\r\n * Delay before showing tooltip (in milliseconds)\r\n * @default 500\r\n */\r\n readonly fuiTooltipShowDelay = input<number, unknown>(500, { transform: numberAttribute });\r\n\r\n /**\r\n * Delay before hiding tooltip (in milliseconds)\r\n * @default 0\r\n */\r\n readonly fuiTooltipHideDelay = input<number, unknown>(0, { transform: numberAttribute });\r\n\r\n /**\r\n * Whether the tooltip is disabled\r\n * @default false\r\n */\r\n readonly fuiTooltipDisabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Maximum width of the tooltip\r\n * @default '200px'\r\n */\r\n readonly fuiTooltipMaxWidth = input('200px');\r\n\r\n /**\r\n * Offset distance from the trigger element (in pixels)\r\n * @default 8\r\n */\r\n readonly fuiTooltipOffset = input<number, unknown>(8, { transform: numberAttribute });\r\n\r\n /**\r\n * Whether to show an arrow pointing to the trigger element\r\n * @default true\r\n */\r\n readonly fuiTooltipArrow = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Manual control for showing/hiding tooltip (only works with trigger=\"manual\")\r\n * @default false\r\n */\r\n readonly fuiTooltipShow = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n // Internal state\r\n private readonly _isVisible: WritableSignal<boolean> = signal(false);\r\n private readonly _tooltipId: WritableSignal<string> = signal('');\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _tooltipComponent: ComponentRef<FuiTooltipComponent> | null = null;\r\n private _showTimeout: number | null = null;\r\n private _hideTimeout: number | null = null;\r\n private _isHoveringTooltip = false;\r\n\r\n // Computed properties\r\n readonly isVisible: Signal<boolean> = computed(() => this._isVisible());\r\n readonly tooltipId: Signal<string> = computed(() => this._tooltipId());\r\n\r\n // Injected dependencies\r\n private readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _overlayService: FuiOverlayService = inject(FuiOverlayService);\r\n private readonly _environmentInjector: EnvironmentInjector = inject(EnvironmentInjector);\r\n\r\n constructor() {\r\n // Generate unique tooltip ID\r\n this._tooltipId.set(`fui-tooltip-${FuiTooltipDirective._nextId++}`);\r\n\r\n // Handle manual control\r\n effect(() => {\r\n if (this.fuiTooltipTrigger() === 'manual') {\r\n if (this.fuiTooltipShow()) {\r\n this._showTooltip();\r\n } else {\r\n this._hideTooltip();\r\n }\r\n }\r\n });\r\n\r\n // Handle disabled state\r\n effect(() => {\r\n if (this.fuiTooltipDisabled() && this._isVisible()) {\r\n this._hideTooltip();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._clearTimeouts();\r\n this._destroyTooltip();\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter(): void {\r\n if (this.fuiTooltipTrigger() === 'hover' && !this.fuiTooltipDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave(): void {\r\n if (this.fuiTooltipTrigger() === 'hover' && !this.fuiTooltipDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n if ((this.fuiTooltipTrigger() === 'focus' || this.fuiTooltipTrigger() === 'hover') && !this.fuiTooltipDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n if ((this.fuiTooltipTrigger() === 'focus' || this.fuiTooltipTrigger() === 'hover') && !this.fuiTooltipDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('click')\r\n onClick(): void {\r\n if (this.fuiTooltipTrigger() === 'click' && !this.fuiTooltipDisabled()) {\r\n if (this._isVisible()) {\r\n this._hideTooltip();\r\n } else {\r\n this._showTooltip();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this._isVisible()) {\r\n this._hideTooltip();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Programmatically show the tooltip\r\n */\r\n show(): void {\r\n if (!this.fuiTooltipDisabled()) {\r\n this._showTooltip();\r\n }\r\n }\r\n\r\n /**\r\n * Programmatically hide the tooltip\r\n */\r\n hide(): void {\r\n this._hideTooltip();\r\n }\r\n\r\n /**\r\n * Toggle tooltip visibility\r\n */\r\n toggle(): void {\r\n if (this._isVisible()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n private _scheduleShow(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiTooltipShowDelay() > 0) {\r\n this._showTimeout = window.setTimeout(() => {\r\n this._showTooltip();\r\n }, this.fuiTooltipShowDelay());\r\n } else {\r\n this._showTooltip();\r\n }\r\n }\r\n\r\n private _scheduleHide(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiTooltipHideDelay() > 0) {\r\n this._hideTimeout = window.setTimeout(() => {\r\n if (!this._isHoveringTooltip) {\r\n this._hideTooltip();\r\n }\r\n }, this.fuiTooltipHideDelay());\r\n } else {\r\n if (!this._isHoveringTooltip) {\r\n this._hideTooltip();\r\n }\r\n }\r\n }\r\n\r\n private _showTooltip(): void {\r\n if (this._isVisible() || this.fuiTooltipDisabled() || !this.fuiTooltip().trim()) {\r\n return;\r\n }\r\n\r\n this._createTooltip();\r\n this._isVisible.set(true);\r\n\r\n // Add click outside listener for click trigger\r\n if (this.fuiTooltipTrigger() === 'click') {\r\n setTimeout(() => {\r\n document.addEventListener('click', this._onDocumentClick, true);\r\n });\r\n }\r\n }\r\n\r\n private _hideTooltip(): void {\r\n if (!this._isVisible()) {\r\n return;\r\n }\r\n\r\n this._isVisible.set(false);\r\n this._destroyTooltip();\r\n document.removeEventListener('click', this._onDocumentClick, true);\r\n }\r\n\r\n private _createTooltip(): void {\r\n if (this._overlayRef) {\r\n return;\r\n }\r\n\r\n // Create tooltip component first\r\n this._tooltipComponent = createComponent(FuiTooltipComponent, {\r\n environmentInjector: this._environmentInjector,\r\n });\r\n\r\n // Set tooltip properties immediately\r\n this._tooltipComponent.setInput('content', this.fuiTooltip());\r\n this._tooltipComponent.setInput('position', this.fuiTooltipPosition());\r\n this._tooltipComponent.setInput('size', this.fuiTooltipSize());\r\n this._tooltipComponent.setInput('maxWidth', this.fuiTooltipMaxWidth());\r\n this._tooltipComponent.setInput('arrow', this.fuiTooltipArrow());\r\n this._tooltipComponent.setInput('tooltipId', this.tooltipId());\r\n\r\n // Trigger change detection to ensure component is rendered with correct props\r\n this._tooltipComponent.changeDetectorRef.detectChanges();\r\n\r\n // Now create overlay with positioning strategy\r\n const positions = this._getPositionsForTooltipPosition(this.fuiTooltipPosition());\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(this._elementRef, positions)\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n // Create overlay\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.reposition(20),\r\n panelClass: 'fui-tooltip-panel',\r\n });\r\n\r\n // Attach component to overlay\r\n this._overlayRef.attach(this._tooltipComponent);\r\n\r\n // Set up hover events for tooltip persistence\r\n const tooltipElement = this._tooltipComponent.location.nativeElement;\r\n\r\n tooltipElement.addEventListener('mouseenter', () => {\r\n this._isHoveringTooltip = true;\r\n this._clearTimeouts();\r\n });\r\n\r\n tooltipElement.addEventListener('mouseleave', () => {\r\n this._isHoveringTooltip = false;\r\n if (this.fuiTooltipTrigger() === 'hover') {\r\n this._scheduleHide();\r\n }\r\n });\r\n }\r\n\r\n private _getPositionsForTooltipPosition(position: TooltipPosition): FuiConnectedPosition[] {\r\n const offset = this.fuiTooltipOffset();\r\n const positionMap: Record<TooltipPosition, FuiConnectedPosition[]> = {\r\n top: [\r\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\r\n ],\r\n 'top-start': [\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n ],\r\n 'top-end': [\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\r\n ],\r\n bottom: [\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\r\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\r\n ],\r\n 'bottom-start': [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n ],\r\n 'bottom-end': [\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\r\n ],\r\n left: [\r\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\r\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\r\n ],\r\n 'left-start': [\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\r\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\r\n ],\r\n 'left-end': [\r\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\r\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\r\n ],\r\n right: [\r\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\r\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\r\n ],\r\n 'right-start': [\r\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\r\n ],\r\n 'right-end': [\r\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\r\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\r\n ],\r\n };\r\n\r\n return positionMap[position] || positionMap.top;\r\n }\r\n\r\n private _destroyTooltip(): void {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n if (this._tooltipComponent) {\r\n this._tooltipComponent.destroy();\r\n this._tooltipComponent = null;\r\n }\r\n }\r\n\r\n private _clearTimeouts(): void {\r\n if (this._showTimeout) {\r\n clearTimeout(this._showTimeout);\r\n this._showTimeout = null;\r\n }\r\n if (this._hideTimeout) {\r\n clearTimeout(this._hideTimeout);\r\n this._hideTimeout = null;\r\n }\r\n }\r\n\r\n private readonly _onDocumentClick = (event: Event): void => {\r\n const target = event.target as HTMLElement;\r\n const triggerElement = this._elementRef.nativeElement;\r\n const tooltipElement = this._tooltipComponent?.location.nativeElement;\r\n\r\n if (target && !triggerElement.contains(target) && !tooltipElement?.contains(target)) {\r\n this._hideTooltip();\r\n }\r\n };\r\n}\r\n","// Public API for tooltip component\r\nexport * from './tooltip.directive';\r\nexport * from './tooltip.component';\r\nexport * from './tooltip.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-tooltip.mjs","sources":["../../../lib/components/tooltip/tooltip.types.ts","../../../lib/components/tooltip/tooltip.component.ts","../../../lib/components/tooltip/tooltip.component.html","../../../lib/components/tooltip/tooltip.directive.ts","../../../lib/components/tooltip/index.ts","../../../lib/components/tooltip/raintonic-formaui-components-tooltip.ts"],"sourcesContent":["/**\r\n * Available tooltip positions relative to the trigger element\r\n */\r\nexport type TooltipPosition =\r\n | 'top'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\n/**\r\n * Available tooltip sizes\r\n */\r\nexport type TooltipSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Tooltip trigger events\r\n */\r\nexport type TooltipTrigger = 'hover' | 'focus' | 'click' | 'manual';\r\n\r\n/**\r\n * Constants for validation\r\n */\r\nexport const TOOLTIP_POSITIONS = [\r\n 'top',\r\n 'top-start',\r\n 'top-end',\r\n 'bottom',\r\n 'bottom-start',\r\n 'bottom-end',\r\n 'left',\r\n 'left-start',\r\n 'left-end',\r\n 'right',\r\n 'right-start',\r\n 'right-end',\r\n] as const;\r\n\r\nexport const TOOLTIP_SIZES = ['sm', 'md', 'lg'] as const;\r\nexport const TOOLTIP_TRIGGERS = ['hover', 'focus', 'click', 'manual'] as const;\r\n\r\n/**\r\n * Tooltip configuration interface\r\n */\r\nexport interface TooltipConfig {\r\n position?: TooltipPosition;\r\n size?: TooltipSize;\r\n trigger?: TooltipTrigger;\r\n showDelay?: number;\r\n hideDelay?: number;\r\n disabled?: boolean;\r\n maxWidth?: string;\r\n offset?: number;\r\n arrow?: boolean;\r\n}\r\n","import { Component, input, computed, Signal, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\n\r\nimport { TooltipPosition, TooltipSize } from './tooltip.types';\r\n\r\n/**\r\n * @component FuiTooltipComponent\r\n * @selector fui-tooltip\r\n * @description Internal tooltip component rendered by FuiTooltipDirective via the overlay system.\r\n * Not intended for direct use; created programmatically by the directive.\r\n *\r\n * @input content - (required) Tooltip text content.\r\n * @input position - (required) Tooltip position relative to the trigger element.\r\n * @input size - (required) Tooltip size variant.\r\n * @input maxWidth - (required) Maximum CSS width of the tooltip.\r\n * @input arrow - (required) Whether to render an arrow indicator.\r\n * @input tooltipId - (required) Unique ID for ARIA accessibility linking.\r\n *\r\n * @example\r\n * <!-- Used internally by FuiTooltipDirective -->\r\n * <button fuiTooltip=\"Save your changes\">Save</button>\r\n *\r\n * @internal\r\n */\r\n@Component({\r\n selector: 'fui-tooltip',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './tooltip.component.html',\r\n styleUrl: './tooltip.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-tooltip',\r\n '[class]': 'computedClasses()',\r\n '[id]': 'tooltipId()',\r\n '[attr.role]': '\"tooltip\"',\r\n '[style.max-width]': 'maxWidth()',\r\n },\r\n})\r\nexport class FuiTooltipComponent {\r\n /**\r\n * Tooltip content text\r\n */\r\n readonly content = input.required<string>();\r\n\r\n /**\r\n * Tooltip position\r\n */\r\n readonly position = input.required<TooltipPosition>();\r\n\r\n /**\r\n * Tooltip size\r\n */\r\n readonly size = input.required<TooltipSize>();\r\n\r\n /**\r\n * Maximum width of the tooltip\r\n */\r\n readonly maxWidth = input.required<string>();\r\n\r\n /**\r\n * Whether to show arrow\r\n */\r\n readonly arrow = input.required<boolean>();\r\n\r\n /**\r\n * Tooltip ID for accessibility\r\n */\r\n readonly tooltipId = input.required<string>();\r\n\r\n /**\r\n * Computed CSS classes for the tooltip\r\n */\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const classes: string[] = ['fui-tooltip', `fui-tooltip--${this.size()}`, `fui-tooltip--${this.position()}`];\r\n\r\n if (this.arrow()) {\r\n classes.push('fui-tooltip--with-arrow');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /**\r\n * Computed arrow classes based on position\r\n */\r\n readonly arrowClasses: Signal<string> = computed(() => {\r\n const position = this.position();\r\n const baseClass = 'fui-tooltip__arrow';\r\n\r\n if (position.startsWith('top')) {\r\n return `${baseClass} ${baseClass}--bottom`;\r\n } else if (position.startsWith('bottom')) {\r\n return `${baseClass} ${baseClass}--top`;\r\n } else if (position.startsWith('left')) {\r\n return `${baseClass} ${baseClass}--right`;\r\n } else if (position.startsWith('right')) {\r\n return `${baseClass} ${baseClass}--left`;\r\n }\r\n\r\n return baseClass;\r\n });\r\n}\r\n","<div class=\"fui-tooltip__content\">\r\n {{ content() }}\r\n</div>\r\n@if (arrow()) {\r\n <div [class]=\"arrowClasses()\"></div>\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n input,\r\n computed,\r\n effect,\r\n HostListener,\r\n inject,\r\n Signal,\r\n OnDestroy,\r\n booleanAttribute,\r\n numberAttribute,\r\n ComponentRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport {\r\n TooltipPosition,\r\n TooltipSize,\r\n TooltipTrigger,\r\n TOOLTIP_POSITIONS,\r\n TOOLTIP_SIZES,\r\n TOOLTIP_TRIGGERS,\r\n} from './tooltip.types';\r\nimport { FuiTooltipComponent } from './tooltip.component';\r\nimport { FuiOverlayService, FuiOverlayRef, FuiConnectedPosition } from '@raintonic/formaui/cdk/overlay';\r\n\r\n/**\r\n * # Tooltip Directive\r\n *\r\n * A professional tooltip directive that provides contextual information on hover, focus, or click.\r\n * Follows Material Design patterns with full accessibility support and advanced positioning.\r\n *\r\n * ## Features\r\n * - Multiple positioning options (12 positions)\r\n * - Configurable trigger events (hover, focus, click, manual)\r\n * - Multiple variants for different semantic meanings\r\n * - Flexible sizing options\r\n * - Smart positioning with collision detection\r\n * - Customizable delays and animations\r\n * - Full accessibility support (ARIA attributes, keyboard navigation)\r\n * - Arrow indicator support\r\n * - Responsive design with max-width control\r\n * - Theme support (light/dark)\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Tooltip\r\n * ```html\r\n * <button fuiTooltip=\"Save your changes\">Save</button>\r\n * ```\r\n *\r\n * ### Advanced Configuration\r\n * ```html\r\n * <button fuiTooltip=\"Delete this item permanently\"\r\n * fuiTooltipPosition=\"top\"\r\n * fuiTooltipVariant=\"error\"\r\n * fuiTooltipSize=\"lg\"\r\n * [fuiTooltipShowDelay]=\"500\">\r\n * Delete\r\n * </button>\r\n * ```\r\n *\r\n * ### Click Trigger\r\n * ```html\r\n * <span fuiTooltip=\"Click to copy\"\r\n * fuiTooltipTrigger=\"click\"\r\n * fuiTooltipPosition=\"bottom\">\r\n * 📋 Copy to clipboard\r\n * </span>\r\n * ```\r\n *\r\n * ### Manual Control\r\n * ```html\r\n * <div fuiTooltip=\"Manual tooltip\"\r\n * fuiTooltipTrigger=\"manual\"\r\n * [fuiTooltipShow]=\"showTooltip\">\r\n * Hover me\r\n * </div>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiTooltipDirective],\r\n * template: `\r\n * <button fuiTooltip=\"This will save your work\"\r\n * fuiTooltipPosition=\"top\"\r\n * fuiTooltipVariant=\"info\">\r\n * Save Document\r\n * </button>\r\n * `\r\n * })\r\n * export class MyComponent { }\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiTooltip]',\r\n standalone: true,\r\n exportAs: 'fuiTooltip',\r\n host: {\r\n '[attr.aria-describedby]': 'isVisible() ? tooltipId() : null',\r\n },\r\n})\r\nexport class FuiTooltipDirective implements OnDestroy {\r\n private static _nextId = 0;\r\n /**\r\n * Tooltip content text\r\n */\r\n readonly fuiTooltip = input.required<string>();\r\n\r\n /**\r\n * Tooltip position relative to the trigger element\r\n * @default 'top'\r\n */\r\n readonly fuiTooltipPosition = input<TooltipPosition, TooltipPosition | string>('top', {\r\n transform: (v) => ((TOOLTIP_POSITIONS as readonly string[]).includes(v) ? (v as TooltipPosition) : 'top'),\r\n });\r\n\r\n /**\r\n * Tooltip size\r\n * @default 'md'\r\n */\r\n readonly fuiTooltipSize = input<TooltipSize, TooltipSize | string>('md', {\r\n transform: (v) => ((TOOLTIP_SIZES as readonly string[]).includes(v) ? (v as TooltipSize) : 'md'),\r\n });\r\n\r\n /**\r\n * Tooltip trigger event\r\n * @default 'hover'\r\n */\r\n readonly fuiTooltipTrigger = input<TooltipTrigger, TooltipTrigger | string>('hover', {\r\n transform: (v) => ((TOOLTIP_TRIGGERS as readonly string[]).includes(v) ? (v as TooltipTrigger) : 'hover'),\r\n });\r\n\r\n /**\r\n * Delay before showing tooltip (in milliseconds)\r\n * @default 500\r\n */\r\n readonly fuiTooltipShowDelay = input<number, unknown>(500, { transform: numberAttribute });\r\n\r\n /**\r\n * Delay before hiding tooltip (in milliseconds)\r\n * @default 0\r\n */\r\n readonly fuiTooltipHideDelay = input<number, unknown>(0, { transform: numberAttribute });\r\n\r\n /**\r\n * Whether the tooltip is disabled\r\n * @default false\r\n */\r\n readonly fuiTooltipDisabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Maximum width of the tooltip\r\n * @default '200px'\r\n */\r\n readonly fuiTooltipMaxWidth = input('200px');\r\n\r\n /**\r\n * Offset distance from the trigger element (in pixels)\r\n * @default 8\r\n */\r\n readonly fuiTooltipOffset = input<number, unknown>(8, { transform: numberAttribute });\r\n\r\n /**\r\n * Whether to show an arrow pointing to the trigger element\r\n * @default true\r\n */\r\n readonly fuiTooltipArrow = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Manual control for showing/hiding tooltip (only works with trigger=\"manual\")\r\n * @default false\r\n */\r\n readonly fuiTooltipShow = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n // Internal state\r\n private readonly _isVisible: WritableSignal<boolean> = signal(false);\r\n private readonly _tooltipId: WritableSignal<string> = signal('');\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _tooltipComponent: ComponentRef<FuiTooltipComponent> | null = null;\r\n private _showTimeout: number | null = null;\r\n private _hideTimeout: number | null = null;\r\n private _destroyed = false;\r\n private _isHoveringTooltip = false;\r\n\r\n // Computed properties\r\n readonly isVisible: Signal<boolean> = computed(() => this._isVisible());\r\n readonly tooltipId: Signal<string> = computed(() => this._tooltipId());\r\n\r\n // Injected dependencies\r\n private readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _overlayService: FuiOverlayService = inject(FuiOverlayService);\r\n private readonly _environmentInjector: EnvironmentInjector = inject(EnvironmentInjector);\r\n\r\n constructor() {\r\n // Generate unique tooltip ID\r\n this._tooltipId.set(`fui-tooltip-${FuiTooltipDirective._nextId++}`);\r\n\r\n // Handle manual control\r\n effect(() => {\r\n if (this.fuiTooltipTrigger() === 'manual') {\r\n if (this.fuiTooltipShow()) {\r\n this._showTooltip();\r\n } else {\r\n this._hideTooltip();\r\n }\r\n }\r\n });\r\n\r\n // Handle disabled state\r\n effect(() => {\r\n if (this.fuiTooltipDisabled() && this._isVisible()) {\r\n this._hideTooltip();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._destroyed = true;\r\n this._clearTimeouts();\r\n this._destroyTooltip();\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter(): void {\r\n if (this.fuiTooltipTrigger() === 'hover' && !this.fuiTooltipDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave(): void {\r\n if (this.fuiTooltipTrigger() === 'hover' && !this.fuiTooltipDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n if ((this.fuiTooltipTrigger() === 'focus' || this.fuiTooltipTrigger() === 'hover') && !this.fuiTooltipDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n if ((this.fuiTooltipTrigger() === 'focus' || this.fuiTooltipTrigger() === 'hover') && !this.fuiTooltipDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('click')\r\n onClick(): void {\r\n if (this.fuiTooltipTrigger() === 'click' && !this.fuiTooltipDisabled()) {\r\n if (this._isVisible()) {\r\n this._hideTooltip();\r\n } else {\r\n this._showTooltip();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this._isVisible()) {\r\n this._hideTooltip();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Programmatically show the tooltip\r\n */\r\n show(): void {\r\n if (!this.fuiTooltipDisabled()) {\r\n this._showTooltip();\r\n }\r\n }\r\n\r\n /**\r\n * Programmatically hide the tooltip\r\n */\r\n hide(): void {\r\n this._hideTooltip();\r\n }\r\n\r\n /**\r\n * Toggle tooltip visibility\r\n */\r\n toggle(): void {\r\n if (this._isVisible()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n private _scheduleShow(): void {\r\n if (this._destroyed) {\r\n return;\r\n }\r\n this._clearTimeouts();\r\n\r\n if (this.fuiTooltipShowDelay() > 0) {\r\n this._showTimeout = window.setTimeout(() => {\r\n this._showTooltip();\r\n }, this.fuiTooltipShowDelay());\r\n } else {\r\n this._showTooltip();\r\n }\r\n }\r\n\r\n private _scheduleHide(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiTooltipHideDelay() > 0) {\r\n this._hideTimeout = window.setTimeout(() => {\r\n if (!this._isHoveringTooltip) {\r\n this._hideTooltip();\r\n }\r\n }, this.fuiTooltipHideDelay());\r\n } else {\r\n if (!this._isHoveringTooltip) {\r\n this._hideTooltip();\r\n }\r\n }\r\n }\r\n\r\n private _showTooltip(): void {\r\n if (this._destroyed || this._isVisible() || this.fuiTooltipDisabled() || !this.fuiTooltip().trim()) {\r\n return;\r\n }\r\n\r\n this._createTooltip();\r\n this._isVisible.set(true);\r\n\r\n // Add click outside listener for click trigger\r\n if (this.fuiTooltipTrigger() === 'click') {\r\n setTimeout(() => {\r\n document.addEventListener('click', this._onDocumentClick, true);\r\n });\r\n }\r\n }\r\n\r\n private _hideTooltip(): void {\r\n if (!this._isVisible()) {\r\n return;\r\n }\r\n\r\n this._isVisible.set(false);\r\n this._destroyTooltip();\r\n document.removeEventListener('click', this._onDocumentClick, true);\r\n }\r\n\r\n private _createTooltip(): void {\r\n if (this._overlayRef) {\r\n return;\r\n }\r\n\r\n // Create tooltip component first\r\n this._tooltipComponent = createComponent(FuiTooltipComponent, {\r\n environmentInjector: this._environmentInjector,\r\n });\r\n\r\n // Set tooltip properties immediately\r\n this._tooltipComponent.setInput('content', this.fuiTooltip());\r\n this._tooltipComponent.setInput('position', this.fuiTooltipPosition());\r\n this._tooltipComponent.setInput('size', this.fuiTooltipSize());\r\n this._tooltipComponent.setInput('maxWidth', this.fuiTooltipMaxWidth());\r\n this._tooltipComponent.setInput('arrow', this.fuiTooltipArrow());\r\n this._tooltipComponent.setInput('tooltipId', this.tooltipId());\r\n\r\n // Trigger change detection to ensure component is rendered with correct props\r\n this._tooltipComponent.changeDetectorRef.detectChanges();\r\n\r\n // Now create overlay with positioning strategy\r\n const positions = this._getPositionsForTooltipPosition(this.fuiTooltipPosition());\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(this._elementRef, positions)\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n // Create overlay\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.reposition(20),\r\n panelClass: 'fui-tooltip-panel',\r\n });\r\n\r\n // Attach component to overlay\r\n this._overlayRef.attach(this._tooltipComponent);\r\n\r\n // Set up hover events for tooltip persistence\r\n const tooltipElement = this._tooltipComponent.location.nativeElement;\r\n\r\n tooltipElement.addEventListener('mouseenter', () => {\r\n this._isHoveringTooltip = true;\r\n this._clearTimeouts();\r\n });\r\n\r\n tooltipElement.addEventListener('mouseleave', () => {\r\n this._isHoveringTooltip = false;\r\n if (this.fuiTooltipTrigger() === 'hover') {\r\n this._scheduleHide();\r\n }\r\n });\r\n }\r\n\r\n private _getPositionsForTooltipPosition(position: TooltipPosition): FuiConnectedPosition[] {\r\n const offset = this.fuiTooltipOffset();\r\n const positionMap: Record<TooltipPosition, FuiConnectedPosition[]> = {\r\n top: [\r\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\r\n ],\r\n 'top-start': [\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n ],\r\n 'top-end': [\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\r\n ],\r\n bottom: [\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\r\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\r\n ],\r\n 'bottom-start': [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n ],\r\n 'bottom-end': [\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\r\n ],\r\n left: [\r\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\r\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\r\n ],\r\n 'left-start': [\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\r\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\r\n ],\r\n 'left-end': [\r\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\r\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\r\n ],\r\n right: [\r\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\r\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\r\n ],\r\n 'right-start': [\r\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\r\n ],\r\n 'right-end': [\r\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\r\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\r\n ],\r\n };\r\n\r\n return positionMap[position] || positionMap.top;\r\n }\r\n\r\n private _destroyTooltip(): void {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n if (this._tooltipComponent) {\r\n this._tooltipComponent.destroy();\r\n this._tooltipComponent = null;\r\n }\r\n }\r\n\r\n private _clearTimeouts(): void {\r\n if (this._showTimeout) {\r\n clearTimeout(this._showTimeout);\r\n this._showTimeout = null;\r\n }\r\n if (this._hideTimeout) {\r\n clearTimeout(this._hideTimeout);\r\n this._hideTimeout = null;\r\n }\r\n }\r\n\r\n private readonly _onDocumentClick = (event: Event): void => {\r\n const target = event.target as HTMLElement;\r\n const triggerElement = this._elementRef.nativeElement;\r\n const tooltipElement = this._tooltipComponent?.location.nativeElement;\r\n\r\n if (target && !triggerElement.contains(target) && !tooltipElement?.contains(target)) {\r\n this._hideTooltip();\r\n }\r\n };\r\n}\r\n","// Public API for tooltip component\r\nexport * from './tooltip.directive';\r\nexport * from './tooltip.component';\r\nexport * from './tooltip.types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* # FuiTopbarComponent
|
|
6
|
+
*
|
|
7
|
+
* A responsive topbar navigation component with a two-row layout:
|
|
8
|
+
* the top row contains brand/actions and menu items; the bottom row
|
|
9
|
+
* is a content projection slot (`[fuiTopbarBottomRow]`) for tabs,
|
|
10
|
+
* search bars, or other secondary content.
|
|
11
|
+
*
|
|
12
|
+
* ## Features
|
|
13
|
+
* - CSS Grid layout (two rows by default)
|
|
14
|
+
* - Content projection slots: start, bottom-row, expand, end
|
|
15
|
+
* - `ariaLabel` for accessible navigation region
|
|
16
|
+
* - `itemClick` output emits the clicked `MenuItem`
|
|
17
|
+
*
|
|
18
|
+
* ## Usage
|
|
19
|
+
*
|
|
20
|
+
* ```html
|
|
21
|
+
* <fui-topbar
|
|
22
|
+
* [items]="menuItems"
|
|
23
|
+
* ariaLabel="Main navigation"
|
|
24
|
+
* (itemClick)="onItemClick($event)"
|
|
25
|
+
* >
|
|
26
|
+
* <div fuiTopbarStart>My App</div>
|
|
27
|
+
* <app-tabs fuiTopbarBottomRow [tabs]="tabItems" />
|
|
28
|
+
* <button fuiTopbarExpand>☰</button>
|
|
29
|
+
* <div fuiTopbarEnd>
|
|
30
|
+
* <fui-avatar />
|
|
31
|
+
* </div>
|
|
32
|
+
* </fui-topbar>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
class FuiTopbarComponent {
|
|
36
|
+
/** Array of menu items to render in the top row. */
|
|
37
|
+
items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
38
|
+
/** Emitted when any clickable menu item is activated. */
|
|
39
|
+
itemClick = output();
|
|
40
|
+
/** @internal Whether the items array is empty (used for host class). */
|
|
41
|
+
_isEmpty = computed(() => !this.items() || this.items().length === 0, ...(ngDevMode ? [{ debugName: "_isEmpty" }] : /* istanbul ignore next */ []));
|
|
42
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
43
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiTopbarComponent, isStandalone: true, selector: "fui-topbar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { attributes: { "role": "navigation" }, properties: { "attr.aria-label": "\"Topbar navigation\"", "class.fui-topbar--empty-items": "_isEmpty()" }, classAttribute: "fui-topbar" }, ngImport: i0, template: "<div class=\"fui-topbar__start\">\r\n <ng-content select=\"[fuiTopbarStart]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__menu\">\r\n <!-- TODO: must create mega-menu or finish nested submenus in dropdown-menu -->\r\n</div>\r\n\r\n<div class=\"fui-topbar__expand\">\r\n <ng-content select=\"[fuiTopbarExpand]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__end\">\r\n <ng-content select=\"[fuiTopbarEnd]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__bottom-row\">\r\n <ng-content select=\"[fuiTopbarBottomRow]\"></ng-content>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}:host{--fui-topbar-bg: var(--fui-bg-subtle);--fui-topbar-border-color: var(--fui-neutral-40);--fui-topbar-item-color: var(--fui-text-secondary);--fui-topbar-item-bg-hover: var(--fui-bg-muted);--fui-topbar-item-bg-active: var(--fui-primary-10);--fui-topbar-height: 51px;--fui-topbar-item-radius: var(--fui-radius-sm);--fui-topbar-item-gap: var(--fui-spacing-2);--fui-topbar-item-padding-y: var(--fui-spacing-2);--fui-topbar-item-padding-x: var(--fui-spacing-3);--fui-topbar-padding-x: var(--fui-spacing-4);--fui-topbar-font-family: var(--fui-font-sans);--fui-topbar-font-size: var(--fui-text-sm);--fui-topbar-font-weight: var(--fui-weight-regular);--fui-topbar-transition-duration: var(--fui-duration-fast);--fui-topbar-transition-easing: var(--fui-ease-out);display:grid;grid-template-columns:auto 1fr auto auto;grid-template-rows:var(--fui-topbar-height) auto;align-items:center;width:100%;height:auto;padding:0 var(--fui-topbar-padding-x);background-color:var(--fui-topbar-bg);border-bottom:1px solid var(--fui-topbar-border-color);box-sizing:border-box;gap:var(--fui-spacing-2)}.fui-topbar__start{grid-column:1;grid-row:1;display:flex;align-items:center}.fui-topbar__menu{grid-column:2;grid-row:1;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:var(--fui-topbar-item-gap);overflow:hidden}.fui-topbar__expand{grid-column:3;grid-row:1;display:flex;align-items:center}.fui-topbar__end{grid-column:4;grid-row:1;display:flex;align-items:center;justify-content:flex-end}.fui-topbar__bottom-row{grid-column:1/-1;grid-row:2;display:flex;align-items:center}@media(max-width:640px){:host.fui-topbar--hidden{display:none}}@media(prefers-reduced-motion:reduce){.fui-topbar__item{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTopbarComponent, decorators: [{
|
|
46
|
+
type: Component,
|
|
47
|
+
args: [{ selector: 'fui-topbar', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
48
|
+
role: 'navigation',
|
|
49
|
+
'[attr.aria-label]': '"Topbar navigation"',
|
|
50
|
+
class: 'fui-topbar',
|
|
51
|
+
'[class.fui-topbar--empty-items]': '_isEmpty()',
|
|
52
|
+
}, template: "<div class=\"fui-topbar__start\">\r\n <ng-content select=\"[fuiTopbarStart]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__menu\">\r\n <!-- TODO: must create mega-menu or finish nested submenus in dropdown-menu -->\r\n</div>\r\n\r\n<div class=\"fui-topbar__expand\">\r\n <ng-content select=\"[fuiTopbarExpand]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__end\">\r\n <ng-content select=\"[fuiTopbarEnd]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__bottom-row\">\r\n <ng-content select=\"[fuiTopbarBottomRow]\"></ng-content>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}:host{--fui-topbar-bg: var(--fui-bg-subtle);--fui-topbar-border-color: var(--fui-neutral-40);--fui-topbar-item-color: var(--fui-text-secondary);--fui-topbar-item-bg-hover: var(--fui-bg-muted);--fui-topbar-item-bg-active: var(--fui-primary-10);--fui-topbar-height: 51px;--fui-topbar-item-radius: var(--fui-radius-sm);--fui-topbar-item-gap: var(--fui-spacing-2);--fui-topbar-item-padding-y: var(--fui-spacing-2);--fui-topbar-item-padding-x: var(--fui-spacing-3);--fui-topbar-padding-x: var(--fui-spacing-4);--fui-topbar-font-family: var(--fui-font-sans);--fui-topbar-font-size: var(--fui-text-sm);--fui-topbar-font-weight: var(--fui-weight-regular);--fui-topbar-transition-duration: var(--fui-duration-fast);--fui-topbar-transition-easing: var(--fui-ease-out);display:grid;grid-template-columns:auto 1fr auto auto;grid-template-rows:var(--fui-topbar-height) auto;align-items:center;width:100%;height:auto;padding:0 var(--fui-topbar-padding-x);background-color:var(--fui-topbar-bg);border-bottom:1px solid var(--fui-topbar-border-color);box-sizing:border-box;gap:var(--fui-spacing-2)}.fui-topbar__start{grid-column:1;grid-row:1;display:flex;align-items:center}.fui-topbar__menu{grid-column:2;grid-row:1;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:var(--fui-topbar-item-gap);overflow:hidden}.fui-topbar__expand{grid-column:3;grid-row:1;display:flex;align-items:center}.fui-topbar__end{grid-column:4;grid-row:1;display:flex;align-items:center;justify-content:flex-end}.fui-topbar__bottom-row{grid-column:1/-1;grid-row:2;display:flex;align-items:center}@media(max-width:640px){:host.fui-topbar--hidden{display:none}}@media(prefers-reduced-motion:reduce){.fui-topbar__item{transition:none}}\n"] }]
|
|
53
|
+
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Generated bundle index. Do not edit.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
export { FuiTopbarComponent };
|
|
60
|
+
//# sourceMappingURL=raintonic-formaui-components-topbar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-topbar.mjs","sources":["../../../lib/components/topbar/topbar.component.ts","../../../lib/components/topbar/topbar.component.html","../../../lib/components/topbar/raintonic-formaui-components-topbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, output, computed } from '@angular/core';\r\nimport { MenuItem } from '@raintonic/formaui/core';\r\n\r\n/**\r\n * # FuiTopbarComponent\r\n *\r\n * A responsive topbar navigation component with a two-row layout:\r\n * the top row contains brand/actions and menu items; the bottom row\r\n * is a content projection slot (`[fuiTopbarBottomRow]`) for tabs,\r\n * search bars, or other secondary content.\r\n *\r\n * ## Features\r\n * - CSS Grid layout (two rows by default)\r\n * - Content projection slots: start, bottom-row, expand, end\r\n * - `ariaLabel` for accessible navigation region\r\n * - `itemClick` output emits the clicked `MenuItem`\r\n *\r\n * ## Usage\r\n *\r\n * ```html\r\n * <fui-topbar\r\n * [items]=\"menuItems\"\r\n * ariaLabel=\"Main navigation\"\r\n * (itemClick)=\"onItemClick($event)\"\r\n * >\r\n * <div fuiTopbarStart>My App</div>\r\n * <app-tabs fuiTopbarBottomRow [tabs]=\"tabItems\" />\r\n * <button fuiTopbarExpand>☰</button>\r\n * <div fuiTopbarEnd>\r\n * <fui-avatar />\r\n * </div>\r\n * </fui-topbar>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-topbar',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './topbar.component.html',\r\n styleUrl: './topbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n role: 'navigation',\r\n '[attr.aria-label]': '\"Topbar navigation\"',\r\n class: 'fui-topbar',\r\n '[class.fui-topbar--empty-items]': '_isEmpty()',\r\n },\r\n})\r\nexport class FuiTopbarComponent {\r\n /** Array of menu items to render in the top row. */\r\n readonly items = input<MenuItem[]>([]);\r\n\r\n /** Emitted when any clickable menu item is activated. */\r\n readonly itemClick = output<MenuItem>();\r\n\r\n /** @internal Whether the items array is empty (used for host class). */\r\n readonly _isEmpty = computed(() => !this.items() || this.items().length === 0);\r\n}\r\n","<div class=\"fui-topbar__start\">\r\n <ng-content select=\"[fuiTopbarStart]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__menu\">\r\n <!-- TODO: must create mega-menu or finish nested submenus in dropdown-menu -->\r\n</div>\r\n\r\n<div class=\"fui-topbar__expand\">\r\n <ng-content select=\"[fuiTopbarExpand]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__end\">\r\n <ng-content select=\"[fuiTopbarEnd]\"></ng-content>\r\n</div>\r\n\r\n<div class=\"fui-topbar__bottom-row\">\r\n <ng-content select=\"[fuiTopbarBottomRow]\"></ng-content>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MAeU,kBAAkB,CAAA;;AAEpB,IAAA,KAAK,GAAG,KAAK,CAAa,EAAE,4EAAC;;IAG7B,SAAS,GAAG,MAAM,EAAY;;IAG9B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;uGARnE,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,waChD/B,okBAmBA,EAAA,MAAA,EAAA,CAAA,0qHAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD6Ba,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,EAAE,mBAGM,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,KAAK,EAAE,YAAY;AACnB,wBAAA,iCAAiC,EAAE,YAAY;AAChD,qBAAA,EAAA,QAAA,EAAA,okBAAA,EAAA,MAAA,EAAA,CAAA,0qHAAA,CAAA,EAAA;;;AE9CH;;AAEG;;;;"}
|
|
@@ -3,13 +3,17 @@ import { input, output, signal, computed, inject, ElementRef, forwardRef, ViewCh
|
|
|
3
3
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
4
|
import { Subject } from 'rxjs';
|
|
5
5
|
import { FUI_FORM_FIELD_CONTROL } from '@raintonic/formaui/core';
|
|
6
|
-
import
|
|
6
|
+
import * as i1 from '@raintonic/formaui/cdk/form-field';
|
|
7
|
+
import { injectNgControl, FuiPopupOverlayDirective, FuiFormControlSyncDirective } from '@raintonic/formaui/cdk/form-field';
|
|
7
8
|
import { FuiTreeComponent } from '@raintonic/formaui/components/tree';
|
|
8
9
|
import { FuiIconComponent } from '@raintonic/formaui/components/icon';
|
|
9
10
|
import { FuiBadgeComponent } from '@raintonic/formaui/components/badge';
|
|
10
|
-
import { FuiOverlayService } from '@raintonic/formaui/cdk/overlay';
|
|
11
11
|
|
|
12
12
|
let nextId = 0;
|
|
13
|
+
// No Validator interface: only Validators.required is applicable to tree-select,
|
|
14
|
+
// and that is handled by the standard CVA + form integration path.
|
|
15
|
+
// If a future public API adds minSelected / maxSelected / requiredLeafOnly inputs,
|
|
16
|
+
// implement Validator at that point (mirror the time-picker pattern in Task 23).
|
|
13
17
|
class FuiTreeSelectComponent {
|
|
14
18
|
// Public API
|
|
15
19
|
nodes = input.required(...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
|
|
@@ -20,6 +24,7 @@ class FuiTreeSelectComponent {
|
|
|
20
24
|
nodeTemplate = input(null, ...(ngDevMode ? [{ debugName: "nodeTemplate" }] : /* istanbul ignore next */ []));
|
|
21
25
|
displayField = input(null, ...(ngDevMode ? [{ debugName: "displayField" }] : /* istanbul ignore next */ []));
|
|
22
26
|
disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled' });
|
|
27
|
+
readonlyInput = input(false, { ...(ngDevMode ? { debugName: "readonlyInput" } : /* istanbul ignore next */ {}), alias: 'readonly' });
|
|
23
28
|
selectionChange = output();
|
|
24
29
|
// FuiFormFieldControl implementation
|
|
25
30
|
stateChanges = new Subject();
|
|
@@ -34,19 +39,25 @@ class FuiTreeSelectComponent {
|
|
|
34
39
|
required = signal(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
35
40
|
_disabled = signal(false, ...(ngDevMode ? [{ debugName: "_disabled" }] : /* istanbul ignore next */ []));
|
|
36
41
|
disabled = computed(() => this._disabled() || this.disabledInput(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
42
|
+
readonly = computed(() => this.readonlyInput(), ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
37
43
|
errorState = signal(false, ...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
|
|
38
44
|
controlType = 'fui-tree-select';
|
|
39
45
|
id = `fui-tree-select-${nextId++}`;
|
|
40
46
|
// Internal
|
|
41
|
-
|
|
47
|
+
/** Whether the panel is open — projected from FuiPopupOverlayDirective. */
|
|
48
|
+
_panelOpen = computed(() => this._popup.panelOpen(), ...(ngDevMode ? [{ debugName: "_panelOpen" }] : /* istanbul ignore next */ []));
|
|
42
49
|
_treeId = `${this.id}-tree`;
|
|
43
50
|
_searchFilter = signal('', ...(ngDevMode ? [{ debugName: "_searchFilter" }] : /* istanbul ignore next */ []));
|
|
44
|
-
|
|
51
|
+
_activeNodeId = signal(null, ...(ngDevMode ? [{ debugName: "_activeNodeId" }] : /* istanbul ignore next */ []));
|
|
52
|
+
/** ID of the tree-node currently highlighted via keyboard nav. Bound to aria-activedescendant. */
|
|
53
|
+
activeDescendant = computed(() => this._activeNodeId(), ...(ngDevMode ? [{ debugName: "activeDescendant" }] : /* istanbul ignore next */ []));
|
|
45
54
|
_ngControlRef = injectNgControl();
|
|
46
55
|
get ngControl() {
|
|
47
56
|
return this._ngControlRef.ngControl;
|
|
48
57
|
}
|
|
49
|
-
|
|
58
|
+
// Injected host directives
|
|
59
|
+
_popup = inject(FuiPopupOverlayDirective);
|
|
60
|
+
_formSync = inject(FuiFormControlSyncDirective);
|
|
50
61
|
_elementRef = inject(ElementRef);
|
|
51
62
|
// Track selected nodes internally
|
|
52
63
|
_selectedNodes = signal([], ...(ngDevMode ? [{ debugName: "_selectedNodes" }] : /* istanbul ignore next */ []));
|
|
@@ -66,7 +77,19 @@ class FuiTreeSelectComponent {
|
|
|
66
77
|
}
|
|
67
78
|
});
|
|
68
79
|
}
|
|
80
|
+
ngAfterViewInit() {
|
|
81
|
+
// Wire popup-overlay directive
|
|
82
|
+
this._popup.setTrigger(this.trigger ?? null);
|
|
83
|
+
this._popup.setPanel(this.panel ?? null);
|
|
84
|
+
this._popup.panelClass.set(['fui-tree-select-overlay-panel']);
|
|
85
|
+
this._popup.backdropClass.set('fui-tree-select-backdrop');
|
|
86
|
+
// Wire form-control-sync directive signals
|
|
87
|
+
this._formSync.errorState.set(this.errorState);
|
|
88
|
+
this._formSync.required.set(this.required);
|
|
89
|
+
this._formSync.stateChanges.set(this.stateChanges);
|
|
90
|
+
}
|
|
69
91
|
// Methods
|
|
92
|
+
/** Toggles the tree-select panel. No-op if disabled. */
|
|
70
93
|
toggle() {
|
|
71
94
|
if (this._panelOpen()) {
|
|
72
95
|
this.close();
|
|
@@ -75,31 +98,29 @@ class FuiTreeSelectComponent {
|
|
|
75
98
|
this.open();
|
|
76
99
|
}
|
|
77
100
|
}
|
|
101
|
+
/** Opens the tree-select panel. No-op if disabled or already open. */
|
|
78
102
|
open() {
|
|
79
103
|
if (this.disabled() || this._panelOpen())
|
|
80
104
|
return;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
this.stateChanges.next();
|
|
85
|
-
setTimeout(() => {
|
|
86
|
-
this._createOverlay();
|
|
87
|
-
});
|
|
88
|
-
});
|
|
105
|
+
this.focused.set(true);
|
|
106
|
+
this.stateChanges.next();
|
|
107
|
+
this._popup.open();
|
|
89
108
|
}
|
|
109
|
+
/** Closes the tree-select panel, resets the search filter, and marks the control as touched. */
|
|
90
110
|
close() {
|
|
91
111
|
if (!this._panelOpen())
|
|
92
112
|
return;
|
|
93
|
-
this._panelOpen.set(false);
|
|
94
|
-
this.focused.set(false);
|
|
95
113
|
this._searchFilter.set('');
|
|
96
|
-
this.
|
|
114
|
+
this._popup.close();
|
|
115
|
+
this.focused.set(false);
|
|
97
116
|
this._onTouched();
|
|
98
117
|
this.stateChanges.next();
|
|
99
118
|
}
|
|
119
|
+
/** Opens the panel when the form-field container is clicked. */
|
|
100
120
|
onContainerClick(_event) {
|
|
101
121
|
this.toggle();
|
|
102
122
|
}
|
|
123
|
+
/** Stores the space-separated list of IDs for the aria-describedby attribute. */
|
|
103
124
|
setDescribedByIds(_ids) {
|
|
104
125
|
/* no-op for now */
|
|
105
126
|
}
|
|
@@ -147,6 +168,10 @@ class FuiTreeSelectComponent {
|
|
|
147
168
|
const value = event.target.value;
|
|
148
169
|
this._searchFilter.set(value);
|
|
149
170
|
}
|
|
171
|
+
/** Called when the embedded tree reports a keyboard focus change. Updates aria-activedescendant. */
|
|
172
|
+
_onTreeFocusChange(nodeId) {
|
|
173
|
+
this._activeNodeId.set(nodeId);
|
|
174
|
+
}
|
|
150
175
|
_onKeydown(event) {
|
|
151
176
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
152
177
|
if (!this._panelOpen()) {
|
|
@@ -157,6 +182,7 @@ class FuiTreeSelectComponent {
|
|
|
157
182
|
else if (event.key === 'Escape') {
|
|
158
183
|
if (this._panelOpen()) {
|
|
159
184
|
event.preventDefault();
|
|
185
|
+
event.stopPropagation();
|
|
160
186
|
this.close();
|
|
161
187
|
}
|
|
162
188
|
}
|
|
@@ -165,34 +191,28 @@ class FuiTreeSelectComponent {
|
|
|
165
191
|
return this.selectionMode();
|
|
166
192
|
}, ...(ngDevMode ? [{ debugName: "_treeSelectionMode" }] : /* istanbul ignore next */ []));
|
|
167
193
|
// CVA
|
|
194
|
+
/** Sets the tree-select value from the form model and syncs node selection state. */
|
|
168
195
|
writeValue(value) {
|
|
169
196
|
this._value.set(value);
|
|
170
197
|
this._syncSelectedFromValue(value);
|
|
171
198
|
this.stateChanges.next();
|
|
172
199
|
}
|
|
200
|
+
/** Registers the callback Angular calls when the value should propagate to the model. */
|
|
173
201
|
registerOnChange(fn) {
|
|
174
202
|
this._onChange = fn;
|
|
175
203
|
}
|
|
204
|
+
/** Registers the callback Angular calls when the control should be marked as touched. */
|
|
176
205
|
registerOnTouched(fn) {
|
|
177
206
|
this._onTouched = fn;
|
|
178
207
|
}
|
|
208
|
+
/** Enables or disables the control programmatically; mirrors the `disabled` form-control state. */
|
|
179
209
|
setDisabledState(disabled) {
|
|
180
210
|
this._disabled.set(disabled);
|
|
181
211
|
this.stateChanges.next();
|
|
182
212
|
}
|
|
183
213
|
ngOnDestroy() {
|
|
184
|
-
this._disposeOverlay();
|
|
185
214
|
this.stateChanges.complete();
|
|
186
215
|
}
|
|
187
|
-
ngDoCheck() {
|
|
188
|
-
if (this.ngControl) {
|
|
189
|
-
const control = this.ngControl.control;
|
|
190
|
-
if (control) {
|
|
191
|
-
const isInvalid = control.invalid && (control.touched || false);
|
|
192
|
-
this.errorState.set(isInvalid);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
216
|
// Private helpers
|
|
197
217
|
_getNodeLabel(node) {
|
|
198
218
|
const displayFn = this.displayField();
|
|
@@ -237,53 +257,22 @@ class FuiTreeSelectComponent {
|
|
|
237
257
|
}
|
|
238
258
|
// For now, leave nodes as-is since the consumer controls node.selected
|
|
239
259
|
}
|
|
240
|
-
_createOverlay() {
|
|
241
|
-
if (this._overlayRef || !this.panel)
|
|
242
|
-
return;
|
|
243
|
-
const triggerElement = this._elementRef.nativeElement;
|
|
244
|
-
const triggerWidth = triggerElement.getBoundingClientRect().width;
|
|
245
|
-
const positions = [
|
|
246
|
-
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },
|
|
247
|
-
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },
|
|
248
|
-
];
|
|
249
|
-
const positionStrategy = this._overlayService
|
|
250
|
-
.position()
|
|
251
|
-
.connectedTo(triggerElement, positions)
|
|
252
|
-
.withPush(true)
|
|
253
|
-
.withViewportMargin(8);
|
|
254
|
-
this._overlayRef = this._overlayService.create({
|
|
255
|
-
positionStrategy,
|
|
256
|
-
scrollStrategy: this._overlayService.scrollStrategies.reposition(),
|
|
257
|
-
hasBackdrop: true,
|
|
258
|
-
backdropClass: 'fui-tree-select-backdrop',
|
|
259
|
-
backdropClickBehavior: 'close',
|
|
260
|
-
panelClass: ['fui-tree-select-overlay-panel'],
|
|
261
|
-
minWidth: triggerWidth,
|
|
262
|
-
});
|
|
263
|
-
this._overlayRef.backdropClick.subscribe(() => {
|
|
264
|
-
this.close();
|
|
265
|
-
});
|
|
266
|
-
this._overlayRef.keydownEvents.subscribe((event) => {
|
|
267
|
-
if (event.key === 'Escape')
|
|
268
|
-
this.close();
|
|
269
|
-
});
|
|
270
|
-
this._overlayRef.attach(this.panel.nativeElement);
|
|
271
|
-
}
|
|
272
|
-
_disposeOverlay() {
|
|
273
|
-
if (this._overlayRef) {
|
|
274
|
-
this._overlayRef.dispose();
|
|
275
|
-
this._overlayRef = null;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
260
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
279
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiTreeSelectComponent, isStandalone: true, selector: "fui-tree-select", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: true, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, placeholderInput: { classPropertyName: "placeholderInput", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null }, loadChildren: { classPropertyName: "loadChildren", publicName: "loadChildren", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { attributes: { "role": "combobox", "tabindex": "0" }, listeners: { "click": "toggle()", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-expanded": "_panelOpen()", "attr.aria-haspopup": "\"tree\"", "attr.aria-owns": "_panelOpen() ? _treeId : null", "class.fui-tree-select--open": "_panelOpen()", "class.fui-tree-select--disabled": "disabled()" }, classAttribute: "fui-tree-select" }, providers: [
|
|
261
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiTreeSelectComponent, isStandalone: true, selector: "fui-tree-select", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: true, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, placeholderInput: { classPropertyName: "placeholderInput", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null }, loadChildren: { classPropertyName: "loadChildren", publicName: "loadChildren", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonlyInput: { classPropertyName: "readonlyInput", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { attributes: { "role": "combobox", "tabindex": "0" }, listeners: { "click": "toggle()", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-expanded": "_panelOpen()", "attr.aria-haspopup": "\"tree\"", "attr.aria-owns": "_panelOpen() ? _treeId : null", "attr.aria-activedescendant": "activeDescendant()", "class.fui-tree-select--open": "_panelOpen()", "class.fui-tree-select--disabled": "disabled()" }, classAttribute: "fui-tree-select" }, providers: [
|
|
280
262
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FuiTreeSelectComponent), multi: true },
|
|
281
263
|
{ provide: FUI_FORM_FIELD_CONTROL, useExisting: forwardRef(() => FuiTreeSelectComponent) },
|
|
282
|
-
], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: "<!-- Trigger area -->\r\n<div class=\"fui-tree-select__trigger\" #trigger>\r\n @if (empty()) {\r\n <span class=\"fui-tree-select__placeholder\">{{ placeholder() }}</span>\r\n } @else if (selectionMode() === 'single') {\r\n <span class=\"fui-tree-select__value\">{{ _getDisplayValue() }}</span>\r\n } @else {\r\n <div class=\"fui-tree-select__tags\">\r\n @for (tag of _getSelectedDisplayValues(); track tag) {\r\n <fui-badge [label]=\"tag\" size=\"sm\" variant=\"secondary\"></fui-badge>\r\n }\r\n </div>\r\n }\r\n <fui-icon class=\"fui-tree-select__arrow\" [name]=\"_panelOpen() ? 'caret-up' : 'caret-down'\" size=\"sm\"></fui-icon>\r\n</div>\r\n\r\n<!-- Panel (rendered always but hidden, moved to overlay when open) -->\r\n<div class=\"fui-tree-select__panel\" [id]=\"_treeId\" #panel [style.display]=\"_panelOpen() ? '' : 'none'\">\r\n @if (showSearch()) {\r\n <div class=\"fui-tree-select__search\">\r\n <input\r\n class=\"fui-tree-select__search-input\"\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n (input)=\"_onSearchInput($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n }\r\n <fui-tree\r\n [nodes]=\"nodes()\"\r\n [selectionMode]=\"_treeSelectionMode()\"\r\n [loadChildren]=\"loadChildren()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [filter]=\"_searchFilter()\"\r\n (nodeSelect)=\"_onTreeSelect($event)\"\r\n (nodeUnselect)=\"_onTreeUnselect($event)\"\r\n >\r\n </fui-tree>\r\n</div>\r\n", styles: [".fui-tree-select{display:inline-flex;align-items:center;width:100%;min-height:40px;padding:8px 12px;border:1px solid var(--fui-border-
|
|
264
|
+
], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }], hostDirectives: [{ directive: i1.FuiPopupOverlayDirective, inputs: ["positions", "positions", "panelClass", "panelClass", "backdropClass", "backdropClass", "scrollStrategy", "scrollStrategy", "minWidthFromTrigger", "minWidthFromTrigger"], outputs: ["openedChange", "openedChange", "escapeKey", "escapeKey"] }, { directive: i1.FuiFormControlSyncDirective }], ngImport: i0, template: "<!-- Trigger area -->\r\n<div class=\"fui-tree-select__trigger\" #trigger>\r\n @if (empty()) {\r\n <span class=\"fui-tree-select__placeholder\">{{ placeholder() }}</span>\r\n } @else if (selectionMode() === 'single') {\r\n <span class=\"fui-tree-select__value\">{{ _getDisplayValue() }}</span>\r\n } @else {\r\n <div class=\"fui-tree-select__tags\">\r\n @for (tag of _getSelectedDisplayValues(); track tag) {\r\n <fui-badge [label]=\"tag\" size=\"sm\" variant=\"secondary\"></fui-badge>\r\n }\r\n </div>\r\n }\r\n <fui-icon class=\"fui-tree-select__arrow\" [name]=\"_panelOpen() ? 'caret-up' : 'caret-down'\" size=\"sm\"></fui-icon>\r\n</div>\r\n\r\n<!-- Panel (rendered always but hidden, moved to overlay when open) -->\r\n<div class=\"fui-tree-select__panel\" [id]=\"_treeId\" #panel [style.display]=\"_panelOpen() ? '' : 'none'\">\r\n @if (showSearch()) {\r\n <div class=\"fui-tree-select__search\">\r\n <input\r\n class=\"fui-tree-select__search-input\"\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n (input)=\"_onSearchInput($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n }\r\n <fui-tree\r\n [nodes]=\"nodes()\"\r\n [selectionMode]=\"_treeSelectionMode()\"\r\n [loadChildren]=\"loadChildren()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [filter]=\"_searchFilter()\"\r\n [nodeIdPrefix]=\"_treeId\"\r\n (nodeSelect)=\"_onTreeSelect($event)\"\r\n (nodeUnselect)=\"_onTreeUnselect($event)\"\r\n (focusChange)=\"_onTreeFocusChange($event)\"\r\n >\r\n </fui-tree>\r\n</div>\r\n", styles: [".fui-tree-select{display:inline-flex;align-items:center;width:100%;min-height:40px;padding:8px 12px;border:1px solid var(--fui-border-default);border-radius:var(--fui-radius-sm);background:var(--fui-field-bg);cursor:pointer;outline:none;font-family:var(--fui-font-family);font-size:var(--fui-text-md);transition:border-color var(--fui-duration-base) var(--fui-ease-in-out)}.fui-tree-select:hover{border-color:var(--fui-primary-60)}.fui-tree-select:focus{outline:2px solid var(--fui-primary-60);outline-offset:-2px}.fui-tree-select--disabled{opacity:.5;pointer-events:none}.fui-tree-select--open{border-color:var(--fui-primary-60)}.fui-tree-select__trigger{display:flex;align-items:center;width:100%;gap:8px}.fui-tree-select__placeholder{color:var(--fui-text-disabled);flex:1}.fui-tree-select__value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-tree-select__tags{display:flex;flex-wrap:wrap;gap:4px;flex:1}.fui-tree-select__arrow{flex-shrink:0;color:var(--fui-text-secondary);transition:transform var(--fui-duration-base) var(--fui-ease-in-out)}.fui-tree-select__panel{background:var(--fui-bg-default);border:1px solid var(--fui-border-default);border-radius:var(--fui-radius-sm);box-shadow:var(--fui-shadow-lg);max-height:300px;overflow:auto}.fui-tree-select__search{padding:8px;border-bottom:1px solid var(--fui-border-default)}.fui-tree-select__search-input{width:100%;padding:4px 8px;border:1px solid var(--fui-border-default);border-radius:var(--fui-radius-sm);font-family:var(--fui-font-family);font-size:var(--fui-text-base);outline:none;background:var(--fui-field-bg)}.fui-tree-select__search-input:focus{border-color:var(--fui-primary-60)}.fui-tree-select-backdrop{background:transparent}\n"], dependencies: [{ kind: "component", type: FuiTreeComponent, selector: "fui-tree", inputs: ["nodes", "selectionMode", "loadChildren", "nodeTemplate", "draggable", "virtualScroll", "virtualItemSize", "filter", "nodeIdPrefix"], outputs: ["nodeSelect", "nodeUnselect", "nodeExpand", "nodeCollapse", "nodeDrop", "filterChange", "focusChange"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "component", type: FuiBadgeComponent, selector: "fui-badge", inputs: ["label", "icon", "customColor", "size", "variant", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
283
265
|
}
|
|
284
266
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTreeSelectComponent, decorators: [{
|
|
285
267
|
type: Component,
|
|
286
|
-
args: [{ selector: 'fui-tree-select', standalone: true, imports: [FuiTreeComponent, FuiIconComponent, FuiBadgeComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None,
|
|
268
|
+
args: [{ selector: 'fui-tree-select', standalone: true, imports: [FuiTreeComponent, FuiIconComponent, FuiBadgeComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, hostDirectives: [
|
|
269
|
+
{
|
|
270
|
+
directive: FuiPopupOverlayDirective,
|
|
271
|
+
inputs: ['positions', 'panelClass', 'backdropClass', 'scrollStrategy', 'minWidthFromTrigger'],
|
|
272
|
+
outputs: ['openedChange', 'escapeKey'],
|
|
273
|
+
},
|
|
274
|
+
FuiFormControlSyncDirective,
|
|
275
|
+
], providers: [
|
|
287
276
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FuiTreeSelectComponent), multi: true },
|
|
288
277
|
{ provide: FUI_FORM_FIELD_CONTROL, useExisting: forwardRef(() => FuiTreeSelectComponent) },
|
|
289
278
|
], host: {
|
|
@@ -292,13 +281,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
292
281
|
'[attr.aria-expanded]': '_panelOpen()',
|
|
293
282
|
'[attr.aria-haspopup]': '"tree"',
|
|
294
283
|
'[attr.aria-owns]': '_panelOpen() ? _treeId : null',
|
|
284
|
+
'[attr.aria-activedescendant]': 'activeDescendant()',
|
|
295
285
|
'[class.fui-tree-select--open]': '_panelOpen()',
|
|
296
286
|
'[class.fui-tree-select--disabled]': 'disabled()',
|
|
297
287
|
'(click)': 'toggle()',
|
|
298
288
|
'(keydown)': '_onKeydown($event)',
|
|
299
289
|
tabindex: '0',
|
|
300
|
-
}, template: "<!-- Trigger area -->\r\n<div class=\"fui-tree-select__trigger\" #trigger>\r\n @if (empty()) {\r\n <span class=\"fui-tree-select__placeholder\">{{ placeholder() }}</span>\r\n } @else if (selectionMode() === 'single') {\r\n <span class=\"fui-tree-select__value\">{{ _getDisplayValue() }}</span>\r\n } @else {\r\n <div class=\"fui-tree-select__tags\">\r\n @for (tag of _getSelectedDisplayValues(); track tag) {\r\n <fui-badge [label]=\"tag\" size=\"sm\" variant=\"secondary\"></fui-badge>\r\n }\r\n </div>\r\n }\r\n <fui-icon class=\"fui-tree-select__arrow\" [name]=\"_panelOpen() ? 'caret-up' : 'caret-down'\" size=\"sm\"></fui-icon>\r\n</div>\r\n\r\n<!-- Panel (rendered always but hidden, moved to overlay when open) -->\r\n<div class=\"fui-tree-select__panel\" [id]=\"_treeId\" #panel [style.display]=\"_panelOpen() ? '' : 'none'\">\r\n @if (showSearch()) {\r\n <div class=\"fui-tree-select__search\">\r\n <input\r\n class=\"fui-tree-select__search-input\"\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n (input)=\"_onSearchInput($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n }\r\n <fui-tree\r\n [nodes]=\"nodes()\"\r\n [selectionMode]=\"_treeSelectionMode()\"\r\n [loadChildren]=\"loadChildren()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [filter]=\"_searchFilter()\"\r\n (nodeSelect)=\"_onTreeSelect($event)\"\r\n (nodeUnselect)=\"_onTreeUnselect($event)\"\r\n >\r\n </fui-tree>\r\n</div>\r\n", styles: [".fui-tree-select{display:inline-flex;align-items:center;width:100%;min-height:40px;padding:8px 12px;border:1px solid var(--fui-border-
|
|
301
|
-
}], ctorParameters: () => [], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: true }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], placeholderInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], showSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSearch", required: false }] }], loadChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadChildren", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], displayField: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayField", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], trigger: [{
|
|
290
|
+
}, template: "<!-- Trigger area -->\r\n<div class=\"fui-tree-select__trigger\" #trigger>\r\n @if (empty()) {\r\n <span class=\"fui-tree-select__placeholder\">{{ placeholder() }}</span>\r\n } @else if (selectionMode() === 'single') {\r\n <span class=\"fui-tree-select__value\">{{ _getDisplayValue() }}</span>\r\n } @else {\r\n <div class=\"fui-tree-select__tags\">\r\n @for (tag of _getSelectedDisplayValues(); track tag) {\r\n <fui-badge [label]=\"tag\" size=\"sm\" variant=\"secondary\"></fui-badge>\r\n }\r\n </div>\r\n }\r\n <fui-icon class=\"fui-tree-select__arrow\" [name]=\"_panelOpen() ? 'caret-up' : 'caret-down'\" size=\"sm\"></fui-icon>\r\n</div>\r\n\r\n<!-- Panel (rendered always but hidden, moved to overlay when open) -->\r\n<div class=\"fui-tree-select__panel\" [id]=\"_treeId\" #panel [style.display]=\"_panelOpen() ? '' : 'none'\">\r\n @if (showSearch()) {\r\n <div class=\"fui-tree-select__search\">\r\n <input\r\n class=\"fui-tree-select__search-input\"\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n (input)=\"_onSearchInput($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n }\r\n <fui-tree\r\n [nodes]=\"nodes()\"\r\n [selectionMode]=\"_treeSelectionMode()\"\r\n [loadChildren]=\"loadChildren()\"\r\n [nodeTemplate]=\"nodeTemplate()\"\r\n [filter]=\"_searchFilter()\"\r\n [nodeIdPrefix]=\"_treeId\"\r\n (nodeSelect)=\"_onTreeSelect($event)\"\r\n (nodeUnselect)=\"_onTreeUnselect($event)\"\r\n (focusChange)=\"_onTreeFocusChange($event)\"\r\n >\r\n </fui-tree>\r\n</div>\r\n", styles: [".fui-tree-select{display:inline-flex;align-items:center;width:100%;min-height:40px;padding:8px 12px;border:1px solid var(--fui-border-default);border-radius:var(--fui-radius-sm);background:var(--fui-field-bg);cursor:pointer;outline:none;font-family:var(--fui-font-family);font-size:var(--fui-text-md);transition:border-color var(--fui-duration-base) var(--fui-ease-in-out)}.fui-tree-select:hover{border-color:var(--fui-primary-60)}.fui-tree-select:focus{outline:2px solid var(--fui-primary-60);outline-offset:-2px}.fui-tree-select--disabled{opacity:.5;pointer-events:none}.fui-tree-select--open{border-color:var(--fui-primary-60)}.fui-tree-select__trigger{display:flex;align-items:center;width:100%;gap:8px}.fui-tree-select__placeholder{color:var(--fui-text-disabled);flex:1}.fui-tree-select__value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-tree-select__tags{display:flex;flex-wrap:wrap;gap:4px;flex:1}.fui-tree-select__arrow{flex-shrink:0;color:var(--fui-text-secondary);transition:transform var(--fui-duration-base) var(--fui-ease-in-out)}.fui-tree-select__panel{background:var(--fui-bg-default);border:1px solid var(--fui-border-default);border-radius:var(--fui-radius-sm);box-shadow:var(--fui-shadow-lg);max-height:300px;overflow:auto}.fui-tree-select__search{padding:8px;border-bottom:1px solid var(--fui-border-default)}.fui-tree-select__search-input{width:100%;padding:4px 8px;border:1px solid var(--fui-border-default);border-radius:var(--fui-radius-sm);font-family:var(--fui-font-family);font-size:var(--fui-text-base);outline:none;background:var(--fui-field-bg)}.fui-tree-select__search-input:focus{border-color:var(--fui-primary-60)}.fui-tree-select-backdrop{background:transparent}\n"] }]
|
|
291
|
+
}], ctorParameters: () => [], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: true }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], placeholderInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], showSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSearch", required: false }] }], loadChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadChildren", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], displayField: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayField", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonlyInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], trigger: [{
|
|
302
292
|
type: ViewChild,
|
|
303
293
|
args: ['trigger', { static: false }]
|
|
304
294
|
}], panel: [{
|