@dereekb/dbx-components-mcp 13.11.5 → 13.11.6

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.
@@ -392,7 +392,7 @@
392
392
  "line": 17,
393
393
  "declarations": [],
394
394
  "role": "layout",
395
- "intent": "enlarge the inner `mat-mdc-button` height to 46px (33% taller than default)",
395
+ "intent": "enlarge the inner `mat-mdc-button` height to 46px (33% taller than default) by setting Material's `--mat-button-*-container-height` tokens",
396
396
  "seeAlso": [
397
397
  "button-wide"
398
398
  ]
@@ -403,7 +403,7 @@
403
403
  "source": "@dereekb/dbx-web",
404
404
  "module": "@dereekb/dbx-web",
405
405
  "file": "src/lib/button/_button.scss",
406
- "line": 130,
406
+ "line": 144,
407
407
  "declarations": [
408
408
  {
409
409
  "property": "display",
@@ -425,13 +425,58 @@
425
425
  "dbx-flex-column"
426
426
  ]
427
427
  },
428
+ {
429
+ "slug": "button-form-field-height",
430
+ "selector": ".dbx-button-form-field-height",
431
+ "source": "@dereekb/dbx-web",
432
+ "module": "@dereekb/dbx-web",
433
+ "file": "src/lib/button/_button.scss",
434
+ "line": 30,
435
+ "declarations": [
436
+ {
437
+ "property": "--mat-button-text-container-height",
438
+ "value": "var(--mat-form-field-container-height)"
439
+ },
440
+ {
441
+ "property": "--mat-button-filled-container-height",
442
+ "value": "var(--mat-form-field-container-height)"
443
+ },
444
+ {
445
+ "property": "--mat-button-protected-container-height",
446
+ "value": "var(--mat-form-field-container-height)"
447
+ },
448
+ {
449
+ "property": "--mat-button-outlined-container-height",
450
+ "value": "var(--mat-form-field-container-height)"
451
+ },
452
+ {
453
+ "property": "--mat-button-tonal-container-height",
454
+ "value": "var(--mat-form-field-container-height)"
455
+ }
456
+ ],
457
+ "role": "layout",
458
+ "intent": "match the inner `mat-mdc-button` height to `--mat-form-field-container-height` so a button aligns vertically with an adjacent form field",
459
+ "seeAlso": [
460
+ "button-big"
461
+ ],
462
+ "tokensRead": [
463
+ "--mat-form-field-container-height"
464
+ ],
465
+ "tokensSet": [
466
+ "--mat-button-filled-container-height",
467
+ "--mat-button-outlined-container-height",
468
+ "--mat-button-protected-container-height",
469
+ "--mat-button-text-container-height",
470
+ "--mat-button-tonal-container-height"
471
+ ]
472
+ },
428
473
  {
429
474
  "slug": "button-neutral-interaction-color",
430
475
  "selector": ".dbx-button-neutral-interaction-color",
431
476
  "source": "@dereekb/dbx-web",
432
477
  "module": "@dereekb/dbx-web",
433
478
  "file": "src/lib/button/_button.scss",
434
- "line": 29,
479
+ "line": 43,
435
480
  "declarations": [],
436
481
  "role": "state",
437
482
  "intent": "neutralize Material's hover/pressed/focus/ripple state layer to `--mat-sys-on-surface` — use on buttons with a custom background where the primary-tinted state-layer would clash",
@@ -445,7 +490,7 @@
445
490
  "source": "@dereekb/dbx-web",
446
491
  "module": "@dereekb/dbx-web",
447
492
  "file": "src/lib/button/_button.scss",
448
- "line": 118,
493
+ "line": 132,
449
494
  "declarations": [
450
495
  {
451
496
  "property": "padding-right",
@@ -465,7 +510,7 @@
465
510
  "source": "@dereekb/dbx-web",
466
511
  "module": "@dereekb/dbx-web",
467
512
  "file": "src/lib/button/_button.scss",
468
- "line": 55,
513
+ "line": 69,
469
514
  "declarations": [],
470
515
  "role": "layout",
471
516
  "intent": "stretch the inner `.dbx-button` to a 120px minimum width (still capped by parent)",
@@ -479,7 +524,7 @@
479
524
  "source": "@dereekb/dbx-web",
480
525
  "module": "@dereekb/dbx-web",
481
526
  "file": "src/lib/button/_button.scss",
482
- "line": 66,
527
+ "line": 80,
483
528
  "declarations": [],
484
529
  "role": "layout",
485
530
  "intent": "group of buttons that wrap onto multiple rows — adds 6px right + bottom spacing between `<dbx-button>` / `<dbx-anchor>` / `<button>` / `<dbx-icon-button>` siblings",
@@ -565,6 +610,26 @@
565
610
  "icon-spacer"
566
611
  ]
567
612
  },
613
+ {
614
+ "slug": "color-bg",
615
+ "selector": ".dbx-color-bg",
616
+ "source": "@dereekb/dbx-web",
617
+ "module": "@dereekb/dbx-web",
618
+ "file": "src/lib/layout/style/_style.scss",
619
+ "line": 175,
620
+ "declarations": [],
621
+ "intent": "generic themed-background class — pair with `[dbxColor]=\"config\"` to drive `--dbx-bg-color-current` / `--dbx-color-current` from arbitrary CSS color values"
622
+ },
623
+ {
624
+ "slug": "color-text",
625
+ "selector": ".dbx-color-text",
626
+ "source": "@dereekb/dbx-web",
627
+ "module": "@dereekb/dbx-web",
628
+ "file": "src/lib/layout/style/_style.scss",
629
+ "line": 182,
630
+ "declarations": [],
631
+ "intent": "generic themed-text class — pair with `[dbxTextColor]=\"config\"` to drive `--dbx-color-current` from an arbitrary CSS color value"
632
+ },
568
633
  {
569
634
  "slug": "color-tonal",
570
635
  "selector": ".dbx-color-tonal",
@@ -1158,7 +1223,7 @@
1158
1223
  "source": "@dereekb/dbx-web",
1159
1224
  "module": "@dereekb/dbx-web",
1160
1225
  "file": "src/lib/button/_button.scss",
1161
- "line": 106,
1226
+ "line": 120,
1162
1227
  "declarations": [
1163
1228
  {
1164
1229
  "property": "width",
@@ -98,7 +98,7 @@
98
98
  },
99
99
  {
100
100
  "name": "color",
101
- "type": "Maybe<ThemePalette | DbxThemeColor>",
101
+ "type": "Maybe<ThemePalette | DbxColorInput>",
102
102
  "description": "",
103
103
  "required": false
104
104
  },
@@ -386,7 +386,7 @@
386
386
  },
387
387
  {
388
388
  "name": "color",
389
- "type": "ThemePalette | DbxThemeColor",
389
+ "type": "ThemePalette | DbxColorInput",
390
390
  "description": "",
391
391
  "required": false,
392
392
  "default": "'primary'"
@@ -473,7 +473,7 @@
473
473
  },
474
474
  {
475
475
  "name": "color",
476
- "type": "ThemePalette | DbxThemeColor",
476
+ "type": "ThemePalette | DbxColorInput",
477
477
  "description": "",
478
478
  "required": false,
479
479
  "default": "'primary'"
@@ -558,7 +558,7 @@
558
558
  },
559
559
  {
560
560
  "name": "color",
561
- "type": "ThemePalette | DbxThemeColor",
561
+ "type": "ThemePalette | DbxColorInput",
562
562
  "description": "",
563
563
  "required": false,
564
564
  "default": "'primary'"
@@ -1012,7 +1012,7 @@
1012
1012
  "inputs": [
1013
1013
  {
1014
1014
  "name": "color",
1015
- "type": "Maybe<DbxBarColor>",
1015
+ "type": "Maybe<DbxColorInput>",
1016
1016
  "description": "",
1017
1017
  "required": false
1018
1018
  }
@@ -1052,7 +1052,7 @@
1052
1052
  },
1053
1053
  {
1054
1054
  "name": "color",
1055
- "type": "Maybe<DbxBarColor>",
1055
+ "type": "Maybe<DbxColorInput>",
1056
1056
  "description": "",
1057
1057
  "required": false
1058
1058
  }
@@ -2160,8 +2160,8 @@
2160
2160
  },
2161
2161
  {
2162
2162
  "name": "color",
2163
- "type": "Maybe<DbxThemeColor>",
2164
- "description": "Theme color applied to the chip background via {@link dbxColorBackground}.\n\nWhen {@link display} is also set, its color is used as a fallback.",
2163
+ "type": "Maybe<DbxColorInput>",
2164
+ "description": "Theme color or {@link DbxColorConfig} applied to the chip background via {@link dbxColorBackground}.\n\nWhen {@link display} is also set, its color is used as a fallback.",
2165
2165
  "required": false
2166
2166
  },
2167
2167
  {
@@ -2546,7 +2546,7 @@
2546
2546
  "inputs": [
2547
2547
  {
2548
2548
  "name": "color",
2549
- "type": "ThemePalette | DbxThemeColor",
2549
+ "type": "ThemePalette | DbxColorInput",
2550
2550
  "description": "",
2551
2551
  "required": false,
2552
2552
  "default": "undefined"
@@ -5,6 +5,42 @@
5
5
  "generatedAt": "1970-01-01T00:00:00.000Z",
6
6
  "generator": "@dereekb/dbx-components-mcp/scripts/generate-manifests.mjs",
7
7
  "entries": [
8
+ {
9
+ "slug": "action-form-with-secondary",
10
+ "category": "action",
11
+ "summary": "Form-driven primary action (dbxActionForm + Approve) plus a nested ng-container dbxAction with dbxActionValue for a void Deny / Cancel button.",
12
+ "header": "Form Action With Secondary Button",
13
+ "className": "DocActionFormWithSecondaryExampleComponent",
14
+ "selector": "doc-action-form-with-secondary-example",
15
+ "module": "apps/demo",
16
+ "appRef": "apps/demo",
17
+ "hint": "dbxActionForm + Approve, plus a nested dbxAction context for Deny.",
18
+ "relatedSlugs": [
19
+ "dbxActionForm",
20
+ "dbxActionValue",
21
+ "ng-container",
22
+ "dbxAction",
23
+ "dbxActionButton",
24
+ "dbxActionSnackbarError"
25
+ ],
26
+ "info": "<p>\n The\n <strong>outer</strong>\n <code>[dbxAction]</code>\n hosts the primary work. A child component carries the\n <code>dbxActionForm</code>\n directive so the form's value (and validity / modified state) drives the\n <code>Approve</code>\n button.\n</p>\n<p>\n The\n <strong>secondary</strong>\n button (\n <code>Deny</code>\n ) lives inside a nested\n <code>&lt;ng-container dbxAction&gt;</code>\n . Angular DI looks up the nearest ancestor\n <code>dbxAction</code>\n for each\n <code>dbxActionButton</code>\n , so the inner button picks up the inner context, not the outer.\n <code>dbxActionValue</code>\n with no input supplies the empty payload that lets the button fire a void handler immediately.\n</p>\n<p>\n Each context has its own\n <code>dbxActionSnackbarError</code>\n , so Approve / Deny feedback is independent.\n</p>",
27
+ "snippet": "<div dbxAction dbxActionSnackbarError [dbxActionHandler]=\"approveHandler\">\n <doc-action-form-with-secondary-form dbxActionForm></doc-action-form-with-secondary-form>\n <div class=\"dbx-pt3\">\n <dbx-button dbxActionButton text=\"Approve\" [raised]=\"true\" color=\"primary\"></dbx-button>\n <dbx-button-spacer></dbx-button-spacer>\n <ng-container dbxAction dbxActionSnackbarError dbxActionValue [dbxActionHandler]=\"denyHandler\">\n <dbx-button dbxActionButton text=\"Deny\" [flat]=\"true\" color=\"warn\"></dbx-button>\n </ng-container>\n </div>\n</div>\n@let decision = lastDecisionSignal();\n@if (decision) {\n <div class=\"dbx-pt3\">\n @if (decision.outcome === 'approved') {\n <span>\n Approved with reason:\n <strong>{{ decision.value.reason }}</strong>\n </span>\n } @else {\n <span>Denied.</span>\n }\n </div>\n}",
28
+ "uses": [
29
+ {
30
+ "kind": "component",
31
+ "className": "DocActionFormWithSecondaryFormComponent",
32
+ "role": "form",
33
+ "selector": "doc-action-form-with-secondary-form",
34
+ "classSource": "@Component({\n template: DBX_FORGE_FORM_COMPONENT_TEMPLATE,\n selector: 'doc-action-form-with-secondary-form',\n providers: dbxForgeFormComponentProviders(),\n standalone: true,\n imports: [DbxForgeFormComponentImportsModule],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DocActionFormWithSecondaryFormComponent extends AbstractSyncForgeFormDirective<DocActionFormWithSecondaryFormValue> {\n readonly formConfig: FormConfig = {\n fields: [\n dbxForgeTextField({\n key: 'reason',\n label: 'Reason',\n required: true,\n description: 'The Approve handler receives this value via dbxActionForm. Type something to enable Approve.'\n })\n ]\n } as FormConfig;\n}"
35
+ },
36
+ {
37
+ "kind": "interface",
38
+ "className": "DocActionFormWithSecondaryFormValue",
39
+ "role": "formValue",
40
+ "classSource": "export interface DocActionFormWithSecondaryFormValue {\n reason: string;\n}"
41
+ }
42
+ ]
43
+ },
8
44
  {
9
45
  "slug": "card-hero-onboarding-progress",
10
46
  "category": "card",
@@ -217,6 +253,28 @@
217
253
  "classSource": "export interface TwoLineItemValue {\n readonly key: string;\n readonly icon?: Maybe<string>;\n readonly title: string;\n readonly details?: Maybe<string>;\n readonly footnote?: Maybe<string>;\n readonly status?: Maybe<'active' | 'pending' | 'archived'>;\n}"
218
254
  }
219
255
  ]
256
+ },
257
+ {
258
+ "slug": "layout-support-page",
259
+ "category": "layout",
260
+ "summary": "Static support landing page — outlined hero card with a dbx-button CTA and search input plus a responsive 3-column grid of topic mat-cards whose rows are dbx-anchor onClick handlers that pop a snackbar.",
261
+ "header": "Support Landing Page Layout",
262
+ "className": "DocSupportPageLayoutExampleComponent",
263
+ "selector": "doc-support-page-layout-example",
264
+ "module": "apps/demo",
265
+ "appRef": "apps/demo",
266
+ "hint": "Page header + hero CTA/search card + responsive 3-column grid of topic cards.",
267
+ "relatedSlugs": [
268
+ "mat-card",
269
+ "dbx-button",
270
+ "dbx-anchor",
271
+ "dbx-icon-tile",
272
+ "mat-form-field",
273
+ "mat-snack-bar"
274
+ ],
275
+ "info": "<p>\n Composes a marketing-style support page out of Angular Material cards plus dbx-web's\n <code>&lt;dbx-button&gt;</code>\n ,\n <code>&lt;dbx-anchor&gt;</code>\n , and\n <code>&lt;dbx-icon-tile&gt;</code>\n : an outlined hero\n <code>&lt;mat-card&gt;</code>\n for the search/CTA row and a responsive grid of outlined topic\n <code>&lt;mat-card&gt;</code>\n boxes whose rows are individual\n <code>&lt;dbx-anchor [anchor]&gt;</code>\n click targets.\n</p>\n<p>\n The topic grid uses Angular Flex Layout's CSS-Grid directives —\n <code>gdColumns=\"repeat(auto-fit, minmax(320px, 1fr))\"</code>\n +\n <code>gdGap</code>\n — so the cards auto-collapse 3 → 2 → 1 columns as the viewport narrows, with no breakpoint media queries or wrapping\n <code>fxFlex</code>\n shells needed. The hero CTA + search row uses\n <code>fxLayout=\"row\"</code>\n with\n <code>fxLayout.lt-md=\"column\"</code>\n so it stacks below the tablet breakpoint. The CTA itself composes the\n <code>.dbx-grow-button</code>\n +\n <code>.dbx-button-big</code>\n utilities (full-width, taller mat-button) instead of hand-rolled\n <code>::ng-deep</code>\n width / height overrides.\n</p>\n<p>\n Topic-card avatars are\n <code>&lt;dbx-icon-tile [round]&gt;</code>\n with\n <code>[dbxColor]=\"'primary'\"</code>\n +\n <code>[dbxColorTone]=\"18\"</code>\n for the tonal swatch. Each card body is a plain\n <code>&lt;ul&gt;</code>\n /\n <code>&lt;li&gt;</code>\n so the browser's default disc marker supplies the bullet, and topic links use\n <code>[dbxTextColor]=\"'primary'\"</code>\n (the\n <code>&lt;a&gt;</code>\n inside\n <code>dbx-anchor</code>\n already inherits color and is text-decoration-none by default).\n</p>\n<p>\n Each topic row supplies a\n <code>ClickableAnchor</code>\n with an\n <code>onClick</code>\n callback to\n <code>dbx-anchor</code>\n ; the callback opens a\n <code>MatSnackBar</code>\n with a \"Dismiss\" action so every link demonstrably triggers a button-bearing popup. Swap the\n <code>onClick</code>\n for a\n <code>ref</code>\n /\n <code>url</code>\n to route or open externally instead.\n</p>",
276
+ "snippet": "<div class=\"dbx-p4 doc-support-page\">\n <h1 class=\"dbx-text-headline-large dbx-mb1\">Lorem Ipsum Support</h1>\n <p class=\"dbx-text-body-large dbx-mb4\">Dolor sit amet — we're here to help you succeed!</p>\n\n <mat-card appearance=\"outlined\" class=\"dbx-mb4\">\n <mat-card-content>\n <h3 class=\"dbx-text-title-medium dbx-mb3\">Need help? We're here.</h3>\n <div fxLayout=\"row\" fxLayout.lt-md=\"column\" fxLayoutGap=\"var(--dbx-padding-3)\" fxLayoutAlign=\"start stretch\">\n <dbx-button class=\"dbx-grow-button dbx-button-form-field-height\" fxFlex=\"1 1 50%\" flat icon=\"help_outline\" text=\"Chat with Support\" customButtonColor=\"var(--mat-sys-inverse-surface)\" customTextColor=\"var(--mat-sys-inverse-on-surface)\" (buttonClick)=\"onChatClick()\"></dbx-button>\n <mat-form-field class=\"dbx-p0\" appearance=\"outline\" fxFlex=\"1 1 50%\" subscriptSizing=\"dynamic\">\n <input matInput placeholder=\"Search for a topic or question…\" />\n </mat-form-field>\n </div>\n </mat-card-content>\n </mat-card>\n\n <div gdColumns=\"repeat(auto-fit, minmax(320px, 1fr))\" gdGap=\"var(--dbx-padding-5)\">\n @for (group of topics; track group.title) {\n <mat-card appearance=\"outlined\">\n <mat-card-content>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"var(--dbx-padding-2)\" class=\"dbx-mb3\">\n <dbx-icon-tile class=\"doc-support-topic-avatar\" [icon]=\"group.icon\" [round]=\"true\"></dbx-icon-tile>\n <span class=\"dbx-text-title-medium\">{{ group.title }}</span>\n </div>\n <ul class=\"doc-support-topic-links\">\n @for (link of group.links; track link.label) {\n <li class=\"dbx-pb2\">\n <dbx-anchor [dbxTextColor]=\"'primary'\" [anchor]=\"anchorFor(link)\">{{ link.label }}</dbx-anchor>\n </li>\n }\n </ul>\n </mat-card-content>\n </mat-card>\n }\n </div>\n</div>",
277
+ "uses": []
220
278
  }
221
279
  ]
222
280
  }
@@ -473,6 +473,16 @@
473
473
  "whenItDoesNotApply": "When the rename was intentional (rare — usually a copy-paste).",
474
474
  "canonicalFix": "Update the getter body to return the matching identity constant."
475
475
  },
476
+ {
477
+ "code": "MODEL_FIELD_LONG_NAME_EQUALS_NAME",
478
+ "source": "dbx_model_validate",
479
+ "severity": "warning",
480
+ "title": "A persisted field's `@dbxModelVariable <longName>` tag value matches the field's short name verbatim, defeating the tag's purpose (the long name should be the field's unabbreviated camelCase variable name)",
481
+ "whatItFlags": "A persisted field's `@dbxModelVariable <longName>` tag value matches the field's short name verbatim, defeating the tag's purpose (the long name should be the field's unabbreviated camelCase variable name).",
482
+ "whenItApplies": "Every field on a `@dbxModel` interface where `@dbxModelVariable` is present and its value equals the field's name (e.g. field `h` tagged `@dbxModelVariable h`, field `ub` tagged `@dbxModelVariable ub`). The tag must always carry the unabbreviated form so the catalog and decoder surface a meaningful long name.",
483
+ "whenItDoesNotApply": "Fields whose name is already the unabbreviated camelCase form (e.g. `name`, `email`, `id`, `at`) — add those to `dbx-mcp.config.json` `modelValidate.ignoredFieldNames` to silence the warning workspace-wide.",
484
+ "canonicalFix": "Replace the tag value with the field's unabbreviated camelCase variable name (e.g. `@dbxModelVariable h` → `@dbxModelVariable hours`, `@dbxModelVariable ub` → `@dbxModelVariable usedBudget`). To exempt fields whose long name legitimately equals the short name, add them to `modelValidate.ignoredFieldNames`."
485
+ },
476
486
  {
477
487
  "code": "MODEL_FIELD_MISSING_JSDOC",
478
488
  "source": "dbx_model_validate",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-components-mcp",
3
- "version": "13.11.5",
3
+ "version": "13.11.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "dbx-components-mcp": "dbx-components-mcp.js"
@@ -15,19 +15,19 @@
15
15
  "@angular/core": "21.2.11",
16
16
  "@angular/forms": "21.2.11",
17
17
  "@angular/material": "^21.2.9",
18
- "@dereekb/dbx-cli": "13.11.5",
19
- "@dereekb/dbx-core": "13.11.5",
20
- "@dereekb/dbx-firebase": "13.11.5",
21
- "@dereekb/dbx-form": "13.11.5",
22
- "@dereekb/dbx-web": "13.11.5",
23
- "@dereekb/firebase": "13.11.5",
24
- "@dereekb/firebase-server": "13.11.5",
25
- "@dereekb/rxjs": "13.11.5",
26
- "@dereekb/util": "13.11.5",
18
+ "@dereekb/dbx-cli": "13.11.6",
19
+ "@dereekb/dbx-core": "13.11.6",
20
+ "@dereekb/dbx-firebase": "13.11.6",
21
+ "@dereekb/dbx-form": "13.11.6",
22
+ "@dereekb/dbx-web": "13.11.6",
23
+ "@dereekb/firebase": "13.11.6",
24
+ "@dereekb/firebase-server": "13.11.6",
25
+ "@dereekb/rxjs": "13.11.6",
26
+ "@dereekb/util": "13.11.6",
27
27
  "@uirouter/angular": "21.0.0",
28
28
  "rxjs": "^7.8.2"
29
29
  },
30
30
  "devDependencies": {
31
- "@dereekb/model": "13.11.5"
31
+ "@dereekb/model": "13.11.6"
32
32
  }
33
33
  }