@treeui/mcp 0.3.0 → 0.4.0
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-K6NB25EB.js} +319 -19
- package/dist/cli.cjs +319 -19
- package/dist/cli.js +1 -1
- package/dist/index.cjs +319 -19
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -47,9 +47,9 @@ module.exports = __toCommonJS(index_exports);
|
|
|
47
47
|
|
|
48
48
|
// src/generated/treeui.catalog.json
|
|
49
49
|
var treeui_catalog_default = {
|
|
50
|
-
generatedAt: "2026-07-
|
|
50
|
+
generatedAt: "2026-07-18T01:52:38.578Z",
|
|
51
51
|
packageName: "@treeui/vue",
|
|
52
|
-
packageVersion: "0.
|
|
52
|
+
packageVersion: "0.14.0",
|
|
53
53
|
decisionGuides: [
|
|
54
54
|
{
|
|
55
55
|
id: "single-choice",
|
|
@@ -1334,15 +1334,17 @@ var treeui_catalog_default = {
|
|
|
1334
1334
|
},
|
|
1335
1335
|
{
|
|
1336
1336
|
name: "variant",
|
|
1337
|
-
type: "TVariant",
|
|
1337
|
+
type: "TVariant | brand",
|
|
1338
1338
|
default: "solid",
|
|
1339
1339
|
values: [
|
|
1340
1340
|
"solid",
|
|
1341
1341
|
"outline",
|
|
1342
1342
|
"ghost",
|
|
1343
1343
|
"soft",
|
|
1344
|
-
"danger"
|
|
1345
|
-
|
|
1344
|
+
"danger",
|
|
1345
|
+
"brand"
|
|
1346
|
+
],
|
|
1347
|
+
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."
|
|
1346
1348
|
},
|
|
1347
1349
|
{
|
|
1348
1350
|
name: "size",
|
|
@@ -2187,9 +2189,14 @@ var treeui_catalog_default = {
|
|
|
2187
2189
|
"The page shell should stay full-width while content stays readable."
|
|
2188
2190
|
],
|
|
2189
2191
|
avoidWhen: [
|
|
2190
|
-
"You need internal spacing between children."
|
|
2192
|
+
"You need internal spacing between children.",
|
|
2193
|
+
"You are laying out a whole screen \u2014 reach for TPage, which adds page padding and vertical rhythm."
|
|
2191
2194
|
],
|
|
2192
2195
|
alternatives: [
|
|
2196
|
+
{
|
|
2197
|
+
component: "TPage",
|
|
2198
|
+
when: "You want a full page region with block padding and vertical spacing between sections, not just a width constraint."
|
|
2199
|
+
},
|
|
2193
2200
|
{
|
|
2194
2201
|
component: "TStack",
|
|
2195
2202
|
when: "The main need is vertical or horizontal spacing."
|
|
@@ -3188,7 +3195,7 @@ var treeui_catalog_default = {
|
|
|
3188
3195
|
kind: "form",
|
|
3189
3196
|
category: "Form",
|
|
3190
3197
|
status: "available",
|
|
3191
|
-
purpose: "Composable dropzone and file picker with browse, drag-and-drop, and Ctrl+V paste support.",
|
|
3198
|
+
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.",
|
|
3192
3199
|
sourceFile: "packages/vue/src/components/TFileUpload.vue",
|
|
3193
3200
|
storyFile: "apps/docs/src/stories/FileUpload.stories.ts",
|
|
3194
3201
|
storyTitle: "Components/Form/FileUpload",
|
|
@@ -3212,12 +3219,14 @@ var treeui_catalog_default = {
|
|
|
3212
3219
|
{
|
|
3213
3220
|
name: "disabled",
|
|
3214
3221
|
type: "boolean",
|
|
3215
|
-
default: "false"
|
|
3222
|
+
default: "false",
|
|
3223
|
+
description: "The ONLY prop that gates interaction. Disables the dropzone, the native input, Clear all, and every per-row Remove/Retry."
|
|
3216
3224
|
},
|
|
3217
3225
|
{
|
|
3218
3226
|
name: "loading",
|
|
3219
3227
|
type: "boolean",
|
|
3220
|
-
default: "false"
|
|
3228
|
+
default: "false",
|
|
3229
|
+
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."
|
|
3221
3230
|
},
|
|
3222
3231
|
{
|
|
3223
3232
|
name: "invalid",
|
|
@@ -3278,44 +3287,142 @@ var treeui_catalog_default = {
|
|
|
3278
3287
|
name: "showFileList",
|
|
3279
3288
|
type: "boolean",
|
|
3280
3289
|
default: "true"
|
|
3290
|
+
},
|
|
3291
|
+
{
|
|
3292
|
+
name: "uploadState",
|
|
3293
|
+
type: "TFileUploadStateSource",
|
|
3294
|
+
default: "none",
|
|
3295
|
+
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."
|
|
3296
|
+
},
|
|
3297
|
+
{
|
|
3298
|
+
name: "dragLabel",
|
|
3299
|
+
type: "string",
|
|
3300
|
+
default: "Release to upload",
|
|
3301
|
+
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."
|
|
3302
|
+
},
|
|
3303
|
+
{
|
|
3304
|
+
name: "dragRejectLabel",
|
|
3305
|
+
type: "string",
|
|
3306
|
+
default: "This file type is not accepted",
|
|
3307
|
+
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."
|
|
3308
|
+
},
|
|
3309
|
+
{
|
|
3310
|
+
name: "thumbnails",
|
|
3311
|
+
type: "boolean",
|
|
3312
|
+
default: "true",
|
|
3313
|
+
description: "Mint object-URL previews and decode dimensions for image/* files. Set false when you always supply `state.thumbnailUrl` yourself."
|
|
3314
|
+
},
|
|
3315
|
+
{
|
|
3316
|
+
name: "maxThumbnailSize",
|
|
3317
|
+
type: "number | null",
|
|
3318
|
+
default: "10 * 1024 * 1024",
|
|
3319
|
+
description: "Skip auto-thumbnailing above this byte size. null removes the cap."
|
|
3320
|
+
},
|
|
3321
|
+
{
|
|
3322
|
+
name: "retryLabel",
|
|
3323
|
+
type: "string",
|
|
3324
|
+
default: "Retry"
|
|
3325
|
+
},
|
|
3326
|
+
{
|
|
3327
|
+
name: "resumeLabel",
|
|
3328
|
+
type: "(percent: number) => string",
|
|
3329
|
+
default: "(percent) => `Resume from ${percent}%`",
|
|
3330
|
+
description: "Receives Math.round(state.progress). Used only when state.resumable === true AND state.progress is a number."
|
|
3331
|
+
},
|
|
3332
|
+
{
|
|
3333
|
+
name: "remainingTimeFormat",
|
|
3334
|
+
type: "(remainingMs: number) => string",
|
|
3335
|
+
default: "5s/60s/60min thresholds \u2014 see behavior.remaining_time_strings",
|
|
3336
|
+
description: "Formats state.remainingMs. Ignored for a row that supplies state.remainingLabel."
|
|
3337
|
+
},
|
|
3338
|
+
{
|
|
3339
|
+
name: "statusLabels",
|
|
3340
|
+
type: "Partial<Record<TFileUploadStatus, string>>",
|
|
3341
|
+
default: "{}",
|
|
3342
|
+
description: "MERGED over the defaults { pending: Waiting, uploading: Uploading, paused: Paused, error: Upload failed, success: Uploaded } \u2014 pass only the keys you override."
|
|
3281
3343
|
}
|
|
3282
3344
|
],
|
|
3283
3345
|
events: [
|
|
3284
3346
|
{
|
|
3285
|
-
name: "update:modelValue"
|
|
3347
|
+
name: "update:modelValue",
|
|
3348
|
+
description: "Emitted with the next file list when files are added, removed, or cleared.",
|
|
3349
|
+
payload: "File[]"
|
|
3286
3350
|
},
|
|
3287
3351
|
{
|
|
3288
|
-
name: "files-accepted"
|
|
3352
|
+
name: "files-accepted",
|
|
3353
|
+
description: "Emitted with only the newly accepted files, after accept/maxFiles/maxFileSize validation.",
|
|
3354
|
+
payload: "File[]"
|
|
3289
3355
|
},
|
|
3290
3356
|
{
|
|
3291
|
-
name: "files-rejected"
|
|
3357
|
+
name: "files-rejected",
|
|
3358
|
+
description: "Pre-acceptance validation failures. Unrelated to transport errors, which you report through `uploadState`.",
|
|
3359
|
+
payload: "TFileUploadRejection[]"
|
|
3360
|
+
},
|
|
3361
|
+
{
|
|
3362
|
+
name: "retry",
|
|
3363
|
+
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.",
|
|
3364
|
+
payload: "TFileUploadRetryPayload"
|
|
3365
|
+
},
|
|
3366
|
+
{
|
|
3367
|
+
name: "cancel",
|
|
3368
|
+
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.",
|
|
3369
|
+
payload: "TFileUploadCancelPayload"
|
|
3292
3370
|
}
|
|
3293
3371
|
],
|
|
3294
3372
|
slots: [
|
|
3295
3373
|
{
|
|
3296
|
-
name: "icon"
|
|
3374
|
+
name: "icon",
|
|
3375
|
+
description: "Replaces the dropzone icon."
|
|
3297
3376
|
},
|
|
3298
3377
|
{
|
|
3299
|
-
name: "default"
|
|
3378
|
+
name: "default",
|
|
3379
|
+
description: "Replaces the dropzone body. Receives `{ files, isDragActive, isDragReject, openFileDialog, clearFiles }`."
|
|
3300
3380
|
},
|
|
3301
3381
|
{
|
|
3302
|
-
name: "file"
|
|
3382
|
+
name: "file",
|
|
3383
|
+
description: "Full row override. Receives all of TFileUploadFileSlotProps, including every derived label, so a custom row re-derives nothing."
|
|
3303
3384
|
},
|
|
3304
3385
|
{
|
|
3305
|
-
name: "
|
|
3386
|
+
name: "file-status",
|
|
3387
|
+
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."
|
|
3388
|
+
},
|
|
3389
|
+
{
|
|
3390
|
+
name: "actions",
|
|
3391
|
+
description: "Footer actions. Receives `{ files, openFileDialog, clearFiles }` \u2014 no upload state."
|
|
3306
3392
|
}
|
|
3307
3393
|
],
|
|
3308
3394
|
a11y: [
|
|
3309
3395
|
"dropzone_role: button",
|
|
3310
3396
|
"keyboard_activation: Enter_and_Space_open_the_file_picker",
|
|
3311
3397
|
"supports_paste_when_component_is_focused: true",
|
|
3312
|
-
"file_feedback_announced_via_live_region: true"
|
|
3398
|
+
"file_feedback_announced_via_live_region: true",
|
|
3399
|
+
"aria_busy_on_dropzone_tracks_loading_prop: true",
|
|
3400
|
+
"aria_busy_on_row_tracks_that_rows_uploading_status: true",
|
|
3401
|
+
"per_row_progressbar_is_labelled_with_status_and_filename: e.g. 'Uploading hero.png' \u2014 every row's bar has a distinct accessible name.",
|
|
3402
|
+
"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.'",
|
|
3403
|
+
"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.",
|
|
3404
|
+
"percentages_are_never_announced: Percent and ETA live in non-live text; the value reaches assistive tech through the progressbar's aria-valuenow.",
|
|
3405
|
+
"retry_button_is_described_by_its_row_error: Announces 'Resume from 90%, Connection lost at 90%'.",
|
|
3406
|
+
"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.",
|
|
3407
|
+
"remove_and_retry_meet_the_44px_target: true"
|
|
3313
3408
|
],
|
|
3314
3409
|
behavior: [
|
|
3315
3410
|
"accepts_files_from_input_drop_and_paste: true",
|
|
3316
3411
|
"multiple_false_replaces_existing_selection: true",
|
|
3317
3412
|
"accept_maxFiles_and_maxFileSize_apply_to_all_entry_points: true",
|
|
3318
|
-
"selected_files_can_be_removed_or_cleared: true"
|
|
3413
|
+
"selected_files_can_be_removed_or_cleared: true",
|
|
3414
|
+
"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`.",
|
|
3415
|
+
"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.",
|
|
3416
|
+
"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.",
|
|
3417
|
+
"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.",
|
|
3418
|
+
"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.",
|
|
3419
|
+
"drag_feedback_has_three_signals: Border, glow, and a text swap to `dragLabel` \u2014 all three fire together, including when files are already listed.",
|
|
3420
|
+
"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.",
|
|
3421
|
+
"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.",
|
|
3422
|
+
"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.",
|
|
3423
|
+
"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.",
|
|
3424
|
+
"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.",
|
|
3425
|
+
"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."
|
|
3319
3426
|
],
|
|
3320
3427
|
selection: {
|
|
3321
3428
|
keywords: [],
|
|
@@ -4370,7 +4477,7 @@ var treeui_catalog_default = {
|
|
|
4370
4477
|
name: "items",
|
|
4371
4478
|
type: "TNavMenuItem[]",
|
|
4372
4479
|
default: "[]",
|
|
4373
|
-
note: "Array of `{ label, value, shortLabel?, description?, icon?, to?, badge?, disabled? }`."
|
|
4480
|
+
note: "Array of `{ label, value, shortLabel?, description?, icon?, to?, badge?, disabled?, exact? }`."
|
|
4374
4481
|
},
|
|
4375
4482
|
{
|
|
4376
4483
|
name: "size",
|
|
@@ -4391,6 +4498,12 @@ var treeui_catalog_default = {
|
|
|
4391
4498
|
name: "disabled",
|
|
4392
4499
|
type: "boolean",
|
|
4393
4500
|
default: "false"
|
|
4501
|
+
},
|
|
4502
|
+
{
|
|
4503
|
+
name: "exact",
|
|
4504
|
+
type: "boolean",
|
|
4505
|
+
default: "true",
|
|
4506
|
+
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`."
|
|
4394
4507
|
}
|
|
4395
4508
|
],
|
|
4396
4509
|
events: [
|
|
@@ -4564,6 +4677,193 @@ var treeui_catalog_default = {
|
|
|
4564
4677
|
},
|
|
4565
4678
|
recipes: []
|
|
4566
4679
|
},
|
|
4680
|
+
{
|
|
4681
|
+
name: "TPage",
|
|
4682
|
+
aliases: [],
|
|
4683
|
+
package: "@treeui/vue",
|
|
4684
|
+
kind: "layout",
|
|
4685
|
+
category: "Layout",
|
|
4686
|
+
status: "available",
|
|
4687
|
+
purpose: "Semantic page region under the app shell: block padding, a centered max-width content column, and standardized vertical rhythm between sections.",
|
|
4688
|
+
sourceFile: "packages/vue/src/components/TPage.vue",
|
|
4689
|
+
storyFile: "apps/docs/src/stories/Page.stories.ts",
|
|
4690
|
+
storyTitle: "Components/Layout/Page",
|
|
4691
|
+
manifestFile: "docs/ai/COMPONENTS/page.yaml",
|
|
4692
|
+
props: [
|
|
4693
|
+
{
|
|
4694
|
+
name: "as",
|
|
4695
|
+
type: "string",
|
|
4696
|
+
default: "div"
|
|
4697
|
+
},
|
|
4698
|
+
{
|
|
4699
|
+
name: "width",
|
|
4700
|
+
type: "TContainerSize",
|
|
4701
|
+
default: "lg",
|
|
4702
|
+
values: [
|
|
4703
|
+
"sm",
|
|
4704
|
+
"md",
|
|
4705
|
+
"lg",
|
|
4706
|
+
"xl",
|
|
4707
|
+
"full"
|
|
4708
|
+
],
|
|
4709
|
+
note: "Max-width of the centered content column. Mirrors TContainer sizes."
|
|
4710
|
+
},
|
|
4711
|
+
{
|
|
4712
|
+
name: "padded",
|
|
4713
|
+
type: "boolean",
|
|
4714
|
+
default: "true",
|
|
4715
|
+
note: "Adds vertical (block) padding on the region and horizontal padding on the inner column."
|
|
4716
|
+
},
|
|
4717
|
+
{
|
|
4718
|
+
name: "gap",
|
|
4719
|
+
type: "TPageGap",
|
|
4720
|
+
default: "lg",
|
|
4721
|
+
values: [
|
|
4722
|
+
"sm",
|
|
4723
|
+
"md",
|
|
4724
|
+
"lg"
|
|
4725
|
+
],
|
|
4726
|
+
note: "Vertical spacing between direct children (e.g. a TPageHeader and content sections)."
|
|
4727
|
+
}
|
|
4728
|
+
],
|
|
4729
|
+
events: [],
|
|
4730
|
+
slots: [
|
|
4731
|
+
{
|
|
4732
|
+
name: "default"
|
|
4733
|
+
}
|
|
4734
|
+
],
|
|
4735
|
+
a11y: [
|
|
4736
|
+
"Structural wrapper only; landmark semantics come from `as` and the surrounding app shell (avoid nesting a second `main`)."
|
|
4737
|
+
],
|
|
4738
|
+
behavior: [
|
|
4739
|
+
"centers_content_column_by_width: true",
|
|
4740
|
+
"applies_block_padding_when_padded: true",
|
|
4741
|
+
"spaces_children_vertically_by_gap: true"
|
|
4742
|
+
],
|
|
4743
|
+
selection: {
|
|
4744
|
+
keywords: [
|
|
4745
|
+
"page",
|
|
4746
|
+
"page shell",
|
|
4747
|
+
"content column",
|
|
4748
|
+
"screen layout"
|
|
4749
|
+
],
|
|
4750
|
+
useWhen: [
|
|
4751
|
+
"You want a standard screen region under the app shell with consistent max width, page padding, and vertical rhythm between sections."
|
|
4752
|
+
],
|
|
4753
|
+
avoidWhen: [
|
|
4754
|
+
"You only need a bare width constraint with no page padding or child spacing."
|
|
4755
|
+
],
|
|
4756
|
+
alternatives: [
|
|
4757
|
+
{
|
|
4758
|
+
component: "TContainer",
|
|
4759
|
+
when: "You just need a centered max-width wrapper without page-level block padding or child spacing."
|
|
4760
|
+
},
|
|
4761
|
+
{
|
|
4762
|
+
component: "TStack",
|
|
4763
|
+
when: "You only need to space a group of children, not lay out a whole page."
|
|
4764
|
+
}
|
|
4765
|
+
]
|
|
4766
|
+
},
|
|
4767
|
+
setup: {
|
|
4768
|
+
required: [],
|
|
4769
|
+
notes: []
|
|
4770
|
+
},
|
|
4771
|
+
recipes: []
|
|
4772
|
+
},
|
|
4773
|
+
{
|
|
4774
|
+
name: "TPageHeader",
|
|
4775
|
+
aliases: [],
|
|
4776
|
+
package: "@treeui/vue",
|
|
4777
|
+
kind: "layout",
|
|
4778
|
+
category: "Layout",
|
|
4779
|
+
status: "available",
|
|
4780
|
+
purpose: "Canonical page title block: heading, optional subtitle, and a right-aligned actions area, so title hierarchy and alignment stay consistent across screens.",
|
|
4781
|
+
sourceFile: "packages/vue/src/components/TPageHeader.vue",
|
|
4782
|
+
storyFile: "apps/docs/src/stories/PageHeader.stories.ts",
|
|
4783
|
+
storyTitle: "Components/Layout/PageHeader",
|
|
4784
|
+
manifestFile: "docs/ai/COMPONENTS/page-header.yaml",
|
|
4785
|
+
props: [
|
|
4786
|
+
{
|
|
4787
|
+
name: "title",
|
|
4788
|
+
type: "string",
|
|
4789
|
+
default: "",
|
|
4790
|
+
note: "Rendered inside the heading element. Overridden by the `title` slot."
|
|
4791
|
+
},
|
|
4792
|
+
{
|
|
4793
|
+
name: "subtitle",
|
|
4794
|
+
type: "string",
|
|
4795
|
+
default: ""
|
|
4796
|
+
},
|
|
4797
|
+
{
|
|
4798
|
+
name: "level",
|
|
4799
|
+
type: "1 | 2 | 3 | 4 | 5 | 6",
|
|
4800
|
+
default: "1",
|
|
4801
|
+
note: "Heading level for the title element. Default `1` treats it as the page title; lower it when the page already has an h1."
|
|
4802
|
+
},
|
|
4803
|
+
{
|
|
4804
|
+
name: "as",
|
|
4805
|
+
type: "string",
|
|
4806
|
+
default: "header"
|
|
4807
|
+
}
|
|
4808
|
+
],
|
|
4809
|
+
events: [],
|
|
4810
|
+
slots: [
|
|
4811
|
+
{
|
|
4812
|
+
name: "breadcrumb"
|
|
4813
|
+
},
|
|
4814
|
+
{
|
|
4815
|
+
name: "title"
|
|
4816
|
+
},
|
|
4817
|
+
{
|
|
4818
|
+
name: "subtitle"
|
|
4819
|
+
},
|
|
4820
|
+
{
|
|
4821
|
+
name: "actions"
|
|
4822
|
+
},
|
|
4823
|
+
{
|
|
4824
|
+
name: "default"
|
|
4825
|
+
}
|
|
4826
|
+
],
|
|
4827
|
+
a11y: [
|
|
4828
|
+
"Title renders as a real heading element (`h1`\u2013`h6`) chosen by `level`; keep one h1 per page.",
|
|
4829
|
+
"Actions area holds standard focusable controls (e.g. TButton) \u2014 no custom roles added."
|
|
4830
|
+
],
|
|
4831
|
+
behavior: [
|
|
4832
|
+
"title_and_subtitle_optional: true",
|
|
4833
|
+
"heading_level_controlled_by_level: true",
|
|
4834
|
+
"actions_area_right_aligned_and_wraps: true",
|
|
4835
|
+
"default_slot_renders_below_heading: true"
|
|
4836
|
+
],
|
|
4837
|
+
selection: {
|
|
4838
|
+
keywords: [
|
|
4839
|
+
"page header",
|
|
4840
|
+
"title bar",
|
|
4841
|
+
"page title",
|
|
4842
|
+
"heading and actions"
|
|
4843
|
+
],
|
|
4844
|
+
useWhen: [
|
|
4845
|
+
"A screen needs a title (and optional subtitle) with a right-aligned actions area in a consistent hierarchy."
|
|
4846
|
+
],
|
|
4847
|
+
avoidWhen: [
|
|
4848
|
+
"You need cross-page hierarchy or navigation trails rather than a single page title."
|
|
4849
|
+
],
|
|
4850
|
+
alternatives: [
|
|
4851
|
+
{
|
|
4852
|
+
component: "TBreadcrumb",
|
|
4853
|
+
when: "You are showing where the page sits in a hierarchy, not its title."
|
|
4854
|
+
},
|
|
4855
|
+
{
|
|
4856
|
+
component: "TNavbar",
|
|
4857
|
+
when: "You need a top application bar, not a per-page title block."
|
|
4858
|
+
}
|
|
4859
|
+
]
|
|
4860
|
+
},
|
|
4861
|
+
setup: {
|
|
4862
|
+
required: [],
|
|
4863
|
+
notes: []
|
|
4864
|
+
},
|
|
4865
|
+
recipes: []
|
|
4866
|
+
},
|
|
4567
4867
|
{
|
|
4568
4868
|
name: "TPagination",
|
|
4569
4869
|
aliases: [],
|
package/dist/index.js
CHANGED