@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.
- package/CHANGELOG.md +18 -0
- package/ai/component-registry.json +10 -4
- package/ai/component-registry.md +87 -35
- package/ai/schemas.ts +1 -0
- package/bin/kumo.js +23 -19
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +2147 -0
- package/dist/ai/schemas.d.ts.map +1 -0
- package/dist/catalog.js +1 -1
- package/dist/{clipboard-text-CqueQiB8.js → clipboard-text-B32_yb2r.js} +9 -9
- package/dist/clipboard-text-B32_yb2r.js.map +1 -0
- package/dist/command-line/cli.js +16 -17
- package/dist/command-line/commands/ai.js +2 -3
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/index.js +40 -29
- package/dist/index.js.map +1 -1
- package/dist/{pagination-Bm8eMWpj.js → pagination-Cf-yRO-n.js} +20 -19
- package/dist/pagination-Cf-yRO-n.js.map +1 -0
- package/dist/{schemas-B-D2OT-O.js → schemas-H10xB2M_.js} +4 -2
- package/dist/{schemas-B-D2OT-O.js.map → schemas-H10xB2M_.js.map} +1 -1
- package/dist/src/blocks/delete-resource/delete-resource.d.ts.map +1 -1
- package/dist/src/blocks/delete-resource/delete-resource.tsx +213 -0
- package/dist/src/blocks/page-header/page-header.tsx +99 -0
- package/dist/src/blocks/resource-list/resource-list.test.tsx +28 -0
- package/dist/src/blocks/resource-list/resource-list.tsx +69 -0
- package/dist/src/command-line/commands/ai.d.ts.map +1 -1
- package/dist/src/components/pagination/pagination.d.ts +8 -1
- package/dist/src/components/pagination/pagination.d.ts.map +1 -1
- package/dist/src/components/table/table.d.ts +2 -0
- package/dist/src/components/table/table.d.ts.map +1 -1
- package/dist/styles/kumo-standalone.css +1 -1
- package/dist/table-DtUrZ2Rj.js +149 -0
- package/dist/table-DtUrZ2Rj.js.map +1 -0
- package/package.json +1 -1
- package/scripts/css-build.ts +47 -1
- package/dist/clipboard-text-CqueQiB8.js.map +0 -1
- package/dist/pagination-Bm8eMWpj.js.map +0 -1
- package/dist/table-BUmvaBj8.js +0 -153
- 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,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs as g, jsx as i } from "react/jsx-runtime";
|
|
3
|
-
import { CheckIcon as
|
|
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:
|
|
44
|
+
onCopy: s
|
|
45
45
|
}, f) => {
|
|
46
|
-
const [o,
|
|
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),
|
|
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"),
|
|
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,
|
|
67
|
+
}, [t, s]);
|
|
68
68
|
return h(() => {
|
|
69
69
|
if (o) {
|
|
70
70
|
const e = setTimeout(() => {
|
|
71
|
-
|
|
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(
|
|
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-
|
|
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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"}
|
package/dist/command-line/cli.js
CHANGED
|
@@ -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
|
|
9
|
-
return join(
|
|
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
|
|
58
|
-
return join2(
|
|
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
|
|
328
|
-
return join4(
|
|
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
|
|
424
|
+
const __dirname = dirname4(fileURLToPath4(import.meta.url));
|
|
425
425
|
const possiblePaths = [
|
|
426
|
-
join5(
|
|
427
|
-
join5(
|
|
428
|
-
join5(
|
|
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
|
|
440
|
+
const __dirname = dirname4(fileURLToPath4(import.meta.url));
|
|
441
441
|
const possiblePaths = [
|
|
442
|
-
join5(
|
|
443
|
-
join5(
|
|
444
|
-
join5(
|
|
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
|
|
702
|
-
const usagePath = join6(
|
|
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
|
|
10
|
-
const usagePath = join(
|
|
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);
|
package/dist/components/table.js
CHANGED
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
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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:
|
|
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
|
-
(
|
|
84
|
+
(r) => d ? r : r.toLowerCase(),
|
|
85
85
|
[d]
|
|
86
86
|
), l = u(x) === u(o), E = m(async () => {
|
|
87
|
-
!l ||
|
|
88
|
-
}, [l,
|
|
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(
|
|
98
|
-
|
|
97
|
+
/* @__PURE__ */ a(
|
|
98
|
+
A,
|
|
99
99
|
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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(
|
|
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:
|
|
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: (
|
|
160
|
-
disabled:
|
|
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(
|
|
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 ||
|
|
179
|
-
loading:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"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"}
|
|
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
|
|
3
|
-
import { useState as
|
|
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
|
|
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
|
|
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 [
|
|
17
|
-
|
|
17
|
+
const [m, a] = N(1);
|
|
18
|
+
x(() => {
|
|
18
19
|
a(i);
|
|
19
20
|
}, [i]);
|
|
20
|
-
const f =
|
|
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 =
|
|
24
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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(
|
|
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(
|
|
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:
|
|
59
|
+
value: m,
|
|
59
60
|
onValueChange: (e) => {
|
|
60
61
|
a(Number(e));
|
|
61
62
|
},
|
|
62
63
|
onBlur: () => {
|
|
63
|
-
let e = Math.max(
|
|
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(
|
|
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(
|
|
91
|
+
children: /* @__PURE__ */ n(g, { size: 16 })
|
|
91
92
|
}
|
|
92
93
|
)
|
|
93
94
|
] }) })
|
|
94
95
|
] });
|
|
95
96
|
}
|
|
96
97
|
export {
|
|
97
|
-
|
|
98
|
+
z as P
|
|
98
99
|
};
|
|
99
|
-
//# sourceMappingURL=pagination-
|
|
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-
|
|
3860
|
+
//# sourceMappingURL=schemas-H10xB2M_.js.map
|