@treeui/mcp 0.8.1 → 0.8.2

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/dist/index.cjs CHANGED
@@ -50,9 +50,9 @@ module.exports = __toCommonJS(index_exports);
50
50
 
51
51
  // src/generated/treeui.catalog.json
52
52
  var treeui_catalog_default = {
53
- generatedAt: "0.32.0",
53
+ generatedAt: "0.34.1",
54
54
  packageName: "@treeui/vue",
55
- packageVersion: "0.32.0",
55
+ packageVersion: "0.34.1",
56
56
  decisionGuides: [
57
57
  {
58
58
  id: "single-choice",
@@ -512,7 +512,7 @@ var treeui_catalog_default = {
512
512
  "`TNavMenuItem.icon` is `TIconInput`, so a component is accepted too. Prefer the name: `items` normally lives in a `ref`, a `computed`, or a route config, and a string is never made reactive \u2014 a component object there needs `markRaw` or Vue warns.",
513
513
  "An item with no icon (or an unregistered name) falls back to a letter marker, and a `console.warn` lists the valid names \u2014 once per name, in production builds too. Give every item an icon before shipping a collapsible rail, or the collapsed state is a column of letters.",
514
514
  "Icons the app needs but TreeUI does not ship are REGISTERED, not worked around: one `registerTreeIcons` call in `main.ts` and they are usable by name everywhere. Never hand-roll an `<svg>` \u2014 without the `absoluteStrokeWidth` correction its stroke scales with the icon (1.67px at size 20, 4px at 48), so it looks bolder than its neighbours at every size above 24.",
515
- "Check the name is not already taken before registering it \u2014 `hasTreeIcon(name)` answers that. Registering one of the 364 built-in names replaces that built-in everywhere, silently, which is a supported swap but never what you want when the goal was adding an icon.",
515
+ "Check the name is not already taken before registering it \u2014 `hasTreeIcon(name)` answers that. Registering one of the 370 built-in names replaces that built-in everywhere, silently, which is a supported swap but never what you want when the goal was adding an icon.",
516
516
  "Keep the icon vocabulary consistent: built-ins use TreeUI's descriptive kebab-case names, so register custom ones with the same convention.",
517
517
  "Icon registration is process-wide state. In component tests that register icons, call `resetTreeIcons()` in an `afterEach` so one case's icons do not leak into the next.",
518
518
  "Set `to` for the route target on each item \u2014 `TNavMenuItem` has no `href` and no `id`; identity is `value`.",
@@ -837,6 +837,7 @@ var treeui_catalog_default = {
837
837
  "TDropdown",
838
838
  "TFileUpload",
839
839
  "TFormField",
840
+ "TIconTile",
840
841
  "TImage",
841
842
  "TLinkTile",
842
843
  "TMenu",
@@ -844,7 +845,9 @@ var treeui_catalog_default = {
844
845
  "TPopover",
845
846
  "TSelect",
846
847
  "TSkipLink",
848
+ "TStatGroup",
847
849
  "TSteps",
850
+ "TTable",
848
851
  "TTabs",
849
852
  "TText",
850
853
  "TToast",
@@ -929,6 +932,7 @@ var treeui_catalog_default = {
929
932
  "TGrid",
930
933
  "THero",
931
934
  "THide",
935
+ "TIconTile",
932
936
  "TLinkTile",
933
937
  "TList",
934
938
  "TModal",
@@ -943,7 +947,9 @@ var treeui_catalog_default = {
943
947
  "TSplit",
944
948
  "TStack",
945
949
  "TStat",
950
+ "TStatGroup",
946
951
  "TSteps",
952
+ "TTable",
947
953
  "TTabs",
948
954
  "TText",
949
955
  "TTimeline"
@@ -973,6 +979,7 @@ var treeui_catalog_default = {
973
979
  "TColorSwatch",
974
980
  "TDescriptionList",
975
981
  "THero",
982
+ "TIconTile",
976
983
  "TImage",
977
984
  "TInput",
978
985
  "TKeyValueEditor",
@@ -986,6 +993,7 @@ var treeui_catalog_default = {
986
993
  "TSection",
987
994
  "TSelect",
988
995
  "TStat",
996
+ "TStatGroup",
989
997
  "TSwitch",
990
998
  "TTag",
991
999
  "TTagInput",
@@ -1025,7 +1033,7 @@ var treeui_catalog_default = {
1025
1033
  },
1026
1034
  vueSetup: {
1027
1035
  pluginInstall: {
1028
- import: "import TreeUIPlugin from '@treeui/vue'",
1036
+ import: "import { TreeUIPlugin } from '@treeui/vue'",
1029
1037
  usage: "app.use(TreeUIPlugin)"
1030
1038
  },
1031
1039
  individualImports: {
@@ -2992,6 +3000,12 @@ var treeui_catalog_default = {
2992
3000
  storyTitle: "Components/Data Display/Chart",
2993
3001
  manifestFile: "docs/ai/COMPONENTS/chart.yaml",
2994
3002
  props: [
3003
+ {
3004
+ name: "axisValueFormat",
3005
+ type: "(value: number) => string",
3006
+ default: "undefined",
3007
+ description: "Formatter for the AXIS ticks only, falling back to `valueFormat`. The two have different jobs and the axis is the one with no room: a tooltip can spell `R$ 1.500.000.000,00` in full, while the same string on a y-axis at 320px eats the plot \u2014 and the space reserved for it is capped at 40% of the chart, so past that it clips. One formatter could not serve both."
3008
+ },
2995
3009
  {
2996
3010
  name: "yAxisWidth",
2997
3011
  type: "number",
@@ -3142,6 +3156,7 @@ var treeui_catalog_default = {
3142
3156
  "point-click has no keyboard equivalent \u2014 do not make it the only way to reach a behavior."
3143
3157
  ],
3144
3158
  behavior: [
3159
+ "edge_x_labels_anchor_with_a_class_not_an_attribute: The first and last x labels carry `is-anchor-start` / `is-anchor-end`, not a `text-anchor` ATTRIBUTE. CSS always beats a presentation attribute, so `.t-chart__axis-label--x { text-anchor: middle }` silently won and the anchoring never applied \u2014 the last label kept rendering centred and hanging off the SVG.",
3145
3160
  "colors_auto_assign_from_chart_palette: --tree-color-chart-1..8, cycling by series index; per-series color overrides",
3146
3161
  "zero_baseline_for_bar_and_area: the y domain is extended to include 0 for bar and area; line uses the data extent. minY overrides it.",
3147
3162
  "y_domain_uses_nice_ticks: every type runs through niceScale, which rounds the min down and the max up to round numbers",
@@ -3400,6 +3415,7 @@ var treeui_catalog_default = {
3400
3415
  "copy_button_state: The copy button's aria-label reflects the copied state briefly."
3401
3416
  ],
3402
3417
  behavior: [
3418
+ "copyable_reserves_the_toolbar_width: With the copy button rendered, `.t-code-block.is-copyable .t-code-block__pre` reserves its width as `padding-inline-end`. The toolbar floats over the code, so a wrapped line used to run underneath it and the characters behind the button were unreadable. This only became visible once `wrap` started breaking for real: before, the long token overflowed sideways and never reached the button.",
3403
3419
  'wrap_reduces_the_min_content: `.t-code-block.is-wrap .t-code-block__pre` uses `overflow-wrap: anywhere`, not `break-word`. `break-word` breaks only once a width is already settled, so wherever the block\'s width came from its content \u2014 a grid `auto` track, a table cell, a flex item without `min-width: 0` \u2014 the longest run without a break opportunity became the minimum width and pushed the container instead of wrapping. That is precisely the case `wrap` exists for: a URL, a token, a credential. Same semantics as `TText wrap="anywhere"`.'
3404
3420
  ],
3405
3421
  selection: {
@@ -4881,6 +4897,7 @@ var treeui_catalog_default = {
4881
4897
  "Provide a meaningful ariaLabel describing what the chart shows."
4882
4898
  ],
4883
4899
  behavior: [
4900
+ "legend_label_is_the_flexible_column: `.t-donut-chart__legend-label` is `flex: 1 1 0` with `min-width: 0` and an ellipsis, and `.t-donut-chart__legend-value` is `flex: 0 0 auto`. A 60-character label used to push the value out of the card. The full text is carried in `title`, since truncation hides data the chart is meant to show.",
4884
4901
  "colors_auto_assign_from_chart_palette: --tree-color-chart-1..8, cycling by visible-segment index; per-segment color overrides",
4885
4902
  "hovering_a_slice_dims_the_rest_and_updates_center: the other segments get is-dimmed, the hovered donut segment grows to thickness + 4, and its legend row gets is-active",
4886
4903
  "hovering_a_legend_row_drives_the_same_highlight: legend items carry the same pointerenter/pointerleave handlers as the segments",
@@ -5454,6 +5471,30 @@ var treeui_catalog_default = {
5454
5471
  storyTitle: "Components/Data Entry/FileUpload",
5455
5472
  manifestFile: "docs/ai/COMPONENTS/file-upload.yaml",
5456
5473
  props: [
5474
+ {
5475
+ name: "uploadingLabel",
5476
+ type: "string",
5477
+ default: "Uploading files",
5478
+ description: "Accessible name for the spinner shown while `loading`."
5479
+ },
5480
+ {
5481
+ name: "uploadedAnnouncement",
5482
+ type: "(name: string) => string",
5483
+ default: "(n) => `${n} uploaded.`",
5484
+ description: "What the live region announces when a file succeeds. A function, because the file name sits inside the sentence and its position differs by language."
5485
+ },
5486
+ {
5487
+ name: "failedAnnouncement",
5488
+ type: "(name: string) => string",
5489
+ default: "(n) => `${n} failed.`",
5490
+ description: "The same, for a failure. The error text is appended after it."
5491
+ },
5492
+ {
5493
+ name: "showRejections",
5494
+ type: "boolean",
5495
+ default: "true",
5496
+ description: "Render the built-in rejection messages. Turn it off when the product already surfaces `files-rejected` in its own alert \u2014 otherwise the user reads the same refusal twice, and the embedded copy is the one that cannot be placed where the product wants it. The event fires either way."
5497
+ },
5457
5498
  {
5458
5499
  name: "clearLabel",
5459
5500
  type: "string",
@@ -5680,6 +5721,7 @@ var treeui_catalog_default = {
5680
5721
  "remove_and_retry_meet_the_44px_target: true"
5681
5722
  ],
5682
5723
  behavior: [
5724
+ "a_rejection_follows_the_active_language: A rejection is held as DATA (the file and the reason) and formatted during render. It used to be stored as its rendered string, frozen at refusal time, so switching language afterwards left the old sentence on screen \u2014 the one piece of copy in this component that could not be retranslated.",
5683
5725
  "accepts_files_from_input_drop_and_paste: true",
5684
5726
  "multiple_false_replaces_existing_selection: true",
5685
5727
  "accept_maxFiles_and_maxFileSize_apply_to_all_entry_points: true",
@@ -6772,6 +6814,86 @@ var treeui_catalog_default = {
6772
6814
  "branchline-icons"
6773
6815
  ]
6774
6816
  },
6817
+ {
6818
+ name: "TIconTile",
6819
+ aliases: [],
6820
+ package: "@treeui/vue",
6821
+ kind: "display",
6822
+ category: "Data Display",
6823
+ status: "available",
6824
+ purpose: "A registered icon on a toned ground, sized and coloured so the glyph reads at phone size.",
6825
+ sourceFile: "packages/vue/src/components/TIconTile.vue",
6826
+ storyFile: "apps/docs/src/stories/IconTile.stories.ts",
6827
+ storyTitle: "Components/Data Display/IconTile",
6828
+ manifestFile: "docs/ai/COMPONENTS/icon-tile.yaml",
6829
+ props: [
6830
+ {
6831
+ name: "name",
6832
+ type: "TIconName",
6833
+ default: "undefined",
6834
+ description: "Registry name. Use the default slot for a glyph that is not registered."
6835
+ },
6836
+ {
6837
+ name: "tone",
6838
+ type: "TIconTileTone",
6839
+ default: "brand",
6840
+ values: [
6841
+ "brand",
6842
+ "neutral",
6843
+ "success",
6844
+ "warning",
6845
+ "danger",
6846
+ "info"
6847
+ ],
6848
+ description: "Selects the `--tree-icon-tile-accent` / `--tree-icon-tile-soft` pair. The ink is the tone's full-strength colour on its own `*-soft` tint, which is the pairing that tint is derived for."
6849
+ },
6850
+ {
6851
+ name: "size",
6852
+ type: "TSize",
6853
+ default: "md",
6854
+ values: [
6855
+ "sm",
6856
+ "md",
6857
+ "lg"
6858
+ ],
6859
+ description: "2rem / 2.75rem / 3.5rem. The glyph steps with the tile (16 / 20 / 24px) so the ink keeps its proportion of the pill."
6860
+ },
6861
+ {
6862
+ name: "label",
6863
+ type: "string",
6864
+ default: "undefined",
6865
+ description: "Accessible name. Omit it when the tile sits beside a heading that already says the same thing \u2014 the glyph is then decoration, and a screen reader reading it twice is noise."
6866
+ }
6867
+ ],
6868
+ events: [],
6869
+ slots: [
6870
+ {
6871
+ name: "default"
6872
+ }
6873
+ ],
6874
+ a11y: [
6875
+ "semantic_element: span",
6876
+ 'role_img_only_when_named: With `label` the tile is `role="img"` with that name; without it, `aria-hidden`. There is no third state where a glyph is announced as nothing.',
6877
+ "contrast_floor: 3:1, measured. An icon is a non-text UI component under WCAG 1.4.11, so the floor is 3:1 and not the 4.5:1 a badge has to clear \u2014 a badge carries a word. `packages/tokens/src/icon-tile-contrast.test.ts` measures every tone in both themes and fails the build below the floor, the same way the badge's own floor is held."
6878
+ ],
6879
+ behavior: [],
6880
+ selection: {
6881
+ keywords: [],
6882
+ useWhen: [],
6883
+ avoidWhen: [],
6884
+ alternatives: []
6885
+ },
6886
+ setup: {
6887
+ required: [],
6888
+ notes: []
6889
+ },
6890
+ recipes: [],
6891
+ practices: [
6892
+ "accessible-by-default",
6893
+ "content-alignment",
6894
+ "token-driven"
6895
+ ]
6896
+ },
6775
6897
  {
6776
6898
  name: "TImage",
6777
6899
  aliases: [],
@@ -11098,6 +11220,33 @@ var treeui_catalog_default = {
11098
11220
  storyTitle: "Components/Data Display/Stat",
11099
11221
  manifestFile: "docs/ai/COMPONENTS/stat.yaml",
11100
11222
  props: [
11223
+ {
11224
+ name: "variant",
11225
+ type: "TStatVariant",
11226
+ default: "card (plain inside a TStatGroup)",
11227
+ values: [
11228
+ "card",
11229
+ "plain"
11230
+ ],
11231
+ description: "Whether the tile draws its own card. `plain` keeps the padding, the type and the tones and drops the border, radius, shadow and background. Inside a `TStatGroup` the default flips to `plain`, because the group owns the surface; an explicit value always wins. A stat drawing its own card inside a TCard is a card within a card \u2014 doubled frame, summed padding, and eight of them read as eight objects rather than one row of figures."
11232
+ },
11233
+ {
11234
+ name: "metaPlacement",
11235
+ type: "'top' | 'bottom'",
11236
+ default: "top",
11237
+ description: 'Where the `meta` note sits. `top` shares the label\'s line; `bottom` puts it under the value, for the reading order of an indicator with a footnote. It is also a height fix: on the shared line a long label and a long note do not fit, the note wraps onto a line of its own ABOVE the value, and that one tile grows \u2014 the grid then stretches the whole row and every sibling shows an empty band. With `bottom` the DOM follows the visual order, so the announced order is label, value, note. Different from `emphasis="value"`, which promotes the FIGURE and takes the label down with it.'
11238
+ },
11239
+ {
11240
+ name: "size",
11241
+ type: "TSize",
11242
+ default: "md",
11243
+ values: [
11244
+ "sm",
11245
+ "md",
11246
+ "lg"
11247
+ ],
11248
+ description: "Density. `sm` lowers the value's floor from 1.5rem to 1.125rem and tightens the padding, which is what lets two stats share a row on a phone \u2014 at the default floor a formatted negative currency does not fit, so a grid of six indicators collapsed into one tall column. The value still scales to its card through the container query, not to the viewport."
11249
+ },
11101
11250
  {
11102
11251
  name: "label",
11103
11252
  type: "string",
@@ -11222,6 +11371,75 @@ var treeui_catalog_default = {
11222
11371
  "token-driven"
11223
11372
  ]
11224
11373
  },
11374
+ {
11375
+ name: "TStatGroup",
11376
+ aliases: [],
11377
+ package: "@treeui/vue",
11378
+ kind: "layout",
11379
+ status: "available",
11380
+ purpose: "A row of indicators sharing one surface, with a hairline between cells.",
11381
+ sourceFile: "packages/vue/src/components/TStatGroup.vue",
11382
+ manifestFile: "docs/ai/COMPONENTS/stat-group.yaml",
11383
+ props: [
11384
+ {
11385
+ name: "label",
11386
+ type: "string",
11387
+ default: "undefined",
11388
+ description: 'Accessible name for the band. Sets `aria-label` on a `role="group"`, so the row is announced as one unit rather than as a run of unrelated figures.'
11389
+ },
11390
+ {
11391
+ name: "columns",
11392
+ type: "number",
11393
+ default: "undefined",
11394
+ description: "Fixed track count. Leave unset to let `minItemWidth` decide."
11395
+ },
11396
+ {
11397
+ name: "minItemWidth",
11398
+ type: "string",
11399
+ default: "12rem",
11400
+ description: "Smallest a cell may get before a track is dropped. Same meaning as on TGrid."
11401
+ },
11402
+ {
11403
+ name: "balance",
11404
+ type: "boolean",
11405
+ default: "false",
11406
+ description: "Let the last row share itself out. Off by default here, unlike TGrid, and deliberately: a stat's value scales to its own cell (`container-type: inline-size`), so a lone cell stretched across the last row prints a number visibly larger than its siblings', and size on a dashboard reads as importance. An orphan beside empty space is the lesser mistake. The real fix for a band is a track count that divides the figures \u2014 set `columns`, or a `minItemWidth` that lands on one."
11407
+ }
11408
+ ],
11409
+ events: [],
11410
+ slots: [
11411
+ {
11412
+ name: "default"
11413
+ }
11414
+ ],
11415
+ a11y: [
11416
+ "semantic_element: div",
11417
+ "role: group",
11418
+ "naming: `label` is what makes the band a named unit. Without it the group has no accessible name and is announced as an unlabelled grouping."
11419
+ ],
11420
+ behavior: [
11421
+ 'children_render_plain_without_being_told: The group provides a context that TStat reads, so every child defaults to `variant="plain"` inside it. The alternative is the consumer repeating `variant="plain"` on all eight, which is the alignment busywork this library exists to absorb \u2014 and which goes wrong on the ninth one added later. An explicit `variant` on a child still wins.',
11422
+ "the_track_is_a_TGrid: Composed, not re-implemented, so `columns`, `minItemWidth` and `balance` behave exactly as they do everywhere else. `gap` is 0: the cells have to meet for the hairline to be a shared edge, and the breathing room comes from each cell's own padding.",
11423
+ "hairlines_survive_reflow: Every cell carries a start and a top line as pseudo-elements, and the track is pulled back one pixel so the outermost pair falls outside the clipped box. A cell that reflows onto a new row keeps its top line and becomes the first of its row, where its start line is the one being clipped \u2014 nothing hanging on the outer edge, nothing doubled between neighbours. `:nth-child` cannot express this, because which cell starts a row depends on a track count only the browser knows.",
11424
+ "pseudo_elements_not_borders: A border would land on the child's own `border-width`. The contract is that a cell in a band measures as frameless from the outside \u2014 `border-width` is actually 0 \u2014 so the lines are drawn beside the cell rather than on it."
11425
+ ],
11426
+ selection: {
11427
+ keywords: [],
11428
+ useWhen: [],
11429
+ avoidWhen: [],
11430
+ alternatives: []
11431
+ },
11432
+ setup: {
11433
+ required: [],
11434
+ notes: []
11435
+ },
11436
+ recipes: [],
11437
+ practices: [
11438
+ "accessible-by-default",
11439
+ "content-alignment",
11440
+ "token-driven"
11441
+ ]
11442
+ },
11225
11443
  {
11226
11444
  name: "TSteps",
11227
11445
  aliases: [
@@ -11451,6 +11669,18 @@ var treeui_catalog_default = {
11451
11669
  storyTitle: "Components/Data Display/Table",
11452
11670
  manifestFile: "docs/ai/COMPONENTS/table.yaml",
11453
11671
  props: [
11672
+ {
11673
+ name: "stackBelow",
11674
+ type: "TBreakpoint",
11675
+ default: "undefined",
11676
+ values: [
11677
+ "sm",
11678
+ "md",
11679
+ "lg",
11680
+ "xl"
11681
+ ],
11682
+ description: "Below this CONTAINER width the grid becomes one block per row: the column marked `stack=\"title\"` is the block's heading, the rest sit under it, and each value carries its column's label because the header row is gone. Above it the table is unchanged, horizontal scroll included. Measured on the wrapper and not the viewport \u2014 a table can sit in a narrow panel on a wide screen, which is the case a media query cannot see. A breakpoint name and not a free length: a container query cannot read a custom property in its condition, so an arbitrary value would need a ResizeObserver per table."
11683
+ },
11454
11684
  {
11455
11685
  name: "columns",
11456
11686
  type: "TTableColumn[]",
@@ -11497,6 +11727,35 @@ var treeui_catalog_default = {
11497
11727
  type: "(row, index) => 'default' | 'muted'",
11498
11728
  required: false,
11499
11729
  description: "Semantic per-row state applied by data, not position, so it survives sorting. `muted` recesses a row (e.g. a resource that no longer exists) via `t-table__row--muted`, written at compound specificity so it wins over the zebra/hover rules."
11730
+ },
11731
+ {
11732
+ name: "rowHref",
11733
+ type: "(row: Record<string, unknown>, index: number) => string | undefined",
11734
+ default: "undefined",
11735
+ description: 'The row NAVIGATES: a real `href` per row, rendered as an `<a>` in the first cell and stretched over the whole row via `::after`, so ctrl/middle-click, "open in new tab", and the status-bar URL all work and the accessible role is `link`. Mutually exclusive with `rowTo` and `rowActivatable` \u2014 dev builds warn. The affordance follows the RESOLVED target: a row whose function returns `undefined` renders no link and gets no pointer.'
11736
+ },
11737
+ {
11738
+ name: "rowTo",
11739
+ type: "(row: Record<string, unknown>, index: number) => string | undefined",
11740
+ default: "undefined",
11741
+ description: "Same as `rowHref`, resolved through the app's RouterLink instead of a plain `<a>`."
11742
+ },
11743
+ {
11744
+ name: "rowLabel",
11745
+ type: "(row: Record<string, unknown>, index: number) => string",
11746
+ default: "undefined",
11747
+ description: "Accessible name for the row's activator, per row \u2014 used by BOTH `rowHref`/`rowTo` and `rowActivatable`. Required with the former and strongly advised with the latter: without it the name is every cell concatenated, repeated for every row."
11748
+ },
11749
+ {
11750
+ name: "rowActivatable",
11751
+ type: "boolean",
11752
+ default: "false",
11753
+ description: 'The row ACTIVATES something that is not a route \u2014 a modal, a selection. Renders a real `<button>` in the first cell, stretched over the row the same way `rowHref` does, rather than `role="button"` on the `<tr>`, which would make every cell presentational and destroy the table\'s grid semantics. Mutually exclusive with `rowHref`/`rowTo` \u2014 dev builds warn.'
11754
+ },
11755
+ {
11756
+ name: "expandedRow",
11757
+ type: "string | number | null",
11758
+ description: "Key of the row whose detail panel is open, matched against the identity `rowKey` resolves."
11500
11759
  }
11501
11760
  ],
11502
11761
  events: [
@@ -11504,6 +11763,11 @@ var treeui_catalog_default = {
11504
11763
  name: "sort",
11505
11764
  description: "Emitted when a sortable column header is clicked.",
11506
11765
  payload: "TTableSortState"
11766
+ },
11767
+ {
11768
+ name: "row-activate",
11769
+ description: "Emitted when an activatable row is activated without navigating \u2014 see `rowActivatable`.",
11770
+ payload: "[row: Record<string, unknown>, index: number]"
11507
11771
  }
11508
11772
  ],
11509
11773
  slots: [
@@ -11518,6 +11782,10 @@ var treeui_catalog_default = {
11518
11782
  {
11519
11783
  name: "empty",
11520
11784
  description: "Content shown when rows array is empty."
11785
+ },
11786
+ {
11787
+ name: "detail",
11788
+ description: "Detail panel for the expanded row, rendered as a `<tr>` adjacent to its own row. Receives `{ row, index }`."
11521
11789
  }
11522
11790
  ],
11523
11791
  a11y: [
@@ -11528,7 +11796,11 @@ var treeui_catalog_default = {
11528
11796
  "keyboard: Sortable headers are focusable and activated with Enter or Space.",
11529
11797
  "scope: col on all th elements."
11530
11798
  ],
11531
- behavior: [],
11799
+ behavior: [
11800
+ 'roles_are_declared_rather_than_implied: `role` is on the table, both rowgroups, every row, every column header and every cell. Each is the element\'s own implicit role, so nothing changes while `display: table` holds \u2014 they exist to survive stacked mode, where `display: block` drops the implicit table semantics in several screen readers and the block would be announced as a run of unrelated text. Measured in the accessibility tree: a stacked cell reads as "Saldo real R$ 1.284,30", carrying its column.',
11801
+ "containment_is_scoped_to_tables_that_use_it: `container-type: inline-size` applies `contain: layout inline-size style`, so it is set only on a wrapper carrying a `stack-below` modifier rather than on every table in the library.",
11802
+ "a_row_link_covers_the_whole_block: Outside stacked mode every cell after the first is raised above the stretched-link overlay, because those are neighbouring columns and one may hold a button. Stacked, those same cells are plain text under the title, and raising them punched a hole in the link. Inside the container query only cells that actually contain something focusable are raised \u2014 and never the first, which holds the overlay: positioning it makes it the overlay's containing block, and `inset: 0` then covers that cell alone."
11803
+ ],
11532
11804
  selection: {
11533
11805
  keywords: [
11534
11806
  "table",
@@ -11563,7 +11835,9 @@ var treeui_catalog_default = {
11563
11835
  ],
11564
11836
  practices: [
11565
11837
  "interaction-feedback",
11566
- "state-clarity"
11838
+ "accessible-by-default",
11839
+ "state-clarity",
11840
+ "content-alignment"
11567
11841
  ]
11568
11842
  },
11569
11843
  {
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  searchComponents,
12
12
  searchRecipes,
13
13
  searchTokens
14
- } from "./chunk-DGIMKZPZ.js";
14
+ } from "./chunk-VPOHUNDH.js";
15
15
 
16
16
  // src/catalog-source.ts
17
17
  import fs from "fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treeui/mcp",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "Model Context Protocol server and AI catalog for TreeUI.",
5
5
  "license": "MIT",
6
6
  "author": "TreeUI",
@@ -39,7 +39,7 @@
39
39
  "dist"
40
40
  ],
41
41
  "dependencies": {
42
- "@modelcontextprotocol/sdk": "^1.30.1",
42
+ "@modelcontextprotocol/sdk": "^1.31.0",
43
43
  "yaml": "^2.9.1"
44
44
  },
45
45
  "scripts": {