@cdevhub/ngx-tw 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
- package/package.json +265 -0
- package/theme/_base.css +394 -0
- package/theme/_dark.css +510 -0
- package/theme/_high-contrast.css +290 -0
- package/theme/_semantic.css +317 -0
- package/theme/_typography.css +9 -0
- package/theme/index.css +54 -0
- package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
- package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
- package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
- package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
- package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
- package/types/cdevhub-ngx-tw-button.d.ts +74 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
- package/types/cdevhub-ngx-tw-card.d.ts +48 -0
- package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
- package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
- package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
- package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
- package/types/cdevhub-ngx-tw-core.d.ts +719 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
- package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
- package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
- package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
- package/types/cdevhub-ngx-tw-input.d.ts +110 -0
- package/types/cdevhub-ngx-tw-item.d.ts +70 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
- package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
- package/types/cdevhub-ngx-tw-select.d.ts +384 -0
- package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
- package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
- package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
- package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
- package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
- package/types/cdevhub-ngx-tw-split.d.ts +265 -0
- package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
- package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
- package/types/cdevhub-ngx-tw-table.d.ts +479 -0
- package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
- package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
- package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
- package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
- package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
- package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
- package/types/cdevhub-ngx-tw.d.ts +49 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, ChangeDetectionStrategy, Component, Directive, inject, effect, output } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import * as i1 from '@angular/cdk/menu';
|
|
5
|
+
import { CdkMenu, CdkMenuTrigger, CdkContextMenuTrigger, CdkMenuItem, CdkMenuItemCheckbox, CdkMenuItemRadio, CdkMenuGroup } from '@angular/cdk/menu';
|
|
6
|
+
import { tv } from 'tailwind-variants';
|
|
7
|
+
|
|
8
|
+
// ── Variant configs ──
|
|
9
|
+
const menuVariants = tv({
|
|
10
|
+
base: 'min-w-48 flex flex-col max-h-96 rounded-lg bg-surface-overlay border border-border shadow-md overflow-y-auto text-fg',
|
|
11
|
+
variants: {
|
|
12
|
+
// Menu panels intentionally use sub-`p-1` padding at xs/sm because items
|
|
13
|
+
// carry their own inline padding — the codified `p-2`/`p-3`/`p-4` container
|
|
14
|
+
// scale would over-pad the panel gutter. The size axis here scales the panel
|
|
15
|
+
// border-to-item gap only, not item density.
|
|
16
|
+
size: {
|
|
17
|
+
xs: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',
|
|
18
|
+
sm: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',
|
|
19
|
+
md: 'p-1 [&>tw-separator]:-mx-1 [&>tw-separator]:my-1',
|
|
20
|
+
lg: 'p-1.5 [&>tw-separator]:-mx-1.5 [&>tw-separator]:my-1',
|
|
21
|
+
xl: 'p-2 [&>tw-separator]:-mx-2 [&>tw-separator]:my-1',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
defaultVariants: { size: 'md' },
|
|
25
|
+
}, { twMerge: true });
|
|
26
|
+
// Menu items use the codified menu-item focus carve-out: `focus-visible:bg-surface-muted`
|
|
27
|
+
// (and color-tinted equivalents below) in place of the canonical outline ring. See the
|
|
28
|
+
// "Focus Rings → Menu-item carve-out" section in CLAUDE.md.
|
|
29
|
+
const menuItemVariants = tv({
|
|
30
|
+
base: 'relative flex w-full flex-wrap items-center gap-2 rounded-md cursor-pointer select-none transition-colors duration-normal motion-reduce:transition-none text-fg outline-none focus-visible:bg-surface-muted hover:bg-surface-muted',
|
|
31
|
+
variants: {
|
|
32
|
+
size: {
|
|
33
|
+
xs: 'px-1.5 py-0.5 text-xs',
|
|
34
|
+
sm: 'px-2 py-1 text-xs',
|
|
35
|
+
md: 'px-3 py-1.5 text-sm',
|
|
36
|
+
lg: 'px-4 py-2 text-sm',
|
|
37
|
+
xl: 'px-5 py-2.5 text-base',
|
|
38
|
+
},
|
|
39
|
+
// Slot tokens own light/dark contrast — no `dark:`, no shade picks.
|
|
40
|
+
// `undefined` (the default) leaves the base text-fg styling untouched.
|
|
41
|
+
color: {
|
|
42
|
+
primary: 'text-primary-fg hover:bg-primary-soft focus-visible:bg-primary-soft',
|
|
43
|
+
secondary: 'text-secondary-fg hover:bg-secondary-soft focus-visible:bg-secondary-soft',
|
|
44
|
+
accent: 'text-accent-fg hover:bg-accent-soft focus-visible:bg-accent-soft',
|
|
45
|
+
info: 'text-info-fg hover:bg-info-soft focus-visible:bg-info-soft',
|
|
46
|
+
success: 'text-success-fg hover:bg-success-soft focus-visible:bg-success-soft',
|
|
47
|
+
warning: 'text-warning-fg hover:bg-warning-soft focus-visible:bg-warning-soft',
|
|
48
|
+
error: 'text-error-fg hover:bg-error-soft focus-visible:bg-error-soft',
|
|
49
|
+
neutral: 'text-fg-muted hover:bg-surface-muted focus-visible:bg-surface-muted',
|
|
50
|
+
},
|
|
51
|
+
// `cursor-not-allowed` is layered so a programmatically-focused disabled item
|
|
52
|
+
// still reads as disabled — `pointer-events-none` blocks pointer activation, but
|
|
53
|
+
// the cursor cue communicates the state if focus lands here via CDK's own paths.
|
|
54
|
+
// CDK's `FocusableOption` honours `cdkItem.disabled` (synced via the effect below)
|
|
55
|
+
// and skips disabled items in keyboard navigation automatically.
|
|
56
|
+
disabled: {
|
|
57
|
+
true: 'opacity-50 pointer-events-none cursor-not-allowed',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
defaultVariants: { size: 'md', disabled: false },
|
|
61
|
+
}, { twMerge: true });
|
|
62
|
+
const menuItemIconVariants = tv({
|
|
63
|
+
base: 'shrink-0 text-fg-muted',
|
|
64
|
+
variants: {
|
|
65
|
+
size: {
|
|
66
|
+
xs: 'size-4',
|
|
67
|
+
sm: 'size-4',
|
|
68
|
+
md: 'size-4',
|
|
69
|
+
lg: 'size-5',
|
|
70
|
+
xl: 'size-5',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
defaultVariants: { size: 'md' },
|
|
74
|
+
}, { twMerge: true });
|
|
75
|
+
const menuItemIndicatorVariants = tv({
|
|
76
|
+
base: 'shrink-0 flex items-center justify-center',
|
|
77
|
+
variants: {
|
|
78
|
+
size: {
|
|
79
|
+
xs: 'size-4',
|
|
80
|
+
sm: 'size-4',
|
|
81
|
+
md: 'size-4',
|
|
82
|
+
lg: 'size-5',
|
|
83
|
+
xl: 'size-5',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
defaultVariants: { size: 'md' },
|
|
87
|
+
}, { twMerge: true });
|
|
88
|
+
// Submenu indicator (trailing chevron). Keeps the `ml-auto pl-2` layout intent
|
|
89
|
+
// separate from the leading-icon scale; size axis follows the glyph scale per
|
|
90
|
+
// CLAUDE.md "Icon Sizing" so the chevron scales with the parent menu's density.
|
|
91
|
+
const menuItemSubmenuIndicatorVariants = tv({
|
|
92
|
+
base: 'ml-auto pl-2 shrink-0 text-fg-muted',
|
|
93
|
+
variants: {
|
|
94
|
+
size: {
|
|
95
|
+
xs: 'size-3',
|
|
96
|
+
sm: 'size-4',
|
|
97
|
+
md: 'size-4',
|
|
98
|
+
lg: 'size-5',
|
|
99
|
+
xl: 'size-5',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
defaultVariants: { size: 'md' },
|
|
103
|
+
}, { twMerge: true });
|
|
104
|
+
// ── MenuComponent ──
|
|
105
|
+
class MenuComponent {
|
|
106
|
+
/** Controls item density and padding. Defaults to `'md'`. */
|
|
107
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
108
|
+
/** Accessible label for the menu panel. Use when no visible heading describes the menu (e.g. a kebab-icon trigger). */
|
|
109
|
+
ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
110
|
+
/** ID of an element that labels the menu panel. Ignored when `ariaLabel` is set. */
|
|
111
|
+
ariaLabelledBy = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabelledBy" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
|
|
112
|
+
classes = computed(() => menuVariants({ size: this.size() }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
113
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
114
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.14", type: MenuComponent, isStandalone: true, selector: "tw-menu", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-label": "ariaLabel() ?? null", "attr.aria-labelledby": "ariaLabel() ? null : (ariaLabelledBy() ?? null)", "animate.enter": "\"scale-in\"", "animate.leave": "\"scale-out\"" } }, hostDirectives: [{ directive: i1.CdkMenu, outputs: ["closed", "closed"] }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
115
|
+
}
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuComponent, decorators: [{
|
|
117
|
+
type: Component,
|
|
118
|
+
args: [{
|
|
119
|
+
selector: 'tw-menu',
|
|
120
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
121
|
+
hostDirectives: [
|
|
122
|
+
{
|
|
123
|
+
directive: CdkMenu,
|
|
124
|
+
outputs: ['closed'],
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
host: {
|
|
128
|
+
'[class]': 'classes()',
|
|
129
|
+
'[attr.aria-label]': 'ariaLabel() ?? null',
|
|
130
|
+
'[attr.aria-labelledby]': 'ariaLabel() ? null : (ariaLabelledBy() ?? null)',
|
|
131
|
+
'[animate.enter]': '"scale-in"',
|
|
132
|
+
'[animate.leave]': '"scale-out"',
|
|
133
|
+
},
|
|
134
|
+
template: `<ng-content />`,
|
|
135
|
+
}]
|
|
136
|
+
}], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }] } });
|
|
137
|
+
// ── MenuTriggerDirective ──
|
|
138
|
+
class MenuTriggerDirective {
|
|
139
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
140
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuTriggerDirective, isStandalone: true, selector: "[twMenuTrigger]", hostDirectives: [{ directive: i1.CdkMenuTrigger, inputs: ["cdkMenuTriggerFor", "twMenuTrigger", "cdkMenuPosition", "position", "cdkMenuTriggerData", "data"], outputs: ["cdkMenuOpened", "opened", "cdkMenuClosed", "closed"] }], ngImport: i0 });
|
|
141
|
+
}
|
|
142
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuTriggerDirective, decorators: [{
|
|
143
|
+
type: Directive,
|
|
144
|
+
args: [{
|
|
145
|
+
selector: '[twMenuTrigger]',
|
|
146
|
+
hostDirectives: [
|
|
147
|
+
{
|
|
148
|
+
directive: CdkMenuTrigger,
|
|
149
|
+
inputs: [
|
|
150
|
+
'cdkMenuTriggerFor: twMenuTrigger',
|
|
151
|
+
// Forward CDK's positioning so consumers can anchor the menu (e.g. bottom-end vs bottom-start).
|
|
152
|
+
// Accepts `ConnectedPosition[]` from `@angular/cdk/overlay`.
|
|
153
|
+
'cdkMenuPosition: position',
|
|
154
|
+
// Forward menu context data so consumers can parameterise the template.
|
|
155
|
+
'cdkMenuTriggerData: data',
|
|
156
|
+
],
|
|
157
|
+
outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
}]
|
|
161
|
+
}] });
|
|
162
|
+
// ── ContextMenuTriggerDirective ──
|
|
163
|
+
class ContextMenuTriggerDirective {
|
|
164
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ContextMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
165
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: ContextMenuTriggerDirective, isStandalone: true, selector: "[twContextMenuTrigger]", hostDirectives: [{ directive: i1.CdkContextMenuTrigger, inputs: ["cdkContextMenuTriggerFor", "twContextMenuTrigger", "cdkContextMenuDisabled", "disabled", "cdkContextMenuPosition", "position", "cdkContextMenuTriggerData", "data"], outputs: ["cdkContextMenuOpened", "opened", "cdkContextMenuClosed", "closed"] }], ngImport: i0 });
|
|
166
|
+
}
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ContextMenuTriggerDirective, decorators: [{
|
|
168
|
+
type: Directive,
|
|
169
|
+
args: [{
|
|
170
|
+
selector: '[twContextMenuTrigger]',
|
|
171
|
+
hostDirectives: [
|
|
172
|
+
{
|
|
173
|
+
directive: CdkContextMenuTrigger,
|
|
174
|
+
inputs: [
|
|
175
|
+
'cdkContextMenuTriggerFor: twContextMenuTrigger',
|
|
176
|
+
'cdkContextMenuDisabled: disabled',
|
|
177
|
+
// Context menus open at pointer coordinates; `position` here tunes the
|
|
178
|
+
// `ConnectedPosition[]` fallback list once CDK has anchored the overlay.
|
|
179
|
+
'cdkContextMenuPosition: position',
|
|
180
|
+
'cdkContextMenuTriggerData: data',
|
|
181
|
+
],
|
|
182
|
+
outputs: ['cdkContextMenuOpened: opened', 'cdkContextMenuClosed: closed'],
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
}]
|
|
186
|
+
}] });
|
|
187
|
+
// ── MenuItemDirective ──
|
|
188
|
+
class MenuItemDirective {
|
|
189
|
+
/**
|
|
190
|
+
* Semantic role tint applied to the item. Use `'error'` for destructive actions.
|
|
191
|
+
* Defaults to `undefined` — no role tint is applied and the item inherits the
|
|
192
|
+
* base `text-fg` styling at full prominence; `'neutral'` (the explicit muted
|
|
193
|
+
* variant) is a distinct value with `text-fg-muted` + `bg-surface-muted` hovers.
|
|
194
|
+
*/
|
|
195
|
+
color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
196
|
+
/** Whether this item is disabled. Defaults to `false`. */
|
|
197
|
+
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
198
|
+
menu = inject(MenuComponent, { optional: true });
|
|
199
|
+
cdkItem = inject(CdkMenuItem);
|
|
200
|
+
constructor() {
|
|
201
|
+
// Single source of truth: the local `disabled` signal drives both visual state
|
|
202
|
+
// and the underlying CDK directive's behavior (`disabled` is a plain property on CDK).
|
|
203
|
+
effect(() => {
|
|
204
|
+
this.cdkItem.disabled = this.disabled();
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
classes = computed(() => menuItemVariants({
|
|
208
|
+
size: this.menu?.size() ?? 'md',
|
|
209
|
+
color: this.color(),
|
|
210
|
+
disabled: this.disabled(),
|
|
211
|
+
}), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
212
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
213
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: MenuItemDirective, isStandalone: true, selector: "[twMenuItem]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItem, outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0 });
|
|
214
|
+
}
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDirective, decorators: [{
|
|
216
|
+
type: Directive,
|
|
217
|
+
args: [{
|
|
218
|
+
selector: '[twMenuItem]',
|
|
219
|
+
hostDirectives: [
|
|
220
|
+
{
|
|
221
|
+
directive: CdkMenuItem,
|
|
222
|
+
outputs: ['cdkMenuItemTriggered: triggered'],
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
host: {
|
|
226
|
+
'[class]': 'classes()',
|
|
227
|
+
},
|
|
228
|
+
}]
|
|
229
|
+
}], ctorParameters: () => [], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
|
|
230
|
+
// ── MenuItemCheckboxComponent ──
|
|
231
|
+
class MenuItemCheckboxComponent {
|
|
232
|
+
/** Whether this item is disabled. Defaults to `false`. */
|
|
233
|
+
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
234
|
+
/** Fires when the item is activated, carrying the new `checked` value after CDK toggles it. */
|
|
235
|
+
checkedChange = output();
|
|
236
|
+
cdkCheckbox = inject(CdkMenuItemCheckbox);
|
|
237
|
+
menu = inject(MenuComponent, { optional: true });
|
|
238
|
+
resolvedSize = computed(() => this.menu?.size() ?? 'md', ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
|
|
239
|
+
constructor() {
|
|
240
|
+
effect(() => {
|
|
241
|
+
this.cdkCheckbox.disabled = this.disabled();
|
|
242
|
+
});
|
|
243
|
+
// CDK fires `triggered` BEFORE updating `checked`; emit the post-toggle value.
|
|
244
|
+
this.cdkCheckbox.triggered
|
|
245
|
+
.pipe(takeUntilDestroyed())
|
|
246
|
+
.subscribe(() => this.checkedChange.emit(!this.cdkCheckbox.checked));
|
|
247
|
+
}
|
|
248
|
+
classes = computed(() => menuItemVariants({
|
|
249
|
+
size: this.resolvedSize(),
|
|
250
|
+
disabled: this.disabled(),
|
|
251
|
+
}), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
252
|
+
indicatorClasses = computed(() => menuItemIndicatorVariants({ size: this.resolvedSize() }), ...(ngDevMode ? [{ debugName: "indicatorClasses" }] : /* istanbul ignore next */ []));
|
|
253
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
254
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: MenuItemCheckboxComponent, isStandalone: true, selector: "[twMenuItemCheckbox]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItemCheckbox, inputs: ["cdkMenuItemChecked", "checked"], outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0, template: `
|
|
255
|
+
<span [class]="indicatorClasses()">
|
|
256
|
+
@if (cdkCheckbox.checked) {
|
|
257
|
+
<svg class="size-full" viewBox="0 0 20 20" fill="currentColor">
|
|
258
|
+
<path fill-rule="evenodd" d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z" clip-rule="evenodd"/>
|
|
259
|
+
</svg>
|
|
260
|
+
}
|
|
261
|
+
</span>
|
|
262
|
+
<ng-content />
|
|
263
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
264
|
+
}
|
|
265
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemCheckboxComponent, decorators: [{
|
|
266
|
+
type: Component,
|
|
267
|
+
args: [{
|
|
268
|
+
selector: '[twMenuItemCheckbox]',
|
|
269
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
270
|
+
hostDirectives: [
|
|
271
|
+
{
|
|
272
|
+
directive: CdkMenuItemCheckbox,
|
|
273
|
+
inputs: ['cdkMenuItemChecked: checked'],
|
|
274
|
+
outputs: ['cdkMenuItemTriggered: triggered'],
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
host: {
|
|
278
|
+
'[class]': 'classes()',
|
|
279
|
+
},
|
|
280
|
+
template: `
|
|
281
|
+
<span [class]="indicatorClasses()">
|
|
282
|
+
@if (cdkCheckbox.checked) {
|
|
283
|
+
<svg class="size-full" viewBox="0 0 20 20" fill="currentColor">
|
|
284
|
+
<path fill-rule="evenodd" d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z" clip-rule="evenodd"/>
|
|
285
|
+
</svg>
|
|
286
|
+
}
|
|
287
|
+
</span>
|
|
288
|
+
<ng-content />
|
|
289
|
+
`,
|
|
290
|
+
}]
|
|
291
|
+
}], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }] } });
|
|
292
|
+
// ── MenuItemRadioComponent ──
|
|
293
|
+
class MenuItemRadioComponent {
|
|
294
|
+
/** Whether this item is disabled. Defaults to `false`. */
|
|
295
|
+
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
296
|
+
/** Fires when the item is activated, carrying the new `checked` value after CDK selects it. */
|
|
297
|
+
checkedChange = output();
|
|
298
|
+
cdkRadio = inject(CdkMenuItemRadio);
|
|
299
|
+
menu = inject(MenuComponent, { optional: true });
|
|
300
|
+
resolvedSize = computed(() => this.menu?.size() ?? 'md', ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
|
|
301
|
+
constructor() {
|
|
302
|
+
effect(() => {
|
|
303
|
+
this.cdkRadio.disabled = this.disabled();
|
|
304
|
+
});
|
|
305
|
+
// Radio activation always selects the item; emit `true` (the post-trigger checked state).
|
|
306
|
+
this.cdkRadio.triggered
|
|
307
|
+
.pipe(takeUntilDestroyed())
|
|
308
|
+
.subscribe(() => this.checkedChange.emit(true));
|
|
309
|
+
}
|
|
310
|
+
classes = computed(() => menuItemVariants({
|
|
311
|
+
size: this.resolvedSize(),
|
|
312
|
+
disabled: this.disabled(),
|
|
313
|
+
}), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
314
|
+
indicatorClasses = computed(() => menuItemIndicatorVariants({ size: this.resolvedSize() }), ...(ngDevMode ? [{ debugName: "indicatorClasses" }] : /* istanbul ignore next */ []));
|
|
315
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
316
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: MenuItemRadioComponent, isStandalone: true, selector: "[twMenuItemRadio]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.CdkMenuItemRadio, inputs: ["cdkMenuItemChecked", "checked"], outputs: ["cdkMenuItemTriggered", "triggered"] }], ngImport: i0, template: `
|
|
317
|
+
<span [class]="indicatorClasses()">
|
|
318
|
+
@if (cdkRadio.checked) {
|
|
319
|
+
<svg class="size-full" viewBox="0 0 20 20" fill="currentColor">
|
|
320
|
+
<circle cx="10" cy="10" r="5"/>
|
|
321
|
+
</svg>
|
|
322
|
+
}
|
|
323
|
+
</span>
|
|
324
|
+
<ng-content />
|
|
325
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
326
|
+
}
|
|
327
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemRadioComponent, decorators: [{
|
|
328
|
+
type: Component,
|
|
329
|
+
args: [{
|
|
330
|
+
selector: '[twMenuItemRadio]',
|
|
331
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
332
|
+
hostDirectives: [
|
|
333
|
+
{
|
|
334
|
+
directive: CdkMenuItemRadio,
|
|
335
|
+
inputs: ['cdkMenuItemChecked: checked'],
|
|
336
|
+
outputs: ['cdkMenuItemTriggered: triggered'],
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
host: {
|
|
340
|
+
'[class]': 'classes()',
|
|
341
|
+
},
|
|
342
|
+
template: `
|
|
343
|
+
<span [class]="indicatorClasses()">
|
|
344
|
+
@if (cdkRadio.checked) {
|
|
345
|
+
<svg class="size-full" viewBox="0 0 20 20" fill="currentColor">
|
|
346
|
+
<circle cx="10" cy="10" r="5"/>
|
|
347
|
+
</svg>
|
|
348
|
+
}
|
|
349
|
+
</span>
|
|
350
|
+
<ng-content />
|
|
351
|
+
`,
|
|
352
|
+
}]
|
|
353
|
+
}], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }] } });
|
|
354
|
+
// ── MenuGroupDirective ──
|
|
355
|
+
class MenuGroupDirective {
|
|
356
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
357
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuGroupDirective, isStandalone: true, selector: "[twMenuGroup]", hostDirectives: [{ directive: i1.CdkMenuGroup }], ngImport: i0 });
|
|
358
|
+
}
|
|
359
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuGroupDirective, decorators: [{
|
|
360
|
+
type: Directive,
|
|
361
|
+
args: [{
|
|
362
|
+
selector: '[twMenuGroup]',
|
|
363
|
+
hostDirectives: [CdkMenuGroup],
|
|
364
|
+
}]
|
|
365
|
+
}] });
|
|
366
|
+
// ── Content directives ──
|
|
367
|
+
/** Styles a leading icon inside a menu item. */
|
|
368
|
+
class MenuItemIconDirective {
|
|
369
|
+
menu = inject(MenuComponent, { optional: true });
|
|
370
|
+
classes = computed(() => menuItemIconVariants({ size: this.menu?.size() ?? 'md' }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
371
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
372
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemIconDirective, isStandalone: true, selector: "[twMenuItemIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
373
|
+
}
|
|
374
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemIconDirective, decorators: [{
|
|
375
|
+
type: Directive,
|
|
376
|
+
args: [{
|
|
377
|
+
selector: '[twMenuItemIcon]',
|
|
378
|
+
host: {
|
|
379
|
+
'[class]': 'classes()',
|
|
380
|
+
},
|
|
381
|
+
}]
|
|
382
|
+
}] });
|
|
383
|
+
/** Styles secondary description text inside a menu item. */
|
|
384
|
+
class MenuItemDescriptionDirective {
|
|
385
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
386
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemDescriptionDirective, isStandalone: true, selector: "[twMenuItemDescription]", host: { classAttribute: "block text-xs text-fg-muted min-w-0 truncate order-last basis-full" }, ngImport: i0 });
|
|
387
|
+
}
|
|
388
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemDescriptionDirective, decorators: [{
|
|
389
|
+
type: Directive,
|
|
390
|
+
args: [{
|
|
391
|
+
selector: '[twMenuItemDescription]',
|
|
392
|
+
host: {
|
|
393
|
+
class: 'block text-xs text-fg-muted min-w-0 truncate order-last basis-full',
|
|
394
|
+
},
|
|
395
|
+
}]
|
|
396
|
+
}] });
|
|
397
|
+
/** Right-aligns and mutes keyboard shortcut hint text. */
|
|
398
|
+
class MenuItemShortcutDirective {
|
|
399
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemShortcutDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
400
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemShortcutDirective, isStandalone: true, selector: "[twMenuItemShortcut]", host: { classAttribute: "ml-auto pl-3 text-xs text-fg-subtle tracking-wide" }, ngImport: i0 });
|
|
401
|
+
}
|
|
402
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemShortcutDirective, decorators: [{
|
|
403
|
+
type: Directive,
|
|
404
|
+
args: [{
|
|
405
|
+
selector: '[twMenuItemShortcut]',
|
|
406
|
+
host: {
|
|
407
|
+
class: 'ml-auto pl-3 text-xs text-fg-subtle tracking-wide',
|
|
408
|
+
},
|
|
409
|
+
}]
|
|
410
|
+
}] });
|
|
411
|
+
/** Styles the trailing chevron for submenu triggers. */
|
|
412
|
+
class MenuItemSubmenuIndicatorDirective {
|
|
413
|
+
menu = inject(MenuComponent, { optional: true });
|
|
414
|
+
classes = computed(() => menuItemSubmenuIndicatorVariants({ size: this.menu?.size() ?? 'md' }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
415
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemSubmenuIndicatorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
416
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: MenuItemSubmenuIndicatorDirective, isStandalone: true, selector: "[twMenuItemSubmenuIcon]", host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
417
|
+
}
|
|
418
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MenuItemSubmenuIndicatorDirective, decorators: [{
|
|
419
|
+
type: Directive,
|
|
420
|
+
args: [{
|
|
421
|
+
selector: '[twMenuItemSubmenuIcon]',
|
|
422
|
+
host: {
|
|
423
|
+
'[class]': 'classes()',
|
|
424
|
+
},
|
|
425
|
+
}]
|
|
426
|
+
}] });
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Generated bundle index. Do not edit.
|
|
430
|
+
*/
|
|
431
|
+
|
|
432
|
+
export { ContextMenuTriggerDirective, MenuComponent, MenuGroupDirective, MenuItemCheckboxComponent, MenuItemDescriptionDirective, MenuItemDirective, MenuItemIconDirective, MenuItemRadioComponent, MenuItemShortcutDirective, MenuItemSubmenuIndicatorDirective, MenuTriggerDirective };
|
|
433
|
+
//# sourceMappingURL=cdevhub-ngx-tw-menu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-menu.mjs","sources":["../../../projects/ngx-tw/menu/menu.ts","../../../projects/ngx-tw/menu/cdevhub-ngx-tw-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CdkContextMenuTrigger,\n CdkMenu,\n CdkMenuGroup,\n CdkMenuItem,\n CdkMenuItemCheckbox,\n CdkMenuItemRadio,\n CdkMenuTrigger,\n} from '@angular/cdk/menu';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n// ── Variant configs ──\n\nconst menuVariants = tv(\n {\n base: 'min-w-48 flex flex-col max-h-96 rounded-lg bg-surface-overlay border border-border shadow-md overflow-y-auto text-fg',\n variants: {\n // Menu panels intentionally use sub-`p-1` padding at xs/sm because items\n // carry their own inline padding — the codified `p-2`/`p-3`/`p-4` container\n // scale would over-pad the panel gutter. The size axis here scales the panel\n // border-to-item gap only, not item density.\n size: {\n xs: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',\n sm: 'p-0.5 [&>tw-separator]:-mx-0.5 [&>tw-separator]:my-0.5',\n md: 'p-1 [&>tw-separator]:-mx-1 [&>tw-separator]:my-1',\n lg: 'p-1.5 [&>tw-separator]:-mx-1.5 [&>tw-separator]:my-1',\n xl: 'p-2 [&>tw-separator]:-mx-2 [&>tw-separator]:my-1',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Menu items use the codified menu-item focus carve-out: `focus-visible:bg-surface-muted`\n// (and color-tinted equivalents below) in place of the canonical outline ring. See the\n// \"Focus Rings → Menu-item carve-out\" section in CLAUDE.md.\nconst menuItemVariants = tv(\n {\n base: 'relative flex w-full flex-wrap items-center gap-2 rounded-md cursor-pointer select-none transition-colors duration-normal motion-reduce:transition-none text-fg outline-none focus-visible:bg-surface-muted hover:bg-surface-muted',\n variants: {\n size: {\n xs: 'px-1.5 py-0.5 text-xs',\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1.5 text-sm',\n lg: 'px-4 py-2 text-sm',\n xl: 'px-5 py-2.5 text-base',\n },\n // Slot tokens own light/dark contrast — no `dark:`, no shade picks.\n // `undefined` (the default) leaves the base text-fg styling untouched.\n color: {\n primary: 'text-primary-fg hover:bg-primary-soft focus-visible:bg-primary-soft',\n secondary: 'text-secondary-fg hover:bg-secondary-soft focus-visible:bg-secondary-soft',\n accent: 'text-accent-fg hover:bg-accent-soft focus-visible:bg-accent-soft',\n info: 'text-info-fg hover:bg-info-soft focus-visible:bg-info-soft',\n success: 'text-success-fg hover:bg-success-soft focus-visible:bg-success-soft',\n warning: 'text-warning-fg hover:bg-warning-soft focus-visible:bg-warning-soft',\n error: 'text-error-fg hover:bg-error-soft focus-visible:bg-error-soft',\n neutral: 'text-fg-muted hover:bg-surface-muted focus-visible:bg-surface-muted',\n },\n // `cursor-not-allowed` is layered so a programmatically-focused disabled item\n // still reads as disabled — `pointer-events-none` blocks pointer activation, but\n // the cursor cue communicates the state if focus lands here via CDK's own paths.\n // CDK's `FocusableOption` honours `cdkItem.disabled` (synced via the effect below)\n // and skips disabled items in keyboard navigation automatically.\n disabled: {\n true: 'opacity-50 pointer-events-none cursor-not-allowed',\n },\n },\n defaultVariants: { size: 'md', disabled: false },\n },\n { twMerge: true },\n);\n\nconst menuItemIconVariants = tv(\n {\n base: 'shrink-0 text-fg-muted',\n variants: {\n size: {\n xs: 'size-4',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\nconst menuItemIndicatorVariants = tv(\n {\n base: 'shrink-0 flex items-center justify-center',\n variants: {\n size: {\n xs: 'size-4',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Submenu indicator (trailing chevron). Keeps the `ml-auto pl-2` layout intent\n// separate from the leading-icon scale; size axis follows the glyph scale per\n// CLAUDE.md \"Icon Sizing\" so the chevron scales with the parent menu's density.\nconst menuItemSubmenuIndicatorVariants = tv(\n {\n base: 'ml-auto pl-2 shrink-0 text-fg-muted',\n variants: {\n size: {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// ── MenuComponent ──\n\n@Component({\n selector: 'tw-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenu,\n outputs: ['closed'],\n },\n ],\n host: {\n '[class]': 'classes()',\n '[attr.aria-label]': 'ariaLabel() ?? null',\n '[attr.aria-labelledby]': 'ariaLabel() ? null : (ariaLabelledBy() ?? null)',\n '[animate.enter]': '\"scale-in\"',\n '[animate.leave]': '\"scale-out\"',\n },\n template: `<ng-content />`,\n})\nexport class MenuComponent {\n /** Controls item density and padding. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Accessible label for the menu panel. Use when no visible heading describes the menu (e.g. a kebab-icon trigger). */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an element that labels the menu panel. Ignored when `ariaLabel` is set. */\n readonly ariaLabelledBy = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n readonly classes = computed(() => menuVariants({ size: this.size() }));\n}\n\n// ── MenuTriggerDirective ──\n\n@Directive({\n selector: '[twMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkMenuTrigger,\n inputs: [\n 'cdkMenuTriggerFor: twMenuTrigger',\n // Forward CDK's positioning so consumers can anchor the menu (e.g. bottom-end vs bottom-start).\n // Accepts `ConnectedPosition[]` from `@angular/cdk/overlay`.\n 'cdkMenuPosition: position',\n // Forward menu context data so consumers can parameterise the template.\n 'cdkMenuTriggerData: data',\n ],\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\n },\n ],\n})\nexport class MenuTriggerDirective {}\n\n// ── ContextMenuTriggerDirective ──\n\n@Directive({\n selector: '[twContextMenuTrigger]',\n hostDirectives: [\n {\n directive: CdkContextMenuTrigger,\n inputs: [\n 'cdkContextMenuTriggerFor: twContextMenuTrigger',\n 'cdkContextMenuDisabled: disabled',\n // Context menus open at pointer coordinates; `position` here tunes the\n // `ConnectedPosition[]` fallback list once CDK has anchored the overlay.\n 'cdkContextMenuPosition: position',\n 'cdkContextMenuTriggerData: data',\n ],\n outputs: ['cdkContextMenuOpened: opened', 'cdkContextMenuClosed: closed'],\n },\n ],\n})\nexport class ContextMenuTriggerDirective {}\n\n// ── MenuItemDirective ──\n\n@Directive({\n selector: '[twMenuItem]',\n hostDirectives: [\n {\n directive: CdkMenuItem,\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemDirective {\n /**\n * Semantic role tint applied to the item. Use `'error'` for destructive actions.\n * Defaults to `undefined` — no role tint is applied and the item inherits the\n * base `text-fg` styling at full prominence; `'neutral'` (the explicit muted\n * variant) is a distinct value with `text-fg-muted` + `bg-surface-muted` hovers.\n */\n readonly color = input<TwColor | undefined>(undefined);\n\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n private readonly menu = inject(MenuComponent, { optional: true });\n private readonly cdkItem = inject(CdkMenuItem);\n\n constructor() {\n // Single source of truth: the local `disabled` signal drives both visual state\n // and the underlying CDK directive's behavior (`disabled` is a plain property on CDK).\n effect(() => {\n this.cdkItem.disabled = this.disabled();\n });\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.menu?.size() ?? 'md',\n color: this.color(),\n disabled: this.disabled(),\n }),\n );\n}\n\n// ── MenuItemCheckboxComponent ──\n\n@Component({\n selector: '[twMenuItemCheckbox]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenuItemCheckbox,\n inputs: ['cdkMenuItemChecked: checked'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (cdkCheckbox.checked) {\n <svg class=\"size-full\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clip-rule=\"evenodd\"/>\n </svg>\n }\n </span>\n <ng-content />\n `,\n})\nexport class MenuItemCheckboxComponent {\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** Fires when the item is activated, carrying the new `checked` value after CDK toggles it. */\n readonly checkedChange = output<boolean>();\n\n protected readonly cdkCheckbox = inject(CdkMenuItemCheckbox);\n private readonly menu = inject(MenuComponent, { optional: true });\n\n private readonly resolvedSize = computed(() => this.menu?.size() ?? 'md');\n\n constructor() {\n effect(() => {\n this.cdkCheckbox.disabled = this.disabled();\n });\n // CDK fires `triggered` BEFORE updating `checked`; emit the post-toggle value.\n this.cdkCheckbox.triggered\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.checkedChange.emit(!this.cdkCheckbox.checked));\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.resolvedSize(),\n disabled: this.disabled(),\n }),\n );\n\n readonly indicatorClasses = computed(() =>\n menuItemIndicatorVariants({ size: this.resolvedSize() }),\n );\n}\n\n// ── MenuItemRadioComponent ──\n\n@Component({\n selector: '[twMenuItemRadio]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CdkMenuItemRadio,\n inputs: ['cdkMenuItemChecked: checked'],\n outputs: ['cdkMenuItemTriggered: triggered'],\n },\n ],\n host: {\n '[class]': 'classes()',\n },\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (cdkRadio.checked) {\n <svg class=\"size-full\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <circle cx=\"10\" cy=\"10\" r=\"5\"/>\n </svg>\n }\n </span>\n <ng-content />\n `,\n})\nexport class MenuItemRadioComponent {\n /** Whether this item is disabled. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** Fires when the item is activated, carrying the new `checked` value after CDK selects it. */\n readonly checkedChange = output<boolean>();\n\n protected readonly cdkRadio = inject(CdkMenuItemRadio);\n private readonly menu = inject(MenuComponent, { optional: true });\n\n private readonly resolvedSize = computed(() => this.menu?.size() ?? 'md');\n\n constructor() {\n effect(() => {\n this.cdkRadio.disabled = this.disabled();\n });\n // Radio activation always selects the item; emit `true` (the post-trigger checked state).\n this.cdkRadio.triggered\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.checkedChange.emit(true));\n }\n\n readonly classes = computed(() =>\n menuItemVariants({\n size: this.resolvedSize(),\n disabled: this.disabled(),\n }),\n );\n\n readonly indicatorClasses = computed(() =>\n menuItemIndicatorVariants({ size: this.resolvedSize() }),\n );\n}\n\n// ── MenuGroupDirective ──\n\n@Directive({\n selector: '[twMenuGroup]',\n hostDirectives: [CdkMenuGroup],\n})\nexport class MenuGroupDirective {}\n\n// ── Content directives ──\n\n/** Styles a leading icon inside a menu item. */\n@Directive({\n selector: '[twMenuItemIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemIconDirective {\n private readonly menu = inject(MenuComponent, { optional: true });\n\n readonly classes = computed(() =>\n menuItemIconVariants({ size: this.menu?.size() ?? 'md' }),\n );\n}\n\n/** Styles secondary description text inside a menu item. */\n@Directive({\n selector: '[twMenuItemDescription]',\n host: {\n class: 'block text-xs text-fg-muted min-w-0 truncate order-last basis-full',\n },\n})\nexport class MenuItemDescriptionDirective {}\n\n/** Right-aligns and mutes keyboard shortcut hint text. */\n@Directive({\n selector: '[twMenuItemShortcut]',\n host: {\n class: 'ml-auto pl-3 text-xs text-fg-subtle tracking-wide',\n },\n})\nexport class MenuItemShortcutDirective {}\n\n/** Styles the trailing chevron for submenu triggers. */\n@Directive({\n selector: '[twMenuItemSubmenuIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class MenuItemSubmenuIndicatorDirective {\n private readonly menu = inject(MenuComponent, { optional: true });\n\n readonly classes = computed(() =>\n menuItemSubmenuIndicatorVariants({ size: this.menu?.size() ?? 'md' }),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|