@treeui/mcp 0.4.1 → 0.5.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.
@@ -1,8 +1,8 @@
1
1
  // src/generated/treeui.catalog.json
2
2
  var treeui_catalog_default = {
3
- generatedAt: "2026-07-18T19:02:09.022Z",
3
+ generatedAt: "2026-07-18T23:35:26.876Z",
4
4
  packageName: "@treeui/vue",
5
- packageVersion: "0.15.0",
5
+ packageVersion: "0.16.0",
6
6
  decisionGuides: [
7
7
  {
8
8
  id: "single-choice",
@@ -152,6 +152,44 @@ var treeui_catalog_default = {
152
152
  }
153
153
  ]
154
154
  },
155
+ {
156
+ id: "navigate-or-act",
157
+ question: "Navigate somewhere vs. perform an action",
158
+ options: [
159
+ {
160
+ use: "TLink",
161
+ when: [
162
+ "Activating it changes the URL \u2014 an external link, a route, or an in-page anchor.",
163
+ "It should be openable in a new tab, copyable, and crawlable."
164
+ ],
165
+ notes: []
166
+ },
167
+ {
168
+ use: "TButton",
169
+ when: [
170
+ "Activating it runs behavior on the current page \u2014 submit, open an overlay, delete, toggle.",
171
+ "It needs sizes, action variants, or a loading state."
172
+ ],
173
+ notes: [
174
+ 'Use `variant="ghost"` when an action needs to look understated like a link.'
175
+ ]
176
+ },
177
+ {
178
+ use: "TNavMenu",
179
+ when: [
180
+ "The links are app-section navigation inside a shell or sidebar."
181
+ ],
182
+ notes: []
183
+ },
184
+ {
185
+ use: "TBreadcrumb",
186
+ when: [
187
+ "The links express where the current page sits in a hierarchy."
188
+ ],
189
+ notes: []
190
+ }
191
+ ]
192
+ },
155
193
  {
156
194
  id: "feedback-choice",
157
195
  question: "Communicate status or feedback",
@@ -2236,12 +2274,14 @@ var treeui_catalog_default = {
2236
2274
  {
2237
2275
  name: "padded",
2238
2276
  type: "boolean",
2239
- default: "true"
2277
+ default: "true",
2278
+ note: "Adds `.is-padded`, i.e. an inline padding of `clamp(var(--tree-space-4), 3vw, var(--tree-space-6))`.\n"
2240
2279
  },
2241
2280
  {
2242
2281
  name: "centered",
2243
2282
  type: "boolean",
2244
- default: "true"
2283
+ default: "true",
2284
+ note: "Adds `.is-centered`, i.e. `margin-inline: auto`."
2245
2285
  }
2246
2286
  ],
2247
2287
  events: [],
@@ -3136,6 +3176,7 @@ var treeui_catalog_default = {
3136
3176
  "role: menu",
3137
3177
  "trigger_aria_haspopup: menu",
3138
3178
  "trigger_aria_expanded: true",
3179
+ "trigger_aria_controls: menu id, while open",
3139
3180
  "aria_disabled_on_disabled_items: true",
3140
3181
  "focus_visible_on_trigger: true",
3141
3182
  "keyboard_arrow_navigation: true",
@@ -3145,9 +3186,11 @@ var treeui_catalog_default = {
3145
3186
  ],
3146
3187
  behavior: [
3147
3188
  "outside_click_closes_menu: true",
3148
- "focus_restores_on_close: true",
3189
+ "outside_click_restores_focus: false",
3149
3190
  "chevron_rotates_when_open: true",
3150
- "menu_grows_to_fit_items_without_wrapping: true"
3191
+ "menu_grows_to_fit_items_without_wrapping: true",
3192
+ "opening_focuses_first_enabled_item: true",
3193
+ 'focus_restores_on_close: {"value":true,"detail":"Focus returns to the trigger when the menu closes from inside it \u2014 selecting an item or pressing Escape. It deliberately does NOT move focus on an outside click, where the pointer has already placed focus elsewhere.\\n","applies_to_custom_trigger":true}'
3151
3194
  ],
3152
3195
  selection: {
3153
3196
  keywords: [
@@ -3543,7 +3586,7 @@ var treeui_catalog_default = {
3543
3586
  name: "htmlFor",
3544
3587
  type: "string",
3545
3588
  required: false,
3546
- description: "The id of the associated form control, used on the <label> for attribute."
3589
+ description: "Rendered verbatim as the <label for> attribute. There is no id generation: when omitted, the label carries no `for` and is NOT associated with any control. The consumer must pass this AND set the same value as `id` on the child control.\n"
3547
3590
  },
3548
3591
  {
3549
3592
  name: "error",
@@ -3601,10 +3644,11 @@ var treeui_catalog_default = {
3601
3644
  }
3602
3645
  ],
3603
3646
  a11y: [
3604
- "Uses native <label> element with for attribute for input association.",
3647
+ "Renders a native <label> element, but ONLY when `label` or the `label` slot is provided.",
3605
3648
  "Error messages are wrapped in role='alert' for screen reader announcements.",
3606
3649
  "Required indicator (*) is aria-hidden to avoid redundant announcements; use aria-required on the input itself.",
3607
- "Error takes precedence over hint to avoid conflicting messages."
3650
+ "Error takes precedence over hint to avoid conflicting messages.",
3651
+ "Extra attrs land on the root <div> (inheritAttrs: false), not on the child control."
3608
3652
  ],
3609
3653
  behavior: [],
3610
3654
  selection: {
@@ -4065,10 +4109,39 @@ var treeui_catalog_default = {
4065
4109
  ],
4066
4110
  behavior: [],
4067
4111
  selection: {
4068
- keywords: [],
4069
- useWhen: [],
4070
- avoidWhen: [],
4071
- alternatives: []
4112
+ keywords: [
4113
+ "link",
4114
+ "anchor",
4115
+ "hyperlink",
4116
+ "navigation",
4117
+ "router link",
4118
+ "external link",
4119
+ "href",
4120
+ "to"
4121
+ ],
4122
+ useWhen: [
4123
+ "The action navigates somewhere \u2014 a URL, a route, or an anchor on the page.",
4124
+ "You want consistent link styling with `default`, `muted`, or `danger` emphasis.",
4125
+ "You want a component that renders RouterLink when vue-router is installed and a plain <a> when it is not, without branching in the template."
4126
+ ],
4127
+ avoidWhen: [
4128
+ "The control performs an action rather than navigating (submit, open a dialog, delete) \u2014 that is a button, even if it looks like a link.",
4129
+ "You need a full call-to-action surface with variants, sizes, and a loading state."
4130
+ ],
4131
+ alternatives: [
4132
+ {
4133
+ component: "TButton",
4134
+ when: 'The control performs an action. Use `variant="ghost"` for a low-emphasis, link-like button.'
4135
+ },
4136
+ {
4137
+ component: "TBreadcrumb",
4138
+ when: "The links form a hierarchy trail."
4139
+ },
4140
+ {
4141
+ component: "TNavMenu",
4142
+ when: "The links are app-section navigation in a shell or sidebar."
4143
+ }
4144
+ ]
4072
4145
  },
4073
4146
  setup: {
4074
4147
  required: [],
@@ -4082,7 +4155,8 @@ var treeui_catalog_default = {
4082
4155
  package: "@treeui/vue",
4083
4156
  category: "Form",
4084
4157
  status: "stable",
4085
- description: "A rich Markdown editor with live preview, toolbar formatting, keyboard shortcuts, and image paste/drop upload support.\n",
4158
+ description: "A Markdown editor with an always-visible side-by-side live preview, toolbar formatting, keyboard shortcuts, and image paste/drop upload support.\n",
4159
+ sourceFile: "packages/vue/src/components/TMarkdownEditor.vue",
4086
4160
  storyFile: "apps/docs/src/stories/MarkdownEditor.stories.ts",
4087
4161
  storyTitle: "Components/Form/MarkdownEditor",
4088
4162
  manifestFile: "docs/ai/COMPONENTS/markdown-editor.yaml",
@@ -4118,6 +4192,12 @@ var treeui_catalog_default = {
4118
4192
  type: "(file: File) => Promise<string>",
4119
4193
  default: "undefined",
4120
4194
  description: "Async function that receives a File and returns the uploaded image URL. When not provided, pasting an image inserts an empty markdown image tag.\n"
4195
+ },
4196
+ {
4197
+ name: "sanitize",
4198
+ type: "(html: string) => string",
4199
+ default: "undefined",
4200
+ description: "Optional extra sanitizer applied to the rendered preview HTML as the final step, after the built-in rendering. It is an ADDITIVE escape hatch, not a toggle: pass DOMPurify or a stricter policy of your own instead of forking the component.\n"
4121
4201
  }
4122
4202
  ],
4123
4203
  events: [
@@ -4144,12 +4224,12 @@ var treeui_catalog_default = {
4144
4224
  }
4145
4225
  ],
4146
4226
  a11y: [
4147
- 'Toolbar has role="toolbar" with aria-label.',
4148
- 'Tab buttons use role="tab" and aria-selected.',
4149
- 'Preview pane has aria-label="Markdown preview".',
4227
+ 'Toolbar has role="toolbar" with aria-label="Markdown formatting".',
4228
+ 'Toolbar groups are separated by elements with role="separator".',
4229
+ 'Preview pane carries aria-label="Markdown preview".',
4150
4230
  'Upload status bar uses role="status" and aria-live="polite".',
4151
4231
  "All toolbar buttons have title attributes describing the action.",
4152
- "Textarea has aria-label for screen readers."
4232
+ "Textarea has aria-label (mirrors the placeholder text)."
4153
4233
  ],
4154
4234
  behavior: [],
4155
4235
  selection: {
@@ -5225,7 +5305,7 @@ var treeui_catalog_default = {
5225
5305
  props: [
5226
5306
  {
5227
5307
  name: "plans",
5228
- type: "PricingPlan[]",
5308
+ type: "TPricingPlan[]",
5229
5309
  required: true,
5230
5310
  description: "Array of plan objects. Each plan supports the same props as PricingCard (title, description, price, currency, period, features, highlighted, badge, buttonText, disabled).\n"
5231
5311
  },
@@ -5246,14 +5326,14 @@ var treeui_catalog_default = {
5246
5326
  {
5247
5327
  name: "select",
5248
5328
  description: "Emitted when any plan's CTA is clicked. Provides the plan data and index.",
5249
- payload: "[plan: PricingPlan, index: number]"
5329
+ payload: "[plan: TPricingPlan, index: number]"
5250
5330
  }
5251
5331
  ],
5252
5332
  slots: [
5253
5333
  {
5254
5334
  name: "plan",
5255
5335
  description: "Custom rendering for each plan card.",
5256
- note: "{ plan: PricingPlan, index: number }"
5336
+ note: "{ plan: TPricingPlan, index: number }"
5257
5337
  }
5258
5338
  ],
5259
5339
  a11y: [
@@ -5412,7 +5492,7 @@ var treeui_catalog_default = {
5412
5492
  package: "@treeui/vue",
5413
5493
  category: "Feedback",
5414
5494
  status: "draft",
5415
- description: "Determinate and indeterminate progress indicator. Supports linear bar and circular ring variants.\n",
5495
+ description: "Determinate and indeterminate progress indicator. Renders a linear bar only \u2014 there is no circular, ring, or radial variant, and no `variant`/`shape`/`type` prop. Compose one yourself if you need it.\n",
5416
5496
  storyFile: "apps/docs/src/stories/Progress.stories.ts",
5417
5497
  storyTitle: "Components/Feedback/Progress",
5418
5498
  manifestFile: "docs/ai/COMPONENTS/progress.yaml",
@@ -5452,7 +5532,8 @@ var treeui_catalog_default = {
5452
5532
  "role: progressbar",
5453
5533
  'attributes: ["aria-valuenow (omitted when indeterminate)","aria-valuemin (always 0)","aria-valuemax (always 100)","aria-label"]',
5454
5534
  "keyboard:",
5455
- "notes: Indeterminate state omits aria-valuenow so assistive tech announces the bar as indeterminate."
5535
+ "notes: Indeterminate state omits aria-valuenow so assistive tech announces the bar as indeterminate.",
5536
+ "value_is_normalized: aria-valuenow is `value / max` expressed as a 0\u2013100 percentage, not the raw `value`. aria-valuemax stays 100 regardless of the `max` prop, so the two always agree. The `label` is also repeated in a visually hidden span."
5456
5537
  ],
5457
5538
  behavior: [],
5458
5539
  selection: {
@@ -5822,10 +5903,13 @@ var treeui_catalog_default = {
5822
5903
  ],
5823
5904
  slots: [
5824
5905
  {
5825
- name: "item"
5906
+ name: "item",
5907
+ description: `Replaces the default row body (indicator, label, description, meta). Renders INSIDE the row's <button role="option">.
5908
+ `
5826
5909
  },
5827
5910
  {
5828
- name: "empty"
5911
+ name: "empty",
5912
+ description: "Replaces `emptyText` when `items` is empty."
5829
5913
  }
5830
5914
  ],
5831
5915
  a11y: [
@@ -5838,7 +5922,8 @@ var treeui_catalog_default = {
5838
5922
  ],
5839
5923
  behavior: [
5840
5924
  "can_be_controlled_or_uncontrolled: true",
5841
- "supports_rich_row_rendering_via_slot: true",
5925
+ "supports_presentational_row_slot: true",
5926
+ "supports_interactive_content_in_rows: false",
5842
5927
  "empty_state_text_supported: true"
5843
5928
  ],
5844
5929
  selection: {
@@ -7019,7 +7104,7 @@ var treeui_catalog_default = {
7019
7104
  ],
7020
7105
  slots: [
7021
7106
  {
7022
- name: "unnamed"
7107
+ name: "default"
7023
7108
  }
7024
7109
  ],
7025
7110
  a11y: [
@@ -7830,6 +7915,847 @@ var treeui_catalog_default = {
7830
7915
  "hierarchy-picker"
7831
7916
  ]
7832
7917
  }
7918
+ ],
7919
+ tokens: [
7920
+ {
7921
+ cssVar: "--tree-font-family-sans",
7922
+ path: "font.family.sans",
7923
+ value: "'Google Sans Flex', 'Segoe UI', sans-serif",
7924
+ category: "font",
7925
+ description: "Typography token: font family, size, weight, or line height."
7926
+ },
7927
+ {
7928
+ cssVar: "--tree-font-family-mono",
7929
+ path: "font.family.mono",
7930
+ value: "'Google Sans Code', 'SFMono-Regular', monospace",
7931
+ category: "font",
7932
+ description: "Typography token: font family, size, weight, or line height."
7933
+ },
7934
+ {
7935
+ cssVar: "--tree-font-size-xs",
7936
+ path: "font.size.xs",
7937
+ value: "0.6875rem",
7938
+ category: "font",
7939
+ description: "Typography token: font family, size, weight, or line height."
7940
+ },
7941
+ {
7942
+ cssVar: "--tree-font-size-sm",
7943
+ path: "font.size.sm",
7944
+ value: "0.8125rem",
7945
+ category: "font",
7946
+ description: "Typography token: font family, size, weight, or line height."
7947
+ },
7948
+ {
7949
+ cssVar: "--tree-font-size-md",
7950
+ path: "font.size.md",
7951
+ value: "0.9375rem",
7952
+ category: "font",
7953
+ description: "Typography token: font family, size, weight, or line height."
7954
+ },
7955
+ {
7956
+ cssVar: "--tree-font-size-base",
7957
+ path: "font.size.base",
7958
+ value: "0.9375rem",
7959
+ category: "font",
7960
+ description: "Typography token: font family, size, weight, or line height."
7961
+ },
7962
+ {
7963
+ cssVar: "--tree-font-size-lg",
7964
+ path: "font.size.lg",
7965
+ value: "1.125rem",
7966
+ category: "font",
7967
+ description: "Typography token: font family, size, weight, or line height."
7968
+ },
7969
+ {
7970
+ cssVar: "--tree-font-size-xl",
7971
+ path: "font.size.xl",
7972
+ value: "1.375rem",
7973
+ category: "font",
7974
+ description: "Typography token: font family, size, weight, or line height."
7975
+ },
7976
+ {
7977
+ cssVar: "--tree-font-size-2xl",
7978
+ path: "font.size.2xl",
7979
+ value: "1.375rem",
7980
+ category: "font",
7981
+ description: "Typography token: font family, size, weight, or line height."
7982
+ },
7983
+ {
7984
+ cssVar: "--tree-font-size-3xl",
7985
+ path: "font.size.3xl",
7986
+ value: "1.75rem",
7987
+ category: "font",
7988
+ description: "Typography token: font family, size, weight, or line height."
7989
+ },
7990
+ {
7991
+ cssVar: "--tree-font-size-4xl",
7992
+ path: "font.size.4xl",
7993
+ value: "2.25rem",
7994
+ category: "font",
7995
+ description: "Typography token: font family, size, weight, or line height."
7996
+ },
7997
+ {
7998
+ cssVar: "--tree-font-size-5xl",
7999
+ path: "font.size.5xl",
8000
+ value: "3rem",
8001
+ category: "font",
8002
+ description: "Typography token: font family, size, weight, or line height."
8003
+ },
8004
+ {
8005
+ cssVar: "--tree-font-weight-regular",
8006
+ path: "font.weight.regular",
8007
+ value: "400",
8008
+ category: "font",
8009
+ description: "Typography token: font family, size, weight, or line height."
8010
+ },
8011
+ {
8012
+ cssVar: "--tree-font-weight-medium",
8013
+ path: "font.weight.medium",
8014
+ value: "500",
8015
+ category: "font",
8016
+ description: "Typography token: font family, size, weight, or line height."
8017
+ },
8018
+ {
8019
+ cssVar: "--tree-font-weight-semibold",
8020
+ path: "font.weight.semibold",
8021
+ value: "600",
8022
+ category: "font",
8023
+ description: "Typography token: font family, size, weight, or line height."
8024
+ },
8025
+ {
8026
+ cssVar: "--tree-font-weight-bold",
8027
+ path: "font.weight.bold",
8028
+ value: "700",
8029
+ category: "font",
8030
+ description: "Typography token: font family, size, weight, or line height."
8031
+ },
8032
+ {
8033
+ cssVar: "--tree-font-weight-extrabold",
8034
+ path: "font.weight.extrabold",
8035
+ value: "800",
8036
+ category: "font",
8037
+ description: "Typography token: font family, size, weight, or line height."
8038
+ },
8039
+ {
8040
+ cssVar: "--tree-font-lineHeight-compact",
8041
+ path: "font.lineHeight.compact",
8042
+ value: "1.1",
8043
+ category: "font",
8044
+ description: "Typography token: font family, size, weight, or line height."
8045
+ },
8046
+ {
8047
+ cssVar: "--tree-font-lineHeight-ui",
8048
+ path: "font.lineHeight.ui",
8049
+ value: "1.15",
8050
+ category: "font",
8051
+ description: "Typography token: font family, size, weight, or line height."
8052
+ },
8053
+ {
8054
+ cssVar: "--tree-font-lineHeight-tight",
8055
+ path: "font.lineHeight.tight",
8056
+ value: "1.25",
8057
+ category: "font",
8058
+ description: "Typography token: font family, size, weight, or line height."
8059
+ },
8060
+ {
8061
+ cssVar: "--tree-font-lineHeight-heading",
8062
+ path: "font.lineHeight.heading",
8063
+ value: "1.3",
8064
+ category: "font",
8065
+ description: "Typography token: font family, size, weight, or line height."
8066
+ },
8067
+ {
8068
+ cssVar: "--tree-font-lineHeight-base",
8069
+ path: "font.lineHeight.base",
8070
+ value: "1.5",
8071
+ category: "font",
8072
+ description: "Typography token: font family, size, weight, or line height."
8073
+ },
8074
+ {
8075
+ cssVar: "--tree-font-lineHeight-body",
8076
+ path: "font.lineHeight.body",
8077
+ value: "1.6",
8078
+ category: "font",
8079
+ description: "Typography token: font family, size, weight, or line height."
8080
+ },
8081
+ {
8082
+ cssVar: "--tree-font-lineHeight-relaxed",
8083
+ path: "font.lineHeight.relaxed",
8084
+ value: "1.65",
8085
+ category: "font",
8086
+ description: "Typography token: font family, size, weight, or line height."
8087
+ },
8088
+ {
8089
+ cssVar: "--tree-space-0",
8090
+ path: "space.0",
8091
+ value: "0",
8092
+ category: "space",
8093
+ description: "Spacing scale step for padding, margin, and gap."
8094
+ },
8095
+ {
8096
+ cssVar: "--tree-space-1",
8097
+ path: "space.1",
8098
+ value: "0.25rem",
8099
+ category: "space",
8100
+ description: "Spacing scale step for padding, margin, and gap."
8101
+ },
8102
+ {
8103
+ cssVar: "--tree-space-2",
8104
+ path: "space.2",
8105
+ value: "0.5rem",
8106
+ category: "space",
8107
+ description: "Spacing scale step for padding, margin, and gap."
8108
+ },
8109
+ {
8110
+ cssVar: "--tree-space-3",
8111
+ path: "space.3",
8112
+ value: "0.75rem",
8113
+ category: "space",
8114
+ description: "Spacing scale step for padding, margin, and gap."
8115
+ },
8116
+ {
8117
+ cssVar: "--tree-space-4",
8118
+ path: "space.4",
8119
+ value: "1rem",
8120
+ category: "space",
8121
+ description: "Spacing scale step for padding, margin, and gap."
8122
+ },
8123
+ {
8124
+ cssVar: "--tree-space-5",
8125
+ path: "space.5",
8126
+ value: "1.25rem",
8127
+ category: "space",
8128
+ description: "Spacing scale step for padding, margin, and gap."
8129
+ },
8130
+ {
8131
+ cssVar: "--tree-space-6",
8132
+ path: "space.6",
8133
+ value: "1.5rem",
8134
+ category: "space",
8135
+ description: "Spacing scale step for padding, margin, and gap."
8136
+ },
8137
+ {
8138
+ cssVar: "--tree-space-8",
8139
+ path: "space.8",
8140
+ value: "2rem",
8141
+ category: "space",
8142
+ description: "Spacing scale step for padding, margin, and gap."
8143
+ },
8144
+ {
8145
+ cssVar: "--tree-space-12",
8146
+ path: "space.12",
8147
+ value: "3rem",
8148
+ category: "space",
8149
+ description: "Spacing scale step for padding, margin, and gap."
8150
+ },
8151
+ {
8152
+ cssVar: "--tree-space-16",
8153
+ path: "space.16",
8154
+ value: "4rem",
8155
+ category: "space",
8156
+ description: "Spacing scale step for padding, margin, and gap."
8157
+ },
8158
+ {
8159
+ cssVar: "--tree-radius-sm",
8160
+ path: "radius.sm",
8161
+ value: "0.375rem",
8162
+ category: "radius",
8163
+ description: "Corner radius scale step."
8164
+ },
8165
+ {
8166
+ cssVar: "--tree-radius-md",
8167
+ path: "radius.md",
8168
+ value: "0.625rem",
8169
+ category: "radius",
8170
+ description: "Corner radius scale step."
8171
+ },
8172
+ {
8173
+ cssVar: "--tree-radius-lg",
8174
+ path: "radius.lg",
8175
+ value: "0.875rem",
8176
+ category: "radius",
8177
+ description: "Corner radius scale step."
8178
+ },
8179
+ {
8180
+ cssVar: "--tree-radius-pill",
8181
+ path: "radius.pill",
8182
+ value: "999px",
8183
+ category: "radius",
8184
+ description: "Corner radius scale step."
8185
+ },
8186
+ {
8187
+ cssVar: "--tree-shadow-xs",
8188
+ path: "shadow.xs",
8189
+ value: "0 1px 2px rgba(15, 23, 42, 0.06)",
8190
+ category: "shadow",
8191
+ description: "Elevation shadow."
8192
+ },
8193
+ {
8194
+ cssVar: "--tree-shadow-sm",
8195
+ path: "shadow.sm",
8196
+ value: "0 6px 18px rgba(15, 23, 42, 0.08)",
8197
+ category: "shadow",
8198
+ description: "Elevation shadow."
8199
+ },
8200
+ {
8201
+ cssVar: "--tree-shadow-md",
8202
+ path: "shadow.md",
8203
+ value: "0 14px 34px rgba(15, 23, 42, 0.12)",
8204
+ category: "shadow",
8205
+ description: "Elevation shadow."
8206
+ },
8207
+ {
8208
+ cssVar: "--tree-gradient-brand",
8209
+ path: "gradient.brand",
8210
+ value: "linear-gradient(135deg, var(--tree-color-brand-primary), var(--tree-color-brand-hover))",
8211
+ category: "gradient",
8212
+ description: "Gradient composed from the themed brand variables."
8213
+ },
8214
+ {
8215
+ cssVar: "--tree-border-width-subtle",
8216
+ path: "border.width.subtle",
8217
+ value: "1px",
8218
+ category: "border",
8219
+ description: "Border width step."
8220
+ },
8221
+ {
8222
+ cssVar: "--tree-border-width-strong",
8223
+ path: "border.width.strong",
8224
+ value: "1.5px",
8225
+ category: "border",
8226
+ description: "Border width step."
8227
+ },
8228
+ {
8229
+ cssVar: "--tree-motion-duration-fast",
8230
+ path: "motion.duration.fast",
8231
+ value: "100ms",
8232
+ category: "motion",
8233
+ description: "Motion duration or easing curve."
8234
+ },
8235
+ {
8236
+ cssVar: "--tree-motion-duration-moderate",
8237
+ path: "motion.duration.moderate",
8238
+ value: "200ms",
8239
+ category: "motion",
8240
+ description: "Motion duration or easing curve."
8241
+ },
8242
+ {
8243
+ cssVar: "--tree-motion-duration-normal",
8244
+ path: "motion.duration.normal",
8245
+ value: "300ms",
8246
+ category: "motion",
8247
+ description: "Motion duration or easing curve."
8248
+ },
8249
+ {
8250
+ cssVar: "--tree-motion-duration-slow",
8251
+ path: "motion.duration.slow",
8252
+ value: "400ms",
8253
+ category: "motion",
8254
+ description: "Motion duration or easing curve."
8255
+ },
8256
+ {
8257
+ cssVar: "--tree-motion-duration-slower",
8258
+ path: "motion.duration.slower",
8259
+ value: "500ms",
8260
+ category: "motion",
8261
+ description: "Motion duration or easing curve."
8262
+ },
8263
+ {
8264
+ cssVar: "--tree-motion-easing-standard",
8265
+ path: "motion.easing.standard",
8266
+ value: "cubic-bezier(0.2, 0, 0, 1)",
8267
+ category: "motion",
8268
+ description: "Motion duration or easing curve."
8269
+ },
8270
+ {
8271
+ cssVar: "--tree-motion-easing-easeOut",
8272
+ path: "motion.easing.easeOut",
8273
+ value: "cubic-bezier(0, 0, 0.2, 1)",
8274
+ category: "motion",
8275
+ description: "Motion duration or easing curve."
8276
+ },
8277
+ {
8278
+ cssVar: "--tree-motion-easing-easeInOut",
8279
+ path: "motion.easing.easeInOut",
8280
+ value: "cubic-bezier(0.4, 0, 0.2, 1)",
8281
+ category: "motion",
8282
+ description: "Motion duration or easing curve."
8283
+ },
8284
+ {
8285
+ cssVar: "--tree-motion-easing-easeIn",
8286
+ path: "motion.easing.easeIn",
8287
+ value: "cubic-bezier(0.4, 0, 1, 1)",
8288
+ category: "motion",
8289
+ description: "Motion duration or easing curve."
8290
+ },
8291
+ {
8292
+ cssVar: "--tree-size-control-sm",
8293
+ path: "size.control.sm",
8294
+ value: "2rem",
8295
+ category: "size",
8296
+ description: "Control and icon sizing scale step."
8297
+ },
8298
+ {
8299
+ cssVar: "--tree-size-control-md",
8300
+ path: "size.control.md",
8301
+ value: "2.5rem",
8302
+ category: "size",
8303
+ description: "Control and icon sizing scale step."
8304
+ },
8305
+ {
8306
+ cssVar: "--tree-size-control-lg",
8307
+ path: "size.control.lg",
8308
+ value: "3rem",
8309
+ category: "size",
8310
+ description: "Control and icon sizing scale step."
8311
+ },
8312
+ {
8313
+ cssVar: "--tree-size-icon-sm",
8314
+ path: "size.icon.sm",
8315
+ value: "1rem",
8316
+ category: "size",
8317
+ description: "Control and icon sizing scale step."
8318
+ },
8319
+ {
8320
+ cssVar: "--tree-size-icon-md",
8321
+ path: "size.icon.md",
8322
+ value: "1.25rem",
8323
+ category: "size",
8324
+ description: "Control and icon sizing scale step."
8325
+ },
8326
+ {
8327
+ cssVar: "--tree-size-icon-lg",
8328
+ path: "size.icon.lg",
8329
+ value: "1.5rem",
8330
+ category: "size",
8331
+ description: "Control and icon sizing scale step."
8332
+ },
8333
+ {
8334
+ cssVar: "--tree-size-icon-xl",
8335
+ path: "size.icon.xl",
8336
+ value: "2rem",
8337
+ category: "size",
8338
+ description: "Control and icon sizing scale step."
8339
+ },
8340
+ {
8341
+ cssVar: "--tree-size-icon-2xl",
8342
+ path: "size.icon.2xl",
8343
+ value: "3rem",
8344
+ category: "size",
8345
+ description: "Control and icon sizing scale step."
8346
+ },
8347
+ {
8348
+ cssVar: "--tree-layout-grid-columns",
8349
+ path: "layout.grid.columns",
8350
+ value: "12",
8351
+ category: "layout",
8352
+ description: "Layout grid, gutter, or margin measurement."
8353
+ },
8354
+ {
8355
+ cssVar: "--tree-layout-grid-base",
8356
+ path: "layout.grid.base",
8357
+ value: "8px",
8358
+ category: "layout",
8359
+ description: "Layout grid, gutter, or margin measurement."
8360
+ },
8361
+ {
8362
+ cssVar: "--tree-layout-gutter-sm",
8363
+ path: "layout.gutter.sm",
8364
+ value: "1rem",
8365
+ category: "layout",
8366
+ description: "Layout grid, gutter, or margin measurement."
8367
+ },
8368
+ {
8369
+ cssVar: "--tree-layout-gutter-md",
8370
+ path: "layout.gutter.md",
8371
+ value: "1.5rem",
8372
+ category: "layout",
8373
+ description: "Layout grid, gutter, or margin measurement."
8374
+ },
8375
+ {
8376
+ cssVar: "--tree-layout-margin-sm",
8377
+ path: "layout.margin.sm",
8378
+ value: "1.5rem",
8379
+ category: "layout",
8380
+ description: "Layout grid, gutter, or margin measurement."
8381
+ },
8382
+ {
8383
+ cssVar: "--tree-layout-margin-md",
8384
+ path: "layout.margin.md",
8385
+ value: "2rem",
8386
+ category: "layout",
8387
+ description: "Layout grid, gutter, or margin measurement."
8388
+ },
8389
+ {
8390
+ cssVar: "--tree-layout-margin-lg",
8391
+ path: "layout.margin.lg",
8392
+ value: "3rem",
8393
+ category: "layout",
8394
+ description: "Layout grid, gutter, or margin measurement."
8395
+ },
8396
+ {
8397
+ cssVar: "--tree-z-base",
8398
+ path: "z.base",
8399
+ value: "1",
8400
+ category: "z",
8401
+ description: "Stacking layer (z-index)."
8402
+ },
8403
+ {
8404
+ cssVar: "--tree-z-dropdown",
8405
+ path: "z.dropdown",
8406
+ value: "1000",
8407
+ category: "z",
8408
+ description: "Stacking layer (z-index)."
8409
+ },
8410
+ {
8411
+ cssVar: "--tree-z-popover",
8412
+ path: "z.popover",
8413
+ value: "1050",
8414
+ category: "z",
8415
+ description: "Stacking layer (z-index)."
8416
+ },
8417
+ {
8418
+ cssVar: "--tree-z-sticky",
8419
+ path: "z.sticky",
8420
+ value: "1100",
8421
+ category: "z",
8422
+ description: "Stacking layer (z-index)."
8423
+ },
8424
+ {
8425
+ cssVar: "--tree-z-overlay",
8426
+ path: "z.overlay",
8427
+ value: "1200",
8428
+ category: "z",
8429
+ description: "Stacking layer (z-index)."
8430
+ },
8431
+ {
8432
+ cssVar: "--tree-z-modal",
8433
+ path: "z.modal",
8434
+ value: "1300",
8435
+ category: "z",
8436
+ description: "Stacking layer (z-index)."
8437
+ },
8438
+ {
8439
+ cssVar: "--tree-z-toast",
8440
+ path: "z.toast",
8441
+ value: "1400",
8442
+ category: "z",
8443
+ description: "Stacking layer (z-index)."
8444
+ },
8445
+ {
8446
+ cssVar: "--tree-breakpoint-sm",
8447
+ path: "breakpoint.sm",
8448
+ value: "640px",
8449
+ category: "breakpoint",
8450
+ description: "Responsive breakpoint width."
8451
+ },
8452
+ {
8453
+ cssVar: "--tree-breakpoint-md",
8454
+ path: "breakpoint.md",
8455
+ value: "768px",
8456
+ category: "breakpoint",
8457
+ description: "Responsive breakpoint width."
8458
+ },
8459
+ {
8460
+ cssVar: "--tree-breakpoint-lg",
8461
+ path: "breakpoint.lg",
8462
+ value: "1024px",
8463
+ category: "breakpoint",
8464
+ description: "Responsive breakpoint width."
8465
+ },
8466
+ {
8467
+ cssVar: "--tree-breakpoint-xl",
8468
+ path: "breakpoint.xl",
8469
+ value: "1280px",
8470
+ category: "breakpoint",
8471
+ description: "Responsive breakpoint width."
8472
+ },
8473
+ {
8474
+ cssVar: "--tree-color-bg-primary",
8475
+ path: "color.bg.primary",
8476
+ value: "#f6f8fa",
8477
+ category: "color",
8478
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8479
+ themeValues: {
8480
+ light: "#f6f8fa",
8481
+ dark: "#1c2128"
8482
+ }
8483
+ },
8484
+ {
8485
+ cssVar: "--tree-color-bg-surface",
8486
+ path: "color.bg.surface",
8487
+ value: "#ffffff",
8488
+ category: "color",
8489
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8490
+ themeValues: {
8491
+ light: "#ffffff",
8492
+ dark: "#22272e"
8493
+ }
8494
+ },
8495
+ {
8496
+ cssVar: "--tree-color-bg-subtle",
8497
+ path: "color.bg.subtle",
8498
+ value: "#eff2f5",
8499
+ category: "color",
8500
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8501
+ themeValues: {
8502
+ light: "#eff2f5",
8503
+ dark: "#2d333b"
8504
+ }
8505
+ },
8506
+ {
8507
+ cssVar: "--tree-color-border-default",
8508
+ path: "color.border.default",
8509
+ value: "#d0d7de",
8510
+ category: "color",
8511
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8512
+ themeValues: {
8513
+ light: "#d0d7de",
8514
+ dark: "#444c56"
8515
+ }
8516
+ },
8517
+ {
8518
+ cssVar: "--tree-color-border-strong",
8519
+ path: "color.border.strong",
8520
+ value: "#afb8c1",
8521
+ category: "color",
8522
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8523
+ themeValues: {
8524
+ light: "#afb8c1",
8525
+ dark: "#576270"
8526
+ }
8527
+ },
8528
+ {
8529
+ cssVar: "--tree-color-text-primary",
8530
+ path: "color.text.primary",
8531
+ value: "#1f2328",
8532
+ category: "color",
8533
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8534
+ themeValues: {
8535
+ light: "#1f2328",
8536
+ dark: "#adbac7"
8537
+ }
8538
+ },
8539
+ {
8540
+ cssVar: "--tree-color-text-muted",
8541
+ path: "color.text.muted",
8542
+ value: "#59636e",
8543
+ category: "color",
8544
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8545
+ themeValues: {
8546
+ light: "#59636e",
8547
+ dark: "#95a3b2"
8548
+ }
8549
+ },
8550
+ {
8551
+ cssVar: "--tree-color-text-inverse",
8552
+ path: "color.text.inverse",
8553
+ value: "#ffffff",
8554
+ category: "color",
8555
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8556
+ themeValues: {
8557
+ light: "#ffffff",
8558
+ dark: "#1c2128"
8559
+ }
8560
+ },
8561
+ {
8562
+ cssVar: "--tree-color-brand-primary",
8563
+ path: "color.brand.primary",
8564
+ value: "#0969da",
8565
+ category: "color",
8566
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8567
+ themeValues: {
8568
+ light: "#0969da",
8569
+ dark: "#539bf5"
8570
+ }
8571
+ },
8572
+ {
8573
+ cssVar: "--tree-color-brand-hover",
8574
+ path: "color.brand.hover",
8575
+ value: "#0550ae",
8576
+ category: "color",
8577
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8578
+ themeValues: {
8579
+ light: "#0550ae",
8580
+ dark: "#6cabf7"
8581
+ }
8582
+ },
8583
+ {
8584
+ cssVar: "--tree-color-brand-soft",
8585
+ path: "color.brand.soft",
8586
+ value: "#ddf4ff",
8587
+ category: "color",
8588
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8589
+ themeValues: {
8590
+ light: "#ddf4ff",
8591
+ dark: "#1a3453"
8592
+ }
8593
+ },
8594
+ {
8595
+ cssVar: "--tree-color-brand-contrast",
8596
+ path: "color.brand.contrast",
8597
+ value: "#ffffff",
8598
+ category: "color",
8599
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8600
+ themeValues: {
8601
+ light: "#ffffff",
8602
+ dark: "#0a1a2f"
8603
+ }
8604
+ },
8605
+ {
8606
+ cssVar: "--tree-color-status-success",
8607
+ path: "color.status.success",
8608
+ value: "#1a7f37",
8609
+ category: "color",
8610
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8611
+ themeValues: {
8612
+ light: "#1a7f37",
8613
+ dark: "#57ab5a"
8614
+ }
8615
+ },
8616
+ {
8617
+ cssVar: "--tree-color-status-warning",
8618
+ path: "color.status.warning",
8619
+ value: "#9a6700",
8620
+ category: "color",
8621
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8622
+ themeValues: {
8623
+ light: "#9a6700",
8624
+ dark: "#c69026"
8625
+ }
8626
+ },
8627
+ {
8628
+ cssVar: "--tree-color-status-error",
8629
+ path: "color.status.error",
8630
+ value: "#d1242f",
8631
+ category: "color",
8632
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8633
+ themeValues: {
8634
+ light: "#d1242f",
8635
+ dark: "#f47067"
8636
+ }
8637
+ },
8638
+ {
8639
+ cssVar: "--tree-color-status-info",
8640
+ path: "color.status.info",
8641
+ value: "#0969da",
8642
+ category: "color",
8643
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8644
+ themeValues: {
8645
+ light: "#0969da",
8646
+ dark: "#6cb6ff"
8647
+ }
8648
+ },
8649
+ {
8650
+ cssVar: "--tree-color-chart-1",
8651
+ path: "color.chart.1",
8652
+ value: "#2a78d6",
8653
+ category: "color",
8654
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8655
+ themeValues: {
8656
+ light: "#2a78d6",
8657
+ dark: "#3987e5"
8658
+ }
8659
+ },
8660
+ {
8661
+ cssVar: "--tree-color-chart-2",
8662
+ path: "color.chart.2",
8663
+ value: "#1baf7a",
8664
+ category: "color",
8665
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8666
+ themeValues: {
8667
+ light: "#1baf7a",
8668
+ dark: "#199e70"
8669
+ }
8670
+ },
8671
+ {
8672
+ cssVar: "--tree-color-chart-3",
8673
+ path: "color.chart.3",
8674
+ value: "#eda100",
8675
+ category: "color",
8676
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8677
+ themeValues: {
8678
+ light: "#eda100",
8679
+ dark: "#c98500"
8680
+ }
8681
+ },
8682
+ {
8683
+ cssVar: "--tree-color-chart-4",
8684
+ path: "color.chart.4",
8685
+ value: "#008300",
8686
+ category: "color",
8687
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8688
+ themeValues: {
8689
+ light: "#008300",
8690
+ dark: "#008300"
8691
+ }
8692
+ },
8693
+ {
8694
+ cssVar: "--tree-color-chart-5",
8695
+ path: "color.chart.5",
8696
+ value: "#4a3aa7",
8697
+ category: "color",
8698
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8699
+ themeValues: {
8700
+ light: "#4a3aa7",
8701
+ dark: "#9085e9"
8702
+ }
8703
+ },
8704
+ {
8705
+ cssVar: "--tree-color-chart-6",
8706
+ path: "color.chart.6",
8707
+ value: "#e34948",
8708
+ category: "color",
8709
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8710
+ themeValues: {
8711
+ light: "#e34948",
8712
+ dark: "#e66767"
8713
+ }
8714
+ },
8715
+ {
8716
+ cssVar: "--tree-color-chart-7",
8717
+ path: "color.chart.7",
8718
+ value: "#e87ba4",
8719
+ category: "color",
8720
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8721
+ themeValues: {
8722
+ light: "#e87ba4",
8723
+ dark: "#d55181"
8724
+ }
8725
+ },
8726
+ {
8727
+ cssVar: "--tree-color-chart-8",
8728
+ path: "color.chart.8",
8729
+ value: "#eb6834",
8730
+ category: "color",
8731
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8732
+ themeValues: {
8733
+ light: "#eb6834",
8734
+ dark: "#d95926"
8735
+ }
8736
+ },
8737
+ {
8738
+ cssVar: "--tree-color-overlay",
8739
+ path: "color.overlay",
8740
+ value: "rgba(31, 35, 40, 0.5)",
8741
+ category: "color",
8742
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8743
+ themeValues: {
8744
+ light: "rgba(31, 35, 40, 0.5)",
8745
+ dark: "rgba(13, 17, 23, 0.6)"
8746
+ }
8747
+ },
8748
+ {
8749
+ cssVar: "--tree-color-focus-ring",
8750
+ path: "color.focus-ring",
8751
+ value: "rgba(9, 105, 218, 0.32)",
8752
+ category: "color",
8753
+ description: "Themed semantic color, resolved per [data-tree-theme].",
8754
+ themeValues: {
8755
+ light: "rgba(9, 105, 218, 0.32)",
8756
+ dark: "rgba(83, 155, 245, 0.32)"
8757
+ }
8758
+ }
7833
8759
  ]
7834
8760
  };
7835
8761
 
@@ -8075,6 +9001,43 @@ var searchRecipes = (query, limit = 6) => catalog.recipes.map((recipe) => ({
8075
9001
  recipe,
8076
9002
  score: scoreMatch(query, recipeSearchText(recipe))
8077
9003
  })).filter((result) => result.score > 0).sort((left, right) => right.score - left.score || left.recipe.name.localeCompare(right.recipe.name)).slice(0, limit);
9004
+ var tokenValues = (token) => [
9005
+ token.value,
9006
+ ...Object.values(token.themeValues ?? {})
9007
+ ];
9008
+ var REM_ROOT_PX = 16;
9009
+ var lengthAliases = (query) => {
9010
+ const match = query.trim().match(/^(\d*\.?\d+)(rem|px)$/i);
9011
+ if (!match) {
9012
+ return [];
9013
+ }
9014
+ const amount = Number(match[1]);
9015
+ if (!Number.isFinite(amount)) {
9016
+ return [];
9017
+ }
9018
+ const unit = match[2].toLowerCase();
9019
+ const converted = unit === "rem" ? amount * REM_ROOT_PX : amount / REM_ROOT_PX;
9020
+ return [`${Number(converted.toFixed(4))}${unit === "rem" ? "px" : "rem"}`];
9021
+ };
9022
+ var scoreToken = (token, query) => {
9023
+ const identity = normalizeText(stringifyFields([token.cssVar, token.path]));
9024
+ const category = normalizeText(token.category);
9025
+ const values = normalizeText(stringifyFields(tokenValues(token)));
9026
+ const description = normalizeText(token.description ?? "");
9027
+ const valueScore = Math.max(
9028
+ ...[query, ...lengthAliases(query)].map((candidate) => scoreMatch(candidate, values))
9029
+ );
9030
+ let score = 0;
9031
+ score += scoreMatch(query, identity) * 3;
9032
+ score += scoreMatch(query, category) * 2;
9033
+ score += valueScore * 2;
9034
+ score += scoreMatch(query, description);
9035
+ return Math.max(score, 0);
9036
+ };
9037
+ var searchTokens = (query, limit = 12) => catalog.tokens.map((token) => ({
9038
+ token,
9039
+ score: scoreToken(token, query)
9040
+ })).filter((result) => result.score > 0).sort((left, right) => right.score - left.score || left.token.cssVar.localeCompare(right.token.cssVar)).slice(0, limit);
8078
9041
  var formatFieldList = (label, values) => values.length > 0 ? `${label}: ${values.join(", ")}` : void 0;
8079
9042
  var formatComponentSummary = (component) => {
8080
9043
  const lines = [
@@ -8119,6 +9082,12 @@ var formatRecipeResults = (results) => results.length > 0 ? results.map((result,
8119
9082
  const useWhen = result.recipe.useWhen[0];
8120
9083
  return `${index + 1}. ${result.recipe.name}: ${useWhen ?? "No recipe summary available."} Components: ${result.recipe.compose.join(", ")}.`;
8121
9084
  }).join("\n") : "No matching TreeUI recipes found.";
9085
+ var formatTokenResults = (results) => results.length > 0 ? results.map((result, index) => {
9086
+ const { token } = result;
9087
+ const themeValues = token.themeValues ? Object.entries(token.themeValues).map(([theme, value]) => `${theme} ${value}`).join(" | ") : void 0;
9088
+ const description = token.description ? ` ${token.description}` : "";
9089
+ return `${index + 1}. ${token.cssVar}: ${themeValues ?? token.value} (${token.category} | ${token.path}).${description}`;
9090
+ }).join("\n") : "No matching TreeUI design tokens found.";
8122
9091
  var formatSetupGuide = (componentName) => {
8123
9092
  if (!componentName) {
8124
9093
  return [
@@ -8175,6 +9144,12 @@ var resourceList = [
8175
9144
  description: "Reusable multi-component composition recipes.",
8176
9145
  mimeType: "application/json"
8177
9146
  },
9147
+ {
9148
+ uri: "treeui://tokens",
9149
+ name: "TreeUI design tokens",
9150
+ description: "Flat list of --tree-* design tokens with per-theme values.",
9151
+ mimeType: "application/json"
9152
+ },
8178
9153
  ...catalog.components.map((component) => ({
8179
9154
  uri: `treeui://components/${component.name}`,
8180
9155
  name: component.name,
@@ -8202,6 +9177,9 @@ var readResourcePayload = (uri) => {
8202
9177
  if (uri === "treeui://recipes") {
8203
9178
  return catalog.recipes;
8204
9179
  }
9180
+ if (uri === "treeui://tokens") {
9181
+ return catalog.tokens;
9182
+ }
8205
9183
  const componentMatch = uri.match(/^treeui:\/\/components\/([^/]+)$/);
8206
9184
  if (componentMatch) {
8207
9185
  const component = findComponent(componentMatch[1]);
@@ -8303,6 +9281,21 @@ var createTreeuiMcpServer = () => {
8303
9281
  },
8304
9282
  required: ["query"]
8305
9283
  }
9284
+ },
9285
+ {
9286
+ name: "search_tokens",
9287
+ description: "Search TreeUI design tokens by CSS variable, category, path, or shipped value. Use this before hardcoding any color, spacing, radius, or breakpoint value.",
9288
+ inputSchema: {
9289
+ type: "object",
9290
+ properties: {
9291
+ query: {
9292
+ type: "string",
9293
+ description: "A CSS variable such as --tree-gradient-brand, a category or path such as space or color.status, or a literal value such as 64rem or #0969da."
9294
+ },
9295
+ limit: { type: "number", description: "Maximum number of tokens to return." }
9296
+ },
9297
+ required: ["query"]
9298
+ }
8306
9299
  }
8307
9300
  ]
8308
9301
  }));
@@ -8343,6 +9336,13 @@ var createTreeuiMcpServer = () => {
8343
9336
  }
8344
9337
  return asTextContent(formatRecipeResults(searchRecipes(query, readNumberArg(args, "limit", 6))));
8345
9338
  }
9339
+ if (name === "search_tokens") {
9340
+ const query = readStringArg(args, "query");
9341
+ if (!query) {
9342
+ return asErrorTextContent('The "query" argument is required.');
9343
+ }
9344
+ return asTextContent(formatTokenResults(searchTokens(query, readNumberArg(args, "limit", 12))));
9345
+ }
8346
9346
  return asErrorTextContent(`Unknown tool: ${name}`);
8347
9347
  });
8348
9348
  server.setRequestHandler(ListResourcesRequestSchema, async () => ({
@@ -8372,9 +9372,11 @@ export {
8372
9372
  searchComponents,
8373
9373
  recommendComponents,
8374
9374
  searchRecipes,
9375
+ searchTokens,
8375
9376
  formatComponentSummary,
8376
9377
  formatSearchResults,
8377
9378
  formatRecipeResults,
9379
+ formatTokenResults,
8378
9380
  formatSetupGuide,
8379
9381
  createTreeuiMcpServer
8380
9382
  };