@cdevhub/ngx-tw 0.2.0 → 0.3.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 +264 -49
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +35 -22
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +416 -216
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +152 -81
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +42 -29
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +205 -110
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +141 -74
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +395 -149
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +142 -72
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +227 -122
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +47 -25
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +102 -52
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +16 -8
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +100 -55
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
- package/package.json +45 -17
- package/theme/_dark.css +16 -12
- package/theme/_semantic.css +3 -2
- package/theme/index.css +10 -2
- package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
- package/types/cdevhub-ngx-tw-code-block.d.ts +8 -7
- package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
- package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
- package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
- package/types/cdevhub-ngx-tw-select.d.ts +1 -1
- package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
- package/types/cdevhub-ngx-tw-table.d.ts +30 -1
- package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
- package/types/cdevhub-ngx-tw-toast.d.ts +1 -1
- package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
- package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
- package/types/cdevhub-ngx-tw.d.ts +7 -0
|
@@ -130,11 +130,12 @@ function findLastEnabled(items) {
|
|
|
130
130
|
/** Optional explicit grouping wrapper. Items placed inside inherit its label. */
|
|
131
131
|
class CommandPaletteGroupDirective {
|
|
132
132
|
/** Group heading text shown above the items. Required. */
|
|
133
|
-
label = input.required(
|
|
134
|
-
|
|
135
|
-
static
|
|
133
|
+
label = input.required(/* @ts-ignore */
|
|
134
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
135
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
136
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: CommandPaletteGroupDirective, isStandalone: true, selector: "[twCommandPaletteGroup]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
|
|
136
137
|
}
|
|
137
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteGroupDirective, decorators: [{
|
|
138
139
|
type: Directive,
|
|
139
140
|
args: [{
|
|
140
141
|
selector: '[twCommandPaletteGroup]',
|
|
@@ -144,25 +145,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
144
145
|
/** A declarative palette item. Consumers project its rendered content as children. */
|
|
145
146
|
class CommandPaletteItemDirective {
|
|
146
147
|
/** Stable identifier for the item. Used as DOM id and in selection payloads. Required. */
|
|
147
|
-
id = input.required(
|
|
148
|
+
id = input.required(/* @ts-ignore */
|
|
149
|
+
...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
148
150
|
/** Plain-text label used for filtering and default rendering. Defaults to `''`. */
|
|
149
|
-
label = input('',
|
|
151
|
+
label = input('', /* @ts-ignore */
|
|
152
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
150
153
|
/** Additional search keywords that match the query but are not rendered. Defaults to `[]`. */
|
|
151
|
-
keywords = input([],
|
|
154
|
+
keywords = input([], /* @ts-ignore */
|
|
155
|
+
...(ngDevMode ? [{ debugName: "keywords" }] : /* istanbul ignore next */ []));
|
|
152
156
|
/** Explicit group name. Overrides any enclosing `twCommandPaletteGroup`. Defaults to `undefined`. */
|
|
153
|
-
group = input(undefined,
|
|
157
|
+
group = input(undefined, /* @ts-ignore */
|
|
158
|
+
...(ngDevMode ? [{ debugName: "group" }] : /* istanbul ignore next */ []));
|
|
154
159
|
/** Whether the item is disabled. Disabled items render but cannot be activated. Defaults to `false`. */
|
|
155
|
-
disabled = input(false,
|
|
160
|
+
disabled = input(false, /* @ts-ignore */
|
|
161
|
+
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
156
162
|
/** Keyboard shortcut hint. A string renders as one kbd; an array renders each key separately. Defaults to `undefined`. */
|
|
157
|
-
shortcut = input(undefined,
|
|
163
|
+
shortcut = input(undefined, /* @ts-ignore */
|
|
164
|
+
...(ngDevMode ? [{ debugName: "shortcut" }] : /* istanbul ignore next */ []));
|
|
158
165
|
/** Secondary description text rendered under the label. Defaults to `''`. */
|
|
159
|
-
description = input('',
|
|
166
|
+
description = input('', /* @ts-ignore */
|
|
167
|
+
...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
|
|
160
168
|
/** Callback run before `activated` emits. Defaults to `undefined`. */
|
|
161
|
-
run = input(undefined,
|
|
169
|
+
run = input(undefined, /* @ts-ignore */
|
|
170
|
+
...(ngDevMode ? [{ debugName: "run" }] : /* istanbul ignore next */ []));
|
|
162
171
|
/** Fires when this specific item is activated (Enter or click). */
|
|
163
172
|
activated = output();
|
|
164
173
|
/** Projected template used by the palette overlay to render this item's content. */
|
|
165
|
-
contentTemplate = viewChild('content',
|
|
174
|
+
contentTemplate = viewChild('content', /* @ts-ignore */
|
|
175
|
+
...(ngDevMode ? [{ debugName: "contentTemplate" }] : /* istanbul ignore next */ []));
|
|
166
176
|
parentGroup = inject(CommandPaletteGroupDirective, {
|
|
167
177
|
optional: true,
|
|
168
178
|
skipSelf: true,
|
|
@@ -177,11 +187,12 @@ class CommandPaletteItemDirective {
|
|
|
177
187
|
shortcut: this.shortcut(),
|
|
178
188
|
description: this.description() || undefined,
|
|
179
189
|
run: this.run(),
|
|
180
|
-
}),
|
|
181
|
-
|
|
182
|
-
static
|
|
190
|
+
}), /* @ts-ignore */
|
|
191
|
+
...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
192
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
193
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: CommandPaletteItemDirective, isStandalone: true, selector: "tw-command-palette-item", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, keywords: { classPropertyName: "keywords", publicName: "keywords", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, shortcut: { classPropertyName: "shortcut", publicName: "shortcut", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, run: { classPropertyName: "run", publicName: "run", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activated: "activated" }, host: { styleAttribute: "display: none" }, viewQueries: [{ propertyName: "contentTemplate", first: true, predicate: ["content"], descendants: true, isSignal: true }], ngImport: i0, template: `<ng-template #content><ng-content /></ng-template>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
183
194
|
}
|
|
184
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
195
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteItemDirective, decorators: [{
|
|
185
196
|
type: Component,
|
|
186
197
|
args: [{
|
|
187
198
|
selector: 'tw-command-palette-item',
|
|
@@ -195,10 +206,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
195
206
|
// ── Item decoration directives ──
|
|
196
207
|
/** Styles a leading icon inside a palette item. */
|
|
197
208
|
class CommandPaletteItemIconDirective {
|
|
198
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
199
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
209
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteItemIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
210
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: CommandPaletteItemIconDirective, isStandalone: true, selector: "[twCommandPaletteItemIcon]", host: { classAttribute: "size-4 shrink-0 text-fg-muted" }, ngImport: i0 });
|
|
200
211
|
}
|
|
201
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteItemIconDirective, decorators: [{
|
|
202
213
|
type: Directive,
|
|
203
214
|
args: [{
|
|
204
215
|
selector: '[twCommandPaletteItemIcon]',
|
|
@@ -209,10 +220,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
209
220
|
}] });
|
|
210
221
|
/** Styles secondary description text inside a palette item. */
|
|
211
222
|
class CommandPaletteItemDescriptionDirective {
|
|
212
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
213
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
223
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteItemDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
224
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: CommandPaletteItemDescriptionDirective, isStandalone: true, selector: "[twCommandPaletteItemDescription]", host: { classAttribute: "block text-xs text-fg-muted mt-0.5 min-w-0 truncate" }, ngImport: i0 });
|
|
214
225
|
}
|
|
215
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteItemDescriptionDirective, decorators: [{
|
|
216
227
|
type: Directive,
|
|
217
228
|
args: [{
|
|
218
229
|
selector: '[twCommandPaletteItemDescription]',
|
|
@@ -225,10 +236,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
225
236
|
/** Structural directive — consumer template rendered when no items match the query. */
|
|
226
237
|
class CommandPaletteEmptyDirective {
|
|
227
238
|
template = inject((TemplateRef));
|
|
228
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
229
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
239
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteEmptyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
240
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: CommandPaletteEmptyDirective, isStandalone: true, selector: "[twCommandPaletteEmpty]", ngImport: i0 });
|
|
230
241
|
}
|
|
231
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
242
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteEmptyDirective, decorators: [{
|
|
232
243
|
type: Directive,
|
|
233
244
|
args: [{
|
|
234
245
|
selector: '[twCommandPaletteEmpty]',
|
|
@@ -237,10 +248,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
237
248
|
/** Structural directive — consumer template rendered as a sticky footer inside the palette. */
|
|
238
249
|
class CommandPaletteFooterDirective {
|
|
239
250
|
template = inject((TemplateRef));
|
|
240
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
241
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
251
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
252
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: CommandPaletteFooterDirective, isStandalone: true, selector: "[twCommandPaletteFooter]", ngImport: i0 });
|
|
242
253
|
}
|
|
243
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteFooterDirective, decorators: [{
|
|
244
255
|
type: Directive,
|
|
245
256
|
args: [{
|
|
246
257
|
selector: '[twCommandPaletteFooter]',
|
|
@@ -251,25 +262,40 @@ class CommandPaletteOverlayComponent {
|
|
|
251
262
|
/** Host palette instance — provided via the content injector on attach. */
|
|
252
263
|
palette = inject(CommandPaletteComponent);
|
|
253
264
|
listId = `tw-command-palette-list-${nextPaletteId++}`;
|
|
254
|
-
searchInputRef = viewChild('searchInput',
|
|
255
|
-
|
|
265
|
+
searchInputRef = viewChild('searchInput', /* @ts-ignore */
|
|
266
|
+
...(ngDevMode ? [{ debugName: "searchInputRef" }] : /* istanbul ignore next */ []));
|
|
267
|
+
variantResult = computed(() => commandPaletteVariants({ size: this.palette.size() }), /* @ts-ignore */
|
|
268
|
+
...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
256
269
|
panelClasses = computed(() => {
|
|
257
270
|
const base = this.variantResult().panel();
|
|
258
271
|
const custom = this.palette.panelClassResolved();
|
|
259
272
|
return custom ? `${base} ${custom}` : base;
|
|
260
|
-
},
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
+
}, /* @ts-ignore */
|
|
274
|
+
...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
|
|
275
|
+
searchWrapperClasses = computed(() => this.variantResult().searchWrapper(), /* @ts-ignore */
|
|
276
|
+
...(ngDevMode ? [{ debugName: "searchWrapperClasses" }] : /* istanbul ignore next */ []));
|
|
277
|
+
searchInputClasses = computed(() => this.variantResult().searchInput(), /* @ts-ignore */
|
|
278
|
+
...(ngDevMode ? [{ debugName: "searchInputClasses" }] : /* istanbul ignore next */ []));
|
|
279
|
+
searchIconClasses = computed(() => this.variantResult().searchIcon(), /* @ts-ignore */
|
|
280
|
+
...(ngDevMode ? [{ debugName: "searchIconClasses" }] : /* istanbul ignore next */ []));
|
|
281
|
+
listClasses = computed(() => this.variantResult().list(), /* @ts-ignore */
|
|
282
|
+
...(ngDevMode ? [{ debugName: "listClasses" }] : /* istanbul ignore next */ []));
|
|
283
|
+
groupHeaderClasses = computed(() => this.variantResult().groupHeader(), /* @ts-ignore */
|
|
284
|
+
...(ngDevMode ? [{ debugName: "groupHeaderClasses" }] : /* istanbul ignore next */ []));
|
|
285
|
+
itemBodyClasses = computed(() => this.variantResult().itemBody(), /* @ts-ignore */
|
|
286
|
+
...(ngDevMode ? [{ debugName: "itemBodyClasses" }] : /* istanbul ignore next */ []));
|
|
287
|
+
itemLabelClasses = computed(() => this.variantResult().itemLabel(), /* @ts-ignore */
|
|
288
|
+
...(ngDevMode ? [{ debugName: "itemLabelClasses" }] : /* istanbul ignore next */ []));
|
|
289
|
+
itemDescriptionClasses = computed(() => this.variantResult().itemDescription(), /* @ts-ignore */
|
|
290
|
+
...(ngDevMode ? [{ debugName: "itemDescriptionClasses" }] : /* istanbul ignore next */ []));
|
|
291
|
+
itemShortcutClasses = computed(() => this.variantResult().itemShortcut(), /* @ts-ignore */
|
|
292
|
+
...(ngDevMode ? [{ debugName: "itemShortcutClasses" }] : /* istanbul ignore next */ []));
|
|
293
|
+
itemKbdClasses = computed(() => this.variantResult().itemKbd(), /* @ts-ignore */
|
|
294
|
+
...(ngDevMode ? [{ debugName: "itemKbdClasses" }] : /* istanbul ignore next */ []));
|
|
295
|
+
emptyClasses = computed(() => this.variantResult().empty(), /* @ts-ignore */
|
|
296
|
+
...(ngDevMode ? [{ debugName: "emptyClasses" }] : /* istanbul ignore next */ []));
|
|
297
|
+
footerClasses = computed(() => this.variantResult().footer(), /* @ts-ignore */
|
|
298
|
+
...(ngDevMode ? [{ debugName: "footerClasses" }] : /* istanbul ignore next */ []));
|
|
273
299
|
itemClasses(active, disabled) {
|
|
274
300
|
return commandPaletteVariants({
|
|
275
301
|
size: this.palette.size(),
|
|
@@ -291,46 +317,59 @@ class CommandPaletteOverlayComponent {
|
|
|
291
317
|
focusSearch() {
|
|
292
318
|
this.searchInputRef()?.nativeElement.focus();
|
|
293
319
|
}
|
|
294
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
295
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
320
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
321
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: CommandPaletteOverlayComponent, isStandalone: true, selector: "tw-command-palette-overlay", host: { properties: { "attr.data-command-palette-overlay": "\"\"", "animate.enter": "\"scale-in\"", "animate.leave": "\"scale-out\"" }, classAttribute: "fixed inset-0 flex items-start justify-center p-4 pointer-events-none origin-top" }, viewQueries: [{ propertyName: "searchInputRef", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"panelClasses()\" role=\"dialog\" [attr.aria-modal]=\"'true'\" [attr.aria-label]=\"palette.ariaLabel()\">\n <div [class]=\"searchWrapperClasses()\">\n <svg [class]=\"searchIconClasses()\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\" clip-rule=\"evenodd\" />\n </svg>\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n [class]=\"searchInputClasses()\"\n [placeholder]=\"palette.placeholder()\"\n [value]=\"palette.query()\"\n (input)=\"onSearchInput($event)\"\n [attr.aria-label]=\"palette.searchAriaLabel()\"\n [attr.aria-expanded]=\"'true'\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"palette.activeItemId()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n <div [class]=\"listClasses()\" role=\"listbox\" [id]=\"listId\">\n @if (palette.grouped().length === 0) {\n @if (palette.emptyTemplate(); as emptyTpl) {\n <div [class]=\"emptyClasses()\">\n <ng-container [ngTemplateOutlet]=\"emptyTpl\" [ngTemplateOutletContext]=\"{ $implicit: palette.query() }\" />\n </div>\n } @else {\n <div [class]=\"emptyClasses()\">No results found</div>\n }\n } @else {\n @for (group of palette.grouped(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label ?? null\">\n @if (group.label) {\n <div [class]=\"groupHeaderClasses()\" role=\"presentation\">{{ group.label }}</div>\n }\n @for (item of group.items; track item.data.id) {\n <!-- ARIA activedescendant listbox: navigation lives on the search\n input above; option elements never receive DOM focus and have\n no keyboard handlers of their own. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [id]=\"item.data.id\"\n role=\"option\"\n [class]=\"itemClasses(item.data.id === palette.activeItemId(), item.data.disabled ?? false)\"\n [attr.aria-selected]=\"item.data.id === palette.activeItemId()\"\n [attr.aria-disabled]=\"(item.data.disabled ?? false) ? 'true' : null\"\n (click)=\"onItemClick(item)\"\n (mousemove)=\"onItemHover(item)\"\n >\n <span [class]=\"itemBodyClasses()\">\n @if (item.template; as tpl) {\n <span [class]=\"itemLabelClasses()\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </span>\n } @else {\n <span [class]=\"itemLabelClasses()\">{{ item.data.label }}</span>\n }\n @if (item.data.description) {\n <span [class]=\"itemDescriptionClasses()\">{{ item.data.description }}</span>\n }\n </span>\n @if (item.shortcutKeys.length > 0) {\n <span [class]=\"itemShortcutClasses()\" aria-hidden=\"true\">\n @for (key of item.shortcutKeys; track $index) {\n <kbd [class]=\"itemKbdClasses()\">{{ key }}</kbd>\n }\n </span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n @if (palette.footerTemplate(); as footerTpl) {\n <div [class]=\"footerClasses()\">\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
296
322
|
}
|
|
297
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
323
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteOverlayComponent, decorators: [{
|
|
298
324
|
type: Component,
|
|
299
325
|
args: [{ selector: 'tw-command-palette-overlay', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet], host: {
|
|
300
326
|
class: 'fixed inset-0 flex items-start justify-center p-4 pointer-events-none origin-top',
|
|
301
327
|
'[attr.data-command-palette-overlay]': '""',
|
|
302
328
|
'[animate.enter]': '"scale-in"',
|
|
303
329
|
'[animate.leave]': '"scale-out"',
|
|
304
|
-
}, template: "<div [class]=\"panelClasses()\" role=\"dialog\" [attr.aria-modal]=\"'true'\" [attr.aria-label]=\"palette.ariaLabel()\">\n <div [class]=\"searchWrapperClasses()\">\n <svg [class]=\"searchIconClasses()\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\" clip-rule=\"evenodd\" />\n </svg>\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n [class]=\"searchInputClasses()\"\n [placeholder]=\"palette.placeholder()\"\n [value]=\"palette.query()\"\n (input)=\"onSearchInput($event)\"\n [attr.aria-label]=\"palette.searchAriaLabel()\"\n [attr.aria-expanded]=\"'true'\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"palette.activeItemId()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n <div [class]=\"listClasses()\" role=\"listbox\" [id]=\"listId\">\n @if (palette.grouped().length === 0) {\n @if (palette.emptyTemplate(); as emptyTpl) {\n <div [class]=\"emptyClasses()\">\n <ng-container [ngTemplateOutlet]=\"emptyTpl\" [ngTemplateOutletContext]=\"{ $implicit: palette.query() }\" />\n </div>\n } @else {\n <div [class]=\"emptyClasses()\">No results found</div>\n }\n } @else {\n @for (group of palette.grouped(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label ?? null\">\n @if (group.label) {\n <div [class]=\"groupHeaderClasses()\" role=\"presentation\">{{ group.label }}</div>\n }\n @for (item of group.items; track item.data.id) {\n <div\n [id]=\"item.data.id\"\n role=\"option\"\n [class]=\"itemClasses(item.data.id === palette.activeItemId(), item.data.disabled ?? false)\"\n [attr.aria-selected]=\"item.data.id === palette.activeItemId()\"\n [attr.aria-disabled]=\"(item.data.disabled ?? false) ? 'true' : null\"\n (click)=\"onItemClick(item)\"\n (mousemove)=\"onItemHover(item)\"\n >\n <span [class]=\"itemBodyClasses()\">\n @if (item.template; as tpl) {\n <span [class]=\"itemLabelClasses()\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </span>\n } @else {\n <span [class]=\"itemLabelClasses()\">{{ item.data.label }}</span>\n }\n @if (item.data.description) {\n <span [class]=\"itemDescriptionClasses()\">{{ item.data.description }}</span>\n }\n </span>\n @if (item.shortcutKeys.length > 0) {\n <span [class]=\"itemShortcutClasses()\" aria-hidden=\"true\">\n @for (key of item.shortcutKeys; track $index) {\n <kbd [class]=\"itemKbdClasses()\">{{ key }}</kbd>\n }\n </span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n @if (palette.footerTemplate(); as footerTpl) {\n <div [class]=\"footerClasses()\">\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n </div>\n }\n</div>\n" }]
|
|
330
|
+
}, template: "<div [class]=\"panelClasses()\" role=\"dialog\" [attr.aria-modal]=\"'true'\" [attr.aria-label]=\"palette.ariaLabel()\">\n <div [class]=\"searchWrapperClasses()\">\n <svg [class]=\"searchIconClasses()\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\" clip-rule=\"evenodd\" />\n </svg>\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n [class]=\"searchInputClasses()\"\n [placeholder]=\"palette.placeholder()\"\n [value]=\"palette.query()\"\n (input)=\"onSearchInput($event)\"\n [attr.aria-label]=\"palette.searchAriaLabel()\"\n [attr.aria-expanded]=\"'true'\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"palette.activeItemId()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n <div [class]=\"listClasses()\" role=\"listbox\" [id]=\"listId\">\n @if (palette.grouped().length === 0) {\n @if (palette.emptyTemplate(); as emptyTpl) {\n <div [class]=\"emptyClasses()\">\n <ng-container [ngTemplateOutlet]=\"emptyTpl\" [ngTemplateOutletContext]=\"{ $implicit: palette.query() }\" />\n </div>\n } @else {\n <div [class]=\"emptyClasses()\">No results found</div>\n }\n } @else {\n @for (group of palette.grouped(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label ?? null\">\n @if (group.label) {\n <div [class]=\"groupHeaderClasses()\" role=\"presentation\">{{ group.label }}</div>\n }\n @for (item of group.items; track item.data.id) {\n <!-- ARIA activedescendant listbox: navigation lives on the search\n input above; option elements never receive DOM focus and have\n no keyboard handlers of their own. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [id]=\"item.data.id\"\n role=\"option\"\n [class]=\"itemClasses(item.data.id === palette.activeItemId(), item.data.disabled ?? false)\"\n [attr.aria-selected]=\"item.data.id === palette.activeItemId()\"\n [attr.aria-disabled]=\"(item.data.disabled ?? false) ? 'true' : null\"\n (click)=\"onItemClick(item)\"\n (mousemove)=\"onItemHover(item)\"\n >\n <span [class]=\"itemBodyClasses()\">\n @if (item.template; as tpl) {\n <span [class]=\"itemLabelClasses()\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </span>\n } @else {\n <span [class]=\"itemLabelClasses()\">{{ item.data.label }}</span>\n }\n @if (item.data.description) {\n <span [class]=\"itemDescriptionClasses()\">{{ item.data.description }}</span>\n }\n </span>\n @if (item.shortcutKeys.length > 0) {\n <span [class]=\"itemShortcutClasses()\" aria-hidden=\"true\">\n @for (key of item.shortcutKeys; track $index) {\n <kbd [class]=\"itemKbdClasses()\">{{ key }}</kbd>\n }\n </span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n @if (palette.footerTemplate(); as footerTpl) {\n <div [class]=\"footerClasses()\">\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n </div>\n }\n</div>\n" }]
|
|
305
331
|
}], propDecorators: { searchInputRef: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }] } });
|
|
306
332
|
// ── Public palette component ──
|
|
307
333
|
class CommandPaletteComponent {
|
|
308
334
|
/** Controls item density and padding across the palette. Defaults to `'md'`. */
|
|
309
|
-
size = input('md',
|
|
335
|
+
size = input('md', /* @ts-ignore */
|
|
336
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
310
337
|
/** Placeholder text shown inside the search input. Defaults to `'Type a command or search…'`. */
|
|
311
|
-
placeholder = input('Type a command or search…',
|
|
338
|
+
placeholder = input('Type a command or search…', /* @ts-ignore */
|
|
339
|
+
...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
312
340
|
/** Two-way bindable search query. Reads or resets the current filter. Defaults to `''`. */
|
|
313
|
-
query = model('',
|
|
341
|
+
query = model('', /* @ts-ignore */
|
|
342
|
+
...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
314
343
|
/** Two-way bindable open state. Setting to `true` opens the palette; closing updates it to `false`. Defaults to `false`. */
|
|
315
|
-
open = model(false,
|
|
344
|
+
open = model(false, /* @ts-ignore */
|
|
345
|
+
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
316
346
|
/** Data-driven command list. Merged with projected items and filtered by `query`. Defaults to `[]`. */
|
|
317
|
-
commands = input([],
|
|
347
|
+
commands = input([], /* @ts-ignore */
|
|
348
|
+
...(ngDevMode ? [{ debugName: "commands" }] : /* istanbul ignore next */ []));
|
|
318
349
|
/** Custom filter function. Receives the merged item list and current query, returns the filtered result. Defaults to `undefined` (case-insensitive substring match). */
|
|
319
|
-
filterFn = input(undefined,
|
|
350
|
+
filterFn = input(undefined, /* @ts-ignore */
|
|
351
|
+
...(ngDevMode ? [{ debugName: "filterFn" }] : /* istanbul ignore next */ []));
|
|
320
352
|
/** Whether the palette closes automatically after an item is activated. Defaults to `true` — a command palette is a fire-and-dismiss surface; the special case is a "run many" launcher that opts out. */
|
|
321
|
-
closeOnSelect = input(true,
|
|
353
|
+
closeOnSelect = input(true, /* @ts-ignore */
|
|
354
|
+
...(ngDevMode ? [{ debugName: "closeOnSelect" }] : /* istanbul ignore next */ []));
|
|
322
355
|
/** Whether Escape closes the palette. Defaults to `true` — Escape is the universal dismiss key for modal surfaces; the special case is a non-dismissible palette. */
|
|
323
|
-
closeOnEscape = input(true,
|
|
356
|
+
closeOnEscape = input(true, /* @ts-ignore */
|
|
357
|
+
...(ngDevMode ? [{ debugName: "closeOnEscape" }] : /* istanbul ignore next */ []));
|
|
324
358
|
/** Whether clicking the backdrop closes the palette. Defaults to `true` — clicking outside a modal is the expected dismiss gesture; the special case is enforcing an explicit choice. */
|
|
325
|
-
closeOnBackdropClick = input(true,
|
|
359
|
+
closeOnBackdropClick = input(true, /* @ts-ignore */
|
|
360
|
+
...(ngDevMode ? [{ debugName: "closeOnBackdropClick" }] : /* istanbul ignore next */ []));
|
|
326
361
|
/** Whether the search input is auto-focused when the palette opens. Defaults to `true` — without auto-focus the user must click into the input before typing, defeating the keyboard-first design. */
|
|
327
|
-
autoFocus = input(true,
|
|
362
|
+
autoFocus = input(true, /* @ts-ignore */
|
|
363
|
+
...(ngDevMode ? [{ debugName: "autoFocus" }] : /* istanbul ignore next */ []));
|
|
328
364
|
/** Accessible label used for the dialog role. Defaults to `'Command palette'`. */
|
|
329
|
-
ariaLabel = input('Command palette',
|
|
365
|
+
ariaLabel = input('Command palette', /* @ts-ignore */
|
|
366
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
330
367
|
/** Accessible label applied to the search input (`role="combobox"`). Defaults to `'Search commands'`. */
|
|
331
|
-
searchAriaLabel = input('Search commands',
|
|
368
|
+
searchAriaLabel = input('Search commands', /* @ts-ignore */
|
|
369
|
+
...(ngDevMode ? [{ debugName: "searchAriaLabel" }] : /* istanbul ignore next */ []));
|
|
332
370
|
/** Additional classes appended to the overlay panel for consumer customization. Defaults to `''`. */
|
|
333
|
-
panelClass = input('',
|
|
371
|
+
panelClass = input('', /* @ts-ignore */
|
|
372
|
+
...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
334
373
|
/** Fires when a command is activated (via click or Enter). Payload is the resolved `CommandPaletteItem`. */
|
|
335
374
|
itemSelected = output();
|
|
336
375
|
/** Fires after the palette becomes fully visible. */
|
|
@@ -344,8 +383,10 @@ class CommandPaletteComponent {
|
|
|
344
383
|
focusTrapFactory = inject(FocusTrapFactory);
|
|
345
384
|
announcer = inject(LiveAnnouncer);
|
|
346
385
|
declarativeItems = contentChildren(CommandPaletteItemDirective, { ...(ngDevMode ? { debugName: "declarativeItems" } : /* istanbul ignore next */ {}), descendants: true });
|
|
347
|
-
emptyDirective = contentChild(CommandPaletteEmptyDirective,
|
|
348
|
-
|
|
386
|
+
emptyDirective = contentChild(CommandPaletteEmptyDirective, /* @ts-ignore */
|
|
387
|
+
...(ngDevMode ? [{ debugName: "emptyDirective" }] : /* istanbul ignore next */ []));
|
|
388
|
+
footerDirective = contentChild(CommandPaletteFooterDirective, /* @ts-ignore */
|
|
389
|
+
...(ngDevMode ? [{ debugName: "footerDirective" }] : /* istanbul ignore next */ []));
|
|
349
390
|
overlayRef = null;
|
|
350
391
|
overlayInstance = null;
|
|
351
392
|
focusTrap = null;
|
|
@@ -354,7 +395,8 @@ class CommandPaletteComponent {
|
|
|
354
395
|
closing = false;
|
|
355
396
|
closeTimer = null;
|
|
356
397
|
announceTimer = null;
|
|
357
|
-
isAttached = signal(false,
|
|
398
|
+
isAttached = signal(false, /* @ts-ignore */
|
|
399
|
+
...(ngDevMode ? [{ debugName: "isAttached" }] : /* istanbul ignore next */ []));
|
|
358
400
|
/** Merged (declarative + data-array) items keyed by id — declarative wins on collision. */
|
|
359
401
|
allItems = computed(() => {
|
|
360
402
|
const declarative = this.declarativeItems();
|
|
@@ -377,7 +419,8 @@ class CommandPaletteComponent {
|
|
|
377
419
|
});
|
|
378
420
|
}
|
|
379
421
|
return [...declarativeResolved, ...arrayResolved];
|
|
380
|
-
},
|
|
422
|
+
}, /* @ts-ignore */
|
|
423
|
+
...(ngDevMode ? [{ debugName: "allItems" }] : /* istanbul ignore next */ []));
|
|
381
424
|
/** Items after applying the filter function. */
|
|
382
425
|
filteredItems = computed(() => {
|
|
383
426
|
const all = this.allItems();
|
|
@@ -395,7 +438,8 @@ class CommandPaletteComponent {
|
|
|
395
438
|
result.push(resolved);
|
|
396
439
|
}
|
|
397
440
|
return result;
|
|
398
|
-
},
|
|
441
|
+
}, /* @ts-ignore */
|
|
442
|
+
...(ngDevMode ? [{ debugName: "filteredItems" }] : /* istanbul ignore next */ []));
|
|
399
443
|
/** Filtered items grouped by their `group` field. */
|
|
400
444
|
grouped = computed(() => {
|
|
401
445
|
const items = this.filteredItems();
|
|
@@ -413,7 +457,8 @@ class CommandPaletteComponent {
|
|
|
413
457
|
g.items.push(item);
|
|
414
458
|
}
|
|
415
459
|
return groups;
|
|
416
|
-
},
|
|
460
|
+
}, /* @ts-ignore */
|
|
461
|
+
...(ngDevMode ? [{ debugName: "grouped" }] : /* istanbul ignore next */ []));
|
|
417
462
|
/**
|
|
418
463
|
* Active item index, auto-resets to the first enabled item when the filtered
|
|
419
464
|
* *id set* changes. Keyed off the id sequence (not the array reference) so a
|
|
@@ -440,20 +485,31 @@ class CommandPaletteComponent {
|
|
|
440
485
|
const idx = this.activeIndex();
|
|
441
486
|
const items = this.filteredItems();
|
|
442
487
|
return items[idx]?.data.id ?? null;
|
|
443
|
-
},
|
|
488
|
+
}, /* @ts-ignore */
|
|
489
|
+
...(ngDevMode ? [{ debugName: "activeItemId" }] : /* istanbul ignore next */ []));
|
|
444
490
|
/** Template-ref of the projected empty state (if any). */
|
|
445
|
-
emptyTemplate = computed(() => this.emptyDirective()?.template ?? null,
|
|
491
|
+
emptyTemplate = computed(() => this.emptyDirective()?.template ?? null, /* @ts-ignore */
|
|
492
|
+
...(ngDevMode ? [{ debugName: "emptyTemplate" }] : /* istanbul ignore next */ []));
|
|
446
493
|
/** Template-ref of the projected footer (if any). */
|
|
447
|
-
footerTemplate = computed(() => this.footerDirective()?.template ?? null,
|
|
494
|
+
footerTemplate = computed(() => this.footerDirective()?.template ?? null, /* @ts-ignore */
|
|
495
|
+
...(ngDevMode ? [{ debugName: "footerTemplate" }] : /* istanbul ignore next */ []));
|
|
448
496
|
/** Resolved panel-class string (array merged into a single string). */
|
|
449
497
|
panelClassResolved = computed(() => {
|
|
450
498
|
const raw = this.panelClass();
|
|
451
499
|
return Array.isArray(raw) ? raw.join(' ') : raw;
|
|
452
|
-
},
|
|
500
|
+
}, /* @ts-ignore */
|
|
501
|
+
...(ngDevMode ? [{ debugName: "panelClassResolved" }] : /* istanbul ignore next */ []));
|
|
453
502
|
constructor() {
|
|
454
503
|
// React to model changes from the consumer
|
|
455
504
|
effect(() => {
|
|
456
505
|
const shouldOpen = this.open();
|
|
506
|
+
if (shouldOpen && this.closing && this.overlayInstance) {
|
|
507
|
+
// Reopened before the leave animation finished — cancel the pending
|
|
508
|
+
// close rather than letting its deferred callback write `false` back
|
|
509
|
+
// over the consumer's `true`. Same shape as `popover.ts`.
|
|
510
|
+
this.cancelPendingClose();
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
457
513
|
if (shouldOpen && !this.overlayInstance && !this.closing) {
|
|
458
514
|
this.openPalette();
|
|
459
515
|
}
|
|
@@ -684,6 +740,17 @@ class CommandPaletteComponent {
|
|
|
684
740
|
this.overlayRef = null;
|
|
685
741
|
this.overlayInstance = null;
|
|
686
742
|
}
|
|
743
|
+
/**
|
|
744
|
+
* Aborts an in-flight close, leaving the palette open.
|
|
745
|
+
*
|
|
746
|
+
* The overlay is still attached (only the detach is deferred), so this
|
|
747
|
+
* restores the focus trap that `closePalette` tore down up front.
|
|
748
|
+
*/
|
|
749
|
+
cancelPendingClose() {
|
|
750
|
+
this.clearCloseTimer();
|
|
751
|
+
this.closing = false;
|
|
752
|
+
this.setupFocusTrap();
|
|
753
|
+
}
|
|
687
754
|
clearCloseTimer() {
|
|
688
755
|
if (this.closeTimer !== null) {
|
|
689
756
|
clearTimeout(this.closeTimer);
|
|
@@ -696,10 +763,10 @@ class CommandPaletteComponent {
|
|
|
696
763
|
this.announceTimer = null;
|
|
697
764
|
}
|
|
698
765
|
}
|
|
699
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
700
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "
|
|
766
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
767
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: CommandPaletteComponent, isStandalone: true, selector: "tw-command-palette", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, commands: { classPropertyName: "commands", publicName: "commands", isSignal: true, isRequired: false, transformFunction: null }, filterFn: { classPropertyName: "filterFn", publicName: "filterFn", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdropClick: { classPropertyName: "closeOnBackdropClick", publicName: "closeOnBackdropClick", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, searchAriaLabel: { classPropertyName: "searchAriaLabel", publicName: "searchAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { query: "queryChange", open: "openChange", itemSelected: "itemSelected", opened: "opened", closed: "closed" }, host: { styleAttribute: "display: none" }, queries: [{ propertyName: "declarativeItems", predicate: CommandPaletteItemDirective, descendants: true, isSignal: true }, { propertyName: "emptyDirective", first: true, predicate: CommandPaletteEmptyDirective, descendants: true, isSignal: true }, { propertyName: "footerDirective", first: true, predicate: CommandPaletteFooterDirective, descendants: true, isSignal: true }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
701
768
|
}
|
|
702
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
769
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: CommandPaletteComponent, decorators: [{
|
|
703
770
|
type: Component,
|
|
704
771
|
args: [{
|
|
705
772
|
selector: 'tw-command-palette',
|