@treeui/mcp 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CEDY3OJ4.js → chunk-DGIMKZPZ.js} +443 -115
- package/dist/cli.cjs +443 -115
- package/dist/cli.js +1 -1
- package/dist/index.cjs +455 -120
- package/dist/index.js +13 -6
- package/package.json +3 -3
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.
|
|
37
|
+
generatedAt: "0.32.0",
|
|
38
38
|
packageName: "@treeui/vue",
|
|
39
|
-
packageVersion: "0.
|
|
39
|
+
packageVersion: "0.32.0",
|
|
40
40
|
decisionGuides: [
|
|
41
41
|
{
|
|
42
42
|
id: "single-choice",
|
|
@@ -159,7 +159,7 @@ var treeui_catalog_default = {
|
|
|
159
159
|
],
|
|
160
160
|
notes: [
|
|
161
161
|
"Editing, not display. For read-only key/value display use TDescriptionList.",
|
|
162
|
-
"A write-only/sensitive mode (value never read back) is a
|
|
162
|
+
"A write-only/sensitive mode (value never read back) is a designed contract that is not yet shipped."
|
|
163
163
|
]
|
|
164
164
|
},
|
|
165
165
|
{
|
|
@@ -457,8 +457,8 @@ var treeui_catalog_default = {
|
|
|
457
457
|
"Put the lockup in the `header-start` slot, not `header`. Filling `header-start` switches the header to the shell's own grid, so the mark tracks `--tree-app-shell-sidebar-width` and animates with the collapse \u2014 no local column math.",
|
|
458
458
|
'The slot is scoped: use its `collapsed` binding to drop the wordmark and keep only the mark (`v-if="!collapsed"`), rather than hiding text with CSS.',
|
|
459
459
|
'Logo is `TAvatar` (`size`, `alt`, `initials` fallback) or a plain `<img>` sized with `--tree-size-icon-*`; name and subtitle are `TText` (`weight`, `tone="muted"`, `truncate`) \u2014 never raw `<strong>`/`<span>` with a local class.',
|
|
460
|
-
"TreeUI ships no `TBrand` component on purpose: the logo asset, the product name, and what survives collapse are product identity, which must stay in the
|
|
461
|
-
"Company and service logos
|
|
460
|
+
"TreeUI ships no `TBrand` component on purpose: the logo asset, the product name, and what survives collapse are product identity, which must stay in the consuming application. See DECISIONS.md \u2192 Portability Boundary.",
|
|
461
|
+
"Company and service logos are brand assets, not TreeUI icons \u2014 source them from your own brand assets rather than the icon registry."
|
|
462
462
|
]
|
|
463
463
|
},
|
|
464
464
|
{
|
|
@@ -804,28 +804,38 @@ var treeui_catalog_default = {
|
|
|
804
804
|
"Tab/Shift+Tab order, Escape to close, Enter/Space to activate, arrow keys where the pattern expects them.",
|
|
805
805
|
"Overlays trap focus while open and restore it on close.",
|
|
806
806
|
"Clickable targets stay at or above 44\xD744px.",
|
|
807
|
-
"Form control boundaries clear 3:1 against every surface (WCAG 1.4.11); decorative edges are a separate token and are not held to it."
|
|
807
|
+
"Form control boundaries clear 3:1 against every surface (WCAG 1.4.11); decorative edges are a separate token and are not held to it.",
|
|
808
|
+
"A panel anchored to a trigger is rendered in a layer no ancestor can clip, and is pushed back inside the viewport \u2014 a control that is painted off-screen or behind a clip is not operable.",
|
|
809
|
+
"Every string a screen reader announces is a prop with a default, never a hard-coded literal; a control whose only name is English is unusable in any other language."
|
|
808
810
|
],
|
|
809
811
|
components: [
|
|
810
|
-
"TModal",
|
|
811
|
-
"TDrawer",
|
|
812
|
-
"TConfirmDialog",
|
|
813
|
-
"TDropdown",
|
|
814
|
-
"TTooltip",
|
|
815
812
|
"TAccordion",
|
|
816
|
-
"
|
|
817
|
-
"TTreeView",
|
|
818
|
-
"TToastProvider",
|
|
813
|
+
"TAppShell",
|
|
819
814
|
"TButton",
|
|
815
|
+
"TCanvasSurface",
|
|
816
|
+
"TCheckbox",
|
|
820
817
|
"TCodeBlock",
|
|
818
|
+
"TConfirmDialog",
|
|
819
|
+
"TDatePicker",
|
|
820
|
+
"TDrawer",
|
|
821
|
+
"TDropdown",
|
|
822
|
+
"TFileUpload",
|
|
823
|
+
"TFormField",
|
|
824
|
+
"TImage",
|
|
821
825
|
"TLinkTile",
|
|
822
826
|
"TMenu",
|
|
827
|
+
"TModal",
|
|
823
828
|
"TPopover",
|
|
824
|
-
"
|
|
829
|
+
"TSelect",
|
|
825
830
|
"TSkipLink",
|
|
826
|
-
"
|
|
827
|
-
"
|
|
828
|
-
"TText"
|
|
831
|
+
"TSteps",
|
|
832
|
+
"TTabs",
|
|
833
|
+
"TText",
|
|
834
|
+
"TToast",
|
|
835
|
+
"TToastProvider",
|
|
836
|
+
"TToggleGroup",
|
|
837
|
+
"TTooltip",
|
|
838
|
+
"TTreeView"
|
|
829
839
|
]
|
|
830
840
|
},
|
|
831
841
|
{
|
|
@@ -885,26 +895,42 @@ var treeui_catalog_default = {
|
|
|
885
895
|
"Spacing comes from the --tree-space-* scale, applied by layout components.",
|
|
886
896
|
"Compose TPage, TStack, TGrid, and TSplit before writing a custom layout div.",
|
|
887
897
|
"Forms align through TFormField + TStack + TGrid \u2014 labels, hints, and errors line up by contract.",
|
|
888
|
-
"Reading widths and page gutters come from TContainer/TPage, not local max-widths."
|
|
898
|
+
"Reading widths and page gutters come from TContainer/TPage, not local max-widths.",
|
|
899
|
+
"A surface takes its container's width: it never grows to the min-content of something inside it. Card, modal and timeline surfaces declare an explicit minmax(0, 1fr) track, and text that can lack a break opportunity wraps, so scrolling and truncation belong to the descendant that asked for them \u2014 never to every sibling on the surface."
|
|
889
900
|
],
|
|
890
901
|
components: [
|
|
891
|
-
"
|
|
892
|
-
"
|
|
893
|
-
"TSplit",
|
|
894
|
-
"TContainer",
|
|
895
|
-
"TSpacer",
|
|
896
|
-
"TPage",
|
|
897
|
-
"TPageHeader",
|
|
898
|
-
"TFormField",
|
|
902
|
+
"TAppShell",
|
|
903
|
+
"TBadge",
|
|
899
904
|
"TBrandLockup",
|
|
900
|
-
"
|
|
905
|
+
"TCanvasSurface",
|
|
906
|
+
"TCard",
|
|
907
|
+
"TCodeBlock",
|
|
908
|
+
"TConfirmDialog",
|
|
909
|
+
"TContainer",
|
|
901
910
|
"TDescriptionList",
|
|
902
|
-
"
|
|
911
|
+
"TEmptyState",
|
|
912
|
+
"TFormField",
|
|
913
|
+
"TGrid",
|
|
903
914
|
"THero",
|
|
915
|
+
"THide",
|
|
916
|
+
"TLinkTile",
|
|
917
|
+
"TList",
|
|
918
|
+
"TModal",
|
|
919
|
+
"TNavMenu",
|
|
920
|
+
"TPage",
|
|
921
|
+
"TPageHeader",
|
|
904
922
|
"TPageSurface",
|
|
923
|
+
"TSection",
|
|
905
924
|
"TShow",
|
|
906
|
-
"
|
|
907
|
-
"
|
|
925
|
+
"TSpacer",
|
|
926
|
+
"TSparkline",
|
|
927
|
+
"TSplit",
|
|
928
|
+
"TStack",
|
|
929
|
+
"TStat",
|
|
930
|
+
"TSteps",
|
|
931
|
+
"TTabs",
|
|
932
|
+
"TText",
|
|
933
|
+
"TTimeline"
|
|
908
934
|
]
|
|
909
935
|
},
|
|
910
936
|
{
|
|
@@ -951,6 +977,24 @@ var treeui_catalog_default = {
|
|
|
951
977
|
"TTextarea",
|
|
952
978
|
"TToast"
|
|
953
979
|
]
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
id: "branchline-icons",
|
|
983
|
+
title: "Icons drawn to a contract",
|
|
984
|
+
summary: "Branchline is the drawing contract behind every shipped icon: one grid, one weight, one closed modifier vocabulary. It is checked rather than reviewed \u2014 the build renders each glyph and fails when two names look alike at 16px or when a shape draws nothing.",
|
|
985
|
+
rules: [
|
|
986
|
+
"One grid: a 24x24 canvas with geometry inside a 1.5-22.5 trim area, so a 2u stroke never clips; four keylines carry the set \u2014 square 17.5, circle 18.5 diameter, wide 18x14, tall 14x18 \u2014 and positions land on a 0.25u step.",
|
|
987
|
+
"One weight: 2u stroke, round caps and joins, currentColor and fill=none, all declared on the root <svg>. A child that sets stroke or fill breaks absoluteStrokeWidth and fails the build.",
|
|
988
|
+
"Legible at the size it ships at: every pair of canonical icons is rendered at 16px and must differ by at least 5% of its ink. The rule is measured by branchline.test.ts, not judged by eye.",
|
|
989
|
+
"A modifier gets territory of its own, and the base keeps its size: it is drawn inside bases that enclose space (shield, file, folder, calendar, ticket, message, square, badge, search) and in a cleared corner otherwise, where the base is redrawn at full size with that corner interrupted so 5.5u of canvas stays clear around the mark.",
|
|
990
|
+
"Every shape earns its place: each node is removed and re-rendered, and a node that changes less than 1% of the glyph's ink fails the build. Geometry is never derived from the icon's name.",
|
|
991
|
+
"A family shares one base, drawn once and reused literally; a variant changes exactly one thing, in one place, by one rule.",
|
|
992
|
+
"The metaphor is the conventional one \u2014 an icon is not the place to be original. A concept with no settled picture composes one from Branchline primitives, drawn deliberately rather than generated.",
|
|
993
|
+
"One concept, one canonical name, one drawing. A synonym is an alias that shares its target's geometry byte for byte, so mic and microphone can never drift apart."
|
|
994
|
+
],
|
|
995
|
+
components: [
|
|
996
|
+
"TIcon"
|
|
997
|
+
]
|
|
954
998
|
}
|
|
955
999
|
],
|
|
956
1000
|
setup: {
|
|
@@ -1588,7 +1632,7 @@ var treeui_catalog_default = {
|
|
|
1588
1632
|
name: "showCollapseButton",
|
|
1589
1633
|
type: "boolean",
|
|
1590
1634
|
default: "true",
|
|
1591
|
-
note: "Renders the built-in collapse toggle in the sidebar footer. Desktop only, and only when `collapsible` is set \u2014 no need to wire your own. Never rendered in the mobile drawer."
|
|
1635
|
+
note: "Renders the built-in collapse toggle in the sidebar footer. Desktop only, and only when `collapsible` is set \u2014 no need to wire your own. Never rendered in the mobile drawer, and never inside the auto-rail band (between `breakpoint` and `railBreakpoint`): there the width decides the state, so the button could not change anything, did nothing when pressed, and announced the manual preference instead of what was on screen. Its `aria-expanded` and `aria-label` are derived from the EFFECTIVE collapsed state, as the glyph already was."
|
|
1592
1636
|
},
|
|
1593
1637
|
{
|
|
1594
1638
|
name: "collapseLabel",
|
|
@@ -1672,7 +1716,7 @@ var treeui_catalog_default = {
|
|
|
1672
1716
|
},
|
|
1673
1717
|
{
|
|
1674
1718
|
name: "header-end",
|
|
1675
|
-
description: "Trailing header region for actions/controls, pinned to the far end of the row. Filling it adds `has-end`; in the plain flex header the content region's grow already pushes it to the end, and in the `has-start` grid it becomes a content-sized third column with the trailing padding.
|
|
1719
|
+
description: "Trailing header region for actions/controls, pinned to the far end of the row. Filling it adds `has-end`; in the plain flex header the content region's grow already pushes it to the end, and in the `has-start` grid it becomes a content-sized third column with the trailing padding. Trailing alignment is the shell's own job, so header actions need no `TStack justify=flex-end` wrapper around them.\n",
|
|
1676
1720
|
note: "AppShellSlotProps"
|
|
1677
1721
|
},
|
|
1678
1722
|
{
|
|
@@ -1726,6 +1770,7 @@ var treeui_catalog_default = {
|
|
|
1726
1770
|
"menu_and_drawer_close_buttons_are_44px: true"
|
|
1727
1771
|
],
|
|
1728
1772
|
behavior: [
|
|
1773
|
+
"scroller_is_a_containing_block: `.t-app-shell__main` (and `.t-app-shell__sidebar-body`) carry `position: relative`. Without it an absolutely positioned descendant with auto insets \u2014 `.t-visually-hidden`, which this library itself uses for the TProgress label \u2014 anchored to the initial block instead of the panel: it was neither clipped nor scrolled with the panel, and it extended the DOCUMENT's scroll. The shell is `100dvh`, so the document is not supposed to scroll at all; it did, leaving an empty band below the shell.",
|
|
1729
1774
|
"fills_viewport_full_width_and_height: true",
|
|
1730
1775
|
"resets_body_margin_while_a_shell_is_mounted: body:has(.t-app-shell) { margin: 0 } \u2014 a deliberate global rule, scoped so it only applies to pages that mount a shell",
|
|
1731
1776
|
"header_spans_full_width_above_sidebar_and_content: true",
|
|
@@ -1813,7 +1858,8 @@ var treeui_catalog_default = {
|
|
|
1813
1858
|
"brand-lockup"
|
|
1814
1859
|
],
|
|
1815
1860
|
practices: [
|
|
1816
|
-
"accessible-by-default"
|
|
1861
|
+
"accessible-by-default",
|
|
1862
|
+
"content-alignment"
|
|
1817
1863
|
]
|
|
1818
1864
|
},
|
|
1819
1865
|
{
|
|
@@ -2024,6 +2070,18 @@ var treeui_catalog_default = {
|
|
|
2024
2070
|
"lg"
|
|
2025
2071
|
],
|
|
2026
2072
|
description: "Changes min-height and font-size only; inline padding is constant across sizes."
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
name: "truncate",
|
|
2076
|
+
type: "boolean",
|
|
2077
|
+
default: "false",
|
|
2078
|
+
description: "Keep the label on one line and clip it with an ellipsis. Opt-in: the default is to wrap, because a status pill that silently loses the end of its text is worse than a two-line pill. Pass `label` alongside it so the full text reaches the `title` tooltip."
|
|
2079
|
+
},
|
|
2080
|
+
{
|
|
2081
|
+
name: "label",
|
|
2082
|
+
type: "string",
|
|
2083
|
+
default: "undefined",
|
|
2084
|
+
description: "The badge text. Only needed with `truncate`, which puts it in `title`; otherwise use the default slot."
|
|
2027
2085
|
}
|
|
2028
2086
|
],
|
|
2029
2087
|
events: [],
|
|
@@ -2046,8 +2104,10 @@ var treeui_catalog_default = {
|
|
|
2046
2104
|
"tone_remaps_variant_color_variables: true",
|
|
2047
2105
|
"tone_overrides_variant_danger_palette: true",
|
|
2048
2106
|
"tone_neutral_has_no_stylesheet_rule: true",
|
|
2107
|
+
'tint_ink_is_the_on_soft_token: The `soft` and `danger` variants paint their label with the tone\'s `*-on-soft` colour, never the tone\'s full-strength colour. `*-on-soft` is derived to clear AA on that exact tint and deepens as the tint deepens; the full-strength tone on its own tint measured below AA for eight of the ten tone/theme pairs, including `variant="soft" tone="neutral"`, which is both defaults. The mapping is declared in `@treeui/tokens` as `NATIVE_BADGE_TONES` and the stylesheet is tested against it.',
|
|
2049
2108
|
"icon_wrapper_rendered_only_when_slot_filled: true",
|
|
2050
|
-
"icon_renders_before_default_slot: true"
|
|
2109
|
+
"icon_renders_before_default_slot: true",
|
|
2110
|
+
"never_wider_than_its_container: The badge carries `max-inline-size: 100%` and `min-inline-size: 0`, so a long label wraps inside the container instead of pushing it. Wrapped lines use the UI line height with block padding rather than `line-height: 1`, at which a second line's ascenders touched the pill's border."
|
|
2051
2111
|
],
|
|
2052
2112
|
selection: {
|
|
2053
2113
|
keywords: [],
|
|
@@ -2065,6 +2125,7 @@ var treeui_catalog_default = {
|
|
|
2065
2125
|
practices: [
|
|
2066
2126
|
"predictable-api",
|
|
2067
2127
|
"state-clarity",
|
|
2128
|
+
"content-alignment",
|
|
2068
2129
|
"token-driven"
|
|
2069
2130
|
]
|
|
2070
2131
|
},
|
|
@@ -2255,7 +2316,7 @@ var treeui_catalog_default = {
|
|
|
2255
2316
|
name: "href",
|
|
2256
2317
|
type: "string",
|
|
2257
2318
|
default: "undefined",
|
|
2258
|
-
note: 'Anchor attributes (`href`, `target`, `rel`, `download`) are declared props and are only rendered when `as="a"`. They were fallthrough before, which typechecked as an error in a consumer\'s `strictTemplates` build even though a link button is the documented use of `as
|
|
2319
|
+
note: 'Anchor attributes (`href`, `target`, `rel`, `download`) are declared props and are only rendered when `as="a"`. They were fallthrough before, which typechecked as an error in a consumer\'s `strictTemplates` build even though a link button is the documented use of `as`.\n'
|
|
2259
2320
|
},
|
|
2260
2321
|
{
|
|
2261
2322
|
name: "target",
|
|
@@ -2670,6 +2731,116 @@ var treeui_catalog_default = {
|
|
|
2670
2731
|
recipes: [],
|
|
2671
2732
|
practices: []
|
|
2672
2733
|
},
|
|
2734
|
+
{
|
|
2735
|
+
name: "TCanvasSurface",
|
|
2736
|
+
aliases: [],
|
|
2737
|
+
package: "@treeui/vue",
|
|
2738
|
+
kind: "data-display",
|
|
2739
|
+
category: "Data Display",
|
|
2740
|
+
status: "available",
|
|
2741
|
+
purpose: "A sized, repaintable, hit-testable canvas for a data-driven drawing \u2014 a diagram, a graph, a custom plot.",
|
|
2742
|
+
sourceFile: "packages/vue/src/components/TCanvasSurface.vue",
|
|
2743
|
+
storyFile: "apps/docs/src/stories/CanvasSurface.stories.ts",
|
|
2744
|
+
storyTitle: "Components/Data Display/Canvas Surface",
|
|
2745
|
+
manifestFile: "docs/ai/COMPONENTS/canvas-surface.yaml",
|
|
2746
|
+
props: [
|
|
2747
|
+
{
|
|
2748
|
+
name: "draw",
|
|
2749
|
+
type: "(frame: CanvasSurfaceFrame) => void",
|
|
2750
|
+
required: true,
|
|
2751
|
+
note: "Paints the whole surface. Called on mount, on resize and on every `redraw()`. The context arrives already scaled to CSS pixels, so the drawing never does device-ratio arithmetic; it is expected to clear what it does not repaint.\n"
|
|
2752
|
+
},
|
|
2753
|
+
{
|
|
2754
|
+
name: "height",
|
|
2755
|
+
type: "number | string",
|
|
2756
|
+
default: "320",
|
|
2757
|
+
note: "Number is px, string is any CSS length. A diagram has no intrinsic height, so it is declared."
|
|
2758
|
+
},
|
|
2759
|
+
{
|
|
2760
|
+
name: "cursor",
|
|
2761
|
+
type: "string",
|
|
2762
|
+
default: "undefined",
|
|
2763
|
+
note: "Pointer over the surface. This cannot come from a stylesheet: the sensitive area is a rectangle inside the bitmap and no selector knows where it is. Bind it to whatever the consumer's hit-test just decided.\n"
|
|
2764
|
+
},
|
|
2765
|
+
{
|
|
2766
|
+
name: "maxPixelRatio",
|
|
2767
|
+
type: "number",
|
|
2768
|
+
default: "2"
|
|
2769
|
+
},
|
|
2770
|
+
{
|
|
2771
|
+
name: "ariaLabel",
|
|
2772
|
+
type: "string",
|
|
2773
|
+
default: "undefined",
|
|
2774
|
+
note: "Sets role=img. A bitmap says nothing on its own."
|
|
2775
|
+
},
|
|
2776
|
+
{
|
|
2777
|
+
name: "redrawKey",
|
|
2778
|
+
type: "unknown",
|
|
2779
|
+
default: "undefined",
|
|
2780
|
+
note: "Repaint whenever this changes \u2014 pass the data, a version counter, or the theme. Deep-watched."
|
|
2781
|
+
}
|
|
2782
|
+
],
|
|
2783
|
+
events: [],
|
|
2784
|
+
slots: [
|
|
2785
|
+
{
|
|
2786
|
+
name: "default",
|
|
2787
|
+
description: "The long form of the drawing \u2014 a list, a table, the same data as markup. It lives inside the `<canvas>` element, which the browser exposes to assistive technology and never paints.\n"
|
|
2788
|
+
}
|
|
2789
|
+
],
|
|
2790
|
+
a11y: [
|
|
2791
|
+
"Give it an ariaLabel; a canvas is opaque to assistive technology.",
|
|
2792
|
+
"Put the same information in the default slot as markup \u2014 it is the accessible form, not a fallback.",
|
|
2793
|
+
"Anything clickable inside the drawing needs a real control elsewhere, or a keyboard user cannot reach it."
|
|
2794
|
+
],
|
|
2795
|
+
behavior: [
|
|
2796
|
+
"repaints_on_demand_not_on_a_clock: true",
|
|
2797
|
+
"backing_store_follows_the_element: true",
|
|
2798
|
+
"pointer_events_reach_the_canvas: true",
|
|
2799
|
+
"ssr_safe: Nothing touches the DOM outside onMounted."
|
|
2800
|
+
],
|
|
2801
|
+
selection: {
|
|
2802
|
+
keywords: [
|
|
2803
|
+
"canvas",
|
|
2804
|
+
"diagram",
|
|
2805
|
+
"graph",
|
|
2806
|
+
"node and edge",
|
|
2807
|
+
"custom drawing",
|
|
2808
|
+
"plot",
|
|
2809
|
+
"topology",
|
|
2810
|
+
"map",
|
|
2811
|
+
"hit testing"
|
|
2812
|
+
],
|
|
2813
|
+
useWhen: [
|
|
2814
|
+
"The drawing is data-driven and no chart primitive expresses it \u2014 nodes and edges, a topology, a custom plot.",
|
|
2815
|
+
"Parts of the drawing are click or hover targets.",
|
|
2816
|
+
"It must repaint when the data, the locale or the theme changes."
|
|
2817
|
+
],
|
|
2818
|
+
avoidWhen: [
|
|
2819
|
+
"A line, area or bar chart says it \u2014 use TChart, which brings axes, legend, tooltip and an accessible table.",
|
|
2820
|
+
"The drawing is ornament \u2014 use useDecorativeCanvas, which gates the loop on visibility and reduced motion.",
|
|
2821
|
+
"The shape is an inline trend \u2014 use TSparkline."
|
|
2822
|
+
],
|
|
2823
|
+
alternatives: [
|
|
2824
|
+
{
|
|
2825
|
+
component: "TChart",
|
|
2826
|
+
when: "The data fits axes and categories."
|
|
2827
|
+
},
|
|
2828
|
+
{
|
|
2829
|
+
component: "useDecorativeCanvas",
|
|
2830
|
+
when: "It is decoration, not information."
|
|
2831
|
+
}
|
|
2832
|
+
]
|
|
2833
|
+
},
|
|
2834
|
+
setup: {
|
|
2835
|
+
required: [],
|
|
2836
|
+
notes: []
|
|
2837
|
+
},
|
|
2838
|
+
recipes: [],
|
|
2839
|
+
practices: [
|
|
2840
|
+
"accessible-by-default",
|
|
2841
|
+
"content-alignment"
|
|
2842
|
+
]
|
|
2843
|
+
},
|
|
2673
2844
|
{
|
|
2674
2845
|
name: "TCard",
|
|
2675
2846
|
aliases: [],
|
|
@@ -2743,6 +2914,9 @@ var treeui_catalog_default = {
|
|
|
2743
2914
|
"unnamed_section_root: The default `section` root has no accessible name, so assistive tech exposes it as generic rather than as a region. The component sets no `inheritAttrs: false` and has a single root, so `aria-label` / `aria-labelledby` passed by the consumer fall through to that root when a named region is wanted."
|
|
2744
2915
|
],
|
|
2745
2916
|
behavior: [
|
|
2917
|
+
"surface_never_inflated_by_a_descendant: The surface and its body declare `grid-template-columns: minmax(0, 1fr)`. An implicit `auto` track takes its minimum from the min-content of its items, so one unbreakable descendant \u2014 a table, a code block, a machine string \u2014 behind any wrapper widened the whole surface and laid every sibling out past the border: `TText truncate` never engaged, the TTable wrapper's `overflow-x` never scrolled, and anything aligned to the end was painted outside the surface or over the neighbouring card.",
|
|
2918
|
+
"title_wraps_instead_of_widening_the_card: `.t-card__title` carries `overflow-wrap: anywhere`. A title without spaces used to set the card's min-content width, and the `#header` slot was no way out because the same track was still `auto`.",
|
|
2919
|
+
"actions_shrink_and_wrap: `.t-card__actions` is `flex-shrink: 1; min-inline-size: 0; flex-wrap: wrap`. It was `flex-shrink: 0`, so in a narrow card the controls were laid out past the border instead of moving to the next line \u2014 the header already wraps, and the actions now follow it.",
|
|
2746
2920
|
"body_wrapper_class: t-card__body",
|
|
2747
2921
|
"header_render_condition: The `header.t-card__header` element renders when ANY of the `header` slot, a truthy `title` prop, or the `actions` slot is present. All three branches are independent \u2014 actions alone still produces a header.",
|
|
2748
2922
|
"footer_render_condition: The `footer.t-card__footer` element renders only when the `footer` slot is supplied.",
|
|
@@ -2785,6 +2959,7 @@ var treeui_catalog_default = {
|
|
|
2785
2959
|
practices: [
|
|
2786
2960
|
"interaction-feedback",
|
|
2787
2961
|
"predictable-api",
|
|
2962
|
+
"content-alignment",
|
|
2788
2963
|
"token-driven"
|
|
2789
2964
|
]
|
|
2790
2965
|
},
|
|
@@ -2801,6 +2976,12 @@ var treeui_catalog_default = {
|
|
|
2801
2976
|
storyTitle: "Components/Data Display/Chart",
|
|
2802
2977
|
manifestFile: "docs/ai/COMPONENTS/chart.yaml",
|
|
2803
2978
|
props: [
|
|
2979
|
+
{
|
|
2980
|
+
name: "yAxisWidth",
|
|
2981
|
+
type: "number",
|
|
2982
|
+
default: "undefined",
|
|
2983
|
+
description: "Fix the space reserved for the y-axis labels, in pixels. Left unset, the chart MEASURES the formatted ticks and reserves what they need \u2014 the margin used to be a flat 44px, which clipped a formatted `1,234,567`. Set it to line several charts up on a shared gutter."
|
|
2984
|
+
},
|
|
2804
2985
|
{
|
|
2805
2986
|
name: "type",
|
|
2806
2987
|
type: "TChartType",
|
|
@@ -2971,7 +3152,7 @@ var treeui_catalog_default = {
|
|
|
2971
3152
|
],
|
|
2972
3153
|
avoidWhen: [
|
|
2973
3154
|
"A single value tells the story \u2014 use TStat.",
|
|
2974
|
-
"You only need an inline trend with no axes \u2014 use TSparkline.",
|
|
3155
|
+
"You only need an inline trend with no axes \u2014 use TSparkline (`fluid` fills the card width).",
|
|
2975
3156
|
"The data is a part-of-whole breakdown \u2014 use TDonutChart."
|
|
2976
3157
|
],
|
|
2977
3158
|
alternatives: [
|
|
@@ -3143,6 +3324,17 @@ var treeui_catalog_default = {
|
|
|
3143
3324
|
storyTitle: "Components/Data Display/CodeBlock",
|
|
3144
3325
|
manifestFile: "docs/ai/COMPONENTS/code-block.yaml",
|
|
3145
3326
|
props: [
|
|
3327
|
+
{
|
|
3328
|
+
name: "size",
|
|
3329
|
+
type: "TSize",
|
|
3330
|
+
default: "md",
|
|
3331
|
+
values: [
|
|
3332
|
+
"sm",
|
|
3333
|
+
"md",
|
|
3334
|
+
"lg"
|
|
3335
|
+
],
|
|
3336
|
+
description: "Density. Scales the type size and the padding of the `<pre>` by tokens, like every other sized component. `md` is what the block has always shipped; `sm` is for a block inside a dense surface \u2014 a table cell, a list row \u2014 where the fixed type size dominated the row."
|
|
3337
|
+
},
|
|
3146
3338
|
{
|
|
3147
3339
|
name: "code",
|
|
3148
3340
|
type: "string",
|
|
@@ -3191,7 +3383,9 @@ var treeui_catalog_default = {
|
|
|
3191
3383
|
'scroll_region: The `<pre>` is `role="region"` + `tabindex="0"` + `aria-label` (from `label`) so keyboard users can scroll it \u2014 the library does this for you.',
|
|
3192
3384
|
"copy_button_state: The copy button's aria-label reflects the copied state briefly."
|
|
3193
3385
|
],
|
|
3194
|
-
behavior: [
|
|
3386
|
+
behavior: [
|
|
3387
|
+
'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
|
+
],
|
|
3195
3389
|
selection: {
|
|
3196
3390
|
keywords: [
|
|
3197
3391
|
"code",
|
|
@@ -3229,6 +3423,7 @@ var treeui_catalog_default = {
|
|
|
3229
3423
|
recipes: [],
|
|
3230
3424
|
practices: [
|
|
3231
3425
|
"accessible-by-default",
|
|
3426
|
+
"content-alignment",
|
|
3232
3427
|
"token-driven"
|
|
3233
3428
|
]
|
|
3234
3429
|
},
|
|
@@ -3750,6 +3945,7 @@ var treeui_catalog_default = {
|
|
|
3750
3945
|
"icon_slot_marked_aria_hidden: true"
|
|
3751
3946
|
],
|
|
3752
3947
|
behavior: [
|
|
3948
|
+
"surface_never_inflated_by_a_descendant: `.t-confirm-dialog` and its body declare `grid-template-columns: minmax(0, 1fr)`, and the icon variant uses `auto minmax(0, 1fr)`. It inherits TModal's title and description wrapping, which is what keeps confirm and cancel on the surface when the dialog names a long resource \u2014 it passes `title`/`description` as strings and exposes no `#header` slot, so there was no way around it from the API.",
|
|
3753
3949
|
"built_on_modal_contract: true",
|
|
3754
3950
|
"default_confirm_button_variant: danger",
|
|
3755
3951
|
"default_cancel_button_variant: ghost",
|
|
@@ -3795,7 +3991,8 @@ var treeui_catalog_default = {
|
|
|
3795
3991
|
"confirm-destructive-action"
|
|
3796
3992
|
],
|
|
3797
3993
|
practices: [
|
|
3798
|
-
"accessible-by-default"
|
|
3994
|
+
"accessible-by-default",
|
|
3995
|
+
"content-alignment"
|
|
3799
3996
|
]
|
|
3800
3997
|
},
|
|
3801
3998
|
{
|
|
@@ -4175,6 +4372,8 @@ var treeui_catalog_default = {
|
|
|
4175
4372
|
"focus_is_not_trapped_and_tab_leaves_the_open_calendar: true"
|
|
4176
4373
|
],
|
|
4177
4374
|
behavior: [
|
|
4375
|
+
'panel_is_teleported_to_the_body: The calendar panel renders through `<Teleport to="body">` and is placed with `position: fixed` from the trigger\'s viewport rect by `useAnchoredLayer`. It used to be absolutely positioned inside the root, so inside a `TModal` it was trapped in the surface and clipped. Query it from `document.body` in tests.',
|
|
4376
|
+
'month_title_capitalises_only_its_first_letter: `text-transform: capitalize` uppercased every word, which in most locales hits a particle in the middle of the title \u2014 pt-BR\'s "setembro de 2026" rendered as "Setembro De 2026". The rule is now `none` plus a `::first-letter` uppercase.',
|
|
4178
4377
|
"value_format: YYYY-MM-DD",
|
|
4179
4378
|
"controlled_and_uncontrolled_open: true",
|
|
4180
4379
|
"open_state_emits_are_deduped: true",
|
|
@@ -4223,7 +4422,9 @@ var treeui_catalog_default = {
|
|
|
4223
4422
|
]
|
|
4224
4423
|
},
|
|
4225
4424
|
recipes: [],
|
|
4226
|
-
practices: [
|
|
4425
|
+
practices: [
|
|
4426
|
+
"accessible-by-default"
|
|
4427
|
+
]
|
|
4227
4428
|
},
|
|
4228
4429
|
{
|
|
4229
4430
|
name: "TDateTimePicker",
|
|
@@ -5237,6 +5438,24 @@ var treeui_catalog_default = {
|
|
|
5237
5438
|
storyTitle: "Components/Data Entry/FileUpload",
|
|
5238
5439
|
manifestFile: "docs/ai/COMPONENTS/file-upload.yaml",
|
|
5239
5440
|
props: [
|
|
5441
|
+
{
|
|
5442
|
+
name: "clearLabel",
|
|
5443
|
+
type: "string",
|
|
5444
|
+
default: "Clear all",
|
|
5445
|
+
description: "Label for the button that drops every selected file. It was hard-coded English with no way out."
|
|
5446
|
+
},
|
|
5447
|
+
{
|
|
5448
|
+
name: "removeLabel",
|
|
5449
|
+
type: "string",
|
|
5450
|
+
default: "Remove",
|
|
5451
|
+
description: "Label for a row's remove button."
|
|
5452
|
+
},
|
|
5453
|
+
{
|
|
5454
|
+
name: "removeAriaLabel",
|
|
5455
|
+
type: "(file: File) => string",
|
|
5456
|
+
default: "(f) => `Remove ${f.name}`",
|
|
5457
|
+
description: "Accessible name for a row's remove button. A function, not a string, because the file name sits INSIDE the sentence and its position differs by language \u2014 a prefix and a suffix cannot express that."
|
|
5458
|
+
},
|
|
5240
5459
|
{
|
|
5241
5460
|
name: "modelValue",
|
|
5242
5461
|
type: "File[]",
|
|
@@ -5496,7 +5715,9 @@ var treeui_catalog_default = {
|
|
|
5496
5715
|
recipes: [
|
|
5497
5716
|
"page-drop-target"
|
|
5498
5717
|
],
|
|
5499
|
-
practices: [
|
|
5718
|
+
practices: [
|
|
5719
|
+
"accessible-by-default"
|
|
5720
|
+
]
|
|
5500
5721
|
},
|
|
5501
5722
|
{
|
|
5502
5723
|
name: "TFlag",
|
|
@@ -5809,6 +6030,12 @@ var treeui_catalog_default = {
|
|
|
5809
6030
|
name: "dense",
|
|
5810
6031
|
type: "boolean",
|
|
5811
6032
|
default: "false"
|
|
6033
|
+
},
|
|
6034
|
+
{
|
|
6035
|
+
name: "balance",
|
|
6036
|
+
type: "boolean",
|
|
6037
|
+
default: "false",
|
|
6038
|
+
note: 'Let the last row divide itself among the items it has instead of leaving empty tracks to its right \u2014 five cards over four tracks read as "one card failed to load". `auto-fit` cannot do it: it collapses a track only when that track is empty on EVERY row, so the remainder row keeps the widths of the rows above it. Balanced mode lays out with flex, where each line sizes itself: full rows are identical to the grid, only the remainder is shared out. Ignored when `columns` is set, since a declared track count already answers the same question.\n'
|
|
5812
6039
|
}
|
|
5813
6040
|
],
|
|
5814
6041
|
events: [],
|
|
@@ -5822,6 +6049,7 @@ var treeui_catalog_default = {
|
|
|
5822
6049
|
],
|
|
5823
6050
|
behavior: [
|
|
5824
6051
|
"semantic_element_controlled_by_as: true",
|
|
6052
|
+
"balance_shares_the_last_row_instead_of_leaving_holes: true",
|
|
5825
6053
|
"fixed_columns_supported: true",
|
|
5826
6054
|
"auto_fit_columns_supported: true",
|
|
5827
6055
|
"dense_mode_uses_grid_auto_flow_dense: true"
|
|
@@ -6114,6 +6342,7 @@ var treeui_catalog_default = {
|
|
|
6114
6342
|
"calendar-plus",
|
|
6115
6343
|
"calendar-range",
|
|
6116
6344
|
"calendar-x",
|
|
6345
|
+
"campaign",
|
|
6117
6346
|
"carousel",
|
|
6118
6347
|
"catalog",
|
|
6119
6348
|
"chart-column",
|
|
@@ -6150,7 +6379,6 @@ var treeui_catalog_default = {
|
|
|
6150
6379
|
"companion",
|
|
6151
6380
|
"compass",
|
|
6152
6381
|
"connections",
|
|
6153
|
-
"contentpilot",
|
|
6154
6382
|
"copy",
|
|
6155
6383
|
"cpu",
|
|
6156
6384
|
"cpu-chip",
|
|
@@ -6396,8 +6624,6 @@ var treeui_catalog_default = {
|
|
|
6396
6624
|
"tickets",
|
|
6397
6625
|
"timeline",
|
|
6398
6626
|
"timer",
|
|
6399
|
-
"toggle-left",
|
|
6400
|
-
"toggle-right",
|
|
6401
6627
|
"token-input",
|
|
6402
6628
|
"token-output",
|
|
6403
6629
|
"trail",
|
|
@@ -6435,10 +6661,18 @@ var treeui_catalog_default = {
|
|
|
6435
6661
|
},
|
|
6436
6662
|
{
|
|
6437
6663
|
name: "size",
|
|
6438
|
-
type: "number |
|
|
6664
|
+
type: "number | TIconSize",
|
|
6439
6665
|
default: "20",
|
|
6440
|
-
|
|
6441
|
-
|
|
6666
|
+
values: [
|
|
6667
|
+
"sm",
|
|
6668
|
+
"md",
|
|
6669
|
+
"lg",
|
|
6670
|
+
"xl",
|
|
6671
|
+
"2xl",
|
|
6672
|
+
"<number of pixels>"
|
|
6673
|
+
],
|
|
6674
|
+
description: "A token name from the icon scale, or a pixel number.",
|
|
6675
|
+
note: '`size` used to be `number | string`, which meant `<TIcon size="sm" />`\ntype-checked, wrote width="sm" onto the svg, and left the icon unsized \u2014\nit then stretched to fill its container, measured at 300px in the report\nthat produced this change. It now takes either a NUMBER of pixels or one\nof the icon-scale token names, which map to the same values as\n--tree-size-icon-sm | -md | -lg | -xl | -2xl (16 / 20 / 24 / 32 / 48 px).\nAn unrecognised string is a compile error in TypeScript and, for\nJavaScript consumers, falls back to the default size with a console\nwarning in development rather than rendering at an arbitrary size.\nA free-form CSS length is no longer accepted: set width/height in CSS\nfrom the icon scale instead, which is what TLanguageSelect\'s switcher\nvariant does.\n'
|
|
6442
6676
|
},
|
|
6443
6677
|
{
|
|
6444
6678
|
name: "strokeWidth",
|
|
@@ -6468,7 +6702,7 @@ var treeui_catalog_default = {
|
|
|
6468
6702
|
behavior: [
|
|
6469
6703
|
"unknown_name_renders_nothing: An unregistered name makes `resolveTreeIcon` return `undefined`, and `TIcon`'s `v-if` then renders no element at all \u2014 no empty box, no placeholder, no error. A `console.warn` names the missing icon, suggests the `registerTreeIcons` call, and lists every valid name. It warns once per NAME (not per message \u2014 the message embeds the valid-name list, which changes on every registration), so a miss inside a render loop cannot flood the console. The warning is NOT gated on `process.env.NODE_ENV`: it fires in production builds too, deliberately, because a missing icon is a misconfiguration worth hearing about once and `process` is undefined in most browser bundles. Components with a marker fallback (TNavMenu) show that instead \u2014 see nav-menu.yaml.",
|
|
6470
6704
|
'absolute_stroke_width_math: Icons draw on `viewBox="0 0 24 24"` with the svg sized to `size`, so painted pixels = (stroke-width attribute) * size / 24. With `absoluteStrokeWidth` (the default) the attribute is set to `(strokeWidth * 24) / size`, which cancels the scale: at the default `strokeWidth: 2` the attribute is 2.4 at size 20, 1.5 at 32, and 1.0 at 48 \u2014 a constant 2px painted at every size. That is the entire point of the correction: a 48px icon sits beside a 20px one at the same optical weight. A `size` of 0 or a non-numeric value keeps the nominal stroke rather than producing NaN/Infinity. Setting `absoluteStrokeWidth: false` pins the attribute at `strokeWidth`, which is the hand-rolled behaviour: the painted stroke then scales WITH the icon (1.67px at 20, 2.67px at 32, 4px at 48 \u2014 double the library weight).',
|
|
6471
|
-
"icons_are_built_lazily_and_cached: Geometry lives in a data registry; a component is created on first lookup and reused after that, so an unused icon stays as DATA instead of becoming a `defineComponent`. Note what this does not claim: the geometry for all
|
|
6705
|
+
"icons_are_built_lazily_and_cached: Geometry lives in a data registry; a component is created on first lookup and reused after that, so an unused icon stays as DATA instead of becoming a `defineComponent`. Note what this does not claim: the geometry for all 370 built-ins is retained by any import of the package (the registry copies `builtinTreeIconNodes` into a `Map` at module scope, so a live reference exists and nothing tree-shakes it away \u2014 `sideEffects: false` does not change that). The saving is component construction, not bundle bytes.",
|
|
6472
6706
|
"resolved_per_render: TIcon resolves its name in a computed, not once at setup, so an icon registered after the component mounted still appears.",
|
|
6473
6707
|
"migration_aliases: Twelve compatibility names resolve to the same geometry as their canonical names: grid \u2192 layout-grid, share \u2192 share-nodes, chevron-updown \u2192 chevrons-up-down, refresh \u2192 refresh-cw, comment/chat \u2192 message-circle, check-square \u2192 square-check, help \u2192 circle-help, automations \u2192 zap, connections \u2192 external-link, persona \u2192 user-round, and close \u2192 x.",
|
|
6474
6708
|
"company_logos_are_app_owned: Company logos are not built-ins. When an application needs one, it imports the official SVG as its own component and passes or registers that component under an application-owned name."
|
|
@@ -6518,7 +6752,9 @@ var treeui_catalog_default = {
|
|
|
6518
6752
|
recipes: [
|
|
6519
6753
|
"nav-menu-icons"
|
|
6520
6754
|
],
|
|
6521
|
-
practices: [
|
|
6755
|
+
practices: [
|
|
6756
|
+
"branchline-icons"
|
|
6757
|
+
]
|
|
6522
6758
|
},
|
|
6523
6759
|
{
|
|
6524
6760
|
name: "TImage",
|
|
@@ -6641,7 +6877,7 @@ var treeui_catalog_default = {
|
|
|
6641
6877
|
name: "modelValue",
|
|
6642
6878
|
type: "T",
|
|
6643
6879
|
default: "undefined",
|
|
6644
|
-
note: "Generic over `T extends string | number`, so a `ref<number>` binds without a cast and `update:modelValue` pays back a number. `<script setup>` was widening every model to `string | number`,
|
|
6880
|
+
note: "Generic over `T extends string | number`, so a `ref<number>` binds without a cast and `update:modelValue` pays back a number. `<script setup>` was widening every model to `string | number`, and widening makes a numeric field a type error under `strictTemplates`, with no correct way to write the binding. When `T` is `number` the component parses the raw input value and only falls back to the raw string when it does not parse.\n"
|
|
6645
6881
|
},
|
|
6646
6882
|
{
|
|
6647
6883
|
name: "size",
|
|
@@ -7353,7 +7589,9 @@ var treeui_catalog_default = {
|
|
|
7353
7589
|
"aria_current: `page` when `current`.",
|
|
7354
7590
|
"focus_visible: Focus ring on the tile."
|
|
7355
7591
|
],
|
|
7356
|
-
behavior: [
|
|
7592
|
+
behavior: [
|
|
7593
|
+
"default_slot_does_not_stretch_its_children: `.t-link-tile__body` is `align-items: flex-start`, not the `stretch` default. The default slot is where a consumer drops a TTag or a TBadge, and stretch made a four-character tag as wide as the description. Title and description are TText and still wrap to the available width."
|
|
7594
|
+
],
|
|
7357
7595
|
selection: {
|
|
7358
7596
|
keywords: [
|
|
7359
7597
|
"tile",
|
|
@@ -7389,6 +7627,7 @@ var treeui_catalog_default = {
|
|
|
7389
7627
|
practices: [
|
|
7390
7628
|
"interaction-feedback",
|
|
7391
7629
|
"accessible-by-default",
|
|
7630
|
+
"content-alignment",
|
|
7392
7631
|
"token-driven"
|
|
7393
7632
|
]
|
|
7394
7633
|
},
|
|
@@ -7435,7 +7674,8 @@ var treeui_catalog_default = {
|
|
|
7435
7674
|
"not_selectable: For a single-select list of options use TSelectableList instead."
|
|
7436
7675
|
],
|
|
7437
7676
|
behavior: [
|
|
7438
|
-
"
|
|
7677
|
+
"actions_take_their_own_line_in_a_narrow_container: Inside the existing `@container (max-width: 30rem)` query, `.t-list-item__actions` becomes `flex-basis: 100%; order: 2; flex-wrap: wrap; justify-content: flex-end`. Rigid actions used to squeeze the content column down to 40\u2013110px rather than moving below it \u2014 the meta already dropped to its own line, and the actions now follow the same rule. Actions are still never hidden or auto-collapsed into an overflow menu; that stays a deliberate consumer choice.",
|
|
7678
|
+
"responsive: On a container narrower than 30rem the row wraps: meta drops below the content while actions stay visible inline, and the leading slot stays on the first line of the content \u2014 the wrap is for the meta only. Actions are NEVER hidden or auto-collapsed into an overflow menu \u2014 compose a TMenu inside the actions slot deliberately if an overflow is wanted (uses a CSS container query; the list sets container-type).",
|
|
7439
7679
|
"no_overflow_ownership: TList does not create, own, or collapse an actions overflow."
|
|
7440
7680
|
],
|
|
7441
7681
|
selection: {
|
|
@@ -7598,7 +7838,7 @@ var treeui_catalog_default = {
|
|
|
7598
7838
|
kind: "overlay",
|
|
7599
7839
|
category: "Overlay",
|
|
7600
7840
|
status: "available",
|
|
7601
|
-
purpose: "Rich action menu in a popover \u2014 slot-driven compound with groups, icons, descriptions, meta, destructive items, link items, and a radio (workspace-switch) item, with roving focus and keyboard support. Built on TPopover, so anchoring and focus restore come from there
|
|
7841
|
+
purpose: "Rich action menu in a popover \u2014 slot-driven compound with groups, icons, descriptions, meta, destructive items, link items, and a radio (workspace-switch) item, with roving focus and keyboard support. Built on TPopover, so anchoring and focus restore come from there.",
|
|
7602
7842
|
sourceFile: "packages/vue/src/components/TMenu.vue",
|
|
7603
7843
|
storyFile: "apps/docs/src/stories/Menu.stories.ts",
|
|
7604
7844
|
storyTitle: "Components/Overlay/Menu",
|
|
@@ -7843,6 +8083,10 @@ var treeui_catalog_default = {
|
|
|
7843
8083
|
"escape_closes_when_enabled: true"
|
|
7844
8084
|
],
|
|
7845
8085
|
behavior: [
|
|
8086
|
+
"surface_never_inflated_by_a_descendant: The surface and its body declare `grid-template-columns: minmax(0, 1fr)`. An implicit `auto` track takes its minimum from the min-content of its items, so one unbreakable descendant \u2014 a table, a code block, a machine string \u2014 behind any wrapper widened the whole surface and laid every sibling out past the border: `TText truncate` never engaged, the TTable wrapper's `overflow-x` never scrolled, and anything aligned to the end was painted outside the surface or over the neighbouring card.",
|
|
8087
|
+
"only_the_body_scrolls: `.t-modal__surface` is a flex column with `overflow: hidden`, and `.t-modal__body` is the single scroller (`flex: 1 1 auto; min-block-size: 0; overflow: auto`). The whole surface used to scroll, so on a short viewport the footer's actions sat below the fold and the title scrolled away with the content. A flex column also removes the implicit `auto` track, which is the other half of the inflation above.",
|
|
8088
|
+
"title_and_description_wrap: `.t-modal__title` and `.t-modal__description` carry `overflow-wrap: anywhere` \u2014 `anywhere`, not `break-word`, because only `anywhere` reduces the min-content. A confirm dialog exists to name the thing being deleted, and a resource name without a break opportunity used to push confirm and cancel off the surface at any width, desktop included.",
|
|
8089
|
+
"a_child_overlay_must_be_teleported: Because the surface now clips, a panel rendered inside it would be cut off. TSelect's listbox and TDatePicker's panel teleport to the body for exactly this reason; a consumer composing its own overlay inside a modal should do the same with `useAnchoredLayer`.",
|
|
7846
8090
|
"uses_teleport_to_body: true",
|
|
7847
8091
|
"locks_body_scroll_while_open: true",
|
|
7848
8092
|
"overlay_click_closes_when_enabled: true",
|
|
@@ -7887,7 +8131,8 @@ var treeui_catalog_default = {
|
|
|
7887
8131
|
],
|
|
7888
8132
|
practices: [
|
|
7889
8133
|
"accessible-by-default",
|
|
7890
|
-
"predictable-api"
|
|
8134
|
+
"predictable-api",
|
|
8135
|
+
"content-alignment"
|
|
7891
8136
|
]
|
|
7892
8137
|
},
|
|
7893
8138
|
{
|
|
@@ -8233,6 +8478,7 @@ var treeui_catalog_default = {
|
|
|
8233
8478
|
"aria_disabled: on link items when disabled"
|
|
8234
8479
|
],
|
|
8235
8480
|
behavior: [
|
|
8481
|
+
"labels_wrap_rather_than_scroll_the_sidebar: `.t-nav-menu__list` and `.t-nav-menu__copy` declare `grid-template-columns: minmax(0, 1fr)`, and the label and description carry `overflow-wrap: anywhere`. A sidebar is the one place a horizontal scrollbar is never the right answer, and an item label without a break opportunity used to give it one.",
|
|
8236
8482
|
"can_be_controlled_or_uncontrolled: true",
|
|
8237
8483
|
"can_inherit_collapsed_state_from_sidebar: true",
|
|
8238
8484
|
"supports_rich_item_rendering_via_slot: true"
|
|
@@ -8280,7 +8526,8 @@ var treeui_catalog_default = {
|
|
|
8280
8526
|
"responsive-navigation"
|
|
8281
8527
|
],
|
|
8282
8528
|
practices: [
|
|
8283
|
-
"interaction-feedback"
|
|
8529
|
+
"interaction-feedback",
|
|
8530
|
+
"content-alignment"
|
|
8284
8531
|
]
|
|
8285
8532
|
},
|
|
8286
8533
|
{
|
|
@@ -8299,7 +8546,7 @@ var treeui_catalog_default = {
|
|
|
8299
8546
|
{
|
|
8300
8547
|
name: "modelValue",
|
|
8301
8548
|
type: "number | null",
|
|
8302
|
-
note: "`null` is REAL, not an error state: clearing the field is empty, and the component emits `null` for it. So `v-model` needs a `ref<number | null>`, and a `ref<number>` is a genuine type error under
|
|
8549
|
+
note: "`null` is REAL, not an error state: clearing the field is empty, and the component emits `null` for it. So `v-model` needs a `ref<number | null>`, and a `ref<number>` is a genuine type error under `strictTemplates` rather than a gap in the library \u2014 here the binding is what has to widen, not the model. The opposite of TInput/TTabs/TToggleGroup, where the library's own model type was too wide and no narrow ref could bind it.\n"
|
|
8303
8550
|
},
|
|
8304
8551
|
{
|
|
8305
8552
|
name: "min",
|
|
@@ -8547,6 +8794,7 @@ var treeui_catalog_default = {
|
|
|
8547
8794
|
"Actions area holds standard focusable controls (e.g. TButton) \u2014 no custom roles added."
|
|
8548
8795
|
],
|
|
8549
8796
|
behavior: [
|
|
8797
|
+
"slot_presence_is_read_during_render: The template tests `$slots.title` / `$slots.subtitle` directly instead of a `computed` over `useSlots()`. The computed cached its first answer, so a `v-if`'d title slot that appeared later never rendered, and one that disappeared left an empty `<h1>` behind. This is the arrangement TCard already used for `$slots.header`.",
|
|
8550
8798
|
"title_and_subtitle_optional: true",
|
|
8551
8799
|
"heading_level_controlled_by_level: true",
|
|
8552
8800
|
"actions_area_right_aligned_and_wraps: true",
|
|
@@ -9567,14 +9815,14 @@ var treeui_catalog_default = {
|
|
|
9567
9815
|
props: [
|
|
9568
9816
|
{
|
|
9569
9817
|
name: "modelValue",
|
|
9570
|
-
type: "
|
|
9571
|
-
default: ""
|
|
9818
|
+
type: "T",
|
|
9819
|
+
default: "undefined"
|
|
9572
9820
|
},
|
|
9573
9821
|
{
|
|
9574
9822
|
name: "options",
|
|
9575
|
-
type: "TSelectOption[]",
|
|
9823
|
+
type: "TSelectOption<T>[]",
|
|
9576
9824
|
default: "[]",
|
|
9577
|
-
note: "Array of { label: string; value:
|
|
9825
|
+
note: "Array of { label: string; value: T; disabled?: boolean }"
|
|
9578
9826
|
},
|
|
9579
9827
|
{
|
|
9580
9828
|
name: "open",
|
|
@@ -9670,7 +9918,9 @@ var treeui_catalog_default = {
|
|
|
9670
9918
|
"outside_click_closes_dropdown: true",
|
|
9671
9919
|
"focus_restores_on_close: true",
|
|
9672
9920
|
"numeric_values_supported_without_string_coercion: true",
|
|
9673
|
-
"listbox_flips_above_trigger_when_space_below_is_insufficient: true"
|
|
9921
|
+
"listbox_flips_above_trigger_when_space_below_is_insufficient: true",
|
|
9922
|
+
"option_label_wraps_instead_of_being_clipped: `.t-select__option` carries `overflow-wrap: anywhere`, so a label without a break opportunity wraps inside the listbox rather than overflowing it and being cut off.",
|
|
9923
|
+
"listbox_is_teleported_to_the_body: The listbox renders through `<Teleport to=\"body\">` and is placed with `position: fixed` from the trigger's viewport rect by the `useAnchoredLayer` composable, matching the trigger's width. It used to be positioned inside the root, which meant ANY ancestor with `overflow` clipped it \u2014 the TTable wrapper cut it off and a modal trapped it. Consequences for tests: the listbox is not a descendant of the component's root element, so query it from `document.body`."
|
|
9674
9924
|
],
|
|
9675
9925
|
selection: {
|
|
9676
9926
|
keywords: [
|
|
@@ -9708,6 +9958,7 @@ var treeui_catalog_default = {
|
|
|
9708
9958
|
],
|
|
9709
9959
|
practices: [
|
|
9710
9960
|
"interaction-feedback",
|
|
9961
|
+
"accessible-by-default",
|
|
9711
9962
|
"predictable-api",
|
|
9712
9963
|
"token-driven"
|
|
9713
9964
|
]
|
|
@@ -10181,7 +10432,9 @@ var treeui_catalog_default = {
|
|
|
10181
10432
|
"Hit area is `--tree-size-control-lg` (48px) tall, above the 44px target floor.",
|
|
10182
10433
|
"The label must say where it goes; the library does not supply one."
|
|
10183
10434
|
],
|
|
10184
|
-
behavior: [
|
|
10435
|
+
behavior: [
|
|
10436
|
+
"hidden_link_paints_no_shadow: `.t-skip-link:not(:focus-visible)` sets `box-shadow: none`. The box is translated off-screen while hidden, but a 14px offset with a 34px blur is not: it painted a grey smudge in the top-left of every header, at every width, all the time. The shadow belongs to the focused state, which is when the link is actually on screen."
|
|
10437
|
+
],
|
|
10185
10438
|
selection: {
|
|
10186
10439
|
keywords: [
|
|
10187
10440
|
"skip link",
|
|
@@ -10406,6 +10659,12 @@ var treeui_catalog_default = {
|
|
|
10406
10659
|
default: "false",
|
|
10407
10660
|
note: "Marker on the final point (line/area)."
|
|
10408
10661
|
},
|
|
10662
|
+
{
|
|
10663
|
+
name: "fluid",
|
|
10664
|
+
type: "boolean",
|
|
10665
|
+
default: "false",
|
|
10666
|
+
note: "Fill the parent's width; `width` stays the viewBox. The height is unchanged on purpose \u2014 a sparkline is a band, and growing in both directions turns it into a chart that lies about its precision. Strokes use `non-scaling-stroke`, so the pen keeps its declared width.\n"
|
|
10667
|
+
},
|
|
10409
10668
|
{
|
|
10410
10669
|
name: "ariaLabel",
|
|
10411
10670
|
type: "string",
|
|
@@ -10421,7 +10680,8 @@ var treeui_catalog_default = {
|
|
|
10421
10680
|
behavior: [
|
|
10422
10681
|
"no_axes_or_legend: true",
|
|
10423
10682
|
"flat_series_renders_centered: true",
|
|
10424
|
-
"scales_to_intrinsic_width_and_height: true"
|
|
10683
|
+
"scales_to_intrinsic_width_and_height: true",
|
|
10684
|
+
"fluid_fills_parent_width: true"
|
|
10425
10685
|
],
|
|
10426
10686
|
selection: {
|
|
10427
10687
|
keywords: [
|
|
@@ -10461,7 +10721,9 @@ var treeui_catalog_default = {
|
|
|
10461
10721
|
recipes: [
|
|
10462
10722
|
"metric-dashboard"
|
|
10463
10723
|
],
|
|
10464
|
-
practices: [
|
|
10724
|
+
practices: [
|
|
10725
|
+
"content-alignment"
|
|
10726
|
+
]
|
|
10465
10727
|
},
|
|
10466
10728
|
{
|
|
10467
10729
|
name: "TSpinner",
|
|
@@ -10866,6 +11128,16 @@ var treeui_catalog_default = {
|
|
|
10866
11128
|
name: "loading",
|
|
10867
11129
|
type: "boolean",
|
|
10868
11130
|
default: "false"
|
|
11131
|
+
},
|
|
11132
|
+
{
|
|
11133
|
+
name: "emphasis",
|
|
11134
|
+
type: "TStatEmphasis",
|
|
11135
|
+
default: "label",
|
|
11136
|
+
values: [
|
|
11137
|
+
"label",
|
|
11138
|
+
"value"
|
|
11139
|
+
],
|
|
11140
|
+
note: 'Which half leads. `label` is the dashboard reading \u2014 the eye is scanning for what is measured. `value` puts the figure first, for a marketing band where the number IS the argument; it also keeps a row of figures on one baseline, because the labels above them no longer have to be the same height. Visual order only: the DOM keeps label before value, so the announcement stays "Requests served, 4.2M".\n'
|
|
10869
11141
|
}
|
|
10870
11142
|
],
|
|
10871
11143
|
events: [],
|
|
@@ -10892,6 +11164,7 @@ var treeui_catalog_default = {
|
|
|
10892
11164
|
],
|
|
10893
11165
|
behavior: [
|
|
10894
11166
|
"value_and_trend_are_optional: true",
|
|
11167
|
+
"emphasis_reorders_visually_not_in_the_dom: true",
|
|
10895
11168
|
"icon_slot_adds_visual_emphasis: true",
|
|
10896
11169
|
"trend_indicator_changes_with_direction: true",
|
|
10897
11170
|
"loading_renders_internal_skeleton_placeholders: true"
|
|
@@ -10929,6 +11202,7 @@ var treeui_catalog_default = {
|
|
|
10929
11202
|
"metric-dashboard"
|
|
10930
11203
|
],
|
|
10931
11204
|
practices: [
|
|
11205
|
+
"content-alignment",
|
|
10932
11206
|
"token-driven"
|
|
10933
11207
|
]
|
|
10934
11208
|
},
|
|
@@ -10941,7 +11215,7 @@ var treeui_catalog_default = {
|
|
|
10941
11215
|
kind: "navigation",
|
|
10942
11216
|
category: "Navigation",
|
|
10943
11217
|
status: "available",
|
|
10944
|
-
purpose: "
|
|
11218
|
+
purpose: "Ordered sequence \u2014 a wizard to operate, or a described flow to read.",
|
|
10945
11219
|
sourceFile: "packages/vue/src/components/TSteps.vue",
|
|
10946
11220
|
storyFile: "apps/docs/src/stories/Steps.stories.ts",
|
|
10947
11221
|
storyTitle: "Components/Navigation/Steps",
|
|
@@ -10985,7 +11259,20 @@ var treeui_catalog_default = {
|
|
|
10985
11259
|
{
|
|
10986
11260
|
name: "interactive",
|
|
10987
11261
|
type: "boolean",
|
|
10988
|
-
default: "false"
|
|
11262
|
+
default: "false",
|
|
11263
|
+
note: "Whether a step can be picked. False \u2014 the default \u2014 renders inert boxes: no button in the accessibility tree, no disabled wash, and no step elected current unless `modelValue`/`defaultValue` or an item `status` says so. A described sequence used to render one dead control per step, at 60% opacity, with the first step ringed as if the reader were standing on it.\n"
|
|
11264
|
+
},
|
|
11265
|
+
{
|
|
11266
|
+
name: "columns",
|
|
11267
|
+
type: "number",
|
|
11268
|
+
default: "undefined",
|
|
11269
|
+
note: "Fixed steps per row, horizontal only. Use for a sequence with a shape (3 + 3)."
|
|
11270
|
+
},
|
|
11271
|
+
{
|
|
11272
|
+
name: "minItemWidth",
|
|
11273
|
+
type: "string",
|
|
11274
|
+
default: "14rem",
|
|
11275
|
+
note: "Width at which a step stops shrinking and the strip wraps. Same axis as TGrid."
|
|
10989
11276
|
}
|
|
10990
11277
|
],
|
|
10991
11278
|
events: [
|
|
@@ -11001,10 +11288,13 @@ var treeui_catalog_default = {
|
|
|
11001
11288
|
a11y: [
|
|
11002
11289
|
"semantic_root: ol",
|
|
11003
11290
|
"current_step_uses_aria_current_step: true",
|
|
11004
|
-
"interactive_variant_uses_buttons: true"
|
|
11291
|
+
"interactive_variant_uses_buttons: true",
|
|
11292
|
+
"static_variant_emits_no_control: true"
|
|
11005
11293
|
],
|
|
11006
11294
|
behavior: [
|
|
11007
11295
|
"can_be_controlled_or_uncontrolled: true",
|
|
11296
|
+
"static_variant_elects_no_current_step: true",
|
|
11297
|
+
"shared_box_class_is_t_steps_box: true",
|
|
11008
11298
|
"status_can_be_explicit_or_computed: true",
|
|
11009
11299
|
"alias_export_available: true"
|
|
11010
11300
|
],
|
|
@@ -11035,7 +11325,10 @@ var treeui_catalog_default = {
|
|
|
11035
11325
|
]
|
|
11036
11326
|
},
|
|
11037
11327
|
recipes: [],
|
|
11038
|
-
practices: [
|
|
11328
|
+
practices: [
|
|
11329
|
+
"accessible-by-default",
|
|
11330
|
+
"content-alignment"
|
|
11331
|
+
]
|
|
11039
11332
|
},
|
|
11040
11333
|
{
|
|
11041
11334
|
name: "TSwitch",
|
|
@@ -11146,7 +11439,7 @@ var treeui_catalog_default = {
|
|
|
11146
11439
|
name: "columns",
|
|
11147
11440
|
type: "TTableColumn[]",
|
|
11148
11441
|
required: true,
|
|
11149
|
-
description: "Array of column definitions with key, label, sortable, align, and
|
|
11442
|
+
description: "Array of column definitions with key, label, sortable, align, width, and minWidth."
|
|
11150
11443
|
},
|
|
11151
11444
|
{
|
|
11152
11445
|
name: "rows",
|
|
@@ -11274,7 +11567,7 @@ var treeui_catalog_default = {
|
|
|
11274
11567
|
name: "modelValue",
|
|
11275
11568
|
type: "T",
|
|
11276
11569
|
default: "undefined",
|
|
11277
|
-
note: "The value of the currently active tab; use with v-model. Generic over `T extends string`, so a `ref<'overview' | 'logs'>` keeps its literal union instead of being widened to `string` \u2014
|
|
11570
|
+
note: "The value of the currently active tab; use with v-model. Generic over `T extends string`, so a `ref<'overview' | 'logs'>` keeps its literal union instead of being widened to `string` \u2014 widening makes the binding an error under `strictTemplates`, with no correct way to write it.\n"
|
|
11278
11571
|
},
|
|
11279
11572
|
{
|
|
11280
11573
|
name: "defaultValue",
|
|
@@ -11324,6 +11617,7 @@ var treeui_catalog_default = {
|
|
|
11324
11617
|
"aria_controls_aria_labelledby_pairing: true"
|
|
11325
11618
|
],
|
|
11326
11619
|
behavior: [
|
|
11620
|
+
"overflowing_tabs_scroll_within_their_own_strip: `.t-tabs__list` is `overflow-x: auto` with `overscroll-behavior-x: contain`. Tabs that did not fit pushed the PAGE sideways, which moves every other element on screen to solve a problem belonging to one component. TTabList scrolls the active tab into view whenever the active value changes, so a tab reached by keyboard or restored from a model value is never left off-strip.",
|
|
11327
11621
|
"arrow_left_right_moves_focus: true",
|
|
11328
11622
|
"home_focuses_first_tab: true",
|
|
11329
11623
|
"end_focuses_last_tab: true",
|
|
@@ -11363,7 +11657,9 @@ var treeui_catalog_default = {
|
|
|
11363
11657
|
"router-backed-tabs"
|
|
11364
11658
|
],
|
|
11365
11659
|
practices: [
|
|
11366
|
-
"interaction-feedback"
|
|
11660
|
+
"interaction-feedback",
|
|
11661
|
+
"accessible-by-default",
|
|
11662
|
+
"content-alignment"
|
|
11367
11663
|
]
|
|
11368
11664
|
},
|
|
11369
11665
|
{
|
|
@@ -11701,6 +11997,17 @@ var treeui_catalog_default = {
|
|
|
11701
11997
|
],
|
|
11702
11998
|
note: "Break axis for a string with no break opportunity \u2014 an id, ARN, API key or hash is one long word, so it overflows its box. `truncate` is the wrong answer when the string IS what the reader came to copy: an ellipsis makes an id useless. `anywhere` breaks at any character (and sets `min-inline-size: 0`, without which a flex or grid child still refuses to shrink below its longest word and never breaks); `break-word` only breaks a word that would otherwise overflow. Ignored when `truncate` is set.\n"
|
|
11703
11999
|
},
|
|
12000
|
+
{
|
|
12001
|
+
name: "align",
|
|
12002
|
+
type: "TTextAlign",
|
|
12003
|
+
default: "undefined",
|
|
12004
|
+
values: [
|
|
12005
|
+
"start",
|
|
12006
|
+
"center",
|
|
12007
|
+
"end"
|
|
12008
|
+
],
|
|
12009
|
+
note: "How the LINES sit inside the box, which is the other half of `TStack align` \u2014 that one centres the box, and a centred box only looks centred while it is narrow: at full width the paragraph inside reads left-aligned. Renders block, because `text-align` does nothing on an inline box that shrink-wraps its content. Logical values, so `start`/`end` follow the writing direction. Combined with `measure`, `center` also centres the capped block itself.\n"
|
|
12010
|
+
},
|
|
11704
12011
|
{
|
|
11705
12012
|
name: "balance",
|
|
11706
12013
|
type: "boolean",
|
|
@@ -11741,6 +12048,7 @@ var treeui_catalog_default = {
|
|
|
11741
12048
|
"Choose `as` to convey the correct semantics (e.g. headings via h1\u2013h6); TText adds only visual styling."
|
|
11742
12049
|
],
|
|
11743
12050
|
behavior: [
|
|
12051
|
+
'the_wrap_axis_outranks_preserve_whitespace: `.t-text.t-text--wrap-anywhere` is qualified with `.t-text` so it matches the (0,2,0) specificity of `.t-text.is-pre-wrap`, and wins by order. Without it `preserveWhitespace` silently downgraded `wrap="anywhere"` to `break-word`, which is the one thing `anywhere` exists to do differently: only `anywhere` reduces the min-content.',
|
|
11744
12052
|
"semantic_element_controlled_by_as: true",
|
|
11745
12053
|
"token_driven_size_tone_weight: true",
|
|
11746
12054
|
"truncate_takes_precedence_over_preserve_whitespace: true"
|
|
@@ -11762,6 +12070,7 @@ var treeui_catalog_default = {
|
|
|
11762
12070
|
practices: [
|
|
11763
12071
|
"accessible-by-default",
|
|
11764
12072
|
"predictable-api",
|
|
12073
|
+
"content-alignment",
|
|
11765
12074
|
"token-driven"
|
|
11766
12075
|
]
|
|
11767
12076
|
},
|
|
@@ -11778,6 +12087,12 @@ var treeui_catalog_default = {
|
|
|
11778
12087
|
storyTitle: "Components/Data Entry/Textarea",
|
|
11779
12088
|
manifestFile: "docs/ai/COMPONENTS/textarea.yaml",
|
|
11780
12089
|
props: [
|
|
12090
|
+
{
|
|
12091
|
+
name: "spellcheck",
|
|
12092
|
+
type: "boolean",
|
|
12093
|
+
default: "undefined",
|
|
12094
|
+
description: 'A real `<textarea>` attribute that the declared surface was missing. It matters most with `family="mono"`: a JSON or config editor wants the spell-checker to stop underlining keys, ARNs and identifiers.'
|
|
12095
|
+
},
|
|
11781
12096
|
{
|
|
11782
12097
|
name: "modelValue",
|
|
11783
12098
|
type: "string",
|
|
@@ -11851,7 +12166,7 @@ var treeui_catalog_default = {
|
|
|
11851
12166
|
"sans",
|
|
11852
12167
|
"mono"
|
|
11853
12168
|
],
|
|
11854
|
-
note: "Font family of the editable content, same vocabulary as TText. `mono` is for machine text \u2014 JSON, a policy document, a payload \u2014 which otherwise
|
|
12169
|
+
note: "Font family of the editable content, same vocabulary as TText. `mono` is for machine text \u2014 JSON, a policy document, a payload \u2014 which otherwise needs a one-off `.mono` font-family rule in product CSS. Applied to the `<textarea>`, not the label wrapper, which also holds the loading spinner.\n"
|
|
11855
12170
|
}
|
|
11856
12171
|
],
|
|
11857
12172
|
events: [
|
|
@@ -11951,6 +12266,7 @@ var treeui_catalog_default = {
|
|
|
11951
12266
|
"timestamp_uses_time_element_when_provided: true"
|
|
11952
12267
|
],
|
|
11953
12268
|
behavior: [
|
|
12269
|
+
"content_stays_inside_the_container: `.t-timeline` and `.t-timeline__content` declare `grid-template-columns: minmax(0, 1fr)`, and the title and description carry `overflow-wrap: anywhere`. Together they stop an unbreakable string from setting the column's min-content and carrying the whole entry across the container.",
|
|
11954
12270
|
"items_render_in_order_given: true",
|
|
11955
12271
|
"line_hidden_on_last_item: true",
|
|
11956
12272
|
"marker_tone_defaults_to_neutral: true"
|
|
@@ -11966,7 +12282,9 @@ var treeui_catalog_default = {
|
|
|
11966
12282
|
notes: []
|
|
11967
12283
|
},
|
|
11968
12284
|
recipes: [],
|
|
11969
|
-
practices: [
|
|
12285
|
+
practices: [
|
|
12286
|
+
"content-alignment"
|
|
12287
|
+
]
|
|
11970
12288
|
},
|
|
11971
12289
|
{
|
|
11972
12290
|
name: "TToast",
|
|
@@ -11981,6 +12299,12 @@ var treeui_catalog_default = {
|
|
|
11981
12299
|
storyTitle: "Components/Feedback/Toast",
|
|
11982
12300
|
manifestFile: "docs/ai/COMPONENTS/toast.yaml",
|
|
11983
12301
|
props: [
|
|
12302
|
+
{
|
|
12303
|
+
name: "closeLabel",
|
|
12304
|
+
type: "string",
|
|
12305
|
+
default: "Dismiss notification",
|
|
12306
|
+
description: "Accessible name for the dismiss button, on `TToastProvider` as the instance default and on a single toast's options to override it. It was hard-coded English, which left the toast's only control unreadable to a screen reader in any other language."
|
|
12307
|
+
},
|
|
11984
12308
|
{
|
|
11985
12309
|
name: "toast",
|
|
11986
12310
|
type: "ToastItem",
|
|
@@ -12040,6 +12364,7 @@ var treeui_catalog_default = {
|
|
|
12040
12364
|
"confirm-destructive-action"
|
|
12041
12365
|
],
|
|
12042
12366
|
practices: [
|
|
12367
|
+
"accessible-by-default",
|
|
12043
12368
|
"token-driven"
|
|
12044
12369
|
]
|
|
12045
12370
|
},
|
|
@@ -12060,7 +12385,7 @@ var treeui_catalog_default = {
|
|
|
12060
12385
|
name: "modelValue",
|
|
12061
12386
|
type: "TToggleGroupModel<T, M> \u2014 `T` in single mode, `T[]` in multiple",
|
|
12062
12387
|
default: "undefined",
|
|
12063
|
-
note: "Generic over the option type AND the selection mode, so the model is the type the
|
|
12388
|
+
note: "Generic over the option type AND the selection mode, so the model is the type the binding actually has: `<TToggleGroup v-model=\"view\">` with a `ref<'grid' | 'list'>` binds, and `selectionMode=\"multiple\"` binds a `('grid' | 'list')[]`. It was `string | string[]` in and `string | string[] | undefined` out, which no literal-union ref could bind under `strictTemplates` \u2014 the same defect as TTabs/TInput, and invisible to any build that does not typecheck templates against the published types. `undefined` was never actually emitted.\n"
|
|
12064
12389
|
},
|
|
12065
12390
|
{
|
|
12066
12391
|
name: "options",
|
|
@@ -12121,6 +12446,7 @@ var treeui_catalog_default = {
|
|
|
12121
12446
|
"activation_keys_select_option: true"
|
|
12122
12447
|
],
|
|
12123
12448
|
behavior: [
|
|
12449
|
+
'selected_item_repaints_its_descendants_secondary_text: `.t-toggle-group__item.is-selected` rebinds `--tree-color-text-muted` to `--tree-color-brand-contrast`. Only the inherited colour used to change, so a `TText tone="muted"` in the `#option` slot kept reading the muted token and measured 1.18:1 (light) and 1.09:1 (dark) over the brand fill, where `xs` text needs 4.5:1. Rebinding the token is what keeps a slot the library does not control legible; `brand-contrast` is the only value that clears AA in both themes (5.19:1 / 6.21:1) \u2014 a `color-mix` at 85% still measured 4.18:1.',
|
|
12124
12450
|
"single_and_multiple_modes: true",
|
|
12125
12451
|
"variant_changes_visual_style_only: true",
|
|
12126
12452
|
"visible_option_set_expected: true"
|
|
@@ -12161,7 +12487,9 @@ var treeui_catalog_default = {
|
|
|
12161
12487
|
]
|
|
12162
12488
|
},
|
|
12163
12489
|
recipes: [],
|
|
12164
|
-
practices: [
|
|
12490
|
+
practices: [
|
|
12491
|
+
"accessible-by-default"
|
|
12492
|
+
]
|
|
12165
12493
|
},
|
|
12166
12494
|
{
|
|
12167
12495
|
name: "TTooltip",
|
|
@@ -13310,25 +13638,25 @@ var treeui_catalog_default = {
|
|
|
13310
13638
|
{
|
|
13311
13639
|
cssVar: "--tree-color-status-success",
|
|
13312
13640
|
path: "color.status.success",
|
|
13313
|
-
value: "#
|
|
13641
|
+
value: "#197d36",
|
|
13314
13642
|
category: "color",
|
|
13315
13643
|
derived: false,
|
|
13316
13644
|
description: "Themed semantic color, resolved per [data-tree-theme].",
|
|
13317
13645
|
themeValues: {
|
|
13318
|
-
light: "#
|
|
13319
|
-
dark: "#
|
|
13646
|
+
light: "#197d36",
|
|
13647
|
+
dark: "#5bae5e"
|
|
13320
13648
|
}
|
|
13321
13649
|
},
|
|
13322
13650
|
{
|
|
13323
13651
|
cssVar: "--tree-color-status-warning",
|
|
13324
13652
|
path: "color.status.warning",
|
|
13325
|
-
value: "#
|
|
13653
|
+
value: "#946300",
|
|
13326
13654
|
category: "color",
|
|
13327
13655
|
derived: false,
|
|
13328
13656
|
description: "Themed semantic color, resolved per [data-tree-theme].",
|
|
13329
13657
|
themeValues: {
|
|
13330
|
-
light: "#
|
|
13331
|
-
dark: "#
|
|
13658
|
+
light: "#946300",
|
|
13659
|
+
dark: "#c99227"
|
|
13332
13660
|
}
|
|
13333
13661
|
},
|
|
13334
13662
|
{
|
|
@@ -13634,25 +13962,25 @@ var treeui_catalog_default = {
|
|
|
13634
13962
|
{
|
|
13635
13963
|
cssVar: "--tree-color-status-success-hover",
|
|
13636
13964
|
path: "color.status.success-hover",
|
|
13637
|
-
value: "#
|
|
13965
|
+
value: "#15672c",
|
|
13638
13966
|
category: "color",
|
|
13639
13967
|
derived: true,
|
|
13640
13968
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13641
13969
|
themeValues: {
|
|
13642
|
-
light: "#
|
|
13643
|
-
dark: "#
|
|
13970
|
+
light: "#15672c",
|
|
13971
|
+
dark: "#79bd7b"
|
|
13644
13972
|
}
|
|
13645
13973
|
},
|
|
13646
13974
|
{
|
|
13647
13975
|
cssVar: "--tree-color-status-success-press",
|
|
13648
13976
|
path: "color.status.success-press",
|
|
13649
|
-
value: "#
|
|
13977
|
+
value: "#115525",
|
|
13650
13978
|
category: "color",
|
|
13651
13979
|
derived: true,
|
|
13652
13980
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13653
13981
|
themeValues: {
|
|
13654
|
-
light: "#
|
|
13655
|
-
dark: "#
|
|
13982
|
+
light: "#115525",
|
|
13983
|
+
dark: "#8fc892"
|
|
13656
13984
|
}
|
|
13657
13985
|
},
|
|
13658
13986
|
{
|
|
@@ -13664,31 +13992,31 @@ var treeui_catalog_default = {
|
|
|
13664
13992
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13665
13993
|
themeValues: {
|
|
13666
13994
|
light: "#dfede3",
|
|
13667
|
-
dark: "#
|
|
13995
|
+
dark: "#2a3a35"
|
|
13668
13996
|
}
|
|
13669
13997
|
},
|
|
13670
13998
|
{
|
|
13671
13999
|
cssVar: "--tree-color-status-success-soft-hover",
|
|
13672
14000
|
path: "color.status.success-soft-hover",
|
|
13673
|
-
value: "#
|
|
14001
|
+
value: "#c3ddcb",
|
|
13674
14002
|
category: "color",
|
|
13675
14003
|
derived: true,
|
|
13676
14004
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13677
14005
|
themeValues: {
|
|
13678
|
-
light: "#
|
|
13679
|
-
dark: "#
|
|
14006
|
+
light: "#c3ddcb",
|
|
14007
|
+
dark: "#314a3b"
|
|
13680
14008
|
}
|
|
13681
14009
|
},
|
|
13682
14010
|
{
|
|
13683
14011
|
cssVar: "--tree-color-status-success-border",
|
|
13684
14012
|
path: "color.status.success-border",
|
|
13685
|
-
value: "#
|
|
14013
|
+
value: "#419359",
|
|
13686
14014
|
category: "color",
|
|
13687
14015
|
derived: true,
|
|
13688
14016
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13689
14017
|
themeValues: {
|
|
13690
|
-
light: "#
|
|
13691
|
-
dark: "#
|
|
14018
|
+
light: "#419359",
|
|
14019
|
+
dark: "#4f9154"
|
|
13692
14020
|
}
|
|
13693
14021
|
},
|
|
13694
14022
|
{
|
|
@@ -13706,49 +14034,49 @@ var treeui_catalog_default = {
|
|
|
13706
14034
|
{
|
|
13707
14035
|
cssVar: "--tree-color-status-success-on-soft",
|
|
13708
14036
|
path: "color.status.success-on-soft",
|
|
13709
|
-
value: "#
|
|
14037
|
+
value: "#187733",
|
|
13710
14038
|
category: "color",
|
|
13711
14039
|
derived: true,
|
|
13712
14040
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13713
14041
|
themeValues: {
|
|
13714
|
-
light: "#
|
|
13715
|
-
dark: "#
|
|
14042
|
+
light: "#187733",
|
|
14043
|
+
dark: "#63b266"
|
|
13716
14044
|
}
|
|
13717
14045
|
},
|
|
13718
14046
|
{
|
|
13719
14047
|
cssVar: "--tree-color-status-success-on-soft-hover",
|
|
13720
14048
|
path: "color.status.success-on-soft-hover",
|
|
13721
|
-
value: "#
|
|
14049
|
+
value: "#156b2e",
|
|
13722
14050
|
category: "color",
|
|
13723
14051
|
derived: true,
|
|
13724
14052
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13725
14053
|
themeValues: {
|
|
13726
|
-
light: "#
|
|
13727
|
-
dark: "#
|
|
14054
|
+
light: "#156b2e",
|
|
14055
|
+
dark: "#80c082"
|
|
13728
14056
|
}
|
|
13729
14057
|
},
|
|
13730
14058
|
{
|
|
13731
14059
|
cssVar: "--tree-color-status-warning-hover",
|
|
13732
14060
|
path: "color.status.warning-hover",
|
|
13733
|
-
value: "#
|
|
14061
|
+
value: "#795100",
|
|
13734
14062
|
category: "color",
|
|
13735
14063
|
derived: true,
|
|
13736
14064
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13737
14065
|
themeValues: {
|
|
13738
|
-
light: "#
|
|
13739
|
-
dark: "#
|
|
14066
|
+
light: "#795100",
|
|
14067
|
+
dark: "#d3a64e"
|
|
13740
14068
|
}
|
|
13741
14069
|
},
|
|
13742
14070
|
{
|
|
13743
14071
|
cssVar: "--tree-color-status-warning-press",
|
|
13744
14072
|
path: "color.status.warning-press",
|
|
13745
|
-
value: "#
|
|
14073
|
+
value: "#654300",
|
|
13746
14074
|
category: "color",
|
|
13747
14075
|
derived: true,
|
|
13748
14076
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13749
14077
|
themeValues: {
|
|
13750
|
-
light: "#
|
|
13751
|
-
dark: "#
|
|
14078
|
+
light: "#654300",
|
|
14079
|
+
dark: "#dab56c"
|
|
13752
14080
|
}
|
|
13753
14081
|
},
|
|
13754
14082
|
{
|
|
@@ -13778,13 +14106,13 @@ var treeui_catalog_default = {
|
|
|
13778
14106
|
{
|
|
13779
14107
|
cssVar: "--tree-color-status-warning-border",
|
|
13780
14108
|
path: "color.status.warning-border",
|
|
13781
|
-
value: "#
|
|
14109
|
+
value: "#a67e2c",
|
|
13782
14110
|
category: "color",
|
|
13783
14111
|
derived: true,
|
|
13784
14112
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13785
14113
|
themeValues: {
|
|
13786
|
-
light: "#
|
|
13787
|
-
dark: "#
|
|
14114
|
+
light: "#a67e2c",
|
|
14115
|
+
dark: "#a57b29"
|
|
13788
14116
|
}
|
|
13789
14117
|
},
|
|
13790
14118
|
{
|
|
@@ -13802,25 +14130,25 @@ var treeui_catalog_default = {
|
|
|
13802
14130
|
{
|
|
13803
14131
|
cssVar: "--tree-color-status-warning-on-soft",
|
|
13804
14132
|
path: "color.status.warning-on-soft",
|
|
13805
|
-
value: "#
|
|
14133
|
+
value: "#8d5e00",
|
|
13806
14134
|
category: "color",
|
|
13807
14135
|
derived: true,
|
|
13808
14136
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13809
14137
|
themeValues: {
|
|
13810
|
-
light: "#
|
|
13811
|
-
dark: "#
|
|
14138
|
+
light: "#8d5e00",
|
|
14139
|
+
dark: "#cc9732"
|
|
13812
14140
|
}
|
|
13813
14141
|
},
|
|
13814
14142
|
{
|
|
13815
14143
|
cssVar: "--tree-color-status-warning-on-soft-hover",
|
|
13816
14144
|
path: "color.status.warning-on-soft-hover",
|
|
13817
|
-
value: "#
|
|
14145
|
+
value: "#7f5500",
|
|
13818
14146
|
category: "color",
|
|
13819
14147
|
derived: true,
|
|
13820
14148
|
description: "Themed semantic color, resolved per [data-tree-theme]. Derived by the library from the semantic layer \u2014 read it, do not override it.",
|
|
13821
14149
|
themeValues: {
|
|
13822
|
-
light: "#
|
|
13823
|
-
dark: "#
|
|
14150
|
+
light: "#7f5500",
|
|
14151
|
+
dark: "#d5ab58"
|
|
13824
14152
|
}
|
|
13825
14153
|
},
|
|
13826
14154
|
{
|