@kodffe/ui 0.0.0-stage → 0.10.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/dist/_virtual/_rolldown/runtime.js +11 -0
- package/dist/accordion/accordion.d.ts +44 -0
- package/dist/accordion/accordion.js +84 -0
- package/dist/accordion/accordion.js.map +1 -0
- package/dist/alert/alert.d.ts +17 -0
- package/dist/alert/alert.js +59 -0
- package/dist/alert/alert.js.map +1 -0
- package/dist/app-shell/app-footer.d.ts +29 -0
- package/dist/app-shell/app-footer.js +39 -0
- package/dist/app-shell/app-footer.js.map +1 -0
- package/dist/app-shell/app-shell-context.d.ts +10 -0
- package/dist/app-shell/app-shell-context.js +12 -0
- package/dist/app-shell/app-shell-context.js.map +1 -0
- package/dist/app-shell/app-shell.d.ts +42 -0
- package/dist/app-shell/app-shell.js +191 -0
- package/dist/app-shell/app-shell.js.map +1 -0
- package/dist/app-shell/floating-actions.d.ts +19 -0
- package/dist/app-shell/floating-actions.js +59 -0
- package/dist/app-shell/floating-actions.js.map +1 -0
- package/dist/app-shell/workspace-switcher.d.ts +25 -0
- package/dist/app-shell/workspace-switcher.js +82 -0
- package/dist/app-shell/workspace-switcher.js.map +1 -0
- package/dist/badge/badge.d.ts +19 -0
- package/dist/badge/badge.js +59 -0
- package/dist/badge/badge.js.map +1 -0
- package/dist/banner/banner.d.ts +22 -0
- package/dist/banner/banner.js +80 -0
- package/dist/banner/banner.js.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.d.ts +18 -0
- package/dist/breadcrumbs/breadcrumbs.js +45 -0
- package/dist/breadcrumbs/breadcrumbs.js.map +1 -0
- package/dist/button/button.d.ts +38 -0
- package/dist/button/button.js +83 -0
- package/dist/button/button.js.map +1 -0
- package/dist/card/card.d.ts +159 -0
- package/dist/card/card.js +390 -0
- package/dist/card/card.js.map +1 -0
- package/dist/card/insight-card.d.ts +19 -0
- package/dist/card/insight-card.js +51 -0
- package/dist/card/insight-card.js.map +1 -0
- package/dist/card/integration-card.d.ts +19 -0
- package/dist/card/integration-card.js +70 -0
- package/dist/card/integration-card.js.map +1 -0
- package/dist/charts/charts.d.ts +75 -0
- package/dist/charts/charts.js +453 -0
- package/dist/charts/charts.js.map +1 -0
- package/dist/choice/choice.d.ts +39 -0
- package/dist/choice/choice.js +143 -0
- package/dist/choice/choice.js.map +1 -0
- package/dist/combobox/combobox.d.ts +46 -0
- package/dist/combobox/combobox.js +196 -0
- package/dist/combobox/combobox.js.map +1 -0
- package/dist/command-palette/command-palette.d.ts +35 -0
- package/dist/command-palette/command-palette.js +164 -0
- package/dist/command-palette/command-palette.js.map +1 -0
- package/dist/confirm-dialog/confirm-dialog.d.ts +37 -0
- package/dist/confirm-dialog/confirm-dialog.js +106 -0
- package/dist/confirm-dialog/confirm-dialog.js.map +1 -0
- package/dist/content/assistant.d.ts +86 -0
- package/dist/content/assistant.js +213 -0
- package/dist/content/assistant.js.map +1 -0
- package/dist/content/content.d.ts +45 -0
- package/dist/content/content.js +136 -0
- package/dist/content/content.js.map +1 -0
- package/dist/data-display/avatar-sizes.d.ts +8 -0
- package/dist/data-display/avatar-sizes.js +12 -0
- package/dist/data-display/avatar-sizes.js.map +1 -0
- package/dist/data-display/avatar.d.ts +21 -0
- package/dist/data-display/avatar.js +53 -0
- package/dist/data-display/avatar.js.map +1 -0
- package/dist/data-display/chip.d.ts +20 -0
- package/dist/data-display/chip.js +64 -0
- package/dist/data-display/chip.js.map +1 -0
- package/dist/data-display/code-block.d.ts +14 -0
- package/dist/data-display/code-block.js +50 -0
- package/dist/data-display/code-block.js.map +1 -0
- package/dist/data-display/data-display.d.ts +73 -0
- package/dist/data-display/data-display.js +227 -0
- package/dist/data-display/data-display.js.map +1 -0
- package/dist/data-display/insights.d.ts +120 -0
- package/dist/data-display/insights.js +220 -0
- package/dist/data-display/insights.js.map +1 -0
- package/dist/data-table/cells.d.ts +86 -0
- package/dist/data-table/cells.js +163 -0
- package/dist/data-table/cells.js.map +1 -0
- package/dist/data-table/data-table.d.ts +112 -0
- package/dist/data-table/data-table.js +558 -0
- package/dist/data-table/data-table.js.map +1 -0
- package/dist/date-picker/date-picker.d.ts +61 -0
- package/dist/date-picker/date-picker.js +309 -0
- package/dist/date-picker/date-picker.js.map +1 -0
- package/dist/drawer/drawer.d.ts +32 -0
- package/dist/drawer/drawer.js +72 -0
- package/dist/drawer/drawer.js.map +1 -0
- package/dist/empty-state/empty-state.d.ts +25 -0
- package/dist/empty-state/empty-state.js +78 -0
- package/dist/empty-state/empty-state.js.map +1 -0
- package/dist/error-state/error-state.d.ts +19 -0
- package/dist/error-state/error-state.js +56 -0
- package/dist/error-state/error-state.js.map +1 -0
- package/dist/event-calendar/calendar-logic.test.d.ts +1 -0
- package/dist/event-calendar/dates.d.ts +35 -0
- package/dist/event-calendar/dates.js +55 -0
- package/dist/event-calendar/dates.js.map +1 -0
- package/dist/event-calendar/event-calendar.d.ts +125 -0
- package/dist/event-calendar/event-calendar.js +795 -0
- package/dist/event-calendar/event-calendar.js.map +1 -0
- package/dist/event-calendar/event-details.d.ts +50 -0
- package/dist/event-calendar/event-details.js +124 -0
- package/dist/event-calendar/event-details.js.map +1 -0
- package/dist/event-calendar/layout.d.ts +48 -0
- package/dist/event-calendar/layout.js +55 -0
- package/dist/event-calendar/layout.js.map +1 -0
- package/dist/file-upload/file-upload.d.ts +70 -0
- package/dist/file-upload/file-upload.js +307 -0
- package/dist/file-upload/file-upload.js.map +1 -0
- package/dist/filters/filters.d.ts +48 -0
- package/dist/filters/filters.js +103 -0
- package/dist/filters/filters.js.map +1 -0
- package/dist/form-field/form-field.d.ts +39 -0
- package/dist/form-field/form-field.js +88 -0
- package/dist/form-field/form-field.js.map +1 -0
- package/dist/hover-card/hover-card.d.ts +15 -0
- package/dist/hover-card/hover-card.js +27 -0
- package/dist/hover-card/hover-card.js.map +1 -0
- package/dist/hover-card/person-hover-card.d.ts +26 -0
- package/dist/hover-card/person-hover-card.js +85 -0
- package/dist/hover-card/person-hover-card.js.map +1 -0
- package/dist/icon/icon-tile.d.ts +20 -0
- package/dist/icon/icon-tile.js +55 -0
- package/dist/icon/icon-tile.js.map +1 -0
- package/dist/icon/icon.d.ts +14 -0
- package/dist/icon/icon.js +28 -0
- package/dist/icon/icon.js.map +1 -0
- package/dist/icon/icons.generated.d.ts +358 -0
- package/dist/icon/icons.generated.js +362 -0
- package/dist/icon/icons.generated.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +88 -0
- package/dist/input/extra-inputs.d.ts +122 -0
- package/dist/input/extra-inputs.js +351 -0
- package/dist/input/extra-inputs.js.map +1 -0
- package/dist/input/field-styles.d.ts +5 -0
- package/dist/input/field-styles.js +14 -0
- package/dist/input/field-styles.js.map +1 -0
- package/dist/input/input.d.ts +50 -0
- package/dist/input/input.js +107 -0
- package/dist/input/input.js.map +1 -0
- package/dist/layout/layout.d.ts +41 -0
- package/dist/layout/layout.js +90 -0
- package/dist/layout/layout.js.map +1 -0
- package/dist/lib/control-styles.d.ts +9 -0
- package/dist/lib/control-styles.js +16 -0
- package/dist/lib/control-styles.js.map +1 -0
- package/dist/lib/cx.d.ts +2 -0
- package/dist/lib/cx.js +8 -0
- package/dist/lib/cx.js.map +1 -0
- package/dist/lib/glyphs.d.ts +13 -0
- package/dist/lib/glyphs.js +67 -0
- package/dist/lib/glyphs.js.map +1 -0
- package/dist/lib/segmented-styles.d.ts +8 -0
- package/dist/lib/segmented-styles.js +12 -0
- package/dist/lib/segmented-styles.js.map +1 -0
- package/dist/lib/select-on-arrow.d.ts +7 -0
- package/dist/lib/select-on-arrow.js +21 -0
- package/dist/lib/select-on-arrow.js.map +1 -0
- package/dist/lib/skip-link.d.ts +5 -0
- package/dist/lib/skip-link.js +13 -0
- package/dist/lib/skip-link.js.map +1 -0
- package/dist/lib/use-media-query.d.ts +4 -0
- package/dist/lib/use-media-query.js +15 -0
- package/dist/lib/use-media-query.js.map +1 -0
- package/dist/lists/lists.d.ts +76 -0
- package/dist/lists/lists.js +133 -0
- package/dist/lists/lists.js.map +1 -0
- package/dist/locale-switch/locale-switch.d.ts +29 -0
- package/dist/locale-switch/locale-switch.js +62 -0
- package/dist/locale-switch/locale-switch.js.map +1 -0
- package/dist/logo/logo.d.ts +31 -0
- package/dist/logo/logo.js +157 -0
- package/dist/logo/logo.js.map +1 -0
- package/dist/logo/product-logo.d.ts +19 -0
- package/dist/logo/product-logo.js +46 -0
- package/dist/logo/product-logo.js.map +1 -0
- package/dist/marketing/marketing.d.ts +176 -0
- package/dist/marketing/marketing.js +451 -0
- package/dist/marketing/marketing.js.map +1 -0
- package/dist/marketing/newsletter-form.d.ts +21 -0
- package/dist/marketing/newsletter-form.js +100 -0
- package/dist/marketing/newsletter-form.js.map +1 -0
- package/dist/mascot/mascot.d.ts +28 -0
- package/dist/mascot/mascot.js +28 -0
- package/dist/mascot/mascot.js.map +1 -0
- package/dist/mascot/mascots.generated.d.ts +284 -0
- package/dist/mascot/mascots.generated.js +287 -0
- package/dist/mascot/mascots.generated.js.map +1 -0
- package/dist/master-detail/master-detail.d.ts +30 -0
- package/dist/master-detail/master-detail.js +71 -0
- package/dist/master-detail/master-detail.js.map +1 -0
- package/dist/menu/account-menu.d.ts +44 -0
- package/dist/menu/account-menu.js +78 -0
- package/dist/menu/account-menu.js.map +1 -0
- package/dist/menu/context-menu.d.ts +31 -0
- package/dist/menu/context-menu.js +111 -0
- package/dist/menu/context-menu.js.map +1 -0
- package/dist/menu/dropdown-menu.d.ts +49 -0
- package/dist/menu/dropdown-menu.js +152 -0
- package/dist/menu/dropdown-menu.js.map +1 -0
- package/dist/menu/menu-styles.d.ts +8 -0
- package/dist/menu/menu-styles.js +6 -0
- package/dist/menu/menu-styles.js.map +1 -0
- package/dist/menu/menubar.d.ts +31 -0
- package/dist/menu/menubar.js +125 -0
- package/dist/menu/menubar.js.map +1 -0
- package/dist/modal/modal.d.ts +34 -0
- package/dist/modal/modal.js +58 -0
- package/dist/modal/modal.js.map +1 -0
- package/dist/notification-center/notification-center.d.ts +51 -0
- package/dist/notification-center/notification-center.js +244 -0
- package/dist/notification-center/notification-center.js.map +1 -0
- package/dist/otp-input/otp-input.d.ts +23 -0
- package/dist/otp-input/otp-input.js +61 -0
- package/dist/otp-input/otp-input.js.map +1 -0
- package/dist/overlay/overlay.d.ts +53 -0
- package/dist/overlay/overlay.js +103 -0
- package/dist/overlay/overlay.js.map +1 -0
- package/dist/page-header/page-header.d.ts +55 -0
- package/dist/page-header/page-header.js +114 -0
- package/dist/page-header/page-header.js.map +1 -0
- package/dist/page-header/record-headers.d.ts +51 -0
- package/dist/page-header/record-headers.js +134 -0
- package/dist/page-header/record-headers.js.map +1 -0
- package/dist/page-header/section-header.d.ts +21 -0
- package/dist/page-header/section-header.js +44 -0
- package/dist/page-header/section-header.js.map +1 -0
- package/dist/page-navigation/page-navigation.d.ts +59 -0
- package/dist/page-navigation/page-navigation.js +136 -0
- package/dist/page-navigation/page-navigation.js.map +1 -0
- package/dist/pagination/pagination.d.ts +28 -0
- package/dist/pagination/pagination.js +102 -0
- package/dist/pagination/pagination.js.map +1 -0
- package/dist/phone-input/phone-input.d.ts +34 -0
- package/dist/phone-input/phone-input.js +171 -0
- package/dist/phone-input/phone-input.js.map +1 -0
- package/dist/popover/popover.d.ts +23 -0
- package/dist/popover/popover.js +40 -0
- package/dist/popover/popover.js.map +1 -0
- package/dist/progress/progress.d.ts +21 -0
- package/dist/progress/progress.js +49 -0
- package/dist/progress/progress.js.map +1 -0
- package/dist/segmented-control/segmented-control.d.ts +32 -0
- package/dist/segmented-control/segmented-control.js +29 -0
- package/dist/segmented-control/segmented-control.js.map +1 -0
- package/dist/select/select.d.ts +48 -0
- package/dist/select/select.js +136 -0
- package/dist/select/select.js.map +1 -0
- package/dist/settings/permission-matrix.d.ts +29 -0
- package/dist/settings/permission-matrix.js +101 -0
- package/dist/settings/permission-matrix.js.map +1 -0
- package/dist/settings/settings-row.d.ts +32 -0
- package/dist/settings/settings-row.js +63 -0
- package/dist/settings/settings-row.js.map +1 -0
- package/dist/side-nav/side-nav.d.ts +36 -0
- package/dist/side-nav/side-nav.js +123 -0
- package/dist/side-nav/side-nav.js.map +1 -0
- package/dist/site-header/site-header.d.ts +32 -0
- package/dist/site-header/site-header.js +99 -0
- package/dist/site-header/site-header.js.map +1 -0
- package/dist/skeleton/skeleton.d.ts +16 -0
- package/dist/skeleton/skeleton.js +19 -0
- package/dist/skeleton/skeleton.js.map +1 -0
- package/dist/slider/slider.d.ts +15 -0
- package/dist/slider/slider.js +48 -0
- package/dist/slider/slider.js.map +1 -0
- package/dist/spinner/spinner.d.ts +15 -0
- package/dist/spinner/spinner.js +42 -0
- package/dist/spinner/spinner.js.map +1 -0
- package/dist/stepper/step-dots.d.ts +16 -0
- package/dist/stepper/step-dots.js +26 -0
- package/dist/stepper/step-dots.js.map +1 -0
- package/dist/stepper/stepper.d.ts +26 -0
- package/dist/stepper/stepper.js +113 -0
- package/dist/stepper/stepper.js.map +1 -0
- package/dist/tabs/tabs.d.ts +31 -0
- package/dist/tabs/tabs.js +66 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/templates/app-templates.d.ts +126 -0
- package/dist/templates/app-templates.js +153 -0
- package/dist/templates/app-templates.js.map +1 -0
- package/dist/templates/site-templates.d.ts +49 -0
- package/dist/templates/site-templates.js +110 -0
- package/dist/templates/site-templates.js.map +1 -0
- package/dist/toast/toast-store.d.ts +54 -0
- package/dist/toast/toast-store.js +49 -0
- package/dist/toast/toast-store.js.map +1 -0
- package/dist/toast/toaster.d.ts +15 -0
- package/dist/toast/toaster.js +124 -0
- package/dist/toast/toaster.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +29 -0
- package/dist/tooltip/tooltip.js +54 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/package.json +88 -3
- package/styles.css +521 -0
- package/README.md +0 -3
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { IconName } from '../icon/icon';
|
|
3
|
+
import { type AvatarProps } from '../data-display/avatar';
|
|
4
|
+
export interface CellSwitchProps {
|
|
5
|
+
checked: boolean;
|
|
6
|
+
onCheckedChange: (checked: boolean) => void;
|
|
7
|
+
/** Accessible name, e.g. "Enable Lead intake". Required: the cell has no visible label. */
|
|
8
|
+
label: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** An on/off toggle that applies immediately (enable an automation, a member, a kiosk). */
|
|
12
|
+
export declare function CellSwitch({ checked, onCheckedChange, label, disabled }: CellSwitchProps): import("react").JSX.Element;
|
|
13
|
+
export interface CellAction {
|
|
14
|
+
icon: IconName;
|
|
15
|
+
/** Accessible name and tooltip ("Edit", "Run now", "History", "Delete"). */
|
|
16
|
+
label: string;
|
|
17
|
+
onClick: () => void;
|
|
18
|
+
tone?: 'default' | 'danger';
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** A row of icon buttons for 1–4 frequent actions. More than that: use a DropdownMenu in `rowActions`. */
|
|
22
|
+
export declare function CellActions({ actions, className }: {
|
|
23
|
+
actions: CellAction[];
|
|
24
|
+
className?: string;
|
|
25
|
+
}): import("react").JSX.Element;
|
|
26
|
+
export interface CellStackProps {
|
|
27
|
+
title: ReactNode;
|
|
28
|
+
/** Next to the title (a Badge). */
|
|
29
|
+
badge?: ReactNode;
|
|
30
|
+
/** Small line under the title (category, owner). */
|
|
31
|
+
meta?: ReactNode;
|
|
32
|
+
/** Longer text, clamped to two lines. */
|
|
33
|
+
description?: ReactNode;
|
|
34
|
+
/** A leading color dot or icon tile (see `CellLead`). */
|
|
35
|
+
lead?: ReactNode;
|
|
36
|
+
}
|
|
37
|
+
/** Multi-line cell: title + badge, a meta line and a two-line description (projects, automations). */
|
|
38
|
+
export declare function CellStack({ title, badge, meta, description, lead }: CellStackProps): import("react").JSX.Element;
|
|
39
|
+
export interface CellLeadProps {
|
|
40
|
+
/** A colour dot (any CSS color, usually `var(--kf-category-N)`). */
|
|
41
|
+
color?: string;
|
|
42
|
+
/** An icon tile instead of a dot; tinted with `color` when given. */
|
|
43
|
+
icon?: IconName;
|
|
44
|
+
children?: ReactNode;
|
|
45
|
+
}
|
|
46
|
+
/** A colour dot or an icon tile before the first cell's text, with the text beside it. */
|
|
47
|
+
export declare function CellLead({ color, icon, children }: CellLeadProps): import("react").JSX.Element;
|
|
48
|
+
/** Monospace value (ids, keys, codes, cron expressions). */
|
|
49
|
+
export declare function CellMono({ children }: {
|
|
50
|
+
children: ReactNode;
|
|
51
|
+
}): import("react").JSX.Element;
|
|
52
|
+
export interface EntityCellProps {
|
|
53
|
+
/** Primary line (a person's or a company's name). Also the avatar's initials and accessible name. */
|
|
54
|
+
name: string;
|
|
55
|
+
/** Secondary line (email, role, location). */
|
|
56
|
+
secondary?: ReactNode;
|
|
57
|
+
/** Photo URL; initials when missing. Pass `avatar={false}` to hide the avatar. */
|
|
58
|
+
src?: string;
|
|
59
|
+
avatar?: boolean;
|
|
60
|
+
/** Presence or a custom status dot (see `Avatar`). */
|
|
61
|
+
status?: AvatarProps['status'];
|
|
62
|
+
statusColor?: string;
|
|
63
|
+
statusLabel?: string;
|
|
64
|
+
/** Makes the name a link (to the record's page). */
|
|
65
|
+
href?: string;
|
|
66
|
+
}
|
|
67
|
+
/** Two-line cell for people and companies: avatar, name and a secondary line (staff, clients, members). */
|
|
68
|
+
export declare function EntityCell({ name, secondary, src, avatar, status, statusColor, statusLabel, href, }: EntityCellProps): import("react").JSX.Element;
|
|
69
|
+
/** Stacked tags in a cell; after `max`, a "+N" with the rest in its title. */
|
|
70
|
+
export declare function CellTags({ tags, max }: {
|
|
71
|
+
tags: string[];
|
|
72
|
+
max?: number;
|
|
73
|
+
}): import("react").JSX.Element;
|
|
74
|
+
export interface CellNumberProps {
|
|
75
|
+
value: number | null | undefined;
|
|
76
|
+
/** `Intl.NumberFormat` options (currency, percent, decimals). */
|
|
77
|
+
format?: Intl.NumberFormatOptions;
|
|
78
|
+
/** BCP 47 locale (default `en-US`); pass the page's locale. */
|
|
79
|
+
locale?: string;
|
|
80
|
+
/** Shows + / − and colors gains and losses (deltas, balances). */
|
|
81
|
+
signed?: boolean;
|
|
82
|
+
/** For `signed`: a lower value is better (costs, errors). */
|
|
83
|
+
invert?: boolean;
|
|
84
|
+
}
|
|
85
|
+
/** A right-aligned number with tabular figures, locale formatting and optional sign coloring. Use with `align: 'end'`. */
|
|
86
|
+
export declare function CellNumber({ value, format, locale, signed, invert }: CellNumberProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../lib/cx.js";
|
|
3
|
+
import { IconButton as t } from "../button/button.js";
|
|
4
|
+
import { Avatar as n } from "../data-display/avatar.js";
|
|
5
|
+
import { focusRing as r, switchThumb as i, switchTrack as a } from "../lib/control-styles.js";
|
|
6
|
+
import { IconTile as o } from "../icon/icon-tile.js";
|
|
7
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
|
+
import * as l from "@radix-ui/react-switch";
|
|
9
|
+
//#region src/data-table/cells.tsx
|
|
10
|
+
var u = (e) => e.stopPropagation();
|
|
11
|
+
function d({ checked: t, onCheckedChange: n, label: o, disabled: c }) {
|
|
12
|
+
return /* @__PURE__ */ s("span", {
|
|
13
|
+
onClick: u,
|
|
14
|
+
className: "inline-flex align-middle",
|
|
15
|
+
children: /* @__PURE__ */ s(l.Root, {
|
|
16
|
+
checked: t,
|
|
17
|
+
onCheckedChange: n,
|
|
18
|
+
disabled: c,
|
|
19
|
+
"aria-label": o,
|
|
20
|
+
className: e(a("sm"), r),
|
|
21
|
+
children: /* @__PURE__ */ s(l.Thumb, { className: i("sm") })
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function f({ actions: n, className: r }) {
|
|
26
|
+
return /* @__PURE__ */ s("span", {
|
|
27
|
+
onClick: u,
|
|
28
|
+
className: e("inline-flex items-center justify-end gap-0.5", r),
|
|
29
|
+
children: n.map((e) => /* @__PURE__ */ s(t, {
|
|
30
|
+
icon: e.icon,
|
|
31
|
+
label: e.label,
|
|
32
|
+
size: "sm",
|
|
33
|
+
variant: e.tone === "danger" ? "danger" : "ghost",
|
|
34
|
+
disabled: e.disabled,
|
|
35
|
+
onClick: e.onClick
|
|
36
|
+
}, e.label))
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function p({ title: e, badge: t, meta: n, description: r, lead: i }) {
|
|
40
|
+
return /* @__PURE__ */ c("span", {
|
|
41
|
+
className: "flex min-w-0 items-start gap-3",
|
|
42
|
+
children: [i, /* @__PURE__ */ c("span", {
|
|
43
|
+
className: "grid min-w-0 gap-0.5",
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ c("span", {
|
|
46
|
+
className: "flex flex-wrap items-center gap-2",
|
|
47
|
+
children: [/* @__PURE__ */ s("span", {
|
|
48
|
+
className: "font-semibold text-fg",
|
|
49
|
+
children: e
|
|
50
|
+
}), t]
|
|
51
|
+
}),
|
|
52
|
+
n && /* @__PURE__ */ s("span", {
|
|
53
|
+
className: "text-xs text-fg-muted",
|
|
54
|
+
children: n
|
|
55
|
+
}),
|
|
56
|
+
r && /* @__PURE__ */ s("span", {
|
|
57
|
+
className: "line-clamp-2 max-w-[48ch] text-sm text-fg-muted",
|
|
58
|
+
children: r
|
|
59
|
+
})
|
|
60
|
+
]
|
|
61
|
+
})]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function m({ color: t, icon: n, children: r }) {
|
|
65
|
+
let i = n ? /* @__PURE__ */ s(o, {
|
|
66
|
+
icon: n,
|
|
67
|
+
size: "sm",
|
|
68
|
+
tone: "muted",
|
|
69
|
+
color: t,
|
|
70
|
+
colorStyle: "soft"
|
|
71
|
+
}) : /* @__PURE__ */ s("span", {
|
|
72
|
+
"aria-hidden": "true",
|
|
73
|
+
className: "mt-1.5 size-2.5 shrink-0 rounded-full",
|
|
74
|
+
style: { background: t ?? "var(--kf-fg-muted)" }
|
|
75
|
+
});
|
|
76
|
+
return r === void 0 ? i : /* @__PURE__ */ c("span", {
|
|
77
|
+
className: e("flex min-w-0 gap-2.5", n ? "items-center" : "items-start"),
|
|
78
|
+
children: [i, /* @__PURE__ */ s("span", {
|
|
79
|
+
className: "min-w-0",
|
|
80
|
+
children: r
|
|
81
|
+
})]
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function h({ children: e }) {
|
|
85
|
+
return /* @__PURE__ */ s("span", {
|
|
86
|
+
className: "font-mono text-[13px] text-fg",
|
|
87
|
+
children: e
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function g({ name: e, secondary: t, src: r, avatar: i = !0, status: a, statusColor: o, statusLabel: l, href: d }) {
|
|
91
|
+
return /* @__PURE__ */ c("span", {
|
|
92
|
+
className: "flex min-w-0 items-center gap-2.5",
|
|
93
|
+
children: [i && /* @__PURE__ */ s(n, {
|
|
94
|
+
name: e,
|
|
95
|
+
src: r,
|
|
96
|
+
size: "sm",
|
|
97
|
+
status: a,
|
|
98
|
+
statusColor: o,
|
|
99
|
+
statusLabel: l,
|
|
100
|
+
decorative: !0
|
|
101
|
+
}), /* @__PURE__ */ c("span", {
|
|
102
|
+
className: "grid min-w-0",
|
|
103
|
+
children: [
|
|
104
|
+
d ? /* @__PURE__ */ s("a", {
|
|
105
|
+
href: d,
|
|
106
|
+
onClick: u,
|
|
107
|
+
className: "truncate font-medium text-fg no-underline hover:text-link hover:underline focus-visible:rounded-xs focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus",
|
|
108
|
+
children: e
|
|
109
|
+
}) : /* @__PURE__ */ s("span", {
|
|
110
|
+
className: "truncate font-medium text-fg",
|
|
111
|
+
children: e
|
|
112
|
+
}),
|
|
113
|
+
t && /* @__PURE__ */ s("span", {
|
|
114
|
+
className: "truncate text-xs text-fg-muted",
|
|
115
|
+
children: t
|
|
116
|
+
}),
|
|
117
|
+
l && /* @__PURE__ */ s("span", {
|
|
118
|
+
className: "sr-only",
|
|
119
|
+
children: l
|
|
120
|
+
})
|
|
121
|
+
]
|
|
122
|
+
})]
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function _({ tags: e, max: t = 3 }) {
|
|
126
|
+
let n = e.slice(0, t), r = e.slice(t);
|
|
127
|
+
return /* @__PURE__ */ c("span", {
|
|
128
|
+
className: "flex max-w-64 flex-wrap gap-1",
|
|
129
|
+
children: [n.map((e) => /* @__PURE__ */ s("span", {
|
|
130
|
+
className: "rounded-full bg-surface-muted px-2 py-0.5 text-xs font-semibold text-fg",
|
|
131
|
+
children: e
|
|
132
|
+
}, e)), r.length > 0 && /* @__PURE__ */ c("span", {
|
|
133
|
+
title: r.join(", "),
|
|
134
|
+
className: "rounded-full px-1.5 py-0.5 text-xs font-semibold text-fg-muted",
|
|
135
|
+
children: [
|
|
136
|
+
"+",
|
|
137
|
+
r.length,
|
|
138
|
+
/* @__PURE__ */ c("span", {
|
|
139
|
+
className: "sr-only",
|
|
140
|
+
children: [": ", r.join(", ")]
|
|
141
|
+
})
|
|
142
|
+
]
|
|
143
|
+
})]
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function v({ value: t, format: n, locale: r, signed: i, invert: a }) {
|
|
147
|
+
if (t == null || Number.isNaN(t)) return /* @__PURE__ */ s("span", {
|
|
148
|
+
className: "text-fg-muted",
|
|
149
|
+
children: "—"
|
|
150
|
+
});
|
|
151
|
+
let o = new Intl.NumberFormat(r ?? "en-US", {
|
|
152
|
+
...n,
|
|
153
|
+
...i ? { signDisplay: "exceptZero" } : {}
|
|
154
|
+
}).format(t);
|
|
155
|
+
return /* @__PURE__ */ s("span", {
|
|
156
|
+
className: e("tabular-nums", i && t !== 0 && ((a ? t < 0 : t > 0) ? "text-success-fg" : "text-danger-fg")),
|
|
157
|
+
children: o.replace(/^-/, "−")
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//#endregion
|
|
161
|
+
export { f as CellActions, m as CellLead, h as CellMono, v as CellNumber, p as CellStack, d as CellSwitch, _ as CellTags, g as EntityCell };
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=cells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cells.js","names":["RadixSwitch","stop","CellSwitch","label","cx","switchTrack","focusRing","switchThumb","CellActions","className","actions","IconButton","a","CellStack","lead","title","badge","meta","description","CellLead","mark","icon","IconTile","color","children","CellMono","EntityCell","avatar","Avatar","href","name","secondary","statusLabel","CellTags","shown","tags","max","rest","t","CellNumber","value","text","locale","format","signed","invert"],"sources":["../../src/data-table/cells.tsx"],"sourcesContent":["'use client';\n\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { focusRing, switchThumb, switchTrack } from '../lib/control-styles';\nimport { IconTile } from '../icon/icon-tile';\nimport type { IconName } from '../icon/icon';\nimport { IconButton } from '../button/button';\nimport { Avatar, type AvatarProps } from '../data-display/avatar';\n\n/*\n * Cell helpers for DataTable columns (`cell: (row) => …`). Interactive cells stop click propagation,\n * so a table with `onRowClick` does not open the row when a switch or an action is used.\n */\n\nconst stop = (e: { stopPropagation: () => void }) => e.stopPropagation();\n\nexport interface CellSwitchProps {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n /** Accessible name, e.g. \"Enable Lead intake\". Required: the cell has no visible label. */\n label: string;\n disabled?: boolean;\n}\n\n/** An on/off toggle that applies immediately (enable an automation, a member, a kiosk). */\nexport function CellSwitch({ checked, onCheckedChange, label, disabled }: CellSwitchProps) {\n return (\n <span onClick={stop} className=\"inline-flex align-middle\">\n <RadixSwitch.Root\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n aria-label={label}\n className={cx(switchTrack('sm'), focusRing)}\n >\n <RadixSwitch.Thumb className={switchThumb('sm')} />\n </RadixSwitch.Root>\n </span>\n );\n}\n\nexport interface CellAction {\n icon: IconName;\n /** Accessible name and tooltip (\"Edit\", \"Run now\", \"History\", \"Delete\"). */\n label: string;\n onClick: () => void;\n tone?: 'default' | 'danger';\n disabled?: boolean;\n}\n\n/** A row of icon buttons for 1–4 frequent actions. More than that: use a DropdownMenu in `rowActions`. */\nexport function CellActions({ actions, className }: { actions: CellAction[]; className?: string }) {\n return (\n <span onClick={stop} className={cx('inline-flex items-center justify-end gap-0.5', className)}>\n {actions.map((a) => (\n <IconButton\n key={a.label}\n icon={a.icon}\n label={a.label}\n size=\"sm\"\n variant={a.tone === 'danger' ? 'danger' : 'ghost'}\n disabled={a.disabled}\n onClick={a.onClick}\n />\n ))}\n </span>\n );\n}\n\nexport interface CellStackProps {\n title: ReactNode;\n /** Next to the title (a Badge). */\n badge?: ReactNode;\n /** Small line under the title (category, owner). */\n meta?: ReactNode;\n /** Longer text, clamped to two lines. */\n description?: ReactNode;\n /** A leading color dot or icon tile (see `CellLead`). */\n lead?: ReactNode;\n}\n\n/** Multi-line cell: title + badge, a meta line and a two-line description (projects, automations). */\nexport function CellStack({ title, badge, meta, description, lead }: CellStackProps) {\n return (\n <span className=\"flex min-w-0 items-start gap-3\">\n {lead}\n <span className=\"grid min-w-0 gap-0.5\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-semibold text-fg\">{title}</span>\n {badge}\n </span>\n {meta && <span className=\"text-xs text-fg-muted\">{meta}</span>}\n {description && <span className=\"line-clamp-2 max-w-[48ch] text-sm text-fg-muted\">{description}</span>}\n </span>\n </span>\n );\n}\n\nexport interface CellLeadProps {\n /** A colour dot (any CSS color, usually `var(--kf-category-N)`). */\n color?: string;\n /** An icon tile instead of a dot; tinted with `color` when given. */\n icon?: IconName;\n children?: ReactNode;\n}\n\n/** A colour dot or an icon tile before the first cell's text, with the text beside it. */\nexport function CellLead({ color, icon, children }: CellLeadProps) {\n const mark = icon ? (\n <IconTile icon={icon} size=\"sm\" tone=\"muted\" color={color} colorStyle=\"soft\" />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"mt-1.5 size-2.5 shrink-0 rounded-full\"\n style={{ background: color ?? 'var(--kf-fg-muted)' }}\n />\n );\n if (children === undefined) return mark;\n return (\n <span className={cx('flex min-w-0 gap-2.5', icon ? 'items-center' : 'items-start')}>\n {mark}\n <span className=\"min-w-0\">{children}</span>\n </span>\n );\n}\n\n/** Monospace value (ids, keys, codes, cron expressions). */\nexport function CellMono({ children }: { children: ReactNode }) {\n return <span className=\"font-mono text-[13px] text-fg\">{children}</span>;\n}\n\nexport interface EntityCellProps {\n /** Primary line (a person's or a company's name). Also the avatar's initials and accessible name. */\n name: string;\n /** Secondary line (email, role, location). */\n secondary?: ReactNode;\n /** Photo URL; initials when missing. Pass `avatar={false}` to hide the avatar. */\n src?: string;\n avatar?: boolean;\n /** Presence or a custom status dot (see `Avatar`). */\n status?: AvatarProps['status'];\n statusColor?: string;\n statusLabel?: string;\n /** Makes the name a link (to the record's page). */\n href?: string;\n}\n\n/** Two-line cell for people and companies: avatar, name and a secondary line (staff, clients, members). */\nexport function EntityCell({\n name,\n secondary,\n src,\n avatar = true,\n status,\n statusColor,\n statusLabel,\n href,\n}: EntityCellProps) {\n return (\n <span className=\"flex min-w-0 items-center gap-2.5\">\n {avatar && (\n // Decorative: the name is the text beside it (the status label is kept for screen readers below).\n <Avatar name={name} src={src} size=\"sm\" status={status} statusColor={statusColor} statusLabel={statusLabel} decorative />\n )}\n <span className=\"grid min-w-0\">\n {href ? (\n <a\n href={href}\n onClick={stop}\n className=\"truncate font-medium text-fg no-underline hover:text-link hover:underline focus-visible:rounded-xs focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {name}\n </a>\n ) : (\n <span className=\"truncate font-medium text-fg\">{name}</span>\n )}\n {secondary && <span className=\"truncate text-xs text-fg-muted\">{secondary}</span>}\n {statusLabel && <span className=\"sr-only\">{statusLabel}</span>}\n </span>\n </span>\n );\n}\n\n/** Stacked tags in a cell; after `max`, a \"+N\" with the rest in its title. */\nexport function CellTags({ tags, max = 3 }: { tags: string[]; max?: number }) {\n const shown = tags.slice(0, max);\n const rest = tags.slice(max);\n return (\n <span className=\"flex max-w-64 flex-wrap gap-1\">\n {shown.map((t) => (\n <span key={t} className=\"rounded-full bg-surface-muted px-2 py-0.5 text-xs font-semibold text-fg\">\n {t}\n </span>\n ))}\n {rest.length > 0 && (\n <span title={rest.join(', ')} className=\"rounded-full px-1.5 py-0.5 text-xs font-semibold text-fg-muted\">\n +{rest.length}\n <span className=\"sr-only\">: {rest.join(', ')}</span>\n </span>\n )}\n </span>\n );\n}\n\nexport interface CellNumberProps {\n value: number | null | undefined;\n /** `Intl.NumberFormat` options (currency, percent, decimals). */\n format?: Intl.NumberFormatOptions;\n /** BCP 47 locale (default `en-US`); pass the page's locale. */\n locale?: string;\n /** Shows + / − and colors gains and losses (deltas, balances). */\n signed?: boolean;\n /** For `signed`: a lower value is better (costs, errors). */\n invert?: boolean;\n}\n\n/** A right-aligned number with tabular figures, locale formatting and optional sign coloring. Use with `align: 'end'`. */\nexport function CellNumber({ value, format, locale, signed, invert }: CellNumberProps) {\n if (value === null || value === undefined || Number.isNaN(value)) return <span className=\"text-fg-muted\">—</span>;\n // A fixed default locale: `undefined` would format differently on the server and in the browser (hydration).\n const text = new Intl.NumberFormat(locale ?? 'en-US', { ...format, ...(signed ? { signDisplay: 'exceptZero' } : {}) }).format(value);\n const good = invert ? value < 0 : value > 0;\n return (\n <span className={cx('tabular-nums', signed && value !== 0 && (good ? 'text-success-fg' : 'text-danger-fg'))}>\n {/* A real minus sign reads better than a hyphen. */}\n {text.replace(/^-/, '−')}\n </span>\n );\n}\n\n"],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface DataTableColumn<T> {
|
|
3
|
+
id: string;
|
|
4
|
+
header: string;
|
|
5
|
+
/** Value used for sorting, search and CSV. Omit for display-only columns. */
|
|
6
|
+
accessor?: (row: T) => string | number | Date | null | undefined;
|
|
7
|
+
/** Custom cell rendering. Defaults to the accessor value. */
|
|
8
|
+
cell?: (row: T) => ReactNode;
|
|
9
|
+
/** Default: true when there is an accessor. */
|
|
10
|
+
sortable?: boolean;
|
|
11
|
+
/** Include in the global search. Default: true for string/number accessors. */
|
|
12
|
+
searchable?: boolean;
|
|
13
|
+
align?: 'start' | 'end' | 'center';
|
|
14
|
+
/** CSS width, e.g. `12rem` or `30%`. */
|
|
15
|
+
width?: string;
|
|
16
|
+
/** Default: true. */
|
|
17
|
+
hideable?: boolean;
|
|
18
|
+
defaultHidden?: boolean;
|
|
19
|
+
/** Role in the mobile card: `title` (one column), `meta` (small line under it), `field` (label: value), `hidden`. Default `field`. */
|
|
20
|
+
mobile?: 'title' | 'meta' | 'field' | 'hidden';
|
|
21
|
+
}
|
|
22
|
+
export interface DataTableProps<T> {
|
|
23
|
+
data: T[];
|
|
24
|
+
columns: DataTableColumn<T>[];
|
|
25
|
+
/** Stable id per row (database id). */
|
|
26
|
+
getRowId: (row: T) => string;
|
|
27
|
+
/** Accessible name; also shown above the table when `showCaption` is set. */
|
|
28
|
+
caption: string;
|
|
29
|
+
showCaption?: boolean;
|
|
30
|
+
/** Global search box. */
|
|
31
|
+
searchable?: boolean;
|
|
32
|
+
searchPlaceholder?: string;
|
|
33
|
+
/** Row checkboxes + bulk actions bar. */
|
|
34
|
+
selectable?: boolean;
|
|
35
|
+
/** Actions for the selected rows, e.g. "Archive", "Export". `clear` deselects all. */
|
|
36
|
+
bulkActions?: (rows: T[], clear: () => void) => ReactNode;
|
|
37
|
+
/** Per-row actions at the end of each row (usually a DropdownMenu, or `CellActions`). */
|
|
38
|
+
rowActions?: (row: T) => ReactNode;
|
|
39
|
+
/**
|
|
40
|
+
* Expandable rows: a chevron button opens a full-width panel under the row with this content
|
|
41
|
+
* (sub-items, details). Not available with `virtualize`.
|
|
42
|
+
*/
|
|
43
|
+
renderExpanded?: (row: T) => ReactNode;
|
|
44
|
+
/**
|
|
45
|
+
* How a row is named in the expand button and the row checkbox ("Show details for Invoice intake"). Default: the
|
|
46
|
+
* first column's value, then the row id.
|
|
47
|
+
*/
|
|
48
|
+
getRowLabel?: (row: T) => string;
|
|
49
|
+
onRowClick?: (row: T) => void;
|
|
50
|
+
/** Extra toolbar content (filters). */
|
|
51
|
+
toolbar?: ReactNode;
|
|
52
|
+
pageSize?: number;
|
|
53
|
+
pageSizeOptions?: number[];
|
|
54
|
+
/** Render only visible rows (TanStack Virtual); disables pagination. For 500+ rows. */
|
|
55
|
+
virtualize?: boolean;
|
|
56
|
+
/** Height of the scroll area when virtualized. */
|
|
57
|
+
maxHeight?: string;
|
|
58
|
+
loading?: boolean;
|
|
59
|
+
error?: string;
|
|
60
|
+
onRetry?: () => void;
|
|
61
|
+
empty?: ReactNode;
|
|
62
|
+
/** Shows "Export CSV" in the toolbar; file name without extension. */
|
|
63
|
+
exportFileName?: string;
|
|
64
|
+
defaultDensity?: 'comfortable' | 'compact';
|
|
65
|
+
/** Below 960px: stacked `cards` (default) or horizontal `scroll` with the first column sticky. */
|
|
66
|
+
mobileLayout?: 'cards' | 'scroll';
|
|
67
|
+
/** `muted` (default): tinted header row. `brand`: header row in the brand color, uppercase labels (dashboards). */
|
|
68
|
+
headerAppearance?: 'muted' | 'brand';
|
|
69
|
+
/** Shows the number of matching rows in the toolbar ("24 results"). */
|
|
70
|
+
showCount?: boolean;
|
|
71
|
+
/** Footer pager: numbered `pages` (default) or `compact` ("Page 1 of 4" with arrows). */
|
|
72
|
+
pagination?: 'pages' | 'compact';
|
|
73
|
+
labels?: Partial<typeof LABELS>;
|
|
74
|
+
className?: string;
|
|
75
|
+
}
|
|
76
|
+
declare const LABELS: {
|
|
77
|
+
search: string;
|
|
78
|
+
view: string;
|
|
79
|
+
columns: string;
|
|
80
|
+
density: string;
|
|
81
|
+
comfortable: string;
|
|
82
|
+
compact: string;
|
|
83
|
+
export: string;
|
|
84
|
+
selectAll: string;
|
|
85
|
+
selectRow: string;
|
|
86
|
+
/** `{count}` replaced. */
|
|
87
|
+
selected: string;
|
|
88
|
+
clear: string;
|
|
89
|
+
rowsPerPage: string;
|
|
90
|
+
/** `{from}`, `{to}`, `{total}` replaced. */
|
|
91
|
+
range: string;
|
|
92
|
+
actions: string;
|
|
93
|
+
emptyTitle: string;
|
|
94
|
+
noResultsTitle: string;
|
|
95
|
+
/** `{query}` replaced. */
|
|
96
|
+
noResultsDescription: string;
|
|
97
|
+
sortAscending: string;
|
|
98
|
+
sortDescending: string;
|
|
99
|
+
/** `{count}` replaced. */
|
|
100
|
+
results: string;
|
|
101
|
+
/** `{row}` replaced with the row id. */
|
|
102
|
+
expand: string;
|
|
103
|
+
collapse: string;
|
|
104
|
+
details: string;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Data table for product back-offices: global search, sorting, pagination, row selection with
|
|
108
|
+
* bulk actions, column visibility, density, CSV export, loading/empty/error states, stacked
|
|
109
|
+
* cards on mobile and virtualization for large datasets. Built on TanStack Table v9.
|
|
110
|
+
*/
|
|
111
|
+
export declare function DataTable<T extends object>({ data, columns, getRowId, caption, showCaption, searchable, searchPlaceholder, selectable, bulkActions, rowActions, renderExpanded, getRowLabel, onRowClick, toolbar, pageSize, pageSizeOptions, virtualize, maxHeight, loading, error, onRetry, empty, exportFileName, defaultDensity, mobileLayout, headerAppearance, pagination, showCount, labels: overrides, className, }: DataTableProps<T>): import("react").JSX.Element;
|
|
112
|
+
export {};
|