@cloudflare/kumo 1.5.1 → 1.7.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.
Files changed (171) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/ai/component-registry.json +53 -10
  3. package/ai/component-registry.md +291 -90
  4. package/ai/schemas.ts +11 -2
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.d.ts +24 -5
  7. package/dist/ai/schemas.d.ts.map +1 -1
  8. package/dist/catalog.js +1 -1
  9. package/dist/{checkbox-CWANiedi.js → checkbox-Dt8iSNOg.js} +3 -3
  10. package/dist/{checkbox-CWANiedi.js.map → checkbox-Dt8iSNOg.js.map} +1 -1
  11. package/dist/clipboard-text-CeoyR28P.js +185 -0
  12. package/dist/clipboard-text-CeoyR28P.js.map +1 -0
  13. package/dist/{combobox-C9koouxM.js → combobox-BIC-YZ2L.js} +41 -41
  14. package/dist/combobox-BIC-YZ2L.js.map +1 -0
  15. package/dist/command-line/cli.js +88 -30
  16. package/dist/command-line/commands/add.js +88 -30
  17. package/dist/{command-palette-TGXgr6Vq.js → command-palette-D3MNR7w9.js} +31 -31
  18. package/dist/{command-palette-TGXgr6Vq.js.map → command-palette-D3MNR7w9.js.map} +1 -1
  19. package/dist/components/checkbox.js +1 -1
  20. package/dist/components/clipboard-text.js +1 -1
  21. package/dist/components/combobox.js +1 -1
  22. package/dist/components/command-palette.js +1 -1
  23. package/dist/components/date-picker.js +6 -0
  24. package/dist/components/date-picker.js.map +1 -0
  25. package/dist/components/dialog.js +1 -1
  26. package/dist/components/dropdown.js +1 -1
  27. package/dist/components/field.js +1 -1
  28. package/dist/components/flow.js +5640 -0
  29. package/dist/components/flow.js.map +1 -0
  30. package/dist/components/input.js +3 -3
  31. package/dist/components/label.js +1 -1
  32. package/dist/components/link.js +1 -1
  33. package/dist/components/menubar.js +1 -1
  34. package/dist/components/meter.js +1 -1
  35. package/dist/components/pagination.js +1 -1
  36. package/dist/components/popover.js +1 -1
  37. package/dist/components/radio.js +1 -1
  38. package/dist/components/select.js +1 -1
  39. package/dist/components/sensitive-input.js +1 -1
  40. package/dist/components/switch.js +1 -1
  41. package/dist/components/table.js +1 -1
  42. package/dist/components/tabs.js +1 -1
  43. package/dist/components/toast.js +2 -2
  44. package/dist/components/tooltip.js +1 -1
  45. package/dist/date-picker-M6uNX5Ca.js +2921 -0
  46. package/dist/date-picker-M6uNX5Ca.js.map +1 -0
  47. package/dist/date-range-picker-CbKEQ9pi.js.map +1 -1
  48. package/dist/{dialog-CpCeOqSZ.js → dialog-toS9krNF.js} +17 -17
  49. package/dist/dialog-toS9krNF.js.map +1 -0
  50. package/dist/{dropdown-DFeFcKfn.js → dropdown-BquiYKKC.js} +38 -38
  51. package/dist/dropdown-BquiYKKC.js.map +1 -0
  52. package/dist/{field-Dt-XuSaQ.js → field-DCq04TgZ.js} +3 -3
  53. package/dist/{field-Dt-XuSaQ.js.map → field-DCq04TgZ.js.map} +1 -1
  54. package/dist/index.js +53 -49
  55. package/dist/index.js.map +1 -1
  56. package/dist/{input-GZAWBXYX.js → input-CCR8NGG7.js} +3 -3
  57. package/dist/{input-GZAWBXYX.js.map → input-CCR8NGG7.js.map} +1 -1
  58. package/dist/{input-area-CS1-ceY4.js → input-area-DU2Yvp_t.js} +3 -3
  59. package/dist/{input-area-CS1-ceY4.js.map → input-area-DU2Yvp_t.js.map} +1 -1
  60. package/dist/{input-group-COo-wz5O.js → input-group-C365-qBq.js} +2 -2
  61. package/dist/{input-group-COo-wz5O.js.map → input-group-C365-qBq.js.map} +1 -1
  62. package/dist/{label-ChZ2Pp5p.js → label-zjtV7oXa.js} +2 -2
  63. package/dist/{label-ChZ2Pp5p.js.map → label-zjtV7oXa.js.map} +1 -1
  64. package/dist/{link-Mj2WM1AS.js → link-C8pUZ4Q-.js} +8 -8
  65. package/dist/{link-Mj2WM1AS.js.map → link-C8pUZ4Q-.js.map} +1 -1
  66. package/dist/{menubar-CbXWXQYR.js → menubar-D7WvAf6x.js} +6 -6
  67. package/dist/menubar-D7WvAf6x.js.map +1 -0
  68. package/dist/{meter-Bu5f3mAc.js → meter-jQGKS1z4.js} +4 -4
  69. package/dist/{meter-Bu5f3mAc.js.map → meter-jQGKS1z4.js.map} +1 -1
  70. package/dist/{pagination-Cf-yRO-n.js → pagination-BN80iKY6.js} +2 -2
  71. package/dist/{pagination-Cf-yRO-n.js.map → pagination-BN80iKY6.js.map} +1 -1
  72. package/dist/{popover-D7yeRosi.js → popover-syU1104E.js} +4 -4
  73. package/dist/{popover-D7yeRosi.js.map → popover-syU1104E.js.map} +1 -1
  74. package/dist/primitives/accordion.js +1 -1
  75. package/dist/primitives/alert-dialog.js +1 -1
  76. package/dist/primitives/autocomplete.js +1 -1
  77. package/dist/primitives/avatar.js +1 -1
  78. package/dist/primitives/button.js +1 -1
  79. package/dist/primitives/checkbox-group.js +1 -1
  80. package/dist/primitives/checkbox.js +1 -1
  81. package/dist/primitives/collapsible.js +1 -1
  82. package/dist/primitives/combobox.js +1 -1
  83. package/dist/primitives/context-menu.js +1 -1
  84. package/dist/primitives/dialog.js +1 -1
  85. package/dist/primitives/direction-provider.js +1 -1
  86. package/dist/primitives/field.js +1 -1
  87. package/dist/primitives/fieldset.js +1 -1
  88. package/dist/primitives/form.js +1 -1
  89. package/dist/primitives/input.js +1 -1
  90. package/dist/primitives/menu.js +1 -1
  91. package/dist/primitives/menubar.js +1 -1
  92. package/dist/primitives/meter.js +1 -1
  93. package/dist/primitives/navigation-menu.js +1 -1
  94. package/dist/primitives/number-field.js +1 -1
  95. package/dist/primitives/popover.js +1 -1
  96. package/dist/primitives/preview-card.js +1 -1
  97. package/dist/primitives/progress.js +1 -1
  98. package/dist/primitives/radio-group.js +1 -1
  99. package/dist/primitives/radio.js +1 -1
  100. package/dist/primitives/scroll-area.js +1 -1
  101. package/dist/primitives/select.js +1 -1
  102. package/dist/primitives/separator.js +1 -1
  103. package/dist/primitives/slider.js +1 -1
  104. package/dist/primitives/switch.js +1 -1
  105. package/dist/primitives/tabs.js +1 -1
  106. package/dist/primitives/toast.js +1 -1
  107. package/dist/primitives/toggle-group.js +1 -1
  108. package/dist/primitives/toggle.js +1 -1
  109. package/dist/primitives/toolbar.js +1 -1
  110. package/dist/primitives/tooltip.js +1 -1
  111. package/dist/primitives.js +1 -1
  112. package/dist/{radio-CKn09bGo.js → radio-CWMtSx65.js} +8 -8
  113. package/dist/{radio-CKn09bGo.js.map → radio-CWMtSx65.js.map} +1 -1
  114. package/dist/{schemas-H10xB2M_.js → schemas-DbIwo0ET.js} +251 -239
  115. package/dist/{schemas-H10xB2M_.js.map → schemas-DbIwo0ET.js.map} +1 -1
  116. package/dist/{select-DvpgiOau.js → select-G6JqBVkg.js} +37 -37
  117. package/dist/{select-DvpgiOau.js.map → select-G6JqBVkg.js.map} +1 -1
  118. package/dist/{sensitive-input-BuYT6U6C.js → sensitive-input-DNFpycoy.js} +4 -4
  119. package/dist/{sensitive-input-BuYT6U6C.js.map → sensitive-input-DNFpycoy.js.map} +1 -1
  120. package/dist/src/command-line/utils/transformer.d.ts +8 -4
  121. package/dist/src/command-line/utils/transformer.d.ts.map +1 -1
  122. package/dist/src/components/clipboard-text/clipboard-text.d.ts +23 -0
  123. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  124. package/dist/src/components/date-picker/date-picker.d.ts +65 -0
  125. package/dist/src/components/date-picker/date-picker.d.ts.map +1 -0
  126. package/dist/src/components/date-picker/index.d.ts +4 -0
  127. package/dist/src/components/date-picker/index.d.ts.map +1 -0
  128. package/dist/src/components/date-range-picker/date-range-picker.d.ts +7 -0
  129. package/dist/src/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  130. package/dist/src/components/date-range-picker/index.d.ts +3 -0
  131. package/dist/src/components/date-range-picker/index.d.ts.map +1 -1
  132. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  133. package/dist/src/components/flow/connectors.d.ts +35 -0
  134. package/dist/src/components/flow/connectors.d.ts.map +1 -0
  135. package/dist/src/components/flow/diagram.d.ts +62 -0
  136. package/dist/src/components/flow/diagram.d.ts.map +1 -0
  137. package/dist/src/components/flow/index.d.ts +26 -0
  138. package/dist/src/components/flow/index.d.ts.map +1 -0
  139. package/dist/src/components/flow/node.d.ts +52 -0
  140. package/dist/src/components/flow/node.d.ts.map +1 -0
  141. package/dist/src/components/flow/parallel.d.ts +5 -0
  142. package/dist/src/components/flow/parallel.d.ts.map +1 -0
  143. package/dist/src/components/flow/use-children.d.ts +69 -0
  144. package/dist/src/components/flow/use-children.d.ts.map +1 -0
  145. package/dist/src/index.d.ts +5 -0
  146. package/dist/src/index.d.ts.map +1 -1
  147. package/dist/styles/kumo-binding.css +0 -4
  148. package/dist/styles/kumo-standalone.css +1 -1
  149. package/dist/styles/kumo.css +541 -0
  150. package/dist/styles/theme-kumo.css +1 -1
  151. package/dist/{switch-Tu34uFoa.js → switch-CmsZ4z-g.js} +9 -9
  152. package/dist/{switch-Tu34uFoa.js.map → switch-CmsZ4z-g.js.map} +1 -1
  153. package/dist/{table-DtUrZ2Rj.js → table-Dc0AGcLV.js} +2 -2
  154. package/dist/{table-DtUrZ2Rj.js.map → table-Dc0AGcLV.js.map} +1 -1
  155. package/dist/{tabs-B7THfqHW.js → tabs-BpD1iUiz.js} +2 -2
  156. package/dist/{tabs-B7THfqHW.js.map → tabs-BpD1iUiz.js.map} +1 -1
  157. package/dist/{toast-Du4y8qng.js → toast-BrR0pjLE.js} +8 -8
  158. package/dist/{toast-Du4y8qng.js.map → toast-BrR0pjLE.js.map} +1 -1
  159. package/dist/{tooltip-BxV1H6AV.js → tooltip-daVJYtXY.js} +2 -2
  160. package/dist/{tooltip-BxV1H6AV.js.map → tooltip-daVJYtXY.js.map} +1 -1
  161. package/dist/{vendor-base-ui-CQ6wEonS.js → vendor-base-ui-9w7J6BvW.js} +7246 -7245
  162. package/dist/{vendor-base-ui-CQ6wEonS.js.map → vendor-base-ui-9w7J6BvW.js.map} +1 -1
  163. package/package.json +12 -1
  164. package/scripts/component-registry/discovery.ts +1 -7
  165. package/scripts/theme-generator/config.ts +1 -1
  166. package/dist/clipboard-text-B32_yb2r.js +0 -108
  167. package/dist/clipboard-text-B32_yb2r.js.map +0 -1
  168. package/dist/combobox-C9koouxM.js.map +0 -1
  169. package/dist/dialog-CpCeOqSZ.js.map +0 -1
  170. package/dist/dropdown-DFeFcKfn.js.map +0 -1
  171. package/dist/menubar-CbXWXQYR.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,118 @@
1
1
  # @cloudflare/kumo
2
2
 
3
+ ## 1.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d9b6498: feat(flow): add FlowDiagram components for building directed flow diagrams
8
+
9
+ New components for visualizing workflows and data flows:
10
+ - `FlowDiagram` - Root container with pan/scroll support for large diagrams
11
+ - `FlowNode` - Individual node with automatic connector points
12
+ - `FlowNode.Anchor` - Custom attachment points for connectors within nodes
13
+ - `FlowParallelNode` - Container for parallel branches with junction connectors
14
+
15
+ Adds `motion` as a new dependency for smooth panning interactions.
16
+
17
+ ### Patch Changes
18
+
19
+ - 835a7c0: Deprecate DateRangePicker in favor of DatePicker with `mode="range"`
20
+ - Added `@deprecated` JSDoc comments to DateRangePicker component and its exports
21
+ - IDEs will now show deprecation warnings guiding users to use DatePicker instead
22
+
23
+ - 391f13a: Prevented ClipboardText from overflowing with long text values.
24
+ - d0e1d29: chore(kumo): add test scripts to root package.json
25
+
26
+ ## 1.6.0
27
+
28
+ ### Minor Changes
29
+
30
+ - 50d4251: Add DatePicker component built on react-day-picker v9
31
+
32
+ **New Component: DatePicker**
33
+ - Three selection modes: `single`, `multiple`, and `range`
34
+ - Forwards all react-day-picker props for maximum flexibility
35
+ - Styled with Kumo tokens (no external CSS import needed)
36
+ - Supports localization via date-fns locales
37
+ - Supports timezone via `timeZone` prop
38
+ - Custom modifiers for highlighting specific dates
39
+ - Footer prop for messages/usage limits
40
+ - Accessible keyboard navigation with Kumo-styled focus rings
41
+
42
+ **Usage:**
43
+
44
+ ```tsx
45
+ // Single date
46
+ <DatePicker mode="single" selected={date} onSelect={setDate} />
47
+
48
+ // Multiple dates
49
+ <DatePicker mode="multiple" selected={dates} onSelect={setDates} max={5} />
50
+
51
+ // Date range
52
+ <DatePicker mode="range" selected={range} onSelect={setRange} numberOfMonths={2} />
53
+ ```
54
+
55
+ **Composing with Popover:**
56
+
57
+ ```tsx
58
+ <Popover>
59
+ <Popover.Trigger asChild>
60
+ <Button variant="outline" icon={CalendarDotsIcon}>
61
+ Pick a date
62
+ </Button>
63
+ </Popover.Trigger>
64
+ <Popover.Content className="p-3">
65
+ <DatePicker mode="single" selected={date} onSelect={setDate} />
66
+ </Popover.Content>
67
+ </Popover>
68
+ ```
69
+
70
+ **Note:** Consider using `DatePicker` with `mode="range"` instead of `DateRangePicker` for new projects - it offers more flexibility and a smaller bundle size.
71
+
72
+ **Internal changes:**
73
+ - Added `react-day-picker` v9 as a dependency
74
+ - Updated lint rule to allow components without KUMO\_\*\_VARIANTS exports
75
+ - Updated component registry codegen to handle variant-less components
76
+ - Disabled `jsx-a11y/no-autofocus` rule (intentional prop forwarding)
77
+
78
+ - 93361ed: feat(clipboard-text): add slide animation with tooltip on copy
79
+
80
+ ### Patch Changes
81
+
82
+ - c71bd9b: Updated the MenuBar so its child buttons align with the container’s outer corners.
83
+ - 46ecf42: Fix `kumo add` to consolidate imports from `@cloudflare/kumo` into a single statement using inline `type` syntax.
84
+
85
+ Previously, running `kumo add DeleteResource` would produce non-conformant code with duplicate imports:
86
+
87
+ ```typescript
88
+ import { Dialog, DialogRoot } from "@cloudflare/kumo";
89
+ import { Input } from "@cloudflare/kumo";
90
+ import { Button } from "@cloudflare/kumo";
91
+ ```
92
+
93
+ Now it produces a single consolidated import:
94
+
95
+ ```typescript
96
+ import {
97
+ Dialog,
98
+ DialogRoot,
99
+ Input,
100
+ Button,
101
+ type DialogProps,
102
+ } from "@cloudflare/kumo";
103
+ ```
104
+
105
+ This satisfies ESLint's `import/no-duplicates` rule with `prefer-inline: true`.
106
+
107
+ - a9167fa: Fix z-index stacking issues with nested portaled components (e.g., Select inside Dialog)
108
+ - Remove unnecessary z-index values from Dialog, Select, Combobox, and Dropdown
109
+ - Delete `.z-modal { z-index: 9999 }` - DOM order now handles stacking naturally
110
+ - Components opened later correctly appear on top without z-index wars
111
+
112
+ - f02494d: fix(dropdown): improve external link detection to handle http:// and protocol-relative urls
113
+
114
+ updated the external link check to use a regex that matches `https://`, `http://`, and protocol-relative URLs (`//`). previously only `https://` links opened in a new tab.
115
+
3
116
  ## 1.5.1
4
117
 
5
118
  ### Patch Changes
@@ -647,17 +647,30 @@
647
647
  "type": "string",
648
648
  "optional": true,
649
649
  "description": "Additional CSS classes merged via `cn()`."
650
+ },
651
+ "tooltip": {
652
+ "type": "object",
653
+ "optional": true,
654
+ "description": "Tooltip config. Shows tooltip on hover, anchored toast on click."
655
+ },
656
+ "labels": {
657
+ "type": "object",
658
+ "optional": true,
659
+ "description": "Accessible labels for i18n."
650
660
  }
651
661
  },
652
662
  "examples": [
653
663
  "<ClipboardText text=\"0c239dd2\" />",
654
664
  "<ClipboardText text=\"abc123\" />",
655
665
  "<ClipboardText text=\"sk_live_51H8...\" />",
656
- "<ClipboardText text=\"https://example.com/very/long/url/path\" />"
666
+ "<ClipboardText text=\"https://example.com/very/long/url/path\" />",
667
+ "<ClipboardText\n text=\"npx kumo add button\"\n tooltip={{ text: \"Copy\", copiedText: \"Copied!\", side: \"top\" }}\n />"
657
668
  ],
658
669
  "colors": [
659
670
  "bg-kumo-base",
660
- "border-kumo-line"
671
+ "border-kumo-line",
672
+ "outline-kumo-fill",
673
+ "text-kumo-default"
661
674
  ],
662
675
  "styling": {
663
676
  "baseTokens": [
@@ -2236,6 +2249,36 @@
2236
2249
  "text-kumo-subtle"
2237
2250
  ]
2238
2251
  },
2252
+ "DatePicker": {
2253
+ "name": "DatePicker",
2254
+ "type": "component",
2255
+ "description": "DatePicker — a date selection calendar. Built on [react-day-picker](https://daypicker.dev) with Kumo styling. Supports three selection modes: single, multiple, and range.",
2256
+ "importPath": "@cloudflare/kumo",
2257
+ "category": "Other",
2258
+ "props": {
2259
+ "className": {
2260
+ "type": "string",
2261
+ "description": "Additional CSS classes"
2262
+ },
2263
+ "children": {
2264
+ "type": "ReactNode",
2265
+ "description": "Child elements"
2266
+ }
2267
+ },
2268
+ "examples": [
2269
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker mode=\"single\" selected={date} onChange={d => {\n if (d) {\n setDate(d);\n }\n }} />\n <p className=\"text-sm text-kumo-subtle\">\n Selected: {date ? date.toLocaleDateString() : \"None\"}\n </p>\n </div>",
2270
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"multiple\"\n selected={dates}\n onChange={setDates}\n max={5}\n />\n <p className=\"text-sm text-kumo-subtle\">\n Selected: {dates?.length ?? 0} date(s)\n </p>\n </div>",
2271
+ "<div className=\"flex flex-col gap-4\">\n <DatePicker\n mode=\"range\"\n selected={range}\n onChange={setRange}\n numberOfMonths={2}\n />\n <p className=\"text-sm text-kumo-subtle\">\n Range:{\" \"}\n {range?.from\n ? `${range.from.toLocaleDateString()} - ${range.to?.toLocaleDateString() ?? \"...\"}`\n : \"None\"}\n </p>\n </div>",
2272
+ "<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>",
2273
+ "<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {date ? date.toLocaleDateString() : \"Pick a date\"}\n </Button>\n </Popover.Trigger>\n <Popover.Content className=\"p-3\">\n <DatePicker mode=\"single\" selected={date} onChange={setDate} />\n </Popover.Content>\n </Popover>",
2274
+ "<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {formatRange()}\n </Button>\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>",
2275
+ "<Popover>\n <Popover.Trigger asChild>\n <Button variant=\"outline\" icon={CalendarDotsIcon}>\n {formatRange()}\n </Button>\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-line 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 ${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>",
2276
+ "<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 />"
2277
+ ],
2278
+ "colors": [
2279
+ "bg-kumo-base"
2280
+ ]
2281
+ },
2239
2282
  "DateRangePicker": {
2240
2283
  "name": "DateRangePicker",
2241
2284
  "type": "component",
@@ -2301,13 +2344,7 @@
2301
2344
  "description": "Callback when end date changes"
2302
2345
  }
2303
2346
  },
2304
- "examples": [
2305
- "<div className=\"flex flex-col gap-4\">\n <DateRangePicker\n onStartDateChange={setStartDate}\n onEndDateChange={setEndDate}\n />\n <div className=\"text-sm text-kumo-subtle\">\n {startDate && endDate ? (\n <span>\n Selected: {startDate.toLocaleDateString()} -{\" \"}\n {endDate.toLocaleDateString()}\n </span>\n ) : startDate ? (\n <span>Start: {startDate.toLocaleDateString()} (select end date)</span>\n ) : (\n <span>Select a date range</span>\n )}\n </div>\n </div>",
2306
- "<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sm font-medium text-kumo-default\">Small</p>\n <DateRangePicker\n size=\"sm\"\n onStartDateChange={() => {}}\n onEndDateChange={() => {}}\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm font-medium text-kumo-default\">\n Base (default)\n </p>\n <DateRangePicker\n size=\"base\"\n onStartDateChange={() => {}}\n onEndDateChange={() => {}}\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm font-medium text-kumo-default\">Large</p>\n <DateRangePicker\n size=\"lg\"\n onStartDateChange={() => {}}\n onEndDateChange={() => {}}\n />\n </div>\n </div>",
2307
- "<div className=\"flex flex-col gap-8\">\n <div>\n <p className=\"mb-2 text-sm font-medium text-kumo-default\">\n Default variant\n </p>\n <DateRangePicker\n variant=\"default\"\n onStartDateChange={() => {}}\n onEndDateChange={() => {}}\n />\n </div>\n <div>\n <p className=\"mb-2 text-sm font-medium text-kumo-default\">\n Subtle variant\n </p>\n <DateRangePicker\n variant=\"subtle\"\n onStartDateChange={() => {}}\n onEndDateChange={() => {}}\n />\n </div>\n </div>",
2308
- "<DateRangePicker\n timezone=\"London, UK (GMT+0)\"\n onStartDateChange={() => {}}\n onEndDateChange={() => {}}\n />",
2309
- "<div className=\"flex flex-col gap-4\">\n <DateRangePicker\n onStartDateChange={setStartDate}\n onEndDateChange={setEndDate}\n />\n <div className=\"rounded-lg bg-kumo-control p-3 text-sm text-kumo-default\">\n <strong>Selection:</strong> {formatDateRange()}\n </div>\n </div>"
2310
- ],
2347
+ "examples": [],
2311
2348
  "colors": [
2312
2349
  "bg-kumo-base",
2313
2350
  "bg-kumo-contrast",
@@ -2408,7 +2445,10 @@
2408
2445
  "examples": [
2409
2446
  "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Click me</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Modal Title\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<X />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"text-kumo-subtle\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua.\n </Dialog.Description>\n </Dialog>\n </Dialog.Root>",
2410
2447
  "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Modal Title\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<X />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"text-kumo-subtle\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>",
2411
- "<Dialog.Root disablePointerDismissal>\n <Dialog.Trigger\n render={(p) => (\n <Button {...p} variant=\"destructive\">\n Delete Project\n </Button>\n )}\n />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-kumo-danger/20\">\n <Warning size={20} className=\"text-kumo-danger\" />\n </div>\n <Dialog.Title className=\"text-xl font-semibold\">\n Delete Project?\n </Dialog.Title>\n </div>\n <Dialog.Description className=\"text-kumo-subtle\">\n This action cannot be undone. This will permanently delete the project\n and all associated data.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>"
2448
+ "<Dialog.Root disablePointerDismissal>\n <Dialog.Trigger\n render={(p) => (\n <Button {...p} variant=\"destructive\">\n Delete Project\n </Button>\n )}\n />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-kumo-danger/20\">\n <Warning size={20} className=\"text-kumo-danger\" />\n </div>\n <Dialog.Title className=\"text-xl font-semibold\">\n Delete Project?\n </Dialog.Title>\n </div>\n <Dialog.Description className=\"text-kumo-subtle\">\n This action cannot be undone. This will permanently delete the project\n and all associated data.\n </Dialog.Description>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Dialog.Close\n render={(props) => (\n <Button variant=\"destructive\" {...props}>\n Delete\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>",
2449
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Create Resource\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<X />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-kumo-subtle\">\n Select a region for your new resource.\n </Dialog.Description>\n <Select\n className=\"w-full\"\n renderValue={(v) =>\n regions.find((r) => r.value === v)?.label ?? \"Select region...\"\n }\n >\n {regions.map((region) => (\n <Select.Option key={region.value} value={region.value}>\n {region.label}\n </Select.Option>\n ))}\n </Select>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Button variant=\"primary\">Create</Button>\n </div>\n </Dialog>\n </Dialog.Root>",
2450
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Create Resource\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<X />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-kumo-subtle\">\n Search and select a region for your new resource.\n </Dialog.Description>\n <Combobox value={value} onValueChange={setValue} items={regions}>\n <Combobox.TriggerInput\n className=\"w-full\"\n placeholder=\"Search regions...\"\n />\n <Combobox.Content>\n <Combobox.Empty>No regions found</Combobox.Empty>\n <Combobox.List>\n {(item: { value: string; label: string }) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <div className=\"mt-8 flex justify-end gap-2\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Cancel\n </Button>\n )}\n />\n <Button variant=\"primary\">Create</Button>\n </div>\n </Dialog>\n </Dialog.Root>",
2451
+ "<Dialog.Root>\n <Dialog.Trigger render={(p) => <Button {...p}>Open Form</Button>} />\n <Dialog className=\"p-8\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <Dialog.Title className=\"text-2xl font-semibold\">\n Resource Actions\n </Dialog.Title>\n <Dialog.Close\n aria-label=\"Close\"\n render={(props) => (\n <Button\n {...props}\n variant=\"secondary\"\n shape=\"square\"\n icon={<X />}\n aria-label=\"Close\"\n />\n )}\n />\n </div>\n <Dialog.Description className=\"mb-4 text-kumo-subtle\">\n Choose an action for the selected resource.\n </Dialog.Description>\n <DropdownMenu>\n <DropdownMenu.Trigger render={<Button>Actions</Button>} />\n <DropdownMenu.Content>\n <DropdownMenu.Item>Edit</DropdownMenu.Item>\n <DropdownMenu.Item>Duplicate</DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item variant=\"danger\">Delete</DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n <div className=\"mt-8 flex justify-end\">\n <Dialog.Close\n render={(props) => (\n <Button variant=\"secondary\" {...props}>\n Close\n </Button>\n )}\n />\n </div>\n </Dialog>\n </Dialog.Root>"
2412
2452
  ],
2413
2453
  "colors": [
2414
2454
  "bg-kumo-base",
@@ -4859,6 +4899,7 @@
4859
4899
  ],
4860
4900
  "Other": [
4861
4901
  "CloudflareLogo",
4902
+ "DatePicker",
4862
4903
  "Label",
4863
4904
  "Link",
4864
4905
  "SensitiveInput",
@@ -4896,6 +4937,7 @@
4896
4937
  "Collapsible",
4897
4938
  "Combobox",
4898
4939
  "CommandPalette",
4940
+ "DatePicker",
4899
4941
  "DateRangePicker",
4900
4942
  "DeleteResource",
4901
4943
  "Dialog",
@@ -4938,6 +4980,7 @@
4938
4980
  "Collapsible",
4939
4981
  "Combobox",
4940
4982
  "CommandPalette",
4983
+ "DatePicker",
4941
4984
  "DateRangePicker",
4942
4985
  "Dialog",
4943
4986
  "DropdownMenu",