@tailng-ui/components 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/package.json +14 -0
- package/src/index.d.ts +7 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +7 -0
- package/src/index.js.map +1 -0
- package/src/lib/feedback/empty/tng-empty.component.d.ts +14 -0
- package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -0
- package/src/lib/feedback/empty/tng-empty.component.js +60 -0
- package/src/lib/feedback/empty/tng-empty.component.js.map +1 -0
- package/src/lib/feedback/index.d.ts +11 -0
- package/src/lib/feedback/index.d.ts.map +1 -0
- package/src/lib/feedback/index.js +11 -0
- package/src/lib/feedback/index.js.map +1 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts +10 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +37 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts +14 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +55 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -0
- package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts +10 -0
- package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -0
- package/src/lib/feedback/skeleton/tng-skeleton.component.js +33 -0
- package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -0
- package/src/lib/feedback/toast/tng-toast.component.d.ts +40 -0
- package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -0
- package/src/lib/feedback/toast/tng-toast.component.js +111 -0
- package/src/lib/feedback/toast/tng-toast.component.js.map +1 -0
- package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts +26 -0
- package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts.map +1 -0
- package/src/lib/form/autocomplete/tng-autocomplete.component.js +104 -0
- package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -0
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts +44 -0
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -0
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +123 -0
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -0
- package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts +14 -0
- package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -0
- package/src/lib/form/button-toggle/tng-button-toggle.component.js +65 -0
- package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -0
- package/src/lib/form/checkbox/tng-checkbox.component.d.ts +38 -0
- package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -0
- package/src/lib/form/checkbox/tng-checkbox.component.js +138 -0
- package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -0
- package/src/lib/form/chips/tng-chips.component.d.ts +4 -0
- package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -0
- package/src/lib/form/chips/tng-chips.component.js +16 -0
- package/src/lib/form/chips/tng-chips.component.js.map +1 -0
- package/src/lib/form/combobox/tng-combobox.component.d.ts +4 -0
- package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -0
- package/src/lib/form/combobox/tng-combobox.component.js +16 -0
- package/src/lib/form/combobox/tng-combobox.component.js.map +1 -0
- package/src/lib/form/index.d.ts +37 -0
- package/src/lib/form/index.d.ts.map +1 -0
- package/src/lib/form/index.js +37 -0
- package/src/lib/form/index.js.map +1 -0
- package/src/lib/form/input/tng-input.component.d.ts +16 -0
- package/src/lib/form/input/tng-input.component.d.ts.map +1 -0
- package/src/lib/form/input/tng-input.component.js +52 -0
- package/src/lib/form/input/tng-input.component.js.map +1 -0
- package/src/lib/form/input-otp/tng-input-otp.component.d.ts +13 -0
- package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -0
- package/src/lib/form/input-otp/tng-input-otp.component.js +138 -0
- package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -0
- package/src/lib/form/label/tng-label.component.d.ts +8 -0
- package/src/lib/form/label/tng-label.component.d.ts.map +1 -0
- package/src/lib/form/label/tng-label.component.js +29 -0
- package/src/lib/form/label/tng-label.component.js.map +1 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts +55 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts.map +1 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js +126 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js.map +1 -0
- package/src/lib/form/multiselect/tng-multiselect.component.d.ts +49 -0
- package/src/lib/form/multiselect/tng-multiselect.component.d.ts.map +1 -0
- package/src/lib/form/multiselect/tng-multiselect.component.js +112 -0
- package/src/lib/form/multiselect/tng-multiselect.component.js.map +1 -0
- package/src/lib/form/radio/tng-radio.component.d.ts +12 -0
- package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -0
- package/src/lib/form/radio/tng-radio.component.js +45 -0
- package/src/lib/form/radio/tng-radio.component.js.map +1 -0
- package/src/lib/form/select/tng-select.component.d.ts +40 -0
- package/src/lib/form/select/tng-select.component.d.ts.map +1 -0
- package/src/lib/form/select/tng-select.component.js +98 -0
- package/src/lib/form/select/tng-select.component.js.map +1 -0
- package/src/lib/form/select/tng-select.slots.d.ts +25 -0
- package/src/lib/form/select/tng-select.slots.d.ts.map +1 -0
- package/src/lib/form/select/tng-select.slots.js +23 -0
- package/src/lib/form/select/tng-select.slots.js.map +1 -0
- package/src/lib/form/slider/tng-slider.component.d.ts +11 -0
- package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -0
- package/src/lib/form/slider/tng-slider.component.js +48 -0
- package/src/lib/form/slider/tng-slider.component.js.map +1 -0
- package/src/lib/form/switch/tng-switch.component.d.ts +18 -0
- package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -0
- package/src/lib/form/switch/tng-switch.component.js +57 -0
- package/src/lib/form/switch/tng-switch.component.js.map +1 -0
- package/src/lib/form/textarea/tng-textarea.component.d.ts +17 -0
- package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -0
- package/src/lib/form/textarea/tng-textarea.component.js +54 -0
- package/src/lib/form/textarea/tng-textarea.component.js.map +1 -0
- package/src/lib/form/toggle/tng-toggle.component.d.ts +39 -0
- package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -0
- package/src/lib/form/toggle/tng-toggle.component.js +152 -0
- package/src/lib/form/toggle/tng-toggle.component.js.map +1 -0
- package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts +3 -0
- package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -0
- package/src/lib/form/toggle-group/tng-toggle-group.component.js +34 -0
- package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -0
- package/src/lib/layout/accordion/tng-accordion.component.d.ts +11 -0
- package/src/lib/layout/accordion/tng-accordion.component.d.ts.map +1 -0
- package/src/lib/layout/accordion/tng-accordion.component.js +158 -0
- package/src/lib/layout/accordion/tng-accordion.component.js.map +1 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts +4 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +16 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -0
- package/src/lib/layout/card/tng-card.component.d.ts +42 -0
- package/src/lib/layout/card/tng-card.component.d.ts.map +1 -0
- package/src/lib/layout/card/tng-card.component.js +186 -0
- package/src/lib/layout/card/tng-card.component.js.map +1 -0
- package/src/lib/layout/collapsible/tng-collapsible.component.d.ts +11 -0
- package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -0
- package/src/lib/layout/collapsible/tng-collapsible.component.js +40 -0
- package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -0
- package/src/lib/layout/drawer/tng-drawer.component.d.ts +12 -0
- package/src/lib/layout/drawer/tng-drawer.component.d.ts.map +1 -0
- package/src/lib/layout/drawer/tng-drawer.component.js +77 -0
- package/src/lib/layout/drawer/tng-drawer.component.js.map +1 -0
- package/src/lib/layout/grid/tng-grid.component.d.ts +4 -0
- package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -0
- package/src/lib/layout/grid/tng-grid.component.js +16 -0
- package/src/lib/layout/grid/tng-grid.component.js.map +1 -0
- package/src/lib/layout/index.d.ts +16 -0
- package/src/lib/layout/index.d.ts.map +1 -0
- package/src/lib/layout/index.js +16 -0
- package/src/lib/layout/index.js.map +1 -0
- package/src/lib/layout/separator/tng-separator.component.d.ts +6 -0
- package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -0
- package/src/lib/layout/separator/tng-separator.component.js +19 -0
- package/src/lib/layout/separator/tng-separator.component.js.map +1 -0
- package/src/lib/layout/stepper/tng-stepper.component.d.ts +4 -0
- package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -0
- package/src/lib/layout/stepper/tng-stepper.component.js +16 -0
- package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts +28 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +86 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts +10 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +29 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts +3 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +15 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts +6 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +16 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts +6 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +18 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts +23 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +155 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -0
- package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts +4 -0
- package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -0
- package/src/lib/navigation/context-menu/tng-context-menu.component.js +16 -0
- package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts +10 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +54 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -0
- package/src/lib/navigation/index.d.ts +27 -0
- package/src/lib/navigation/index.d.ts.map +1 -0
- package/src/lib/navigation/index.js +27 -0
- package/src/lib/navigation/index.js.map +1 -0
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts +15 -0
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts.map +1 -0
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js +85 -0
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js.map +1 -0
- package/src/lib/navigation/menu/tng-menu.component.d.ts +13 -0
- package/src/lib/navigation/menu/tng-menu.component.d.ts.map +1 -0
- package/src/lib/navigation/menu/tng-menu.component.js +92 -0
- package/src/lib/navigation/menu/tng-menu.component.js.map +1 -0
- package/src/lib/navigation/menubar/tng-menubar.component.d.ts +5 -0
- package/src/lib/navigation/menubar/tng-menubar.component.d.ts.map +1 -0
- package/src/lib/navigation/menubar/tng-menubar.component.js +29 -0
- package/src/lib/navigation/menubar/tng-menubar.component.js.map +1 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts +4 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +16 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -0
- package/src/lib/navigation/tabs/tng-tabs.component.d.ts +5 -0
- package/src/lib/navigation/tabs/tng-tabs.component.d.ts.map +1 -0
- package/src/lib/navigation/tabs/tng-tabs.component.js +41 -0
- package/src/lib/navigation/tabs/tng-tabs.component.js.map +1 -0
- package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts +4 -0
- package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -0
- package/src/lib/navigation/toolbar/tng-toolbar.component.js +16 -0
- package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -0
- package/src/lib/overlay/dialog/tng-dialog.component.d.ts +43 -0
- package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -0
- package/src/lib/overlay/dialog/tng-dialog.component.js +286 -0
- package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -0
- package/src/lib/overlay/index.d.ts +7 -0
- package/src/lib/overlay/index.d.ts.map +1 -0
- package/src/lib/overlay/index.js +7 -0
- package/src/lib/overlay/index.js.map +1 -0
- package/src/lib/overlay/popover/tng-popover.component.d.ts +28 -0
- package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -0
- package/src/lib/overlay/popover/tng-popover.component.js +133 -0
- package/src/lib/overlay/popover/tng-popover.component.js.map +1 -0
- package/src/lib/overlay/tng-overlay-runtime.d.ts +11 -0
- package/src/lib/overlay/tng-overlay-runtime.d.ts.map +1 -0
- package/src/lib/overlay/tng-overlay-runtime.js +11 -0
- package/src/lib/overlay/tng-overlay-runtime.js.map +1 -0
- package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts +31 -0
- package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -0
- package/src/lib/overlay/tooltip/tng-tooltip.component.js +111 -0
- package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -0
- package/src/lib/utility/avatar/tng-avatar.component.d.ts +19 -0
- package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -0
- package/src/lib/utility/avatar/tng-avatar.component.js +66 -0
- package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -0
- package/src/lib/utility/badge/tng-badge.component.d.ts +4 -0
- package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -0
- package/src/lib/utility/badge/tng-badge.component.js +13 -0
- package/src/lib/utility/badge/tng-badge.component.js.map +1 -0
- package/src/lib/utility/button/tng-button.component.d.ts +18 -0
- package/src/lib/utility/button/tng-button.component.d.ts.map +1 -0
- package/src/lib/utility/button/tng-button.component.js +32 -0
- package/src/lib/utility/button/tng-button.component.js.map +1 -0
- package/src/lib/utility/code-block/highlighting.d.ts +96 -0
- package/src/lib/utility/code-block/highlighting.d.ts.map +1 -0
- package/src/lib/utility/code-block/highlighting.js +220 -0
- package/src/lib/utility/code-block/highlighting.js.map +1 -0
- package/src/lib/utility/code-block/tng-code-block.component.d.ts +118 -0
- package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -0
- package/src/lib/utility/code-block/tng-code-block.component.js +586 -0
- package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -0
- package/src/lib/utility/copy-button/tng-copy-button.component.d.ts +39 -0
- package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -0
- package/src/lib/utility/copy-button/tng-copy-button.component.js +127 -0
- package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -0
- package/src/lib/utility/index.d.ts +17 -0
- package/src/lib/utility/index.d.ts.map +1 -0
- package/src/lib/utility/index.js +16 -0
- package/src/lib/utility/index.js.map +1 -0
- package/src/lib/utility/tag/tng-tag.component.d.ts +10 -0
- package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -0
- package/src/lib/utility/tag/tng-tag.component.js +18 -0
- package/src/lib/utility/tag/tng-tag.component.js.map +1 -0
- package/src/lib/utility/tree/tng-tree.component.d.ts +72 -0
- package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -0
- package/src/lib/utility/tree/tng-tree.component.js +336 -0
- package/src/lib/utility/tree/tng-tree.component.js.map +1 -0
- package/src/test-setup.d.ts +3 -0
- package/src/test-setup.d.ts.map +1 -0
- package/src/test-setup.js +10 -0
- package/src/test-setup.js.map +1 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { booleanAttribute, Component, effect, input, output, signal } from '@angular/core';
|
|
3
|
+
import { createTngIdFactory } from '@tailng-ui/cdk/core';
|
|
4
|
+
import { TngTooltipContent as TngTooltipContentPrimitive, TngTooltipTrigger as TngTooltipTriggerPrimitive, } from '@tailng-ui/primitives';
|
|
5
|
+
const tooltipIdFactory = createTngIdFactory('tng-tooltip');
|
|
6
|
+
export function normalizeTngTooltipDelay(value) {
|
|
7
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
8
|
+
return 0;
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
export function shouldCloseTngTooltipForKey(key) {
|
|
13
|
+
return key === 'Escape';
|
|
14
|
+
}
|
|
15
|
+
let TngTooltipComponent = class TngTooltipComponent {
|
|
16
|
+
closeTimerId = null;
|
|
17
|
+
openTimerId = null;
|
|
18
|
+
ariaLabel = input(null);
|
|
19
|
+
closeDelay = input(60);
|
|
20
|
+
disabled = input(false, {
|
|
21
|
+
transform: booleanAttribute,
|
|
22
|
+
});
|
|
23
|
+
openDelay = input(120);
|
|
24
|
+
side = input('top');
|
|
25
|
+
text = input('More information');
|
|
26
|
+
triggerLabel = input('Info');
|
|
27
|
+
openChange = output();
|
|
28
|
+
open = signal(false);
|
|
29
|
+
tooltipId = tooltipIdFactory();
|
|
30
|
+
syncDisabledState = effect(() => {
|
|
31
|
+
if (this.disabled() && this.open()) {
|
|
32
|
+
this.setOpen(false);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
ngOnDestroy() {
|
|
36
|
+
this.syncDisabledState.destroy();
|
|
37
|
+
this.clearCloseTimer();
|
|
38
|
+
this.clearOpenTimer();
|
|
39
|
+
}
|
|
40
|
+
onCloseIntent() {
|
|
41
|
+
if (this.disabled()) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.clearOpenTimer();
|
|
45
|
+
const delay = normalizeTngTooltipDelay(this.closeDelay());
|
|
46
|
+
if (delay === 0) {
|
|
47
|
+
this.setOpen(false);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.closeTimerId = setTimeout(() => {
|
|
51
|
+
this.closeTimerId = null;
|
|
52
|
+
this.setOpen(false);
|
|
53
|
+
}, delay);
|
|
54
|
+
}
|
|
55
|
+
onOpenIntent() {
|
|
56
|
+
if (this.disabled()) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.clearCloseTimer();
|
|
60
|
+
const delay = normalizeTngTooltipDelay(this.openDelay());
|
|
61
|
+
if (delay === 0) {
|
|
62
|
+
this.setOpen(true);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.openTimerId = setTimeout(() => {
|
|
66
|
+
this.openTimerId = null;
|
|
67
|
+
this.setOpen(true);
|
|
68
|
+
}, delay);
|
|
69
|
+
}
|
|
70
|
+
onTriggerKeydown(event) {
|
|
71
|
+
if (this.disabled()) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!shouldCloseTngTooltipForKey(event.key)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
event.preventDefault();
|
|
78
|
+
this.clearCloseTimer();
|
|
79
|
+
this.clearOpenTimer();
|
|
80
|
+
this.setOpen(false);
|
|
81
|
+
}
|
|
82
|
+
clearCloseTimer() {
|
|
83
|
+
if (this.closeTimerId !== null) {
|
|
84
|
+
clearTimeout(this.closeTimerId);
|
|
85
|
+
this.closeTimerId = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
clearOpenTimer() {
|
|
89
|
+
if (this.openTimerId !== null) {
|
|
90
|
+
clearTimeout(this.openTimerId);
|
|
91
|
+
this.openTimerId = null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
setOpen(nextOpen) {
|
|
95
|
+
if (this.open() === nextOpen) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.open.set(nextOpen);
|
|
99
|
+
this.openChange.emit(nextOpen);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
TngTooltipComponent = __decorate([
|
|
103
|
+
Component({
|
|
104
|
+
selector: 'tng-tooltip',
|
|
105
|
+
imports: [TngTooltipTriggerPrimitive, TngTooltipContentPrimitive],
|
|
106
|
+
templateUrl: './tng-tooltip.component.html',
|
|
107
|
+
styleUrl: './tng-tooltip.component.css',
|
|
108
|
+
})
|
|
109
|
+
], TngTooltipComponent);
|
|
110
|
+
export { TngTooltipComponent };
|
|
111
|
+
//# sourceMappingURL=tng-tooltip.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-tooltip.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/overlay/tooltip/tng-tooltip.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { booleanAttribute, Component, effect, input, output, signal } from '@angular/core';\nimport type { OnDestroy } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk/core';\nimport {\n type TngTooltipSide,\n TngTooltipContent as TngTooltipContentPrimitive,\n TngTooltipTrigger as TngTooltipTriggerPrimitive,\n} from '@tailng-ui/primitives';\n\ntype TngTooltipKeyboardEvent = Readonly<Pick<KeyboardEvent, 'key'>> &\n Readonly<{ preventDefault: () => void }>;\n\nconst tooltipIdFactory = createTngIdFactory('tng-tooltip');\n\nexport function normalizeTngTooltipDelay(value: number): number {\n if (!Number.isFinite(value) || value < 0) {\n return 0;\n }\n\n return value;\n}\n\nexport function shouldCloseTngTooltipForKey(key: string): boolean {\n return key === 'Escape';\n}\n\n@Component({\n selector: 'tng-tooltip',\n imports: [TngTooltipTriggerPrimitive, TngTooltipContentPrimitive],\n templateUrl: './tng-tooltip.component.html',\n styleUrl: './tng-tooltip.component.css',\n})\nexport class TngTooltipComponent implements OnDestroy {\n private closeTimerId: ReturnType<typeof setTimeout> | null = null;\n private openTimerId: ReturnType<typeof setTimeout> | null = null;\n\n public readonly ariaLabel = input<string | null>(null);\n public readonly closeDelay = input<number>(60);\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly openDelay = input<number>(120);\n public readonly side = input<TngTooltipSide>('top');\n public readonly text = input<string>('More information');\n public readonly triggerLabel = input<string>('Info');\n\n public readonly openChange = output<boolean>();\n protected readonly open = signal(false);\n protected readonly tooltipId = tooltipIdFactory();\n\n private readonly syncDisabledState = effect(() => {\n if (this.disabled() && this.open()) {\n this.setOpen(false);\n }\n });\n\n public ngOnDestroy(): void {\n this.syncDisabledState.destroy();\n this.clearCloseTimer();\n this.clearOpenTimer();\n }\n\n protected onCloseIntent(): void {\n if (this.disabled()) {\n return;\n }\n\n this.clearOpenTimer();\n const delay = normalizeTngTooltipDelay(this.closeDelay());\n if (delay === 0) {\n this.setOpen(false);\n return;\n }\n\n this.closeTimerId = setTimeout(() => {\n this.closeTimerId = null;\n this.setOpen(false);\n }, delay);\n }\n\n protected onOpenIntent(): void {\n if (this.disabled()) {\n return;\n }\n\n this.clearCloseTimer();\n const delay = normalizeTngTooltipDelay(this.openDelay());\n if (delay === 0) {\n this.setOpen(true);\n return;\n }\n\n this.openTimerId = setTimeout(() => {\n this.openTimerId = null;\n this.setOpen(true);\n }, delay);\n }\n\n protected onTriggerKeydown(event: TngTooltipKeyboardEvent): void {\n if (this.disabled()) {\n return;\n }\n\n if (!shouldCloseTngTooltipForKey(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.clearCloseTimer();\n this.clearOpenTimer();\n this.setOpen(false);\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimerId !== null) {\n clearTimeout(this.closeTimerId);\n this.closeTimerId = null;\n }\n }\n\n private clearOpenTimer(): void {\n if (this.openTimerId !== null) {\n clearTimeout(this.openTimerId);\n this.openTimerId = null;\n }\n }\n\n private setOpen(nextOpen: boolean): void {\n if (this.open() === nextOpen) {\n return;\n }\n\n this.open.set(nextOpen);\n this.openChange.emit(nextOpen);\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type TngAvatarShape = 'circle' | 'square';
|
|
2
|
+
type TngAvatarSize = 'lg' | 'md' | 'sm';
|
|
3
|
+
export declare function toTngAvatarFallbackText(value: string | null | undefined): string;
|
|
4
|
+
export declare class TngAvatarComponent {
|
|
5
|
+
readonly alt: import("@angular/core").InputSignal<string | null>;
|
|
6
|
+
readonly fallback: import("@angular/core").InputSignal<string | null>;
|
|
7
|
+
readonly shape: import("@angular/core").InputSignal<TngAvatarShape>;
|
|
8
|
+
readonly size: import("@angular/core").InputSignal<TngAvatarSize>;
|
|
9
|
+
readonly src: import("@angular/core").InputSignal<string | null>;
|
|
10
|
+
private readonly imageLoadFailed;
|
|
11
|
+
protected readonly fallbackText: import("@angular/core").Signal<string>;
|
|
12
|
+
protected readonly resolvedAlt: import("@angular/core").Signal<string | null>;
|
|
13
|
+
protected readonly resolvedSrc: import("@angular/core").Signal<string | null>;
|
|
14
|
+
protected readonly showFallback: import("@angular/core").Signal<boolean>;
|
|
15
|
+
onImageError(): void;
|
|
16
|
+
onImageLoad(): void;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=tng-avatar.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-avatar.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/avatar/tng-avatar.component.ts"],"names":[],"mappings":"AAOA,KAAK,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC1C,KAAK,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAkCxC,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAWhF;AAED,qBAMa,kBAAkB;IAC7B,SAAgB,GAAG,qDAAkC;IACrD,SAAgB,QAAQ,qDAA8B;IACtD,SAAgB,KAAK,sDAAmC;IACxD,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,GAAG,qDAA8B;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,yCAE7B;IACF,SAAS,CAAC,QAAQ,CAAC,WAAW,gDAE5B;IACF,SAAS,CAAC,QAAQ,CAAC,WAAW,gDAE5B;IACF,SAAS,CAAC,QAAQ,CAAC,YAAY,0CAE7B;IAEK,YAAY,IAAI,IAAI;IAIpB,WAAW,IAAI,IAAI;CAG3B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component, computed, input, signal } from '@angular/core';
|
|
3
|
+
import { TngAvatar as TngAvatarPrimitive, TngAvatarFallback as TngAvatarFallbackPrimitive, TngAvatarImage as TngAvatarImagePrimitive, } from '@tailng-ui/primitives';
|
|
4
|
+
function normalizeOptionalString(value) {
|
|
5
|
+
if (value === undefined || value === null) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const normalized = value.trim();
|
|
9
|
+
return normalized.length > 0 ? normalized : null;
|
|
10
|
+
}
|
|
11
|
+
function normalizeFallbackText(value) {
|
|
12
|
+
return value.length > 0 ? value : '?';
|
|
13
|
+
}
|
|
14
|
+
function toWords(value) {
|
|
15
|
+
const normalized = normalizeOptionalString(value);
|
|
16
|
+
if (normalized === null) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
return normalized.split(/\s+/).filter((part) => part.length > 0);
|
|
20
|
+
}
|
|
21
|
+
function toTwoLetterCode(word) {
|
|
22
|
+
return normalizeFallbackText(word.slice(0, 2).toUpperCase());
|
|
23
|
+
}
|
|
24
|
+
function toInitialCode(words) {
|
|
25
|
+
const firstInitial = words[0]?.charAt(0) ?? '';
|
|
26
|
+
const secondInitial = words[1]?.charAt(0) ?? '';
|
|
27
|
+
return normalizeFallbackText(`${firstInitial}${secondInitial}`.toUpperCase());
|
|
28
|
+
}
|
|
29
|
+
export function toTngAvatarFallbackText(value) {
|
|
30
|
+
const words = toWords(value);
|
|
31
|
+
if (words.length === 0) {
|
|
32
|
+
return '?';
|
|
33
|
+
}
|
|
34
|
+
if (words.length === 1) {
|
|
35
|
+
return toTwoLetterCode(words[0] ?? '');
|
|
36
|
+
}
|
|
37
|
+
return toInitialCode(words);
|
|
38
|
+
}
|
|
39
|
+
let TngAvatarComponent = class TngAvatarComponent {
|
|
40
|
+
alt = input('Avatar');
|
|
41
|
+
fallback = input(null);
|
|
42
|
+
shape = input('circle');
|
|
43
|
+
size = input('md');
|
|
44
|
+
src = input(null);
|
|
45
|
+
imageLoadFailed = signal(false);
|
|
46
|
+
fallbackText = computed(() => toTngAvatarFallbackText(this.fallback()));
|
|
47
|
+
resolvedAlt = computed(() => normalizeOptionalString(this.alt()));
|
|
48
|
+
resolvedSrc = computed(() => normalizeOptionalString(this.src()));
|
|
49
|
+
showFallback = computed(() => this.resolvedSrc() === null || this.imageLoadFailed());
|
|
50
|
+
onImageError() {
|
|
51
|
+
this.imageLoadFailed.set(true);
|
|
52
|
+
}
|
|
53
|
+
onImageLoad() {
|
|
54
|
+
this.imageLoadFailed.set(false);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
TngAvatarComponent = __decorate([
|
|
58
|
+
Component({
|
|
59
|
+
selector: 'tng-avatar',
|
|
60
|
+
imports: [TngAvatarPrimitive, TngAvatarImagePrimitive, TngAvatarFallbackPrimitive],
|
|
61
|
+
templateUrl: './tng-avatar.component.html',
|
|
62
|
+
styleUrl: './tng-avatar.component.css',
|
|
63
|
+
})
|
|
64
|
+
], TngAvatarComponent);
|
|
65
|
+
export { TngAvatarComponent };
|
|
66
|
+
//# sourceMappingURL=tng-avatar.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-avatar.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/avatar/tng-avatar.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, computed, input, signal } from '@angular/core';\nimport {\n TngAvatar as TngAvatarPrimitive,\n TngAvatarFallback as TngAvatarFallbackPrimitive,\n TngAvatarImage as TngAvatarImagePrimitive,\n} from '@tailng-ui/primitives';\n\ntype TngAvatarShape = 'circle' | 'square';\ntype TngAvatarSize = 'lg' | 'md' | 'sm';\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFallbackText(value: string): string {\n return value.length > 0 ? value : '?';\n}\n\nfunction toWords(value: string | null | undefined): readonly string[] {\n const normalized = normalizeOptionalString(value);\n if (normalized === null) {\n return [];\n }\n\n return normalized.split(/\\s+/).filter((part) => part.length > 0);\n}\n\nfunction toTwoLetterCode(word: string): string {\n return normalizeFallbackText(word.slice(0, 2).toUpperCase());\n}\n\nfunction toInitialCode(words: readonly string[]): string {\n const firstInitial = words[0]?.charAt(0) ?? '';\n const secondInitial = words[1]?.charAt(0) ?? '';\n return normalizeFallbackText(`${firstInitial}${secondInitial}`.toUpperCase());\n}\n\nexport function toTngAvatarFallbackText(value: string | null | undefined): string {\n const words = toWords(value);\n if (words.length === 0) {\n return '?';\n }\n\n if (words.length === 1) {\n return toTwoLetterCode(words[0] ?? '');\n }\n\n return toInitialCode(words);\n}\n\n@Component({\n selector: 'tng-avatar',\n imports: [TngAvatarPrimitive, TngAvatarImagePrimitive, TngAvatarFallbackPrimitive],\n templateUrl: './tng-avatar.component.html',\n styleUrl: './tng-avatar.component.css',\n})\nexport class TngAvatarComponent {\n public readonly alt = input<string | null>('Avatar');\n public readonly fallback = input<string | null>(null);\n public readonly shape = input<TngAvatarShape>('circle');\n public readonly size = input<TngAvatarSize>('md');\n public readonly src = input<string | null>(null);\n\n private readonly imageLoadFailed = signal(false);\n protected readonly fallbackText = computed<string>(() =>\n toTngAvatarFallbackText(this.fallback()),\n );\n protected readonly resolvedAlt = computed<string | null>(() =>\n normalizeOptionalString(this.alt()),\n );\n protected readonly resolvedSrc = computed<string | null>(() =>\n normalizeOptionalString(this.src()),\n );\n protected readonly showFallback = computed<boolean>(\n () => this.resolvedSrc() === null || this.imageLoadFailed(),\n );\n\n public onImageError(): void {\n this.imageLoadFailed.set(true);\n }\n\n public onImageLoad(): void {\n this.imageLoadFailed.set(false);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-badge.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/badge/tng-badge.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,qBAIa,iBAAkB,SAAQ,iBAAiB;CAAG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Directive } from '@angular/core';
|
|
3
|
+
import { TngBadge as TngBadgePrimitive } from '@tailng-ui/primitives';
|
|
4
|
+
let TngBadgeComponent = class TngBadgeComponent extends TngBadgePrimitive {
|
|
5
|
+
};
|
|
6
|
+
TngBadgeComponent = __decorate([
|
|
7
|
+
Directive({
|
|
8
|
+
selector: '[tngBadge]',
|
|
9
|
+
exportAs: 'tngBadge',
|
|
10
|
+
})
|
|
11
|
+
], TngBadgeComponent);
|
|
12
|
+
export { TngBadgeComponent };
|
|
13
|
+
//# sourceMappingURL=tng-badge.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-badge.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/badge/tng-badge.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAM/D,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,iBAAiB;CAAG,CAAA;AAA9C,iBAAiB;IAJ7B,SAAS,CAAC;QACT,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,UAAU;KACrB,CAAC;GACW,iBAAiB,CAA6B","sourcesContent":["import { Directive } from '@angular/core';\nimport { TngBadge as TngBadgePrimitive } from '@tailng-ui/primitives';\n\n@Directive({\n selector: '[tngBadge]',\n exportAs: 'tngBadge',\n})\nexport class TngBadgeComponent extends TngBadgePrimitive {}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TngPressAriaHasPopup, TngPressType } from '@tailng-ui/primitives';
|
|
2
|
+
type NullableBooleanInput = boolean | null | string | undefined;
|
|
3
|
+
export type TngButtonAppearance = 'ghost' | 'outline' | 'solid';
|
|
4
|
+
export type TngButtonSize = 'lg' | 'md' | 'sm';
|
|
5
|
+
export type TngButtonTone = 'danger' | 'neutral' | 'primary' | 'success';
|
|
6
|
+
export declare class TngButtonComponent {
|
|
7
|
+
readonly appearance: import("@angular/core").InputSignal<TngButtonAppearance>;
|
|
8
|
+
readonly ariaControls: import("@angular/core").InputSignal<string | null>;
|
|
9
|
+
readonly ariaExpanded: import("@angular/core").InputSignalWithTransform<boolean | null, NullableBooleanInput>;
|
|
10
|
+
readonly ariaHasPopup: import("@angular/core").InputSignalWithTransform<TngPressAriaHasPopup | null, string | boolean | null | undefined>;
|
|
11
|
+
readonly ariaPressed: import("@angular/core").InputSignalWithTransform<boolean | null, NullableBooleanInput>;
|
|
12
|
+
readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
13
|
+
readonly size: import("@angular/core").InputSignal<TngButtonSize>;
|
|
14
|
+
readonly tone: import("@angular/core").InputSignal<TngButtonTone>;
|
|
15
|
+
readonly type: import("@angular/core").InputSignal<TngPressType>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=tng-button.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-button.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/button/tng-button.component.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEhF,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzE,qBAMa,kBAAkB;IAC7B,SAAgB,UAAU,2DAAuC;IACjE,SAAgB,YAAY,qDAA8B;IAC1D,SAAgB,YAAY,yFAEzB;IACH,SAAgB,YAAY,qHAKzB;IACH,SAAgB,WAAW,yFAExB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,IAAI,qDAAmC;IACvD,SAAgB,IAAI,oDAAiC;CACtD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { booleanAttribute, Component, input } from '@angular/core';
|
|
3
|
+
import { coerceTngPressAriaHasPopup, coerceTngPressNullableBoolean, TngPress as TngPressPrimitive, } from '@tailng-ui/primitives';
|
|
4
|
+
let TngButtonComponent = class TngButtonComponent {
|
|
5
|
+
appearance = input('solid');
|
|
6
|
+
ariaControls = input(null);
|
|
7
|
+
ariaExpanded = input(null, {
|
|
8
|
+
transform: coerceTngPressNullableBoolean,
|
|
9
|
+
});
|
|
10
|
+
ariaHasPopup = input(null, {
|
|
11
|
+
transform: coerceTngPressAriaHasPopup,
|
|
12
|
+
});
|
|
13
|
+
ariaPressed = input(null, {
|
|
14
|
+
transform: coerceTngPressNullableBoolean,
|
|
15
|
+
});
|
|
16
|
+
disabled = input(false, {
|
|
17
|
+
transform: booleanAttribute,
|
|
18
|
+
});
|
|
19
|
+
size = input('md');
|
|
20
|
+
tone = input('primary');
|
|
21
|
+
type = input('button');
|
|
22
|
+
};
|
|
23
|
+
TngButtonComponent = __decorate([
|
|
24
|
+
Component({
|
|
25
|
+
selector: 'tng-button',
|
|
26
|
+
imports: [TngPressPrimitive],
|
|
27
|
+
templateUrl: './tng-button.component.html',
|
|
28
|
+
styleUrl: './tng-button.component.css',
|
|
29
|
+
})
|
|
30
|
+
], TngButtonComponent);
|
|
31
|
+
export { TngButtonComponent };
|
|
32
|
+
//# sourceMappingURL=tng-button.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tng-button.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/button/tng-button.component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,QAAQ,IAAI,iBAAiB,GAC9B,MAAM,uBAAuB,CAAC;AAcxB,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IACb,UAAU,GAAG,KAAK,CAAsB,OAAO,CAAC,CAAC;IACjD,YAAY,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC1C,YAAY,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC/E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,YAAY,GAAG,KAAK,CAGlC,IAAI,EAAE;QACN,SAAS,EAAE,0BAA0B;KACtC,CAAC,CAAC;IACa,WAAW,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC9E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,CAAgB,SAAS,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAe,QAAQ,CAAC,CAAC;CACtD,CAAA;AArBY,kBAAkB;IAN9B,SAAS,CAAC;QACT,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC5B,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,4BAA4B;KACvC,CAAC;GACW,kBAAkB,CAqB9B","sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport {\n coerceTngPressAriaHasPopup,\n coerceTngPressNullableBoolean,\n TngPress as TngPressPrimitive,\n} from '@tailng-ui/primitives';\nimport type { TngPressAriaHasPopup, TngPressType } from '@tailng-ui/primitives';\n\ntype NullableBooleanInput = boolean | null | string | undefined;\nexport type TngButtonAppearance = 'ghost' | 'outline' | 'solid';\nexport type TngButtonSize = 'lg' | 'md' | 'sm';\nexport type TngButtonTone = 'danger' | 'neutral' | 'primary' | 'success';\n\n@Component({\n selector: 'tng-button',\n imports: [TngPressPrimitive],\n templateUrl: './tng-button.component.html',\n styleUrl: './tng-button.component.css',\n})\nexport class TngButtonComponent {\n public readonly appearance = input<TngButtonAppearance>('solid');\n public readonly ariaControls = input<string | null>(null);\n public readonly ariaExpanded = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngPressNullableBoolean,\n });\n public readonly ariaHasPopup = input<\n TngPressAriaHasPopup | null,\n boolean | null | string | undefined\n >(null, {\n transform: coerceTngPressAriaHasPopup,\n });\n public readonly ariaPressed = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngPressNullableBoolean,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly size = input<TngButtonSize>('md');\n public readonly tone = input<TngButtonTone>('primary');\n public readonly type = input<TngPressType>('button');\n}\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { InjectionToken, type EnvironmentProviders } from '@angular/core';
|
|
2
|
+
export type TngCodeHighlightInput = Readonly<{
|
|
3
|
+
code: string;
|
|
4
|
+
includeLineWrappers?: boolean;
|
|
5
|
+
language: string | null;
|
|
6
|
+
theme?: string | null;
|
|
7
|
+
}>;
|
|
8
|
+
export type TngCodeHighlightToken = Readonly<{
|
|
9
|
+
className?: string | null;
|
|
10
|
+
content: string;
|
|
11
|
+
}>;
|
|
12
|
+
export type TngCodeHighlightTokenLine = readonly TngCodeHighlightToken[];
|
|
13
|
+
export type TngCodeHighlightHtmlResult = Readonly<{
|
|
14
|
+
html: string;
|
|
15
|
+
kind: 'html';
|
|
16
|
+
language?: string | null;
|
|
17
|
+
trustedHtml?: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
export type TngCodeHighlightLegacyHtmlResult = Readonly<{
|
|
20
|
+
html: string;
|
|
21
|
+
language?: string | null;
|
|
22
|
+
trustedHtml?: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
export type TngCodeHighlightTokensResult = Readonly<{
|
|
25
|
+
kind: 'tokens';
|
|
26
|
+
language?: string | null;
|
|
27
|
+
tokens: readonly TngCodeHighlightTokenLine[];
|
|
28
|
+
}>;
|
|
29
|
+
export type TngCodeHighlightResult = TngCodeHighlightHtmlResult | TngCodeHighlightLegacyHtmlResult | TngCodeHighlightTokensResult;
|
|
30
|
+
export type TngNormalizedCodeHighlightResult = Readonly<{
|
|
31
|
+
html: string;
|
|
32
|
+
kind: 'html';
|
|
33
|
+
language: string | null;
|
|
34
|
+
trustedHtml: boolean;
|
|
35
|
+
}> | Readonly<{
|
|
36
|
+
kind: 'tokens';
|
|
37
|
+
language: string | null;
|
|
38
|
+
tokens: readonly TngCodeHighlightTokenLine[];
|
|
39
|
+
}>;
|
|
40
|
+
export type TngCodeHighlightRequest = Readonly<{
|
|
41
|
+
adapter: string | null | undefined;
|
|
42
|
+
code: string;
|
|
43
|
+
includeLineWrappers?: boolean;
|
|
44
|
+
language: string | null | undefined;
|
|
45
|
+
theme?: string | null | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
export type TngCodeHighlighterAdapter = Readonly<{
|
|
48
|
+
highlight: (input: TngCodeHighlightInput) => Promise<TngCodeHighlightResult> | TngCodeHighlightResult;
|
|
49
|
+
id: string;
|
|
50
|
+
supports?: (language: string | null) => boolean;
|
|
51
|
+
}>;
|
|
52
|
+
export type TngProvideCodeHighlightingOptions = Readonly<{
|
|
53
|
+
adapters?: readonly TngCodeHighlighterAdapter[];
|
|
54
|
+
allowBuiltinOverride?: boolean;
|
|
55
|
+
defaultAdapter?: string;
|
|
56
|
+
}>;
|
|
57
|
+
export type TngResolvedCodeHighlightingConfig = Readonly<{
|
|
58
|
+
adapters: Readonly<Record<string, TngCodeHighlighterAdapter>>;
|
|
59
|
+
defaultAdapter: string;
|
|
60
|
+
}>;
|
|
61
|
+
export type TngCodeHighlightingResolverLike = Readonly<{
|
|
62
|
+
highlight: (request: TngCodeHighlightRequest) => Promise<string>;
|
|
63
|
+
highlightResult: (request: TngCodeHighlightRequest) => Promise<TngNormalizedCodeHighlightResult | null>;
|
|
64
|
+
}>;
|
|
65
|
+
export declare const TNG_DEFAULT_CODE_HIGHLIGHTER_ID = "plain";
|
|
66
|
+
export declare function normalizeTngCodeLanguage(value: string | null | undefined): string | null;
|
|
67
|
+
export declare function normalizeTngCodeHighlighterId(value: string): string;
|
|
68
|
+
export declare function escapeTngCodeHtml(value: string): string;
|
|
69
|
+
export declare function createTngCodeHighlighterAdapter(id: string, highlight: (input: TngCodeHighlightInput) => Promise<TngCodeHighlightResult> | TngCodeHighlightResult, supports?: (language: string | null) => boolean): TngCodeHighlighterAdapter;
|
|
70
|
+
export declare const tngPlainCodeHighlighterAdapter: Readonly<{
|
|
71
|
+
highlight: (input: TngCodeHighlightInput) => Promise<TngCodeHighlightResult> | TngCodeHighlightResult;
|
|
72
|
+
id: string;
|
|
73
|
+
supports?: (language: string | null) => boolean;
|
|
74
|
+
}>;
|
|
75
|
+
export declare const TNG_BUILTIN_CODE_HIGHLIGHTERS: Readonly<Record<string, TngCodeHighlighterAdapter>>;
|
|
76
|
+
export declare function resolveTngCodeHighlightingConfig(options?: TngProvideCodeHighlightingOptions): TngResolvedCodeHighlightingConfig;
|
|
77
|
+
export declare function resolveTngCodeHighlightResult(request: TngCodeHighlightRequest, config: TngResolvedCodeHighlightingConfig): Promise<TngNormalizedCodeHighlightResult | null>;
|
|
78
|
+
export declare function highlightWithTngCodeHighlightingConfig(request: TngCodeHighlightRequest, config: TngResolvedCodeHighlightingConfig): Promise<string>;
|
|
79
|
+
export declare const TNG_CODE_HIGHLIGHTING_CONFIG: InjectionToken<Readonly<{
|
|
80
|
+
adapters: Readonly<Record<string, TngCodeHighlighterAdapter>>;
|
|
81
|
+
defaultAdapter: string;
|
|
82
|
+
}>>;
|
|
83
|
+
export declare const TNG_CODE_HIGHLIGHTING_RESOLVER: InjectionToken<Readonly<{
|
|
84
|
+
highlight: (request: TngCodeHighlightRequest) => Promise<string>;
|
|
85
|
+
highlightResult: (request: TngCodeHighlightRequest) => Promise<TngNormalizedCodeHighlightResult | null>;
|
|
86
|
+
}>>;
|
|
87
|
+
export declare function provideTngCodeHighlighting(options?: TngProvideCodeHighlightingOptions): EnvironmentProviders;
|
|
88
|
+
export declare class TngCodeHighlightingResolver {
|
|
89
|
+
private readonly config;
|
|
90
|
+
constructor(config: TngResolvedCodeHighlightingConfig);
|
|
91
|
+
getAdapterIds(): readonly string[];
|
|
92
|
+
getDefaultAdapterId(): string;
|
|
93
|
+
highlight(request: TngCodeHighlightRequest): Promise<string>;
|
|
94
|
+
highlightResult(request: TngCodeHighlightRequest): Promise<TngNormalizedCodeHighlightResult | null>;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=highlighting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlighting.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/utility/code-block/highlighting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { InjectionToken, inject, makeEnvironmentProviders, } from '@angular/core';
|
|
2
|
+
const htmlEscapeAmpersand = /&/g;
|
|
3
|
+
const htmlEscapeGt = />/g;
|
|
4
|
+
const htmlEscapeLt = /</g;
|
|
5
|
+
const htmlEscapeQuote = /"/g;
|
|
6
|
+
const htmlEscapeSingleQuote = /'/g;
|
|
7
|
+
const htmlEscapeAmpersandValue = '&';
|
|
8
|
+
const htmlEscapeGtValue = '>';
|
|
9
|
+
const htmlEscapeLtValue = '<';
|
|
10
|
+
const htmlEscapeQuoteValue = '"';
|
|
11
|
+
const htmlEscapeSingleQuoteValue = ''';
|
|
12
|
+
export const TNG_DEFAULT_CODE_HIGHLIGHTER_ID = 'plain';
|
|
13
|
+
function hasAdapter(adapters, adapterId) {
|
|
14
|
+
return Object.prototype.hasOwnProperty.call(adapters, adapterId);
|
|
15
|
+
}
|
|
16
|
+
function normalizeRequiredString(value, label) {
|
|
17
|
+
const normalizedValue = value.trim();
|
|
18
|
+
if (normalizedValue.length === 0) {
|
|
19
|
+
throw new Error(`${label} cannot be empty.`);
|
|
20
|
+
}
|
|
21
|
+
return normalizedValue;
|
|
22
|
+
}
|
|
23
|
+
function createReadonlyAdapterMap(adapters) {
|
|
24
|
+
return Object.freeze({ ...adapters });
|
|
25
|
+
}
|
|
26
|
+
function withCustomAdapters(baseAdapters, customAdapters, allowBuiltinOverride) {
|
|
27
|
+
const mergedAdapters = { ...baseAdapters };
|
|
28
|
+
const seenCustomAdapterIds = new Set();
|
|
29
|
+
for (const adapter of customAdapters) {
|
|
30
|
+
const adapterId = normalizeTngCodeHighlighterId(adapter.id);
|
|
31
|
+
const isBuiltinAdapter = hasAdapter(TNG_BUILTIN_CODE_HIGHLIGHTERS, adapterId);
|
|
32
|
+
if (seenCustomAdapterIds.has(adapterId)) {
|
|
33
|
+
throw new Error(`Duplicate code highlighter adapter "${adapterId}" provided.`);
|
|
34
|
+
}
|
|
35
|
+
seenCustomAdapterIds.add(adapterId);
|
|
36
|
+
if (isBuiltinAdapter && !allowBuiltinOverride) {
|
|
37
|
+
throw new Error(`Code highlighter adapter "${adapterId}" is reserved. Set allowBuiltinOverride to true to override it.`);
|
|
38
|
+
}
|
|
39
|
+
mergedAdapters[adapterId] = adapter;
|
|
40
|
+
}
|
|
41
|
+
return mergedAdapters;
|
|
42
|
+
}
|
|
43
|
+
function resolveDefaultAdapterId(defaultAdapter, adapters) {
|
|
44
|
+
const candidateAdapter = defaultAdapter ?? TNG_DEFAULT_CODE_HIGHLIGHTER_ID;
|
|
45
|
+
const normalizedAdapter = normalizeTngCodeHighlighterId(candidateAdapter);
|
|
46
|
+
if (hasAdapter(adapters, normalizedAdapter)) {
|
|
47
|
+
return normalizedAdapter;
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`Unknown default code highlighter adapter "${normalizedAdapter}". Available adapters: ${Object.keys(adapters).join(', ')}`);
|
|
50
|
+
}
|
|
51
|
+
function resolveAdapterFromRequest(request, config) {
|
|
52
|
+
const requestedAdapter = request.adapter;
|
|
53
|
+
if (requestedAdapter !== null && requestedAdapter !== undefined) {
|
|
54
|
+
const normalizedAdapter = normalizeTngCodeHighlighterId(requestedAdapter);
|
|
55
|
+
const resolvedAdapter = config.adapters[normalizedAdapter];
|
|
56
|
+
if (resolvedAdapter !== undefined) {
|
|
57
|
+
return resolvedAdapter;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return config.adapters[config.defaultAdapter];
|
|
61
|
+
}
|
|
62
|
+
function normalizeTokenLine(line) {
|
|
63
|
+
return line
|
|
64
|
+
.filter((token) => typeof token.content === 'string')
|
|
65
|
+
.map((token) => ({ className: token.className ?? null, content: token.content }));
|
|
66
|
+
}
|
|
67
|
+
function normalizeHighlightResult(result, fallbackLanguage) {
|
|
68
|
+
if ('kind' in result && result.kind === 'tokens') {
|
|
69
|
+
return {
|
|
70
|
+
kind: 'tokens',
|
|
71
|
+
language: normalizeTngCodeLanguage(result.language) ?? fallbackLanguage,
|
|
72
|
+
tokens: result.tokens.map((line) => normalizeTokenLine(line)),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if ('html' in result) {
|
|
76
|
+
const trustedHtml = 'trustedHtml' in result && (result.trustedHtml === true || result.trustedHtml === false)
|
|
77
|
+
? result.trustedHtml
|
|
78
|
+
: false;
|
|
79
|
+
if ('kind' in result && result.kind !== 'html') {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
html: result.html,
|
|
84
|
+
kind: 'html',
|
|
85
|
+
language: normalizeTngCodeLanguage(result.language) ?? fallbackLanguage,
|
|
86
|
+
trustedHtml,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
function tokenClassNameToAttributeValue(className) {
|
|
92
|
+
if (className === null || className === undefined) {
|
|
93
|
+
return '';
|
|
94
|
+
}
|
|
95
|
+
return className
|
|
96
|
+
.trim()
|
|
97
|
+
.split(/\s+/)
|
|
98
|
+
.filter((token) => token.length > 0)
|
|
99
|
+
.join(' ');
|
|
100
|
+
}
|
|
101
|
+
function tokensToEscapedHtml(lines) {
|
|
102
|
+
return lines
|
|
103
|
+
.map((line) => line
|
|
104
|
+
.map((token) => {
|
|
105
|
+
const escapedContent = escapeTngCodeHtml(token.content);
|
|
106
|
+
const normalizedClassName = tokenClassNameToAttributeValue(token.className);
|
|
107
|
+
if (normalizedClassName.length === 0) {
|
|
108
|
+
return escapedContent;
|
|
109
|
+
}
|
|
110
|
+
return `<span class="${escapeTngCodeHtml(normalizedClassName)}">${escapedContent}</span>`;
|
|
111
|
+
})
|
|
112
|
+
.join(''))
|
|
113
|
+
.join('\n');
|
|
114
|
+
}
|
|
115
|
+
export function normalizeTngCodeLanguage(value) {
|
|
116
|
+
if (value === null || value === undefined) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const normalizedValue = value.trim();
|
|
120
|
+
return normalizedValue.length > 0 ? normalizedValue : null;
|
|
121
|
+
}
|
|
122
|
+
export function normalizeTngCodeHighlighterId(value) {
|
|
123
|
+
return normalizeRequiredString(value, 'Code highlighter adapter id').toLowerCase();
|
|
124
|
+
}
|
|
125
|
+
export function escapeTngCodeHtml(value) {
|
|
126
|
+
return value
|
|
127
|
+
.replace(htmlEscapeAmpersand, htmlEscapeAmpersandValue)
|
|
128
|
+
.replace(htmlEscapeLt, htmlEscapeLtValue)
|
|
129
|
+
.replace(htmlEscapeGt, htmlEscapeGtValue)
|
|
130
|
+
.replace(htmlEscapeQuote, htmlEscapeQuoteValue)
|
|
131
|
+
.replace(htmlEscapeSingleQuote, htmlEscapeSingleQuoteValue);
|
|
132
|
+
}
|
|
133
|
+
export function createTngCodeHighlighterAdapter(id, highlight, supports) {
|
|
134
|
+
const adapterId = normalizeTngCodeHighlighterId(id);
|
|
135
|
+
return Object.freeze({
|
|
136
|
+
highlight,
|
|
137
|
+
id: adapterId,
|
|
138
|
+
supports,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
export const tngPlainCodeHighlighterAdapter = createTngCodeHighlighterAdapter(TNG_DEFAULT_CODE_HIGHLIGHTER_ID, (input) => ({
|
|
142
|
+
html: escapeTngCodeHtml(input.code),
|
|
143
|
+
kind: 'html',
|
|
144
|
+
language: input.language,
|
|
145
|
+
trustedHtml: false,
|
|
146
|
+
}));
|
|
147
|
+
export const TNG_BUILTIN_CODE_HIGHLIGHTERS = createReadonlyAdapterMap({
|
|
148
|
+
[TNG_DEFAULT_CODE_HIGHLIGHTER_ID]: tngPlainCodeHighlighterAdapter,
|
|
149
|
+
});
|
|
150
|
+
export function resolveTngCodeHighlightingConfig(options = {}) {
|
|
151
|
+
const mergedAdapters = withCustomAdapters(TNG_BUILTIN_CODE_HIGHLIGHTERS, options.adapters ?? [], options.allowBuiltinOverride === true);
|
|
152
|
+
return {
|
|
153
|
+
adapters: createReadonlyAdapterMap(mergedAdapters),
|
|
154
|
+
defaultAdapter: resolveDefaultAdapterId(options.defaultAdapter, mergedAdapters),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export async function resolveTngCodeHighlightResult(request, config) {
|
|
158
|
+
const adapter = resolveAdapterFromRequest(request, config);
|
|
159
|
+
const normalizedLanguage = normalizeTngCodeLanguage(request.language);
|
|
160
|
+
if (typeof adapter.supports === 'function' && !adapter.supports(normalizedLanguage)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const rawResult = await adapter.highlight({
|
|
164
|
+
code: request.code,
|
|
165
|
+
includeLineWrappers: request.includeLineWrappers ?? false,
|
|
166
|
+
language: normalizedLanguage,
|
|
167
|
+
theme: normalizeTngCodeLanguage(request.theme),
|
|
168
|
+
});
|
|
169
|
+
return normalizeHighlightResult(rawResult, normalizedLanguage);
|
|
170
|
+
}
|
|
171
|
+
export async function highlightWithTngCodeHighlightingConfig(request, config) {
|
|
172
|
+
const resolvedResult = await resolveTngCodeHighlightResult(request, config);
|
|
173
|
+
if (resolvedResult === null) {
|
|
174
|
+
return escapeTngCodeHtml(request.code);
|
|
175
|
+
}
|
|
176
|
+
if (resolvedResult.kind === 'tokens') {
|
|
177
|
+
return tokensToEscapedHtml(resolvedResult.tokens);
|
|
178
|
+
}
|
|
179
|
+
return resolvedResult.html;
|
|
180
|
+
}
|
|
181
|
+
export const TNG_CODE_HIGHLIGHTING_CONFIG = new InjectionToken('TNG_CODE_HIGHLIGHTING_CONFIG', {
|
|
182
|
+
providedIn: 'root',
|
|
183
|
+
factory: () => resolveTngCodeHighlightingConfig(),
|
|
184
|
+
});
|
|
185
|
+
export const TNG_CODE_HIGHLIGHTING_RESOLVER = new InjectionToken('TNG_CODE_HIGHLIGHTING_RESOLVER', {
|
|
186
|
+
providedIn: 'root',
|
|
187
|
+
factory: () => new TngCodeHighlightingResolver(inject(TNG_CODE_HIGHLIGHTING_CONFIG)),
|
|
188
|
+
});
|
|
189
|
+
export function provideTngCodeHighlighting(options) {
|
|
190
|
+
return makeEnvironmentProviders([
|
|
191
|
+
{
|
|
192
|
+
provide: TNG_CODE_HIGHLIGHTING_CONFIG,
|
|
193
|
+
useValue: resolveTngCodeHighlightingConfig(options),
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
deps: [TNG_CODE_HIGHLIGHTING_CONFIG],
|
|
197
|
+
provide: TNG_CODE_HIGHLIGHTING_RESOLVER,
|
|
198
|
+
useFactory: (config) => new TngCodeHighlightingResolver(config),
|
|
199
|
+
},
|
|
200
|
+
]);
|
|
201
|
+
}
|
|
202
|
+
export class TngCodeHighlightingResolver {
|
|
203
|
+
config;
|
|
204
|
+
constructor(config) {
|
|
205
|
+
this.config = config;
|
|
206
|
+
}
|
|
207
|
+
getAdapterIds() {
|
|
208
|
+
return Object.keys(this.config.adapters);
|
|
209
|
+
}
|
|
210
|
+
getDefaultAdapterId() {
|
|
211
|
+
return this.config.defaultAdapter;
|
|
212
|
+
}
|
|
213
|
+
async highlight(request) {
|
|
214
|
+
return highlightWithTngCodeHighlightingConfig(request, this.config);
|
|
215
|
+
}
|
|
216
|
+
async highlightResult(request) {
|
|
217
|
+
return resolveTngCodeHighlightResult(request, this.config);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=highlighting.js.map
|