@cloudflare/kumo 1.5.0 → 1.5.1

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 (41) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/ai/component-registry.json +10 -4
  3. package/ai/component-registry.md +87 -35
  4. package/ai/schemas.ts +1 -0
  5. package/bin/kumo.js +23 -19
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +2147 -0
  8. package/dist/ai/schemas.d.ts.map +1 -0
  9. package/dist/catalog.js +1 -1
  10. package/dist/{clipboard-text-CqueQiB8.js → clipboard-text-B32_yb2r.js} +9 -9
  11. package/dist/clipboard-text-B32_yb2r.js.map +1 -0
  12. package/dist/command-line/cli.js +16 -17
  13. package/dist/command-line/commands/ai.js +2 -3
  14. package/dist/components/clipboard-text.js +1 -1
  15. package/dist/components/pagination.js +1 -1
  16. package/dist/components/table.js +1 -1
  17. package/dist/index.js +40 -29
  18. package/dist/index.js.map +1 -1
  19. package/dist/{pagination-Bm8eMWpj.js → pagination-Cf-yRO-n.js} +20 -19
  20. package/dist/pagination-Cf-yRO-n.js.map +1 -0
  21. package/dist/{schemas-B-D2OT-O.js → schemas-H10xB2M_.js} +4 -2
  22. package/dist/{schemas-B-D2OT-O.js.map → schemas-H10xB2M_.js.map} +1 -1
  23. package/dist/src/blocks/delete-resource/delete-resource.d.ts.map +1 -1
  24. package/dist/src/blocks/delete-resource/delete-resource.tsx +213 -0
  25. package/dist/src/blocks/page-header/page-header.tsx +99 -0
  26. package/dist/src/blocks/resource-list/resource-list.test.tsx +28 -0
  27. package/dist/src/blocks/resource-list/resource-list.tsx +69 -0
  28. package/dist/src/command-line/commands/ai.d.ts.map +1 -1
  29. package/dist/src/components/pagination/pagination.d.ts +8 -1
  30. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  31. package/dist/src/components/table/table.d.ts +2 -0
  32. package/dist/src/components/table/table.d.ts.map +1 -1
  33. package/dist/styles/kumo-standalone.css +1 -1
  34. package/dist/table-DtUrZ2Rj.js +149 -0
  35. package/dist/table-DtUrZ2Rj.js.map +1 -0
  36. package/package.json +1 -1
  37. package/scripts/css-build.ts +47 -1
  38. package/dist/clipboard-text-CqueQiB8.js.map +0 -1
  39. package/dist/pagination-Bm8eMWpj.js.map +0 -1
  40. package/dist/table-BUmvaBj8.js +0 -153
  41. package/dist/table-BUmvaBj8.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../ai/schemas.ts"],"names":[],"mappings":"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"}
package/dist/catalog.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  let c = null, h = null;
3
3
  async function y() {
4
- return c || h || (h = import("./schemas-B-D2OT-O.js").then((t) => (c = t, c)), h);
4
+ return c || h || (h = import("./schemas-H10xB2M_.js").then((t) => (c = t, c)), h);
5
5
  }
6
6
  function l() {
7
7
  if (!c)
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs as g, jsx as i } from "react/jsx-runtime";
3
- import { CheckIcon as C, ClipboardIcon as y } from "@phosphor-icons/react";
3
+ import { CheckIcon as y, CopyIcon as C } from "@phosphor-icons/react";
4
4
  import { forwardRef as T, useState as z, useCallback as v, useEffect as h } from "react";
5
5
  import { B as A } from "./button-Bh96oxRL.js";
6
6
  import { i as S } from "./input-GZAWBXYX.js";
@@ -41,12 +41,12 @@ const I = T(
41
41
  text: t,
42
42
  className: u,
43
43
  size: n = m.size,
44
- onCopy: r
44
+ onCopy: s
45
45
  }, f) => {
46
- const [o, s] = z(!1), c = p.size[n], b = v(async () => {
46
+ const [o, r] = z(!1), c = p.size[n], b = v(async () => {
47
47
  try {
48
48
  if (typeof navigator < "u" && navigator.clipboard && typeof navigator.clipboard.writeText == "function") {
49
- await navigator.clipboard.writeText(t), s(!0), r?.();
49
+ await navigator.clipboard.writeText(t), r(!0), s?.();
50
50
  return;
51
51
  }
52
52
  } catch {
@@ -57,18 +57,18 @@ const I = T(
57
57
  const a = document.getSelection(), l = a?.rangeCount ? a.getRangeAt(0) : null;
58
58
  e.select();
59
59
  try {
60
- document.execCommand("copy"), s(!0), r?.();
60
+ document.execCommand("copy"), r(!0), s?.();
61
61
  } catch (x) {
62
62
  console.warn("Clipboard copy failed", x);
63
63
  } finally {
64
64
  document.body.removeChild(e), l && (a?.removeAllRanges(), a?.addRange(l));
65
65
  }
66
66
  }
67
- }, [t, r]);
67
+ }, [t, s]);
68
68
  return h(() => {
69
69
  if (o) {
70
70
  const e = setTimeout(() => {
71
- s(!1);
71
+ r(!1);
72
72
  }, 2e3);
73
73
  return () => clearTimeout(e);
74
74
  }
@@ -92,7 +92,7 @@ const I = T(
92
92
  onClick: b,
93
93
  "aria-label": o ? "Copied" : "Copy to clipboard",
94
94
  "aria-pressed": o,
95
- children: o ? /* @__PURE__ */ i(C, {}) : /* @__PURE__ */ i(y, {})
95
+ children: o ? /* @__PURE__ */ i(y, {}) : /* @__PURE__ */ i(C, {})
96
96
  }
97
97
  ),
98
98
  /* @__PURE__ */ i("span", { className: "sr-only", "aria-live": "polite", children: o ? "Copied to clipboard" : "" })
@@ -105,4 +105,4 @@ I.displayName = "ClipboardText";
105
105
  export {
106
106
  I as C
107
107
  };
108
- //# sourceMappingURL=clipboard-text-CqueQiB8.js.map
108
+ //# sourceMappingURL=clipboard-text-B32_yb2r.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard-text-B32_yb2r.js","sources":["../src/components/clipboard-text/clipboard-text.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../button\";\nimport { inputVariants } from \"../input\";\nimport { cn } from \"../../utils/cn\";\n\n/** ClipboardText size variant definitions mapping sizes to their Tailwind classes. */\nexport const KUMO_CLIPBOARD_TEXT_VARIANTS = {\n size: {\n sm: {\n classes: \"text-xs\",\n buttonSize: \"sm\" as const,\n description: \"Small clipboard text for compact UIs\",\n },\n base: {\n classes: \"text-sm\",\n buttonSize: \"base\" as const,\n description: \"Default clipboard text size\",\n },\n lg: {\n classes: \"text-sm\",\n buttonSize: \"lg\" as const,\n description: \"Large clipboard text for prominent display\",\n },\n },\n} as const;\n\nexport const KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS = {\n size: \"lg\",\n} as const;\n\n// Derived types from KUMO_CLIPBOARD_TEXT_VARIANTS\nexport type KumoClipboardTextSize =\n keyof typeof KUMO_CLIPBOARD_TEXT_VARIANTS.size;\n\nexport interface KumoClipboardTextVariantsProps {\n /**\n * Size of the clipboard text field.\n * - `\"sm\"` — Small clipboard text for compact UIs\n * - `\"base\"` — Default clipboard text size\n * - `\"lg\"` — Large clipboard text for prominent display\n * @default \"lg\"\n */\n size?: KumoClipboardTextSize;\n}\n\nexport function clipboardTextVariants({\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n}: KumoClipboardTextVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex items-center overflow-hidden bg-kumo-base px-0 font-mono\",\n // Apply size styles from KUMO_CLIPBOARD_TEXT_VARIANTS\n KUMO_CLIPBOARD_TEXT_VARIANTS.size[size].classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type ClipboardTextSize = KumoClipboardTextSize;\n\n/**\n * ClipboardText component props.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"sk_live_abc123\" />\n * <ClipboardText text=\"npm install @cloudflare/kumo\" size=\"sm\" />\n * ```\n */\nexport interface ClipboardTextProps extends KumoClipboardTextVariantsProps {\n /** The text to display and copy to clipboard. */\n text: string;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Callback fired after text is copied to clipboard. */\n onCopy?: () => void;\n}\n\n/**\n * Read-only text field with a one-click copy-to-clipboard button.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"0c239dd2\" />\n * ```\n */\nexport const ClipboardText = forwardRef<HTMLDivElement, ClipboardTextProps>(\n (\n {\n text,\n className,\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n onCopy,\n },\n ref,\n ) => {\n const [copied, setCopied] = useState(false);\n const sizeConfig = KUMO_CLIPBOARD_TEXT_VARIANTS.size[size];\n\n const copyToClipboard = useCallback(async () => {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n onCopy?.();\n return;\n }\n } catch {\n // Fall through to manual fallback\n }\n\n if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"absolute\";\n textarea.style.left = \"-9999px\";\n document.body.appendChild(textarea);\n const selection = document.getSelection();\n const previousRange = selection?.rangeCount\n ? selection.getRangeAt(0)\n : null;\n textarea.select();\n try {\n document.execCommand(\"copy\");\n setCopied(true);\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n }, [text, onCopy]);\n\n useEffect(() => {\n if (copied) {\n const timeoutId = setTimeout(() => {\n setCopied(false);\n }, 2000);\n\n return () => clearTimeout(timeoutId);\n }\n }, [copied]);\n\n return (\n <div\n ref={ref}\n className={cn(\n inputVariants({ size: sizeConfig.buttonSize }),\n clipboardTextVariants({ size }),\n className,\n )}\n >\n <span className=\"grow px-4\">{text}</span>\n <Button\n size={sizeConfig.buttonSize}\n variant=\"ghost\"\n className=\"rounded-none border-l! border-kumo-line! px-3\"\n onClick={copyToClipboard}\n aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n aria-pressed={copied}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n <span className=\"sr-only\" aria-live=\"polite\">\n {copied ? \"Copied to clipboard\" : \"\"}\n </span>\n </div>\n );\n },\n);\n\nClipboardText.displayName = \"ClipboardText\";\n"],"names":["KUMO_CLIPBOARD_TEXT_VARIANTS","KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS","clipboardTextVariants","size","cn","ClipboardText","forwardRef","text","className","onCopy","ref","copied","setCopied","useState","sizeConfig","copyToClipboard","useCallback","textarea","selection","previousRange","error","useEffect","timeoutId","jsxs","inputVariants","jsx","Button","CheckIcon","CopyIcon"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { readFileSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  function getRegistryPath() {
8
- const __dirname2 = dirname(fileURLToPath(import.meta.url));
9
- return join(__dirname2, "..", "..", "ai", "component-registry.json");
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ return join(__dirname, "..", "..", "ai", "component-registry.json");
10
10
  }
11
11
  function loadRegistry() {
12
12
  const registryPath = getRegistryPath();
@@ -54,8 +54,8 @@ import { readFileSync as readFileSync2 } from "node:fs";
54
54
  import { dirname as dirname2, join as join2 } from "node:path";
55
55
  import { fileURLToPath as fileURLToPath2 } from "node:url";
56
56
  function getRegistryPath2() {
57
- const __dirname2 = dirname2(fileURLToPath2(import.meta.url));
58
- return join2(__dirname2, "..", "..", "ai", "component-registry.json");
57
+ const __dirname = dirname2(fileURLToPath2(import.meta.url));
58
+ return join2(__dirname, "..", "..", "ai", "component-registry.json");
59
59
  }
60
60
  function loadRegistry2() {
61
61
  const registryPath = getRegistryPath2();
@@ -324,8 +324,8 @@ import { readFileSync as readFileSync4 } from "node:fs";
324
324
  import { dirname as dirname3, join as join4 } from "node:path";
325
325
  import { fileURLToPath as fileURLToPath3 } from "node:url";
326
326
  function getRegistryPath3() {
327
- const __dirname2 = dirname3(fileURLToPath3(import.meta.url));
328
- return join4(__dirname2, "..", "..", "ai", "component-registry.json");
327
+ const __dirname = dirname3(fileURLToPath3(import.meta.url));
328
+ return join4(__dirname, "..", "..", "ai", "component-registry.json");
329
329
  }
330
330
  function loadRegistry3() {
331
331
  const registryPath = getRegistryPath3();
@@ -421,11 +421,11 @@ ${typeImport}`;
421
421
  // src/command-line/commands/add.ts
422
422
  import { createInterface as createInterface2 } from "node:readline/promises";
423
423
  function getRegistryPath4() {
424
- const __dirname2 = dirname4(fileURLToPath4(import.meta.url));
424
+ const __dirname = dirname4(fileURLToPath4(import.meta.url));
425
425
  const possiblePaths = [
426
- join5(__dirname2, "..", "..", "ai", "component-registry.json"),
427
- join5(__dirname2, "..", "ai", "component-registry.json"),
428
- join5(__dirname2, "ai", "component-registry.json")
426
+ join5(__dirname, "..", "..", "ai", "component-registry.json"),
427
+ join5(__dirname, "..", "ai", "component-registry.json"),
428
+ join5(__dirname, "ai", "component-registry.json")
429
429
  ];
430
430
  for (const path of possiblePaths) {
431
431
  if (existsSync2(path)) {
@@ -437,11 +437,11 @@ function getRegistryPath4() {
437
437
  );
438
438
  }
439
439
  function getBlocksSourcePath() {
440
- const __dirname2 = dirname4(fileURLToPath4(import.meta.url));
440
+ const __dirname = dirname4(fileURLToPath4(import.meta.url));
441
441
  const possiblePaths = [
442
- join5(__dirname2, "..", "..", "src", "blocks"),
443
- join5(__dirname2, "..", "src", "blocks"),
444
- join5(__dirname2, "src", "blocks")
442
+ join5(__dirname, "..", "..", "src", "blocks"),
443
+ join5(__dirname, "..", "src", "blocks"),
444
+ join5(__dirname, "src", "blocks")
445
445
  ];
446
446
  for (const path of possiblePaths) {
447
447
  if (existsSync2(path)) {
@@ -696,10 +696,9 @@ function migrate(args) {
696
696
  import { readFileSync as readFileSync6 } from "node:fs";
697
697
  import { dirname as dirname5, join as join6 } from "node:path";
698
698
  import { fileURLToPath as fileURLToPath5 } from "node:url";
699
- var __dirname = dirname5(fileURLToPath5(import.meta.url));
700
699
  function ai() {
701
- const packageRoot = join6(__dirname, "../../..");
702
- const usagePath = join6(packageRoot, "ai", "USAGE.md");
700
+ const __dirname = dirname5(fileURLToPath5(import.meta.url));
701
+ const usagePath = join6(__dirname, "..", "..", "ai", "USAGE.md");
703
702
  try {
704
703
  const content = readFileSync6(usagePath, "utf-8");
705
704
  console.log(content);
@@ -4,10 +4,9 @@
4
4
  import { readFileSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
- var __dirname = dirname(fileURLToPath(import.meta.url));
8
7
  function ai() {
9
- const packageRoot = join(__dirname, "../../..");
10
- const usagePath = join(packageRoot, "ai", "USAGE.md");
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ const usagePath = join(__dirname, "..", "..", "ai", "USAGE.md");
11
10
  try {
12
11
  const content = readFileSync(usagePath, "utf-8");
13
12
  console.log(content);
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { C as r } from "../clipboard-text-CqueQiB8.js";
2
+ import { C as r } from "../clipboard-text-B32_yb2r.js";
3
3
  export {
4
4
  r as ClipboardText
5
5
  };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { P as i } from "../pagination-Bm8eMWpj.js";
2
+ import { P as i } from "../pagination-Cf-yRO-n.js";
3
3
  export {
4
4
  i as Pagination
5
5
  };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { K as a, a as _, T as e } from "../table-BUmvaBj8.js";
2
+ import { K as a, a as _, T as e } from "../table-DtUrZ2Rj.js";
3
3
  export {
4
4
  a as KUMO_TABLE_DEFAULT_VARIANTS,
5
5
  _ as KUMO_TABLE_VARIANTS,
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
1
  "use client";
2
2
  import { B as J } from "./badge-Dc99vsfo.js";
3
- import { B as S } from "./banner-4fkH6Sbt.js";
3
+ import { B as h } from "./banner-4fkH6Sbt.js";
4
4
  import { a as Y } from "./banner-4fkH6Sbt.js";
5
5
  import { B as n } from "./button-Bh96oxRL.js";
6
6
  import { L as aa, R as ea, b as oa } from "./button-Bh96oxRL.js";
7
7
  import { D as ta } from "./date-range-picker-CbKEQ9pi.js";
8
8
  import { C as ia } from "./checkbox-CWANiedi.js";
9
- import { C as na } from "./clipboard-text-CqueQiB8.js";
9
+ import { C as na } from "./clipboard-text-B32_yb2r.js";
10
10
  import { C as pa, a as fa } from "./code-T2wPDiM0.js";
11
11
  import { C as ca } from "./combobox-C9koouxM.js";
12
12
  import { a as N, D as O, c as U, e as A } from "./dialog-CpCeOqSZ.js";
13
13
  import { d as Ta, b as ua } from "./dialog-CpCeOqSZ.js";
14
14
  import { D as _a } from "./dropdown-DFeFcKfn.js";
15
15
  import { C as Ca } from "./collapsible-OBNkTO48.js";
16
- import { F as La, a as Ra, K as Ea, f as ha } from "./field-Dt-XuSaQ.js";
16
+ import { F as La, a as Ra, K as Ea, f as Sa } from "./field-Dt-XuSaQ.js";
17
17
  import { b as Na, K as Oa, L as Ua, a as ga, l as Da } from "./label-ChZ2Pp5p.js";
18
18
  import { I as g } from "./input-GZAWBXYX.js";
19
19
  import { i as Ka } from "./input-GZAWBXYX.js";
@@ -24,18 +24,18 @@ import { L as za } from "./loader-DHGMYlC6.js";
24
24
  import { S as ja } from "./skeleton-line-CtpS1u1J.js";
25
25
  import { M as qa, u as Wa } from "./menubar-CbXWXQYR.js";
26
26
  import { M as Ha } from "./meter-Bu5f3mAc.js";
27
- import { P as Qa } from "./pagination-Bm8eMWpj.js";
27
+ import { P as Qa } from "./pagination-Cf-yRO-n.js";
28
28
  import { S as Za } from "./select-DvpgiOau.js";
29
29
  import { S as ee } from "./surface-BIC6CXiz.js";
30
30
  import { S as re } from "./switch-Tu34uFoa.js";
31
31
  import { T as se } from "./tabs-B7THfqHW.js";
32
- import { T as le } from "./table-BUmvaBj8.js";
32
+ import { T as le } from "./table-DtUrZ2Rj.js";
33
33
  import { T as me } from "./text-BEhqwMfe.js";
34
34
  import { a as fe, T as de, u as ce } from "./toast-Du4y8qng.js";
35
35
  import { T as Te, a as ue } from "./tooltip-BxV1H6AV.js";
36
36
  import { g as _e, K as Ie, P as Ce } from "./popover-D7yeRosi.js";
37
37
  import { a as Le, K as Re, S as Ee } from "./sensitive-input-BuYT6U6C.js";
38
- import { b as Se, K as Ne, R as Oe, a as Ue } from "./radio-CKn09bGo.js";
38
+ import { b as he, K as Ne, R as Oe, a as Ue } from "./radio-CKn09bGo.js";
39
39
  import { C as De, a as Ve, K as Ke } from "./command-palette-TGXgr6Vq.js";
40
40
  import { a as ve, K as ke, L as ye, l as Pe } from "./link-Mj2WM1AS.js";
41
41
  import { B as Be } from "./breadcrumbs-DyKi7BcP.js";
@@ -69,7 +69,7 @@ function P({
69
69
  resourceType: p,
70
70
  resourceName: o,
71
71
  onDelete: f,
72
- isDeleting: r = !1,
72
+ isDeleting: t = !1,
73
73
  caseSensitive: d = !0,
74
74
  deleteButtonText: C,
75
75
  size: b = y.size,
@@ -81,11 +81,11 @@ function P({
81
81
  s || (T(""), i(!1));
82
82
  }, [s]);
83
83
  const u = m(
84
- (t) => d ? t : t.toLowerCase(),
84
+ (r) => d ? r : r.toLowerCase(),
85
85
  [d]
86
86
  ), l = u(x) === u(o), E = m(async () => {
87
- !l || r || await f();
88
- }, [l, r, f]), h = m(async () => {
87
+ !l || t || await f();
88
+ }, [l, t, f]), S = m(async () => {
89
89
  await navigator.clipboard.writeText(o), i(!0), setTimeout(() => i(!1), 1500);
90
90
  }, [o]);
91
91
  return /* @__PURE__ */ a(N, { open: s, onOpenChange: I, children: /* @__PURE__ */ e(O, { size: b, className: D("p-0", L), children: [
@@ -94,21 +94,27 @@ function P({
94
94
  "Delete ",
95
95
  o
96
96
  ] }),
97
- /* @__PURE__ */ a(A, { children: /* @__PURE__ */ a(
98
- n,
97
+ /* @__PURE__ */ a(
98
+ A,
99
99
  {
100
- variant: "ghost",
101
- shape: "square",
102
- size: "sm",
103
- "aria-label": "Close",
104
- disabled: r,
105
- children: /* @__PURE__ */ a(K, { size: 18 })
100
+ render: (r) => /* @__PURE__ */ a(
101
+ n,
102
+ {
103
+ ...r,
104
+ variant: "ghost",
105
+ shape: "square",
106
+ size: "sm",
107
+ "aria-label": "Close",
108
+ disabled: t,
109
+ children: /* @__PURE__ */ a(K, { size: 18 })
110
+ }
111
+ )
106
112
  }
107
- ) })
113
+ )
108
114
  ] }),
109
115
  /* @__PURE__ */ e("div", { className: "flex flex-col p-6 gap-4", children: [
110
116
  /* @__PURE__ */ e("div", { className: "flex flex-col gap-2", children: [
111
- c && /* @__PURE__ */ a(S, { icon: /* @__PURE__ */ a(M, {}), variant: "error", children: c }),
117
+ c && /* @__PURE__ */ a(h, { icon: /* @__PURE__ */ a(M, {}), variant: "error", children: c }),
112
118
  /* @__PURE__ */ e("p", { className: "text-base text-kumo-subtle max-w-prose text-pretty", children: [
113
119
  "This action cannot be undone. This will permanently delete the",
114
120
  " ",
@@ -126,7 +132,7 @@ function P({
126
132
  "button",
127
133
  {
128
134
  className: "font-mono text-sm inline font-semibold bg-kumo-tint hover:bg-kumo-fill rounded-md px-2 py-1 group hover:cursor-pointer",
129
- onClick: h,
135
+ onClick: S,
130
136
  "aria-label": `Copy ${o} to clipboard`,
131
137
  children: [
132
138
  o,
@@ -156,8 +162,8 @@ function P({
156
162
  {
157
163
  placeholder: o,
158
164
  value: x,
159
- onChange: (t) => T(t.target.value),
160
- disabled: r,
165
+ onChange: (r) => T(r.target.value),
166
+ disabled: t,
161
167
  autoComplete: "off",
162
168
  autoCorrect: "off",
163
169
  autoCapitalize: "off",
@@ -169,14 +175,19 @@ function P({
169
175
  ] })
170
176
  ] }),
171
177
  /* @__PURE__ */ e("div", { className: "flex justify-end gap-3 border-t border-kumo-line px-6 py-4", children: [
172
- /* @__PURE__ */ a(A, { children: /* @__PURE__ */ a(n, { variant: "secondary", disabled: r, children: "Cancel" }) }),
178
+ /* @__PURE__ */ a(
179
+ A,
180
+ {
181
+ render: (r) => /* @__PURE__ */ a(n, { ...r, variant: "secondary", disabled: t, children: "Cancel" })
182
+ }
183
+ ),
173
184
  /* @__PURE__ */ a(
174
185
  n,
175
186
  {
176
187
  variant: "destructive",
177
188
  onClick: E,
178
- disabled: !l || r,
179
- loading: r,
189
+ disabled: !l || t,
190
+ loading: t,
180
191
  children: C || `Delete ${p}`
181
192
  }
182
193
  )
@@ -186,7 +197,7 @@ function P({
186
197
  P.displayName = "DeleteResource";
187
198
  export {
188
199
  J as Badge,
189
- S as Banner,
200
+ h as Banner,
190
201
  Y as BannerVariant,
191
202
  Be as Breadcrumbs,
192
203
  n as Button,
@@ -230,7 +241,7 @@ export {
230
241
  ke as KUMO_LINK_VARIANTS,
231
242
  _e as KUMO_POPOVER_DEFAULT_VARIANTS,
232
243
  Ie as KUMO_POPOVER_VARIANTS,
233
- Se as KUMO_RADIO_DEFAULT_VARIANTS,
244
+ he as KUMO_RADIO_DEFAULT_VARIANTS,
234
245
  Ne as KUMO_RADIO_VARIANTS,
235
246
  Le as KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS,
236
247
  Re as KUMO_SENSITIVE_INPUT_VARIANTS,
@@ -264,7 +275,7 @@ export {
264
275
  ue as TooltipProvider,
265
276
  oa as buttonVariants,
266
277
  D as cn,
267
- ha as fieldVariants,
278
+ Sa as fieldVariants,
268
279
  eo as generateCloudflareLogoSvg,
269
280
  Xe as gridItemVariants,
270
281
  He as gridVariants,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/blocks/delete-resource/delete-resource.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from \"react\";\nimport {\n Dialog,\n DialogRoot,\n DialogTitle,\n DialogClose,\n} from \"../../components/dialog\";\nimport { Input } from \"../../components/input\";\nimport { Button } from \"../../components/button\";\nimport { cn } from \"../../utils/cn\";\nimport {\n CheckIcon,\n CopyIcon,\n WarningCircleIcon,\n XIcon,\n} from \"@phosphor-icons/react\";\nimport { Banner } from \"../../components/banner\";\n\nexport const KUMO_DELETE_RESOURCE_VARIANTS = {\n size: {\n sm: {\n classes: \"\",\n description: \"Small dialog for simple delete confirmations\",\n },\n base: {\n classes: \"\",\n description: \"Default delete confirmation dialog size\",\n },\n },\n} as const;\n\nexport const KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport type KumoDeleteResourceSize =\n keyof typeof KUMO_DELETE_RESOURCE_VARIANTS.size;\n\nexport interface KumoDeleteResourceVariantsProps {\n size?: KumoDeleteResourceSize;\n}\n\nexport interface DeleteResourceProps extends KumoDeleteResourceVariantsProps {\n /** Whether the dialog is open */\n open: boolean;\n /** Callback when open state changes */\n onOpenChange: (open: boolean) => void;\n /** The type of resource being deleted (e.g., \"Zone\", \"Worker\", \"KV Namespace\") */\n resourceType: string;\n /** The name of the specific resource being deleted */\n resourceName: string;\n /** Callback when delete is confirmed */\n onDelete: () => void | Promise<void>;\n /** Whether the delete action is in progress */\n isDeleting?: boolean;\n /** Whether the confirmation input should be case-sensitive (default: true) */\n caseSensitive?: boolean;\n /** Custom delete button text (defaults to \"Delete {resourceType}\") */\n deleteButtonText?: string;\n /** Additional className for the dialog */\n className?: string;\n /** Error message to display if the delete action fails */\n errorMessage?: string;\n}\n\nexport function DeleteResource({\n open,\n onOpenChange,\n resourceType,\n resourceName,\n onDelete,\n isDeleting = false,\n caseSensitive = true,\n deleteButtonText,\n size = KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS.size,\n errorMessage,\n className,\n}: DeleteResourceProps) {\n const [confirmationInput, setConfirmationInput] = useState(\"\");\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (!open) {\n setConfirmationInput(\"\");\n setCopied(false);\n }\n }, [open]);\n\n const normalizeForComparison = useCallback(\n (str: string) => (caseSensitive ? str : str.toLowerCase()),\n [caseSensitive],\n );\n\n const isConfirmed =\n normalizeForComparison(confirmationInput) ===\n normalizeForComparison(resourceName);\n\n const handleDelete = useCallback(async () => {\n if (!isConfirmed || isDeleting) return;\n await onDelete();\n }, [isConfirmed, isDeleting, onDelete]);\n\n const handleCopy = useCallback(async () => {\n await navigator.clipboard.writeText(resourceName);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }, [resourceName]);\n\n return (\n <DialogRoot open={open} onOpenChange={onOpenChange}>\n <Dialog size={size} className={cn(\"p-0\", className)}>\n <div className=\"flex items-center justify-between border-b border-kumo-line px-6 py-4\">\n <DialogTitle className=\"text-lg font-semibold\">\n Delete {resourceName}\n </DialogTitle>\n <DialogClose>\n <Button\n variant=\"ghost\"\n shape=\"square\"\n size=\"sm\"\n aria-label=\"Close\"\n disabled={isDeleting}\n >\n <XIcon size={18} />\n </Button>\n </DialogClose>\n </div>\n\n <div className=\"flex flex-col p-6 gap-4\">\n <div className=\"flex flex-col gap-2\">\n {errorMessage && (\n <Banner icon={<WarningCircleIcon />} variant=\"error\">\n {errorMessage}\n </Banner>\n )}\n <p className=\"text-base text-kumo-subtle max-w-prose text-pretty\">\n This action cannot be undone. This will permanently delete the{\" \"}\n <span className=\"font-medium text-kumo-default\">\n {resourceName}\n </span>{\" \"}\n {resourceType.toLowerCase()}.\n </p>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-1.5 text-base\">\n <span>\n Type{\" \"}\n <button\n className=\"font-mono text-sm inline font-semibold bg-kumo-tint hover:bg-kumo-fill rounded-md px-2 py-1 group hover:cursor-pointer\"\n onClick={handleCopy}\n aria-label={`Copy ${resourceName} to clipboard`}\n >\n {resourceName}\n\n {copied ? (\n <CheckIcon\n size={12}\n weight=\"bold\"\n className=\"inline ml-1.5\"\n />\n ) : (\n <CopyIcon\n size={12}\n weight=\"bold\"\n className=\"inline text-kumo-subtle group-hover:text-kumo-default ml-1.5\"\n />\n )}\n </button>{\" \"}\n to confirm:\n </span>\n </div>\n <Input\n placeholder={resourceName}\n value={confirmationInput}\n onChange={(e) => setConfirmationInput(e.target.value)}\n disabled={isDeleting}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n aria-label={`Type ${resourceName} to confirm deletion`}\n className=\"w-full\"\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-3 border-t border-kumo-line px-6 py-4\">\n <DialogClose>\n <Button variant=\"secondary\" disabled={isDeleting}>\n Cancel\n </Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={handleDelete}\n disabled={!isConfirmed || isDeleting}\n loading={isDeleting}\n >\n {deleteButtonText || `Delete ${resourceType}`}\n </Button>\n </div>\n </Dialog>\n </DialogRoot>\n );\n}\n\nDeleteResource.displayName = \"DeleteResource\";\n"],"names":["KUMO_DELETE_RESOURCE_VARIANTS","KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS","DeleteResource","open","onOpenChange","resourceType","resourceName","onDelete","isDeleting","caseSensitive","deleteButtonText","size","errorMessage","className","confirmationInput","setConfirmationInput","useState","copied","setCopied","useEffect","normalizeForComparison","useCallback","str","isConfirmed","handleDelete","handleCopy","jsx","DialogRoot","jsxs","Dialog","cn","DialogTitle","DialogClose","Button","XIcon","Banner","WarningCircleIcon","CheckIcon","CopyIcon","Input","e"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAMA,IAAgC;AAAA,EAC3C,MAAM;AAAA,IACJ,IAAI;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAAwC;AAAA,EACnD,MAAM;AACR;AAgCO,SAASC,EAAe;AAAA,EAC7B,MAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,eAAAC,IAAgB;AAAA,EAChB,kBAAAC;AAAA,EACA,MAAAC,IAAOV,EAAsC;AAAA,EAC7C,cAAAW;AAAA,EACA,WAAAC;AACF,GAAwB;AACtB,QAAM,CAACC,GAAmBC,CAAoB,IAAIC,EAAS,EAAE,GACvD,CAACC,GAAQC,CAAS,IAAIF,EAAS,EAAK;AAE1C,EAAAG,EAAU,MAAM;AACd,IAAKhB,MACHY,EAAqB,EAAE,GACvBG,EAAU,EAAK;AAAA,EAEnB,GAAG,CAACf,CAAI,CAAC;AAET,QAAMiB,IAAyBC;AAAA,IAC7B,CAACC,MAAiBb,IAAgBa,IAAMA,EAAI,YAAA;AAAA,IAC5C,CAACb,CAAa;AAAA,EAAA,GAGVc,IACJH,EAAuBN,CAAiB,MACxCM,EAAuBd,CAAY,GAE/BkB,IAAeH,EAAY,YAAY;AAC3C,IAAI,CAACE,KAAef,KACpB,MAAMD,EAAA;AAAA,EACR,GAAG,CAACgB,GAAaf,GAAYD,CAAQ,CAAC,GAEhCkB,IAAaJ,EAAY,YAAY;AACzC,UAAM,UAAU,UAAU,UAAUf,CAAY,GAChDY,EAAU,EAAI,GACd,WAAW,MAAMA,EAAU,EAAK,GAAG,IAAI;AAAA,EACzC,GAAG,CAACZ,CAAY,CAAC;AAEjB,SACE,gBAAAoB,EAACC,GAAA,EAAW,MAAAxB,GAAY,cAAAC,GACtB,UAAA,gBAAAwB,EAACC,GAAA,EAAO,MAAAlB,GAAY,WAAWmB,EAAG,OAAOjB,CAAS,GAChD,UAAA;AAAA,IAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,MAAA,gBAAAA,EAACG,GAAA,EAAY,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QACrCzB;AAAA,MAAA,GACV;AAAA,wBACC0B,GAAA,EACC,UAAA,gBAAAN;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,MAAK;AAAA,UACL,cAAW;AAAA,UACX,UAAUzB;AAAA,UAEV,UAAA,gBAAAkB,EAACQ,GAAA,EAAM,MAAM,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA,EACnB,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAN,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,QAAAhB,KACC,gBAAAc,EAACS,KAAO,MAAM,gBAAAT,EAACU,KAAkB,GAAI,SAAQ,SAC1C,UAAAxB,EAAA,CACH;AAAA,QAEF,gBAAAgB,EAAC,KAAA,EAAE,WAAU,sDAAqD,UAAA;AAAA,UAAA;AAAA,UACD;AAAA,UAC/D,gBAAAF,EAAC,QAAA,EAAK,WAAU,iCACb,UAAApB,GACH;AAAA,UAAQ;AAAA,UACPD,EAAa,YAAA;AAAA,UAAc;AAAA,QAAA,EAAA,CAC9B;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAuB,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA,gBAAAE,EAAC,QAAA,EAAK,UAAA;AAAA,UAAA;AAAA,UACC;AAAA,UACL,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAASH;AAAA,cACT,cAAY,QAAQnB,CAAY;AAAA,cAE/B,UAAA;AAAA,gBAAAA;AAAA,gBAEAW,IACC,gBAAAS;AAAA,kBAACW;AAAA,kBAAA;AAAA,oBACC,MAAM;AAAA,oBACN,QAAO;AAAA,oBACP,WAAU;AAAA,kBAAA;AAAA,gBAAA,IAGZ,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,MAAM;AAAA,oBACN,QAAO;AAAA,oBACP,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ;AAAA,YAAA;AAAA,UAAA;AAAA,UAEM;AAAA,UAAI;AAAA,QAAA,EAAA,CAEhB,EAAA,CACF;AAAA,QACA,gBAAAZ;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,aAAajC;AAAA,YACb,OAAOQ;AAAA,YACP,UAAU,CAAC0B,MAAMzB,EAAqByB,EAAE,OAAO,KAAK;AAAA,YACpD,UAAUhC;AAAA,YACV,cAAa;AAAA,YACb,aAAY;AAAA,YACZ,gBAAe;AAAA,YACf,YAAY;AAAA,YACZ,cAAY,QAAQF,CAAY;AAAA,YAChC,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAsB,EAAC,OAAA,EAAI,WAAU,8DACb,UAAA;AAAA,MAAA,gBAAAF,EAACM,GAAA,EACC,4BAACC,GAAA,EAAO,SAAQ,aAAY,UAAUzB,GAAY,oBAElD,EAAA,CACF;AAAA,MACA,gBAAAkB;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAST;AAAA,UACT,UAAU,CAACD,KAAef;AAAA,UAC1B,SAASA;AAAA,UAER,UAAAE,KAAoB,UAAUL,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7C,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAEAH,EAAe,cAAc;"}
1
+ {"version":3,"file":"index.js","sources":["../src/blocks/delete-resource/delete-resource.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from \"react\";\nimport {\n Dialog,\n DialogRoot,\n DialogTitle,\n DialogClose,\n} from \"../../components/dialog\";\nimport { Input } from \"../../components/input\";\nimport { Button } from \"../../components/button\";\nimport { cn } from \"../../utils/cn\";\nimport {\n CheckIcon,\n CopyIcon,\n WarningCircleIcon,\n XIcon,\n} from \"@phosphor-icons/react\";\nimport { Banner } from \"../../components/banner\";\n\nexport const KUMO_DELETE_RESOURCE_VARIANTS = {\n size: {\n sm: {\n classes: \"\",\n description: \"Small dialog for simple delete confirmations\",\n },\n base: {\n classes: \"\",\n description: \"Default delete confirmation dialog size\",\n },\n },\n} as const;\n\nexport const KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport type KumoDeleteResourceSize =\n keyof typeof KUMO_DELETE_RESOURCE_VARIANTS.size;\n\nexport interface KumoDeleteResourceVariantsProps {\n size?: KumoDeleteResourceSize;\n}\n\nexport interface DeleteResourceProps extends KumoDeleteResourceVariantsProps {\n /** Whether the dialog is open */\n open: boolean;\n /** Callback when open state changes */\n onOpenChange: (open: boolean) => void;\n /** The type of resource being deleted (e.g., \"Zone\", \"Worker\", \"KV Namespace\") */\n resourceType: string;\n /** The name of the specific resource being deleted */\n resourceName: string;\n /** Callback when delete is confirmed */\n onDelete: () => void | Promise<void>;\n /** Whether the delete action is in progress */\n isDeleting?: boolean;\n /** Whether the confirmation input should be case-sensitive (default: true) */\n caseSensitive?: boolean;\n /** Custom delete button text (defaults to \"Delete {resourceType}\") */\n deleteButtonText?: string;\n /** Additional className for the dialog */\n className?: string;\n /** Error message to display if the delete action fails */\n errorMessage?: string;\n}\n\nexport function DeleteResource({\n open,\n onOpenChange,\n resourceType,\n resourceName,\n onDelete,\n isDeleting = false,\n caseSensitive = true,\n deleteButtonText,\n size = KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS.size,\n errorMessage,\n className,\n}: DeleteResourceProps) {\n const [confirmationInput, setConfirmationInput] = useState(\"\");\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (!open) {\n setConfirmationInput(\"\");\n setCopied(false);\n }\n }, [open]);\n\n const normalizeForComparison = useCallback(\n (str: string) => (caseSensitive ? str : str.toLowerCase()),\n [caseSensitive],\n );\n\n const isConfirmed =\n normalizeForComparison(confirmationInput) ===\n normalizeForComparison(resourceName);\n\n const handleDelete = useCallback(async () => {\n if (!isConfirmed || isDeleting) return;\n await onDelete();\n }, [isConfirmed, isDeleting, onDelete]);\n\n const handleCopy = useCallback(async () => {\n await navigator.clipboard.writeText(resourceName);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }, [resourceName]);\n\n return (\n <DialogRoot open={open} onOpenChange={onOpenChange}>\n <Dialog size={size} className={cn(\"p-0\", className)}>\n <div className=\"flex items-center justify-between border-b border-kumo-line px-6 py-4\">\n <DialogTitle className=\"text-lg font-semibold\">\n Delete {resourceName}\n </DialogTitle>\n <DialogClose\n render={(props) => (\n <Button\n {...props}\n variant=\"ghost\"\n shape=\"square\"\n size=\"sm\"\n aria-label=\"Close\"\n disabled={isDeleting}\n >\n <XIcon size={18} />\n </Button>\n )}\n />\n </div>\n\n <div className=\"flex flex-col p-6 gap-4\">\n <div className=\"flex flex-col gap-2\">\n {errorMessage && (\n <Banner icon={<WarningCircleIcon />} variant=\"error\">\n {errorMessage}\n </Banner>\n )}\n <p className=\"text-base text-kumo-subtle max-w-prose text-pretty\">\n This action cannot be undone. This will permanently delete the{\" \"}\n <span className=\"font-medium text-kumo-default\">\n {resourceName}\n </span>{\" \"}\n {resourceType.toLowerCase()}.\n </p>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-1.5 text-base\">\n <span>\n Type{\" \"}\n <button\n className=\"font-mono text-sm inline font-semibold bg-kumo-tint hover:bg-kumo-fill rounded-md px-2 py-1 group hover:cursor-pointer\"\n onClick={handleCopy}\n aria-label={`Copy ${resourceName} to clipboard`}\n >\n {resourceName}\n\n {copied ? (\n <CheckIcon\n size={12}\n weight=\"bold\"\n className=\"inline ml-1.5\"\n />\n ) : (\n <CopyIcon\n size={12}\n weight=\"bold\"\n className=\"inline text-kumo-subtle group-hover:text-kumo-default ml-1.5\"\n />\n )}\n </button>{\" \"}\n to confirm:\n </span>\n </div>\n <Input\n placeholder={resourceName}\n value={confirmationInput}\n onChange={(e) => setConfirmationInput(e.target.value)}\n disabled={isDeleting}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n aria-label={`Type ${resourceName} to confirm deletion`}\n className=\"w-full\"\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-3 border-t border-kumo-line px-6 py-4\">\n <DialogClose\n render={(props) => (\n <Button {...props} variant=\"secondary\" disabled={isDeleting}>\n Cancel\n </Button>\n )}\n />\n <Button\n variant=\"destructive\"\n onClick={handleDelete}\n disabled={!isConfirmed || isDeleting}\n loading={isDeleting}\n >\n {deleteButtonText || `Delete ${resourceType}`}\n </Button>\n </div>\n </Dialog>\n </DialogRoot>\n );\n}\n\nDeleteResource.displayName = \"DeleteResource\";\n"],"names":["KUMO_DELETE_RESOURCE_VARIANTS","KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS","DeleteResource","open","onOpenChange","resourceType","resourceName","onDelete","isDeleting","caseSensitive","deleteButtonText","size","errorMessage","className","confirmationInput","setConfirmationInput","useState","copied","setCopied","useEffect","normalizeForComparison","useCallback","str","isConfirmed","handleDelete","handleCopy","jsx","DialogRoot","jsxs","Dialog","cn","DialogTitle","DialogClose","props","Button","XIcon","Banner","WarningCircleIcon","CheckIcon","CopyIcon","Input","e"],"mappings":"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"}
@@ -1,29 +1,30 @@
1
1
  "use client";
2
- import { jsxs as m, jsx as n } from "react/jsx-runtime";
3
- import { useState as b, useEffect as N, useMemo as h } from "react";
2
+ import { jsxs as h, jsx as n } from "react/jsx-runtime";
3
+ import { useState as N, useEffect as x, useMemo as b } from "react";
4
4
  import { I as s } from "./input-group-COo-wz5O.js";
5
- import { CaretDoubleLeftIcon as x, CaretLeftIcon as v, CaretRightIcon as I, CaretDoubleRightIcon as M } from "@phosphor-icons/react";
5
+ import { CaretDoubleLeftIcon as v, CaretLeftIcon as I, CaretRightIcon as M, CaretDoubleRightIcon as g } from "@phosphor-icons/react";
6
6
  const w = {
7
7
  controls: "full"
8
8
  };
9
- function g({
9
+ function z({
10
10
  page: i = 1,
11
11
  perPage: t,
12
12
  totalCount: r,
13
13
  setPage: o,
14
+ text: d,
14
15
  controls: c = w.controls
15
16
  }) {
16
- const [d, a] = b(1);
17
- N(() => {
17
+ const [m, a] = N(1);
18
+ x(() => {
18
19
  a(i);
19
20
  }, [i]);
20
- const f = h(() => {
21
+ const f = b(() => {
21
22
  let e = i * (t ?? 1) - (t ?? 0) + 1, u = Math.min(i * (t ?? 0), r ?? 0);
22
23
  return Number.isNaN(e) && (e = 0), Number.isNaN(u) && (u = 0), `${e}-${u}`;
23
- }, [i, t, r]), l = h(() => Math.ceil((r ?? 1) / (t ?? 1)), [r, t]);
24
- return /* @__PURE__ */ m("div", { className: "flex items-center justify-between gap-2", children: [
25
- /* @__PURE__ */ n("div", { className: "grow text-sm text-kumo-strong", children: r && r > 0 ? `Showing ${f} of ${r}` : null }),
26
- /* @__PURE__ */ n("div", { children: /* @__PURE__ */ m(s, { focusMode: "individual", children: [
24
+ }, [i, t, r]), l = b(() => Math.ceil((r ?? 1) / (t ?? 1)), [r, t]);
25
+ return /* @__PURE__ */ h("div", { className: "flex items-center justify-between gap-2", children: [
26
+ /* @__PURE__ */ n("div", { className: "grow text-sm text-kumo-strong", children: d ? d({ page: i, perPage: t, totalCount: r, pageShowingRange: f }) : r && r > 0 ? `Showing ${f} of ${r}` : null }),
27
+ /* @__PURE__ */ n("div", { children: /* @__PURE__ */ h(s, { focusMode: "individual", children: [
27
28
  c === "full" && /* @__PURE__ */ n(
28
29
  s.Button,
29
30
  {
@@ -33,7 +34,7 @@ function g({
33
34
  onClick: () => {
34
35
  o(1), a(1);
35
36
  },
36
- children: /* @__PURE__ */ n(x, { size: 16 })
37
+ children: /* @__PURE__ */ n(v, { size: 16 })
37
38
  }
38
39
  ),
39
40
  /* @__PURE__ */ n(
@@ -46,7 +47,7 @@ function g({
46
47
  const e = Math.max(i - 1, 1);
47
48
  o(e), a(e);
48
49
  },
49
- children: /* @__PURE__ */ n(v, { size: 16 })
50
+ children: /* @__PURE__ */ n(I, { size: 16 })
50
51
  }
51
52
  ),
52
53
  c === "full" && /* @__PURE__ */ n(
@@ -55,12 +56,12 @@ function g({
55
56
  style: { width: 50 },
56
57
  className: "text-center",
57
58
  "aria-label": "Page number",
58
- value: d,
59
+ value: m,
59
60
  onValueChange: (e) => {
60
61
  a(Number(e));
61
62
  },
62
63
  onBlur: () => {
63
- let e = Math.max(d, 1);
64
+ let e = Math.max(m, 1);
64
65
  e = Math.min(e, l), o(e), a(e);
65
66
  }
66
67
  }
@@ -75,7 +76,7 @@ function g({
75
76
  const e = Math.min(i + 1, l);
76
77
  o(e), a(e);
77
78
  },
78
- children: /* @__PURE__ */ n(I, { size: 16 })
79
+ children: /* @__PURE__ */ n(M, { size: 16 })
79
80
  }
80
81
  ),
81
82
  c === "full" && /* @__PURE__ */ n(
@@ -87,13 +88,13 @@ function g({
87
88
  onClick: () => {
88
89
  o(l), a(l);
89
90
  },
90
- children: /* @__PURE__ */ n(M, { size: 16 })
91
+ children: /* @__PURE__ */ n(g, { size: 16 })
91
92
  }
92
93
  )
93
94
  ] }) })
94
95
  ] });
95
96
  }
96
97
  export {
97
- g as P
98
+ z as P
98
99
  };
99
- //# sourceMappingURL=pagination-Bm8eMWpj.js.map
100
+ //# sourceMappingURL=pagination-Cf-yRO-n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination-Cf-yRO-n.js","sources":["../src/components/pagination/pagination.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { InputGroup } from \"../input\";\nimport {\n CaretDoubleLeftIcon,\n CaretDoubleRightIcon,\n CaretLeftIcon,\n CaretRightIcon,\n} from \"@phosphor-icons/react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Pagination controls variant definitions. */\nexport const KUMO_PAGINATION_VARIANTS = {\n controls: {\n full: {\n classes: \"\",\n description:\n \"Full pagination controls with first, previous, page input, next, and last buttons\",\n },\n simple: {\n classes: \"\",\n description:\n \"Simple pagination controls with only previous and next buttons\",\n },\n },\n} as const;\n\nexport type KumoPaginationControls =\n keyof typeof KUMO_PAGINATION_VARIANTS.controls;\n\nexport const KUMO_PAGINATION_DEFAULT_VARIANTS = {\n controls: \"full\",\n} as const;\n\nexport interface KumoPaginationVariantsProps {\n controls?: KumoPaginationControls;\n}\n\nexport function paginationVariants({\n controls = KUMO_PAGINATION_DEFAULT_VARIANTS.controls,\n}: KumoPaginationVariantsProps = {}) {\n return cn(\n \"flex items-center justify-between gap-2\",\n KUMO_PAGINATION_VARIANTS.controls[controls].classes,\n );\n}\n\n/**\n * Pagination component props.\n *\n * @example\n * ```tsx\n * <Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />\n * <Pagination page={page} setPage={setPage} perPage={10} totalCount={100} controls=\"simple\" />\n * ```\n */\nexport interface PaginationProps extends KumoPaginationVariantsProps {\n /** Callback fired when the current page changes. */\n setPage: (page: number) => void;\n /**\n * Current page number (1-indexed).\n * @default 1\n */\n page?: number;\n /** Number of items displayed per page. */\n perPage?: number;\n /** Total number of items across all pages. */\n totalCount?: number;\n /** Method to provide custom pagination text */\n text?: (props: {\n page?: number;\n perPage?: number;\n totalCount?: number;\n pageShowingRange: string;\n }) => React.ReactNode;\n}\n\n/**\n * Page navigation controls with page count display.\n *\n * @example\n * ```tsx\n * <Pagination page={page} setPage={setPage} perPage={10} totalCount={100} />\n * ```\n */\nexport function Pagination({\n page = 1,\n perPage,\n totalCount,\n setPage,\n text,\n controls = KUMO_PAGINATION_DEFAULT_VARIANTS.controls,\n}: PaginationProps) {\n const [editingPage, setEditingPage] = useState<number>(1);\n\n // Value of the input as its being modified to display in the input, eventually syncs with `pagination.page`\n useEffect(() => {\n setEditingPage(page);\n }, [page]);\n\n const pageShowingRange = useMemo(() => {\n let lower = page * (perPage ?? 1) - (perPage ?? 0) + 1;\n let upper = Math.min(page * (perPage ?? 0), totalCount ?? 0);\n\n if (Number.isNaN(lower)) lower = 0;\n if (Number.isNaN(upper)) upper = 0;\n\n return `${lower}-${upper}`;\n }, [page, perPage, totalCount]);\n\n const maxPage = useMemo(() => {\n return Math.ceil((totalCount ?? 1) / (perPage ?? 1));\n }, [totalCount, perPage]);\n\n const getPaginationText = () => {\n if (text) {\n return text({ page, perPage, totalCount, pageShowingRange });\n } else if (totalCount && totalCount > 0) {\n return `Showing ${pageShowingRange} of ${totalCount}`;\n }\n return null;\n };\n\n return (\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"grow text-sm text-kumo-strong\">{getPaginationText()}</div>\n <div>\n <InputGroup focusMode=\"individual\">\n {controls === \"full\" && (\n <InputGroup.Button\n variant=\"secondary\"\n aria-label=\"First page\"\n disabled={page <= 1}\n onClick={() => {\n setPage(1);\n setEditingPage(1);\n }}\n >\n <CaretDoubleLeftIcon size={16} />\n </InputGroup.Button>\n )}\n <InputGroup.Button\n variant=\"secondary\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => {\n const previousPage = Math.max(page - 1, 1);\n setPage(previousPage);\n setEditingPage(previousPage);\n }}\n >\n <CaretLeftIcon size={16} />\n </InputGroup.Button>\n {controls === \"full\" && (\n <InputGroup.Input\n style={{ width: 50 }}\n className=\"text-center\"\n aria-label=\"Page number\"\n value={editingPage}\n onValueChange={(value: string) => {\n setEditingPage(Number(value));\n }}\n onBlur={() => {\n let number = Math.max(editingPage, 1);\n number = Math.min(number, maxPage);\n setPage(number);\n setEditingPage(number);\n }}\n />\n )}\n <InputGroup.Button\n variant=\"secondary\"\n aria-label=\"Next page\"\n disabled={page === maxPage}\n onClick={() => {\n const nextPage = Math.min(page + 1, maxPage);\n setPage(nextPage);\n setEditingPage(nextPage);\n }}\n >\n <CaretRightIcon size={16} />\n </InputGroup.Button>\n {controls === \"full\" && (\n <InputGroup.Button\n variant=\"secondary\"\n aria-label=\"Last page\"\n disabled={page === maxPage}\n onClick={() => {\n setPage(maxPage);\n setEditingPage(maxPage);\n }}\n >\n <CaretDoubleRightIcon size={16} />\n </InputGroup.Button>\n )}\n </InputGroup>\n </div>\n </div>\n );\n}\n"],"names":["KUMO_PAGINATION_DEFAULT_VARIANTS","Pagination","page","perPage","totalCount","setPage","text","controls","editingPage","setEditingPage","useState","useEffect","pageShowingRange","useMemo","lower","upper","maxPage","jsxs","jsx","InputGroup","CaretDoubleLeftIcon","previousPage","CaretLeftIcon","value","number","nextPage","CaretRightIcon","CaretDoubleRightIcon"],"mappings":"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"}
@@ -3538,8 +3538,10 @@ const g = k([
3538
3538
  // Current page number (1-indexed).
3539
3539
  perPage: y().optional(),
3540
3540
  // Number of items displayed per page.
3541
- totalCount: y().optional()
3541
+ totalCount: y().optional(),
3542
3542
  // Total number of items across all pages.
3543
+ text: s().optional()
3544
+ // Method to provide custom pagination text
3543
3545
  }), qa = b({
3544
3546
  side: v(["top", "bottom", "left", "right"]).optional()
3545
3547
  // Which side of the trigger the popover appears on. - `"top"` — Above the trigger - `"bottom"` — Below the trigger - `"left"` — Left of the trigger - `"right"` — Right of the trigger
@@ -3855,4 +3857,4 @@ export {
3855
3857
  ls as validateElementProps,
3856
3858
  ps as validateUITree
3857
3859
  };
3858
- //# sourceMappingURL=schemas-B-D2OT-O.js.map
3860
+ //# sourceMappingURL=schemas-H10xB2M_.js.map