@cloudflare/kumo 1.4.1 → 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 +30 -0
- package/README.md +15 -7
- package/ai/component-registry.json +55 -131
- package/ai/component-registry.md +182 -135
- package/ai/schemas.ts +6 -4
- 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/button-Bh96oxRL.js.map +1 -1
- package/dist/catalog.js +1 -1
- package/dist/{checkbox-C1LPq8eL.js → checkbox-CWANiedi.js} +3 -3
- package/dist/{checkbox-C1LPq8eL.js.map → checkbox-CWANiedi.js.map} +1 -1
- package/dist/{clipboard-text-CJSI9X2m.js → clipboard-text-B32_yb2r.js} +10 -10
- package/dist/clipboard-text-B32_yb2r.js.map +1 -0
- package/dist/{combobox-CWxn5aHA.js → combobox-C9koouxM.js} +4 -4
- package/dist/{combobox-CWxn5aHA.js.map → combobox-C9koouxM.js.map} +1 -1
- package/dist/command-line/cli.js +16 -17
- package/dist/command-line/commands/ai.js +2 -3
- package/dist/{command-palette-J50WKjS7.js → command-palette-TGXgr6Vq.js} +2 -2
- package/dist/{command-palette-J50WKjS7.js.map → command-palette-TGXgr6Vq.js.map} +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/input.js +8 -7
- package/dist/components/label.js +1 -1
- package/dist/components/link.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/popover.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/toast.js +5 -4
- package/dist/components/tooltip.js +1 -1
- package/dist/dialog-CpCeOqSZ.js +97 -0
- package/dist/dialog-CpCeOqSZ.js.map +1 -0
- package/dist/{dropdown-BAyk1knz.js → dropdown-DFeFcKfn.js} +3 -3
- package/dist/{dropdown-BAyk1knz.js.map → dropdown-DFeFcKfn.js.map} +1 -1
- package/dist/{field-B7ORz5ej.js → field-Dt-XuSaQ.js} +3 -3
- package/dist/{field-B7ORz5ej.js.map → field-Dt-XuSaQ.js.map} +1 -1
- package/dist/index.js +137 -124
- package/dist/index.js.map +1 -1
- package/dist/{input-D6YgDfDG.js → input-GZAWBXYX.js} +3 -3
- package/dist/{input-D6YgDfDG.js.map → input-GZAWBXYX.js.map} +1 -1
- package/dist/{input-area-DN_Ncliw.js → input-area-CS1-ceY4.js} +21 -19
- package/dist/input-area-CS1-ceY4.js.map +1 -0
- package/dist/{input-group-BXzBwH4p.js → input-group-COo-wz5O.js} +2 -2
- package/dist/{input-group-BXzBwH4p.js.map → input-group-COo-wz5O.js.map} +1 -1
- package/dist/label-ChZ2Pp5p.js +58 -0
- package/dist/label-ChZ2Pp5p.js.map +1 -0
- package/dist/{link-CcuZKqob.js → link-Mj2WM1AS.js} +2 -2
- package/dist/{link-CcuZKqob.js.map → link-Mj2WM1AS.js.map} +1 -1
- package/dist/{menubar-CzimiryS.js → menubar-CbXWXQYR.js} +2 -2
- package/dist/{menubar-CzimiryS.js.map → menubar-CbXWXQYR.js.map} +1 -1
- package/dist/{meter-BrJnHJ3Q.js → meter-Bu5f3mAc.js} +2 -2
- package/dist/{meter-BrJnHJ3Q.js.map → meter-Bu5f3mAc.js.map} +1 -1
- package/dist/{pagination-D0x9KQSk.js → pagination-Cf-yRO-n.js} +21 -20
- package/dist/pagination-Cf-yRO-n.js.map +1 -0
- package/dist/{popover-CtKDH8Yc.js → popover-D7yeRosi.js} +2 -2
- package/dist/{popover-CtKDH8Yc.js.map → popover-D7yeRosi.js.map} +1 -1
- package/dist/primitives/accordion.js +1 -1
- package/dist/primitives/alert-dialog.js +1 -1
- package/dist/primitives/autocomplete.js +1 -1
- package/dist/primitives/avatar.js +1 -1
- package/dist/primitives/button.js +1 -1
- package/dist/primitives/checkbox-group.js +1 -1
- package/dist/primitives/checkbox.js +1 -1
- package/dist/primitives/collapsible.js +1 -1
- package/dist/primitives/combobox.js +1 -1
- package/dist/primitives/context-menu.js +1 -1
- package/dist/primitives/dialog.js +1 -1
- package/dist/primitives/direction-provider.js +1 -1
- package/dist/primitives/field.js +1 -1
- package/dist/primitives/fieldset.js +1 -1
- package/dist/primitives/form.js +1 -1
- package/dist/primitives/input.js +1 -1
- package/dist/primitives/menu.js +1 -1
- package/dist/primitives/menubar.js +1 -1
- package/dist/primitives/meter.js +1 -1
- package/dist/primitives/navigation-menu.js +1 -1
- package/dist/primitives/number-field.js +1 -1
- package/dist/primitives/popover.js +1 -1
- package/dist/primitives/preview-card.js +1 -1
- package/dist/primitives/progress.js +1 -1
- package/dist/primitives/radio-group.js +1 -1
- package/dist/primitives/radio.js +1 -1
- package/dist/primitives/scroll-area.js +1 -1
- package/dist/primitives/select.js +1 -1
- package/dist/primitives/separator.js +1 -1
- package/dist/primitives/slider.js +1 -1
- package/dist/primitives/switch.js +1 -1
- package/dist/primitives/tabs.js +1 -1
- package/dist/primitives/toast.js +1 -1
- package/dist/primitives/toggle-group.js +1 -1
- package/dist/primitives/toggle.js +1 -1
- package/dist/primitives/toolbar.js +1 -1
- package/dist/primitives/tooltip.js +1 -1
- package/dist/primitives.js +1 -1
- package/dist/{radio-CYejLANA.js → radio-CKn09bGo.js} +2 -2
- package/dist/{radio-CYejLANA.js.map → radio-CKn09bGo.js.map} +1 -1
- package/dist/{schemas-DCw6TIy0.js → schemas-H10xB2M_.js} +10 -9
- package/dist/{schemas-DCw6TIy0.js.map → schemas-H10xB2M_.js.map} +1 -1
- package/dist/{select-D4rKQAax.js → select-DvpgiOau.js} +3 -3
- package/dist/{select-D4rKQAax.js.map → select-DvpgiOau.js.map} +1 -1
- package/dist/{sensitive-input-DYvAmxkN.js → sensitive-input-BuYT6U6C.js} +4 -4
- package/dist/{sensitive-input-DYvAmxkN.js.map → sensitive-input-BuYT6U6C.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/button/button.d.ts +20 -12
- package/dist/src/components/button/button.d.ts.map +1 -1
- package/dist/src/components/dialog/dialog.d.ts +54 -13
- package/dist/src/components/dialog/dialog.d.ts.map +1 -1
- package/dist/src/components/dialog/index.d.ts +1 -1
- package/dist/src/components/dialog/index.d.ts.map +1 -1
- package/dist/src/components/input/index.d.ts +1 -1
- package/dist/src/components/input/index.d.ts.map +1 -1
- package/dist/src/components/input/input-area.d.ts +19 -0
- package/dist/src/components/input/input-area.d.ts.map +1 -1
- package/dist/src/components/label/label.d.ts +5 -3
- package/dist/src/components/label/label.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/src/components/toast/index.d.ts +1 -1
- package/dist/src/components/toast/index.d.ts.map +1 -1
- package/dist/src/components/toast/toast.d.ts +2 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/styles/kumo-standalone.css +1 -1
- package/dist/{switch-z7FE1nQE.js → switch-Tu34uFoa.js} +3 -3
- package/dist/{switch-z7FE1nQE.js.map → switch-Tu34uFoa.js.map} +1 -1
- package/dist/table-DtUrZ2Rj.js +149 -0
- package/dist/table-DtUrZ2Rj.js.map +1 -0
- package/dist/{tabs-DAEeuQLd.js → tabs-B7THfqHW.js} +2 -2
- package/dist/{tabs-DAEeuQLd.js.map → tabs-B7THfqHW.js.map} +1 -1
- package/dist/{toast-B8ebpHaU.js → toast-Du4y8qng.js} +16 -14
- package/dist/{toast-B8ebpHaU.js.map → toast-Du4y8qng.js.map} +1 -1
- package/dist/{tooltip-C4DRhJi1.js → tooltip-BxV1H6AV.js} +2 -2
- package/dist/{tooltip-C4DRhJi1.js.map → tooltip-BxV1H6AV.js.map} +1 -1
- package/dist/{vendor-base-ui-kX0wjdav.js → vendor-base-ui-CQ6wEonS.js} +5 -5
- package/dist/{vendor-base-ui-kX0wjdav.js.map → vendor-base-ui-CQ6wEonS.js.map} +1 -1
- package/package.json +1 -1
- package/scripts/component-registry/index.ts +68 -12
- package/scripts/css-build.ts +47 -1
- package/dist/clipboard-text-CJSI9X2m.js.map +0 -1
- package/dist/dialog-x9n9wI13.js +0 -77
- package/dist/dialog-x9n9wI13.js.map +0 -1
- package/dist/input-area-DN_Ncliw.js.map +0 -1
- package/dist/label-B4FY8MX_.js +0 -50
- package/dist/label-B4FY8MX_.js.map +0 -1
- package/dist/pagination-D0x9KQSk.js.map +0 -1
- package/dist/table-Sd2Etb1N.js +0 -153
- package/dist/table-Sd2Etb1N.js.map +0 -1
package/package.json
CHANGED
|
@@ -317,36 +317,92 @@ function generatePropsFromType(
|
|
|
317
317
|
|
|
318
318
|
// Follow $ref chain to get the actual definition
|
|
319
319
|
// This handles cases like: ExpandableProps -> React.PropsWithChildren<...>
|
|
320
|
-
while (
|
|
320
|
+
while (
|
|
321
|
+
mainDef.$ref &&
|
|
322
|
+
!mainDef.properties &&
|
|
323
|
+
!mainDef.allOf &&
|
|
324
|
+
!mainDef.anyOf &&
|
|
325
|
+
!mainDef.oneOf
|
|
326
|
+
) {
|
|
321
327
|
const refName = decodeURIComponent(mainDef.$ref.split("/").pop()!);
|
|
322
328
|
const refDef = schema.definitions?.[refName] as Definition;
|
|
323
329
|
if (!refDef) break;
|
|
324
330
|
mainDef = refDef;
|
|
325
331
|
}
|
|
326
332
|
|
|
327
|
-
//
|
|
333
|
+
// Helper: collect properties and required fields from a schema part
|
|
328
334
|
// biome-ignore lint/suspicious/noExplicitAny: JSON Schema types are complex
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
335
|
+
function collectFromParts(parts: Definition[]): {
|
|
336
|
+
// biome-ignore lint/suspicious/noExplicitAny: JSON Schema types are complex
|
|
337
|
+
properties: Record<string, any>;
|
|
338
|
+
required: string[];
|
|
339
|
+
} {
|
|
340
|
+
// biome-ignore lint/suspicious/noExplicitAny: JSON Schema types are complex
|
|
341
|
+
let properties: Record<string, any> = {};
|
|
342
|
+
let required: string[] = [];
|
|
343
|
+
|
|
344
|
+
for (const part of parts) {
|
|
334
345
|
if (part.$ref) {
|
|
335
|
-
const refName = part.$ref.split("/").pop()
|
|
346
|
+
const refName = decodeURIComponent(part.$ref.split("/").pop()!);
|
|
336
347
|
const refDef = schema.definitions?.[refName] as Definition;
|
|
337
348
|
if (refDef?.properties) {
|
|
338
|
-
|
|
349
|
+
properties = { ...properties, ...refDef.properties };
|
|
339
350
|
}
|
|
340
351
|
if (refDef?.required) {
|
|
341
|
-
|
|
352
|
+
required = [...required, ...(refDef.required as string[])];
|
|
353
|
+
}
|
|
354
|
+
// Recursively handle nested allOf/anyOf in referenced definitions
|
|
355
|
+
if (refDef?.allOf) {
|
|
356
|
+
const nested = collectFromParts(refDef.allOf as Definition[]);
|
|
357
|
+
properties = { ...properties, ...nested.properties };
|
|
358
|
+
required = [...required, ...nested.required];
|
|
342
359
|
}
|
|
343
360
|
} else if (part.properties) {
|
|
344
|
-
|
|
361
|
+
properties = { ...properties, ...part.properties };
|
|
345
362
|
if (part.required) {
|
|
346
|
-
|
|
363
|
+
required = [...required, ...(part.required as string[])];
|
|
347
364
|
}
|
|
348
365
|
}
|
|
349
366
|
}
|
|
367
|
+
return { properties, required };
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Handle intersection types (allOf) - merge all properties
|
|
371
|
+
// biome-ignore lint/suspicious/noExplicitAny: JSON Schema types are complex
|
|
372
|
+
let allProperties: Record<string, any> = {};
|
|
373
|
+
let allRequired: string[] = [];
|
|
374
|
+
|
|
375
|
+
if (mainDef.allOf) {
|
|
376
|
+
const result = collectFromParts(mainDef.allOf as Definition[]);
|
|
377
|
+
allProperties = result.properties;
|
|
378
|
+
allRequired = result.required;
|
|
379
|
+
} else if (mainDef.anyOf || mainDef.oneOf) {
|
|
380
|
+
// Handle union types (anyOf/oneOf) — e.g. discriminated unions like ButtonProps
|
|
381
|
+
// Merge properties from all union members. Properties that only appear in
|
|
382
|
+
// some members are marked as optional.
|
|
383
|
+
const unionMembers = (mainDef.anyOf || mainDef.oneOf) as Definition[];
|
|
384
|
+
// biome-ignore lint/suspicious/noExplicitAny: JSON Schema types are complex
|
|
385
|
+
const memberProps: Array<{
|
|
386
|
+
// biome-ignore lint/suspicious/noExplicitAny: JSON Schema types are complex
|
|
387
|
+
properties: Record<string, any>;
|
|
388
|
+
required: string[];
|
|
389
|
+
}> = [];
|
|
390
|
+
|
|
391
|
+
for (const member of unionMembers) {
|
|
392
|
+
const collected = collectFromParts([member]);
|
|
393
|
+
memberProps.push(collected);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Merge all member properties
|
|
397
|
+
for (const mp of memberProps) {
|
|
398
|
+
allProperties = { ...allProperties, ...mp.properties };
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// A prop is required only if it's required in ALL union members
|
|
402
|
+
const allPropNames = Object.keys(allProperties);
|
|
403
|
+
allRequired = allPropNames.filter((prop) =>
|
|
404
|
+
memberProps.every((mp) => mp.required.includes(prop)),
|
|
405
|
+
);
|
|
350
406
|
} else if (mainDef.properties) {
|
|
351
407
|
allProperties = mainDef.properties;
|
|
352
408
|
allRequired = (mainDef.required as string[]) || [];
|
package/scripts/css-build.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { copyFileSync, mkdirSync, existsSync } from "fs";
|
|
1
|
+
import { copyFileSync, mkdirSync, existsSync, readdirSync, statSync } from "fs";
|
|
2
2
|
import { join, dirname } from "path";
|
|
3
3
|
import { fileURLToPath } from "url";
|
|
4
4
|
import { execSync } from "child_process";
|
|
@@ -8,6 +8,8 @@ const __dirname = dirname(__filename);
|
|
|
8
8
|
|
|
9
9
|
const srcDir = join(__dirname, "../src/styles");
|
|
10
10
|
const distDir = join(__dirname, "../dist/styles");
|
|
11
|
+
const blocksSrcDir = join(__dirname, "../src/blocks");
|
|
12
|
+
const blocksDistDir = join(__dirname, "../dist/src/blocks");
|
|
11
13
|
|
|
12
14
|
// Create dist/styles directory if it doesn't exist
|
|
13
15
|
if (!existsSync(distDir)) {
|
|
@@ -53,3 +55,47 @@ try {
|
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
console.log("✅ CSS build complete");
|
|
58
|
+
|
|
59
|
+
// Copy block source files to dist for CLI `kumo add` command
|
|
60
|
+
console.log("📦 Copying block source files...");
|
|
61
|
+
|
|
62
|
+
function copyBlockFiles(srcDir: string, destDir: string): void {
|
|
63
|
+
if (!existsSync(srcDir)) {
|
|
64
|
+
console.warn(`⚠ Warning: blocks source directory not found at ${srcDir}`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const blockDirs = readdirSync(srcDir).filter((item) => {
|
|
69
|
+
const itemPath = join(srcDir, item);
|
|
70
|
+
return statSync(itemPath).isDirectory();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
for (const blockDir of blockDirs) {
|
|
74
|
+
const blockSrcPath = join(srcDir, blockDir);
|
|
75
|
+
const blockDestPath = join(destDir, blockDir);
|
|
76
|
+
|
|
77
|
+
// Create destination directory
|
|
78
|
+
if (!existsSync(blockDestPath)) {
|
|
79
|
+
mkdirSync(blockDestPath, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Copy only .tsx files (source files needed by CLI)
|
|
83
|
+
// We skip index.ts barrel files to avoid TypeScript resolution issues
|
|
84
|
+
// in other packages that might reference dist/src/blocks
|
|
85
|
+
const files = readdirSync(blockSrcPath);
|
|
86
|
+
for (const file of files) {
|
|
87
|
+
if (file.endsWith(".tsx")) {
|
|
88
|
+
const srcFile = join(blockSrcPath, file);
|
|
89
|
+
const destFile = join(blockDestPath, file);
|
|
90
|
+
// Only copy if it's a file (not directory)
|
|
91
|
+
if (statSync(srcFile).isFile()) {
|
|
92
|
+
copyFileSync(srcFile, destFile);
|
|
93
|
+
console.log(` ✓ Copied ${blockDir}/${file}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
copyBlockFiles(blocksSrcDir, blocksDistDir);
|
|
101
|
+
console.log("✅ Block source files copied");
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard-text-CJSI9X2m.js","sources":["../src/components/clipboard-text/clipboard-text.tsx"],"sourcesContent":["import { CheckIcon, ClipboardIcon } 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 /> : <ClipboardIcon />}\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","ClipboardIcon"],"mappings":"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"}
|
package/dist/dialog-x9n9wI13.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsxs as r, jsx as s } from "react/jsx-runtime";
|
|
3
|
-
import { S as c } from "./surface-BIC6CXiz.js";
|
|
4
|
-
import { c as o } from "./cn-Bhsu1vx2.js";
|
|
5
|
-
import { a9 as g, aa as d, ab as m, ac as p, ad as D, ae as f, af as u, ag as x } from "./vendor-base-ui-kX0wjdav.js";
|
|
6
|
-
const w = {
|
|
7
|
-
size: {
|
|
8
|
-
base: {
|
|
9
|
-
classes: "sm:min-w-96",
|
|
10
|
-
description: "Default dialog width"
|
|
11
|
-
},
|
|
12
|
-
sm: {
|
|
13
|
-
classes: "min-w-72",
|
|
14
|
-
description: "Small dialog for simple confirmations"
|
|
15
|
-
},
|
|
16
|
-
lg: {
|
|
17
|
-
classes: "min-w-[32rem]",
|
|
18
|
-
description: "Large dialog for complex content"
|
|
19
|
-
},
|
|
20
|
-
xl: {
|
|
21
|
-
classes: "min-w-[48rem]",
|
|
22
|
-
description: "Extra large dialog for detailed views"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}, t = {
|
|
26
|
-
size: "base"
|
|
27
|
-
};
|
|
28
|
-
function y({
|
|
29
|
-
size: i = t.size
|
|
30
|
-
} = {}) {
|
|
31
|
-
return o(
|
|
32
|
-
// Base styles
|
|
33
|
-
"shadow-m z-modal fixed top-1/2 left-1/2 w-full sm:w-auto max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-3rem)] -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-xl bg-kumo-base text-kumo-default duration-150 data-ending-style:scale-90 data-ending-style:opacity-0 data-starting-style:scale-90 data-starting-style:opacity-0",
|
|
34
|
-
// Apply size from KUMO_DIALOG_VARIANTS
|
|
35
|
-
w.size[i].classes
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
function T({
|
|
39
|
-
className: i,
|
|
40
|
-
children: e,
|
|
41
|
-
style: l,
|
|
42
|
-
size: n = t.size
|
|
43
|
-
}) {
|
|
44
|
-
return /* @__PURE__ */ r(f, { children: [
|
|
45
|
-
/* @__PURE__ */ s(u, { className: "z-modal fixed inset-0 bg-kumo-overlay opacity-80 transition-all duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0" }),
|
|
46
|
-
/* @__PURE__ */ s(
|
|
47
|
-
c,
|
|
48
|
-
{
|
|
49
|
-
as: x,
|
|
50
|
-
className: o(y({ size: n }), i),
|
|
51
|
-
style: {
|
|
52
|
-
transitionProperty: "scale, opacity",
|
|
53
|
-
transitionTimingFunction: "var(--default-transition-timing-function)",
|
|
54
|
-
"--tw-shadow": "0 20px 25px -5px rgb(0 0 0 / 0.03), 0 8px 10px -6px rgb(0 0 0 / 0.03)",
|
|
55
|
-
...l
|
|
56
|
-
},
|
|
57
|
-
children: e
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
] });
|
|
61
|
-
}
|
|
62
|
-
const a = Object.assign(T, {
|
|
63
|
-
Root: D,
|
|
64
|
-
Trigger: p,
|
|
65
|
-
Title: m,
|
|
66
|
-
Description: d,
|
|
67
|
-
Close: g
|
|
68
|
-
}), R = a.Root, h = a.Trigger, C = a.Title, O = a.Description, S = a.Close;
|
|
69
|
-
export {
|
|
70
|
-
a as D,
|
|
71
|
-
R as a,
|
|
72
|
-
h as b,
|
|
73
|
-
C as c,
|
|
74
|
-
O as d,
|
|
75
|
-
S as e
|
|
76
|
-
};
|
|
77
|
-
//# sourceMappingURL=dialog-x9n9wI13.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dialog-x9n9wI13.js","sources":["../src/components/dialog/dialog.tsx"],"sourcesContent":["import type { CSSProperties, FC, ReactNode } from \"react\";\nimport { Dialog as DialogBase } from \"@base-ui/react/dialog\";\nimport { Surface } from \"../surface\";\nimport { cn } from \"../../utils/cn\";\n\n/** Dialog size variant definitions mapping sizes to their minimum widths. */\nexport const KUMO_DIALOG_VARIANTS = {\n size: {\n base: {\n classes: \"sm:min-w-96\",\n description: \"Default dialog width\",\n },\n sm: {\n classes: \"min-w-72\",\n description: \"Small dialog for simple confirmations\",\n },\n lg: {\n classes: \"min-w-[32rem]\",\n description: \"Large dialog for complex content\",\n },\n xl: {\n classes: \"min-w-[48rem]\",\n description: \"Extra large dialog for detailed views\",\n },\n },\n} as const;\n\nexport const KUMO_DIALOG_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport const KUMO_DIALOG_STYLING = {\n dimensions: {\n sm: {\n width: 350,\n titleSize: 20,\n descSize: 16,\n padding: 16,\n gap: 8,\n buttonSize: \"sm\",\n },\n base: {\n width: 384,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n lg: {\n width: 512,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n xl: {\n width: 768,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n },\n baseTokens: {\n background: \"color-surface\",\n text: \"text-color-surface\",\n borderRadius: 12,\n shadow: \"shadow-m\",\n },\n backdrop: {\n background: \"color-surface-secondary\",\n opacity: 0.8,\n },\n header: {\n title: { fontWeight: 600, color: \"text-color-surface\" },\n closeIcon: { name: \"ph-x\", size: 20, color: \"text-color-muted\" },\n },\n description: {\n fontWeight: 400,\n color: \"text-color-muted\",\n },\n buttons: {\n primary: { background: \"color-primary\", text: \"white\" },\n secondary: { ring: \"color-border\", text: \"text-color-surface\" },\n },\n} as const;\n\n// Derived types from KUMO_DIALOG_VARIANTS\nexport type KumoDialogSize = keyof typeof KUMO_DIALOG_VARIANTS.size;\n\nexport interface KumoDialogVariantsProps {\n /**\n * Dialog width.\n * - `\"sm\"` — Small (min 288px) for simple confirmations\n * - `\"base\"` — Default (min 384px)\n * - `\"lg\"` — Large (min 512px) for complex content\n * - `\"xl\"` — Extra large (min 768px) for detailed views\n * @default \"base\"\n */\n size?: KumoDialogSize;\n}\n\nexport function dialogVariants({\n size = KUMO_DIALOG_DEFAULT_VARIANTS.size,\n}: KumoDialogVariantsProps = {}) {\n return cn(\n // Base styles\n \"shadow-m z-modal fixed top-1/2 left-1/2 w-full sm:w-auto max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-3rem)] -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-xl bg-kumo-base text-kumo-default duration-150 data-ending-style:scale-90 data-ending-style:opacity-0 data-starting-style:scale-90 data-starting-style:opacity-0\",\n // Apply size from KUMO_DIALOG_VARIANTS\n KUMO_DIALOG_VARIANTS.size[size].classes,\n );\n}\n\n/**\n * Dialog component props — the modal content panel.\n *\n * @example\n * ```tsx\n * <Dialog.Root>\n * <Dialog.Trigger render={(p) => <Button {...p}>Open</Button>} />\n * <Dialog className=\"p-8\">\n * <Dialog.Title>Confirm Action</Dialog.Title>\n * <Dialog.Description>Are you sure?</Dialog.Description>\n * <Dialog.Close render={(p) => <Button {...p}>Cancel</Button>} />\n * </Dialog>\n * </Dialog.Root>\n * ```\n */\nexport type DialogProps = KumoDialogVariantsProps & {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Dialog content (typically Title, Description, Close, and action buttons). */\n children: ReactNode;\n /** Inline styles. */\n style?: CSSProperties;\n};\n\n/**\n * Modal dialog overlay with backdrop. Compound component with `Dialog.Root`,\n * `Dialog.Trigger`, `Dialog.Title`, `Dialog.Description`, and `Dialog.Close`.\n *\n * @example\n * ```tsx\n * <Dialog.Root>\n * <Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />\n * <Dialog className=\"p-8\">\n * <Dialog.Title>Delete Item</Dialog.Title>\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n * <Dialog.Close render={(p) => <Button variant=\"destructive\" {...p}>Delete</Button>} />\n * </Dialog>\n * </Dialog.Root>\n * ```\n */\nfunction DialogContent({\n className,\n children,\n style,\n size = KUMO_DIALOG_DEFAULT_VARIANTS.size,\n}: DialogProps) {\n return (\n <DialogBase.Portal>\n <DialogBase.Backdrop className=\"z-modal fixed inset-0 bg-kumo-overlay opacity-80 transition-all duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0\" />\n <Surface\n as={DialogBase.Popup}\n className={cn(dialogVariants({ size }), className)}\n style={\n {\n transitionProperty: \"scale, opacity\",\n transitionTimingFunction:\n \"var(--default-transition-timing-function)\",\n \"--tw-shadow\":\n \"0 20px 25px -5px rgb(0 0 0 / 0.03), 0 8px 10px -6px rgb(0 0 0 / 0.03)\",\n ...style,\n } as CSSProperties\n }\n >\n {children}\n </Surface>\n </DialogBase.Portal>\n );\n}\n\ntype DialogComponent = FC<DialogProps> & {\n Root: typeof DialogBase.Root;\n Trigger: typeof DialogBase.Trigger;\n Title: typeof DialogBase.Title;\n Description: typeof DialogBase.Description;\n Close: typeof DialogBase.Close;\n};\n\nconst Dialog = Object.assign(DialogContent, {\n Root: DialogBase.Root,\n Trigger: DialogBase.Trigger,\n Title: DialogBase.Title,\n Description: DialogBase.Description,\n Close: DialogBase.Close,\n}) as DialogComponent;\n\nconst DialogRoot = Dialog.Root;\nconst DialogTrigger = Dialog.Trigger;\nconst DialogTitle = Dialog.Title;\nconst DialogDescription = Dialog.Description;\nconst DialogClose = Dialog.Close;\n\nexport {\n Dialog,\n DialogRoot,\n DialogTrigger,\n DialogTitle,\n DialogDescription,\n DialogClose,\n};\n"],"names":["KUMO_DIALOG_VARIANTS","KUMO_DIALOG_DEFAULT_VARIANTS","dialogVariants","size","cn","DialogContent","className","children","style","jsxs","DialogBase.Portal","jsx","DialogBase.Backdrop","Surface","DialogBase.Popup","Dialog","DialogBase.Root","DialogBase.Trigger","DialogBase.Title","DialogBase.Description","DialogBase.Close","DialogRoot","DialogTrigger","DialogTitle","DialogDescription","DialogClose"],"mappings":";;;;;AAMO,MAAMA,IAAuB;AAAA,EAClC,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,IAAI;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,IAAI;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,IAAI;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAA+B;AAAA,EAC1C,MAAM;AACR;AA4EO,SAASC,EAAe;AAAA,EAC7B,MAAAC,IAAOF,EAA6B;AACtC,IAA6B,IAAI;AAC/B,SAAOG;AAAA;AAAA,IAEL;AAAA;AAAA,IAEAJ,EAAqB,KAAKG,CAAI,EAAE;AAAA,EAAA;AAEpC;AA0CA,SAASE,EAAc;AAAA,EACrB,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAL,IAAOF,EAA6B;AACtC,GAAgB;AACd,SACE,gBAAAQ,EAACC,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAoB,WAAU,yIAAA,CAAyI;AAAA,IACxK,gBAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,IAAIC;AAAAA,QACJ,WAAWV,EAAGF,EAAe,EAAE,MAAAC,EAAA,CAAM,GAAGG,CAAS;AAAA,QACjD,OACE;AAAA,UACE,oBAAoB;AAAA,UACpB,0BACE;AAAA,UACF,eACE;AAAA,UACF,GAAGE;AAAA,QAAA;AAAA,QAIN,UAAAD;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAUA,MAAMQ,IAAS,OAAO,OAAOV,GAAe;AAAA,EAC1C,MAAMW;AAAAA,EACN,SAASC;AAAAA,EACT,OAAOC;AAAAA,EACP,aAAaC;AAAAA,EACb,OAAOC;AACT,CAAC,GAEKC,IAAaN,EAAO,MACpBO,IAAgBP,EAAO,SACvBQ,IAAcR,EAAO,OACrBS,IAAoBT,EAAO,aAC3BU,IAAcV,EAAO;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-area-DN_Ncliw.js","sources":["../src/components/input/input-area.tsx"],"sourcesContent":["import { inputVariants } from \"./input\";\nimport { cn } from \"../../utils/cn\";\nimport { useCallback, type ReactNode } from \"react\";\nimport * as React from \"react\";\nimport { Field as KumoField, type FieldErrorMatch } from \"../field/field\";\n\nexport const InputArea = React.forwardRef<HTMLTextAreaElement, InputAreaProps>(\n (props, ref) => {\n const {\n className,\n onValueChange,\n size = \"base\",\n variant = \"default\",\n onChange,\n label,\n labelTooltip,\n description,\n error,\n ...inputProps\n } = props;\n\n // Extract required from inputProps to pass to Field for label decoration\n const { required } = inputProps;\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n onValueChange?.(event.target.value);\n },\n [onChange, onValueChange],\n );\n\n const textarea = (\n <textarea\n ref={ref}\n className={cn(\n inputVariants({ size, variant, focusIndicator: true }),\n \"h-auto py-2\", // Input variant always come with size, but it does not apply for textarea\n className,\n )}\n onChange={handleChange}\n {...inputProps}\n />\n );\n\n // Render with Field wrapper if label is provided\n if (label) {\n return (\n <KumoField\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {textarea}\n </KumoField>\n );\n }\n\n // Render bare textarea without Field wrapper\n return textarea;\n },\n);\n\nInputArea.displayName = \"InputArea\";\n\n/**\n * InputArea component props\n * @property {ReactNode} [label] - Label content for the textarea (enables Field wrapper)\n * @property {ReactNode} [description] - Helper text displayed below the textarea\n * @property {string | { message: ReactNode, match: FieldErrorMatch }} [error] - Error message or validation error object\n */\nexport type InputAreaProps = {\n onValueChange?: (value: string) => void;\n variant?: \"default\" | \"error\";\n size?: \"xs\" | \"sm\" | \"base\" | \"lg\";\n // Then other custom props\n children?: React.ReactNode;\n className?: string;\n /** Label content for the textarea (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the textarea */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n\n // Finally, spread the native input props (least important)\n} & Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\">;\n"],"names":["InputArea","React","props","ref","className","onValueChange","size","variant","onChange","label","labelTooltip","description","error","inputProps","required","handleChange","useCallback","event","textarea","jsx","cn","inputVariants","KumoField"],"mappings":";;;;;;;AAMO,MAAMA,IAAYC,EAAM;AAAA,EAC7B,CAACC,GAAOC,MAAQ;AACd,UAAM;AAAA,MACJ,WAAAC;AAAA,MACA,eAAAC;AAAA,MACA,MAAAC,IAAO;AAAA,MACP,SAAAC,IAAU;AAAA,MACV,UAAAC;AAAA,MACA,OAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,OAAAC;AAAA,MACA,GAAGC;AAAA,IAAA,IACDX,GAGE,EAAE,UAAAY,MAAaD,GACfE,IAAeC;AAAA,MACnB,CAACC,MAAkD;AACjD,QAAAT,IAAWS,CAAK,GAChBZ,IAAgBY,EAAM,OAAO,KAAK;AAAA,MACpC;AAAA,MACA,CAACT,GAAUH,CAAa;AAAA,IAAA,GAGpBa,IACJ,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAhB;AAAA,QACA,WAAWiB;AAAA,UACTC,EAAc,EAAE,MAAAf,GAAM,SAAAC,GAAS,gBAAgB,IAAM;AAAA,UACrD;AAAA;AAAA,UACAH;AAAA,QAAA;AAAA,QAEF,UAAUW;AAAA,QACT,GAAGF;AAAA,MAAA;AAAA,IAAA;AAKR,WAAIJ,IAEA,gBAAAU;AAAA,MAACG;AAAAA,MAAA;AAAA,QACC,OAAAb;AAAA,QACA,UAAAK;AAAA,QACA,cAAAJ;AAAA,QACA,aAAAC;AAAA,QACA,OACEC,IACI,OAAOA,KAAU,WACf,EAAE,SAASA,GAAO,OAAO,GAAA,IACzBA,IACF;AAAA,QAGL,UAAAM;AAAA,MAAA;AAAA,IAAA,IAMAA;AAAA,EACT;AACF;AAEAlB,EAAU,cAAc;"}
|
package/dist/label-B4FY8MX_.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx as n, jsxs as c, Fragment as m } from "react/jsx-runtime";
|
|
3
|
-
import { Info as f } from "@phosphor-icons/react";
|
|
4
|
-
import { c as e } from "./cn-Bhsu1vx2.js";
|
|
5
|
-
import { T as p } from "./tooltip-C4DRhJi1.js";
|
|
6
|
-
const h = {
|
|
7
|
-
// Label currently has no variant options but structure is ready for future additions
|
|
8
|
-
}, N = {};
|
|
9
|
-
function u(t = {}) {
|
|
10
|
-
return e(
|
|
11
|
-
// Base styles - when used standalone, apply text styling
|
|
12
|
-
// When used inside Field, the parent FieldBase.Label provides these styles
|
|
13
|
-
"text-base font-medium text-kumo-default"
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
function o() {
|
|
17
|
-
return e(
|
|
18
|
-
// Content wrapper styles - always applied
|
|
19
|
-
"inline-flex items-center gap-1"
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
function d({
|
|
23
|
-
children: t,
|
|
24
|
-
showOptional: l = !1,
|
|
25
|
-
tooltip: a,
|
|
26
|
-
className: r,
|
|
27
|
-
asContent: i = !1
|
|
28
|
-
}) {
|
|
29
|
-
const s = /* @__PURE__ */ c(m, { children: [
|
|
30
|
-
t,
|
|
31
|
-
l && /* @__PURE__ */ n("span", { className: "font-normal text-kumo-strong", children: "(optional)" }),
|
|
32
|
-
a && /* @__PURE__ */ n(p, { content: a, children: /* @__PURE__ */ n(
|
|
33
|
-
f,
|
|
34
|
-
{
|
|
35
|
-
className: "size-4 cursor-help text-kumo-strong",
|
|
36
|
-
"aria-label": "More information"
|
|
37
|
-
}
|
|
38
|
-
) })
|
|
39
|
-
] });
|
|
40
|
-
return i ? /* @__PURE__ */ n("span", { className: e(o(), r), children: s }) : /* @__PURE__ */ n("span", { className: e(u(), o(), r), children: s });
|
|
41
|
-
}
|
|
42
|
-
d.displayName = "Label";
|
|
43
|
-
export {
|
|
44
|
-
h as K,
|
|
45
|
-
d as L,
|
|
46
|
-
o as a,
|
|
47
|
-
N as b,
|
|
48
|
-
u as l
|
|
49
|
-
};
|
|
50
|
-
//# sourceMappingURL=label-B4FY8MX_.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"label-B4FY8MX_.js","sources":["../src/components/label/label.tsx"],"sourcesContent":["import { Info } from \"@phosphor-icons/react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Tooltip } from \"../tooltip\";\n\n/** Label variant definitions (currently empty, reserved for future additions). */\nexport const KUMO_LABEL_VARIANTS = {\n // Label currently has no variant options but structure is ready for future additions\n} as const;\n\nexport const KUMO_LABEL_DEFAULT_VARIANTS = {} as const;\n\n// Derived types from KUMO_LABEL_VARIANTS\nexport interface KumoLabelVariantsProps {}\n\nexport function labelVariants(_props: KumoLabelVariantsProps = {}) {\n return cn(\n // Base styles - when used standalone, apply text styling\n // When used inside Field, the parent FieldBase.Label provides these styles\n \"text-base font-medium text-kumo-default\",\n );\n}\n\nexport function labelContentVariants() {\n return cn(\n // Content wrapper styles - always applied\n \"inline-flex items-center gap-1\",\n );\n}\n\n/**\n * Label component props.\n *\n * @example\n * ```tsx\n * <Label>Email</Label>\n * <Label showOptional>Middle Name</Label>\n * <Label tooltip=\"We'll use this to send you updates\">Email</Label>\n * ```\n */\nexport interface LabelProps extends KumoLabelVariantsProps {\n /** The label content — can be a string or any React node. */\n children: ReactNode;\n /** When `true`, shows gray \"(optional)\" text after the label. */\n showOptional?: boolean;\n /** Tooltip content displayed next to the label via an info icon. */\n tooltip?: ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /**\n * When `true`, only renders the inline content (indicators, tooltip) without\n * the outer span with font styling. Useful when composed inside another\n * label element that already provides the text styling.\n * @default false\n */\n asContent?: boolean;\n}\n\n/**\n * Label component for form fields.\n *\n * Provides a standardized way to display labels with optional indicators:\n * - Optional indicator: gray \"(optional)\" text when `showOptional={true}`\n * - Tooltip: info icon with hover tooltip for additional context\n *\n * @example\n * // Basic label\n * <Label>Email</Label>\n *\n * @example\n * // Optional field with indicator\n * <Label showOptional>Middle Name</Label>\n *\n * @example\n * // With tooltip\n * <Label tooltip=\"We'll use this to send you updates\">Email</Label>\n *\n * @example\n * // With ReactNode children\n * <Label>\n * <span>Custom label with <strong>bold</strong> text</span>\n * </Label>\n */\nexport function Label({\n children,\n showOptional = false,\n tooltip,\n className,\n asContent = false,\n}: LabelProps) {\n const content = (\n <>\n {children}\n {showOptional && (\n <span className=\"font-normal text-kumo-strong\">(optional)</span>\n )}\n {tooltip && (\n <Tooltip content={tooltip}>\n <Info\n className=\"size-4 cursor-help text-kumo-strong\"\n aria-label=\"More information\"\n />\n </Tooltip>\n )}\n </>\n );\n\n // When used as content inside another styled element, just render inline\n if (asContent) {\n return (\n <span className={cn(labelContentVariants(), className)}>{content}</span>\n );\n }\n\n // When used standalone, apply full label styling\n return (\n <span className={cn(labelVariants(), labelContentVariants(), className)}>\n {content}\n </span>\n );\n}\n\nLabel.displayName = \"Label\";\n"],"names":["KUMO_LABEL_VARIANTS","KUMO_LABEL_DEFAULT_VARIANTS","labelVariants","_props","cn","labelContentVariants","Label","children","showOptional","tooltip","className","asContent","content","jsxs","Fragment","jsx","Tooltip","Info"],"mappings":";;;;;AAMO,MAAMA,IAAsB;AAAA;AAEnC,GAEaC,IAA8B,CAAA;AAKpC,SAASC,EAAcC,IAAiC,IAAI;AACjE,SAAOC;AAAA;AAAA;AAAA,IAGL;AAAA,EAAA;AAEJ;AAEO,SAASC,IAAuB;AACrC,SAAOD;AAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;AAuDO,SAASE,EAAM;AAAA,EACpB,UAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAAe;AACb,QAAMC,IACJ,gBAAAC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAAP;AAAA,IACAC,KACC,gBAAAO,EAAC,QAAA,EAAK,WAAU,gCAA+B,UAAA,cAAU;AAAA,IAE1DN,KACC,gBAAAM,EAACC,GAAA,EAAQ,SAASP,GAChB,UAAA,gBAAAM;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,cAAW;AAAA,MAAA;AAAA,IAAA,EACb,CACF;AAAA,EAAA,GAEJ;AAIF,SAAIN,IAEA,gBAAAI,EAAC,UAAK,WAAWX,EAAGC,KAAwBK,CAAS,GAAI,UAAAE,GAAQ,IAMnE,gBAAAG,EAAC,QAAA,EAAK,WAAWX,EAAGF,KAAiBG,EAAA,GAAwBK,CAAS,GACnE,UAAAE,EAAA,CACH;AAEJ;AAEAN,EAAM,cAAc;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-D0x9KQSk.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}\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 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 return (\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"grow text-sm text-kumo-strong\">\n {totalCount && totalCount > 0\n ? `Showing ${pageShowingRange} of ${totalCount}`\n : null}\n </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","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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"}
|
package/dist/table-Sd2Etb1N.js
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
-
import { forwardRef as o } from "react";
|
|
4
|
-
import { c as n } from "./cn-Bhsu1vx2.js";
|
|
5
|
-
import { C as b } from "./checkbox-C1LPq8eL.js";
|
|
6
|
-
const m = {
|
|
7
|
-
layout: {
|
|
8
|
-
auto: {
|
|
9
|
-
classes: "",
|
|
10
|
-
description: "Auto table layout - columns resize based on content"
|
|
11
|
-
},
|
|
12
|
-
fixed: {
|
|
13
|
-
classes: "table-fixed",
|
|
14
|
-
description: "Fixed table layout - columns have equal width, controlled via colgroup"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
variant: {
|
|
18
|
-
default: {
|
|
19
|
-
classes: "",
|
|
20
|
-
description: "Default row variant"
|
|
21
|
-
},
|
|
22
|
-
selected: {
|
|
23
|
-
classes: "bg-kumo-tint",
|
|
24
|
-
description: "Selected row variant"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}, k = {
|
|
28
|
-
layout: "auto",
|
|
29
|
-
variant: "default"
|
|
30
|
-
}, p = o(({ layout: a = "auto", ...e }, s) => {
|
|
31
|
-
const l = n(
|
|
32
|
-
"w-full",
|
|
33
|
-
m.layout[a].classes,
|
|
34
|
-
"[&_tr_td]:border-b [&_tr_td]:border-kumo-fill [&_tr:last-child_td]:border-b-0",
|
|
35
|
-
// Row border
|
|
36
|
-
"[&_tr_td]:p-3",
|
|
37
|
-
// Cell padding
|
|
38
|
-
"[&_tr_th]:border-b [&_tr_th]:border-kumo-fill [&_tr_th]:p-3 [&_tr_th]:font-semibold",
|
|
39
|
-
// Header styles
|
|
40
|
-
"[&_tr_th]:bg-kumo-base",
|
|
41
|
-
// Header background color
|
|
42
|
-
"text-left text-kumo-default",
|
|
43
|
-
e.className
|
|
44
|
-
);
|
|
45
|
-
return /* @__PURE__ */ t("table", { ref: s, ...e, className: l });
|
|
46
|
-
}), T = o((a, e) => /* @__PURE__ */ t("thead", { ref: e, ...a })), d = o((a, e) => {
|
|
47
|
-
const s = n("group relative", a.className);
|
|
48
|
-
return /* @__PURE__ */ t("th", { ref: e, ...a, className: s });
|
|
49
|
-
}), f = o(({ variant: a = k.variant, ...e }, s) => {
|
|
50
|
-
const l = n(
|
|
51
|
-
m.variant[a].classes,
|
|
52
|
-
e.className
|
|
53
|
-
);
|
|
54
|
-
return /* @__PURE__ */ t("tr", { ref: s, ...e, className: l });
|
|
55
|
-
}), h = o((a, e) => /* @__PURE__ */ t("tbody", { ref: e, ...a })), u = o((a, e) => /* @__PURE__ */ t("td", { ref: e, ...a })), N = o((a, e) => /* @__PURE__ */ t("tfoot", { ref: e, ...a })), _ = o((a, e) => /* @__PURE__ */ t(
|
|
56
|
-
"button",
|
|
57
|
-
{
|
|
58
|
-
ref: e,
|
|
59
|
-
...a,
|
|
60
|
-
type: "button",
|
|
61
|
-
"aria-label": "Resize column",
|
|
62
|
-
className: n(
|
|
63
|
-
"invisible h-full group-hover:visible",
|
|
64
|
-
// Make the handle invisible by default
|
|
65
|
-
"w-[10px]",
|
|
66
|
-
// Hitting area
|
|
67
|
-
"flex items-center justify-center",
|
|
68
|
-
// Center the handle
|
|
69
|
-
"cursor-col-resize touch-none select-none",
|
|
70
|
-
// Prevent selection and touch events
|
|
71
|
-
"absolute top-0 right-0",
|
|
72
|
-
// Position the handle
|
|
73
|
-
"m-0 bg-kumo-base p-0"
|
|
74
|
-
// Override the stratus button styles
|
|
75
|
-
),
|
|
76
|
-
children: /* @__PURE__ */ t("span", { className: "h-5 w-[2px] rounded bg-kumo-ring" })
|
|
77
|
-
}
|
|
78
|
-
)), y = o(({ checked: a, onValueChange: e, label: s, disabled: l, ...c }, i) => /* @__PURE__ */ t(
|
|
79
|
-
u,
|
|
80
|
-
{
|
|
81
|
-
ref: i,
|
|
82
|
-
...c,
|
|
83
|
-
className: n(
|
|
84
|
-
"cursor-pointer p-0 leading-none",
|
|
85
|
-
l && "cursor-default",
|
|
86
|
-
c.className
|
|
87
|
-
),
|
|
88
|
-
onClick: (r) => {
|
|
89
|
-
r.stopPropagation(), l || e?.(!a);
|
|
90
|
-
},
|
|
91
|
-
children: /* @__PURE__ */ t(
|
|
92
|
-
b,
|
|
93
|
-
{
|
|
94
|
-
checked: a,
|
|
95
|
-
onClick: (r) => r.stopPropagation(),
|
|
96
|
-
onCheckedChange: e,
|
|
97
|
-
"aria-label": s ?? "Select row",
|
|
98
|
-
disabled: l
|
|
99
|
-
}
|
|
100
|
-
)
|
|
101
|
-
}
|
|
102
|
-
)), C = o(({ checked: a, onValueChange: e, label: s, disabled: l, ...c }, i) => /* @__PURE__ */ t(
|
|
103
|
-
d,
|
|
104
|
-
{
|
|
105
|
-
ref: i,
|
|
106
|
-
...c,
|
|
107
|
-
className: n(
|
|
108
|
-
"cursor-pointer p-0 leading-none",
|
|
109
|
-
l && "cursor-default",
|
|
110
|
-
c.className
|
|
111
|
-
),
|
|
112
|
-
onClick: (r) => {
|
|
113
|
-
r.stopPropagation(), l || e?.(!a);
|
|
114
|
-
},
|
|
115
|
-
children: /* @__PURE__ */ t(
|
|
116
|
-
b,
|
|
117
|
-
{
|
|
118
|
-
checked: a,
|
|
119
|
-
onClick: (r) => r.stopPropagation(),
|
|
120
|
-
onCheckedChange: e,
|
|
121
|
-
"aria-label": s ?? "Select all rows",
|
|
122
|
-
disabled: l
|
|
123
|
-
}
|
|
124
|
-
)
|
|
125
|
-
}
|
|
126
|
-
));
|
|
127
|
-
p.displayName = "Table";
|
|
128
|
-
h.displayName = "Table.Body";
|
|
129
|
-
d.displayName = "Table.Head";
|
|
130
|
-
f.displayName = "Table.Row";
|
|
131
|
-
u.displayName = "Table.Cell";
|
|
132
|
-
N.displayName = "Table.Footer";
|
|
133
|
-
T.displayName = "Table.Header";
|
|
134
|
-
_.displayName = "Table.ResizeHandle";
|
|
135
|
-
y.displayName = "Table.CheckCell";
|
|
136
|
-
C.displayName = "Table.CheckHead";
|
|
137
|
-
const x = Object.assign(p, {
|
|
138
|
-
Header: T,
|
|
139
|
-
Head: d,
|
|
140
|
-
Row: f,
|
|
141
|
-
Body: h,
|
|
142
|
-
Cell: u,
|
|
143
|
-
CheckCell: y,
|
|
144
|
-
CheckHead: C,
|
|
145
|
-
Footer: N,
|
|
146
|
-
ResizeHandle: _
|
|
147
|
-
});
|
|
148
|
-
export {
|
|
149
|
-
k as K,
|
|
150
|
-
x as T,
|
|
151
|
-
m as a
|
|
152
|
-
};
|
|
153
|
-
//# sourceMappingURL=table-Sd2Etb1N.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"table-Sd2Etb1N.js","sources":["../src/components/table/table.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { cn } from \"../../utils\";\nimport { Checkbox } from \"../checkbox\";\n\n/** Table layout and row variant definitions mapping names to their Tailwind classes. */\nexport const KUMO_TABLE_VARIANTS = {\n layout: {\n auto: {\n classes: \"\",\n description: \"Auto table layout - columns resize based on content\",\n },\n fixed: {\n classes: \"table-fixed\",\n description:\n \"Fixed table layout - columns have equal width, controlled via colgroup\",\n },\n },\n variant: {\n default: {\n classes: \"\",\n description: \"Default row variant\",\n },\n selected: {\n classes: \"bg-kumo-tint\",\n description: \"Selected row variant\",\n },\n },\n} as const;\n\nexport const KUMO_TABLE_DEFAULT_VARIANTS = {\n layout: \"auto\",\n variant: \"default\",\n} as const;\n\nexport type KumoTableRowVariant = keyof typeof KUMO_TABLE_VARIANTS.variant;\nexport type KumoTableLayout = keyof typeof KUMO_TABLE_VARIANTS.layout;\n\n/**\n * Table root — applies layout, borders, padding, and header styles.\n *\n * @example\n * ```tsx\n * <Table layout=\"fixed\">\n * <Table.Header>\n * <Table.Row>\n * <Table.Head>Name</Table.Head>\n * <Table.Head>Status</Table.Head>\n * </Table.Row>\n * </Table.Header>\n * <Table.Body>\n * <Table.Row>\n * <Table.Cell>Worker A</Table.Cell>\n * <Table.Cell>Active</Table.Cell>\n * </Table.Row>\n * </Table.Body>\n * </Table>\n * ```\n */\nconst TableRoot = forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement> & {\n /**\n * Table layout algorithm.\n * - `\"auto\"` — columns resize based on content\n * - `\"fixed\"` — equal-width columns, controlled via `<colgroup>`\n * @default \"auto\"\n */\n layout?: KumoTableLayout;\n }\n>(({ layout = \"auto\", ...props }, ref) => {\n const className = cn(\n \"w-full\",\n KUMO_TABLE_VARIANTS.layout[layout].classes,\n \"[&_tr_td]:border-b [&_tr_td]:border-kumo-fill [&_tr:last-child_td]:border-b-0\", // Row border\n \"[&_tr_td]:p-3\", // Cell padding\n \"[&_tr_th]:border-b [&_tr_th]:border-kumo-fill [&_tr_th]:p-3 [&_tr_th]:font-semibold\", // Header styles\n \"[&_tr_th]:bg-kumo-base\", // Header background color\n \"text-left text-kumo-default\",\n props.className,\n );\n\n return <table ref={ref} {...props} className={className} />;\n});\n\nconst TableHeader = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>((props, ref) => {\n return <thead ref={ref} {...props} />;\n});\n\nconst TableHead = forwardRef<\n HTMLTableCellElement,\n React.HTMLAttributes<HTMLTableCellElement>\n>((props, ref) => {\n const className = cn(\"group relative\", props.className);\n return <th ref={ref} {...props} className={className} />;\n});\n\nconst TableRow = forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement> & {\n variant?: KumoTableRowVariant;\n }\n>(({ variant = KUMO_TABLE_DEFAULT_VARIANTS.variant, ...props }, ref) => {\n const className = cn(\n KUMO_TABLE_VARIANTS.variant[variant].classes,\n props.className,\n );\n\n return <tr ref={ref} {...props} className={className} />;\n});\n\nconst TableBody = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>((props, ref) => {\n return <tbody ref={ref} {...props} />;\n});\n\nconst TableCell = forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>((props, ref) => {\n return <td ref={ref} {...props} />;\n});\n\nconst TableFooter = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>((props, ref) => {\n return <tfoot ref={ref} {...props} />;\n});\n\nconst TableResizeHandle = forwardRef<\n HTMLButtonElement,\n React.HTMLAttributes<HTMLButtonElement>\n>((props, ref) => {\n return (\n <button\n ref={ref}\n {...props}\n type=\"button\"\n aria-label=\"Resize column\"\n className={cn(\n \"invisible h-full group-hover:visible\", // Make the handle invisible by default\n \"w-[10px]\", // Hitting area\n \"flex items-center justify-center\", // Center the handle\n \"cursor-col-resize touch-none select-none\", // Prevent selection and touch events\n \"absolute top-0 right-0\", // Position the handle\n \"m-0 bg-kumo-base p-0\", // Override the stratus button styles\n )}\n >\n <span className=\"h-5 w-[2px] rounded bg-kumo-ring\" />\n </button>\n );\n});\n\n/**\n * Special cell that makes the entire cell area a hit target for the checkbox.\n */\n\nconst TableCheckCell = forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement> & {\n checked?: boolean;\n onValueChange?: (checked: boolean) => void;\n label?: string;\n disabled?: boolean;\n }\n>(({ checked, onValueChange, label, disabled, ...props }, ref) => {\n return (\n <TableCell\n ref={ref}\n {...props}\n className={cn(\n \"cursor-pointer p-0 leading-none\",\n disabled && \"cursor-default\",\n props.className,\n )}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n onValueChange?.(!checked);\n }\n }}\n >\n <Checkbox\n checked={checked}\n onClick={(e) => e.stopPropagation()}\n onCheckedChange={onValueChange}\n aria-label={label ?? \"Select row\"}\n disabled={disabled}\n />\n </TableCell>\n );\n});\n\nconst TableCheckHead = forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement> & {\n checked?: boolean;\n onValueChange?: (checked: boolean) => void;\n label?: string;\n disabled?: boolean;\n }\n>(({ checked, onValueChange, label, disabled, ...props }, ref) => {\n return (\n <TableHead\n ref={ref}\n {...props}\n className={cn(\n \"cursor-pointer p-0 leading-none\",\n disabled && \"cursor-default\",\n props.className,\n )}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n onValueChange?.(!checked);\n }\n }}\n >\n <Checkbox\n checked={checked}\n onClick={(e) => e.stopPropagation()}\n onCheckedChange={onValueChange}\n aria-label={label ?? \"Select all rows\"}\n disabled={disabled}\n />\n </TableHead>\n );\n});\n\nTableRoot.displayName = \"Table\";\nTableBody.displayName = \"Table.Body\";\nTableHead.displayName = \"Table.Head\";\nTableRow.displayName = \"Table.Row\";\nTableCell.displayName = \"Table.Cell\";\nTableFooter.displayName = \"Table.Footer\";\nTableHeader.displayName = \"Table.Header\";\nTableResizeHandle.displayName = \"Table.ResizeHandle\";\nTableCheckCell.displayName = \"Table.CheckCell\";\nTableCheckHead.displayName = \"Table.CheckHead\";\n\n/**\n * Table — semantic HTML table with styled rows, cells, and selection support.\n *\n * Compound component: `Table` (Root), `.Header`, `.Head`, `.Body`, `.Row`,\n * `.Cell`, `.Footer`, `.CheckCell`, `.CheckHead`, `.ResizeHandle`.\n *\n * @example\n * ```tsx\n * <Table>\n * <Table.Header>\n * <Table.Row>\n * <Table.CheckHead checked={allSelected} onValueChange={toggleAll} />\n * <Table.Head>Name</Table.Head>\n * </Table.Row>\n * </Table.Header>\n * <Table.Body>\n * {rows.map((row) => (\n * <Table.Row key={row.id} variant={selected.has(row.id) ? \"selected\" : \"default\"}>\n * <Table.CheckCell checked={selected.has(row.id)} onValueChange={() => toggle(row.id)} />\n * <Table.Cell>{row.name}</Table.Cell>\n * </Table.Row>\n * ))}\n * </Table.Body>\n * </Table>\n * ```\n */\nexport const Table = Object.assign(TableRoot, {\n Header: TableHeader,\n Head: TableHead,\n Row: TableRow,\n Body: TableBody,\n Cell: TableCell,\n CheckCell: TableCheckCell,\n CheckHead: TableCheckHead,\n Footer: TableFooter,\n ResizeHandle: TableResizeHandle,\n});\n"],"names":["KUMO_TABLE_VARIANTS","KUMO_TABLE_DEFAULT_VARIANTS","TableRoot","forwardRef","layout","props","ref","className","cn","jsx","TableHeader","TableHead","TableRow","variant","TableBody","TableCell","TableFooter","TableResizeHandle","TableCheckCell","checked","onValueChange","label","disabled","e","Checkbox","TableCheckHead","Table"],"mappings":"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"}
|