@cloudflare/kumo 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/ai/component-registry.json +220 -30
  3. package/ai/component-registry.md +305 -19
  4. package/dist/.build-complete +1 -1
  5. package/dist/blocks-source/resource-list/resource-list.tsx +1 -1
  6. package/dist/chunks/{autocomplete-cs3fwy6lwzlyirpq.js → autocomplete-48aq0d244bs2e8zv.js} +3 -3
  7. package/dist/chunks/{autocomplete-cs3fwy6lwzlyirpq.js.map → autocomplete-48aq0d244bs2e8zv.js.map} +1 -1
  8. package/dist/chunks/{checkbox-eren6w2csum1xghg.js → checkbox-hvxfvhtx1qjo2mww.js} +2 -2
  9. package/dist/chunks/{checkbox-eren6w2csum1xghg.js.map → checkbox-hvxfvhtx1qjo2mww.js.map} +1 -1
  10. package/dist/chunks/{clipboard-text-f9q753udny1uyxr5.js → clipboard-text-hswydzx3iql369sd.js} +2 -2
  11. package/dist/chunks/{clipboard-text-f9q753udny1uyxr5.js.map → clipboard-text-hswydzx3iql369sd.js.map} +1 -1
  12. package/dist/chunks/{code-cz0w1y5z4h29a9eg.js → code-f9v1ikwhekqw274q.js} +4 -4
  13. package/dist/chunks/{code-cz0w1y5z4h29a9eg.js.map → code-f9v1ikwhekqw274q.js.map} +1 -1
  14. package/dist/chunks/{collapsible-k8urhi16pg90jvxa.js → collapsible-nlp2jvcyuzxmq28o.js} +12 -11
  15. package/dist/chunks/{collapsible-k8urhi16pg90jvxa.js.map → collapsible-nlp2jvcyuzxmq28o.js.map} +1 -1
  16. package/dist/chunks/{combobox-n9qht9h9ag6kh5sn.js → combobox-fq36ye0hstote16x.js} +10 -10
  17. package/dist/chunks/{combobox-n9qht9h9ag6kh5sn.js.map → combobox-fq36ye0hstote16x.js.map} +1 -1
  18. package/dist/chunks/{command-palette-gk9m34ymp2b3hfc5.js → command-palette-md65owxt5hv4rt9r.js} +142 -142
  19. package/dist/chunks/{command-palette-gk9m34ymp2b3hfc5.js.map → command-palette-md65owxt5hv4rt9r.js.map} +1 -1
  20. package/dist/chunks/{date-range-picker-c9wnx9tbwohai7jy.js → date-range-picker-o8uyril1kogvhoei.js} +19 -19
  21. package/dist/chunks/{date-range-picker-c9wnx9tbwohai7jy.js.map → date-range-picker-o8uyril1kogvhoei.js.map} +1 -1
  22. package/dist/chunks/{dialog-94v7wiz7j3in6528.js → dialog-k3f1fbam6nt96k8x.js} +2 -2
  23. package/dist/chunks/{dialog-94v7wiz7j3in6528.js.map → dialog-k3f1fbam6nt96k8x.js.map} +1 -1
  24. package/dist/chunks/{empty-kpymw59thjf2ip8g.js → empty-b82oer7npkhtkx7k.js} +6 -6
  25. package/dist/chunks/{empty-kpymw59thjf2ip8g.js.map → empty-b82oer7npkhtkx7k.js.map} +1 -1
  26. package/dist/chunks/{field-lnj619xpe8zjd26r.js → field-c0wf94plit2gci59.js} +2 -2
  27. package/dist/chunks/{field-lnj619xpe8zjd26r.js.map → field-c0wf94plit2gci59.js.map} +1 -1
  28. package/dist/chunks/{input-area-h8xbqturegdfm1mi.js → input-area-bkyzu6f7gsck479h.js} +3 -3
  29. package/dist/chunks/{input-area-h8xbqturegdfm1mi.js.map → input-area-bkyzu6f7gsck479h.js.map} +1 -1
  30. package/dist/chunks/{input-group-dh4pg8p20rh4mdi0.js → input-group-bidweffa0zyg8gt0.js} +3 -3
  31. package/dist/chunks/{input-group-dh4pg8p20rh4mdi0.js.map → input-group-bidweffa0zyg8gt0.js.map} +1 -1
  32. package/dist/chunks/{input-lpa5fc75tgrraafv.js → input-ncfowphv81yq7fyy.js} +18 -18
  33. package/dist/chunks/input-ncfowphv81yq7fyy.js.map +1 -0
  34. package/dist/chunks/{label-be8m7qzlakzig2sl.js → label-c3h9i3y4wiccelt7.js} +22 -22
  35. package/dist/chunks/{label-be8m7qzlakzig2sl.js.map → label-c3h9i3y4wiccelt7.js.map} +1 -1
  36. package/dist/chunks/{layer-card-hvivdirwwnyq88wa.js → layer-card-ikm31xemd70w3lru.js} +2 -2
  37. package/dist/chunks/{layer-card-hvivdirwwnyq88wa.js.map → layer-card-ikm31xemd70w3lru.js.map} +1 -1
  38. package/dist/chunks/{meter-bqetlujwg8gm2u7m.js → meter-n34a7yb8c3rim26i.js} +2 -2
  39. package/dist/chunks/{meter-bqetlujwg8gm2u7m.js.map → meter-n34a7yb8c3rim26i.js.map} +1 -1
  40. package/dist/chunks/{pagination-ho8zesqfyp6ckmrl.js → pagination-jb3mncivbwsoi1se.js} +40 -40
  41. package/dist/chunks/{pagination-ho8zesqfyp6ckmrl.js.map → pagination-jb3mncivbwsoi1se.js.map} +1 -1
  42. package/dist/chunks/{select-kpfbib9l8xrrmzpz.js → select-g261chvosodu22i8.js} +3 -3
  43. package/dist/chunks/{select-kpfbib9l8xrrmzpz.js.map → select-g261chvosodu22i8.js.map} +1 -1
  44. package/dist/chunks/{sensitive-input-i1upqytzaw2pus8v.js → sensitive-input-cijagk551mesdtk4.js} +3 -3
  45. package/dist/chunks/{sensitive-input-i1upqytzaw2pus8v.js.map → sensitive-input-cijagk551mesdtk4.js.map} +1 -1
  46. package/dist/chunks/{sidebar-kh37grvfxto14ek6.js → sidebar-kb9kykqfgy5yzqwr.js} +4 -4
  47. package/dist/chunks/{sidebar-kh37grvfxto14ek6.js.map → sidebar-kb9kykqfgy5yzqwr.js.map} +1 -1
  48. package/dist/chunks/{surface-o63tktyrifcjejyb.js → surface-k0e8mq1x00b7i8r6.js} +2 -2
  49. package/dist/chunks/{surface-o63tktyrifcjejyb.js.map → surface-k0e8mq1x00b7i8r6.js.map} +1 -1
  50. package/dist/chunks/{switch-lclhiplr9zqf73tj.js → switch-jdfsr3j3oa1qxegw.js} +2 -2
  51. package/dist/chunks/{switch-lclhiplr9zqf73tj.js.map → switch-jdfsr3j3oa1qxegw.js.map} +1 -1
  52. package/dist/chunks/{table-fyy8gl875yyevqs3.js → table-iudje0lva0z68jto.js} +2 -2
  53. package/dist/chunks/{table-fyy8gl875yyevqs3.js.map → table-iudje0lva0z68jto.js.map} +1 -1
  54. package/dist/chunks/{tabs-jywwt8ebjqjkux75.js → tabs-mkhf1uemgr3ij0ps.js} +3 -3
  55. package/dist/chunks/{tabs-jywwt8ebjqjkux75.js.map → tabs-mkhf1uemgr3ij0ps.js.map} +1 -1
  56. package/dist/chunks/toast-h573o0tc7tefivk2.js.map +1 -1
  57. package/dist/code.js +30 -30
  58. package/dist/code.js.map +1 -1
  59. package/dist/components/autocomplete.js +1 -1
  60. package/dist/components/checkbox.js +1 -1
  61. package/dist/components/clipboard-text.js +1 -1
  62. package/dist/components/code.js +1 -1
  63. package/dist/components/collapsible.js +1 -1
  64. package/dist/components/combobox.js +1 -1
  65. package/dist/components/command-palette.js +1 -1
  66. package/dist/components/date-range-picker.js +1 -1
  67. package/dist/components/dialog.js +1 -1
  68. package/dist/components/empty.js +1 -1
  69. package/dist/components/field.js +1 -1
  70. package/dist/components/input-group.js +1 -1
  71. package/dist/components/input.js +3 -3
  72. package/dist/components/label.js +1 -1
  73. package/dist/components/layer-card.js +1 -1
  74. package/dist/components/meter.js +1 -1
  75. package/dist/components/pagination.js +1 -1
  76. package/dist/components/select.js +1 -1
  77. package/dist/components/sensitive-input.js +1 -1
  78. package/dist/components/sidebar.js +1 -1
  79. package/dist/components/surface.js +1 -1
  80. package/dist/components/switch.js +1 -1
  81. package/dist/components/table.js +1 -1
  82. package/dist/components/tabs.js +1 -1
  83. package/dist/index.js +27 -27
  84. package/dist/scripts/theme-generator/config.js +11 -4
  85. package/dist/scripts/theme-generator/config.js.map +1 -1
  86. package/dist/src/components/code/code.d.ts +2 -2
  87. package/dist/src/components/collapsible/collapsible.d.ts +1 -1
  88. package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
  89. package/dist/src/components/toast/toast.d.ts +1 -1
  90. package/dist/src/components/toast/toast.d.ts.map +1 -1
  91. package/dist/styles/kumo-standalone.css +1 -1
  92. package/dist/styles/theme-kumo.css +8 -8
  93. package/package.json +1 -1
  94. package/scripts/component-registry/index.test.ts +42 -0
  95. package/scripts/component-registry/index.ts +18 -4
  96. package/scripts/component-registry/metadata.ts +222 -2
  97. package/scripts/theme-generator/config.ts +9 -9
  98. package/dist/chunks/input-lpa5fc75tgrraafv.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @cloudflare/kumo
2
2
 
3
+ ## 2.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - fbf3eef: Forward all Base UI Panel props (including `keepMounted` and `hiddenUntilFound`) through `Collapsible.DefaultPanel`. Previously these were silently dropped because `DefaultPanel` used a standalone props interface instead of extending `BasePanelProps`.
8
+ - 40491c2: Fix registry codegen to match demo examples when component export name differs from directory name (e.g. DropdownMenu vs dropdown). This restores missing examples for DropdownMenu and other affected components.
9
+ - 3427221: TooltipProvider props (`delay`, `closeDelay`, `timeout`) are now shown in the Tooltip component's API Reference on the docs site.
10
+
11
+ ## 2.0.1
12
+
13
+ ### Patch Changes
14
+
15
+ - e53bd68: Rebalanced semantic text token usage to improve hierarchy and consistency across components, docs, and generated Figma output.
16
+ - Updated theme token definitions so `text-kumo-strong` represents high-emphasis text and `text-kumo-inactive` is lighter/inactive in both light and dark modes.
17
+ - Migrated affected UI surfaces from `text-kumo-strong` to `text-kumo-subtle` where content is supportive metadata, labels, or secondary text.
18
+ - Synced token usage in docs and Figma code generators with the updated semantic text mapping.
19
+
3
20
  ## 2.0.0
4
21
 
5
22
  ### Major Changes
@@ -2123,7 +2123,7 @@
2123
2123
  "<div className=\"flex flex-wrap items-center gap-8\">\n <CloudflareLogo className=\"w-28\" color=\"color\" />\n <div className=\"rounded-lg bg-white p-4\">\n <CloudflareLogo className=\"w-28\" color=\"black\" />\n </div>\n <div className=\"rounded-lg bg-black p-4\">\n <CloudflareLogo className=\"w-28\" color=\"white\" />\n </div>\n </div>",
2124
2124
  "<div className=\"flex flex-wrap items-center gap-8\">\n <CloudflareLogo variant=\"glyph\" className=\"w-12\" color=\"color\" />\n <div className=\"rounded-lg bg-white p-4\">\n <CloudflareLogo variant=\"glyph\" className=\"w-12\" color=\"black\" />\n </div>\n <div className=\"rounded-lg bg-black p-4\">\n <CloudflareLogo variant=\"glyph\" className=\"w-12\" color=\"white\" />\n </div>\n </div>",
2125
2125
  "<div className=\"flex flex-wrap items-end gap-6\">\n <CloudflareLogo className=\"w-20\" />\n <CloudflareLogo className=\"w-28\" />\n <CloudflareLogo className=\"w-44\" />\n </div>",
2126
- "<div className=\"flex items-center gap-4\">\n <DropdownMenu>\n <DropdownMenu.Trigger>\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg bg-black px-4 py-3 text-white transition-opacity hover:opacity-80\"\n >\n <CloudflareLogo variant=\"glyph\" color=\"white\" className=\"w-8\" />\n <span className=\"font-medium\">Logo</span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content>\n <DropdownMenu.Item\n icon={CloudIcon}\n onSelect={() =>\n copyToClipboard(\n generateCloudflareLogoSvg({ variant: \"glyph\" }),\n \"glyph\",\n )\n }\n >\n {copied === \"glyph\" ? \"Copied!\" : \"Copy logo as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={CodeIcon}\n onSelect={() =>\n copyToClipboard(\n generateCloudflareLogoSvg({ variant: \"full\" }),\n \"full\",\n )\n }\n >\n {copied === \"full\" ? \"Copied!\" : \"Copy full logo as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={DownloadSimpleIcon}\n onSelect={() =>\n window.open(\n \"https://www.cloudflare.com/press-kit/\",\n \"_blank\",\n \"noopener\",\n )\n }\n >\n Download brand assets\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n icon={ArrowSquareOutIcon}\n onSelect={() =>\n window.open(\n \"https://www.cloudflare.com/brand-assets/\",\n \"_blank\",\n \"noopener\",\n )\n }\n >\n Visit brand guidelines\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n\n <span className=\"text-sm text-kumo-subtle\">\n Click to open the brand assets menu\n </span>\n </div>",
2126
+ "<div className=\"flex items-center gap-4\">\n <DropdownMenu>\n <DropdownMenu.Trigger>\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg bg-black px-4 py-3 text-white transition-opacity hover:opacity-80\"\n >\n <CloudflareLogo variant=\"glyph\" color=\"white\" className=\"w-8\" />\n <span className=\"font-medium\">Logo</span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content>\n <DropdownMenu.Item\n icon={CloudIcon}\n onClick={() =>\n copyToClipboard(\n generateCloudflareLogoSvg({ variant: \"glyph\" }),\n \"glyph\",\n )\n }\n >\n {copied === \"glyph\" ? \"Copied!\" : \"Copy logo as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={CodeIcon}\n onClick={() =>\n copyToClipboard(\n generateCloudflareLogoSvg({ variant: \"full\" }),\n \"full\",\n )\n }\n >\n {copied === \"full\" ? \"Copied!\" : \"Copy full logo as SVG\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={DownloadSimpleIcon}\n onClick={() =>\n window.open(\n \"https://www.cloudflare.com/press-kit/\",\n \"_blank\",\n \"noopener\",\n )\n }\n >\n Download brand assets\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n icon={ArrowSquareOutIcon}\n onClick={() =>\n window.open(\n \"https://www.cloudflare.com/brand-assets/\",\n \"_blank\",\n \"noopener\",\n )\n }\n >\n Visit brand guidelines\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n\n <span className=\"text-sm text-kumo-subtle\">\n Click to open the brand assets menu\n </span>\n </div>",
2127
2127
  "<PoweredByCloudflare />",
2128
2128
  "<div className=\"flex flex-wrap items-center gap-4\">\n <PoweredByCloudflare />\n <PoweredByCloudflare color=\"black\" />\n <div className=\"rounded-lg bg-black p-3\">\n <PoweredByCloudflare color=\"white\" />\n </div>\n </div>",
2129
2129
  "<footer className=\"flex w-full items-center justify-between rounded-lg border border-kumo-hairline bg-kumo-elevated px-6 py-4\">\n <span className=\"text-sm text-kumo-subtle\">\n &copy; 2026 Your Company. All rights reserved.\n </span>\n <PoweredByCloudflare />\n </footer>"
@@ -2181,7 +2181,7 @@
2181
2181
  "colors": [
2182
2182
  "bg-kumo-base",
2183
2183
  "border-kumo-fill",
2184
- "text-kumo-strong"
2184
+ "text-kumo-subtle"
2185
2185
  ],
2186
2186
  "subComponents": {
2187
2187
  "Block": {
@@ -2201,7 +2201,7 @@
2201
2201
  },
2202
2202
  "styling": {
2203
2203
  "baseTokens": [
2204
- "text-kumo-strong"
2204
+ "text-kumo-subtle"
2205
2205
  ],
2206
2206
  "typography": {
2207
2207
  "fontFamily": "font-mono",
@@ -2242,6 +2242,7 @@
2242
2242
  "<div className=\"w-full\">\n <Collapsible.Root open={isOpen} onOpenChange={setIsOpen}>\n <Collapsible.DefaultTrigger>What is Kumo?</Collapsible.DefaultTrigger>\n <Collapsible.DefaultPanel>\n <Text>Kumo is Cloudflare's new design system.</Text>\n </Collapsible.DefaultPanel>\n </Collapsible.Root>\n </div>",
2243
2243
  "<div className=\"w-full space-y-2\">\n <Collapsible.Root open={open1} onOpenChange={setOpen1}>\n <Collapsible.DefaultTrigger>What is Kumo?</Collapsible.DefaultTrigger>\n <Collapsible.DefaultPanel>\n <Text>Kumo is Cloudflare's new design system.</Text>\n </Collapsible.DefaultPanel>\n </Collapsible.Root>\n <Collapsible.Root open={open2} onOpenChange={setOpen2}>\n <Collapsible.DefaultTrigger>How do I use it?</Collapsible.DefaultTrigger>\n <Collapsible.DefaultPanel>\n <Text>Install the components and import them into your project.</Text>\n </Collapsible.DefaultPanel>\n </Collapsible.Root>\n <Collapsible.Root open={open3} onOpenChange={setOpen3}>\n <Collapsible.DefaultTrigger>Is it open source?</Collapsible.DefaultTrigger>\n <Collapsible.DefaultPanel>\n <Text>Check the repository for license information.</Text>\n </Collapsible.DefaultPanel>\n </Collapsible.Root>\n </div>",
2244
2244
  "<div className=\"w-full\">\n <Collapsible.Root open={isOpen} onOpenChange={setIsOpen}>\n <Collapsible.Trigger\n render={<Button variant=\"secondary\" size=\"sm\" />}\n >\n {isOpen ? \"Hide details\" : \"Show details\"}\n </Collapsible.Trigger>\n <Collapsible.Panel className=\"mt-3 rounded-lg bg-kumo-tint p-4\">\n <Text>\n This panel uses custom styling instead of the default border-left accent.\n </Text>\n </Collapsible.Panel>\n </Collapsible.Root>\n </div>",
2245
+ "<div className=\"w-full space-y-4\">\n <Collapsible.Root open={isOpen} onOpenChange={setIsOpen}>\n <Collapsible.DefaultTrigger>Edit details</Collapsible.DefaultTrigger>\n <Collapsible.DefaultPanel keepMounted>\n <Text>\n Type something below, then collapse and re-open — your input is\n preserved because the panel stays mounted.\n </Text>\n <Input label=\"Name\" placeholder=\"Type here…\" />\n </Collapsible.DefaultPanel>\n </Collapsible.Root>\n </div>",
2245
2246
  "<div className=\"w-full space-y-2\">\n {items.map((item, i) => (\n <Collapsible.Root\n key={i}\n open={activeIndex === i}\n onOpenChange={(open) => setActiveIndex(open ? i : null)}\n >\n <Collapsible.DefaultTrigger>{item.title}</Collapsible.DefaultTrigger>\n <Collapsible.DefaultPanel>\n <Text>{item.content}</Text>\n </Collapsible.DefaultPanel>\n </Collapsible.Root>\n ))}\n </div>"
2246
2247
  ],
2247
2248
  "colors": [
@@ -2421,7 +2422,6 @@
2421
2422
  "ring-kumo-hairline",
2422
2423
  "ring-kumo-line",
2423
2424
  "text-kumo-default",
2424
- "text-kumo-strong",
2425
2425
  "text-kumo-subtle"
2426
2426
  ],
2427
2427
  "subComponents": {
@@ -2561,7 +2561,6 @@
2561
2561
  "ring-kumo-brand",
2562
2562
  "ring-kumo-hairline",
2563
2563
  "text-kumo-default",
2564
- "text-kumo-strong",
2565
2564
  "text-kumo-subtle"
2566
2565
  ]
2567
2566
  },
@@ -2588,7 +2587,7 @@
2588
2587
  "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n min={3}\n max={7}\n footer={\n <span className=\"text-xs text-kumo-subtle\">Select 3-7 nights</span>\n }\n />\n </div>",
2589
2588
  "<Popover>\n <Popover.Trigger\n render={<Button variant=\"outline\" icon={CalendarDotsIcon} />}\n >\n {date ? date.toLocaleDateString() : \"Pick a date\"}\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker mode=\"single\" selected={date} onChange={setDate} />\n </Popover.Content>\n </Popover>",
2590
2589
  "<Popover>\n <Popover.Trigger\n render={<Button variant=\"outline\" icon={CalendarDotsIcon} />}\n >\n {formatRange()}\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n numberOfMonths={2}\n />\n </Popover.Content>\n </Popover>",
2591
- "<Popover>\n <Popover.Trigger\n render={<Button variant=\"outline\" icon={CalendarDotsIcon} />}\n >\n {formatRange()}\n </Popover.Trigger>\n <Popover.Content className=\"p-0\">\n <div className=\"flex\">\n <div className=\"flex flex-col gap-1 border-r border-kumo-hairline p-2 text-sm\">\n {presets.map((preset) => {\n const isActive = isPresetActive(preset);\n return (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handlePresetClick(preset)}\n className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${\n isActive\n ? \"bg-kumo-bg-inverse text-kumo-text-inverse\"\n : \"text-kumo-strong hover:bg-kumo-control\"\n }`}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n <div className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={2}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover>",
2590
+ "<Popover>\n <Popover.Trigger\n render={<Button variant=\"outline\" icon={CalendarDotsIcon} />}\n >\n {formatRange()}\n </Popover.Trigger>\n <Popover.Content className=\"p-0\">\n <div className=\"flex\">\n <div className=\"flex flex-col gap-1 border-r border-kumo-hairline p-2 text-sm\">\n {presets.map((preset) => {\n const isActive = isPresetActive(preset);\n return (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handlePresetClick(preset)}\n className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${\n isActive\n ? \"bg-kumo-bg-inverse text-kumo-text-inverse\"\n : \"text-kumo-subtle hover:bg-kumo-control\"\n }`}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n <div className=\"p-3\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={2}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover>",
2592
2591
  "<DatePicker\n mode=\"multiple\"\n selected={dates}\n onChange={setDates}\n max={maxDays}\n disabled={unavailableDates}\n fixedWeeks\n footer={\n <p className=\"text-xs text-kumo-subtle pt-2 w-full\">\n {selectedCount}/{maxDays} days selected. Grayed dates are unavailable.\n </p>\n }\n />"
2593
2592
  ],
2594
2593
  "colors": [
@@ -2670,7 +2669,6 @@
2670
2669
  "ring-kumo-focus",
2671
2670
  "text-kumo-default",
2672
2671
  "text-kumo-inverse",
2673
- "text-kumo-strong",
2674
2672
  "text-kumo-subtle"
2675
2673
  ],
2676
2674
  "styling": {
@@ -2903,7 +2901,15 @@
2903
2901
  "default": "default"
2904
2902
  }
2905
2903
  },
2906
- "examples": [],
2904
+ "examples": [
2905
+ "<DropdownMenu>\n <DropdownMenu.Trigger render={<Button icon={PlusIcon}>Add</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item>Worker</DropdownMenu.Item>\n <DropdownMenu.Item>Pages</DropdownMenu.Item>\n <DropdownMenu.Item>KV Namespace</DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>",
2906
+ "<DropdownMenu>\n <DropdownMenu.Trigger render={<Button>View Options</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Group>\n <DropdownMenu.Label>Display</DropdownMenu.Label>\n <DropdownMenu.CheckboxItem\n checked={showSidebar}\n onCheckedChange={setShowSidebar}\n >\n Show sidebar\n </DropdownMenu.CheckboxItem>\n <DropdownMenu.CheckboxItem\n checked={showLineNumbers}\n onCheckedChange={setShowLineNumbers}\n >\n Show line numbers\n </DropdownMenu.CheckboxItem>\n <DropdownMenu.CheckboxItem\n checked={wordWrap}\n onCheckedChange={setWordWrap}\n >\n Word wrap\n </DropdownMenu.CheckboxItem>\n </DropdownMenu.Group>\n </DropdownMenu.Content>\n </DropdownMenu>",
2907
+ "<DropdownMenu>\n <DropdownMenu.Trigger render={<Button icon={UserIcon}>Account</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={UserIcon}>Profile</DropdownMenu.Item>\n <DropdownMenu.Item icon={CreditCardIcon}>Billing</DropdownMenu.Item>\n <DropdownMenu.Item icon={MoonIcon}>Dark mode</DropdownMenu.Item>\n\n {/* Language submenu with RadioGroup */}\n <DropdownMenu.Sub>\n <DropdownMenu.SubTrigger>Language</DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent>\n <DropdownMenu.Group>\n <DropdownMenu.RadioGroup\n value={language}\n onValueChange={setLanguage}\n >\n {languages.map((lang) => (\n <DropdownMenu.RadioItem key={lang.code} value={lang.code}>\n {lang.label}\n <DropdownMenu.RadioItemIndicator />\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Group>\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n\n {/* Timezone submenu with RadioGroup */}\n <DropdownMenu.Sub>\n <DropdownMenu.SubTrigger>Set Timezone</DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent>\n <DropdownMenu.Group>\n <DropdownMenu.RadioGroup\n value={timezone}\n onValueChange={setTimezone}\n >\n {timezones.map((tz) => (\n <DropdownMenu.RadioItem key={tz.value} value={tz.value}>\n {tz.label}\n <DropdownMenu.RadioItemIndicator />\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Group>\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={SignOutIcon} variant=\"danger\">\n Log out\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>",
2908
+ "<DropdownMenu>\n <DropdownMenu.Trigger render={<Button>Edit</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={PencilSimpleIcon}>Rename</DropdownMenu.Item>\n <DropdownMenu.Item icon={CopyIcon}>Duplicate</DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item inset>Move to folder</DropdownMenu.Item>\n <DropdownMenu.Item inset>Add to favorites</DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={TrashIcon} variant=\"danger\">\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>",
2909
+ "<div className=\"flex flex-col items-start gap-2\">\n <DropdownMenu>\n <DropdownMenu.Trigger render={<Button>Actions</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item\n icon={CopyIcon}\n onClick={() => setLastAction(\"Duplicated\")}\n >\n Duplicate\n </DropdownMenu.Item>\n <DropdownMenu.Item\n icon={PencilSimpleIcon}\n onClick={() => setLastAction(\"Renamed\")}\n >\n Rename\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n icon={TrashIcon}\n variant=\"danger\"\n onClick={() => setLastAction(\"Deleted\")}\n >\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n {lastAction && (\n <p className=\"text-sm text-kumo-subtle\">\n Last action: <span className=\"text-kumo-default\">{lastAction}</span>\n </p>\n )}\n </div>",
2910
+ "<DropdownMenu>\n <DropdownMenu.Trigger\n render={<button type=\"button\" className=\"rounded-full\" />}\n >\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-kumo-brand text-sm font-medium text-white\">\n MR\n </span>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={UserIcon}>Profile</DropdownMenu.Item>\n <DropdownMenu.Item icon={GearIcon}>Settings</DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={SignOutIcon} variant=\"danger\">\n Log out\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>",
2911
+ "<DropdownMenu>\n <DropdownMenu.Trigger render={<Button>Resources</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.LinkItem href=\"/settings\" icon={GearIcon}>\n Settings\n </DropdownMenu.LinkItem>\n <DropdownMenu.LinkItem href=\"/docs\" icon={BookOpenIcon}>\n Documentation\n </DropdownMenu.LinkItem>\n <DropdownMenu.Separator />\n <DropdownMenu.LinkItem\n href=\"https://developers.cloudflare.com\"\n target=\"_blank\"\n icon={ArrowSquareOutIcon}\n >\n Developer Docs\n </DropdownMenu.LinkItem>\n </DropdownMenu.Content>\n </DropdownMenu>"
2912
+ ],
2907
2913
  "colors": [
2908
2914
  "bg-kumo-control",
2909
2915
  "bg-kumo-danger",
@@ -2939,7 +2945,16 @@
2939
2945
  "SubTrigger": {
2940
2946
  "name": "SubTrigger",
2941
2947
  "description": "SubTrigger sub-component",
2942
- "props": {}
2948
+ "props": {
2949
+ "icon": {
2950
+ "type": "Icon",
2951
+ "description": "Icon displayed before the label."
2952
+ },
2953
+ "inset": {
2954
+ "type": "boolean",
2955
+ "description": "Adds left padding to align with items that have icons."
2956
+ }
2957
+ }
2943
2958
  },
2944
2959
  "SubContent": {
2945
2960
  "name": "SubContent",
@@ -2949,34 +2964,164 @@
2949
2964
  "Content": {
2950
2965
  "name": "Content",
2951
2966
  "description": "Content sub-component",
2952
- "props": {}
2967
+ "props": {
2968
+ "sideOffset": {
2969
+ "type": "number",
2970
+ "description": "Distance in pixels from the trigger.",
2971
+ "default": "8"
2972
+ },
2973
+ "container": {
2974
+ "type": "PortalContainer",
2975
+ "description": "Container element for the portal. Use this to render inside a Shadow DOM or custom container."
2976
+ }
2977
+ }
2953
2978
  },
2954
2979
  "Item": {
2955
2980
  "name": "Item",
2956
2981
  "description": "Item sub-component",
2957
- "props": {}
2982
+ "props": {
2983
+ "icon": {
2984
+ "type": "Icon | ReactNode",
2985
+ "description": "Icon displayed before the label."
2986
+ },
2987
+ "variant": {
2988
+ "type": "\"default\" | \"danger\"",
2989
+ "description": "Visual style of the item.",
2990
+ "default": "\"default\""
2991
+ },
2992
+ "selected": {
2993
+ "type": "boolean",
2994
+ "description": "Shows a check mark indicator when true."
2995
+ },
2996
+ "inset": {
2997
+ "type": "boolean",
2998
+ "description": "Adds left padding to align with items that have icons."
2999
+ },
3000
+ "onClick": {
3001
+ "type": "(event: React.MouseEvent) => void",
3002
+ "description": "Callback when the item is clicked."
3003
+ },
3004
+ "closeOnClick": {
3005
+ "type": "boolean",
3006
+ "description": "Whether the menu closes after clicking this item.",
3007
+ "default": "true"
3008
+ },
3009
+ "disabled": {
3010
+ "type": "boolean",
3011
+ "description": "When true, the item cannot be interacted with."
3012
+ }
3013
+ }
2958
3014
  },
2959
3015
  "LinkItem": {
2960
3016
  "name": "LinkItem",
2961
3017
  "description": "LinkItem sub-component",
2962
- "props": {}
3018
+ "props": {
3019
+ "href": {
3020
+ "type": "string",
3021
+ "description": "URL to navigate to when clicked."
3022
+ },
3023
+ "icon": {
3024
+ "type": "Icon | ReactNode",
3025
+ "description": "Icon displayed before the label."
3026
+ },
3027
+ "variant": {
3028
+ "type": "\"default\" | \"danger\"",
3029
+ "description": "Visual style of the item.",
3030
+ "default": "\"default\""
3031
+ },
3032
+ "inset": {
3033
+ "type": "boolean",
3034
+ "description": "Adds left padding to align with items that have icons."
3035
+ },
3036
+ "target": {
3037
+ "type": "string",
3038
+ "description": "Link target attribute (e.g. \"_blank\" for new tab)."
3039
+ },
3040
+ "render": {
3041
+ "type": "ReactElement | ((props, state) => ReactElement)",
3042
+ "description": "Custom element to render as the link. Use to integrate with framework routers (e.g. Next.js Link)."
3043
+ }
3044
+ }
2963
3045
  },
2964
3046
  "CheckboxItem": {
2965
3047
  "name": "CheckboxItem",
2966
3048
  "description": "CheckboxItem sub-component",
2967
- "props": {}
3049
+ "props": {
3050
+ "checked": {
3051
+ "type": "boolean",
3052
+ "description": "Whether the item is checked."
3053
+ },
3054
+ "defaultChecked": {
3055
+ "type": "boolean",
3056
+ "description": "Whether the item is initially checked (uncontrolled).",
3057
+ "default": "false"
3058
+ },
3059
+ "onCheckedChange": {
3060
+ "type": "(checked: boolean, event: ChangeEventDetails) => void",
3061
+ "description": "Callback when the checked state changes."
3062
+ },
3063
+ "closeOnClick": {
3064
+ "type": "boolean",
3065
+ "description": "Whether the menu closes after clicking this item.",
3066
+ "default": "false"
3067
+ },
3068
+ "disabled": {
3069
+ "type": "boolean",
3070
+ "description": "When true, the item cannot be interacted with."
3071
+ }
3072
+ }
2968
3073
  },
2969
3074
  "RadioGroup": {
2970
3075
  "name": "RadioGroup",
2971
3076
  "description": "RadioGroup sub-component (wraps DropdownMenuPrimitive)",
2972
- "props": {},
3077
+ "props": {
3078
+ "value": {
3079
+ "type": "any",
3080
+ "description": "The controlled value of the currently selected radio item."
3081
+ },
3082
+ "defaultValue": {
3083
+ "type": "any",
3084
+ "description": "The initially selected value (uncontrolled)."
3085
+ },
3086
+ "onValueChange": {
3087
+ "type": "(value: any, event: ChangeEventDetails) => void",
3088
+ "description": "Callback when the selected value changes."
3089
+ },
3090
+ "disabled": {
3091
+ "type": "boolean",
3092
+ "description": "When true, all radio items in the group are disabled."
3093
+ }
3094
+ },
2973
3095
  "isPassThrough": true,
2974
3096
  "baseComponent": "DropdownMenuPrimitive.RadioGroup"
2975
3097
  },
2976
3098
  "RadioItem": {
2977
3099
  "name": "RadioItem",
2978
3100
  "description": "RadioItem sub-component",
2979
- "props": {}
3101
+ "props": {
3102
+ "value": {
3103
+ "type": "any",
3104
+ "required": true,
3105
+ "description": "The value of this radio item."
3106
+ },
3107
+ "icon": {
3108
+ "type": "Icon | ReactNode",
3109
+ "description": "Icon displayed before the label."
3110
+ },
3111
+ "inset": {
3112
+ "type": "boolean",
3113
+ "description": "Adds left padding to align with items that have icons."
3114
+ },
3115
+ "closeOnClick": {
3116
+ "type": "boolean",
3117
+ "description": "Whether the menu closes after clicking this item.",
3118
+ "default": "false"
3119
+ },
3120
+ "disabled": {
3121
+ "type": "boolean",
3122
+ "description": "When true, the item cannot be interacted with."
3123
+ }
3124
+ }
2980
3125
  },
2981
3126
  "RadioItemIndicator": {
2982
3127
  "name": "RadioItemIndicator",
@@ -2986,7 +3131,12 @@
2986
3131
  "Label": {
2987
3132
  "name": "Label",
2988
3133
  "description": "Label sub-component",
2989
- "props": {}
3134
+ "props": {
3135
+ "inset": {
3136
+ "type": "boolean",
3137
+ "description": "Adds left padding to align with items that have icons."
3138
+ }
3139
+ }
2990
3140
  },
2991
3141
  "Separator": {
2992
3142
  "name": "Separator",
@@ -3082,7 +3232,7 @@
3082
3232
  "text-kumo-brand",
3083
3233
  "text-kumo-default",
3084
3234
  "text-kumo-inactive",
3085
- "text-kumo-strong",
3235
+ "text-kumo-subtle",
3086
3236
  "text-kumo-success"
3087
3237
  ]
3088
3238
  },
@@ -3342,8 +3492,7 @@
3342
3492
  "ring-kumo-danger",
3343
3493
  "ring-kumo-focus",
3344
3494
  "ring-kumo-line",
3345
- "text-kumo-default",
3346
- "text-kumo-subtle"
3495
+ "text-kumo-default"
3347
3496
  ],
3348
3497
  "styling": {
3349
3498
  "dimensions": {
@@ -3610,7 +3759,7 @@
3610
3759
  ],
3611
3760
  "colors": [
3612
3761
  "text-kumo-default",
3613
- "text-kumo-strong"
3762
+ "text-kumo-subtle"
3614
3763
  ]
3615
3764
  },
3616
3765
  "LayerCard": {
@@ -3658,7 +3807,7 @@
3658
3807
  "ring-kumo-fill",
3659
3808
  "ring-kumo-hairline",
3660
3809
  "ring-kumo-line",
3661
- "text-kumo-strong"
3810
+ "text-kumo-subtle"
3662
3811
  ],
3663
3812
  "subComponents": {
3664
3813
  "Primary": {
@@ -3960,7 +4109,7 @@
3960
4109
  "colors": [
3961
4110
  "bg-kumo-fill",
3962
4111
  "text-kumo-default",
3963
- "text-kumo-strong"
4112
+ "text-kumo-subtle"
3964
4113
  ]
3965
4114
  },
3966
4115
  "Pagination": {
@@ -4040,7 +4189,7 @@
4040
4189
  "colors": [
4041
4190
  "border-kumo-hairline",
4042
4191
  "ring-kumo-hairline",
4043
- "text-kumo-strong"
4192
+ "text-kumo-subtle"
4044
4193
  ],
4045
4194
  "subComponents": {
4046
4195
  "Info": {
@@ -4836,7 +4985,6 @@
4836
4985
  "ring-kumo-brand",
4837
4986
  "ring-kumo-hairline",
4838
4987
  "text-kumo-default",
4839
- "text-kumo-strong",
4840
4988
  "text-kumo-subtle"
4841
4989
  ],
4842
4990
  "subComponents": {
@@ -5681,7 +5829,6 @@
5681
5829
  "ring-kumo-hairline",
5682
5830
  "ring-kumo-line",
5683
5831
  "text-kumo-default",
5684
- "text-kumo-strong",
5685
5832
  "text-kumo-subtle"
5686
5833
  ],
5687
5834
  "styling": {
@@ -5903,7 +6050,19 @@
5903
6050
  "description": "Child elements"
5904
6051
  }
5905
6052
  },
5906
- "examples": [],
6053
+ "examples": [
6054
+ "<Toasty>\n <ToastTriggerButton />\n </Toasty>",
6055
+ "<Toasty>\n <ToastTitleOnlyButton />\n </Toasty>",
6056
+ "<Toasty>\n <ToastDescriptionOnlyButton />\n </Toasty>",
6057
+ "<Toasty>\n <ToastSuccessButton />\n </Toasty>",
6058
+ "<Toasty>\n <ToastMultipleButton />\n </Toasty>",
6059
+ "<Toasty>\n <ToastErrorButton />\n </Toasty>",
6060
+ "<Toasty>\n <ToastWarningButton />\n </Toasty>",
6061
+ "<Toasty>\n <ToastInfoButton />\n </Toasty>",
6062
+ "<Toasty>\n <ToastCustomContentButton />\n </Toasty>",
6063
+ "<Toasty>\n <ToastActionsButton />\n </Toasty>",
6064
+ "<Toasty>\n <ToastPromiseButton />\n </Toasty>"
6065
+ ],
5907
6066
  "colors": [
5908
6067
  "bg-kumo-base",
5909
6068
  "bg-kumo-contrast",
@@ -5923,7 +6082,6 @@
5923
6082
  "text-kumo-danger",
5924
6083
  "text-kumo-default",
5925
6084
  "text-kumo-info",
5926
- "text-kumo-strong",
5927
6085
  "text-kumo-subtle",
5928
6086
  "text-kumo-success",
5929
6087
  "text-kumo-warning"
@@ -6010,7 +6168,35 @@
6010
6168
  "fill-kumo-tip-stroke",
6011
6169
  "outline-kumo-fill",
6012
6170
  "text-kumo-default"
6013
- ]
6171
+ ],
6172
+ "subComponents": {
6173
+ "Provider": {
6174
+ "name": "Provider",
6175
+ "description": "Groups multiple tooltips so that after the first tooltip is shown, switching to another skips the open delay. Place once at your app root or layout.",
6176
+ "props": {
6177
+ "delay": {
6178
+ "type": "number",
6179
+ "description": "How long to wait (ms) before opening a tooltip once the pointer enters the trigger.",
6180
+ "default": "600"
6181
+ },
6182
+ "closeDelay": {
6183
+ "type": "number",
6184
+ "description": "How long to wait (ms) before closing a tooltip.",
6185
+ "default": "0"
6186
+ },
6187
+ "timeout": {
6188
+ "type": "number",
6189
+ "description": "Grace period (ms) during which a just-closed tooltip's delay is skipped when another tooltip opens.",
6190
+ "default": "400"
6191
+ }
6192
+ },
6193
+ "isPassThrough": true,
6194
+ "baseComponent": "TooltipBase.Provider",
6195
+ "usageExamples": [
6196
+ "<TooltipProvider>\n <App />\n</TooltipProvider>"
6197
+ ]
6198
+ }
6199
+ }
6014
6200
  },
6015
6201
  "InputArea": {
6016
6202
  "name": "InputArea",
@@ -6244,10 +6430,14 @@
6244
6430
  "optional": true
6245
6431
  }
6246
6432
  },
6247
- "examples": [],
6433
+ "examples": [
6434
+ "<ResourceListPage\n title=\"Databases\"\n description=\"Manage your database instances and configurations\"\n icon={<DatabaseIcon size={32} className=\"text-kumo-subtle\" />}\n >\n <Surface className=\"p-6\">\n <p>Main content area - your resource list would go here</p>\n </Surface>\n </ResourceListPage>",
6435
+ "<ResourceListPage\n title=\"API Keys\"\n description=\"Create and manage API keys for your applications\"\n usage={\n <Surface className=\"p-4\">\n <h3 className=\"mb-2 font-semibold\">Quick Start</h3>\n <p className=\"mb-3 text-sm text-kumo-subtle\">\n Generate an API key to authenticate your requests\n </p>\n <Code\n lang=\"bash\"\n code='curl -H \"Authorization: Bearer YOUR_API_KEY\" https://api.example.com'\n />\n </Surface>\n }\n >\n <Surface className=\"p-6\">\n <p>API keys list would appear here</p>\n </Surface>\n </ResourceListPage>",
6436
+ "<ResourceListPage\n title=\"KV Namespaces\"\n description=\"Store key-value data globally with low-latency access\"\n icon={<DatabaseIcon size={32} className=\"text-kumo-subtle\" />}\n usage={\n <Surface className=\"p-4\">\n <h3 className=\"mb-2 font-semibold\">Usage Example</h3>\n <Code\n lang=\"ts\"\n code={`// Read from KV\nconst value = await KV.get('key');\n\n// Write to KV\nawait KV.put('key', 'value');`}\n />\n </Surface>\n }\n additionalContent={\n <Surface className=\"p-4\">\n <h3 className=\"mb-2 font-semibold\">Learn More</h3>\n <p className=\"text-sm text-kumo-subtle\">\n Check out our documentation to learn more about KV storage.\n </p>\n </Surface>\n }\n >\n <div className=\"space-y-4\">\n <Surface className=\"p-6\">\n <h4 className=\"mb-2 font-semibold\">production-kv</h4>\n <p className=\"text-sm text-kumo-subtle\">Created 2 days ago</p>\n </Surface>\n <Surface className=\"p-6\">\n <h4 className=\"mb-2 font-semibold\">staging-kv</h4>\n <p className=\"text-sm text-kumo-subtle\">Created 1 week ago</p>\n </Surface>\n </div>\n </ResourceListPage>"
6437
+ ],
6248
6438
  "colors": [
6249
6439
  "bg-kumo-overlay",
6250
- "text-kumo-strong"
6440
+ "text-kumo-subtle"
6251
6441
  ],
6252
6442
  "files": [
6253
6443
  "resource-list/resource-list.tsx",