@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.
Files changed (29) hide show
  1. package/collapsible/package.json +4 -0
  2. package/fesm2022/nanahoshi-mona-ui-button.mjs +1 -2
  3. package/fesm2022/nanahoshi-mona-ui-collapsible.mjs +304 -0
  4. package/fesm2022/nanahoshi-mona-ui-contextmenu.mjs +1 -1
  5. package/fesm2022/nanahoshi-mona-ui-dropdown-button.mjs +1 -1
  6. package/fesm2022/nanahoshi-mona-ui-expansion-panel.mjs +20 -9
  7. 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
  8. 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
  9. package/fesm2022/{nanahoshi-mona-ui-grid-grid-list.component-DCd8K6ng.mjs → nanahoshi-mona-ui-grid-grid-list.component-n3eQNIza.mjs} +5 -5
  10. package/fesm2022/{nanahoshi-mona-ui-grid-grid-toggle.component-Dl8Hlkhj.mjs → nanahoshi-mona-ui-grid-grid-toggle.component-BhS7c7rW.mjs} +2 -2
  11. package/fesm2022/{nanahoshi-mona-ui-grid-grid-virtual-list.component-C5FRZlvv.mjs → nanahoshi-mona-ui-grid-grid-virtual-list.component-B4VB3xFw.mjs} +5 -5
  12. package/fesm2022/{nanahoshi-mona-ui-grid-nanahoshi-mona-ui-grid-BRZUd8cE.mjs → nanahoshi-mona-ui-grid-nanahoshi-mona-ui-grid-A6Cq2a4Q.mjs} +11 -11
  13. package/fesm2022/nanahoshi-mona-ui-grid.mjs +1 -1
  14. package/fesm2022/nanahoshi-mona-ui-menubar.mjs +1 -1
  15. package/fesm2022/nanahoshi-mona-ui-popup-menu.mjs +18 -16
  16. package/fesm2022/nanahoshi-mona-ui-sidebar.mjs +2025 -0
  17. package/fesm2022/nanahoshi-mona-ui-skeleton.mjs +96 -0
  18. package/fesm2022/nanahoshi-mona-ui-split-button.mjs +1 -1
  19. package/fesm2022/nanahoshi-mona-ui-theme.mjs +61 -25
  20. package/fesm2022/nanahoshi-mona-ui-tooltip.mjs +49 -2
  21. package/package.json +13 -1
  22. package/sidebar/package.json +4 -0
  23. package/skeleton/package.json +4 -0
  24. package/types/nanahoshi-mona-ui-collapsible.d.ts +92 -0
  25. package/types/nanahoshi-mona-ui-expansion-panel.d.ts +11 -3
  26. package/types/nanahoshi-mona-ui-popup-menu.d.ts +6 -4
  27. package/types/nanahoshi-mona-ui-sidebar.d.ts +695 -0
  28. package/types/nanahoshi-mona-ui-skeleton.d.ts +51 -0
  29. 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(() => this.#refreshSubscription());
445
- this.#mutationObserver.observe(this.#host.nativeElement, { childList: true, subtree: true });
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.4.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,4 @@
1
+ {
2
+ "module": "../fesm2022/nanahoshi-mona-ui-sidebar.mjs",
3
+ "typings": "../types/nanahoshi-mona-ui-sidebar.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/nanahoshi-mona-ui-skeleton.mjs",
3
+ "typings": "../types/nanahoshi-mona-ui-skeleton.d.ts"
4
+ }
@@ -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
- protected toggle(): void;
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": true; "isSignal": true; }; }, {}, ["groupTemplateConfig", "items"], never, true, never>;
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 {