@nanahoshi/mona-ui 0.4.0 → 0.5.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/collapsible/package.json +4 -0
- package/fesm2022/nanahoshi-mona-ui-button.mjs +1 -2
- package/fesm2022/nanahoshi-mona-ui-collapsible.mjs +304 -0
- package/fesm2022/nanahoshi-mona-ui-contextmenu.mjs +1 -1
- package/fesm2022/nanahoshi-mona-ui-dropdown-button.mjs +1 -1
- package/fesm2022/nanahoshi-mona-ui-expansion-panel.mjs +20 -9
- package/fesm2022/{nanahoshi-mona-ui-grid-grid-footer-cell.component-B6FBLtrr.mjs → nanahoshi-mona-ui-grid-grid-footer-cell.component-D-JCCvYJ.mjs} +2 -2
- package/fesm2022/{nanahoshi-mona-ui-grid-grid-footer-table-cell.directive-OJe4UYuw.mjs → nanahoshi-mona-ui-grid-grid-footer-table-cell.directive-7zwgl7u1.mjs} +2 -2
- package/fesm2022/{nanahoshi-mona-ui-grid-grid-list.component-DCd8K6ng.mjs → nanahoshi-mona-ui-grid-grid-list.component-n3eQNIza.mjs} +5 -5
- package/fesm2022/{nanahoshi-mona-ui-grid-grid-toggle.component-Dl8Hlkhj.mjs → nanahoshi-mona-ui-grid-grid-toggle.component-BhS7c7rW.mjs} +2 -2
- package/fesm2022/{nanahoshi-mona-ui-grid-grid-virtual-list.component-C5FRZlvv.mjs → nanahoshi-mona-ui-grid-grid-virtual-list.component-B4VB3xFw.mjs} +5 -5
- package/fesm2022/{nanahoshi-mona-ui-grid-nanahoshi-mona-ui-grid-BRZUd8cE.mjs → nanahoshi-mona-ui-grid-nanahoshi-mona-ui-grid-A6Cq2a4Q.mjs} +11 -11
- package/fesm2022/nanahoshi-mona-ui-grid.mjs +1 -1
- package/fesm2022/nanahoshi-mona-ui-menubar.mjs +1 -1
- package/fesm2022/nanahoshi-mona-ui-popup-menu.mjs +18 -16
- package/fesm2022/nanahoshi-mona-ui-sidebar.mjs +2025 -0
- package/fesm2022/nanahoshi-mona-ui-skeleton.mjs +96 -0
- package/fesm2022/nanahoshi-mona-ui-split-button.mjs +1 -1
- package/fesm2022/nanahoshi-mona-ui-theme.mjs +61 -25
- package/fesm2022/nanahoshi-mona-ui-tooltip.mjs +49 -2
- package/package.json +13 -1
- package/sidebar/package.json +4 -0
- package/skeleton/package.json +4 -0
- package/types/nanahoshi-mona-ui-collapsible.d.ts +92 -0
- package/types/nanahoshi-mona-ui-expansion-panel.d.ts +11 -3
- package/types/nanahoshi-mona-ui-popup-menu.d.ts +6 -4
- package/types/nanahoshi-mona-ui-sidebar.d.ts +695 -0
- package/types/nanahoshi-mona-ui-skeleton.d.ts +51 -0
- package/types/nanahoshi-mona-ui-theme.d.ts +28 -2
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { computed, input, Component } from '@angular/core';
|
|
3
|
+
import { classInputToClass } from '@nanahoshi/mona-ui/common';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
|
|
7
|
+
const skeletonBaseThemeVariants = cva(`
|
|
8
|
+
block shrink-0
|
|
9
|
+
bg-accent
|
|
10
|
+
motion-safe:animate-pulse
|
|
11
|
+
`, {
|
|
12
|
+
variants: {
|
|
13
|
+
rounded: {
|
|
14
|
+
small: "rounded-sm",
|
|
15
|
+
medium: "rounded-md",
|
|
16
|
+
large: "rounded-lg",
|
|
17
|
+
full: "rounded-full",
|
|
18
|
+
none: "rounded-none"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @description
|
|
25
|
+
* A placeholder block standing in for content that has not loaded yet. Size it with `width` and
|
|
26
|
+
* `height`, or with utility classes for anything more involved.
|
|
27
|
+
*
|
|
28
|
+
* It is decorative, so it is hidden from assistive technology. Mark the region it fills with
|
|
29
|
+
* `aria-busy` and describe what is loading there instead.
|
|
30
|
+
*/
|
|
31
|
+
class SkeletonComponent {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.baseClass = computed(() => {
|
|
34
|
+
const variantClass = skeletonBaseThemeVariants({ rounded: this.rounded() });
|
|
35
|
+
return twMerge(variantClass, this.userClass());
|
|
36
|
+
}, /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "baseClass" }] : /* istanbul ignore next */ []));
|
|
38
|
+
this.heightString = computed(() => this.toCssSize(this.height()), /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "heightString" }] : /* istanbul ignore next */ []));
|
|
40
|
+
this.widthString = computed(() => this.toCssSize(this.width()), /* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [{ debugName: "widthString" }] : /* istanbul ignore next */ []));
|
|
42
|
+
/**
|
|
43
|
+
* @description Height of the placeholder. Numbers are treated as pixels.
|
|
44
|
+
* @default "1rem"
|
|
45
|
+
*/
|
|
46
|
+
this.height = input("1rem", /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
|
|
48
|
+
/**
|
|
49
|
+
* @description Border-radius preset applied to the placeholder.
|
|
50
|
+
* @default "medium"
|
|
51
|
+
*/
|
|
52
|
+
this.rounded = input("medium", /* @ts-ignore */
|
|
53
|
+
...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
|
|
54
|
+
/**
|
|
55
|
+
* @description Additional CSS classes merged onto the host element via `tailwind-merge`.
|
|
56
|
+
* @default ""
|
|
57
|
+
*/
|
|
58
|
+
this.userClass = input("", { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: "class",
|
|
59
|
+
transform: value => classInputToClass(value) });
|
|
60
|
+
/**
|
|
61
|
+
* @description Width of the placeholder. Numbers are treated as pixels.
|
|
62
|
+
* @default "100%"
|
|
63
|
+
*/
|
|
64
|
+
this.width = input("100%", /* @ts-ignore */
|
|
65
|
+
...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
|
|
66
|
+
}
|
|
67
|
+
toCssSize(value) {
|
|
68
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
69
|
+
}
|
|
70
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
71
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.6", type: SkeletonComponent, isStandalone: true, selector: "mona-skeleton", inputs: { height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-hidden": "'true'", "class": "baseClass()", "style.height": "heightString()", "style.width": "widthString()" } }, ngImport: i0, template: ``, isInline: true }); }
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SkeletonComponent, decorators: [{
|
|
74
|
+
type: Component,
|
|
75
|
+
args: [{
|
|
76
|
+
selector: "mona-skeleton",
|
|
77
|
+
template: ``,
|
|
78
|
+
host: {
|
|
79
|
+
"[attr.aria-hidden]": "'true'",
|
|
80
|
+
"[class]": "baseClass()",
|
|
81
|
+
"[style.height]": "heightString()",
|
|
82
|
+
"[style.width]": "widthString()"
|
|
83
|
+
}
|
|
84
|
+
}]
|
|
85
|
+
}], propDecorators: { height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
|
|
86
|
+
|
|
87
|
+
/*
|
|
88
|
+
* Public API Surface of @nanahoshi/mona-ui/skeleton
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Generated bundle index. Do not edit.
|
|
93
|
+
*/
|
|
94
|
+
|
|
95
|
+
export { SkeletonComponent };
|
|
96
|
+
//# sourceMappingURL=nanahoshi-mona-ui-skeleton.mjs.map
|
|
@@ -371,7 +371,7 @@ class SplitButtonComponent {
|
|
|
371
371
|
});
|
|
372
372
|
}
|
|
373
373
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SplitButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
374
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: SplitButtonComponent, isStandalone: true, selector: "mona-split-button", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, menuButtonAriaLabel: { classPropertyName: "menuButtonAriaLabel", publicName: "menuButtonAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, popupWidth: { classPropertyName: "popupWidth", publicName: "popupWidth", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { buttonClick: "buttonClick", menuItemClick: "menuItemClick" }, host: { properties: { "class": "classes()" } }, queries: [{ propertyName: "menuItemComponents", predicate: PopupMenuToken, isSignal: true }, { propertyName: "groupTemplate", first: true, predicate: SplitButtonMenuGroupTemplateDirective, read: TemplateRef, isSignal: true }, { propertyName: "iconTemplate", first: true, predicate: SplitButtonMenuItemIconTemplateDirective, read: TemplateRef, isSignal: true }, { propertyName: "mainButtonTextTemplate", first: true, predicate: SplitButtonTextTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "menuButtonTemplate", first: true, predicate: SplitButtonMenuButtonTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "shortcutTemplate", first: true, predicate: SplitButtonMenuItemShortcutTemplateDirective, read: TemplateRef, isSignal: true }, { propertyName: "textTemplate", first: true, predicate: SplitButtonMenuItemTextTemplateDirective, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "menuButtonRef", first: true, predicate: ["menuButton"], descendants: true, isSignal: true }, { propertyName: "popupMenuRef", first: true, predicate: ["popupMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\n monaButton\n (click)=\"buttonClick.emit($event)\"\n [disabled]=\"disabled()\"\n [look]=\"look()\"\n [size]=\"size()\"\n [rounded]=\"rounded()\"\n class=\"rounded-tr-none rounded-br-none\"\n [attr.aria-label]=\"splitButtonAriaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [tabindex]=\"disabled() ? -1 : 0\"\n #mainButton>\n @if (mainButtonTextTemplate()) {\n <ng-container [ngTemplateOutlet]=\"mainButtonTextTemplate()\"></ng-container>\n } @else {\n <span>{{ text() }}</span>\n }\n</button>\n<button\n monaButton\n [disabled]=\"disabled()\"\n [iconOnly]=\"true\"\n [look]=\"look()\"\n [size]=\"size()\"\n [rounded]=\"rounded()\"\n class=\"rounded-tl-none rounded-bl-none border-l-0\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"menuOpen()\"\n [attr.aria-controls]=\"menuId\"\n [attr.aria-label]=\"menuButtonAriaLabel()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n #menuButton>\n @if (menuButtonTemplate()) {\n <ng-container [ngTemplateOutlet]=\"menuButtonTemplate()\"></ng-container>\n } @else {\n <svg lucideChevronDown [size]=\"16\"></svg>\n }\n</button>\n\n<mona-popup-menu\n [anchorConnectionPoint]=\"'bottomleft'\"\n [anchor]=\"mainButton\"\n [items]=\"menuItems()\"\n (menuClick)=\"onMenuItemClick($event)\"\n (open)=\"onMenuOpen()\"\n (close)=\"onMenuClose()\"\n [offset]=\"{ horizontal: 0, vertical: 2 }\"\n [popupConnectionPoint]=\"'topleft'\"\n [rounded]=\"popupMenuRounded()\"\n [size]=\"size()\"\n [target]=\"menuButton\"\n [trigger]=\"'click'\"\n [id]=\"menuId\"\n [minWidth]=\"popupWidth() || undefined\"\n #popupMenu>\n @if (groupTemplate()) {\n <ng-template monaPopupMenuGroupTemplate let-group>\n <ng-container\n [ngTemplateOutlet]=\"groupTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: group }\"></ng-container>\n </ng-template>\n }\n @if (iconTemplate()) {\n <ng-template monaPopupMenuIconTemplate let-item>\n <ng-container\n [ngTemplateOutlet]=\"iconTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </ng-template>\n }\n @if (shortcutTemplate()) {\n <ng-template monaPopupMenuShortcutTemplate let-item>\n <ng-container\n [ngTemplateOutlet]=\"shortcutTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </ng-template>\n }\n @if (textTemplate()) {\n <ng-template monaPopupMenuTextTemplate let-item>\n <ng-container\n [ngTemplateOutlet]=\"textTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </ng-template>\n }\n</mona-popup-menu>\n", dependencies: [{ kind: "directive", type: ButtonDirective, selector: "button[monaButton]", inputs: ["aria-haspopup", "disabled", "iconOnly", "loading", "look", "rounded", "selected", "size", "tabindex", "toggleable", "class"], outputs: ["disabledChange", "loadingChange", "lookChange", "selectedChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopupMenuComponent, selector: "mona-popup-menu", inputs: ["anchor", "anchorConnectionPoint", "items", "id", "minWidth", "offset", "popupConnectionPoint", "precise", "rounded", "size", "target", "trigger", "width"], outputs: ["close", "menuClick", "navigate", "open"] }, { kind: "directive", type: PopupMenuGroupTemplateDirective, selector: "ng-template[monaPopupMenuGroupTemplate]" }, { kind: "directive", type: PopupMenuIconTemplateDirective, selector: "ng-template[monaPopupMenuIconTemplate]" }, { kind: "directive", type: PopupMenuShortcutTemplateDirective, selector: "ng-template[monaPopupMenuShortcutTemplate]" }, { kind: "directive", type: PopupMenuTextTemplateDirective, selector: "ng-template[monaPopupMenuTextTemplate]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }] }); }
|
|
374
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: SplitButtonComponent, isStandalone: true, selector: "mona-split-button", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, menuButtonAriaLabel: { classPropertyName: "menuButtonAriaLabel", publicName: "menuButtonAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, popupWidth: { classPropertyName: "popupWidth", publicName: "popupWidth", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { buttonClick: "buttonClick", menuItemClick: "menuItemClick" }, host: { properties: { "class": "classes()" } }, queries: [{ propertyName: "menuItemComponents", predicate: PopupMenuToken, isSignal: true }, { propertyName: "groupTemplate", first: true, predicate: SplitButtonMenuGroupTemplateDirective, read: TemplateRef, isSignal: true }, { propertyName: "iconTemplate", first: true, predicate: SplitButtonMenuItemIconTemplateDirective, read: TemplateRef, isSignal: true }, { propertyName: "mainButtonTextTemplate", first: true, predicate: SplitButtonTextTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "menuButtonTemplate", first: true, predicate: SplitButtonMenuButtonTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "shortcutTemplate", first: true, predicate: SplitButtonMenuItemShortcutTemplateDirective, read: TemplateRef, isSignal: true }, { propertyName: "textTemplate", first: true, predicate: SplitButtonMenuItemTextTemplateDirective, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "menuButtonRef", first: true, predicate: ["menuButton"], descendants: true, isSignal: true }, { propertyName: "popupMenuRef", first: true, predicate: ["popupMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\n monaButton\n (click)=\"buttonClick.emit($event)\"\n [disabled]=\"disabled()\"\n [look]=\"look()\"\n [size]=\"size()\"\n [rounded]=\"rounded()\"\n class=\"rounded-tr-none rounded-br-none\"\n [attr.aria-label]=\"splitButtonAriaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [tabindex]=\"disabled() ? -1 : 0\"\n #mainButton>\n @if (mainButtonTextTemplate()) {\n <ng-container [ngTemplateOutlet]=\"mainButtonTextTemplate()\"></ng-container>\n } @else {\n <span>{{ text() }}</span>\n }\n</button>\n<button\n monaButton\n [disabled]=\"disabled()\"\n [iconOnly]=\"true\"\n [look]=\"look()\"\n [size]=\"size()\"\n [rounded]=\"rounded()\"\n class=\"rounded-tl-none rounded-bl-none border-l-0\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"menuOpen()\"\n [attr.aria-controls]=\"menuId\"\n [attr.aria-label]=\"menuButtonAriaLabel()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n #menuButton>\n @if (menuButtonTemplate()) {\n <ng-container [ngTemplateOutlet]=\"menuButtonTemplate()\"></ng-container>\n } @else {\n <svg lucideChevronDown [size]=\"16\"></svg>\n }\n</button>\n\n<mona-popup-menu\n [anchorConnectionPoint]=\"'bottomleft'\"\n [anchor]=\"mainButton\"\n [items]=\"menuItems()\"\n (menuClick)=\"onMenuItemClick($event)\"\n (open)=\"onMenuOpen()\"\n (close)=\"onMenuClose()\"\n [offset]=\"{ horizontal: 0, vertical: 2 }\"\n [popupConnectionPoint]=\"'topleft'\"\n [rounded]=\"popupMenuRounded()\"\n [size]=\"size()\"\n [target]=\"menuButton\"\n [trigger]=\"'click'\"\n [id]=\"menuId\"\n [minWidth]=\"popupWidth() || undefined\"\n #popupMenu>\n @if (groupTemplate()) {\n <ng-template monaPopupMenuGroupTemplate let-group>\n <ng-container\n [ngTemplateOutlet]=\"groupTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: group }\"></ng-container>\n </ng-template>\n }\n @if (iconTemplate()) {\n <ng-template monaPopupMenuIconTemplate let-item>\n <ng-container\n [ngTemplateOutlet]=\"iconTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </ng-template>\n }\n @if (shortcutTemplate()) {\n <ng-template monaPopupMenuShortcutTemplate let-item>\n <ng-container\n [ngTemplateOutlet]=\"shortcutTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </ng-template>\n }\n @if (textTemplate()) {\n <ng-template monaPopupMenuTextTemplate let-item>\n <ng-container\n [ngTemplateOutlet]=\"textTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </ng-template>\n }\n</mona-popup-menu>\n", dependencies: [{ kind: "directive", type: ButtonDirective, selector: "button[monaButton]", inputs: ["aria-haspopup", "disabled", "iconOnly", "loading", "look", "rounded", "selected", "size", "tabindex", "toggleable", "class"], outputs: ["disabledChange", "loadingChange", "lookChange", "selectedChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopupMenuComponent, selector: "mona-popup-menu", inputs: ["anchor", "anchorConnectionPoint", "items", "id", "minWidth", "offset", "popupConnectionPoint", "precise", "rounded", "size", "target", "trigger", "width", "class"], outputs: ["close", "menuClick", "navigate", "open"] }, { kind: "directive", type: PopupMenuGroupTemplateDirective, selector: "ng-template[monaPopupMenuGroupTemplate]" }, { kind: "directive", type: PopupMenuIconTemplateDirective, selector: "ng-template[monaPopupMenuIconTemplate]" }, { kind: "directive", type: PopupMenuShortcutTemplateDirective, selector: "ng-template[monaPopupMenuShortcutTemplate]" }, { kind: "directive", type: PopupMenuTextTemplateDirective, selector: "ng-template[monaPopupMenuTextTemplate]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }] }); }
|
|
375
375
|
}
|
|
376
376
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SplitButtonComponent, decorators: [{
|
|
377
377
|
type: Component,
|
|
@@ -195,6 +195,52 @@ function clamp(value, minimum, maximum) {
|
|
|
195
195
|
return Math.min(Math.max(value, minimum), maximum);
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
+
function createDefaultThemeEffects() {
|
|
199
|
+
return Object.freeze({
|
|
200
|
+
"--mona-effect-control-background-color": "var(--color-input-background)",
|
|
201
|
+
"--mona-effect-control-fallback-background-color": "var(--color-input-background)",
|
|
202
|
+
"--mona-effect-control-background-image": "none",
|
|
203
|
+
"--mona-effect-control-backdrop-filter": "none",
|
|
204
|
+
"--mona-effect-raised-background-color": "var(--color-surface-raised)",
|
|
205
|
+
"--mona-effect-raised-fallback-background-color": "var(--color-surface-raised)",
|
|
206
|
+
"--mona-effect-raised-background-image": "none",
|
|
207
|
+
"--mona-effect-raised-backdrop-filter": "none",
|
|
208
|
+
"--mona-effect-overlay-background-color": "var(--color-surface-overlay)",
|
|
209
|
+
"--mona-effect-overlay-fallback-background-color": "var(--color-surface-overlay)",
|
|
210
|
+
"--mona-effect-overlay-background-image": "none",
|
|
211
|
+
"--mona-effect-overlay-backdrop-filter": "none"
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function createDefaultThemeShape() {
|
|
215
|
+
return Object.freeze({
|
|
216
|
+
"--radius-sm": "0.25rem",
|
|
217
|
+
"--radius-md": "0.375rem",
|
|
218
|
+
"--radius-lg": "0.5rem"
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Builds the sidebar's own colour roles. The sidebar is a persistent chrome region rather than page
|
|
223
|
+
* content, so it is given a surface of its own instead of borrowing the page's — which is what lets a
|
|
224
|
+
* theme sit it slightly apart from the content beside it without every consumer restyling it.
|
|
225
|
+
*
|
|
226
|
+
* Only `background` has to be chosen per theme. Hover defaults to the neutral interaction roles, while
|
|
227
|
+
* the sidebar's primary pair follows the selected-state roles. This keeps ordinary navigation quiet,
|
|
228
|
+
* reserves identity colour for the current item, and makes runtime primary-palette changes flow through
|
|
229
|
+
* without rebuilding the sidebar recipe.
|
|
230
|
+
*/
|
|
231
|
+
function createSidebarColorRoles(seeds) {
|
|
232
|
+
return Object.freeze({
|
|
233
|
+
"--color-sidebar": seeds.background,
|
|
234
|
+
"--color-sidebar-foreground": seeds.foreground ?? "var(--color-foreground)",
|
|
235
|
+
"--color-sidebar-primary": seeds.primary ?? "var(--color-selected)",
|
|
236
|
+
"--color-sidebar-primary-foreground": seeds.primaryForeground ?? "var(--color-selected-foreground)",
|
|
237
|
+
"--color-sidebar-accent": seeds.accent ?? "var(--color-hover)",
|
|
238
|
+
"--color-sidebar-accent-foreground": seeds.accentForeground ?? "var(--color-foreground)",
|
|
239
|
+
"--color-sidebar-border": seeds.border ?? "var(--color-border)",
|
|
240
|
+
"--color-sidebar-ring": seeds.ring ?? "var(--color-focus-indicator)"
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
198
244
|
const generatedRoles$2 = generateThemeColorPalette({
|
|
199
245
|
primary: "#583573",
|
|
200
246
|
secondary: "#3A3B40",
|
|
@@ -271,6 +317,9 @@ const dark$5 = Object.freeze({
|
|
|
271
317
|
"--color-destructive-foreground": "var(--color-error-foreground)",
|
|
272
318
|
"--color-input": "var(--color-border-control)",
|
|
273
319
|
"--color-disabled": "var(--color-disabled-foreground)",
|
|
320
|
+
// Anna's canvas is already dark, so the sidebar recedes below it rather than lifting off it —
|
|
321
|
+
// the same relationship its scrollbar track and popovers use.
|
|
322
|
+
...createSidebarColorRoles({ background: "var(--color-surface-muted)" }),
|
|
274
323
|
"--color-chart-1": "#A174C2",
|
|
275
324
|
"--color-chart-2": "#6F4A8A",
|
|
276
325
|
"--color-chart-3": "#4DA3FF",
|
|
@@ -295,30 +344,6 @@ const dark$4 = Object.freeze({
|
|
|
295
344
|
});
|
|
296
345
|
const annaThemeShadows = Object.freeze({ dark: dark$4 });
|
|
297
346
|
|
|
298
|
-
function createDefaultThemeEffects() {
|
|
299
|
-
return Object.freeze({
|
|
300
|
-
"--mona-effect-control-background-color": "var(--color-input-background)",
|
|
301
|
-
"--mona-effect-control-fallback-background-color": "var(--color-input-background)",
|
|
302
|
-
"--mona-effect-control-background-image": "none",
|
|
303
|
-
"--mona-effect-control-backdrop-filter": "none",
|
|
304
|
-
"--mona-effect-raised-background-color": "var(--color-surface-raised)",
|
|
305
|
-
"--mona-effect-raised-fallback-background-color": "var(--color-surface-raised)",
|
|
306
|
-
"--mona-effect-raised-background-image": "none",
|
|
307
|
-
"--mona-effect-raised-backdrop-filter": "none",
|
|
308
|
-
"--mona-effect-overlay-background-color": "var(--color-surface-overlay)",
|
|
309
|
-
"--mona-effect-overlay-fallback-background-color": "var(--color-surface-overlay)",
|
|
310
|
-
"--mona-effect-overlay-background-image": "none",
|
|
311
|
-
"--mona-effect-overlay-backdrop-filter": "none"
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
function createDefaultThemeShape() {
|
|
315
|
-
return Object.freeze({
|
|
316
|
-
"--radius-sm": "0.25rem",
|
|
317
|
-
"--radius-md": "0.375rem",
|
|
318
|
-
"--radius-lg": "0.5rem"
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
|
|
322
347
|
const motion$1 = Object.freeze({
|
|
323
348
|
"--mona-motion-fast": "150ms",
|
|
324
349
|
"--mona-motion-standard": "150ms"
|
|
@@ -420,6 +445,9 @@ const light$3 = Object.freeze({
|
|
|
420
445
|
"--color-destructive-foreground": "var(--color-error-foreground)",
|
|
421
446
|
"--color-input": "var(--color-border-control)",
|
|
422
447
|
"--color-disabled": "var(--color-disabled-foreground)",
|
|
448
|
+
// Navigation is part of Luna's raised glass layer. Reduced-transparency mode replaces this with
|
|
449
|
+
// the exact opaque raised fallback during runtime profile resolution.
|
|
450
|
+
...createSidebarColorRoles({ background: "var(--mona-effect-raised-background-color)" }),
|
|
423
451
|
"--color-chart-1": "#3f6be2",
|
|
424
452
|
"--color-chart-2": "#667085",
|
|
425
453
|
"--color-chart-3": "#4f8a70",
|
|
@@ -495,6 +523,8 @@ const dark$3 = Object.freeze({
|
|
|
495
523
|
"--color-destructive-foreground": "var(--color-error-foreground)",
|
|
496
524
|
"--color-input": "var(--color-border-control)",
|
|
497
525
|
"--color-disabled": "var(--color-disabled-foreground)",
|
|
526
|
+
// Keep navigation on the same independent raised-glass material as the light profile.
|
|
527
|
+
...createSidebarColorRoles({ background: "var(--mona-effect-raised-background-color)" }),
|
|
498
528
|
"--color-chart-1": "#7f9bf0",
|
|
499
529
|
"--color-chart-2": "#9ba3b2",
|
|
500
530
|
"--color-chart-3": "#70aa8e",
|
|
@@ -733,6 +763,9 @@ const light$1 = Object.freeze({
|
|
|
733
763
|
"--color-destructive-foreground": "var(--color-error-foreground)",
|
|
734
764
|
"--color-input": "var(--color-border-control)",
|
|
735
765
|
"--color-disabled": "var(--color-disabled-foreground)",
|
|
766
|
+
// Mona's content sits on pure white, so the sidebar takes the canvas tone to read as chrome
|
|
767
|
+
// rather than as another card.
|
|
768
|
+
...createSidebarColorRoles({ background: "var(--color-canvas)" }),
|
|
736
769
|
"--color-chart-1": "oklch(20.5% 0.006 285.885)",
|
|
737
770
|
"--color-chart-2": "oklch(37.1% 0.008 285.805)",
|
|
738
771
|
"--color-chart-3": "oklch(55.2% 0.010 285.938)",
|
|
@@ -795,6 +828,9 @@ const dark$1 = Object.freeze({
|
|
|
795
828
|
"--color-destructive-foreground": "var(--color-error-foreground)",
|
|
796
829
|
"--color-input": "var(--color-border-control)",
|
|
797
830
|
"--color-disabled": "var(--color-disabled-foreground)",
|
|
831
|
+
// Dark mode inverts the relationship: the canvas is the darkest tone, so the sidebar lifts off it
|
|
832
|
+
// instead of sinking into it.
|
|
833
|
+
...createSidebarColorRoles({ background: "var(--color-surface-muted)" }),
|
|
798
834
|
"--color-chart-1": "oklch(92.2% 0.004 286.320)",
|
|
799
835
|
"--color-chart-2": "oklch(80.5% 0.008 286.067)",
|
|
800
836
|
"--color-chart-3": "oklch(70.5% 0.010 286.067)",
|
|
@@ -1162,5 +1198,5 @@ function provideThemeColorPalette(registration) {
|
|
|
1162
1198
|
* Generated bundle index. Do not edit.
|
|
1163
1199
|
*/
|
|
1164
1200
|
|
|
1165
|
-
export { THEME_STRATEGY, ThemeService, flattenThemeProfile, generateThemeColorPalette, provideThemeColorPalette, provideThemeFamily, provideThemeOptions, provideThemeOverrides };
|
|
1201
|
+
export { THEME_STRATEGY, ThemeService, createSidebarColorRoles, flattenThemeProfile, generateThemeColorPalette, provideThemeColorPalette, provideThemeFamily, provideThemeOptions, provideThemeOverrides };
|
|
1166
1202
|
//# sourceMappingURL=nanahoshi-mona-ui-theme.mjs.map
|
|
@@ -356,6 +356,7 @@ class TooltipDirective {
|
|
|
356
356
|
#injector;
|
|
357
357
|
#popupService;
|
|
358
358
|
#renderer;
|
|
359
|
+
#selfTitleWrites;
|
|
359
360
|
#currentAnchor;
|
|
360
361
|
#hideTimeoutId;
|
|
361
362
|
#mutationObserver;
|
|
@@ -369,6 +370,7 @@ class TooltipDirective {
|
|
|
369
370
|
this.#injector = inject(EnvironmentInjector);
|
|
370
371
|
this.#popupService = inject(PopupService);
|
|
371
372
|
this.#renderer = inject(Renderer2);
|
|
373
|
+
this.#selfTitleWrites = new Map();
|
|
372
374
|
this.#currentAnchor = null;
|
|
373
375
|
this.#hideTimeoutId = null;
|
|
374
376
|
this.#mutationObserver = null;
|
|
@@ -441,8 +443,13 @@ class TooltipDirective {
|
|
|
441
443
|
this.#mutationObserver?.disconnect();
|
|
442
444
|
this.#mutationObserver = null;
|
|
443
445
|
if (this.mode() === "content") {
|
|
444
|
-
this.#mutationObserver = new MutationObserver(
|
|
445
|
-
this.#mutationObserver.observe(this.#host.nativeElement, {
|
|
446
|
+
this.#mutationObserver = new MutationObserver(records => this.#onMutations(records));
|
|
447
|
+
this.#mutationObserver.observe(this.#host.nativeElement, {
|
|
448
|
+
attributeFilter: ["title"],
|
|
449
|
+
attributes: true,
|
|
450
|
+
childList: true,
|
|
451
|
+
subtree: true
|
|
452
|
+
});
|
|
446
453
|
}
|
|
447
454
|
}
|
|
448
455
|
});
|
|
@@ -497,6 +504,7 @@ class TooltipDirective {
|
|
|
497
504
|
this.#currentAnchor = null;
|
|
498
505
|
}
|
|
499
506
|
this.#renderer.removeAttribute(anchor, "aria-describedby");
|
|
507
|
+
this.#markSelfTitleWrite(anchor);
|
|
500
508
|
this.#renderer.setAttribute(anchor, "title", text);
|
|
501
509
|
component.destroy();
|
|
502
510
|
this.hidden.emit();
|
|
@@ -542,6 +550,9 @@ class TooltipDirective {
|
|
|
542
550
|
}
|
|
543
551
|
this.#popupRef?.close();
|
|
544
552
|
const title = targetElement.getAttribute("title") || "";
|
|
553
|
+
if (title) {
|
|
554
|
+
this.#markSelfTitleWrite(targetElement);
|
|
555
|
+
}
|
|
545
556
|
this.#renderer.removeAttribute(targetElement, "title");
|
|
546
557
|
if (this.mode() === "host") {
|
|
547
558
|
this.originalTitle.set(title);
|
|
@@ -561,6 +572,42 @@ class TooltipDirective {
|
|
|
561
572
|
}
|
|
562
573
|
}
|
|
563
574
|
}
|
|
575
|
+
/**
|
|
576
|
+
* The directive strips a `title` while its tooltip is open and restores it on close. Those writes
|
|
577
|
+
* reach the observer too, so each one is booked ahead of time and cancelled out here — otherwise
|
|
578
|
+
* showing a tooltip would tear down and rebuild the very subscriptions driving it.
|
|
579
|
+
*/
|
|
580
|
+
#isSelfTitleWrite(element) {
|
|
581
|
+
const pending = this.#selfTitleWrites.get(element) ?? 0;
|
|
582
|
+
if (pending <= 0) {
|
|
583
|
+
return false;
|
|
584
|
+
}
|
|
585
|
+
if (pending === 1) {
|
|
586
|
+
this.#selfTitleWrites.delete(element);
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
this.#selfTitleWrites.set(element, pending - 1);
|
|
590
|
+
}
|
|
591
|
+
return true;
|
|
592
|
+
}
|
|
593
|
+
#markSelfTitleWrite(element) {
|
|
594
|
+
this.#selfTitleWrites.set(element, (this.#selfTitleWrites.get(element) ?? 0) + 1);
|
|
595
|
+
}
|
|
596
|
+
#onMutations(records) {
|
|
597
|
+
// Mapped rather than short circuited, so every self inflicted record is still cancelled out.
|
|
598
|
+
const externalChanges = records.map(record => {
|
|
599
|
+
if (record.type !== "attributes") {
|
|
600
|
+
return true;
|
|
601
|
+
}
|
|
602
|
+
if (record.attributeName !== "title") {
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
return !this.#isSelfTitleWrite(record.target);
|
|
606
|
+
});
|
|
607
|
+
if (externalChanges.some(Boolean)) {
|
|
608
|
+
this.#refreshSubscription();
|
|
609
|
+
}
|
|
610
|
+
}
|
|
564
611
|
#refreshSubscription() {
|
|
565
612
|
if (this.#subscription) {
|
|
566
613
|
this.#subscription.unsubscribe();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nanahoshi/mona-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "A very light Angular UI framework",
|
|
5
5
|
"author": "Nanahoshi",
|
|
6
6
|
"repository": {
|
|
@@ -101,6 +101,10 @@
|
|
|
101
101
|
"types": "./types/nanahoshi-mona-ui-circular-progress-bar.d.ts",
|
|
102
102
|
"default": "./fesm2022/nanahoshi-mona-ui-circular-progress-bar.mjs"
|
|
103
103
|
},
|
|
104
|
+
"./collapsible": {
|
|
105
|
+
"types": "./types/nanahoshi-mona-ui-collapsible.d.ts",
|
|
106
|
+
"default": "./fesm2022/nanahoshi-mona-ui-collapsible.mjs"
|
|
107
|
+
},
|
|
104
108
|
"./color-gradient": {
|
|
105
109
|
"types": "./types/nanahoshi-mona-ui-color-gradient.d.ts",
|
|
106
110
|
"default": "./fesm2022/nanahoshi-mona-ui-color-gradient.mjs"
|
|
@@ -261,6 +265,14 @@
|
|
|
261
265
|
"types": "./types/nanahoshi-mona-ui-scroll-view.d.ts",
|
|
262
266
|
"default": "./fesm2022/nanahoshi-mona-ui-scroll-view.mjs"
|
|
263
267
|
},
|
|
268
|
+
"./sidebar": {
|
|
269
|
+
"types": "./types/nanahoshi-mona-ui-sidebar.d.ts",
|
|
270
|
+
"default": "./fesm2022/nanahoshi-mona-ui-sidebar.mjs"
|
|
271
|
+
},
|
|
272
|
+
"./skeleton": {
|
|
273
|
+
"types": "./types/nanahoshi-mona-ui-skeleton.d.ts",
|
|
274
|
+
"default": "./fesm2022/nanahoshi-mona-ui-skeleton.mjs"
|
|
275
|
+
},
|
|
264
276
|
"./slider": {
|
|
265
277
|
"types": "./types/nanahoshi-mona-ui-slider.d.ts",
|
|
266
278
|
"default": "./fesm2022/nanahoshi-mona-ui-slider.mjs"
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { Signal, InjectionToken } from '@angular/core';
|
|
3
|
+
import * as _nanahoshi_mona_ui_collapsible from '@nanahoshi/mona-ui/collapsible';
|
|
4
|
+
|
|
5
|
+
declare const CollapsibleToken: InjectionToken<CollapsibleConfig>;
|
|
6
|
+
/**
|
|
7
|
+
* The contract a collapsible root exposes to its trigger and content parts.
|
|
8
|
+
*/
|
|
9
|
+
interface CollapsibleConfig {
|
|
10
|
+
readonly animate: Signal<boolean>;
|
|
11
|
+
collapse(): void;
|
|
12
|
+
readonly contentId: string;
|
|
13
|
+
readonly disabled: Signal<boolean>;
|
|
14
|
+
expand(): void;
|
|
15
|
+
readonly expanded: Signal<boolean>;
|
|
16
|
+
toggle(): void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @description
|
|
21
|
+
* Headless disclosure root. Adds no markup of its own, so it can be applied to any element
|
|
22
|
+
* (`li`, `div`, `section`) and paired with `monaCollapsibleTrigger` and `monaCollapsibleContent`.
|
|
23
|
+
*/
|
|
24
|
+
declare class CollapsibleDirective implements CollapsibleConfig {
|
|
25
|
+
protected readonly state: _angular_core.Signal<"open" | "closed">;
|
|
26
|
+
/**
|
|
27
|
+
* @description Enables the height transition applied to the collapsible content.
|
|
28
|
+
* @default true
|
|
29
|
+
*/
|
|
30
|
+
readonly animate: _angular_core.InputSignal<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* @description Id assigned to the content element and referenced by the trigger through `aria-controls`.
|
|
33
|
+
*/
|
|
34
|
+
readonly contentId: string;
|
|
35
|
+
/**
|
|
36
|
+
* @description Suppresses toggling through the trigger. `expand()` and `collapse()` still apply.
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* @description Sets whether the content is expanded. Supports two-way binding.
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
readonly expanded: _angular_core.ModelSignal<boolean>;
|
|
45
|
+
collapse(): void;
|
|
46
|
+
expand(): void;
|
|
47
|
+
toggle(): void;
|
|
48
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleDirective, never>;
|
|
49
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CollapsibleDirective, "[monaCollapsible]", ["monaCollapsible"], { "animate": { "alias": "animate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, never, never, true, never>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @description
|
|
54
|
+
* Animates the height of the collapsible content between `0` and its measured size. Adds no wrapper
|
|
55
|
+
* element, so it can be applied directly to a `ul`, `div` or any other container with any number of children.
|
|
56
|
+
*
|
|
57
|
+
* The measured size is also published on the host as the `--mona-collapsible-content-height` custom
|
|
58
|
+
* property, so consumers can drive their own animation instead (pair it with `[animate]="false"` on the root).
|
|
59
|
+
*/
|
|
60
|
+
declare class CollapsibleContentDirective {
|
|
61
|
+
#private;
|
|
62
|
+
protected readonly collapsible: _nanahoshi_mona_ui_collapsible.CollapsibleConfig;
|
|
63
|
+
protected readonly inert: _angular_core.Signal<true | null>;
|
|
64
|
+
protected readonly state: _angular_core.Signal<"open" | "closed">;
|
|
65
|
+
constructor();
|
|
66
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleContentDirective, never>;
|
|
67
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CollapsibleContentDirective, "[monaCollapsibleContent]", never, {}, {}, never, never, true, never>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @description
|
|
72
|
+
* Toggles the closest `monaCollapsible`. Wires `aria-expanded` / `aria-controls` automatically and
|
|
73
|
+
* only adds `role`, `tabindex` and keyboard handling when the host element is not already interactive.
|
|
74
|
+
*/
|
|
75
|
+
declare class CollapsibleTriggerDirective {
|
|
76
|
+
#private;
|
|
77
|
+
protected readonly ariaDisabled: _angular_core.Signal<"true" | null>;
|
|
78
|
+
protected readonly collapsible: _nanahoshi_mona_ui_collapsible.CollapsibleConfig;
|
|
79
|
+
protected readonly nativeDisabled: _angular_core.Signal<"" | null>;
|
|
80
|
+
protected readonly role: string | null;
|
|
81
|
+
protected readonly state: _angular_core.Signal<"open" | "closed">;
|
|
82
|
+
protected readonly tabIndex: _angular_core.Signal<0 | -1 | null>;
|
|
83
|
+
protected readonly type: string | null;
|
|
84
|
+
protected onClick(): void;
|
|
85
|
+
protected onEnterKeydown(event: Event): void;
|
|
86
|
+
protected onSpaceKeydown(event: Event): void;
|
|
87
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleTriggerDirective, never>;
|
|
88
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CollapsibleTriggerDirective, "[monaCollapsibleTrigger]", never, {}, {}, never, never, true, never>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export { CollapsibleContentDirective, CollapsibleDirective, CollapsibleToken, CollapsibleTriggerDirective };
|
|
92
|
+
export type { CollapsibleConfig };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { TemplateRef } from '@angular/core';
|
|
3
|
+
import { CollapsibleConfig } from '@nanahoshi/mona-ui/collapsible';
|
|
3
4
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
5
|
import { VariantInputs } from '@nanahoshi/mona-ui/internal';
|
|
5
6
|
import { VariantProps } from 'class-variance-authority';
|
|
@@ -27,16 +28,21 @@ type ExpansionPanelIconContainerVariantProps = VariantProps<typeof expansionPane
|
|
|
27
28
|
type ExpansionPanelIconContainerVariantInput = VariantInputs<ExpansionPanelIconContainerVariantProps>;
|
|
28
29
|
type ExpansionPanelVariantInput = ExpansionPanelBaseVariantInput & Omit<ExpansionPanelHeaderVariantInput, "collapsed"> & ExpansionPanelContentVariantInput & Omit<ExpansionPanelIconContainerVariantInput, "hasTemplate">;
|
|
29
30
|
|
|
30
|
-
declare class ExpansionPanelComponent implements ExpansionPanelVariantInput {
|
|
31
|
+
declare class ExpansionPanelComponent implements ExpansionPanelVariantInput, CollapsibleConfig {
|
|
31
32
|
protected readonly actionsTemplateList: _angular_core.Signal<readonly TemplateRef<any>[]>;
|
|
32
33
|
protected readonly baseClass: _angular_core.Signal<string>;
|
|
33
34
|
protected readonly contentClass: _angular_core.Signal<string>;
|
|
34
|
-
protected readonly contentId: string;
|
|
35
35
|
protected readonly headerClass: _angular_core.Signal<string>;
|
|
36
36
|
protected readonly headerTitleClass: _angular_core.Signal<string>;
|
|
37
37
|
protected readonly iconContainerClass: _angular_core.Signal<string>;
|
|
38
38
|
protected readonly iconTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
|
|
39
39
|
protected readonly titleTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* @description Always enabled. Satisfies the `CollapsibleConfig` contract for `monaCollapsibleTrigger`;
|
|
42
|
+
* this component doesn't use `monaCollapsibleContent`, so no animation ever consults it.
|
|
43
|
+
*/
|
|
44
|
+
readonly animate: _angular_core.Signal<boolean>;
|
|
45
|
+
readonly contentId: string;
|
|
40
46
|
/**
|
|
41
47
|
* @description Disables header interaction, suppressing click and keyboard toggling.
|
|
42
48
|
* @default false
|
|
@@ -62,7 +68,9 @@ declare class ExpansionPanelComponent implements ExpansionPanelVariantInput {
|
|
|
62
68
|
* @default ""
|
|
63
69
|
*/
|
|
64
70
|
readonly userClass: _angular_core.InputSignal<string>;
|
|
65
|
-
|
|
71
|
+
collapse(): void;
|
|
72
|
+
expand(): void;
|
|
73
|
+
toggle(): void;
|
|
66
74
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ExpansionPanelComponent, never>;
|
|
67
75
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ExpansionPanelComponent, "mona-expansion-panel", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "userClass": { "alias": "userClass"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, ["actionsTemplateList", "iconTemplate", "titleTemplate"], ["*"], true, never>;
|
|
68
76
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { Signal, TemplateRef, ElementRef, InjectionToken, OnInit } from '@angular/core';
|
|
3
3
|
import * as _mirei_ts_collections from '@mirei/ts-collections';
|
|
4
|
+
import { PreventableEvent, ClassInputType } from '@nanahoshi/mona-ui/common';
|
|
4
5
|
import { PopupCloseEvent, PopupRef, ConnectionPoint, PopupOffset } from '@nanahoshi/mona-ui/popup';
|
|
5
|
-
import { PreventableEvent } from '@nanahoshi/mona-ui/common';
|
|
6
6
|
import { Subject } from 'rxjs';
|
|
7
7
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
8
8
|
import { VariantProps } from 'class-variance-authority';
|
|
@@ -165,6 +165,7 @@ declare class PopupMenuComponent implements PopupMenuVariantInput {
|
|
|
165
165
|
* This will be applied to the root menu and all submenus.
|
|
166
166
|
*/
|
|
167
167
|
readonly width: _angular_core.InputSignal<string | number | undefined>;
|
|
168
|
+
readonly userClass: _angular_core.InputSignalWithTransform<string | undefined, ClassInputType>;
|
|
168
169
|
constructor();
|
|
169
170
|
clearFocusRestoration(): void;
|
|
170
171
|
closeMenu(): void;
|
|
@@ -178,7 +179,7 @@ declare class PopupMenuComponent implements PopupMenuVariantInput {
|
|
|
178
179
|
private setSubscriptions;
|
|
179
180
|
private setTriggerSubscription;
|
|
180
181
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopupMenuComponent, never>;
|
|
181
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopupMenuComponent, "mona-popup-menu", never, { "anchor": { "alias": "anchor"; "required": false; "isSignal": true; }; "anchorConnectionPoint": { "alias": "anchorConnectionPoint"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "menuId": { "alias": "id"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "popupConnectionPoint": { "alias": "popupConnectionPoint"; "required": false; "isSignal": true; }; "precise": { "alias": "precise"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": true; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "close": "close"; "menuClick": "menuClick"; "navigate": "navigate"; "open": "open"; }, ["groupTemplateConfig", "iconTemplateConfig", "nestedComponents", "shortcutTemplateConfig", "textTemplateConfig"], never, true, never>;
|
|
182
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopupMenuComponent, "mona-popup-menu", never, { "anchor": { "alias": "anchor"; "required": false; "isSignal": true; }; "anchorConnectionPoint": { "alias": "anchorConnectionPoint"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "menuId": { "alias": "id"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "popupConnectionPoint": { "alias": "popupConnectionPoint"; "required": false; "isSignal": true; }; "precise": { "alias": "precise"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": true; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, { "close": "close"; "menuClick": "menuClick"; "navigate": "navigate"; "open": "open"; }, ["groupTemplateConfig", "iconTemplateConfig", "nestedComponents", "shortcutTemplateConfig", "textTemplateConfig"], never, true, never>;
|
|
182
183
|
}
|
|
183
184
|
|
|
184
185
|
declare const PopupMenuToken: InjectionToken<PopupMenuConfig>;
|
|
@@ -289,17 +290,18 @@ declare class PopupMenuItemComponent implements PopupMenuConfig, OnInit {
|
|
|
289
290
|
}
|
|
290
291
|
|
|
291
292
|
declare class PopupMenuGroupComponent implements PopupMenuConfig {
|
|
293
|
+
#private;
|
|
292
294
|
protected readonly groupTemplateConfig: _angular_core.Signal<_nanahoshi_mona_ui_popup_menu.PopupTemplateConfig | undefined>;
|
|
293
295
|
protected readonly items: _angular_core.Signal<readonly PopupMenuConfig[]>;
|
|
294
296
|
readonly origin: PopupMenuOrigin;
|
|
295
297
|
/**
|
|
296
298
|
* @description Sets the title of the menu group.
|
|
297
299
|
*/
|
|
298
|
-
readonly title: _angular_core.InputSignal<string>;
|
|
300
|
+
readonly title: _angular_core.InputSignal<string | undefined>;
|
|
299
301
|
readonly type = PopupMenuItemType.MenuGroup;
|
|
300
302
|
getPopupMenuItem(): PopupMenuItem[];
|
|
301
303
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopupMenuGroupComponent, never>;
|
|
302
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopupMenuGroupComponent, "mona-popup-menu-group", never, { "title": { "alias": "title"; "required":
|
|
304
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopupMenuGroupComponent, "mona-popup-menu-group", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; }, {}, ["groupTemplateConfig", "items"], never, true, never>;
|
|
303
305
|
}
|
|
304
306
|
|
|
305
307
|
declare class PopupMenuRadioGroupComponent implements PopupMenuConfig, OnInit {
|