@memberjunction/ng-ui-components 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -9
- package/dist/lib/a11y/named-control.base.d.ts +91 -0
- package/dist/lib/a11y/named-control.base.d.ts.map +1 -0
- package/dist/lib/a11y/named-control.base.js +121 -0
- package/dist/lib/a11y/named-control.base.js.map +1 -0
- package/dist/lib/a11y/unnamed-control-guard.d.ts +52 -0
- package/dist/lib/a11y/unnamed-control-guard.d.ts.map +1 -0
- package/dist/lib/a11y/unnamed-control-guard.js +94 -0
- package/dist/lib/a11y/unnamed-control-guard.js.map +1 -0
- package/dist/lib/accordion/accordion.component.d.ts +16 -4
- package/dist/lib/accordion/accordion.component.d.ts.map +1 -1
- package/dist/lib/accordion/accordion.component.js +36 -12
- package/dist/lib/accordion/accordion.component.js.map +1 -1
- package/dist/lib/applied-filters/applied-filters.component.js.map +1 -1
- package/dist/lib/button/button.directive.d.ts +34 -6
- package/dist/lib/button/button.directive.d.ts.map +1 -1
- package/dist/lib/button/button.directive.js +85 -25
- package/dist/lib/button/button.directive.js.map +1 -1
- package/dist/lib/card-grid/card-grid.component.d.ts +3 -1
- package/dist/lib/card-grid/card-grid.component.d.ts.map +1 -1
- package/dist/lib/card-grid/card-grid.component.js +13 -9
- package/dist/lib/card-grid/card-grid.component.js.map +1 -1
- package/dist/lib/clickable/clickable.directive.d.ts +11 -3
- package/dist/lib/clickable/clickable.directive.d.ts.map +1 -1
- package/dist/lib/clickable/clickable.directive.js +25 -5
- package/dist/lib/clickable/clickable.directive.js.map +1 -1
- package/dist/lib/combobox/combobox.component.d.ts +44 -3
- package/dist/lib/combobox/combobox.component.d.ts.map +1 -1
- package/dist/lib/combobox/combobox.component.js +135 -51
- package/dist/lib/combobox/combobox.component.js.map +1 -1
- package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts +6 -0
- package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts.map +1 -1
- package/dist/lib/confirm-dialog/confirm-dialog.component.js +16 -4
- package/dist/lib/confirm-dialog/confirm-dialog.component.js.map +1 -1
- package/dist/lib/datepicker/datepicker.component.d.ts +25 -2
- package/dist/lib/datepicker/datepicker.component.d.ts.map +1 -1
- package/dist/lib/datepicker/datepicker.component.js +98 -42
- package/dist/lib/datepicker/datepicker.component.js.map +1 -1
- package/dist/lib/dialog/dialog.component.d.ts +4 -0
- package/dist/lib/dialog/dialog.component.d.ts.map +1 -1
- package/dist/lib/dialog/dialog.component.js +12 -4
- package/dist/lib/dialog/dialog.component.js.map +1 -1
- package/dist/lib/dialog/dialog.service.js.map +1 -1
- package/dist/lib/dropdown/dropdown.component.d.ts +19 -44
- package/dist/lib/dropdown/dropdown.component.d.ts.map +1 -1
- package/dist/lib/dropdown/dropdown.component.js +37 -76
- package/dist/lib/dropdown/dropdown.component.js.map +1 -1
- package/dist/lib/dropdown/dropdown.scss +0 -16
- package/dist/lib/filter-panel/filter-panel.component.d.ts +8 -0
- package/dist/lib/filter-panel/filter-panel.component.d.ts.map +1 -1
- package/dist/lib/filter-panel/filter-panel.component.js +25 -9
- package/dist/lib/filter-panel/filter-panel.component.js.map +1 -1
- package/dist/lib/numeric-input/numeric-input.component.d.ts +15 -1
- package/dist/lib/numeric-input/numeric-input.component.d.ts.map +1 -1
- package/dist/lib/numeric-input/numeric-input.component.js +36 -9
- package/dist/lib/numeric-input/numeric-input.component.js.map +1 -1
- package/dist/lib/page-search/page-search.component.d.ts +32 -3
- package/dist/lib/page-search/page-search.component.d.ts.map +1 -1
- package/dist/lib/page-search/page-search.component.js +68 -12
- package/dist/lib/page-search/page-search.component.js.map +1 -1
- package/dist/lib/switch/switch.component.d.ts +22 -1
- package/dist/lib/switch/switch.component.d.ts.map +1 -1
- package/dist/lib/switch/switch.component.js +50 -16
- package/dist/lib/switch/switch.component.js.map +1 -1
- package/dist/lib/tabs/tab-chrome-guard.d.ts +2 -0
- package/dist/lib/tabs/tab-chrome-guard.d.ts.map +1 -1
- package/dist/lib/tabs/tab-chrome-guard.js +5 -1
- package/dist/lib/tabs/tab-chrome-guard.js.map +1 -1
- package/dist/lib/window/window.component.d.ts +10 -0
- package/dist/lib/window/window.component.d.ts.map +1 -1
- package/dist/lib/window/window.component.js +27 -7
- package/dist/lib/window/window.component.js.map +1 -1
- package/dist/lib/workspace-tabs/workspace-tab-strip.component.d.ts +10 -0
- package/dist/lib/workspace-tabs/workspace-tab-strip.component.d.ts.map +1 -1
- package/dist/lib/workspace-tabs/workspace-tab-strip.component.js +27 -7
- package/dist/lib/workspace-tabs/workspace-tab-strip.component.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +2 -2
|
@@ -51,7 +51,7 @@ export class MJAccordionTitleDirective {
|
|
|
51
51
|
templateRef;
|
|
52
52
|
constructor(templateRef) {
|
|
53
53
|
this.templateRef = templateRef;
|
|
54
|
-
}
|
|
54
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
55
55
|
static ɵfac = function MJAccordionTitleDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJAccordionTitleDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
56
56
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJAccordionTitleDirective, selectors: [["", "mjAccordionTitle", ""]] });
|
|
57
57
|
}
|
|
@@ -84,7 +84,7 @@ export class MJAccordionActionsDirective {
|
|
|
84
84
|
templateRef;
|
|
85
85
|
constructor(templateRef) {
|
|
86
86
|
this.templateRef = templateRef;
|
|
87
|
-
}
|
|
87
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
88
88
|
static ɵfac = function MJAccordionActionsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJAccordionActionsDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
89
89
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJAccordionActionsDirective, selectors: [["", "mjAccordionActions", ""]] });
|
|
90
90
|
}
|
|
@@ -118,7 +118,7 @@ export class MJAccordionBodyDirective {
|
|
|
118
118
|
templateRef;
|
|
119
119
|
constructor(templateRef) {
|
|
120
120
|
this.templateRef = templateRef;
|
|
121
|
-
}
|
|
121
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
122
122
|
static ɵfac = function MJAccordionBodyDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJAccordionBodyDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
123
123
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJAccordionBodyDirective, selectors: [["", "mjAccordionBody", ""]] });
|
|
124
124
|
}
|
|
@@ -213,9 +213,33 @@ export class MJAccordionPanelComponent {
|
|
|
213
213
|
*/
|
|
214
214
|
Fill = false;
|
|
215
215
|
ExpandedChange = new EventEmitter();
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
216
|
+
TitleTemplate = null;
|
|
217
|
+
/** @deprecated Use {@link TitleTemplate}. */
|
|
218
|
+
get titleTemplate() {
|
|
219
|
+
return this.TitleTemplate;
|
|
220
|
+
}
|
|
221
|
+
/** @deprecated Use {@link TitleTemplate}. */
|
|
222
|
+
set titleTemplate(value) {
|
|
223
|
+
this.TitleTemplate = value;
|
|
224
|
+
}
|
|
225
|
+
ActionsTemplate = null;
|
|
226
|
+
/** @deprecated Use {@link ActionsTemplate}. */
|
|
227
|
+
get actionsTemplate() {
|
|
228
|
+
return this.ActionsTemplate;
|
|
229
|
+
}
|
|
230
|
+
/** @deprecated Use {@link ActionsTemplate}. */
|
|
231
|
+
set actionsTemplate(value) {
|
|
232
|
+
this.ActionsTemplate = value;
|
|
233
|
+
}
|
|
234
|
+
BodyTemplate = null;
|
|
235
|
+
/** @deprecated Use {@link BodyTemplate}. */
|
|
236
|
+
get bodyTemplate() {
|
|
237
|
+
return this.BodyTemplate;
|
|
238
|
+
}
|
|
239
|
+
/** @deprecated Use {@link BodyTemplate}. */
|
|
240
|
+
set bodyTemplate(value) {
|
|
241
|
+
this.BodyTemplate = value;
|
|
242
|
+
}
|
|
219
243
|
hostClass = true;
|
|
220
244
|
/** Host claims flex:1 of its parent ONLY while a Fill panel is expanded —
|
|
221
245
|
* so a collapsed Fill panel sits at natural (header) height like any other. */
|
|
@@ -240,9 +264,9 @@ export class MJAccordionPanelComponent {
|
|
|
240
264
|
i0.ɵɵcontentQuery(dirIndex, MJAccordionTitleDirective, 5)(dirIndex, MJAccordionActionsDirective, 5)(dirIndex, MJAccordionBodyDirective, 5);
|
|
241
265
|
} if (rf & 2) {
|
|
242
266
|
let _t;
|
|
243
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
244
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
245
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
267
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TitleTemplate = _t.first);
|
|
268
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ActionsTemplate = _t.first);
|
|
269
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.BodyTemplate = _t.first);
|
|
246
270
|
} }, hostVars: 4, hostBindings: function MJAccordionPanelComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
247
271
|
i0.ɵɵclassProp("mj-accordion-panel-host", ctx.hostClass)("mj-accordion-fill-active", ctx.fillActive);
|
|
248
272
|
} }, inputs: { Title: "Title", Expanded: "Expanded", Disabled: "Disabled", Variant: "Variant", TitleIconMuted: "TitleIconMuted", Size: "Size", Bare: "Bare", FlushBody: "FlushBody", Fill: "Fill" }, outputs: { ExpandedChange: "ExpandedChange" }, ngContentSelectors: _c0, decls: 14, vars: 26, consts: [[1, "mj-accordion-panel"], [1, "mj-accordion-header-row"], ["type", "button", 1, "mj-accordion-header", 3, "click", "id", "disabled"], [1, "mj-accordion-title"], [3, "ngTemplateOutlet"], [1, "mj-accordion-actions"], ["type", "button", "tabindex", "-1", "aria-hidden", "true", 1, "mj-accordion-chevron", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down", "mj-accordion-icon"], [1, "mj-accordion-body-outer"], [1, "mj-accordion-body-clip"], ["role", "region", 1, "mj-accordion-body", 3, "id"]], template: function MJAccordionPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -360,13 +384,13 @@ export class MJAccordionPanelComponent {
|
|
|
360
384
|
type: Input
|
|
361
385
|
}], ExpandedChange: [{
|
|
362
386
|
type: Output
|
|
363
|
-
}],
|
|
387
|
+
}], TitleTemplate: [{
|
|
364
388
|
type: ContentChild,
|
|
365
389
|
args: [MJAccordionTitleDirective]
|
|
366
|
-
}],
|
|
390
|
+
}], ActionsTemplate: [{
|
|
367
391
|
type: ContentChild,
|
|
368
392
|
args: [MJAccordionActionsDirective]
|
|
369
|
-
}],
|
|
393
|
+
}], BodyTemplate: [{
|
|
370
394
|
type: ContentChild,
|
|
371
395
|
args: [MJAccordionBodyDirective]
|
|
372
396
|
}], hostClass: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.component.js","sourceRoot":"","sources":["../../../src/lib/accordion/accordion.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, HostBinding, ContentChild, TemplateRef, Directive, NgModule } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/** Process-wide counter for generating unique, stable accordion element ids\n * (used to wire `aria-controls` / `aria-labelledby` between header and body). */\nlet nextAccordionUid = 0;\n\n/**\n * Directive to mark a template as the accordion panel title.\n * Supports rich HTML content (icons, badges, dynamic text).\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * <span class=\"badge\">3</span>\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionTitle]',\n standalone: true\n})\nexport class MJAccordionTitleDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n/**\n * Directive to mark a template as the accordion header **actions** — interactive\n * controls (edit / copy / run / checkbox, etc.) that sit in the header row but\n * are NOT the expand/collapse toggle. Rendered as a sibling of the toggle\n * `<button>`, so there's no button-in-button and the toggle stays a clean,\n * accessible control.\n *\n * @example\n * ```html\n * <mj-accordion-panel>\n * <ng-template mjAccordionTitle>Connection</ng-template>\n * <ng-template mjAccordionActions>\n * <button mjButton variant=\"icon\" (click)=\"edit()\"><i class=\"fa fa-pen\"></i></button>\n * </ng-template>\n * …body…\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionActions]',\n standalone: true\n})\nexport class MJAccordionActionsDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n/**\n * Directive to mark a template as the accordion **body** — the panel's collapsible\n * content. Use this INSTEAD of placing content directly in the panel when the body\n * may be expensive (code editors, grids, large lists) OR just to be future-proof:\n * the accordion instantiates the template **lazily on first expand** and then keeps\n * it alive, so nothing is created until the user opens the panel, while later\n * open/close still animates. Consumers never have to reason about content weight or\n * write `@if (expanded)` themselves.\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"open\" (ExpandedChange)=\"open = $event\">\n * <ng-template mjAccordionTitle>Configuration</ng-template>\n * <ng-template mjAccordionBody>\n * <mj-code-editor ...></mj-code-editor> <!-- not created until first opened -->\n * </ng-template>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionBody]',\n standalone: true\n})\nexport class MJAccordionBodyDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n\n/**\n * mj-accordion-panel — Collapsible panel. Replaces `<kendo-panelbar-item>` and `<kendo-expansionpanel>`.\n *\n * Supports two title modes:\n * - Simple string: `[Title]=\"'Details'\"` — plain text title\n * - Rich template: `<ng-template mjAccordionTitle>` — HTML with icons, badges, etc.\n *\n * @example\n * ```html\n * <!-- Simple string title -->\n * <mj-accordion-panel Title=\"Details\" [Expanded]=\"true\">\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n *\n * <!-- Rich HTML title -->\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Component({\n selector: 'mj-accordion-panel',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"mj-accordion-panel\" [class.mj-accordion-panel--expanded]=\"Expanded\" [class.mj-accordion-panel--disabled]=\"Disabled\"\n [class.mj-accordion-panel--muted-icon]=\"TitleIconMuted\"\n [class.mj-accordion-panel--sm]=\"Size === 'sm'\"\n [class.mj-accordion-panel--bare]=\"Bare\"\n [class.mj-accordion-panel--flush-body]=\"FlushBody\"\n [class.mj-accordion-panel--fill]=\"Fill\"\n [attr.data-variant]=\"Variant !== 'default' ? Variant : null\">\n <div class=\"mj-accordion-header-row\">\n <button class=\"mj-accordion-header\" type=\"button\"\n [id]=\"HeaderId\"\n [attr.aria-expanded]=\"Expanded\"\n [attr.aria-controls]=\"BodyId\"\n [disabled]=\"Disabled\"\n (click)=\"Toggle()\">\n <span class=\"mj-accordion-title\">\n @if (titleTemplate) {\n <ng-container [ngTemplateOutlet]=\"titleTemplate.templateRef\"></ng-container>\n } @else {\n {{ Title }}\n }\n </span>\n </button>\n @if (actionsTemplate) {\n <div class=\"mj-accordion-actions\">\n <ng-container [ngTemplateOutlet]=\"actionsTemplate.templateRef\"></ng-container>\n </div>\n }\n <!-- The chevron is ALWAYS the rightmost element of the header row (after any\n actions). It's a secondary, a11y-hidden toggle affordance — the primary\n disclosure control is the title button above (which owns aria-expanded). -->\n <button class=\"mj-accordion-chevron\" type=\"button\" tabindex=\"-1\" aria-hidden=\"true\"\n [disabled]=\"Disabled\" (click)=\"Toggle()\">\n <i class=\"fa-solid fa-chevron-down mj-accordion-icon\"></i>\n </button>\n </div>\n <div class=\"mj-accordion-body-outer\" [attr.inert]=\"Expanded ? null : ''\">\n <div class=\"mj-accordion-body-clip\">\n <div class=\"mj-accordion-body\" role=\"region\" [id]=\"BodyId\" [attr.aria-labelledby]=\"HeaderId\">\n <!-- Legacy: content placed directly in the panel (eager). -->\n <ng-content></ng-content>\n <!-- Preferred: [mjAccordionBody] template — instantiated lazily on first\n expand, then kept alive so later toggles still animate. -->\n @if (bodyTemplate && (Expanded || hasBeenExpanded)) {\n <ng-container [ngTemplateOutlet]=\"bodyTemplate.templateRef\"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class MJAccordionPanelComponent {\n @Input() Title = '';\n private _expanded = false;\n /** Latches true the first time the panel is expanded; never resets. Lets a\n * [mjAccordionBody] template instantiate lazily on first open and then stay\n * alive so subsequent open/close still animates. */\n private _everExpanded = false;\n @Input()\n set Expanded(value: boolean) {\n this._expanded = value;\n if (value) this._everExpanded = true;\n }\n get Expanded(): boolean { return this._expanded; }\n protected get hasBeenExpanded(): boolean { return this._everExpanded; }\n @Input() Disabled = false;\n /**\n * Emphasis variant for visual hierarchy:\n * - `primary` — bold, solid brand-colored header (use to make a panel stand out)\n * - `secondary` — subtle brand tint\n * - `default` — standard neutral header\n * All brand-token-driven, so dark-mode-safe and themeable.\n */\n @Input() Variant: 'default' | 'primary' | 'secondary' = 'default';\n /**\n * Render icons projected into the title slot in the muted color instead of the\n * header's primary text color. Lets consumers get the common \"quiet icon\" look\n * without writing CSS. Status/brand-colored icons can still be colored inline.\n */\n @Input() TitleIconMuted = false;\n /**\n * Density. `md` (default) is the standard size; `sm` tightens header padding and\n * font for dense contexts (sidebars, flyouts, nested panels).\n */\n @Input() Size: 'sm' | 'md' = 'md';\n /**\n * Bare chrome — drop the panel's own border and header background so the panel\n * sits cleanly inside a host that already provides chrome (e.g. an expandable\n * card). The toggle/title/chevron/body still work; only the box styling is removed.\n */\n @Input() Bare = false;\n /**\n * Remove the body's default padding, for bodies that manage their own spacing\n * (code editors, full-bleed grids, custom forms).\n */\n @Input() FlushBody = false;\n /**\n * Fill mode — for \"rail section that owns the leftover height\" cases (e.g. an\n * entity tree or grid that should consume all remaining vertical space and\n * scroll *internally*), rather than the default \"reveal stacked content\"\n * disclosure. When set AND expanded, the panel becomes a flex column that\n * fills its flex parent and its body becomes a `flex:1; min-height:0` region —\n * the projected content is expected to provide its own scroll child. While\n * collapsed, the panel behaves exactly like a normal panel (header only,\n * natural height) and does NOT claim the leftover space.\n *\n * Requires the panel's parent to be a flex column with `min-height:0`.\n * Note: the open/close height animation is skipped in fill mode (the body\n * fills rather than animating to content height).\n */\n @Input() Fill = false;\n @Output() ExpandedChange = new EventEmitter<boolean>();\n @ContentChild(MJAccordionTitleDirective) titleTemplate: MJAccordionTitleDirective | null = null;\n @ContentChild(MJAccordionActionsDirective) actionsTemplate: MJAccordionActionsDirective | null = null;\n @ContentChild(MJAccordionBodyDirective) bodyTemplate: MJAccordionBodyDirective | null = null;\n @HostBinding('class.mj-accordion-panel-host') readonly hostClass = true;\n /** Host claims flex:1 of its parent ONLY while a Fill panel is expanded —\n * so a collapsed Fill panel sits at natural (header) height like any other. */\n @HostBinding('class.mj-accordion-fill-active') get fillActive(): boolean {\n return this.Fill && this.Expanded;\n }\n\n /** Stable per-instance ids that programmatically associate the header\n * `<button>` with its body region (`aria-controls` ↔ `aria-labelledby`),\n * completing the WAI-ARIA accordion pattern so screen readers announce the\n * region with the header's name. */\n private readonly _uid = nextAccordionUid++;\n readonly HeaderId = `mj-accordion-header-${this._uid}`;\n readonly BodyId = `mj-accordion-body-${this._uid}`;\n\n Toggle(): void {\n if (this.Disabled) return;\n this.Expanded = !this.Expanded;\n this.ExpandedChange.emit(this.Expanded);\n }\n}\n\n/**\n * Convenience module bundling the accordion panel + all of its slot directives.\n * Import this ONE symbol instead of listing the component and each directive\n * separately:\n *\n * ```ts\n * import { MJAccordionModule } from '@memberjunction/ng-ui-components';\n * @NgModule({ imports: [MJAccordionModule, ...] }) // or @Component standalone imports\n * ```\n *\n * Why a module (not a bare `const [...]` array): Angular's AOT compiler can't\n * statically expand a value-array imported across a compiled-package boundary in\n * an `imports` array (NG1010), and `as const` makes it a readonly tuple the\n * `imports` type rejects (TS2322). An NgModule is always a valid `imports` entry\n * in both NgModule and standalone consumers. Adding a future accordion directive\n * here makes it available to every consumer automatically — no per-module churn.\n */\n@NgModule({\n imports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n exports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n})\nexport class MJAccordionModule {}\n"]}
|
|
1
|
+
{"version":3,"file":"accordion.component.js","sourceRoot":"","sources":["../../../src/lib/accordion/accordion.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, HostBinding, ContentChild, TemplateRef, Directive, NgModule } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/** Process-wide counter for generating unique, stable accordion element ids\n * (used to wire `aria-controls` / `aria-labelledby` between header and body). */\nlet nextAccordionUid = 0;\n\n/**\n * Directive to mark a template as the accordion panel title.\n * Supports rich HTML content (icons, badges, dynamic text).\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * <span class=\"badge\">3</span>\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionTitle]',\n standalone: true\n})\nexport class MJAccordionTitleDirective {\n constructor(public templateRef: TemplateRef<unknown>) {} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n}\n\n/**\n * Directive to mark a template as the accordion header **actions** — interactive\n * controls (edit / copy / run / checkbox, etc.) that sit in the header row but\n * are NOT the expand/collapse toggle. Rendered as a sibling of the toggle\n * `<button>`, so there's no button-in-button and the toggle stays a clean,\n * accessible control.\n *\n * @example\n * ```html\n * <mj-accordion-panel>\n * <ng-template mjAccordionTitle>Connection</ng-template>\n * <ng-template mjAccordionActions>\n * <button mjButton variant=\"icon\" (click)=\"edit()\"><i class=\"fa fa-pen\"></i></button>\n * </ng-template>\n * …body…\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionActions]',\n standalone: true\n})\nexport class MJAccordionActionsDirective {\n constructor(public templateRef: TemplateRef<unknown>) {} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n}\n\n/**\n * Directive to mark a template as the accordion **body** — the panel's collapsible\n * content. Use this INSTEAD of placing content directly in the panel when the body\n * may be expensive (code editors, grids, large lists) OR just to be future-proof:\n * the accordion instantiates the template **lazily on first expand** and then keeps\n * it alive, so nothing is created until the user opens the panel, while later\n * open/close still animates. Consumers never have to reason about content weight or\n * write `@if (expanded)` themselves.\n *\n * @example\n * ```html\n * <mj-accordion-panel [Expanded]=\"open\" (ExpandedChange)=\"open = $event\">\n * <ng-template mjAccordionTitle>Configuration</ng-template>\n * <ng-template mjAccordionBody>\n * <mj-code-editor ...></mj-code-editor> <!-- not created until first opened -->\n * </ng-template>\n * </mj-accordion-panel>\n * ```\n */\n@Directive({\n selector: '[mjAccordionBody]',\n standalone: true\n})\nexport class MJAccordionBodyDirective {\n constructor(public templateRef: TemplateRef<unknown>) {} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\n}\n\n/**\n * mj-accordion-panel — Collapsible panel. Replaces `<kendo-panelbar-item>` and `<kendo-expansionpanel>`.\n *\n * Supports two title modes:\n * - Simple string: `[Title]=\"'Details'\"` — plain text title\n * - Rich template: `<ng-template mjAccordionTitle>` — HTML with icons, badges, etc.\n *\n * @example\n * ```html\n * <!-- Simple string title -->\n * <mj-accordion-panel Title=\"Details\" [Expanded]=\"true\">\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n *\n * <!-- Rich HTML title -->\n * <mj-accordion-panel [Expanded]=\"true\">\n * <ng-template mjAccordionTitle>\n * <i class=\"fa-solid fa-code\"></i> Template Editor\n * </ng-template>\n * <p>Panel content here</p>\n * </mj-accordion-panel>\n * ```\n */\n@Component({\n selector: 'mj-accordion-panel',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"mj-accordion-panel\" [class.mj-accordion-panel--expanded]=\"Expanded\" [class.mj-accordion-panel--disabled]=\"Disabled\"\n [class.mj-accordion-panel--muted-icon]=\"TitleIconMuted\"\n [class.mj-accordion-panel--sm]=\"Size === 'sm'\"\n [class.mj-accordion-panel--bare]=\"Bare\"\n [class.mj-accordion-panel--flush-body]=\"FlushBody\"\n [class.mj-accordion-panel--fill]=\"Fill\"\n [attr.data-variant]=\"Variant !== 'default' ? Variant : null\">\n <div class=\"mj-accordion-header-row\">\n <button class=\"mj-accordion-header\" type=\"button\"\n [id]=\"HeaderId\"\n [attr.aria-expanded]=\"Expanded\"\n [attr.aria-controls]=\"BodyId\"\n [disabled]=\"Disabled\"\n (click)=\"Toggle()\">\n <span class=\"mj-accordion-title\">\n @if (titleTemplate) {\n <ng-container [ngTemplateOutlet]=\"titleTemplate.templateRef\"></ng-container>\n } @else {\n {{ Title }}\n }\n </span>\n </button>\n @if (actionsTemplate) {\n <div class=\"mj-accordion-actions\">\n <ng-container [ngTemplateOutlet]=\"actionsTemplate.templateRef\"></ng-container>\n </div>\n }\n <!-- The chevron is ALWAYS the rightmost element of the header row (after any\n actions). It's a secondary, a11y-hidden toggle affordance — the primary\n disclosure control is the title button above (which owns aria-expanded). -->\n <button class=\"mj-accordion-chevron\" type=\"button\" tabindex=\"-1\" aria-hidden=\"true\"\n [disabled]=\"Disabled\" (click)=\"Toggle()\">\n <i class=\"fa-solid fa-chevron-down mj-accordion-icon\"></i>\n </button>\n </div>\n <div class=\"mj-accordion-body-outer\" [attr.inert]=\"Expanded ? null : ''\">\n <div class=\"mj-accordion-body-clip\">\n <div class=\"mj-accordion-body\" role=\"region\" [id]=\"BodyId\" [attr.aria-labelledby]=\"HeaderId\">\n <!-- Legacy: content placed directly in the panel (eager). -->\n <ng-content></ng-content>\n <!-- Preferred: [mjAccordionBody] template — instantiated lazily on first\n expand, then kept alive so later toggles still animate. -->\n @if (bodyTemplate && (Expanded || hasBeenExpanded)) {\n <ng-container [ngTemplateOutlet]=\"bodyTemplate.templateRef\"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class MJAccordionPanelComponent {\n @Input() Title = '';\n private _expanded = false;\n /** Latches true the first time the panel is expanded; never resets. Lets a\n * [mjAccordionBody] template instantiate lazily on first open and then stay\n * alive so subsequent open/close still animates. */\n private _everExpanded = false;\n @Input()\n set Expanded(value: boolean) {\n this._expanded = value;\n if (value) this._everExpanded = true;\n }\n get Expanded(): boolean { return this._expanded; }\n protected get hasBeenExpanded(): boolean { return this._everExpanded; }\n @Input() Disabled = false;\n /**\n * Emphasis variant for visual hierarchy:\n * - `primary` — bold, solid brand-colored header (use to make a panel stand out)\n * - `secondary` — subtle brand tint\n * - `default` — standard neutral header\n * All brand-token-driven, so dark-mode-safe and themeable.\n */\n @Input() Variant: 'default' | 'primary' | 'secondary' = 'default';\n /**\n * Render icons projected into the title slot in the muted color instead of the\n * header's primary text color. Lets consumers get the common \"quiet icon\" look\n * without writing CSS. Status/brand-colored icons can still be colored inline.\n */\n @Input() TitleIconMuted = false;\n /**\n * Density. `md` (default) is the standard size; `sm` tightens header padding and\n * font for dense contexts (sidebars, flyouts, nested panels).\n */\n @Input() Size: 'sm' | 'md' = 'md';\n /**\n * Bare chrome — drop the panel's own border and header background so the panel\n * sits cleanly inside a host that already provides chrome (e.g. an expandable\n * card). The toggle/title/chevron/body still work; only the box styling is removed.\n */\n @Input() Bare = false;\n /**\n * Remove the body's default padding, for bodies that manage their own spacing\n * (code editors, full-bleed grids, custom forms).\n */\n @Input() FlushBody = false;\n /**\n * Fill mode — for \"rail section that owns the leftover height\" cases (e.g. an\n * entity tree or grid that should consume all remaining vertical space and\n * scroll *internally*), rather than the default \"reveal stacked content\"\n * disclosure. When set AND expanded, the panel becomes a flex column that\n * fills its flex parent and its body becomes a `flex:1; min-height:0` region —\n * the projected content is expected to provide its own scroll child. While\n * collapsed, the panel behaves exactly like a normal panel (header only,\n * natural height) and does NOT claim the leftover space.\n *\n * Requires the panel's parent to be a flex column with `min-height:0`.\n * Note: the open/close height animation is skipped in fill mode (the body\n * fills rather than animating to content height).\n */\n @Input() Fill = false;\n @Output() ExpandedChange = new EventEmitter<boolean>();\n @ContentChild(MJAccordionTitleDirective) TitleTemplate: MJAccordionTitleDirective | null = null;\n\n /** @deprecated Use {@link TitleTemplate}. */\n get titleTemplate(): MJAccordionTitleDirective | null {\n return this.TitleTemplate;\n }\n /** @deprecated Use {@link TitleTemplate}. */\n set titleTemplate(value: MJAccordionTitleDirective | null) {\n this.TitleTemplate = value;\n }\n @ContentChild(MJAccordionActionsDirective) ActionsTemplate: MJAccordionActionsDirective | null = null;\n\n /** @deprecated Use {@link ActionsTemplate}. */\n get actionsTemplate(): MJAccordionActionsDirective | null {\n return this.ActionsTemplate;\n }\n /** @deprecated Use {@link ActionsTemplate}. */\n set actionsTemplate(value: MJAccordionActionsDirective | null) {\n this.ActionsTemplate = value;\n }\n @ContentChild(MJAccordionBodyDirective) BodyTemplate: MJAccordionBodyDirective | null = null;\n\n /** @deprecated Use {@link BodyTemplate}. */\n get bodyTemplate(): MJAccordionBodyDirective | null {\n return this.BodyTemplate;\n }\n /** @deprecated Use {@link BodyTemplate}. */\n set bodyTemplate(value: MJAccordionBodyDirective | null) {\n this.BodyTemplate = value;\n }\n @HostBinding('class.mj-accordion-panel-host') readonly hostClass = true;\n /** Host claims flex:1 of its parent ONLY while a Fill panel is expanded —\n * so a collapsed Fill panel sits at natural (header) height like any other. */\n @HostBinding('class.mj-accordion-fill-active') get fillActive(): boolean {\n return this.Fill && this.Expanded;\n }\n\n /** Stable per-instance ids that programmatically associate the header\n * `<button>` with its body region (`aria-controls` ↔ `aria-labelledby`),\n * completing the WAI-ARIA accordion pattern so screen readers announce the\n * region with the header's name. */\n private readonly _uid = nextAccordionUid++;\n readonly HeaderId = `mj-accordion-header-${this._uid}`;\n readonly BodyId = `mj-accordion-body-${this._uid}`;\n\n Toggle(): void {\n if (this.Disabled) return;\n this.Expanded = !this.Expanded;\n this.ExpandedChange.emit(this.Expanded);\n }\n}\n\n/**\n * Convenience module bundling the accordion panel + all of its slot directives.\n * Import this ONE symbol instead of listing the component and each directive\n * separately:\n *\n * ```ts\n * import { MJAccordionModule } from '@memberjunction/ng-ui-components';\n * @NgModule({ imports: [MJAccordionModule, ...] }) // or @Component standalone imports\n * ```\n *\n * Why a module (not a bare `const [...]` array): Angular's AOT compiler can't\n * statically expand a value-array imported across a compiled-package boundary in\n * an `imports` array (NG1010), and `as const` makes it a readonly tuple the\n * `imports` type rejects (TS2322). An NgModule is always a valid `imports` entry\n * in both NgModule and standalone consumers. Adding a future accordion directive\n * here makes it available to every consumer automatically — no per-module churn.\n */\n@NgModule({\n imports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n exports: [\n MJAccordionPanelComponent,\n MJAccordionTitleDirective,\n MJAccordionActionsDirective,\n MJAccordionBodyDirective,\n ],\n})\nexport class MJAccordionModule {}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applied-filters.component.js","sourceRoot":"","sources":["../../../src/lib/applied-filters/applied-filters.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;;IAgD3D,AADF,kCAAwC,cACF;IAAA,YAAc;IAAA,oBAAO;IACzD,kCAAoC;IAAA,YAAa;IAAA,oBAAO;IACxD,oCAIwB;IAAtB,8NAAS,qBAAW,KAAC;IACrB,0BAAoD;IAExD,AADE,oBAAS,EACJ;;;IAT+B,eAAc;IAAd,0CAAc;IACd,eAAa;IAAb,gCAAa;IAI/C,cAAuD;;;;;IAR7D,AADF,iCAAgC,cACS;IAAA,YAAe;IAAA,oBAAO;IAC7D,2GAYC;IACD,oCAA+E;IAAvB,gMAAS,mBAAY,KAAC;IAC5E,YACF;IACF,AADE,oBAAS,EACL;;;IAjBmC,eAAe;IAAf,sCAAe;IACtD,cAYC;IAZD,6BAYC;IAEC,eACF;IADE,qDACF;;AA7CR;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA6HH,MAAM,OAAO,yBAAyB;IACpC,iEAAiE;IACxD,OAAO,GAAoB,EAAE,CAAC;IAEvC,oEAAoE;IAC3D,SAAS,GAAW,aAAa,CAAC;IAE3C,6DAA6D;IACpD,aAAa,GAAW,WAAW,CAAC;IAE7C,mDAAmD;IACzC,MAAM,GAAG,IAAI,YAAY,EAAiB,CAAC;IAErD,oDAAoD;IAC1C,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE9C,QAAQ,CAAC,MAAqB;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;mHAtBU,yBAAyB;6DAAzB,yBAAyB;YAxHlC,2FAA0B;;YAA1B,iDAoBC;;;iFAoGQ,yBAAyB;cA5HrC,SAAS;2BACE,oBAAoB,cAClB,IAAI,YACN;;;;;;;;;;;;;;;;;;;;;;GAsBT;;kBAqGA,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kFAdI,yBAAyB","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n/**\n * One applied filter, as surfaced in the `mj-applied-filters` chip row.\n * `label` is the dimension (e.g. \"Status\"), `value` is the human-readable\n * selection (e.g. \"Active\"), `key` uniquely identifies it for removal.\n */\nexport interface AppliedFilter {\n /** Stable identifier emitted on removal — typically `<field>:<value>`. */\n key: string
|
|
1
|
+
{"version":3,"file":"applied-filters.component.js","sourceRoot":"","sources":["../../../src/lib/applied-filters/applied-filters.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;;IAgD3D,AADF,kCAAwC,cACF;IAAA,YAAc;IAAA,oBAAO;IACzD,kCAAoC;IAAA,YAAa;IAAA,oBAAO;IACxD,oCAIwB;IAAtB,8NAAS,qBAAW,KAAC;IACrB,0BAAoD;IAExD,AADE,oBAAS,EACJ;;;IAT+B,eAAc;IAAd,0CAAc;IACd,eAAa;IAAb,gCAAa;IAI/C,cAAuD;;;;;IAR7D,AADF,iCAAgC,cACS;IAAA,YAAe;IAAA,oBAAO;IAC7D,2GAYC;IACD,oCAA+E;IAAvB,gMAAS,mBAAY,KAAC;IAC5E,YACF;IACF,AADE,oBAAS,EACL;;;IAjBmC,eAAe;IAAf,sCAAe;IACtD,cAYC;IAZD,6BAYC;IAEC,eACF;IADE,qDACF;;AA7CR;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA6HH,MAAM,OAAO,yBAAyB;IACpC,iEAAiE;IACxD,OAAO,GAAoB,EAAE,CAAC;IAEvC,oEAAoE;IAC3D,SAAS,GAAW,aAAa,CAAC;IAE3C,6DAA6D;IACpD,aAAa,GAAW,WAAW,CAAC;IAE7C,mDAAmD;IACzC,MAAM,GAAG,IAAI,YAAY,EAAiB,CAAC;IAErD,oDAAoD;IAC1C,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE9C,QAAQ,CAAC,MAAqB;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;mHAtBU,yBAAyB;6DAAzB,yBAAyB;YAxHlC,2FAA0B;;YAA1B,iDAoBC;;;iFAoGQ,yBAAyB;cA5HrC,SAAS;2BACE,oBAAoB,cAClB,IAAI,YACN;;;;;;;;;;;;;;;;;;;;;;GAsBT;;kBAqGA,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kFAdI,yBAAyB","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n/**\n * One applied filter, as surfaced in the `mj-applied-filters` chip row.\n * `label` is the dimension (e.g. \"Status\"), `value` is the human-readable\n * selection (e.g. \"Active\"), `key` uniquely identifies it for removal.\n */\nexport interface AppliedFilter {\n /** Stable identifier emitted on removal — typically `<field>:<value>`. */\n key: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Dimension label shown before the colon (e.g. \"Status\", \"Sort\"). */\n label: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Human-readable applied value shown after the colon (e.g. \"Active\"). */\n value: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n}\n\n/**\n * `mj-applied-filters` — the \"Filtered by …\" chip row that renders the *state*\n * of filtering, separate from the *input* (a single `mj-filter-popover`\n * \"Filter\" button). Each applied filter shows as a removable pill; a \"Clear\n * all\" link clears the lot.\n *\n * Part of the concise-chrome model: one Filter entry point sets filters, this\n * row shows what's on and removes them individually. Identical on desktop\n * (chips wrap) and mobile (chips scroll horizontally) — nothing new to learn\n * between breakpoints.\n *\n * Renders nothing when `Filters` is empty, so consumers can place it\n * unconditionally above their content.\n *\n * ## Example\n * ```html\n * <mj-applied-filters\n * [Filters]=\"appliedFilters\"\n * (Remove)=\"onRemoveFilter($event)\"\n * (ClearAll)=\"resetAllFilters()\">\n * </mj-applied-filters>\n * ```\n */\n@Component({\n selector: 'mj-applied-filters',\n standalone: true,\n template: `\n @if (Filters.length > 0) {\n <div class=\"mj-applied-filters\">\n <span class=\"mj-applied-filters__lead\">{{ LeadLabel }}</span>\n @for (f of Filters; track f.key) {\n <span class=\"mj-applied-filters__token\">\n <span class=\"mj-applied-filters__k\">{{ f.label }}:</span>\n <span class=\"mj-applied-filters__v\">{{ f.value }}</span>\n <button\n type=\"button\"\n class=\"mj-applied-filters__x\"\n [attr.aria-label]=\"'Remove ' + f.label + ' ' + f.value\"\n (click)=\"OnRemove(f)\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </span>\n }\n <button type=\"button\" class=\"mj-applied-filters__clear\" (click)=\"OnClearAll()\">\n {{ ClearAllLabel }}\n </button>\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .mj-applied-filters {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-5);\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .mj-applied-filters__lead {\n flex-shrink: 0;\n margin-right: 2px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__token {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n height: 30px;\n padding: 0 5px 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .mj-applied-filters__k {\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__v {\n color: var(--mj-text-primary);\n font-weight: 600;\n }\n\n .mj-applied-filters__x {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border: none;\n background: transparent;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n }\n .mj-applied-filters__x:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .mj-applied-filters__clear {\n flex-shrink: 0;\n margin-left: 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n .mj-applied-filters__clear:hover {\n text-decoration: underline;\n }\n\n /* Mobile: the chip row scrolls horizontally rather than wrapping, so it\n stays a single compact line. */\n @media (max-width: 700px) {\n .mj-applied-filters {\n overflow-x: auto;\n flex-wrap: nowrap;\n scrollbar-width: none;\n -webkit-overflow-scrolling: touch;\n padding-left: var(--mj-space-4);\n padding-right: var(--mj-space-4);\n }\n .mj-applied-filters::-webkit-scrollbar {\n display: none;\n }\n }\n `]\n})\nexport class MJAppliedFiltersComponent {\n /** The currently-applied filters rendered as removable chips. */\n @Input() Filters: AppliedFilter[] = [];\n\n /** Lead label shown before the chips. Defaults to \"Filtered by\". */\n @Input() LeadLabel: string = 'Filtered by';\n\n /** Label for the clear-all link. Defaults to \"Clear all\". */\n @Input() ClearAllLabel: string = 'Clear all';\n\n /** Emitted when a single filter's ✕ is clicked. */\n @Output() Remove = new EventEmitter<AppliedFilter>();\n\n /** Emitted when the \"Clear all\" link is clicked. */\n @Output() ClearAll = new EventEmitter<void>();\n\n OnRemove(filter: AppliedFilter): void {\n this.Remove.emit(filter);\n }\n\n OnClearAll(): void {\n this.ClearAll.emit();\n }\n}\n"]}
|
|
@@ -28,10 +28,34 @@ export type MjButtonSize = 'sm' | 'md' | 'lg';
|
|
|
28
28
|
*/
|
|
29
29
|
export declare class MJButtonDirective implements AfterContentInit {
|
|
30
30
|
private readonly host;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
Variant: MjButtonVariant;
|
|
32
|
+
/** @deprecated Use {@link Variant}. */
|
|
33
|
+
set variant(value: MjButtonVariant);
|
|
34
|
+
/** @deprecated Use {@link Variant}. */
|
|
35
|
+
get variant(): MjButtonVariant;
|
|
36
|
+
Size: MjButtonSize;
|
|
37
|
+
/** @deprecated Use {@link Size}. */
|
|
38
|
+
set size(value: MjButtonSize);
|
|
39
|
+
/** @deprecated Use {@link Size}. */
|
|
40
|
+
get size(): MjButtonSize;
|
|
41
|
+
Toggleable: boolean;
|
|
42
|
+
/** @deprecated Use {@link Toggleable}. */
|
|
43
|
+
set toggleable(value: MJButtonDirective['Toggleable']);
|
|
44
|
+
/** @deprecated Use {@link Toggleable}. */
|
|
45
|
+
get toggleable(): MJButtonDirective['Toggleable'];
|
|
46
|
+
Selected: boolean;
|
|
47
|
+
/** @deprecated Use {@link Selected}. */
|
|
48
|
+
set selected(value: MJButtonDirective['Selected']);
|
|
49
|
+
/** @deprecated Use {@link Selected}. */
|
|
50
|
+
get selected(): MJButtonDirective['Selected'];
|
|
51
|
+
SelectedChange: EventEmitter<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* @deprecated Use {@link SelectedChange}.
|
|
54
|
+
*
|
|
55
|
+
* The same emitter under the old binding name, so a template still binding
|
|
56
|
+
* (selectedChange) keeps working. Must stay AFTER SelectedChange: class fields
|
|
57
|
+
* initialise in order, and the other way round this captures undefined.
|
|
58
|
+
*/
|
|
35
59
|
selectedChange: EventEmitter<boolean>;
|
|
36
60
|
constructor(host: ElementRef<HTMLElement>);
|
|
37
61
|
/**
|
|
@@ -39,8 +63,12 @@ export declare class MJButtonDirective implements AfterContentInit {
|
|
|
39
63
|
* (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored
|
|
40
64
|
* `aria-label="..."` on the element is never clobbered.
|
|
41
65
|
*/
|
|
42
|
-
set
|
|
66
|
+
set AriaLabel(value: string | null | undefined);
|
|
67
|
+
get AriaLabel(): string | undefined;
|
|
68
|
+
/** @deprecated Use {@link AriaLabel}. */
|
|
43
69
|
get ariaLabel(): string | undefined;
|
|
70
|
+
/** @deprecated Use {@link AriaLabel}. */
|
|
71
|
+
set ariaLabel(value: string | null | undefined);
|
|
44
72
|
private _ariaLabel?;
|
|
45
73
|
readonly baseClass = true;
|
|
46
74
|
get isPrimary(): boolean;
|
|
@@ -63,6 +91,6 @@ export declare class MJButtonDirective implements AfterContentInit {
|
|
|
63
91
|
*/
|
|
64
92
|
ngAfterContentInit(): void;
|
|
65
93
|
static ɵfac: i0.ɵɵFactoryDeclaration<MJButtonDirective, never>;
|
|
66
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<MJButtonDirective, "button[mjButton], a[mjButton]", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "toggleable": { "alias": "toggleable"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "selectedChange": "selectedChange"; }, never, never, true, never>;
|
|
94
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<MJButtonDirective, "button[mjButton], a[mjButton]", never, { "Variant": { "alias": "Variant"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "Size": { "alias": "Size"; "required": false; }; "size": { "alias": "size"; "required": false; }; "Toggleable": { "alias": "Toggleable"; "required": false; }; "toggleable": { "alias": "toggleable"; "required": false; }; "Selected": { "alias": "Selected"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "AriaLabel": { "alias": "AriaLabel"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "SelectedChange": "SelectedChange"; "selectedChange": "selectedChange"; }, never, never, true, never>;
|
|
67
95
|
}
|
|
68
96
|
//# sourceMappingURL=button.directive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.directive.d.ts","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGZ,UAAU,EACV,gBAAgB,EAEjB,MAAM,eAAe,CAAC;;AAEvB,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAIa,iBAAkB,YAAW,gBAAgB;
|
|
1
|
+
{"version":3,"file":"button.directive.d.ts","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGZ,UAAU,EACV,gBAAgB,EAEjB,MAAM,eAAe,CAAC;;AAEvB,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAIa,iBAAkB,YAAW,gBAAgB;IAsD5C,OAAO,CAAC,QAAQ,CAAC,IAAI;IArDxB,OAAO,EAAE,eAAe,CAAe;IAEhD,uCAAuC;IACvC,IAAa,OAAO,CAAC,KAAK,EAAE,eAAe,EAE1C;IACD,uCAAuC;IACvC,IAAI,OAAO,IAAI,eAAe,CAE7B;IACQ,IAAI,EAAE,YAAY,CAAQ;IAEnC,oCAAoC;IACpC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAEpC;IACD,oCAAoC;IACpC,IAAI,IAAI,IAAI,YAAY,CAEvB;IACQ,UAAU,UAAS;IAE5B,0CAA0C;IAC1C,IAAa,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAE7D;IACD,0CAA0C;IAC1C,IAAI,UAAU,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAEhD;IACQ,QAAQ,UAAS;IAE1B,wCAAwC;IACxC,IAAa,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAEzD;IACD,wCAAwC;IACxC,IAAI,QAAQ,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAE5C;IACS,cAAc,wBAA+B;IAEvD;;;;;;OAMG;IACO,cAAc,wBAAuB;gBAIlB,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC;IAE1D;;;;OAIG;IACH,IACI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAK7C;IACD,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,yCAAyC;IACzC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IACD,yCAAyC;IACzC,IAAa,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAEtD;IACD,OAAO,CAAC,UAAU,CAAC,CAAS;IAEC,QAAQ,CAAC,SAAS,QAAQ;IAEvD,IAA0C,SAAS,YAAyC;IAC5F,IAA4C,WAAW,YAA2C;IAClG,IAA0C,SAAS,YAAyC;IAC5F,IAAuC,MAAM,YAAsC;IACnF,IAAyC,QAAQ,YAAwC;IACzF,IAAuC,MAAM,YAAsC;IACnF,IAA0C,SAAS,YAAyC;IAC5F,IAA0C,SAAS,YAAyC;IAE5F,IAAqC,IAAI,YAAiC;IAC1E,IAAqC,IAAI,YAAiC;IAE1E,IAA2C,UAAU,YAA+C;IACpG,IAAsC,WAAW,IAAI,MAAM,GAAG,IAAI,CAEjE;IAGD,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;yCAlHf,iBAAiB;2CAAjB,iBAAiB;CAsI7B"}
|
|
@@ -26,11 +26,51 @@ import * as i0 from "@angular/core";
|
|
|
26
26
|
*/
|
|
27
27
|
export class MJButtonDirective {
|
|
28
28
|
host;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
Variant = 'secondary';
|
|
30
|
+
/** @deprecated Use {@link Variant}. */
|
|
31
|
+
set variant(value) {
|
|
32
|
+
this.Variant = value;
|
|
33
|
+
}
|
|
34
|
+
/** @deprecated Use {@link Variant}. */
|
|
35
|
+
get variant() {
|
|
36
|
+
return this.Variant;
|
|
37
|
+
}
|
|
38
|
+
Size = 'md';
|
|
39
|
+
/** @deprecated Use {@link Size}. */
|
|
40
|
+
set size(value) {
|
|
41
|
+
this.Size = value;
|
|
42
|
+
}
|
|
43
|
+
/** @deprecated Use {@link Size}. */
|
|
44
|
+
get size() {
|
|
45
|
+
return this.Size;
|
|
46
|
+
}
|
|
47
|
+
Toggleable = false;
|
|
48
|
+
/** @deprecated Use {@link Toggleable}. */
|
|
49
|
+
set toggleable(value) {
|
|
50
|
+
this.Toggleable = value;
|
|
51
|
+
}
|
|
52
|
+
/** @deprecated Use {@link Toggleable}. */
|
|
53
|
+
get toggleable() {
|
|
54
|
+
return this.Toggleable;
|
|
55
|
+
}
|
|
56
|
+
Selected = false;
|
|
57
|
+
/** @deprecated Use {@link Selected}. */
|
|
58
|
+
set selected(value) {
|
|
59
|
+
this.Selected = value;
|
|
60
|
+
}
|
|
61
|
+
/** @deprecated Use {@link Selected}. */
|
|
62
|
+
get selected() {
|
|
63
|
+
return this.Selected;
|
|
64
|
+
}
|
|
65
|
+
SelectedChange = new EventEmitter();
|
|
66
|
+
/**
|
|
67
|
+
* @deprecated Use {@link SelectedChange}.
|
|
68
|
+
*
|
|
69
|
+
* The same emitter under the old binding name, so a template still binding
|
|
70
|
+
* (selectedChange) keeps working. Must stay AFTER SelectedChange: class fields
|
|
71
|
+
* initialise in order, and the other way round this captures undefined.
|
|
72
|
+
*/
|
|
73
|
+
selectedChange = this.SelectedChange;
|
|
34
74
|
// Constructor injection (not inject()) so the directive can be unit-tested via direct
|
|
35
75
|
// instantiation with a stub ElementRef — the established pattern in this package's specs.
|
|
36
76
|
constructor(host) {
|
|
@@ -41,35 +81,43 @@ export class MJButtonDirective {
|
|
|
41
81
|
* (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored
|
|
42
82
|
* `aria-label="..."` on the element is never clobbered.
|
|
43
83
|
*/
|
|
44
|
-
set
|
|
84
|
+
set AriaLabel(value) {
|
|
45
85
|
this._ariaLabel = value ?? undefined;
|
|
46
86
|
if (this._ariaLabel) {
|
|
47
87
|
this.host.nativeElement.setAttribute('aria-label', this._ariaLabel);
|
|
48
88
|
}
|
|
49
89
|
}
|
|
50
|
-
get
|
|
90
|
+
get AriaLabel() {
|
|
51
91
|
return this._ariaLabel;
|
|
52
92
|
}
|
|
93
|
+
/** @deprecated Use {@link AriaLabel}. */
|
|
94
|
+
get ariaLabel() {
|
|
95
|
+
return this.AriaLabel;
|
|
96
|
+
}
|
|
97
|
+
/** @deprecated Use {@link AriaLabel}. */
|
|
98
|
+
set ariaLabel(value) {
|
|
99
|
+
this.AriaLabel = value;
|
|
100
|
+
}
|
|
53
101
|
_ariaLabel;
|
|
54
102
|
baseClass = true;
|
|
55
|
-
get isPrimary() { return this.
|
|
56
|
-
get isSecondary() { return this.
|
|
57
|
-
get isOutline() { return this.
|
|
58
|
-
get isFlat() { return this.
|
|
59
|
-
get isDanger() { return this.
|
|
60
|
-
get isIcon() { return this.
|
|
61
|
-
get isSuccess() { return this.
|
|
62
|
-
get isWarning() { return this.
|
|
63
|
-
get isSm() { return this.
|
|
64
|
-
get isLg() { return this.
|
|
65
|
-
get isSelected() { return this.
|
|
103
|
+
get isPrimary() { return this.Variant === 'primary'; }
|
|
104
|
+
get isSecondary() { return this.Variant === 'secondary'; }
|
|
105
|
+
get isOutline() { return this.Variant === 'outline'; }
|
|
106
|
+
get isFlat() { return this.Variant === 'flat'; }
|
|
107
|
+
get isDanger() { return this.Variant === 'danger'; }
|
|
108
|
+
get isIcon() { return this.Variant === 'icon'; }
|
|
109
|
+
get isSuccess() { return this.Variant === 'success'; }
|
|
110
|
+
get isWarning() { return this.Variant === 'warning'; }
|
|
111
|
+
get isSm() { return this.Size === 'sm'; }
|
|
112
|
+
get isLg() { return this.Size === 'lg'; }
|
|
113
|
+
get isSelected() { return this.Toggleable && this.Selected; }
|
|
66
114
|
get ariaPressed() {
|
|
67
|
-
return this.
|
|
115
|
+
return this.Toggleable ? String(this.Selected) : null;
|
|
68
116
|
}
|
|
69
117
|
OnClick() {
|
|
70
|
-
if (this.
|
|
71
|
-
this.
|
|
72
|
-
this.
|
|
118
|
+
if (this.Toggleable) {
|
|
119
|
+
this.Selected = !this.Selected;
|
|
120
|
+
this.SelectedChange.emit(this.Selected);
|
|
73
121
|
}
|
|
74
122
|
}
|
|
75
123
|
/**
|
|
@@ -78,7 +126,7 @@ export class MJButtonDirective {
|
|
|
78
126
|
* agents. Warn so it gets a name. No-op in production builds.
|
|
79
127
|
*/
|
|
80
128
|
ngAfterContentInit() {
|
|
81
|
-
if (!isDevMode() || this.
|
|
129
|
+
if (!isDevMode() || this.Variant !== 'icon') {
|
|
82
130
|
return;
|
|
83
131
|
}
|
|
84
132
|
const el = this.host.nativeElement;
|
|
@@ -98,7 +146,7 @@ export class MJButtonDirective {
|
|
|
98
146
|
} if (rf & 2) {
|
|
99
147
|
i0.ɵɵattribute("aria-pressed", ctx.ariaPressed);
|
|
100
148
|
i0.ɵɵclassProp("mj-btn", ctx.baseClass)("mj-btn--primary", ctx.isPrimary)("mj-btn--secondary", ctx.isSecondary)("mj-btn--outline", ctx.isOutline)("mj-btn--flat", ctx.isFlat)("mj-btn--danger", ctx.isDanger)("mj-btn--icon", ctx.isIcon)("mj-btn--success", ctx.isSuccess)("mj-btn--warning", ctx.isWarning)("mj-btn--sm", ctx.isSm)("mj-btn--lg", ctx.isLg)("mj-btn--selected", ctx.isSelected);
|
|
101
|
-
} }, inputs: { variant: "variant", size: "size", toggleable: "toggleable", selected: "selected", ariaLabel: "ariaLabel" }, outputs: { selectedChange: "selectedChange" } });
|
|
149
|
+
} }, inputs: { Variant: "Variant", variant: "variant", Size: "Size", size: "size", Toggleable: "Toggleable", toggleable: "toggleable", Selected: "Selected", selected: "selected", AriaLabel: "AriaLabel", ariaLabel: "ariaLabel" }, outputs: { SelectedChange: "SelectedChange", selectedChange: "selectedChange" } });
|
|
102
150
|
}
|
|
103
151
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJButtonDirective, [{
|
|
104
152
|
type: Directive,
|
|
@@ -106,16 +154,28 @@ export class MJButtonDirective {
|
|
|
106
154
|
selector: 'button[mjButton], a[mjButton]',
|
|
107
155
|
standalone: true
|
|
108
156
|
}]
|
|
109
|
-
}], () => [{ type: i0.ElementRef }], {
|
|
157
|
+
}], () => [{ type: i0.ElementRef }], { Variant: [{
|
|
158
|
+
type: Input
|
|
159
|
+
}], variant: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}], Size: [{
|
|
110
162
|
type: Input
|
|
111
163
|
}], size: [{
|
|
112
164
|
type: Input
|
|
165
|
+
}], Toggleable: [{
|
|
166
|
+
type: Input
|
|
113
167
|
}], toggleable: [{
|
|
114
168
|
type: Input
|
|
169
|
+
}], Selected: [{
|
|
170
|
+
type: Input
|
|
115
171
|
}], selected: [{
|
|
116
172
|
type: Input
|
|
173
|
+
}], SelectedChange: [{
|
|
174
|
+
type: Output
|
|
117
175
|
}], selectedChange: [{
|
|
118
176
|
type: Output
|
|
177
|
+
}], AriaLabel: [{
|
|
178
|
+
type: Input
|
|
119
179
|
}], ariaLabel: [{
|
|
120
180
|
type: Input
|
|
121
181
|
}], baseClass: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.directive.js","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n Input,\n Output,\n EventEmitter,\n HostBinding,\n HostListener,\n ElementRef,\n AfterContentInit,\n isDevMode\n} from '@angular/core';\n\nexport type MjButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'flat'\n | 'danger'\n | 'icon'\n | 'success'\n | 'warning';\n\nexport type MjButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * mjButton — Attribute directive that styles a native `<button>` or `<a>` element\n * as an MJ-branded button.\n *\n * Uses `--mj-*` design tokens for all colors, ensuring dark-mode support\n * with zero extra CSS.\n *\n * Inputs use lowercase (not PascalCase) per the Phase 2 plan exception for\n * directives — matches HTML attribute convention.\n *\n * Accessibility: an **icon-only** button (`variant=\"icon\"`, no visible text) has no accessible\n * name unless you supply one — set `[ariaLabel]` (or a native `title`). Without a name, screen\n * readers announce it as an unlabeled \"button\" and DOM/accessibility-tree agents (e.g. computer-use)\n * can't identify it. In dev mode the directive logs a warning for an icon button that ends up with\n * no accessible name.\n *\n * @example\n * ```html\n * <button mjButton variant=\"primary\" (click)=\"save()\">Save</button>\n * <button mjButton variant=\"outline\" size=\"sm\">Cancel</button>\n * <button mjButton variant=\"icon\" ariaLabel=\"Remove\" (click)=\"remove()\"><i class=\"fa-solid fa-xmark\"></i></button>\n * <button mjButton variant=\"flat\" [toggleable]=\"true\" [(selected)]=\"isActive\">Toggle</button>\n * ```\n */\n@Directive({\n selector: 'button[mjButton], a[mjButton]',\n standalone: true\n})\nexport class MJButtonDirective implements AfterContentInit {\n @Input() variant: MjButtonVariant = 'secondary';\n @Input() size: MjButtonSize = 'md';\n @Input() toggleable = false;\n @Input() selected = false;\n @Output() selectedChange = new EventEmitter<boolean>();\n\n // Constructor injection (not inject()) so the directive can be unit-tested via direct\n // instantiation with a stub ElementRef — the established pattern in this package's specs.\n constructor(private readonly host: ElementRef<HTMLElement>) {}\n\n /**\n * Accessible name for the button, surfaced as `aria-label`. Primarily for **icon-only** buttons\n * (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored\n * `aria-label=\"...\"` on the element is never clobbered.\n */\n @Input()\n set ariaLabel(value: string | null | undefined) {\n this._ariaLabel = value ?? undefined;\n if (this._ariaLabel) {\n this.host.nativeElement.setAttribute('aria-label', this._ariaLabel);\n }\n }\n get ariaLabel(): string | undefined {\n return this._ariaLabel;\n }\n private _ariaLabel?: string;\n\n @HostBinding('class.mj-btn') readonly baseClass = true;\n\n @HostBinding('class.mj-btn--primary') get isPrimary() { return this.variant === 'primary'; }\n @HostBinding('class.mj-btn--secondary') get isSecondary() { return this.variant === 'secondary'; }\n @HostBinding('class.mj-btn--outline') get isOutline() { return this.variant === 'outline'; }\n @HostBinding('class.mj-btn--flat') get isFlat() { return this.variant === 'flat'; }\n @HostBinding('class.mj-btn--danger') get isDanger() { return this.variant === 'danger'; }\n @HostBinding('class.mj-btn--icon') get isIcon() { return this.variant === 'icon'; }\n @HostBinding('class.mj-btn--success') get isSuccess() { return this.variant === 'success'; }\n @HostBinding('class.mj-btn--warning') get isWarning() { return this.variant === 'warning'; }\n\n @HostBinding('class.mj-btn--sm') get isSm() { return this.size === 'sm'; }\n @HostBinding('class.mj-btn--lg') get isLg() { return this.size === 'lg'; }\n\n @HostBinding('class.mj-btn--selected') get isSelected() { return this.toggleable && this.selected; }\n @HostBinding('attr.aria-pressed') get ariaPressed(): string | null {\n return this.toggleable ? String(this.selected) : null;\n }\n\n @HostListener('click')\n OnClick(): void {\n if (this.toggleable) {\n this.selected = !this.selected;\n this.selectedChange.emit(this.selected);\n }\n }\n\n /**\n * Dev-only guard: an icon-variant button with no accessible name (no `ariaLabel`/`aria-label`/\n * `aria-labelledby`/`title` and no visible text) is invisible-by-name to screen readers and DOM\n * agents. Warn so it gets a name. No-op in production builds.\n */\n ngAfterContentInit(): void {\n if (!isDevMode() || this.variant !== 'icon') {\n return;\n }\n const el = this.host.nativeElement;\n const hasAccessibleName = !!(\n this._ariaLabel ||\n el.getAttribute('aria-label') ||\n el.getAttribute('aria-labelledby') ||\n el.getAttribute('title') ||\n (el.textContent ?? '').trim().length > 0\n );\n if (!hasAccessibleName) {\n console.warn(\n '[mjButton] icon-only button has no accessible name — add [ariaLabel]=\"…\" (or a title) so ' +\n 'screen readers and computer-use agents can identify it.',\n el\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"button.directive.js","sourceRoot":"","sources":["../../../src/lib/button/button.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n Input,\n Output,\n EventEmitter,\n HostBinding,\n HostListener,\n ElementRef,\n AfterContentInit,\n isDevMode\n} from '@angular/core';\n\nexport type MjButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'flat'\n | 'danger'\n | 'icon'\n | 'success'\n | 'warning';\n\nexport type MjButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * mjButton — Attribute directive that styles a native `<button>` or `<a>` element\n * as an MJ-branded button.\n *\n * Uses `--mj-*` design tokens for all colors, ensuring dark-mode support\n * with zero extra CSS.\n *\n * Inputs use lowercase (not PascalCase) per the Phase 2 plan exception for\n * directives — matches HTML attribute convention.\n *\n * Accessibility: an **icon-only** button (`variant=\"icon\"`, no visible text) has no accessible\n * name unless you supply one — set `[ariaLabel]` (or a native `title`). Without a name, screen\n * readers announce it as an unlabeled \"button\" and DOM/accessibility-tree agents (e.g. computer-use)\n * can't identify it. In dev mode the directive logs a warning for an icon button that ends up with\n * no accessible name.\n *\n * @example\n * ```html\n * <button mjButton variant=\"primary\" (click)=\"save()\">Save</button>\n * <button mjButton variant=\"outline\" size=\"sm\">Cancel</button>\n * <button mjButton variant=\"icon\" ariaLabel=\"Remove\" (click)=\"remove()\"><i class=\"fa-solid fa-xmark\"></i></button>\n * <button mjButton variant=\"flat\" [toggleable]=\"true\" [(selected)]=\"isActive\">Toggle</button>\n * ```\n */\n@Directive({\n selector: 'button[mjButton], a[mjButton]',\n standalone: true\n})\nexport class MJButtonDirective implements AfterContentInit {\n @Input() Variant: MjButtonVariant = 'secondary';\n\n /** @deprecated Use {@link Variant}. */\n @Input() set variant(value: MjButtonVariant) {\n this.Variant = value;\n }\n /** @deprecated Use {@link Variant}. */\n get variant(): MjButtonVariant {\n return this.Variant;\n }\n @Input() Size: MjButtonSize = 'md';\n\n /** @deprecated Use {@link Size}. */\n @Input() set size(value: MjButtonSize) {\n this.Size = value;\n }\n /** @deprecated Use {@link Size}. */\n get size(): MjButtonSize {\n return this.Size;\n }\n @Input() Toggleable = false;\n\n /** @deprecated Use {@link Toggleable}. */\n @Input() set toggleable(value: MJButtonDirective['Toggleable']) {\n this.Toggleable = value;\n }\n /** @deprecated Use {@link Toggleable}. */\n get toggleable(): MJButtonDirective['Toggleable'] {\n return this.Toggleable;\n }\n @Input() Selected = false;\n\n /** @deprecated Use {@link Selected}. */\n @Input() set selected(value: MJButtonDirective['Selected']) {\n this.Selected = value;\n }\n /** @deprecated Use {@link Selected}. */\n get selected(): MJButtonDirective['Selected'] {\n return this.Selected;\n }\n @Output() SelectedChange = new EventEmitter<boolean>();\n\n /**\n * @deprecated Use {@link SelectedChange}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (selectedChange) keeps working. Must stay AFTER SelectedChange: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() selectedChange = this.SelectedChange;\n\n // Constructor injection (not inject()) so the directive can be unit-tested via direct\n // instantiation with a stub ElementRef — the established pattern in this package's specs.\n constructor(private readonly host: ElementRef<HTMLElement>) {}\n\n /**\n * Accessible name for the button, surfaced as `aria-label`. Primarily for **icon-only** buttons\n * (which otherwise have no name). Applied via `setAttribute` only when set, so a directly-authored\n * `aria-label=\"...\"` on the element is never clobbered.\n */\n @Input()\n set AriaLabel(value: string | null | undefined) {\n this._ariaLabel = value ?? undefined;\n if (this._ariaLabel) {\n this.host.nativeElement.setAttribute('aria-label', this._ariaLabel);\n }\n }\n get AriaLabel(): string | undefined {\n return this._ariaLabel;\n }\n\n /** @deprecated Use {@link AriaLabel}. */\n get ariaLabel(): string | undefined {\n return this.AriaLabel;\n }\n /** @deprecated Use {@link AriaLabel}. */\n @Input() set ariaLabel(value: string | null | undefined) {\n this.AriaLabel = value;\n }\n private _ariaLabel?: string;\n\n @HostBinding('class.mj-btn') readonly baseClass = true;\n\n @HostBinding('class.mj-btn--primary') get isPrimary() { return this.Variant === 'primary'; }\n @HostBinding('class.mj-btn--secondary') get isSecondary() { return this.Variant === 'secondary'; }\n @HostBinding('class.mj-btn--outline') get isOutline() { return this.Variant === 'outline'; }\n @HostBinding('class.mj-btn--flat') get isFlat() { return this.Variant === 'flat'; }\n @HostBinding('class.mj-btn--danger') get isDanger() { return this.Variant === 'danger'; }\n @HostBinding('class.mj-btn--icon') get isIcon() { return this.Variant === 'icon'; }\n @HostBinding('class.mj-btn--success') get isSuccess() { return this.Variant === 'success'; }\n @HostBinding('class.mj-btn--warning') get isWarning() { return this.Variant === 'warning'; }\n\n @HostBinding('class.mj-btn--sm') get isSm() { return this.Size === 'sm'; }\n @HostBinding('class.mj-btn--lg') get isLg() { return this.Size === 'lg'; }\n\n @HostBinding('class.mj-btn--selected') get isSelected() { return this.Toggleable && this.Selected; }\n @HostBinding('attr.aria-pressed') get ariaPressed(): string | null {\n return this.Toggleable ? String(this.Selected) : null;\n }\n\n @HostListener('click')\n OnClick(): void {\n if (this.Toggleable) {\n this.Selected = !this.Selected;\n this.SelectedChange.emit(this.Selected);\n }\n }\n\n /**\n * Dev-only guard: an icon-variant button with no accessible name (no `ariaLabel`/`aria-label`/\n * `aria-labelledby`/`title` and no visible text) is invisible-by-name to screen readers and DOM\n * agents. Warn so it gets a name. No-op in production builds.\n */\n ngAfterContentInit(): void {\n if (!isDevMode() || this.Variant !== 'icon') {\n return;\n }\n const el = this.host.nativeElement;\n const hasAccessibleName = !!(\n this._ariaLabel ||\n el.getAttribute('aria-label') ||\n el.getAttribute('aria-labelledby') ||\n el.getAttribute('title') ||\n (el.textContent ?? '').trim().length > 0\n );\n if (!hasAccessibleName) {\n console.warn(\n '[mjButton] icon-only button has no accessible name — add [ariaLabel]=\"…\" (or a title) so ' +\n 'screen readers and computer-use agents can identify it.',\n el\n );\n }\n }\n}\n"]}
|
|
@@ -43,7 +43,9 @@ export declare class MJCardFooterDirective {
|
|
|
43
43
|
export declare class MJCardGridComponent implements OnChanges {
|
|
44
44
|
private cdr;
|
|
45
45
|
/** Stream of the currently maximized card ID across all children. */
|
|
46
|
-
readonly
|
|
46
|
+
readonly MaximizedCard$: BehaviorSubject<string | null>;
|
|
47
|
+
/** @deprecated Use {@link MaximizedCard$}. */
|
|
48
|
+
get maximizedCard$(): BehaviorSubject<string | null>;
|
|
47
49
|
/** Number of columns for standard layout (defaults to 2). */
|
|
48
50
|
Columns: number | string;
|
|
49
51
|
/** CSS gap between cards (defaults to var(--mj-space-4)). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/card-grid/card-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,YAAY,EACZ,WAAW,EAMX,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAgB,MAAM,MAAM,CAAC;;AAIrD;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,sBAAsB;IACZ,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,sBAAsB;2CAAtB,sBAAsB;CAElC;AAED;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,qBAAqB;IACX,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,qBAAqB;2CAArB,qBAAqB;CAEjC;AAsLD;;GAEG;AACH,qBAea,mBAAoB,YAAW,SAAS;IACjD,OAAO,CAAC,GAAG,CAA6B;IAExC,qEAAqE;IACrE,SAAgB,cAAc,iCAA4C;IAE1E,6DAA6D;IACpD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAK;IAEtC,6DAA6D;IACpD,GAAG,SAA6B;IAEzC,iFAAiF;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/C,0EAA0E;IAChE,qBAAqB,8BAAqC;IAEpE,kDAAkD;IACxC,aAAa,uBAA8B;IAErD,uEAAuE;IAC7D,YAAY,qBAA4B;IAE3C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,qEAAqE;IAE9D,QAAQ,IAAI,IAAI;IAMhB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQlC,OAAO,IAAI,IAAI;IASf,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"card-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/card-grid/card-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,YAAY,EACZ,WAAW,EAMX,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAgB,MAAM,MAAM,CAAC;;AAIrD;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,sBAAsB;IACZ,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,sBAAsB;2CAAtB,sBAAsB;CAElC;AAED;;GAEG;AACH,qBAIa,oBAAoB;IACV,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,oBAAoB;2CAApB,oBAAoB;CAEhC;AAED;;GAEG;AACH,qBAIa,qBAAqB;IACX,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBAAjC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;yCAD3C,qBAAqB;2CAArB,qBAAqB;CAEjC;AAsLD;;GAEG;AACH,qBAea,mBAAoB,YAAW,SAAS;IACjD,OAAO,CAAC,GAAG,CAA6B;IAExC,qEAAqE;IACrE,SAAgB,cAAc,iCAA4C;IAE1E,8CAA8C;IAC9C,IAAW,cAAc,mCAExB;IAED,6DAA6D;IACpD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAK;IAEtC,6DAA6D;IACpD,GAAG,SAA6B;IAEzC,iFAAiF;IACxE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/C,0EAA0E;IAChE,qBAAqB,8BAAqC;IAEpE,kDAAkD;IACxC,aAAa,uBAA8B;IAErD,uEAAuE;IAC7D,YAAY,qBAA4B;IAE3C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,qEAAqE;IAE9D,QAAQ,IAAI,IAAI;IAMhB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQlC,OAAO,IAAI,IAAI;IASf,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;yCAhEnC,mBAAmB;2CAAnB,mBAAmB;CAmE/B;AAED;;GAEG;AACH,qBAwEa,eAAgB,YAAW,MAAM,EAAE,SAAS;IACrD,OAAO,CAAC,IAAI,CAAmD;IAC/D,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,GAAG,CAAC,CAAe;IAElB,MAAM,SAA6B;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,UAAQ;IACrB,eAAe,SAAiB;IAChC,cAAc,SAAkB;IAChC,UAAU,UAAQ;IAEjB,QAAQ,qBAA4B;IACpC,OAAO,qBAA4B;IAET,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACnC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IAC3C,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACpC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IAE5E,IAAW,WAAW,IAAI,OAAO,CAKhC;IAED,IAAW,QAAQ,IAAI,OAAO,CAK7B;IAEM,QAAQ,IAAI,IAAI;IAWhB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;yCAnDtC,eAAe;2CAAf,eAAe;CAgE3B"}
|
|
@@ -113,7 +113,7 @@ export class MJCardTitleDirective {
|
|
|
113
113
|
templateRef;
|
|
114
114
|
constructor(templateRef) {
|
|
115
115
|
this.templateRef = templateRef;
|
|
116
|
-
}
|
|
116
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
117
117
|
static ɵfac = function MJCardTitleDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardTitleDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
118
118
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardTitleDirective, selectors: [["", "mjCardTitle", ""]] });
|
|
119
119
|
}
|
|
@@ -131,7 +131,7 @@ export class MJCardActionsDirective {
|
|
|
131
131
|
templateRef;
|
|
132
132
|
constructor(templateRef) {
|
|
133
133
|
this.templateRef = templateRef;
|
|
134
|
-
}
|
|
134
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
135
135
|
static ɵfac = function MJCardActionsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardActionsDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
136
136
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardActionsDirective, selectors: [["", "mjCardActions", ""]] });
|
|
137
137
|
}
|
|
@@ -149,7 +149,7 @@ export class MJCardToolsDirective {
|
|
|
149
149
|
templateRef;
|
|
150
150
|
constructor(templateRef) {
|
|
151
151
|
this.templateRef = templateRef;
|
|
152
|
-
}
|
|
152
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
153
153
|
static ɵfac = function MJCardToolsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardToolsDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
154
154
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardToolsDirective, selectors: [["", "mjCardTools", ""]] });
|
|
155
155
|
}
|
|
@@ -167,7 +167,7 @@ export class MJCardFooterDirective {
|
|
|
167
167
|
templateRef;
|
|
168
168
|
constructor(templateRef) {
|
|
169
169
|
this.templateRef = templateRef;
|
|
170
|
-
}
|
|
170
|
+
} // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply
|
|
171
171
|
static ɵfac = function MJCardFooterDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCardFooterDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); };
|
|
172
172
|
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: MJCardFooterDirective, selectors: [["", "mjCardFooter", ""]] });
|
|
173
173
|
}
|
|
@@ -363,7 +363,11 @@ mj-card {
|
|
|
363
363
|
export class MJCardGridComponent {
|
|
364
364
|
cdr = inject(ChangeDetectorRef);
|
|
365
365
|
/** Stream of the currently maximized card ID across all children. */
|
|
366
|
-
|
|
366
|
+
MaximizedCard$ = new BehaviorSubject(null);
|
|
367
|
+
/** @deprecated Use {@link MaximizedCard$}. */
|
|
368
|
+
get maximizedCard$() {
|
|
369
|
+
return this.MaximizedCard$;
|
|
370
|
+
}
|
|
367
371
|
/** Number of columns for standard layout (defaults to 2). */
|
|
368
372
|
Columns = 2;
|
|
369
373
|
/** CSS gap between cards (defaults to var(--mj-space-4)). */
|
|
@@ -378,7 +382,7 @@ export class MJCardGridComponent {
|
|
|
378
382
|
CardRestored = new EventEmitter();
|
|
379
383
|
ngOnChanges(changes) {
|
|
380
384
|
if (changes['MaximizedCardId'] && !changes['MaximizedCardId'].firstChange) {
|
|
381
|
-
this.
|
|
385
|
+
this.MaximizedCard$.next(this.MaximizedCardId);
|
|
382
386
|
}
|
|
383
387
|
}
|
|
384
388
|
/** Pressing Escape restores the grid view if a card is maximized. */
|
|
@@ -389,7 +393,7 @@ export class MJCardGridComponent {
|
|
|
389
393
|
}
|
|
390
394
|
MaximizeCard(cardId) {
|
|
391
395
|
this.MaximizedCardId = cardId;
|
|
392
|
-
this.
|
|
396
|
+
this.MaximizedCard$.next(cardId);
|
|
393
397
|
this.MaximizedCardIdChange.emit(cardId);
|
|
394
398
|
this.CardMaximized.emit(cardId);
|
|
395
399
|
this.cdr.markForCheck();
|
|
@@ -398,7 +402,7 @@ export class MJCardGridComponent {
|
|
|
398
402
|
if (!this.MaximizedCardId)
|
|
399
403
|
return;
|
|
400
404
|
this.MaximizedCardId = null;
|
|
401
|
-
this.
|
|
405
|
+
this.MaximizedCard$.next(null);
|
|
402
406
|
this.MaximizedCardIdChange.emit(null);
|
|
403
407
|
this.CardRestored.emit();
|
|
404
408
|
this.cdr.markForCheck();
|
|
@@ -636,5 +640,5 @@ export class MJCardComponent {
|
|
|
636
640
|
type: ContentChild,
|
|
637
641
|
args: [MJCardFooterDirective]
|
|
638
642
|
}] }); })();
|
|
639
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCardComponent, { className: "MJCardComponent", filePath: "lib/card-grid/card-grid.component.ts", lineNumber:
|
|
643
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCardComponent, { className: "MJCardComponent", filePath: "lib/card-grid/card-grid.component.ts", lineNumber: 409 }); })();
|
|
640
644
|
//# sourceMappingURL=card-grid.component.js.map
|