@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/cli.cjs CHANGED
@@ -34,9 +34,9 @@ var import_server = require("@modelcontextprotocol/sdk/server/index.js");
34
34
 
35
35
  // src/generated/treeui.catalog.json
36
36
  var treeui_catalog_default = {
37
- generatedAt: "0.32.0",
37
+ generatedAt: "0.34.1",
38
38
  packageName: "@treeui/vue",
39
- packageVersion: "0.32.0",
39
+ packageVersion: "0.34.1",
40
40
  decisionGuides: [
41
41
  {
42
42
  id: "single-choice",
@@ -496,7 +496,7 @@ var treeui_catalog_default = {
496
496
  "`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.",
497
497
  "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.",
498
498
  "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.",
499
- "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.",
499
+ "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.",
500
500
  "Keep the icon vocabulary consistent: built-ins use TreeUI's descriptive kebab-case names, so register custom ones with the same convention.",
501
501
  "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.",
502
502
  "Set `to` for the route target on each item \u2014 `TNavMenuItem` has no `href` and no `id`; identity is `value`.",
@@ -821,6 +821,7 @@ var treeui_catalog_default = {
821
821
  "TDropdown",
822
822
  "TFileUpload",
823
823
  "TFormField",
824
+ "TIconTile",
824
825
  "TImage",
825
826
  "TLinkTile",
826
827
  "TMenu",
@@ -828,7 +829,9 @@ var treeui_catalog_default = {
828
829
  "TPopover",
829
830
  "TSelect",
830
831
  "TSkipLink",
832
+ "TStatGroup",
831
833
  "TSteps",
834
+ "TTable",
832
835
  "TTabs",
833
836
  "TText",
834
837
  "TToast",
@@ -913,6 +916,7 @@ var treeui_catalog_default = {
913
916
  "TGrid",
914
917
  "THero",
915
918
  "THide",
919
+ "TIconTile",
916
920
  "TLinkTile",
917
921
  "TList",
918
922
  "TModal",
@@ -927,7 +931,9 @@ var treeui_catalog_default = {
927
931
  "TSplit",
928
932
  "TStack",
929
933
  "TStat",
934
+ "TStatGroup",
930
935
  "TSteps",
936
+ "TTable",
931
937
  "TTabs",
932
938
  "TText",
933
939
  "TTimeline"
@@ -957,6 +963,7 @@ var treeui_catalog_default = {
957
963
  "TColorSwatch",
958
964
  "TDescriptionList",
959
965
  "THero",
966
+ "TIconTile",
960
967
  "TImage",
961
968
  "TInput",
962
969
  "TKeyValueEditor",
@@ -970,6 +977,7 @@ var treeui_catalog_default = {
970
977
  "TSection",
971
978
  "TSelect",
972
979
  "TStat",
980
+ "TStatGroup",
973
981
  "TSwitch",
974
982
  "TTag",
975
983
  "TTagInput",
@@ -1009,7 +1017,7 @@ var treeui_catalog_default = {
1009
1017
  },
1010
1018
  vueSetup: {
1011
1019
  pluginInstall: {
1012
- import: "import TreeUIPlugin from '@treeui/vue'",
1020
+ import: "import { TreeUIPlugin } from '@treeui/vue'",
1013
1021
  usage: "app.use(TreeUIPlugin)"
1014
1022
  },
1015
1023
  individualImports: {
@@ -2976,6 +2984,12 @@ var treeui_catalog_default = {
2976
2984
  storyTitle: "Components/Data Display/Chart",
2977
2985
  manifestFile: "docs/ai/COMPONENTS/chart.yaml",
2978
2986
  props: [
2987
+ {
2988
+ name: "axisValueFormat",
2989
+ type: "(value: number) => string",
2990
+ default: "undefined",
2991
+ 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."
2992
+ },
2979
2993
  {
2980
2994
  name: "yAxisWidth",
2981
2995
  type: "number",
@@ -3126,6 +3140,7 @@ var treeui_catalog_default = {
3126
3140
  "point-click has no keyboard equivalent \u2014 do not make it the only way to reach a behavior."
3127
3141
  ],
3128
3142
  behavior: [
3143
+ "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.",
3129
3144
  "colors_auto_assign_from_chart_palette: --tree-color-chart-1..8, cycling by series index; per-series color overrides",
3130
3145
  "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.",
3131
3146
  "y_domain_uses_nice_ticks: every type runs through niceScale, which rounds the min down and the max up to round numbers",
@@ -3384,6 +3399,7 @@ var treeui_catalog_default = {
3384
3399
  "copy_button_state: The copy button's aria-label reflects the copied state briefly."
3385
3400
  ],
3386
3401
  behavior: [
3402
+ "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.",
3387
3403
  '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"`.'
3388
3404
  ],
3389
3405
  selection: {
@@ -4865,6 +4881,7 @@ var treeui_catalog_default = {
4865
4881
  "Provide a meaningful ariaLabel describing what the chart shows."
4866
4882
  ],
4867
4883
  behavior: [
4884
+ "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.",
4868
4885
  "colors_auto_assign_from_chart_palette: --tree-color-chart-1..8, cycling by visible-segment index; per-segment color overrides",
4869
4886
  "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",
4870
4887
  "hovering_a_legend_row_drives_the_same_highlight: legend items carry the same pointerenter/pointerleave handlers as the segments",
@@ -5438,6 +5455,30 @@ var treeui_catalog_default = {
5438
5455
  storyTitle: "Components/Data Entry/FileUpload",
5439
5456
  manifestFile: "docs/ai/COMPONENTS/file-upload.yaml",
5440
5457
  props: [
5458
+ {
5459
+ name: "uploadingLabel",
5460
+ type: "string",
5461
+ default: "Uploading files",
5462
+ description: "Accessible name for the spinner shown while `loading`."
5463
+ },
5464
+ {
5465
+ name: "uploadedAnnouncement",
5466
+ type: "(name: string) => string",
5467
+ default: "(n) => `${n} uploaded.`",
5468
+ 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."
5469
+ },
5470
+ {
5471
+ name: "failedAnnouncement",
5472
+ type: "(name: string) => string",
5473
+ default: "(n) => `${n} failed.`",
5474
+ description: "The same, for a failure. The error text is appended after it."
5475
+ },
5476
+ {
5477
+ name: "showRejections",
5478
+ type: "boolean",
5479
+ default: "true",
5480
+ 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."
5481
+ },
5441
5482
  {
5442
5483
  name: "clearLabel",
5443
5484
  type: "string",
@@ -5664,6 +5705,7 @@ var treeui_catalog_default = {
5664
5705
  "remove_and_retry_meet_the_44px_target: true"
5665
5706
  ],
5666
5707
  behavior: [
5708
+ "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.",
5667
5709
  "accepts_files_from_input_drop_and_paste: true",
5668
5710
  "multiple_false_replaces_existing_selection: true",
5669
5711
  "accept_maxFiles_and_maxFileSize_apply_to_all_entry_points: true",
@@ -6756,6 +6798,86 @@ var treeui_catalog_default = {
6756
6798
  "branchline-icons"
6757
6799
  ]
6758
6800
  },
6801
+ {
6802
+ name: "TIconTile",
6803
+ aliases: [],
6804
+ package: "@treeui/vue",
6805
+ kind: "display",
6806
+ category: "Data Display",
6807
+ status: "available",
6808
+ purpose: "A registered icon on a toned ground, sized and coloured so the glyph reads at phone size.",
6809
+ sourceFile: "packages/vue/src/components/TIconTile.vue",
6810
+ storyFile: "apps/docs/src/stories/IconTile.stories.ts",
6811
+ storyTitle: "Components/Data Display/IconTile",
6812
+ manifestFile: "docs/ai/COMPONENTS/icon-tile.yaml",
6813
+ props: [
6814
+ {
6815
+ name: "name",
6816
+ type: "TIconName",
6817
+ default: "undefined",
6818
+ description: "Registry name. Use the default slot for a glyph that is not registered."
6819
+ },
6820
+ {
6821
+ name: "tone",
6822
+ type: "TIconTileTone",
6823
+ default: "brand",
6824
+ values: [
6825
+ "brand",
6826
+ "neutral",
6827
+ "success",
6828
+ "warning",
6829
+ "danger",
6830
+ "info"
6831
+ ],
6832
+ 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."
6833
+ },
6834
+ {
6835
+ name: "size",
6836
+ type: "TSize",
6837
+ default: "md",
6838
+ values: [
6839
+ "sm",
6840
+ "md",
6841
+ "lg"
6842
+ ],
6843
+ description: "2rem / 2.75rem / 3.5rem. The glyph steps with the tile (16 / 20 / 24px) so the ink keeps its proportion of the pill."
6844
+ },
6845
+ {
6846
+ name: "label",
6847
+ type: "string",
6848
+ default: "undefined",
6849
+ 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."
6850
+ }
6851
+ ],
6852
+ events: [],
6853
+ slots: [
6854
+ {
6855
+ name: "default"
6856
+ }
6857
+ ],
6858
+ a11y: [
6859
+ "semantic_element: span",
6860
+ '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.',
6861
+ "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."
6862
+ ],
6863
+ behavior: [],
6864
+ selection: {
6865
+ keywords: [],
6866
+ useWhen: [],
6867
+ avoidWhen: [],
6868
+ alternatives: []
6869
+ },
6870
+ setup: {
6871
+ required: [],
6872
+ notes: []
6873
+ },
6874
+ recipes: [],
6875
+ practices: [
6876
+ "accessible-by-default",
6877
+ "content-alignment",
6878
+ "token-driven"
6879
+ ]
6880
+ },
6759
6881
  {
6760
6882
  name: "TImage",
6761
6883
  aliases: [],
@@ -11082,6 +11204,33 @@ var treeui_catalog_default = {
11082
11204
  storyTitle: "Components/Data Display/Stat",
11083
11205
  manifestFile: "docs/ai/COMPONENTS/stat.yaml",
11084
11206
  props: [
11207
+ {
11208
+ name: "variant",
11209
+ type: "TStatVariant",
11210
+ default: "card (plain inside a TStatGroup)",
11211
+ values: [
11212
+ "card",
11213
+ "plain"
11214
+ ],
11215
+ 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."
11216
+ },
11217
+ {
11218
+ name: "metaPlacement",
11219
+ type: "'top' | 'bottom'",
11220
+ default: "top",
11221
+ 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.'
11222
+ },
11223
+ {
11224
+ name: "size",
11225
+ type: "TSize",
11226
+ default: "md",
11227
+ values: [
11228
+ "sm",
11229
+ "md",
11230
+ "lg"
11231
+ ],
11232
+ 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."
11233
+ },
11085
11234
  {
11086
11235
  name: "label",
11087
11236
  type: "string",
@@ -11206,6 +11355,75 @@ var treeui_catalog_default = {
11206
11355
  "token-driven"
11207
11356
  ]
11208
11357
  },
11358
+ {
11359
+ name: "TStatGroup",
11360
+ aliases: [],
11361
+ package: "@treeui/vue",
11362
+ kind: "layout",
11363
+ status: "available",
11364
+ purpose: "A row of indicators sharing one surface, with a hairline between cells.",
11365
+ sourceFile: "packages/vue/src/components/TStatGroup.vue",
11366
+ manifestFile: "docs/ai/COMPONENTS/stat-group.yaml",
11367
+ props: [
11368
+ {
11369
+ name: "label",
11370
+ type: "string",
11371
+ default: "undefined",
11372
+ 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.'
11373
+ },
11374
+ {
11375
+ name: "columns",
11376
+ type: "number",
11377
+ default: "undefined",
11378
+ description: "Fixed track count. Leave unset to let `minItemWidth` decide."
11379
+ },
11380
+ {
11381
+ name: "minItemWidth",
11382
+ type: "string",
11383
+ default: "12rem",
11384
+ description: "Smallest a cell may get before a track is dropped. Same meaning as on TGrid."
11385
+ },
11386
+ {
11387
+ name: "balance",
11388
+ type: "boolean",
11389
+ default: "false",
11390
+ 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."
11391
+ }
11392
+ ],
11393
+ events: [],
11394
+ slots: [
11395
+ {
11396
+ name: "default"
11397
+ }
11398
+ ],
11399
+ a11y: [
11400
+ "semantic_element: div",
11401
+ "role: group",
11402
+ "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."
11403
+ ],
11404
+ behavior: [
11405
+ '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.',
11406
+ "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.",
11407
+ "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.",
11408
+ "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."
11409
+ ],
11410
+ selection: {
11411
+ keywords: [],
11412
+ useWhen: [],
11413
+ avoidWhen: [],
11414
+ alternatives: []
11415
+ },
11416
+ setup: {
11417
+ required: [],
11418
+ notes: []
11419
+ },
11420
+ recipes: [],
11421
+ practices: [
11422
+ "accessible-by-default",
11423
+ "content-alignment",
11424
+ "token-driven"
11425
+ ]
11426
+ },
11209
11427
  {
11210
11428
  name: "TSteps",
11211
11429
  aliases: [
@@ -11435,6 +11653,18 @@ var treeui_catalog_default = {
11435
11653
  storyTitle: "Components/Data Display/Table",
11436
11654
  manifestFile: "docs/ai/COMPONENTS/table.yaml",
11437
11655
  props: [
11656
+ {
11657
+ name: "stackBelow",
11658
+ type: "TBreakpoint",
11659
+ default: "undefined",
11660
+ values: [
11661
+ "sm",
11662
+ "md",
11663
+ "lg",
11664
+ "xl"
11665
+ ],
11666
+ 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."
11667
+ },
11438
11668
  {
11439
11669
  name: "columns",
11440
11670
  type: "TTableColumn[]",
@@ -11481,6 +11711,35 @@ var treeui_catalog_default = {
11481
11711
  type: "(row, index) => 'default' | 'muted'",
11482
11712
  required: false,
11483
11713
  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."
11714
+ },
11715
+ {
11716
+ name: "rowHref",
11717
+ type: "(row: Record<string, unknown>, index: number) => string | undefined",
11718
+ default: "undefined",
11719
+ 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.'
11720
+ },
11721
+ {
11722
+ name: "rowTo",
11723
+ type: "(row: Record<string, unknown>, index: number) => string | undefined",
11724
+ default: "undefined",
11725
+ description: "Same as `rowHref`, resolved through the app's RouterLink instead of a plain `<a>`."
11726
+ },
11727
+ {
11728
+ name: "rowLabel",
11729
+ type: "(row: Record<string, unknown>, index: number) => string",
11730
+ default: "undefined",
11731
+ 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."
11732
+ },
11733
+ {
11734
+ name: "rowActivatable",
11735
+ type: "boolean",
11736
+ default: "false",
11737
+ 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.'
11738
+ },
11739
+ {
11740
+ name: "expandedRow",
11741
+ type: "string | number | null",
11742
+ description: "Key of the row whose detail panel is open, matched against the identity `rowKey` resolves."
11484
11743
  }
11485
11744
  ],
11486
11745
  events: [
@@ -11488,6 +11747,11 @@ var treeui_catalog_default = {
11488
11747
  name: "sort",
11489
11748
  description: "Emitted when a sortable column header is clicked.",
11490
11749
  payload: "TTableSortState"
11750
+ },
11751
+ {
11752
+ name: "row-activate",
11753
+ description: "Emitted when an activatable row is activated without navigating \u2014 see `rowActivatable`.",
11754
+ payload: "[row: Record<string, unknown>, index: number]"
11491
11755
  }
11492
11756
  ],
11493
11757
  slots: [
@@ -11502,6 +11766,10 @@ var treeui_catalog_default = {
11502
11766
  {
11503
11767
  name: "empty",
11504
11768
  description: "Content shown when rows array is empty."
11769
+ },
11770
+ {
11771
+ name: "detail",
11772
+ description: "Detail panel for the expanded row, rendered as a `<tr>` adjacent to its own row. Receives `{ row, index }`."
11505
11773
  }
11506
11774
  ],
11507
11775
  a11y: [
@@ -11512,7 +11780,11 @@ var treeui_catalog_default = {
11512
11780
  "keyboard: Sortable headers are focusable and activated with Enter or Space.",
11513
11781
  "scope: col on all th elements."
11514
11782
  ],
11515
- behavior: [],
11783
+ behavior: [
11784
+ '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.',
11785
+ "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.",
11786
+ "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."
11787
+ ],
11516
11788
  selection: {
11517
11789
  keywords: [
11518
11790
  "table",
@@ -11547,7 +11819,9 @@ var treeui_catalog_default = {
11547
11819
  ],
11548
11820
  practices: [
11549
11821
  "interaction-feedback",
11550
- "state-clarity"
11822
+ "accessible-by-default",
11823
+ "state-clarity",
11824
+ "content-alignment"
11551
11825
  ]
11552
11826
  },
11553
11827
  {
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createTreeuiMcpServer
4
- } from "./chunk-DGIMKZPZ.js";
4
+ } from "./chunk-VPOHUNDH.js";
5
5
 
6
6
  // src/cli.ts
7
7
  import process from "process";