@expressivecss/mcp-server 0.4.0 → 0.4.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "expressivecss-mcp",
3
3
  "displayName": "ExpressiveCSS MCP",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "description": "ExpressiveCSS workflow server with Setup Expert, Rules Enforcer, Creative Director, Page Arcjitect, Component Syntax Expert, and Quality Inspector.",
6
6
  "author": {
7
7
  "name": "BaezFJ",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "expressivecss-mcp",
3
3
  "displayName": "ExpressiveCSS MCP",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "description": "ExpressiveCSS workflow server with Setup Expert, Rules Enforcer, Creative Director, Page Arcjitect, Component Syntax Expert, and Quality Inspector.",
6
6
  "author": {
7
7
  "name": "BaezFJ",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.1 - 2026-10-14
4
+
5
+ - The catalogue, guides and rules cover keypad and keyboard.
6
+ - Bundled framework guidance: ExpressiveCSS 0.15.0.
7
+
3
8
  ## 0.4.0 - 2026-10-11
4
9
 
5
10
  - Command-output redaction no longer stalls the server on long token runs.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "frameworkVersion": "0.14.1",
4
- "sourceRevision": "e48e958c184d2de2a972028a06c3a03e0e802197",
3
+ "frameworkVersion": "0.15.0",
4
+ "sourceRevision": "5cd5bde4379bebb7873249bd8948879ae76634d9",
5
5
  "basis": "Reviewed checkout snapshot, not proof of published package contents or target-browser conformance. Implemented means only the named scope. Full Material parity remains unassessed.",
6
6
  "browserRun": {
7
7
  "recordedOn": "2026-10-10",
@@ -487,9 +487,9 @@
487
487
  "slug": "stepper",
488
488
  "title": "Stepper",
489
489
  "kind": "component",
490
- "support": "implemented",
490
+ "support": "unassessed",
491
491
  "lastReviewedSupport": "implemented",
492
- "sourceReview": "source-reviewed",
492
+ "sourceReview": "needs-review",
493
493
  "reviewedOn": "2026-10-06",
494
494
  "scope": "Horizontal and vertical ordered lists with current, complete and invalid steps, supporting text, links back to finished steps and a content panel in vertical steps.",
495
495
  "adaptation": "An <ol> with aria-current=\"step\"; CSS alt text speaks the complete and invalid states from translatable tokens.",
@@ -1508,9 +1508,9 @@
1508
1508
  "slug": "data-table",
1509
1509
  "title": "Data table",
1510
1510
  "kind": "component",
1511
- "support": "implemented",
1511
+ "support": "unassessed",
1512
1512
  "lastReviewedSupport": "implemented",
1513
- "sourceReview": "source-reviewed",
1513
+ "sourceReview": "needs-review",
1514
1514
  "reviewedOn": "2026-10-06",
1515
1515
  "scope": "Scrolling wrapper with an outline, sticky header row, numeric columns, dense rows, a sort arrow drawn from aria-sort and checkbox row selection.",
1516
1516
  "adaptation": "A plain div wraps a native <table>, so the table keeps its role; the page owns sorting, select-all and the scroll region name.",
@@ -1708,9 +1708,9 @@
1708
1708
  "slug": "line-chart",
1709
1709
  "title": "Line chart",
1710
1710
  "kind": "component",
1711
- "support": "implemented",
1711
+ "support": "unassessed",
1712
1712
  "lastReviewedSupport": "implemented",
1713
- "sourceReview": "source-reviewed",
1713
+ "sourceReview": "needs-review",
1714
1714
  "reviewedOn": "2026-10-06",
1715
1715
  "scope": "Smooth monotone lines drawn from a figure's data table, with area, stacked, fade and sparkline modifiers, dashed series, gaps, a fixed y range, x labels, a legend, and a pointer and keyboard tooltip.",
1716
1716
  "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the SVG is aria-hidden and the plot is one Tab stop with a polite live tooltip.",
@@ -1783,9 +1783,9 @@
1783
1783
  "slug": "column-chart",
1784
1784
  "title": "Column chart",
1785
1785
  "kind": "component",
1786
- "support": "implemented",
1786
+ "support": "unassessed",
1787
1787
  "lastReviewedSupport": "implemented",
1788
- "sourceReview": "source-reviewed",
1788
+ "sourceReview": "needs-review",
1789
1789
  "reviewedOn": "2026-10-07",
1790
1790
  "scope": "Columns drawn from zero from a figure's data table, grouped by row or stacked, with fade, track and sparkline modifiers, negative values, gaps, a fixed y range, x labels, a legend, and a pointer and keyboard tooltip with a highlight band.",
1791
1791
  "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the columns are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
@@ -1856,9 +1856,9 @@
1856
1856
  "slug": "bar-chart",
1857
1857
  "title": "Bar chart",
1858
1858
  "kind": "component",
1859
- "support": "implemented",
1859
+ "support": "unassessed",
1860
1860
  "lastReviewedSupport": "implemented",
1861
- "sourceReview": "source-reviewed",
1861
+ "sourceReview": "needs-review",
1862
1862
  "reviewedOn": "2026-10-07",
1863
1863
  "scope": "Horizontal bars drawn from zero from a figure's data table, grouped by row or stacked, with split, track, values and sparkline modifiers, negative values, gaps, a fixed value range, row labels, a legend, and a pointer and keyboard tooltip with a highlight band.",
1864
1864
  "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the bars and their values are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
@@ -2079,9 +2079,9 @@
2079
2079
  "slug": "radar-chart",
2080
2080
  "title": "Radar chart",
2081
2081
  "kind": "component",
2082
- "support": "implemented",
2082
+ "support": "unassessed",
2083
2083
  "lastReviewedSupport": "implemented",
2084
- "sourceReview": "source-reviewed",
2084
+ "sourceReview": "needs-review",
2085
2085
  "reviewedOn": "2026-10-07",
2086
2086
  "scope": "Spokes drawn clockwise from the top from a figure's data table, one shape per series from zero in the middle to the scale's top at the rim, row labels past each spoke, a legend for several series, area, points, dashed and sparkline modifiers, data-min and data-max, and a pointer and keyboard tooltip with a cursor spoke.",
2087
2087
  "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the grid, shapes, labels and legend are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
@@ -2152,9 +2152,9 @@
2152
2152
  "slug": "radial-chart",
2153
2153
  "title": "Radial chart",
2154
2154
  "kind": "component",
2155
- "support": "implemented",
2155
+ "support": "unassessed",
2156
2156
  "lastReviewedSupport": "implemented",
2157
- "sourceReview": "source-reviewed",
2157
+ "sourceReview": "needs-review",
2158
2158
  "reviewedOn": "2026-10-07",
2159
2159
  "scope": "Rings drawn clockwise from the top from a figure's data table as a share of data-max, with tracks, a legend of each row's cell for more than one row, gauge and sparkline modifiers, a <tfoot> total in the middle, further columns in the tooltip, and a pointer and keyboard tooltip that highlights the ring.",
2160
2160
  "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the rings, total and legend are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
@@ -2225,9 +2225,9 @@
2225
2225
  "slug": "mixed-chart",
2226
2226
  "title": "Mixed chart",
2227
2227
  "kind": "component",
2228
- "support": "implemented",
2228
+ "support": "unassessed",
2229
2229
  "lastReviewedSupport": "implemented",
2230
- "sourceReview": "source-reviewed",
2230
+ "sourceReview": "needs-review",
2231
2231
  "reviewedOn": "2026-10-07",
2232
2232
  "scope": "Columns, smooth lines and areas drawn per series from a figure's data table by header class, with dashed lines, a second scale for end series with its own fixed range, x labels, a legend, a sparkline modifier, and a pointer and keyboard tooltip with points on the lines.",
2233
2233
  "adaptation": "The <table> stays in the page as the text alternative and the no-JavaScript fallback; the columns and SVG are aria-hidden and the plot is one Tab stop with a polite live tooltip.",
@@ -4680,6 +4680,65 @@
4680
4680
  "Google revises the linked guidance or before claiming a new release matches it"
4681
4681
  ]
4682
4682
  },
4683
+ {
4684
+ "slug": "keypad",
4685
+ "title": "Keypad and Keyboard",
4686
+ "kind": "component",
4687
+ "support": "unassessed",
4688
+ "lastReviewedSupport": "implemented",
4689
+ "sourceReview": "needs-review",
4690
+ "reviewedOn": "2026-10-11",
4691
+ "scope": "A three-column keypad of round keys with two-cell wide keys and a keyboard of rows sized from a column count with an optional number row, typing into the field named by aria-controls with value keys, Backspace, Enter, a one-shot Shift, data-key keys inside the field's wrapper, dial-pad letters, styled call keys, an onKey callback and a pressed shape morph.",
4692
+ "adaptation": "Keys are native buttons in a named group; edits go through the field's value and fire a composed input event, Enter uses requestSubmit() so validation runs, and inputmode=\"none\" on the field keeps the device keyboard closed. Browsers check minlength only on what a person types, so a minimum length is written as pattern.",
4693
+ "upstream": {
4694
+ "source": "https://m3.material.io/components",
4695
+ "reviewedOn": "2026-10-11",
4696
+ "scope": "web-extension-inventory-reviewed",
4697
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
4698
+ "sections": [
4699
+ "No standalone Material component"
4700
+ ],
4701
+ "sources": [],
4702
+ "requirements": "Name the group and every icon key, keep keys from submitting the form, keep the field labelled and usable from a hardware keyboard, and keep keys at a usable target size."
4703
+ },
4704
+ "relationship": "none",
4705
+ "sources": [
4706
+ {
4707
+ "path": "src/sass/components/_keypad.scss",
4708
+ "sha256": "b530b6c62630f0bb86f146db24d4d7b363491355b2f2d3302a34b2274b42bf13"
4709
+ },
4710
+ {
4711
+ "path": "src/ts/components/keypad.ts",
4712
+ "sha256": "074900c8486ebcb978cb33bff7d51c47e1721e738eb593651768c3d17e768752"
4713
+ }
4714
+ ],
4715
+ "gaps": [
4716
+ {
4717
+ "kind": "verification",
4718
+ "description": "Typing at the caret, maxlength, pattern validation on Enter, Backspace including emoji, Enter submitting a form and adding a new line in a textarea, a one-shot Shift with capitals shown, number inputs, disabled fieldsets, in-field keys, shadow roots, focus staying in the field, the keypad grid and wide keys, keyboard key widths and the number row, the pressed shape and destroy are checked in a browser; screen reader output, forced colors, enlarged text and touch devices remain unverified.",
4719
+ "nextStep": "Type a PIN and a message with a screen reader and on a touch device in each engine, and check forced colors and enlarged text."
4720
+ },
4721
+ {
4722
+ "kind": "feature",
4723
+ "description": "There is no caps lock, no symbol layer switching and no highlight of the key a hardware keyboard presses, and minlength does not apply to keypad edits.",
4724
+ "nextStep": "Swap rows from onKey for a symbols key, add caps lock when a page needs it, and write a minimum length as pattern."
4725
+ }
4726
+ ],
4727
+ "browserChecks": [
4728
+ {
4729
+ "file": "tests/keypad-browser.test.js",
4730
+ "name": "chromium: keypad and keyboard type at the caret, edit, submit, shift and lay out their keys",
4731
+ "scope": "Digits typed at the caret, maxlength, focus kept in the field on a pointer press, Backspace including emoji, Enter submitting once, a pattern mismatch blocking Enter, onKey values, composed input events from a shadow root, number, decimal and signed input, a disabled fieldset and its legend, a trailing Backspace in the field that runs once for two keypads, for a field inside its keyboard and for a field rendered after init, a password toggle that is not a key, a prefilled untouched field typed at the end, a caret placed at the start kept for keys activated from the keyboard, Shift showing capitals and releasing after one character, space and a textarea new line, three 72px round keypad columns, a two-cell wide key, a tenth-of-row letter key, the half-key indent, a one-and-a-half-key Shift, the space bar filling its row, a 40px number row that types and that hidden drops, the pressed corner, destroy, and the shared listeners leaving with the last keypad. No spoken-output assertion.",
4732
+ "state": "not-recorded"
4733
+ }
4734
+ ],
4735
+ "browserEvidence": "incomplete",
4736
+ "recheckWhen": [
4737
+ "A reviewed source changes",
4738
+ "A mapped test or its recorded inputs change",
4739
+ "Google revises the linked guidance or before claiming a new release matches it"
4740
+ ]
4741
+ },
4683
4742
  {
4684
4743
  "slug": "questionnaire",
4685
4744
  "title": "Questionnaire",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "generatedBy": "mcp/expressivecss/scripts/sync-guides.mjs",
4
- "frameworkVersion": "0.14.1",
4
+ "frameworkVersion": "0.15.0",
5
5
  "authority": "This catalogue owns component-selection metadata. Component guides own syntax and semantics.json owns authored semantics.",
6
6
  "components": [
7
7
  {
@@ -7203,6 +7203,105 @@
7203
7203
  "inventorySha256": "84c3f0e8819a2d6d186a29cbd2aa7addfe02b901b38f109bec7e3b79f48f7c13"
7204
7204
  }
7205
7205
  },
7206
+ {
7207
+ "slug": "keypad",
7208
+ "title": "Keypad and Keyboard",
7209
+ "aliases": [
7210
+ "keypad",
7211
+ "numeric keypad",
7212
+ "pin pad",
7213
+ "dial pad",
7214
+ "number pad",
7215
+ "on-screen keyboard",
7216
+ "virtual keyboard",
7217
+ "soft keyboard"
7218
+ ],
7219
+ "guideSource": {
7220
+ "pageId": "keypad",
7221
+ "heading": "Keypad and Keyboard",
7222
+ "headingLevel": 2,
7223
+ "semantics": [
7224
+ "keypad"
7225
+ ]
7226
+ },
7227
+ "jobs": [
7228
+ "On-screen keys that type into a text field: a PIN or dial pad, or a full keyboard."
7229
+ ],
7230
+ "useWhen": [
7231
+ "Enter a PIN, phone number or amount on a kiosk or point-of-sale screen with no keyboard of its own."
7232
+ ],
7233
+ "avoidWhen": [
7234
+ "Ordinary forms; the device keyboard is faster. Set inputmode on the text field for a numeric one."
7235
+ ],
7236
+ "alternatives": [
7237
+ "text-fields",
7238
+ "time-picker",
7239
+ "button-groups"
7240
+ ],
7241
+ "adaptive": [],
7242
+ "runtime": "auto-init",
7243
+ "guide": "../components/keypad.md",
7244
+ "materialGuidance": {
7245
+ "status": "framework-extra",
7246
+ "href": null,
7247
+ "implementation": {
7248
+ "source": "llm.md#keypad-and-keyboard",
7249
+ "reviewedOn": "2026-10-11",
7250
+ "documentedSupport": "A three-column keypad of round keys with two-cell wide keys and a keyboard of rows sized from a column count with an optional number row, typing into the field named by aria-controls with value keys, Backspace, Enter, a one-shot Shift, data-key keys inside the field's wrapper, dial-pad letters, styled call keys, an onKey callback and a pressed shape morph.",
7251
+ "webAdaptation": "Keys are native buttons in a named group; edits go through the field's value and fire a composed input event, Enter uses requestSubmit() so validation runs, and inputmode=\"none\" on the field keeps the device keyboard closed. Browsers check minlength only on what a person types, so a minimum length is written as pattern.",
7252
+ "limitations": [
7253
+ "Typing at the caret, maxlength, pattern validation on Enter, Backspace including emoji, Enter submitting a form and adding a new line in a textarea, a one-shot Shift with capitals shown, number inputs, disabled fieldsets, in-field keys, shadow roots, focus staying in the field, the keypad grid and wide keys, keyboard key widths and the number row, the pressed shape and destroy are checked in a browser; screen reader output, forced colors, enlarged text and touch devices remain unverified. There is no caps lock, no symbol layer switching and no hardware key highlighting, and minlength does not apply to keypad edits; the page owns layouts beyond the keys it writes."
7254
+ ]
7255
+ },
7256
+ "relationship": "none",
7257
+ "upstreamReview": {
7258
+ "source": "https://m3.material.io/components",
7259
+ "reviewedOn": "2026-10-11",
7260
+ "scope": "web-extension-inventory-reviewed",
7261
+ "note": "Requirements and boundaries: design reference web-extensions-review. The inventory page renders client-side, so this review relies on the 2026-09-13 inventory review. Full visual parity and spoken output unverified.",
7262
+ "sections": [
7263
+ "No standalone Material component"
7264
+ ],
7265
+ "sources": [],
7266
+ "requirements": "Name the group and every icon key, keep keys from submitting the form, keep the field labelled and usable from a hardware keyboard, and keep keys at a usable target size."
7267
+ },
7268
+ "reason": "Web extension; no dedicated entry was observed in the reviewed current M3 component inventory."
7269
+ },
7270
+ "selectionExample": "A café kiosk asks for a four-digit loyalty PIN with a keypad under a password field. A checkout form on a phone uses a text field with inputmode=\"numeric\" instead.",
7271
+ "capabilityReview": {
7272
+ "reviewedOn": "2026-10-11",
7273
+ "support": "implemented",
7274
+ "sources": [
7275
+ {
7276
+ "path": "src/sass/components/_keypad.scss",
7277
+ "sha256": "b530b6c62630f0bb86f146db24d4d7b363491355b2f2d3302a34b2274b42bf13"
7278
+ },
7279
+ {
7280
+ "path": "src/ts/components/keypad.ts",
7281
+ "sha256": "074900c8486ebcb978cb33bff7d51c47e1721e738eb593651768c3d17e768752"
7282
+ }
7283
+ ],
7284
+ "gaps": [
7285
+ {
7286
+ "kind": "verification",
7287
+ "description": "Typing at the caret, maxlength, pattern validation on Enter, Backspace including emoji, Enter submitting a form and adding a new line in a textarea, a one-shot Shift with capitals shown, number inputs, disabled fieldsets, in-field keys, shadow roots, focus staying in the field, the keypad grid and wide keys, keyboard key widths and the number row, the pressed shape and destroy are checked in a browser; screen reader output, forced colors, enlarged text and touch devices remain unverified.",
7288
+ "nextStep": "Type a PIN and a message with a screen reader and on a touch device in each engine, and check forced colors and enlarged text."
7289
+ },
7290
+ {
7291
+ "kind": "feature",
7292
+ "description": "There is no caps lock, no symbol layer switching and no highlight of the key a hardware keyboard presses, and minlength does not apply to keypad edits.",
7293
+ "nextStep": "Swap rows from onKey for a symbols key, add caps lock when a page needs it, and write a minimum length as pattern."
7294
+ }
7295
+ ],
7296
+ "browserChecks": [
7297
+ {
7298
+ "file": "tests/keypad-browser.test.js",
7299
+ "name": "chromium: keypad and keyboard type at the caret, edit, submit, shift and lay out their keys",
7300
+ "scope": "Digits typed at the caret, maxlength, focus kept in the field on a pointer press, Backspace including emoji, Enter submitting once, a pattern mismatch blocking Enter, onKey values, composed input events from a shadow root, number, decimal and signed input, a disabled fieldset and its legend, a trailing Backspace in the field that runs once for two keypads, for a field inside its keyboard and for a field rendered after init, a password toggle that is not a key, a prefilled untouched field typed at the end, a caret placed at the start kept for keys activated from the keyboard, Shift showing capitals and releasing after one character, space and a textarea new line, three 72px round keypad columns, a two-cell wide key, a tenth-of-row letter key, the half-key indent, a one-and-a-half-key Shift, the space bar filling its row, a 40px number row that types and that hidden drops, the pressed corner, destroy, and the shared listeners leaving with the last keypad. No spoken-output assertion."
7301
+ }
7302
+ ]
7303
+ }
7304
+ },
7206
7305
  {
7207
7306
  "slug": "questionnaire",
7208
7307
  "title": "Questionnaire",
@@ -11204,5 +11303,5 @@
11204
11303
  "inputsUnchanged": true,
11205
11304
  "reportSha256": "901697c1476a6369682ffc54fd0de71c0eed9db9a738b7f16d2c1780956ea287"
11206
11305
  },
11207
- "sourceRevision": "e48e958c184d2de2a972028a06c3a03e0e802197"
11306
+ "sourceRevision": "5cd5bde4379bebb7873249bd8948879ae76634d9"
11208
11307
  }