@cloudflare/kumo 1.5.0 → 1.6.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 (166) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/ai/component-registry.json +62 -7
  3. package/ai/component-registry.md +378 -37
  4. package/ai/schemas.ts +12 -2
  5. package/bin/kumo.js +23 -19
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +2166 -0
  8. package/dist/ai/schemas.d.ts.map +1 -0
  9. package/dist/catalog.js +1 -1
  10. package/dist/{checkbox-CWANiedi.js → checkbox-Dt8iSNOg.js} +3 -3
  11. package/dist/{checkbox-CWANiedi.js.map → checkbox-Dt8iSNOg.js.map} +1 -1
  12. package/dist/clipboard-text-Bw5rKPXz.js +185 -0
  13. package/dist/clipboard-text-Bw5rKPXz.js.map +1 -0
  14. package/dist/{combobox-C9koouxM.js → combobox-BIC-YZ2L.js} +41 -41
  15. package/dist/combobox-BIC-YZ2L.js.map +1 -0
  16. package/dist/command-line/cli.js +104 -47
  17. package/dist/command-line/commands/add.js +88 -30
  18. package/dist/command-line/commands/ai.js +2 -3
  19. package/dist/{command-palette-TGXgr6Vq.js → command-palette-D3MNR7w9.js} +31 -31
  20. package/dist/{command-palette-TGXgr6Vq.js.map → command-palette-D3MNR7w9.js.map} +1 -1
  21. package/dist/components/checkbox.js +1 -1
  22. package/dist/components/clipboard-text.js +1 -1
  23. package/dist/components/combobox.js +1 -1
  24. package/dist/components/command-palette.js +1 -1
  25. package/dist/components/date-picker.js +6 -0
  26. package/dist/components/date-picker.js.map +1 -0
  27. package/dist/components/dialog.js +1 -1
  28. package/dist/components/dropdown.js +1 -1
  29. package/dist/components/field.js +1 -1
  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/{dialog-CpCeOqSZ.js → dialog-toS9krNF.js} +17 -17
  48. package/dist/dialog-toS9krNF.js.map +1 -0
  49. package/dist/{dropdown-DFeFcKfn.js → dropdown-BquiYKKC.js} +38 -38
  50. package/dist/dropdown-BquiYKKC.js.map +1 -0
  51. package/dist/{field-Dt-XuSaQ.js → field-DCq04TgZ.js} +3 -3
  52. package/dist/{field-Dt-XuSaQ.js.map → field-DCq04TgZ.js.map} +1 -1
  53. package/dist/index.js +86 -73
  54. package/dist/index.js.map +1 -1
  55. package/dist/{input-GZAWBXYX.js → input-CCR8NGG7.js} +3 -3
  56. package/dist/{input-GZAWBXYX.js.map → input-CCR8NGG7.js.map} +1 -1
  57. package/dist/{input-area-CS1-ceY4.js → input-area-DU2Yvp_t.js} +3 -3
  58. package/dist/{input-area-CS1-ceY4.js.map → input-area-DU2Yvp_t.js.map} +1 -1
  59. package/dist/{input-group-COo-wz5O.js → input-group-C365-qBq.js} +2 -2
  60. package/dist/{input-group-COo-wz5O.js.map → input-group-C365-qBq.js.map} +1 -1
  61. package/dist/{label-ChZ2Pp5p.js → label-zjtV7oXa.js} +2 -2
  62. package/dist/{label-ChZ2Pp5p.js.map → label-zjtV7oXa.js.map} +1 -1
  63. package/dist/{link-Mj2WM1AS.js → link-C8pUZ4Q-.js} +8 -8
  64. package/dist/{link-Mj2WM1AS.js.map → link-C8pUZ4Q-.js.map} +1 -1
  65. package/dist/{menubar-CbXWXQYR.js → menubar-D7WvAf6x.js} +6 -6
  66. package/dist/menubar-D7WvAf6x.js.map +1 -0
  67. package/dist/{meter-Bu5f3mAc.js → meter-jQGKS1z4.js} +4 -4
  68. package/dist/{meter-Bu5f3mAc.js.map → meter-jQGKS1z4.js.map} +1 -1
  69. package/dist/{pagination-Bm8eMWpj.js → pagination-BN80iKY6.js} +21 -20
  70. package/dist/pagination-BN80iKY6.js.map +1 -0
  71. package/dist/{popover-D7yeRosi.js → popover-syU1104E.js} +4 -4
  72. package/dist/{popover-D7yeRosi.js.map → popover-syU1104E.js.map} +1 -1
  73. package/dist/primitives/accordion.js +1 -1
  74. package/dist/primitives/alert-dialog.js +1 -1
  75. package/dist/primitives/autocomplete.js +1 -1
  76. package/dist/primitives/avatar.js +1 -1
  77. package/dist/primitives/button.js +1 -1
  78. package/dist/primitives/checkbox-group.js +1 -1
  79. package/dist/primitives/checkbox.js +1 -1
  80. package/dist/primitives/collapsible.js +1 -1
  81. package/dist/primitives/combobox.js +1 -1
  82. package/dist/primitives/context-menu.js +1 -1
  83. package/dist/primitives/dialog.js +1 -1
  84. package/dist/primitives/direction-provider.js +1 -1
  85. package/dist/primitives/field.js +1 -1
  86. package/dist/primitives/fieldset.js +1 -1
  87. package/dist/primitives/form.js +1 -1
  88. package/dist/primitives/input.js +1 -1
  89. package/dist/primitives/menu.js +1 -1
  90. package/dist/primitives/menubar.js +1 -1
  91. package/dist/primitives/meter.js +1 -1
  92. package/dist/primitives/navigation-menu.js +1 -1
  93. package/dist/primitives/number-field.js +1 -1
  94. package/dist/primitives/popover.js +1 -1
  95. package/dist/primitives/preview-card.js +1 -1
  96. package/dist/primitives/progress.js +1 -1
  97. package/dist/primitives/radio-group.js +1 -1
  98. package/dist/primitives/radio.js +1 -1
  99. package/dist/primitives/scroll-area.js +1 -1
  100. package/dist/primitives/select.js +1 -1
  101. package/dist/primitives/separator.js +1 -1
  102. package/dist/primitives/slider.js +1 -1
  103. package/dist/primitives/switch.js +1 -1
  104. package/dist/primitives/tabs.js +1 -1
  105. package/dist/primitives/toast.js +1 -1
  106. package/dist/primitives/toggle-group.js +1 -1
  107. package/dist/primitives/toggle.js +1 -1
  108. package/dist/primitives/toolbar.js +1 -1
  109. package/dist/primitives/tooltip.js +1 -1
  110. package/dist/primitives.js +1 -1
  111. package/dist/{radio-CKn09bGo.js → radio-CWMtSx65.js} +8 -8
  112. package/dist/{radio-CKn09bGo.js.map → radio-CWMtSx65.js.map} +1 -1
  113. package/dist/{schemas-B-D2OT-O.js → schemas-DbIwo0ET.js} +254 -240
  114. package/dist/{schemas-B-D2OT-O.js.map → schemas-DbIwo0ET.js.map} +1 -1
  115. package/dist/{select-DvpgiOau.js → select-G6JqBVkg.js} +37 -37
  116. package/dist/{select-DvpgiOau.js.map → select-G6JqBVkg.js.map} +1 -1
  117. package/dist/{sensitive-input-BuYT6U6C.js → sensitive-input-DNFpycoy.js} +4 -4
  118. package/dist/{sensitive-input-BuYT6U6C.js.map → sensitive-input-DNFpycoy.js.map} +1 -1
  119. package/dist/src/blocks/delete-resource/delete-resource.d.ts.map +1 -1
  120. package/dist/src/blocks/delete-resource/delete-resource.tsx +213 -0
  121. package/dist/src/blocks/page-header/page-header.tsx +99 -0
  122. package/dist/src/blocks/resource-list/resource-list.test.tsx +28 -0
  123. package/dist/src/blocks/resource-list/resource-list.tsx +69 -0
  124. package/dist/src/command-line/commands/ai.d.ts.map +1 -1
  125. package/dist/src/command-line/utils/transformer.d.ts +8 -4
  126. package/dist/src/command-line/utils/transformer.d.ts.map +1 -1
  127. package/dist/src/components/clipboard-text/clipboard-text.d.ts +23 -0
  128. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  129. package/dist/src/components/date-picker/date-picker.d.ts +65 -0
  130. package/dist/src/components/date-picker/date-picker.d.ts.map +1 -0
  131. package/dist/src/components/date-picker/index.d.ts +4 -0
  132. package/dist/src/components/date-picker/index.d.ts.map +1 -0
  133. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  134. package/dist/src/components/pagination/pagination.d.ts +8 -1
  135. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  136. package/dist/src/components/table/table.d.ts +2 -0
  137. package/dist/src/components/table/table.d.ts.map +1 -1
  138. package/dist/src/index.d.ts +1 -0
  139. package/dist/src/index.d.ts.map +1 -1
  140. package/dist/styles/kumo-binding.css +0 -4
  141. package/dist/styles/kumo-standalone.css +1 -1
  142. package/dist/styles/kumo.css +541 -0
  143. package/dist/{switch-Tu34uFoa.js → switch-CmsZ4z-g.js} +9 -9
  144. package/dist/{switch-Tu34uFoa.js.map → switch-CmsZ4z-g.js.map} +1 -1
  145. package/dist/table-Dc0AGcLV.js +149 -0
  146. package/dist/table-Dc0AGcLV.js.map +1 -0
  147. package/dist/{tabs-B7THfqHW.js → tabs-BpD1iUiz.js} +2 -2
  148. package/dist/{tabs-B7THfqHW.js.map → tabs-BpD1iUiz.js.map} +1 -1
  149. package/dist/{toast-Du4y8qng.js → toast-BrR0pjLE.js} +8 -8
  150. package/dist/{toast-Du4y8qng.js.map → toast-BrR0pjLE.js.map} +1 -1
  151. package/dist/{tooltip-BxV1H6AV.js → tooltip-daVJYtXY.js} +2 -2
  152. package/dist/{tooltip-BxV1H6AV.js.map → tooltip-daVJYtXY.js.map} +1 -1
  153. package/dist/{vendor-base-ui-CQ6wEonS.js → vendor-base-ui-9w7J6BvW.js} +7246 -7245
  154. package/dist/{vendor-base-ui-CQ6wEonS.js.map → vendor-base-ui-9w7J6BvW.js.map} +1 -1
  155. package/package.json +6 -1
  156. package/scripts/component-registry/discovery.ts +1 -7
  157. package/scripts/css-build.ts +47 -1
  158. package/dist/clipboard-text-CqueQiB8.js +0 -108
  159. package/dist/clipboard-text-CqueQiB8.js.map +0 -1
  160. package/dist/combobox-C9koouxM.js.map +0 -1
  161. package/dist/dialog-CpCeOqSZ.js.map +0 -1
  162. package/dist/dropdown-DFeFcKfn.js.map +0 -1
  163. package/dist/menubar-CbXWXQYR.js.map +0 -1
  164. package/dist/pagination-Bm8eMWpj.js.map +0 -1
  165. package/dist/table-BUmvaBj8.js +0 -153
  166. package/dist/table-BUmvaBj8.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,113 @@
1
1
  # @cloudflare/kumo
2
2
 
3
+ ## 1.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 50d4251: Add DatePicker component built on react-day-picker v9
8
+
9
+ **New Component: DatePicker**
10
+ - Three selection modes: `single`, `multiple`, and `range`
11
+ - Forwards all react-day-picker props for maximum flexibility
12
+ - Styled with Kumo tokens (no external CSS import needed)
13
+ - Supports localization via date-fns locales
14
+ - Supports timezone via `timeZone` prop
15
+ - Custom modifiers for highlighting specific dates
16
+ - Footer prop for messages/usage limits
17
+ - Accessible keyboard navigation with Kumo-styled focus rings
18
+
19
+ **Usage:**
20
+
21
+ ```tsx
22
+ // Single date
23
+ <DatePicker mode="single" selected={date} onSelect={setDate} />
24
+
25
+ // Multiple dates
26
+ <DatePicker mode="multiple" selected={dates} onSelect={setDates} max={5} />
27
+
28
+ // Date range
29
+ <DatePicker mode="range" selected={range} onSelect={setRange} numberOfMonths={2} />
30
+ ```
31
+
32
+ **Composing with Popover:**
33
+
34
+ ```tsx
35
+ <Popover>
36
+ <Popover.Trigger asChild>
37
+ <Button variant="outline" icon={CalendarDotsIcon}>
38
+ Pick a date
39
+ </Button>
40
+ </Popover.Trigger>
41
+ <Popover.Content className="p-3">
42
+ <DatePicker mode="single" selected={date} onSelect={setDate} />
43
+ </Popover.Content>
44
+ </Popover>
45
+ ```
46
+
47
+ **Note:** Consider using `DatePicker` with `mode="range"` instead of `DateRangePicker` for new projects - it offers more flexibility and a smaller bundle size.
48
+
49
+ **Internal changes:**
50
+ - Added `react-day-picker` v9 as a dependency
51
+ - Updated lint rule to allow components without KUMO\_\*\_VARIANTS exports
52
+ - Updated component registry codegen to handle variant-less components
53
+ - Disabled `jsx-a11y/no-autofocus` rule (intentional prop forwarding)
54
+
55
+ - 93361ed: feat(clipboard-text): add slide animation with tooltip on copy
56
+
57
+ ### Patch Changes
58
+
59
+ - c71bd9b: Updated the MenuBar so its child buttons align with the container’s outer corners.
60
+ - 46ecf42: Fix `kumo add` to consolidate imports from `@cloudflare/kumo` into a single statement using inline `type` syntax.
61
+
62
+ Previously, running `kumo add DeleteResource` would produce non-conformant code with duplicate imports:
63
+
64
+ ```typescript
65
+ import { Dialog, DialogRoot } from "@cloudflare/kumo";
66
+ import { Input } from "@cloudflare/kumo";
67
+ import { Button } from "@cloudflare/kumo";
68
+ ```
69
+
70
+ Now it produces a single consolidated import:
71
+
72
+ ```typescript
73
+ import {
74
+ Dialog,
75
+ DialogRoot,
76
+ Input,
77
+ Button,
78
+ type DialogProps,
79
+ } from "@cloudflare/kumo";
80
+ ```
81
+
82
+ This satisfies ESLint's `import/no-duplicates` rule with `prefer-inline: true`.
83
+
84
+ - a9167fa: Fix z-index stacking issues with nested portaled components (e.g., Select inside Dialog)
85
+ - Remove unnecessary z-index values from Dialog, Select, Combobox, and Dropdown
86
+ - Delete `.z-modal { z-index: 9999 }` - DOM order now handles stacking naturally
87
+ - Components opened later correctly appear on top without z-index wars
88
+
89
+ - f02494d: fix(dropdown): improve external link detection to handle http:// and protocol-relative urls
90
+
91
+ 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.
92
+
93
+ ## 1.5.1
94
+
95
+ ### Patch Changes
96
+
97
+ - 2c8a5ad: Changed ClipboardIcon to CopyIcon in ClipboardText component
98
+ - 31cc2e1: Fix AI command USAGE.md path resolution to work correctly from bundled dist output
99
+ - 1ae7dfd: fix(cli): include block source files in build for `kumo add` command
100
+
101
+ The `kumo add` command was failing because block source files (`.tsx`) were not being copied to `dist/` during the build process. This adds copying of block source files from `src/blocks/` to `dist/src/blocks/` so the CLI can install them into user projects.
102
+
103
+ - fa3eba3: fix(Table): Add indeterminate prop and fix checkbox click handling
104
+ - Added `indeterminate` prop to `Table.CheckHead` and `Table.CheckCell` components to support indeterminate checkbox state (shows minus icon when some but not all rows are selected)
105
+ - Fixed checkbox click handling - clicking directly on the checkbox now works correctly (previously only clicking the cell area next to the checkbox worked)
106
+ - Updated Table demos (`TableSelectedRowDemo` and `TableFullDemo`) with proper React state management for interactive row selection
107
+
108
+ - 3bc976e: fix: delete-resource shouldn't nest buttons within each other
109
+ - 752fdf1: support overwriting text in pagination component
110
+
3
111
  ## 1.5.0
4
112
 
5
113
  ### Minor 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",
@@ -2408,7 +2451,10 @@
2408
2451
  "examples": [
2409
2452
  "<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
2453
  "<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>"
2454
+ "<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>",
2455
+ "<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>",
2456
+ "<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>",
2457
+ "<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
2458
  ],
2413
2459
  "colors": [
2414
2460
  "bg-kumo-base",
@@ -3446,6 +3492,11 @@
3446
3492
  "type": "number",
3447
3493
  "optional": true,
3448
3494
  "description": "Total number of items across all pages."
3495
+ },
3496
+ "text": {
3497
+ "type": "object",
3498
+ "optional": true,
3499
+ "description": "Method to provide custom pagination text"
3449
3500
  }
3450
3501
  },
3451
3502
  "examples": [
@@ -3453,7 +3504,8 @@
3453
3504
  "<Pagination\n page={page}\n setPage={setPage}\n perPage={10}\n totalCount={100}\n controls=\"simple\"\n />",
3454
3505
  "<Pagination\n page={page}\n setPage={setPage}\n perPage={10}\n totalCount={100}\n controls=\"full\"\n />",
3455
3506
  "<Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />",
3456
- "<Pagination page={page} setPage={setPage} perPage={25} totalCount={1250} />"
3507
+ "<Pagination page={page} setPage={setPage} perPage={25} totalCount={1250} />",
3508
+ "<Pagination\n text={({ perPage }) => `Page ${page} - showing ${perPage} per page`}\n page={page}\n setPage={setPage}\n perPage={25}\n totalCount={100}\n />"
3457
3509
  ],
3458
3510
  "colors": [
3459
3511
  "text-kumo-strong"
@@ -4154,10 +4206,10 @@
4154
4206
  },
4155
4207
  "examples": [
4156
4208
  "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.slice(0, 3).map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4157
- "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead aria-label=\"Select all rows\" />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.slice(0, 3).map((row) => (\n <Table.Row key={row.id}>\n <Table.CheckCell aria-label={`Select ${row.subject}`} />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4158
- "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead aria-label=\"Select all rows\" />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n <Table.Row>\n <Table.CheckCell aria-label=\"Select row 1\" />\n <Table.Cell>Kumo v1.0.0 released</Table.Cell>\n <Table.Cell>Visal In</Table.Cell>\n <Table.Cell>5 seconds ago</Table.Cell>\n </Table.Row>\n <Table.Row variant=\"selected\">\n <Table.CheckCell checked aria-label=\"Select row 2\" />\n <Table.Cell>New Job Offer</Table.Cell>\n <Table.Cell>Cloudflare</Table.Cell>\n <Table.Cell>10 minutes ago</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.CheckCell aria-label=\"Select row 3\" />\n <Table.Cell>Daily Email Digest</Table.Cell>\n <Table.Cell>Cloudflare</Table.Cell>\n <Table.Cell>1 hour ago</Table.Cell>\n </Table.Row>\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4209
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row key={row.id}>\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4210
+ "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4159
4211
  "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />\n <col className=\"w-[150px]\" />\n <col className=\"w-[150px]\" />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4160
- "<LayerCard>\n <LayerCard.Primary className=\"w-full overflow-x-auto p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col style={{ width: \"40px\" }} />\n <col />\n <col style={{ width: \"150px\" }} />\n <col style={{ width: \"120px\" }} />\n <col style={{ width: \"50px\" }} />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead aria-label=\"Select all rows\" />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n <Table.Head></Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row, index) => (\n <Table.Row\n key={row.id}\n variant={index === 1 ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={index === 1}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>\n <div className=\"flex items-center gap-2\">\n <EnvelopeSimple size={16} />\n <span className=\"truncate\">{row.subject}</span>\n {row.tags && (\n <div className=\"ml-2 inline-flex gap-1\">\n {row.tags.map((tag) => (\n <Badge key={tag}>{tag}</Badge>\n ))}\n </div>\n )}\n </div>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.from}</span>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.date}</span>\n </Table.Cell>\n <Table.Cell className=\"text-right\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"More options\"\n >\n <DotsThree weight=\"bold\" size={16} />\n </Button>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>"
4212
+ "<LayerCard>\n <LayerCard.Primary className=\"w-full overflow-x-auto p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />{\" \"}\n {/* Checkbox column - width handled by Table.CheckHead/CheckCell */}\n <col />\n <col style={{ width: \"150px\" }} />\n <col style={{ width: \"120px\" }} />\n <col style={{ width: \"50px\" }} />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === emailData.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < emailData.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n <Table.Head></Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>\n <div className=\"flex items-center gap-2\">\n <EnvelopeSimple size={16} />\n <span className=\"truncate\">{row.subject}</span>\n {row.tags && (\n <div className=\"ml-2 inline-flex gap-1\">\n {row.tags.map((tag) => (\n <Badge key={tag}>{tag}</Badge>\n ))}\n </div>\n )}\n </div>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.from}</span>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.date}</span>\n </Table.Cell>\n <Table.Cell className=\"text-right\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"More options\"\n >\n <DotsThree weight=\"bold\" size={16} />\n </Button>\n }\n />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>\n <DropdownMenu.Item icon={PencilSimple}>\n Edit\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={Trash} variant=\"danger\">\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>"
4161
4213
  ],
4162
4214
  "colors": [
4163
4215
  "bg-kumo-base",
@@ -4853,6 +4905,7 @@
4853
4905
  ],
4854
4906
  "Other": [
4855
4907
  "CloudflareLogo",
4908
+ "DatePicker",
4856
4909
  "Label",
4857
4910
  "Link",
4858
4911
  "SensitiveInput",
@@ -4890,6 +4943,7 @@
4890
4943
  "Collapsible",
4891
4944
  "Combobox",
4892
4945
  "CommandPalette",
4946
+ "DatePicker",
4893
4947
  "DateRangePicker",
4894
4948
  "DeleteResource",
4895
4949
  "Dialog",
@@ -4932,6 +4986,7 @@
4932
4986
  "Collapsible",
4933
4987
  "Combobox",
4934
4988
  "CommandPalette",
4989
+ "DatePicker",
4935
4990
  "DateRangePicker",
4936
4991
  "Dialog",
4937
4992
  "DropdownMenu",