@treeui/mcp 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QO4S3UWW.js → chunk-UPSK3E4U.js} +864 -71
- package/dist/cli.cjs +864 -71
- package/dist/cli.js +1 -1
- package/dist/index.cjs +864 -71
- package/dist/index.js +1 -1
- package/package.json +1 -1
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: "2026-07-
|
|
37
|
+
generatedAt: "2026-07-18T19:02:09.022Z",
|
|
38
38
|
packageName: "@treeui/vue",
|
|
39
|
-
packageVersion: "0.
|
|
39
|
+
packageVersion: "0.15.0",
|
|
40
40
|
decisionGuides: [
|
|
41
41
|
{
|
|
42
42
|
id: "single-choice",
|
|
@@ -980,6 +980,22 @@ var treeui_catalog_default = {
|
|
|
980
980
|
type: "boolean",
|
|
981
981
|
default: "true"
|
|
982
982
|
},
|
|
983
|
+
{
|
|
984
|
+
name: "showCollapseButton",
|
|
985
|
+
type: "boolean",
|
|
986
|
+
default: "true",
|
|
987
|
+
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."
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
name: "collapseLabel",
|
|
991
|
+
type: "string",
|
|
992
|
+
default: "Collapse sidebar"
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
name: "expandLabel",
|
|
996
|
+
type: "string",
|
|
997
|
+
default: "Expand sidebar"
|
|
998
|
+
},
|
|
983
999
|
{
|
|
984
1000
|
name: "menuLabel",
|
|
985
1001
|
type: "string",
|
|
@@ -1014,14 +1030,26 @@ var treeui_catalog_default = {
|
|
|
1014
1030
|
{
|
|
1015
1031
|
name: "header"
|
|
1016
1032
|
},
|
|
1033
|
+
{
|
|
1034
|
+
name: "header-start"
|
|
1035
|
+
},
|
|
1036
|
+
{
|
|
1037
|
+
name: "sidebar-header"
|
|
1038
|
+
},
|
|
1017
1039
|
{
|
|
1018
1040
|
name: "sidebar"
|
|
1019
1041
|
},
|
|
1042
|
+
{
|
|
1043
|
+
name: "sidebar-footer"
|
|
1044
|
+
},
|
|
1020
1045
|
{
|
|
1021
1046
|
name: "default"
|
|
1022
1047
|
},
|
|
1023
1048
|
{
|
|
1024
1049
|
name: "menu-icon"
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
name: "collapse-icon"
|
|
1025
1053
|
}
|
|
1026
1054
|
],
|
|
1027
1055
|
a11y: [
|
|
@@ -1049,7 +1077,10 @@ var treeui_catalog_default = {
|
|
|
1049
1077
|
"left_and_right_variants: true",
|
|
1050
1078
|
"locks_body_scroll_while_drawer_open: true",
|
|
1051
1079
|
"overlay_click_closes_when_enabled: true",
|
|
1052
|
-
"exposes_slot_props_with_mobile_collapsed_and_toggles: true"
|
|
1080
|
+
"exposes_slot_props_with_mobile_collapsed_and_toggles: true",
|
|
1081
|
+
"sidebar_footer_pinned_to_bottom: true",
|
|
1082
|
+
"sidebar_header_and_footer_inset_to_align_with_nav_icons: true",
|
|
1083
|
+
"header_mirrors_shell_columns_when_header_start_is_used: true"
|
|
1053
1084
|
],
|
|
1054
1085
|
selection: {
|
|
1055
1086
|
keywords: [
|
|
@@ -1321,15 +1352,17 @@ var treeui_catalog_default = {
|
|
|
1321
1352
|
},
|
|
1322
1353
|
{
|
|
1323
1354
|
name: "variant",
|
|
1324
|
-
type: "TVariant",
|
|
1355
|
+
type: "TVariant | brand",
|
|
1325
1356
|
default: "solid",
|
|
1326
1357
|
values: [
|
|
1327
1358
|
"solid",
|
|
1328
1359
|
"outline",
|
|
1329
1360
|
"ghost",
|
|
1330
1361
|
"soft",
|
|
1331
|
-
"danger"
|
|
1332
|
-
|
|
1362
|
+
"danger",
|
|
1363
|
+
"brand"
|
|
1364
|
+
],
|
|
1365
|
+
note: "`brand` is a button-only, high-emphasis gradient variant driven by the `--tree-gradient-brand` token. Use it for the single primary CTA of a screen."
|
|
1333
1366
|
},
|
|
1334
1367
|
{
|
|
1335
1368
|
name: "size",
|
|
@@ -1356,6 +1389,18 @@ var treeui_catalog_default = {
|
|
|
1356
1389
|
name: "type",
|
|
1357
1390
|
type: "button | submit | reset",
|
|
1358
1391
|
default: "button"
|
|
1392
|
+
},
|
|
1393
|
+
{
|
|
1394
|
+
name: "block",
|
|
1395
|
+
type: "boolean",
|
|
1396
|
+
default: "false",
|
|
1397
|
+
note: "Stretches the button to the full width of its container. Useful for menu rows and mobile CTAs."
|
|
1398
|
+
},
|
|
1399
|
+
{
|
|
1400
|
+
name: "align",
|
|
1401
|
+
type: "start | center | end",
|
|
1402
|
+
default: "center",
|
|
1403
|
+
note: "Content alignment; only meaningful together with `block`. Use `start` for left-aligned icon+label menu rows."
|
|
1359
1404
|
}
|
|
1360
1405
|
],
|
|
1361
1406
|
events: [
|
|
@@ -1421,7 +1466,6 @@ var treeui_catalog_default = {
|
|
|
1421
1466
|
values: [
|
|
1422
1467
|
"outline",
|
|
1423
1468
|
"soft",
|
|
1424
|
-
"solid",
|
|
1425
1469
|
"inset"
|
|
1426
1470
|
]
|
|
1427
1471
|
},
|
|
@@ -1460,7 +1504,8 @@ var treeui_catalog_default = {
|
|
|
1460
1504
|
a11y: [],
|
|
1461
1505
|
behavior: [
|
|
1462
1506
|
"body_wrapper_class: t-card__body",
|
|
1463
|
-
"
|
|
1507
|
+
'variant_effects: {"outline":"Base surface with a default border. The styling baseline \u2014 the `t-card--outline` class is emitted but carries no CSS rule of its own.","soft":"Subtle tinted surface (bg-subtle), same border and shadow as outline.","inset":"Same tinted surface as soft, but with no shadow, so it reads as recessed inside another surface."}',
|
|
1508
|
+
"note: No card variant inverts its surface, so nested content inherits the normal color tokens. For a high-emphasis card, use a brand-colored border rather than an inverted background."
|
|
1464
1509
|
],
|
|
1465
1510
|
selection: {
|
|
1466
1511
|
keywords: [
|
|
@@ -1789,6 +1834,92 @@ var treeui_catalog_default = {
|
|
|
1789
1834
|
},
|
|
1790
1835
|
recipes: []
|
|
1791
1836
|
},
|
|
1837
|
+
{
|
|
1838
|
+
name: "TColorSwatch",
|
|
1839
|
+
aliases: [],
|
|
1840
|
+
package: "@treeui/vue",
|
|
1841
|
+
kind: "form",
|
|
1842
|
+
category: "Data Entry",
|
|
1843
|
+
status: "available",
|
|
1844
|
+
purpose: "Pick a colour from a row of preset swatches, with an optional native colour input for an arbitrary value. Built for accent/brand pickers.",
|
|
1845
|
+
sourceFile: "packages/vue/src/components/TColorSwatch.vue",
|
|
1846
|
+
storyFile: "apps/docs/src/stories/ColorSwatch.stories.ts",
|
|
1847
|
+
storyTitle: "Components/Data Entry/ColorSwatch",
|
|
1848
|
+
manifestFile: "docs/ai/COMPONENTS/color-swatch.yaml",
|
|
1849
|
+
props: [
|
|
1850
|
+
{
|
|
1851
|
+
name: "modelValue",
|
|
1852
|
+
type: "string",
|
|
1853
|
+
default: "undefined",
|
|
1854
|
+
note: "Selected colour as a hex string. Matching is case-insensitive."
|
|
1855
|
+
},
|
|
1856
|
+
{
|
|
1857
|
+
name: "options",
|
|
1858
|
+
type: "TColorSwatchOption[]",
|
|
1859
|
+
default: "[]",
|
|
1860
|
+
note: "Preset swatches, each `{ label, value }`. `label` becomes the button's accessible name."
|
|
1861
|
+
},
|
|
1862
|
+
{
|
|
1863
|
+
name: "allowCustom",
|
|
1864
|
+
type: "boolean",
|
|
1865
|
+
default: "false",
|
|
1866
|
+
note: 'Appends a native `<input type="color">` for values outside the presets.'
|
|
1867
|
+
},
|
|
1868
|
+
{
|
|
1869
|
+
name: "size",
|
|
1870
|
+
type: "TSize",
|
|
1871
|
+
default: "md",
|
|
1872
|
+
values: [
|
|
1873
|
+
"sm",
|
|
1874
|
+
"md",
|
|
1875
|
+
"lg"
|
|
1876
|
+
]
|
|
1877
|
+
},
|
|
1878
|
+
{
|
|
1879
|
+
name: "label",
|
|
1880
|
+
type: "string",
|
|
1881
|
+
default: "Color",
|
|
1882
|
+
note: 'Accessible label for the swatch group (`role="group"`).'
|
|
1883
|
+
},
|
|
1884
|
+
{
|
|
1885
|
+
name: "customLabel",
|
|
1886
|
+
type: "string",
|
|
1887
|
+
default: "Custom color"
|
|
1888
|
+
},
|
|
1889
|
+
{
|
|
1890
|
+
name: "disabled",
|
|
1891
|
+
type: "boolean",
|
|
1892
|
+
default: "false"
|
|
1893
|
+
}
|
|
1894
|
+
],
|
|
1895
|
+
events: [
|
|
1896
|
+
{
|
|
1897
|
+
name: "update:modelValue"
|
|
1898
|
+
}
|
|
1899
|
+
],
|
|
1900
|
+
slots: [],
|
|
1901
|
+
a11y: [
|
|
1902
|
+
'Wrapper is `role="group"` labelled by `label`.',
|
|
1903
|
+
"Each swatch is a native button with `aria-pressed` reflecting selection and `aria-label` from the option label.",
|
|
1904
|
+
"Selection is conveyed by an outline (not colour alone), since the swatch's own colour is the content."
|
|
1905
|
+
],
|
|
1906
|
+
behavior: [
|
|
1907
|
+
"emits_on_preset_click: true",
|
|
1908
|
+
"emits_on_custom_input: true",
|
|
1909
|
+
"blocks_interaction_when_disabled: true"
|
|
1910
|
+
],
|
|
1911
|
+
selection: {
|
|
1912
|
+
keywords: [],
|
|
1913
|
+
useWhen: [],
|
|
1914
|
+
avoidWhen: [],
|
|
1915
|
+
alternatives: []
|
|
1916
|
+
},
|
|
1917
|
+
setup: {
|
|
1918
|
+
required: [],
|
|
1919
|
+
notes: []
|
|
1920
|
+
},
|
|
1921
|
+
recipes: []
|
|
1922
|
+
},
|
|
1792
1923
|
{
|
|
1793
1924
|
name: "TCombobox",
|
|
1794
1925
|
aliases: [],
|
|
@@ -2174,9 +2305,14 @@ var treeui_catalog_default = {
|
|
|
2174
2305
|
"The page shell should stay full-width while content stays readable."
|
|
2175
2306
|
],
|
|
2176
2307
|
avoidWhen: [
|
|
2177
|
-
"You need internal spacing between children."
|
|
2308
|
+
"You need internal spacing between children.",
|
|
2309
|
+
"You are laying out a whole screen \u2014 reach for TPage, which adds page padding and vertical rhythm."
|
|
2178
2310
|
],
|
|
2179
2311
|
alternatives: [
|
|
2312
|
+
{
|
|
2313
|
+
component: "TPage",
|
|
2314
|
+
when: "You want a full page region with block padding and vertical spacing between sections, not just a width constraint."
|
|
2315
|
+
},
|
|
2180
2316
|
{
|
|
2181
2317
|
component: "TStack",
|
|
2182
2318
|
when: "The main need is vertical or horizontal spacing."
|
|
@@ -3175,7 +3311,7 @@ var treeui_catalog_default = {
|
|
|
3175
3311
|
kind: "form",
|
|
3176
3312
|
category: "Form",
|
|
3177
3313
|
status: "available",
|
|
3178
|
-
purpose: "Composable dropzone and file picker with browse, drag-and-drop, and Ctrl+V paste support.",
|
|
3314
|
+
purpose: "Composable dropzone and file picker with browse, drag-and-drop, and Ctrl+V paste support, plus per-file upload state: progress, remaining time, thumbnails, and independent per-file retry/resume.",
|
|
3179
3315
|
sourceFile: "packages/vue/src/components/TFileUpload.vue",
|
|
3180
3316
|
storyFile: "apps/docs/src/stories/FileUpload.stories.ts",
|
|
3181
3317
|
storyTitle: "Components/Form/FileUpload",
|
|
@@ -3199,12 +3335,14 @@ var treeui_catalog_default = {
|
|
|
3199
3335
|
{
|
|
3200
3336
|
name: "disabled",
|
|
3201
3337
|
type: "boolean",
|
|
3202
|
-
default: "false"
|
|
3338
|
+
default: "false",
|
|
3339
|
+
description: "The ONLY prop that gates interaction. Disables the dropzone, the native input, Clear all, and every per-row Remove/Retry."
|
|
3203
3340
|
},
|
|
3204
3341
|
{
|
|
3205
3342
|
name: "loading",
|
|
3206
3343
|
type: "boolean",
|
|
3207
|
-
default: "false"
|
|
3344
|
+
default: "false",
|
|
3345
|
+
description: "Presentational only. Applies `is-loading`, `aria-busy` on the dropzone, and the corner spinner. It gates NO interaction \u2014 see behavior.loading_is_presentational."
|
|
3208
3346
|
},
|
|
3209
3347
|
{
|
|
3210
3348
|
name: "invalid",
|
|
@@ -3265,44 +3403,142 @@ var treeui_catalog_default = {
|
|
|
3265
3403
|
name: "showFileList",
|
|
3266
3404
|
type: "boolean",
|
|
3267
3405
|
default: "true"
|
|
3406
|
+
},
|
|
3407
|
+
{
|
|
3408
|
+
name: "uploadState",
|
|
3409
|
+
type: "TFileUploadStateSource",
|
|
3410
|
+
default: "none",
|
|
3411
|
+
description: "Per-file transport state, keyed by File OBJECT IDENTITY. Accepts a ReadonlyMap<File, TFileUploadState> or a (file, index) => TFileUploadState | undefined resolver. Omit it and the component renders exactly as before: no bars, no status lines, no retry."
|
|
3412
|
+
},
|
|
3413
|
+
{
|
|
3414
|
+
name: "dragLabel",
|
|
3415
|
+
type: "string",
|
|
3416
|
+
default: "Release to upload",
|
|
3417
|
+
description: "Replaces `label` in the dropzone while an acceptable drag is over it. Set it to the same value as `label` to opt out of the text swap."
|
|
3418
|
+
},
|
|
3419
|
+
{
|
|
3420
|
+
name: "dragRejectLabel",
|
|
3421
|
+
type: "string",
|
|
3422
|
+
default: "This file type is not accepted",
|
|
3423
|
+
description: "Replaces `label` while a drag that cannot work is over the dropzone. Only reachable when drag-reject detection is possible \u2014 see behavior.drag_reject_detection_is_mime_only."
|
|
3424
|
+
},
|
|
3425
|
+
{
|
|
3426
|
+
name: "thumbnails",
|
|
3427
|
+
type: "boolean",
|
|
3428
|
+
default: "true",
|
|
3429
|
+
description: "Mint object-URL previews and decode dimensions for image/* files. Set false when you always supply `state.thumbnailUrl` yourself."
|
|
3430
|
+
},
|
|
3431
|
+
{
|
|
3432
|
+
name: "maxThumbnailSize",
|
|
3433
|
+
type: "number | null",
|
|
3434
|
+
default: "10 * 1024 * 1024",
|
|
3435
|
+
description: "Skip auto-thumbnailing above this byte size. null removes the cap."
|
|
3436
|
+
},
|
|
3437
|
+
{
|
|
3438
|
+
name: "retryLabel",
|
|
3439
|
+
type: "string",
|
|
3440
|
+
default: "Retry"
|
|
3441
|
+
},
|
|
3442
|
+
{
|
|
3443
|
+
name: "resumeLabel",
|
|
3444
|
+
type: "(percent: number) => string",
|
|
3445
|
+
default: "(percent) => `Resume from ${percent}%`",
|
|
3446
|
+
description: "Receives Math.round(state.progress). Used only when state.resumable === true AND state.progress is a number."
|
|
3447
|
+
},
|
|
3448
|
+
{
|
|
3449
|
+
name: "remainingTimeFormat",
|
|
3450
|
+
type: "(remainingMs: number) => string",
|
|
3451
|
+
default: "5s/60s/60min thresholds \u2014 see behavior.remaining_time_strings",
|
|
3452
|
+
description: "Formats state.remainingMs. Ignored for a row that supplies state.remainingLabel."
|
|
3453
|
+
},
|
|
3454
|
+
{
|
|
3455
|
+
name: "statusLabels",
|
|
3456
|
+
type: "Partial<Record<TFileUploadStatus, string>>",
|
|
3457
|
+
default: "{}",
|
|
3458
|
+
description: "MERGED over the defaults { pending: Waiting, uploading: Uploading, paused: Paused, error: Upload failed, success: Uploaded } \u2014 pass only the keys you override."
|
|
3268
3459
|
}
|
|
3269
3460
|
],
|
|
3270
3461
|
events: [
|
|
3271
3462
|
{
|
|
3272
|
-
name: "update:modelValue"
|
|
3463
|
+
name: "update:modelValue",
|
|
3464
|
+
description: "Emitted with the next file list when files are added, removed, or cleared.",
|
|
3465
|
+
payload: "File[]"
|
|
3466
|
+
},
|
|
3467
|
+
{
|
|
3468
|
+
name: "files-accepted",
|
|
3469
|
+
description: "Emitted with only the newly accepted files, after accept/maxFiles/maxFileSize validation.",
|
|
3470
|
+
payload: "File[]"
|
|
3471
|
+
},
|
|
3472
|
+
{
|
|
3473
|
+
name: "files-rejected",
|
|
3474
|
+
description: "Pre-acceptance validation failures. Unrelated to transport errors, which you report through `uploadState`.",
|
|
3475
|
+
payload: "TFileUploadRejection[]"
|
|
3273
3476
|
},
|
|
3274
3477
|
{
|
|
3275
|
-
name: "
|
|
3478
|
+
name: "retry",
|
|
3479
|
+
description: "Emitted when a row's retry affordance is activated. Pure intent \u2014 the component performs no upload. Use `payload.mode` ('resume' | 'restart'); it reports the affordance the component ACTUALLY DREW, so never re-derive it from your own state.",
|
|
3480
|
+
payload: "TFileUploadRetryPayload"
|
|
3276
3481
|
},
|
|
3277
3482
|
{
|
|
3278
|
-
name: "
|
|
3483
|
+
name: "cancel",
|
|
3484
|
+
description: "Emitted ONLY for rows whose status is 'uploading' or 'paused', immediately BEFORE the `update:modelValue` that drops them \u2014 so the file is still in the list when your handler runs and you can abort the request. `reason` is 'remove' for one row or 'clear' (one event per in-flight file) for Clear all.",
|
|
3485
|
+
payload: "TFileUploadCancelPayload"
|
|
3279
3486
|
}
|
|
3280
3487
|
],
|
|
3281
3488
|
slots: [
|
|
3282
3489
|
{
|
|
3283
|
-
name: "icon"
|
|
3490
|
+
name: "icon",
|
|
3491
|
+
description: "Replaces the dropzone icon."
|
|
3284
3492
|
},
|
|
3285
3493
|
{
|
|
3286
|
-
name: "default"
|
|
3494
|
+
name: "default",
|
|
3495
|
+
description: "Replaces the dropzone body. Receives `{ files, isDragActive, isDragReject, openFileDialog, clearFiles }`."
|
|
3287
3496
|
},
|
|
3288
3497
|
{
|
|
3289
|
-
name: "file"
|
|
3498
|
+
name: "file",
|
|
3499
|
+
description: "Full row override. Receives all of TFileUploadFileSlotProps, including every derived label, so a custom row re-derives nothing."
|
|
3290
3500
|
},
|
|
3291
3501
|
{
|
|
3292
|
-
name: "
|
|
3502
|
+
name: "file-status",
|
|
3503
|
+
description: "Replaces ONLY the progress bar + status line + error block inside the default row. Receives TFileUploadFileSlotProps. Name, meta, thumbnail, Retry, and Remove keep rendering. Ignored when the `file` slot is provided."
|
|
3504
|
+
},
|
|
3505
|
+
{
|
|
3506
|
+
name: "actions",
|
|
3507
|
+
description: "Footer actions. Receives `{ files, openFileDialog, clearFiles }` \u2014 no upload state."
|
|
3293
3508
|
}
|
|
3294
3509
|
],
|
|
3295
3510
|
a11y: [
|
|
3296
3511
|
"dropzone_role: button",
|
|
3297
3512
|
"keyboard_activation: Enter_and_Space_open_the_file_picker",
|
|
3298
3513
|
"supports_paste_when_component_is_focused: true",
|
|
3299
|
-
"file_feedback_announced_via_live_region: true"
|
|
3514
|
+
"file_feedback_announced_via_live_region: true",
|
|
3515
|
+
"aria_busy_on_dropzone_tracks_loading_prop: true",
|
|
3516
|
+
"aria_busy_on_row_tracks_that_rows_uploading_status: true",
|
|
3517
|
+
"per_row_progressbar_is_labelled_with_status_and_filename: e.g. 'Uploading hero.png' \u2014 every row's bar has a distinct accessible name.",
|
|
3518
|
+
"terminal_transitions_announced_with_filenames: One polite root live region (`role=log`) announces only success/error, e.g. 'alpha.txt uploaded.' / 'alpha.txt failed. Connection lost.'",
|
|
3519
|
+
"repeated_identical_messages_are_still_announced: The log appends each message as a new node rather than overwriting one string, so a retry that fails with the byte-identical error still mutates the region and is announced. It is not aria-atomic: only the appended message is read, and the trimmed history (5 most recent) is not.",
|
|
3520
|
+
"percentages_are_never_announced: Percent and ETA live in non-live text; the value reaches assistive tech through the progressbar's aria-valuenow.",
|
|
3521
|
+
"retry_button_is_described_by_its_row_error: Announces 'Resume from 90%, Connection lost at 90%'.",
|
|
3522
|
+
"focus_is_rescued_when_retry_unmounts: Flipping error -> uploading removes the focused Retry; focus moves to that row's Remove (or the dropzone), and only when it was genuinely lost.",
|
|
3523
|
+
"remove_and_retry_meet_the_44px_target: true"
|
|
3300
3524
|
],
|
|
3301
3525
|
behavior: [
|
|
3302
3526
|
"accepts_files_from_input_drop_and_paste: true",
|
|
3303
3527
|
"multiple_false_replaces_existing_selection: true",
|
|
3304
3528
|
"accept_maxFiles_and_maxFileSize_apply_to_all_entry_points: true",
|
|
3305
|
-
"selected_files_can_be_removed_or_cleared: true"
|
|
3529
|
+
"selected_files_can_be_removed_or_cleared: true",
|
|
3530
|
+
"upload_state_is_keyed_by_file_identity: Both source shapes key on the File object, never on index or name. Key your own store with the File objects you receive from `files-accepted`.",
|
|
3531
|
+
"a_lookup_miss_renders_nothing: An unknown File yields `undefined` and the row falls back to name + meta only \u2014 no bar, no status, no retry. This fail-blank is deliberate: it is the back-compat path and it fails loudly instead of showing another file's percentage.",
|
|
3532
|
+
"loading_is_presentational: BREAKING since 0.14.0 \u2014 `loading` no longer disables anything. It was freezing the dropzone, Clear all, and every Remove, which blocked removing file 1 while file 4 uploaded. Use `:disabled` to reproduce the old behavior; prefer `uploadState` and freeze nothing.",
|
|
3533
|
+
"each_file_has_an_independent_track: One row's error, progress, or retry never gates another's. Remove stays enabled for in-flight rows and emits `cancel` so you can abort.",
|
|
3534
|
+
"errors_are_per_row: Transport errors go in `state.error` and render under their own row. They never enter the dropzone feedback list, which Remove and Clear all wipe.",
|
|
3535
|
+
"drag_feedback_has_three_signals: Border, glow, and a text swap to `dragLabel` \u2014 all three fire together, including when files are already listed.",
|
|
3536
|
+
"drag_reject_detection_is_mime_only: `is-drag-reject` + `dragRejectLabel` require every `accept` token to be a MIME token; with any `.ext` token the dropzone stays neutral, because a drag exposes only `.type`. A mixed drag (one good file, one bad) is NOT rejected, and the drop is never blocked \u2014 rejected files always get the normal `files-rejected` explanation.",
|
|
3537
|
+
"progress_bar_visibility: Shown on uploading/paused/error, and on success only with numeric progress. 'uploading' without progress is indeterminate; paused/error without progress is a determinate 0 \u2014 an errored bar must never animate.",
|
|
3538
|
+
"the_bar_is_never_reset_on_error: It holds `state.progress` in the error tone. That retained 90% is what makes the resume promise legible.",
|
|
3539
|
+
"remaining_time_strings: < 5000ms -> 'Less than 5s left'; < 60s -> 'About 12s left'; < 60min -> 'About 2 min left'; else 'About 2h left'. Negative, NaN, and Infinity render nothing.",
|
|
3540
|
+
"status_line_composition: Joins the present parts with ' \xB7 ': 'Uploading \xB7 62% \xB7 About 12s left' while uploading, 'Upload failed \xB7 2.1 MB of 2.4 MB uploaded' on a resumable error.",
|
|
3541
|
+
"thumbnails_are_client_only: Object URLs are minted after mount and revoked on removal and unmount. SSR and the hydrating render both show the extension chip, so there is no mismatch."
|
|
3306
3542
|
],
|
|
3307
3543
|
selection: {
|
|
3308
3544
|
keywords: [],
|
|
@@ -3667,6 +3903,20 @@ var treeui_catalog_default = {
|
|
|
3667
3903
|
"lg"
|
|
3668
3904
|
]
|
|
3669
3905
|
},
|
|
3906
|
+
{
|
|
3907
|
+
name: "width",
|
|
3908
|
+
type: "TFieldWidth",
|
|
3909
|
+
default: "full",
|
|
3910
|
+
values: [
|
|
3911
|
+
"xs",
|
|
3912
|
+
"sm",
|
|
3913
|
+
"md",
|
|
3914
|
+
"lg",
|
|
3915
|
+
"xl",
|
|
3916
|
+
"full"
|
|
3917
|
+
],
|
|
3918
|
+
note: "Inline-size cap (max-inline-size). Fluid by default; use instead of an inline width style."
|
|
3919
|
+
},
|
|
3670
3920
|
{
|
|
3671
3921
|
name: "disabled",
|
|
3672
3922
|
type: "boolean",
|
|
@@ -3751,6 +4001,43 @@ var treeui_catalog_default = {
|
|
|
3751
4001
|
"tag-input"
|
|
3752
4002
|
]
|
|
3753
4003
|
},
|
|
4004
|
+
{
|
|
4005
|
+
name: "TKbd",
|
|
4006
|
+
aliases: [],
|
|
4007
|
+
package: "@treeui/vue",
|
|
4008
|
+
kind: "primitive",
|
|
4009
|
+
category: "Data Display",
|
|
4010
|
+
status: "available",
|
|
4011
|
+
purpose: "Keyboard-key hint (e.g. \u2318K, Esc, Ctrl) rendered as a native <kbd> with the library's chip styling.",
|
|
4012
|
+
sourceFile: "packages/vue/src/components/TKbd.vue",
|
|
4013
|
+
storyFile: "apps/docs/src/stories/Kbd.stories.ts",
|
|
4014
|
+
storyTitle: "Components/Data Display/Kbd",
|
|
4015
|
+
manifestFile: "docs/ai/COMPONENTS/kbd.yaml",
|
|
4016
|
+
props: [],
|
|
4017
|
+
events: [],
|
|
4018
|
+
slots: [
|
|
4019
|
+
{
|
|
4020
|
+
name: "default"
|
|
4021
|
+
}
|
|
4022
|
+
],
|
|
4023
|
+
a11y: [
|
|
4024
|
+
"Uses the native <kbd> element so assistive tech announces it as keyboard input."
|
|
4025
|
+
],
|
|
4026
|
+
behavior: [
|
|
4027
|
+
"renders_native_kbd_element: true"
|
|
4028
|
+
],
|
|
4029
|
+
selection: {
|
|
4030
|
+
keywords: [],
|
|
4031
|
+
useWhen: [],
|
|
4032
|
+
avoidWhen: [],
|
|
4033
|
+
alternatives: []
|
|
4034
|
+
},
|
|
4035
|
+
setup: {
|
|
4036
|
+
required: [],
|
|
4037
|
+
notes: []
|
|
4038
|
+
},
|
|
4039
|
+
recipes: []
|
|
4040
|
+
},
|
|
3754
4041
|
{
|
|
3755
4042
|
name: "TLink",
|
|
3756
4043
|
aliases: [],
|
|
@@ -4357,7 +4644,7 @@ var treeui_catalog_default = {
|
|
|
4357
4644
|
name: "items",
|
|
4358
4645
|
type: "TNavMenuItem[]",
|
|
4359
4646
|
default: "[]",
|
|
4360
|
-
note: "Array of `{ label, value, shortLabel?, description?, icon?, to?, badge?, disabled? }`."
|
|
4647
|
+
note: "Array of `{ label, value, shortLabel?, description?, icon?, to?, badge?, disabled?, exact? }`."
|
|
4361
4648
|
},
|
|
4362
4649
|
{
|
|
4363
4650
|
name: "size",
|
|
@@ -4378,6 +4665,12 @@ var treeui_catalog_default = {
|
|
|
4378
4665
|
name: "disabled",
|
|
4379
4666
|
type: "boolean",
|
|
4380
4667
|
default: "false"
|
|
4668
|
+
},
|
|
4669
|
+
{
|
|
4670
|
+
name: "exact",
|
|
4671
|
+
type: "boolean",
|
|
4672
|
+
default: "true",
|
|
4673
|
+
note: "Default active-match strategy for router-link items. `true` keeps only the exactly-active route highlighted (prevents prefix matches from lighting up several items at once). Override per item via `TNavMenuItem.exact`."
|
|
4381
4674
|
}
|
|
4382
4675
|
],
|
|
4383
4676
|
events: [
|
|
@@ -4552,75 +4845,262 @@ var treeui_catalog_default = {
|
|
|
4552
4845
|
recipes: []
|
|
4553
4846
|
},
|
|
4554
4847
|
{
|
|
4555
|
-
name: "
|
|
4848
|
+
name: "TPage",
|
|
4556
4849
|
aliases: [],
|
|
4557
4850
|
package: "@treeui/vue",
|
|
4558
|
-
kind: "
|
|
4559
|
-
category: "
|
|
4851
|
+
kind: "layout",
|
|
4852
|
+
category: "Layout",
|
|
4560
4853
|
status: "available",
|
|
4561
|
-
purpose: "
|
|
4562
|
-
sourceFile: "packages/vue/src/components/
|
|
4563
|
-
storyFile: "apps/docs/src/stories/
|
|
4564
|
-
storyTitle: "Components/
|
|
4565
|
-
manifestFile: "docs/ai/COMPONENTS/
|
|
4854
|
+
purpose: "Semantic page region under the app shell: block padding, a centered max-width content column, and standardized vertical rhythm between sections.",
|
|
4855
|
+
sourceFile: "packages/vue/src/components/TPage.vue",
|
|
4856
|
+
storyFile: "apps/docs/src/stories/Page.stories.ts",
|
|
4857
|
+
storyTitle: "Components/Layout/Page",
|
|
4858
|
+
manifestFile: "docs/ai/COMPONENTS/page.yaml",
|
|
4566
4859
|
props: [
|
|
4567
4860
|
{
|
|
4568
|
-
name: "
|
|
4569
|
-
type: "
|
|
4570
|
-
default: "
|
|
4571
|
-
description: "Current active page (1-based). Use with v-model."
|
|
4572
|
-
},
|
|
4573
|
-
{
|
|
4574
|
-
name: "totalPages",
|
|
4575
|
-
type: "number",
|
|
4576
|
-
required: true,
|
|
4577
|
-
description: "Total number of pages."
|
|
4578
|
-
},
|
|
4579
|
-
{
|
|
4580
|
-
name: "siblings",
|
|
4581
|
-
type: "number",
|
|
4582
|
-
default: "1",
|
|
4583
|
-
description: "Number of sibling page buttons shown around the current page."
|
|
4861
|
+
name: "as",
|
|
4862
|
+
type: "string",
|
|
4863
|
+
default: "div"
|
|
4584
4864
|
},
|
|
4585
4865
|
{
|
|
4586
|
-
name: "
|
|
4587
|
-
type: "
|
|
4588
|
-
default: "
|
|
4866
|
+
name: "width",
|
|
4867
|
+
type: "TContainerSize",
|
|
4868
|
+
default: "lg",
|
|
4589
4869
|
values: [
|
|
4590
4870
|
"sm",
|
|
4591
4871
|
"md",
|
|
4592
|
-
"lg"
|
|
4872
|
+
"lg",
|
|
4873
|
+
"xl",
|
|
4874
|
+
"full"
|
|
4593
4875
|
],
|
|
4594
|
-
|
|
4876
|
+
note: "Max-width of the centered content column. Mirrors TContainer sizes."
|
|
4595
4877
|
},
|
|
4596
4878
|
{
|
|
4597
|
-
name: "
|
|
4879
|
+
name: "padded",
|
|
4598
4880
|
type: "boolean",
|
|
4599
|
-
default: "
|
|
4600
|
-
|
|
4881
|
+
default: "true",
|
|
4882
|
+
note: "Adds vertical (block) padding on the region and horizontal padding on the inner column."
|
|
4601
4883
|
},
|
|
4602
4884
|
{
|
|
4603
|
-
name: "
|
|
4604
|
-
type: "
|
|
4605
|
-
default: "
|
|
4606
|
-
|
|
4607
|
-
|
|
4608
|
-
|
|
4609
|
-
|
|
4610
|
-
|
|
4611
|
-
|
|
4612
|
-
description: "Emitted when the active page changes. Enables v-model binding.",
|
|
4613
|
-
payload: "[page: number]"
|
|
4885
|
+
name: "gap",
|
|
4886
|
+
type: "TPageGap",
|
|
4887
|
+
default: "lg",
|
|
4888
|
+
values: [
|
|
4889
|
+
"sm",
|
|
4890
|
+
"md",
|
|
4891
|
+
"lg"
|
|
4892
|
+
],
|
|
4893
|
+
note: "Vertical spacing between direct children (e.g. a TPageHeader and content sections)."
|
|
4614
4894
|
}
|
|
4615
4895
|
],
|
|
4896
|
+
events: [],
|
|
4616
4897
|
slots: [
|
|
4617
4898
|
{
|
|
4618
|
-
name: "
|
|
4619
|
-
|
|
4620
|
-
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4899
|
+
name: "default"
|
|
4900
|
+
}
|
|
4901
|
+
],
|
|
4902
|
+
a11y: [
|
|
4903
|
+
"Structural wrapper only; landmark semantics come from `as` and the surrounding app shell (avoid nesting a second `main`)."
|
|
4904
|
+
],
|
|
4905
|
+
behavior: [
|
|
4906
|
+
"centers_content_column_by_width: true",
|
|
4907
|
+
"applies_block_padding_when_padded: true",
|
|
4908
|
+
"spaces_children_vertically_by_gap: true"
|
|
4909
|
+
],
|
|
4910
|
+
selection: {
|
|
4911
|
+
keywords: [
|
|
4912
|
+
"page",
|
|
4913
|
+
"page shell",
|
|
4914
|
+
"content column",
|
|
4915
|
+
"screen layout"
|
|
4916
|
+
],
|
|
4917
|
+
useWhen: [
|
|
4918
|
+
"You want a standard screen region under the app shell with consistent max width, page padding, and vertical rhythm between sections."
|
|
4919
|
+
],
|
|
4920
|
+
avoidWhen: [
|
|
4921
|
+
"You only need a bare width constraint with no page padding or child spacing."
|
|
4922
|
+
],
|
|
4923
|
+
alternatives: [
|
|
4924
|
+
{
|
|
4925
|
+
component: "TContainer",
|
|
4926
|
+
when: "You just need a centered max-width wrapper without page-level block padding or child spacing."
|
|
4927
|
+
},
|
|
4928
|
+
{
|
|
4929
|
+
component: "TStack",
|
|
4930
|
+
when: "You only need to space a group of children, not lay out a whole page."
|
|
4931
|
+
}
|
|
4932
|
+
]
|
|
4933
|
+
},
|
|
4934
|
+
setup: {
|
|
4935
|
+
required: [],
|
|
4936
|
+
notes: []
|
|
4937
|
+
},
|
|
4938
|
+
recipes: []
|
|
4939
|
+
},
|
|
4940
|
+
{
|
|
4941
|
+
name: "TPageHeader",
|
|
4942
|
+
aliases: [],
|
|
4943
|
+
package: "@treeui/vue",
|
|
4944
|
+
kind: "layout",
|
|
4945
|
+
category: "Layout",
|
|
4946
|
+
status: "available",
|
|
4947
|
+
purpose: "Canonical page title block: heading, optional subtitle, and a right-aligned actions area, so title hierarchy and alignment stay consistent across screens.",
|
|
4948
|
+
sourceFile: "packages/vue/src/components/TPageHeader.vue",
|
|
4949
|
+
storyFile: "apps/docs/src/stories/PageHeader.stories.ts",
|
|
4950
|
+
storyTitle: "Components/Layout/PageHeader",
|
|
4951
|
+
manifestFile: "docs/ai/COMPONENTS/page-header.yaml",
|
|
4952
|
+
props: [
|
|
4953
|
+
{
|
|
4954
|
+
name: "title",
|
|
4955
|
+
type: "string",
|
|
4956
|
+
default: "",
|
|
4957
|
+
note: "Rendered inside the heading element. Overridden by the `title` slot."
|
|
4958
|
+
},
|
|
4959
|
+
{
|
|
4960
|
+
name: "subtitle",
|
|
4961
|
+
type: "string",
|
|
4962
|
+
default: ""
|
|
4963
|
+
},
|
|
4964
|
+
{
|
|
4965
|
+
name: "level",
|
|
4966
|
+
type: "1 | 2 | 3 | 4 | 5 | 6",
|
|
4967
|
+
default: "1",
|
|
4968
|
+
note: "Heading level for the title element. Default `1` treats it as the page title; lower it when the page already has an h1."
|
|
4969
|
+
},
|
|
4970
|
+
{
|
|
4971
|
+
name: "as",
|
|
4972
|
+
type: "string",
|
|
4973
|
+
default: "header"
|
|
4974
|
+
}
|
|
4975
|
+
],
|
|
4976
|
+
events: [],
|
|
4977
|
+
slots: [
|
|
4978
|
+
{
|
|
4979
|
+
name: "breadcrumb"
|
|
4980
|
+
},
|
|
4981
|
+
{
|
|
4982
|
+
name: "title"
|
|
4983
|
+
},
|
|
4984
|
+
{
|
|
4985
|
+
name: "subtitle"
|
|
4986
|
+
},
|
|
4987
|
+
{
|
|
4988
|
+
name: "actions"
|
|
4989
|
+
},
|
|
4990
|
+
{
|
|
4991
|
+
name: "default"
|
|
4992
|
+
}
|
|
4993
|
+
],
|
|
4994
|
+
a11y: [
|
|
4995
|
+
"Title renders as a real heading element (`h1`\u2013`h6`) chosen by `level`; keep one h1 per page.",
|
|
4996
|
+
"Actions area holds standard focusable controls (e.g. TButton) \u2014 no custom roles added."
|
|
4997
|
+
],
|
|
4998
|
+
behavior: [
|
|
4999
|
+
"title_and_subtitle_optional: true",
|
|
5000
|
+
"heading_level_controlled_by_level: true",
|
|
5001
|
+
"actions_area_right_aligned_and_wraps: true",
|
|
5002
|
+
"default_slot_renders_below_heading: true"
|
|
5003
|
+
],
|
|
5004
|
+
selection: {
|
|
5005
|
+
keywords: [
|
|
5006
|
+
"page header",
|
|
5007
|
+
"title bar",
|
|
5008
|
+
"page title",
|
|
5009
|
+
"heading and actions"
|
|
5010
|
+
],
|
|
5011
|
+
useWhen: [
|
|
5012
|
+
"A screen needs a title (and optional subtitle) with a right-aligned actions area in a consistent hierarchy."
|
|
5013
|
+
],
|
|
5014
|
+
avoidWhen: [
|
|
5015
|
+
"You need cross-page hierarchy or navigation trails rather than a single page title."
|
|
5016
|
+
],
|
|
5017
|
+
alternatives: [
|
|
5018
|
+
{
|
|
5019
|
+
component: "TBreadcrumb",
|
|
5020
|
+
when: "You are showing where the page sits in a hierarchy, not its title."
|
|
5021
|
+
},
|
|
5022
|
+
{
|
|
5023
|
+
component: "TNavbar",
|
|
5024
|
+
when: "You need a top application bar, not a per-page title block."
|
|
5025
|
+
}
|
|
5026
|
+
]
|
|
5027
|
+
},
|
|
5028
|
+
setup: {
|
|
5029
|
+
required: [],
|
|
5030
|
+
notes: []
|
|
5031
|
+
},
|
|
5032
|
+
recipes: []
|
|
5033
|
+
},
|
|
5034
|
+
{
|
|
5035
|
+
name: "TPagination",
|
|
5036
|
+
aliases: [],
|
|
5037
|
+
package: "@treeui/vue",
|
|
5038
|
+
kind: "primitive",
|
|
5039
|
+
category: "Navigation",
|
|
5040
|
+
status: "available",
|
|
5041
|
+
purpose: "Page controls with previous/next navigation, numbered page buttons, and ellipsis for large page ranges. Supports v-model for the active page.\n",
|
|
5042
|
+
sourceFile: "packages/vue/src/components/TPagination.vue",
|
|
5043
|
+
storyFile: "apps/docs/src/stories/Pagination.stories.ts",
|
|
5044
|
+
storyTitle: "Components/Navigation/Pagination",
|
|
5045
|
+
manifestFile: "docs/ai/COMPONENTS/pagination.yaml",
|
|
5046
|
+
props: [
|
|
5047
|
+
{
|
|
5048
|
+
name: "modelValue",
|
|
5049
|
+
type: "number",
|
|
5050
|
+
default: "1",
|
|
5051
|
+
description: "Current active page (1-based). Use with v-model."
|
|
5052
|
+
},
|
|
5053
|
+
{
|
|
5054
|
+
name: "totalPages",
|
|
5055
|
+
type: "number",
|
|
5056
|
+
required: true,
|
|
5057
|
+
description: "Total number of pages."
|
|
5058
|
+
},
|
|
5059
|
+
{
|
|
5060
|
+
name: "siblings",
|
|
5061
|
+
type: "number",
|
|
5062
|
+
default: "1",
|
|
5063
|
+
description: "Number of sibling page buttons shown around the current page."
|
|
5064
|
+
},
|
|
5065
|
+
{
|
|
5066
|
+
name: "size",
|
|
5067
|
+
type: "TSize",
|
|
5068
|
+
default: "md",
|
|
5069
|
+
values: [
|
|
5070
|
+
"sm",
|
|
5071
|
+
"md",
|
|
5072
|
+
"lg"
|
|
5073
|
+
],
|
|
5074
|
+
description: "Size variant for the pagination controls."
|
|
5075
|
+
},
|
|
5076
|
+
{
|
|
5077
|
+
name: "disabled",
|
|
5078
|
+
type: "boolean",
|
|
5079
|
+
default: "false",
|
|
5080
|
+
description: "Disables all pagination controls."
|
|
5081
|
+
},
|
|
5082
|
+
{
|
|
5083
|
+
name: "label",
|
|
5084
|
+
type: "string",
|
|
5085
|
+
default: "Pagination",
|
|
5086
|
+
description: "Accessible label for the nav element."
|
|
5087
|
+
}
|
|
5088
|
+
],
|
|
5089
|
+
events: [
|
|
5090
|
+
{
|
|
5091
|
+
name: "update:modelValue",
|
|
5092
|
+
description: "Emitted when the active page changes. Enables v-model binding.",
|
|
5093
|
+
payload: "[page: number]"
|
|
5094
|
+
}
|
|
5095
|
+
],
|
|
5096
|
+
slots: [
|
|
5097
|
+
{
|
|
5098
|
+
name: "previous",
|
|
5099
|
+
description: "Custom content for the previous button."
|
|
5100
|
+
},
|
|
5101
|
+
{
|
|
5102
|
+
name: "next",
|
|
5103
|
+
description: "Custom content for the next button."
|
|
4624
5104
|
}
|
|
4625
5105
|
],
|
|
4626
5106
|
a11y: [
|
|
@@ -5208,6 +5688,20 @@ var treeui_catalog_default = {
|
|
|
5208
5688
|
"lg"
|
|
5209
5689
|
]
|
|
5210
5690
|
},
|
|
5691
|
+
{
|
|
5692
|
+
name: "width",
|
|
5693
|
+
type: "TFieldWidth",
|
|
5694
|
+
default: "full",
|
|
5695
|
+
values: [
|
|
5696
|
+
"xs",
|
|
5697
|
+
"sm",
|
|
5698
|
+
"md",
|
|
5699
|
+
"lg",
|
|
5700
|
+
"xl",
|
|
5701
|
+
"full"
|
|
5702
|
+
],
|
|
5703
|
+
note: "Inline-size cap (max-inline-size). Fluid by default; use instead of an inline width style."
|
|
5704
|
+
},
|
|
5211
5705
|
{
|
|
5212
5706
|
name: "disabled",
|
|
5213
5707
|
type: "boolean",
|
|
@@ -5622,6 +6116,46 @@ var treeui_catalog_default = {
|
|
|
5622
6116
|
},
|
|
5623
6117
|
recipes: []
|
|
5624
6118
|
},
|
|
6119
|
+
{
|
|
6120
|
+
name: "TSpacer",
|
|
6121
|
+
aliases: [],
|
|
6122
|
+
package: "@treeui/vue",
|
|
6123
|
+
kind: "layout",
|
|
6124
|
+
category: "Layout",
|
|
6125
|
+
status: "available",
|
|
6126
|
+
purpose: "Flexible spacer that absorbs free space between siblings in a flex layout (e.g. TStack), replacing hand-written margin:auto / flex:1.",
|
|
6127
|
+
sourceFile: "packages/vue/src/components/TSpacer.vue",
|
|
6128
|
+
storyFile: "apps/docs/src/stories/Spacer.stories.ts",
|
|
6129
|
+
storyTitle: "Components/Layout/Spacer",
|
|
6130
|
+
manifestFile: "docs/ai/COMPONENTS/spacer.yaml",
|
|
6131
|
+
props: [
|
|
6132
|
+
{
|
|
6133
|
+
name: "as",
|
|
6134
|
+
type: "string",
|
|
6135
|
+
default: "div"
|
|
6136
|
+
}
|
|
6137
|
+
],
|
|
6138
|
+
events: [],
|
|
6139
|
+
slots: [],
|
|
6140
|
+
a11y: [
|
|
6141
|
+
"Rendered with aria-hidden='true'; it is a layout-only element with no content."
|
|
6142
|
+
],
|
|
6143
|
+
behavior: [
|
|
6144
|
+
"grows_to_fill_free_space: true",
|
|
6145
|
+
"pushes_siblings_apart_or_to_ends: true"
|
|
6146
|
+
],
|
|
6147
|
+
selection: {
|
|
6148
|
+
keywords: [],
|
|
6149
|
+
useWhen: [],
|
|
6150
|
+
avoidWhen: [],
|
|
6151
|
+
alternatives: []
|
|
6152
|
+
},
|
|
6153
|
+
setup: {
|
|
6154
|
+
required: [],
|
|
6155
|
+
notes: []
|
|
6156
|
+
},
|
|
6157
|
+
recipes: []
|
|
6158
|
+
},
|
|
5625
6159
|
{
|
|
5626
6160
|
name: "TSparkline",
|
|
5627
6161
|
aliases: [],
|
|
@@ -5794,6 +6328,82 @@ var treeui_catalog_default = {
|
|
|
5794
6328
|
},
|
|
5795
6329
|
recipes: []
|
|
5796
6330
|
},
|
|
6331
|
+
{
|
|
6332
|
+
name: "TSplit",
|
|
6333
|
+
aliases: [],
|
|
6334
|
+
package: "@treeui/vue",
|
|
6335
|
+
kind: "layout",
|
|
6336
|
+
category: "Layout",
|
|
6337
|
+
status: "available",
|
|
6338
|
+
purpose: "Responsive two-pane layout (a wider main pane + a narrower aside) that sits side by side and stacks to one column when narrow \u2014 no media query.",
|
|
6339
|
+
sourceFile: "packages/vue/src/components/TSplit.vue",
|
|
6340
|
+
storyFile: "apps/docs/src/stories/Split.stories.ts",
|
|
6341
|
+
storyTitle: "Components/Layout/Split",
|
|
6342
|
+
manifestFile: "docs/ai/COMPONENTS/split.yaml",
|
|
6343
|
+
props: [
|
|
6344
|
+
{
|
|
6345
|
+
name: "as",
|
|
6346
|
+
type: "string",
|
|
6347
|
+
default: "div"
|
|
6348
|
+
},
|
|
6349
|
+
{
|
|
6350
|
+
name: "gap",
|
|
6351
|
+
type: "string",
|
|
6352
|
+
default: "var(--tree-space-5)"
|
|
6353
|
+
},
|
|
6354
|
+
{
|
|
6355
|
+
name: "ratio",
|
|
6356
|
+
type: "number",
|
|
6357
|
+
default: "2",
|
|
6358
|
+
note: "How many times faster the main pane grows than the aside pane."
|
|
6359
|
+
},
|
|
6360
|
+
{
|
|
6361
|
+
name: "minWidth",
|
|
6362
|
+
type: "string",
|
|
6363
|
+
default: "18rem",
|
|
6364
|
+
note: "Min width each pane keeps before the layout wraps to a single column (flex-wrap, no @media)."
|
|
6365
|
+
},
|
|
6366
|
+
{
|
|
6367
|
+
name: "side",
|
|
6368
|
+
type: "start | end",
|
|
6369
|
+
default: "end",
|
|
6370
|
+
note: "Which side the aside pane sits on when side by side."
|
|
6371
|
+
},
|
|
6372
|
+
{
|
|
6373
|
+
name: "align",
|
|
6374
|
+
type: "string",
|
|
6375
|
+
default: "start",
|
|
6376
|
+
note: "Cross-axis alignment (align-items)."
|
|
6377
|
+
}
|
|
6378
|
+
],
|
|
6379
|
+
events: [],
|
|
6380
|
+
slots: [
|
|
6381
|
+
{
|
|
6382
|
+
name: "default"
|
|
6383
|
+
},
|
|
6384
|
+
{
|
|
6385
|
+
name: "aside"
|
|
6386
|
+
}
|
|
6387
|
+
],
|
|
6388
|
+
a11y: [
|
|
6389
|
+
"Layout-only wrapper; semantics come from the slotted content."
|
|
6390
|
+
],
|
|
6391
|
+
behavior: [
|
|
6392
|
+
"wraps_to_single_column_when_narrow: true",
|
|
6393
|
+
"media_query_free: true"
|
|
6394
|
+
],
|
|
6395
|
+
selection: {
|
|
6396
|
+
keywords: [],
|
|
6397
|
+
useWhen: [],
|
|
6398
|
+
avoidWhen: [],
|
|
6399
|
+
alternatives: []
|
|
6400
|
+
},
|
|
6401
|
+
setup: {
|
|
6402
|
+
required: [],
|
|
6403
|
+
notes: []
|
|
6404
|
+
},
|
|
6405
|
+
recipes: []
|
|
6406
|
+
},
|
|
5797
6407
|
{
|
|
5798
6408
|
name: "TStack",
|
|
5799
6409
|
aliases: [],
|
|
@@ -5845,6 +6455,12 @@ var treeui_catalog_default = {
|
|
|
5845
6455
|
name: "reverse",
|
|
5846
6456
|
type: "boolean",
|
|
5847
6457
|
default: "false"
|
|
6458
|
+
},
|
|
6459
|
+
{
|
|
6460
|
+
name: "grow",
|
|
6461
|
+
type: "boolean",
|
|
6462
|
+
default: "false",
|
|
6463
|
+
note: "Expands the stack to fill available space along its parent's main axis (flex: 1 with min-size 0). Use it to make a sidebar column fill its container height."
|
|
5848
6464
|
}
|
|
5849
6465
|
],
|
|
5850
6466
|
events: [],
|
|
@@ -5892,6 +6508,80 @@ var treeui_catalog_default = {
|
|
|
5892
6508
|
"chart-surface"
|
|
5893
6509
|
]
|
|
5894
6510
|
},
|
|
6511
|
+
{
|
|
6512
|
+
name: "TStackItem",
|
|
6513
|
+
aliases: [],
|
|
6514
|
+
package: "@treeui/vue",
|
|
6515
|
+
kind: "layout",
|
|
6516
|
+
category: "Layout",
|
|
6517
|
+
status: "available",
|
|
6518
|
+
purpose: "Per-child flex control inside a TStack \u2014 grow, shrink, basis, min width and align-self \u2014 so one item can fill the row without hand-written CSS.",
|
|
6519
|
+
sourceFile: "packages/vue/src/components/TStackItem.vue",
|
|
6520
|
+
storyFile: "apps/docs/src/stories/StackItem.stories.ts",
|
|
6521
|
+
storyTitle: "Components/Layout/StackItem",
|
|
6522
|
+
manifestFile: "docs/ai/COMPONENTS/stack-item.yaml",
|
|
6523
|
+
props: [
|
|
6524
|
+
{
|
|
6525
|
+
name: "as",
|
|
6526
|
+
type: "string",
|
|
6527
|
+
default: "div"
|
|
6528
|
+
},
|
|
6529
|
+
{
|
|
6530
|
+
name: "grow",
|
|
6531
|
+
type: "boolean | number",
|
|
6532
|
+
default: "false",
|
|
6533
|
+
note: "true = flex-grow 1; a number sets the grow factor."
|
|
6534
|
+
},
|
|
6535
|
+
{
|
|
6536
|
+
name: "shrink",
|
|
6537
|
+
type: "boolean | number",
|
|
6538
|
+
default: "undefined",
|
|
6539
|
+
note: "false prevents shrinking; a number sets the shrink factor."
|
|
6540
|
+
},
|
|
6541
|
+
{
|
|
6542
|
+
name: "basis",
|
|
6543
|
+
type: "string",
|
|
6544
|
+
default: "undefined",
|
|
6545
|
+
note: "flex-basis (initial main-axis size)."
|
|
6546
|
+
},
|
|
6547
|
+
{
|
|
6548
|
+
name: "minWidth",
|
|
6549
|
+
type: "string",
|
|
6550
|
+
default: "undefined",
|
|
6551
|
+
note: "Minimum main-axis size before it wraps/shrinks."
|
|
6552
|
+
},
|
|
6553
|
+
{
|
|
6554
|
+
name: "align",
|
|
6555
|
+
type: "string",
|
|
6556
|
+
default: "undefined",
|
|
6557
|
+
note: "Per-item cross-axis alignment (align-self)."
|
|
6558
|
+
}
|
|
6559
|
+
],
|
|
6560
|
+
events: [],
|
|
6561
|
+
slots: [
|
|
6562
|
+
{
|
|
6563
|
+
name: "default"
|
|
6564
|
+
}
|
|
6565
|
+
],
|
|
6566
|
+
a11y: [
|
|
6567
|
+
"Layout-only wrapper; semantics come from the slotted content."
|
|
6568
|
+
],
|
|
6569
|
+
behavior: [
|
|
6570
|
+
"controls_single_flex_child: true",
|
|
6571
|
+
"defaults_min_inline_size_zero: true"
|
|
6572
|
+
],
|
|
6573
|
+
selection: {
|
|
6574
|
+
keywords: [],
|
|
6575
|
+
useWhen: [],
|
|
6576
|
+
avoidWhen: [],
|
|
6577
|
+
alternatives: []
|
|
6578
|
+
},
|
|
6579
|
+
setup: {
|
|
6580
|
+
required: [],
|
|
6581
|
+
notes: []
|
|
6582
|
+
},
|
|
6583
|
+
recipes: []
|
|
6584
|
+
},
|
|
5895
6585
|
{
|
|
5896
6586
|
name: "TStat",
|
|
5897
6587
|
aliases: [],
|
|
@@ -6494,6 +7184,95 @@ var treeui_catalog_default = {
|
|
|
6494
7184
|
"tag-input"
|
|
6495
7185
|
]
|
|
6496
7186
|
},
|
|
7187
|
+
{
|
|
7188
|
+
name: "TText",
|
|
7189
|
+
aliases: [],
|
|
7190
|
+
package: "@treeui/vue",
|
|
7191
|
+
kind: "primitive",
|
|
7192
|
+
category: "Data Display",
|
|
7193
|
+
status: "available",
|
|
7194
|
+
purpose: "Typography primitive for body text, labels and headings \u2014 size, tone, weight and truncation from tokens, with no hand-written CSS.",
|
|
7195
|
+
sourceFile: "packages/vue/src/components/TText.vue",
|
|
7196
|
+
storyFile: "apps/docs/src/stories/Text.stories.ts",
|
|
7197
|
+
storyTitle: "Components/Data Display/Text",
|
|
7198
|
+
manifestFile: "docs/ai/COMPONENTS/text.yaml",
|
|
7199
|
+
props: [
|
|
7200
|
+
{
|
|
7201
|
+
name: "as",
|
|
7202
|
+
type: "string",
|
|
7203
|
+
default: "span",
|
|
7204
|
+
note: "Render element. Use `p`, `h1`\u2013`h6`, `label`, `small`, `strong`, \u2026 for correct semantics."
|
|
7205
|
+
},
|
|
7206
|
+
{
|
|
7207
|
+
name: "size",
|
|
7208
|
+
type: "TTextSize",
|
|
7209
|
+
default: "undefined",
|
|
7210
|
+
values: [
|
|
7211
|
+
"xs",
|
|
7212
|
+
"sm",
|
|
7213
|
+
"md",
|
|
7214
|
+
"lg",
|
|
7215
|
+
"xl",
|
|
7216
|
+
"2xl",
|
|
7217
|
+
"3xl"
|
|
7218
|
+
],
|
|
7219
|
+
note: "Maps to --tree-font-size-*. Omitted = inherit."
|
|
7220
|
+
},
|
|
7221
|
+
{
|
|
7222
|
+
name: "tone",
|
|
7223
|
+
type: "TTextTone",
|
|
7224
|
+
default: "default",
|
|
7225
|
+
values: [
|
|
7226
|
+
"default",
|
|
7227
|
+
"muted",
|
|
7228
|
+
"inverse",
|
|
7229
|
+
"brand"
|
|
7230
|
+
],
|
|
7231
|
+
note: "`default` inherits the current colour; others map to --tree-color-text-* / brand."
|
|
7232
|
+
},
|
|
7233
|
+
{
|
|
7234
|
+
name: "weight",
|
|
7235
|
+
type: "TTextWeight",
|
|
7236
|
+
default: "undefined",
|
|
7237
|
+
values: [
|
|
7238
|
+
"regular",
|
|
7239
|
+
"medium",
|
|
7240
|
+
"semibold",
|
|
7241
|
+
"bold"
|
|
7242
|
+
]
|
|
7243
|
+
},
|
|
7244
|
+
{
|
|
7245
|
+
name: "truncate",
|
|
7246
|
+
type: "boolean",
|
|
7247
|
+
default: "false",
|
|
7248
|
+
note: "Clip to a single line with an ellipsis."
|
|
7249
|
+
}
|
|
7250
|
+
],
|
|
7251
|
+
events: [],
|
|
7252
|
+
slots: [
|
|
7253
|
+
{
|
|
7254
|
+
name: "default"
|
|
7255
|
+
}
|
|
7256
|
+
],
|
|
7257
|
+
a11y: [
|
|
7258
|
+
"Choose `as` to convey the correct semantics (e.g. headings via h1\u2013h6); TText adds only visual styling."
|
|
7259
|
+
],
|
|
7260
|
+
behavior: [
|
|
7261
|
+
"semantic_element_controlled_by_as: true",
|
|
7262
|
+
"token_driven_size_tone_weight: true"
|
|
7263
|
+
],
|
|
7264
|
+
selection: {
|
|
7265
|
+
keywords: [],
|
|
7266
|
+
useWhen: [],
|
|
7267
|
+
avoidWhen: [],
|
|
7268
|
+
alternatives: []
|
|
7269
|
+
},
|
|
7270
|
+
setup: {
|
|
7271
|
+
required: [],
|
|
7272
|
+
notes: []
|
|
7273
|
+
},
|
|
7274
|
+
recipes: []
|
|
7275
|
+
},
|
|
6497
7276
|
{
|
|
6498
7277
|
name: "TTextarea",
|
|
6499
7278
|
aliases: [],
|
|
@@ -6522,6 +7301,20 @@ var treeui_catalog_default = {
|
|
|
6522
7301
|
"lg"
|
|
6523
7302
|
]
|
|
6524
7303
|
},
|
|
7304
|
+
{
|
|
7305
|
+
name: "width",
|
|
7306
|
+
type: "TFieldWidth",
|
|
7307
|
+
default: "full",
|
|
7308
|
+
values: [
|
|
7309
|
+
"xs",
|
|
7310
|
+
"sm",
|
|
7311
|
+
"md",
|
|
7312
|
+
"lg",
|
|
7313
|
+
"xl",
|
|
7314
|
+
"full"
|
|
7315
|
+
],
|
|
7316
|
+
note: "Inline-size cap (max-inline-size). Fluid by default; use instead of an inline width style."
|
|
7317
|
+
},
|
|
6525
7318
|
{
|
|
6526
7319
|
name: "disabled",
|
|
6527
7320
|
type: "boolean",
|