@akira-io/ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/href.ts","../src/hooks/use-initials.tsx","../src/shells/nav-footer.tsx","../src/shells/nav-main.tsx","../src/shells/user-info.tsx","../src/shells/user-menu-content.tsx","../src/shells/nav-user.tsx","../src/shells/app-sidebar.tsx","../src/shells/breadcrumbs.tsx","../src/shells/app-sidebar-header.tsx","../src/shells/heading.tsx","../src/shells/settings-layout.tsx"],"names":["jsx","jsxs","Fragment","useState"],"mappings":"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","file":"chunk-A2SIZOEA.js","sourcesContent":["import type { ComponentType } from 'react';\nimport { createElement } from 'react';\n\nimport type { LinkComponent, LinkProps, UrlLike } from '@/types';\n\nexport function hrefToString(href: UrlLike): string {\n return typeof href === 'string' ? href : href.url;\n}\n\nexport const DefaultLink: ComponentType<LinkProps> = ({\n href,\n children,\n prefetch: _prefetch,\n as: _as,\n ...props\n}) => {\n return createElement('a', { href: hrefToString(href), ...props }, children);\n};\n\nexport function resolveLink(linkComponent?: LinkComponent): LinkComponent {\n return linkComponent ?? DefaultLink;\n}\n","import { useCallback } from 'react';\n\nexport function useInitials() {\n return useCallback((fullName: string): string => {\n const names = fullName.trim().split(' ');\n\n if (names.length === 0) return '';\n if (names.length === 1) return names[0].charAt(0).toUpperCase();\n\n const firstInitial = names[0].charAt(0);\n const lastInitial = names[names.length - 1].charAt(0);\n\n return `${firstInitial}${lastInitial}`.toUpperCase();\n }, []);\n}\n","import { type ComponentPropsWithoutRef } from 'react';\n\nimport { Icon } from '@/components/ui/icon';\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@/components/ui/sidebar';\nimport { hrefToString } from '@/lib/href';\nimport type { NavItem } from '@/types';\n\nexport function NavFooter({\n items,\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof SidebarGroup> & {\n items: NavItem[];\n}) {\n return (\n <SidebarGroup\n {...props}\n className={`group-data-[collapsible=icon]:p-0 ${className || ''}`}\n >\n <SidebarGroupContent>\n <SidebarMenu>\n {items.map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton\n asChild\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <a\n href={hrefToString(item.href)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.icon && (\n <Icon\n iconNode={item.icon}\n className=\"h-5 w-5\"\n />\n )}\n <span>{item.title}</span>\n </a>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport { useState } from 'react';\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@/components/ui/collapsible';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@/components/ui/sidebar';\nimport { hrefToString, resolveLink } from '@/lib/href';\nimport { cn } from '@/lib/utils';\nimport type { LinkComponent, NavItem } from '@/types';\n\nexport function NavMain({\n items = [],\n label = 'Platform',\n currentUrl = '',\n linkComponent,\n collapsible = false,\n defaultOpen = true,\n}: {\n items: NavItem[];\n label?: string;\n currentUrl?: string;\n linkComponent?: LinkComponent;\n collapsible?: boolean;\n defaultOpen?: boolean;\n}) {\n const Link = resolveLink(linkComponent);\n const [open, setOpen] = useState(defaultOpen);\n\n const menu = (\n <SidebarMenu>\n {items.map((item) => (\n <SidebarMenuItem key={item.title}>\n <SidebarMenuButton\n asChild\n isActive={\n item.isActive ??\n (currentUrl\n ? currentUrl.startsWith(hrefToString(item.href))\n : false)\n }\n tooltip={{ children: item.title }}\n >\n <Link href={item.href} prefetch>\n {item.icon && <item.icon />}\n <span>{item.title}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n );\n\n if (!collapsible || !label) {\n return (\n <SidebarGroup className=\"px-2 py-0\">\n {label && <SidebarGroupLabel>{label}</SidebarGroupLabel>}\n {menu}\n </SidebarGroup>\n );\n }\n\n return (\n <SidebarGroup className=\"px-2 py-0\">\n <Collapsible\n open={open}\n onOpenChange={setOpen}\n className=\"p-0 rounded-none border-0 bg-transparent shadow-none ring-0 backdrop-blur-none\"\n >\n <CollapsibleTrigger asChild>\n <SidebarGroupLabel className=\"w-full cursor-pointer justify-between\">\n {label}\n <ChevronDown\n className={cn(\n 'size-4 transition-transform',\n !open && '-rotate-90',\n )}\n />\n </SidebarGroupLabel>\n </CollapsibleTrigger>\n <CollapsibleContent>{menu}</CollapsibleContent>\n </Collapsible>\n </SidebarGroup>\n );\n}\n","import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';\nimport { useInitials } from '@/hooks/use-initials';\nimport type { SharedUser } from '@/types';\n\nexport function UserInfo({\n user,\n showEmail = false,\n}: {\n user: SharedUser;\n showEmail?: boolean;\n}) {\n const getInitials = useInitials();\n\n return (\n <>\n <Avatar className=\"h-8 w-8 overflow-hidden rounded-full\">\n <AvatarImage src={user.avatar} alt={user.name} />\n <AvatarFallback className=\"rounded-xl bg-muted text-foreground\">\n {getInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n <div className=\"text-sm leading-tight grid flex-1 text-left\">\n <span className=\"font-medium truncate\">{user.name}</span>\n {showEmail && (\n <span className=\"text-xs truncate text-muted-foreground\">\n {user.email}\n </span>\n )}\n </div>\n </>\n );\n}\n","import { LogOut, Settings } from 'lucide-react';\n\nimport {\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/ui/dropdown-menu';\nimport { resolveLink } from '@/lib/href';\nimport type { LinkComponent, SharedUser, UrlLike } from '@/types';\nimport { UserInfo } from './user-info';\n\ninterface UserMenuContentProps {\n user: SharedUser;\n settingsHref: UrlLike;\n logoutHref: UrlLike;\n linkComponent?: LinkComponent;\n onSettingsClick?: () => void;\n onLogout?: () => void;\n settingsLabel?: string;\n logoutLabel?: string;\n}\n\nexport function UserMenuContent({\n user,\n settingsHref,\n logoutHref,\n linkComponent,\n onSettingsClick,\n onLogout,\n settingsLabel = 'Settings',\n logoutLabel = 'Log out',\n}: UserMenuContentProps) {\n const Link = resolveLink(linkComponent);\n\n return (\n <>\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"gap-2 px-1 py-1.5 text-sm flex items-center text-left\">\n <UserInfo user={user} showEmail={true} />\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem asChild>\n <Link\n className=\"block w-full\"\n href={settingsHref}\n as=\"button\"\n prefetch\n onClick={onSettingsClick}\n >\n <Settings className=\"mr-2\" />\n {settingsLabel}\n </Link>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem asChild>\n <Link\n className=\"block w-full\"\n href={logoutHref}\n as=\"button\"\n onClick={onLogout}\n data-test=\"logout-button\"\n >\n <LogOut className=\"mr-2\" />\n {logoutLabel}\n </Link>\n </DropdownMenuItem>\n </>\n );\n}\n","import { ChevronsUpDown } from 'lucide-react';\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport type { LinkComponent, SharedUser, UrlLike } from '@/types';\nimport { UserInfo } from './user-info';\nimport { UserMenuContent } from './user-menu-content';\n\ninterface NavUserProps {\n user: SharedUser;\n settingsHref: UrlLike;\n logoutHref: UrlLike;\n linkComponent?: LinkComponent;\n onSettingsClick?: () => void;\n onLogout?: () => void;\n}\n\nexport function NavUser({\n user,\n settingsHref,\n logoutHref,\n linkComponent,\n onSettingsClick,\n onLogout,\n}: NavUserProps) {\n const { state } = useSidebar();\n const isMobile = useIsMobile();\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n className=\"group text-sidebar-accent-foreground data-[state=open]:bg-sidebar-accent\"\n data-test=\"sidebar-menu-button\"\n >\n <UserInfo user={user} />\n <ChevronsUpDown className=\"size-4 ml-auto\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"min-w-56 rounded-xl w-(--radix-dropdown-menu-trigger-width)\"\n align=\"end\"\n side={\n isMobile\n ? 'bottom'\n : state === 'collapsed'\n ? 'left'\n : 'bottom'\n }\n >\n <UserMenuContent\n user={user}\n settingsHref={settingsHref}\n logoutHref={logoutHref}\n linkComponent={linkComponent}\n onSettingsClick={onSettingsClick}\n onLogout={onLogout}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n );\n}\n","import { type ReactNode } from 'react';\n\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '@/components/ui/sidebar';\nimport { hrefToString, resolveLink } from '@/lib/href';\nimport type {\n LinkComponent,\n NavGroup,\n NavItem,\n SharedUser,\n UrlLike,\n} from '@/types';\nimport { NavFooter } from './nav-footer';\nimport { NavMain } from './nav-main';\nimport { NavUser } from './nav-user';\n\nfunction mostSpecificActiveHref(\n groups: NavGroup[],\n currentUrl: string,\n): string {\n let best = '';\n for (const group of groups) {\n for (const item of group.items) {\n const href = hrefToString(item.href);\n const matches =\n currentUrl === href || currentUrl.startsWith(`${href}/`);\n if (matches && href.length > best.length) {\n best = href;\n }\n }\n }\n return best;\n}\n\ninterface AppSidebarProps {\n logo: ReactNode;\n logoHref: UrlLike;\n groups: NavGroup[];\n footerItems?: NavItem[];\n user: SharedUser;\n settingsHref: UrlLike;\n logoutHref: UrlLike;\n currentUrl?: string;\n linkComponent?: LinkComponent;\n onSettingsClick?: () => void;\n onLogout?: () => void;\n}\n\nexport function AppSidebar({\n logo,\n logoHref,\n groups,\n footerItems = [],\n user,\n settingsHref,\n logoutHref,\n currentUrl = '',\n linkComponent,\n onSettingsClick,\n onLogout,\n}: AppSidebarProps) {\n const Link = resolveLink(linkComponent);\n const activeHref = mostSpecificActiveHref(groups, currentUrl);\n const resolvedGroups = groups.map((group) => ({\n ...group,\n items: group.items.map((item) => ({\n ...item,\n isActive: hrefToString(item.href) === activeHref,\n })),\n }));\n\n return (\n <Sidebar collapsible=\"icon\" variant=\"inset\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" asChild>\n <Link href={logoHref} prefetch>\n {logo}\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {resolvedGroups.map((group, index) => (\n <NavMain\n key={group.label ?? index}\n items={group.items}\n label={group.label ?? ''}\n currentUrl={currentUrl}\n linkComponent={linkComponent}\n />\n ))}\n </SidebarContent>\n\n <SidebarFooter>\n {footerItems.length > 0 && (\n <NavFooter items={footerItems} className=\"mt-auto\" />\n )}\n <NavUser\n user={user}\n settingsHref={settingsHref}\n logoutHref={logoutHref}\n linkComponent={linkComponent}\n onSettingsClick={onSettingsClick}\n onLogout={onLogout}\n />\n </SidebarFooter>\n </Sidebar>\n );\n}\n","import { Fragment } from 'react';\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@/components/ui/breadcrumb';\nimport { resolveLink } from '@/lib/href';\nimport type {\n BreadcrumbItem as BreadcrumbItemType,\n LinkComponent,\n} from '@/types';\n\nexport function Breadcrumbs({\n breadcrumbs,\n linkComponent,\n}: {\n breadcrumbs: BreadcrumbItemType[];\n linkComponent?: LinkComponent;\n}) {\n const Link = resolveLink(linkComponent);\n\n if (breadcrumbs.length === 0) {\n return null;\n }\n\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {breadcrumbs.map((item, index) => {\n const isLast = index === breadcrumbs.length - 1;\n return (\n <Fragment key={index}>\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>\n {item.title}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink asChild>\n <Link href={item.href}>\n {item.title}\n </Link>\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator />}\n </Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n","import { Search } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport { SidebarTrigger } from '@/components/ui/sidebar';\nimport type {\n BreadcrumbItem as BreadcrumbItemType,\n LinkComponent,\n} from '@/types';\nimport { Breadcrumbs } from './breadcrumbs';\n\ninterface AppSidebarHeaderProps {\n breadcrumbs?: BreadcrumbItemType[];\n linkComponent?: LinkComponent;\n onSearchClick?: () => void;\n searchLabel?: string;\n}\n\nexport function AppSidebarHeader({\n breadcrumbs = [],\n linkComponent,\n onSearchClick,\n searchLabel = 'Search...',\n}: AppSidebarHeaderProps) {\n const [modifier, setModifier] = useState('Ctrl');\n\n useEffect(() => {\n const platform = navigator.userAgent;\n setModifier(/Mac|iPhone|iPad|iPod/.test(platform) ? '⌘' : 'Ctrl');\n }, []);\n\n return (\n <header className=\"h-16 gap-2 px-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4 flex shrink-0 items-center border-b border-sidebar-border/50 transition-[width,height] ease-linear\">\n <div className=\"gap-2 flex items-center\">\n <SidebarTrigger className=\"-ml-1\" />\n <Breadcrumbs\n breadcrumbs={breadcrumbs}\n linkComponent={linkComponent}\n />\n </div>\n\n {onSearchClick && (\n <button\n type=\"button\"\n onClick={onSearchClick}\n className=\"h-9 w-56 gap-2 rounded-xl px-3 text-sm ml-auto flex items-center border border-border/60 bg-muted/30 text-muted-foreground transition-colors hover:bg-muted/50\"\n >\n <Search className=\"size-4\" />\n <span>{searchLabel}</span>\n <kbd className=\"gap-0.5 px-1.5 py-0.5 font-semibold rounded-xl ml-auto inline-flex items-center border border-border/60 bg-background font-sans text-[10px] text-muted-foreground\">\n <span>{modifier}</span>\n <span>K</span>\n </kbd>\n </button>\n )}\n </header>\n );\n}\n","export function Heading({\n title,\n description,\n}: {\n title: string;\n description?: string;\n}) {\n return (\n <div className=\"mb-8 space-y-0.5\">\n <h2 className=\"text-xl font-semibold tracking-tight\">{title}</h2>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n );\n}\n","import { type PropsWithChildren } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Separator } from '@/components/ui/separator';\nimport { hrefToString, resolveLink } from '@/lib/href';\nimport { cn } from '@/lib/utils';\nimport type { LinkComponent, NavItem } from '@/types';\nimport { Heading } from './heading';\n\nexport interface SettingsLayoutProps {\n items: NavItem[];\n linkComponent?: LinkComponent;\n currentPath?: string;\n title?: string;\n description?: string;\n wide?: boolean;\n}\n\nexport function SettingsLayout({\n items,\n linkComponent,\n currentPath,\n title = 'Settings',\n description = 'Manage your profile and account settings',\n wide = false,\n children,\n}: PropsWithChildren<SettingsLayoutProps>) {\n const Link = resolveLink(linkComponent);\n const activePath =\n currentPath ??\n (typeof window === 'undefined' ? '' : window.location.pathname);\n\n return (\n <div className=\"px-4 py-6\">\n <Heading title={title} description={description} />\n\n <div className=\"lg:flex-row lg:space-x-12 flex flex-col\">\n <aside className=\"max-w-xl lg:w-48 w-full\">\n <nav className=\"space-y-1 space-x-0 flex flex-col\">\n {items.map((item, index) => {\n const href = hrefToString(item.href);\n return (\n <Button\n key={`${href}-${index}`}\n size=\"sm\"\n variant=\"ghost\"\n asChild\n className={cn('w-full justify-start', {\n 'bg-muted': activePath === href,\n })}\n >\n <Link href={item.href}>\n {item.icon && (\n <item.icon className=\"h-4 w-4\" />\n )}\n {item.title}\n </Link>\n </Button>\n );\n })}\n </nav>\n </aside>\n\n <Separator className=\"my-6 lg:hidden\" />\n\n <div\n className={cn(\n wide ? 'min-w-0 flex-1' : 'md:max-w-2xl flex-1',\n )}\n >\n <section\n className={cn(\n 'space-y-12',\n wide ? 'max-w-5xl' : 'max-w-xl',\n )}\n >\n {children}\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,96 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+ import { Slot } from '@radix-ui/react-slot';
4
+ import { cva } from 'class-variance-authority';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ // src/lib/utils.ts
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+
12
+ // src/lib/language.ts
13
+ var surfaceRadius = "rounded-3xl";
14
+ var controlRadius = "rounded-2xl";
15
+ var glassEdge = "ring-1 ring-surface-ring backdrop-blur-2xl backdrop-saturate-150";
16
+ var elevatedSurface = `${glassEdge} ${surfaceRadius} border-0 shadow-(--glass-elevation)`;
17
+ var floatingSurface = `${glassEdge} border-0 bg-popover/85 text-popover-foreground shadow-(--glass-elevation)`;
18
+ var modalSurface = `${floatingSurface} ${surfaceRadius}`;
19
+ var panelSurface = `${floatingSurface} ${controlRadius}`;
20
+ var menuSurface = `${panelSurface} bg-popover/80`;
21
+ var recessedSurface = `${controlRadius} border-0 bg-surface-recessed text-foreground shadow-none ring-0 backdrop-blur-none`;
22
+ var nestedRadius = controlRadius;
23
+ var nestedSurfaceReset = "nested-surface:border-0 nested-surface:ring-0 nested-surface:bg-transparent nested-surface:shadow-none nested-surface:backdrop-blur-none";
24
+ var nestedEdgeToEdge = "nested-surface:rounded-none";
25
+ var glassControl = "ring-1 ring-surface-ring border-0 shadow-(--glass-shadow) backdrop-blur-md backdrop-saturate-150";
26
+ var controlFill = "bg-surface-control";
27
+ var fieldSurface = `${glassControl} ${controlFill} ${controlRadius} text-foreground`;
28
+ var focusRing = "outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50";
29
+ var menuHighlight = "outline-hidden focus:bg-accent focus:text-accent-foreground";
30
+ function surface(inset) {
31
+ return inset ? `${elevatedSurface} ${recessedSurface}` : elevatedSurface;
32
+ }
33
+ var buttonVariants = cva(
34
+ `inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-2xl text-sm font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,
35
+ {
36
+ variants: {
37
+ variant: {
38
+ default: "bg-primary text-primary-foreground shadow-xl hover:bg-primary/90 hover:scale-[1.02] active:scale-[0.98]",
39
+ destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/40",
40
+ outline: `${glassControl} ${controlFill} hover:bg-accent hover:text-accent-foreground`,
41
+ secondary: `${glassControl} bg-secondary/80 text-secondary-foreground hover:bg-secondary`,
42
+ ghost: "hover:bg-accent hover:text-accent-foreground",
43
+ link: "text-primary underline-offset-4 hover:underline"
44
+ },
45
+ size: {
46
+ default: "h-11 px-4 has-[>svg]:px-3",
47
+ sm: "h-9 gap-1.5 rounded-xl px-3 has-[>svg]:px-2.5",
48
+ lg: "h-12 px-6 has-[>svg]:px-5 text-base",
49
+ icon: "size-11",
50
+ "icon-sm": "size-9 rounded-xl",
51
+ "icon-lg": "size-12"
52
+ }
53
+ },
54
+ defaultVariants: {
55
+ variant: "default",
56
+ size: "default"
57
+ }
58
+ }
59
+ );
60
+ function Button({
61
+ className,
62
+ variant = "default",
63
+ size = "default",
64
+ asChild = false,
65
+ ...props
66
+ }) {
67
+ const Comp = asChild ? Slot : "button";
68
+ return /* @__PURE__ */ jsx(
69
+ Comp,
70
+ {
71
+ "data-slot": "button",
72
+ "data-variant": variant,
73
+ "data-size": size,
74
+ className: cn(buttonVariants({ variant, size, className })),
75
+ ...props
76
+ }
77
+ );
78
+ }
79
+ function Input({ className, type, ...props }) {
80
+ return /* @__PURE__ */ jsx(
81
+ "input",
82
+ {
83
+ type,
84
+ "data-slot": "input",
85
+ className: cn(
86
+ `h-11 min-w-0 px-4 text-sm font-medium flex w-full transition-all placeholder:text-muted-foreground focus:bg-muted disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 ${fieldSurface} ${focusRing}`,
87
+ className
88
+ ),
89
+ ...props
90
+ }
91
+ );
92
+ }
93
+
94
+ export { Button, Input, buttonVariants, cn, controlFill, elevatedSurface, fieldSurface, floatingSurface, focusRing, glassControl, menuHighlight, menuSurface, modalSurface, nestedEdgeToEdge, nestedRadius, nestedSurfaceReset, panelSurface, recessedSurface, surface };
95
+ //# sourceMappingURL=chunk-POE7OYET.js.map
96
+ //# sourceMappingURL=chunk-POE7OYET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/lib/language.ts","../src/components/ui/button.tsx","../src/components/ui/input.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-POE7OYET.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","export const surfaceRadius = 'rounded-3xl';\n\nexport const controlRadius = 'rounded-2xl';\n\nexport const compactRadius = 'rounded-xl';\n\nexport const glassEdge =\n 'ring-1 ring-surface-ring backdrop-blur-2xl backdrop-saturate-150';\n\nexport const elevatedSurface = `${glassEdge} ${surfaceRadius} border-0 shadow-(--glass-elevation)`;\n\nexport const floatingSurface = `${glassEdge} border-0 bg-popover/85 text-popover-foreground shadow-(--glass-elevation)`;\n\nexport const modalSurface = `${floatingSurface} ${surfaceRadius}`;\n\nexport const panelSurface = `${floatingSurface} ${controlRadius}`;\n\nexport const menuSurface = `${panelSurface} bg-popover/80`;\n\nexport const recessedSurface = `${controlRadius} border-0 bg-surface-recessed text-foreground shadow-none ring-0 backdrop-blur-none`;\n\nexport const nestedRadius = controlRadius;\n\nexport const nestedSurfaceReset =\n 'nested-surface:border-0 nested-surface:ring-0 nested-surface:bg-transparent nested-surface:shadow-none nested-surface:backdrop-blur-none';\n\nexport const nestedEdgeToEdge = 'nested-surface:rounded-none';\n\nexport const glassControl =\n 'ring-1 ring-surface-ring border-0 shadow-(--glass-shadow) backdrop-blur-md backdrop-saturate-150';\n\nexport const controlFill = 'bg-surface-control';\n\nexport const fieldSurface = `${glassControl} ${controlFill} ${controlRadius} text-foreground`;\n\nexport const focusRing =\n 'outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50';\n\nexport const menuHighlight =\n 'outline-hidden focus:bg-accent focus:text-accent-foreground';\n\nexport interface SurfaceProps {\n inset?: boolean;\n}\n\nexport function surface(inset?: boolean | null): string {\n return inset ? `${elevatedSurface} ${recessedSurface}` : elevatedSurface;\n}\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { controlFill, focusRing, glassControl } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n `inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-2xl text-sm font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground shadow-xl hover:bg-primary/90 hover:scale-[1.02] active:scale-[0.98]',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/40',\n outline: `${glassControl} ${controlFill} hover:bg-accent hover:text-accent-foreground`,\n secondary: `${glassControl} bg-secondary/80 text-secondary-foreground hover:bg-secondary`,\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-11 px-4 has-[>svg]:px-3',\n sm: 'h-9 gap-1.5 rounded-xl px-3 has-[>svg]:px-2.5',\n lg: 'h-12 px-6 has-[>svg]:px-5 text-base',\n icon: 'size-11',\n 'icon-sm': 'size-9 rounded-xl',\n 'icon-lg': 'size-12',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from 'react';\n\nimport { fieldSurface, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n `h-11 min-w-0 px-4 text-sm font-medium flex w-full transition-all placeholder:text-muted-foreground focus:bg-muted disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 ${fieldSurface} ${focusRing}`,\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n"]}
@@ -0,0 +1,170 @@
1
+ import { driver } from 'driver.js';
2
+ import { createContext, useRef, useMemo, useCallback, useEffect, useContext } from 'react';
3
+ import 'driver.js/dist/driver.css';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // src/blocks/tour/gate.ts
7
+ function stepsForBreakpoint(steps, breakpoint) {
8
+ return steps.filter(
9
+ (step) => !step.breakpoints || step.breakpoints.includes(breakpoint)
10
+ );
11
+ }
12
+ function resolveSteps(steps, isPresent) {
13
+ return steps.filter((step) => isPresent(step.target));
14
+ }
15
+ function shouldStartTour(input) {
16
+ if (input.resolvedStepCount === 0) {
17
+ return false;
18
+ }
19
+ if (input.force) {
20
+ return true;
21
+ }
22
+ return input.definition.version > (input.seen[input.definition.id] ?? 0);
23
+ }
24
+
25
+ // src/blocks/tour/types.ts
26
+ var DEFAULT_TOUR_LABELS = {
27
+ next: "Next",
28
+ previous: "Previous",
29
+ done: "Done",
30
+ progress: "{{current}} of {{total}}"
31
+ };
32
+ var TourContext = createContext(null);
33
+ var MOBILE_BREAKPOINT = 768;
34
+ var WAIT_FOR_TARGET = 4e3;
35
+ function currentBreakpoint() {
36
+ return window.innerWidth < MOBILE_BREAKPOINT ? "mobile" : "desktop";
37
+ }
38
+ function outcomeOf(instance, highlighted) {
39
+ if (!highlighted) {
40
+ return "dismissed";
41
+ }
42
+ return instance.hasNextStep() ? "skipped" : "completed";
43
+ }
44
+ function TourProvider({
45
+ children,
46
+ seen,
47
+ onProgress,
48
+ labels
49
+ }) {
50
+ const seenRef = useRef(seen);
51
+ seenRef.current = seen;
52
+ const onProgressRef = useRef(onProgress);
53
+ onProgressRef.current = onProgress;
54
+ const driverRef = useRef(null);
55
+ const activeRef = useRef(null);
56
+ const resolvedLabels = useMemo(
57
+ () => ({ ...DEFAULT_TOUR_LABELS, ...labels }),
58
+ [labels]
59
+ );
60
+ const report = useCallback((outcome) => {
61
+ const active = activeRef.current;
62
+ if (!active) {
63
+ return;
64
+ }
65
+ activeRef.current = null;
66
+ onProgressRef.current({
67
+ tour: active.definition.id,
68
+ version: active.definition.version,
69
+ lastStep: active.lastStep,
70
+ outcome
71
+ });
72
+ }, []);
73
+ const startTour = useCallback(
74
+ (definition, options) => {
75
+ const alreadyRunning = activeRef.current?.definition.id === definition.id;
76
+ if (alreadyRunning && !options?.force) {
77
+ return;
78
+ }
79
+ const steps = stepsForBreakpoint(
80
+ definition.steps,
81
+ currentBreakpoint()
82
+ );
83
+ const allowed = shouldStartTour({
84
+ definition,
85
+ seen: seenRef.current,
86
+ resolvedStepCount: steps.length,
87
+ force: options?.force
88
+ });
89
+ if (!allowed) {
90
+ return;
91
+ }
92
+ driverRef.current?.destroy();
93
+ activeRef.current = { definition, lastStep: 0, highlighted: false };
94
+ const instance = driver({
95
+ showProgress: true,
96
+ progressText: resolvedLabels.progress,
97
+ nextBtnText: resolvedLabels.next,
98
+ prevBtnText: resolvedLabels.previous,
99
+ doneBtnText: resolvedLabels.done,
100
+ popoverClass: "akira-tour",
101
+ waitForElement: WAIT_FOR_TARGET,
102
+ skipMissingElement: true,
103
+ steps: steps.map((step) => ({
104
+ element: step.target,
105
+ popover: {
106
+ title: step.title,
107
+ description: step.description
108
+ }
109
+ })),
110
+ onHighlightStarted: () => {
111
+ if (activeRef.current) {
112
+ activeRef.current.lastStep = instance.getActiveIndex() ?? 0;
113
+ activeRef.current.highlighted = true;
114
+ }
115
+ },
116
+ onDestroyStarted: () => {
117
+ report(
118
+ outcomeOf(
119
+ instance,
120
+ activeRef.current?.highlighted ?? false
121
+ )
122
+ );
123
+ instance.destroy();
124
+ }
125
+ });
126
+ driverRef.current = instance;
127
+ instance.drive();
128
+ },
129
+ [report, resolvedLabels]
130
+ );
131
+ useEffect(
132
+ () => () => {
133
+ report("dismissed");
134
+ driverRef.current?.destroy();
135
+ driverRef.current = null;
136
+ },
137
+ [report]
138
+ );
139
+ const value = useMemo(() => ({ startTour }), [startTour]);
140
+ return /* @__PURE__ */ jsx(TourContext.Provider, { value, children });
141
+ }
142
+ function useTourController() {
143
+ const context = useContext(TourContext);
144
+ if (!context) {
145
+ throw new Error(
146
+ "useTourController must be used inside a TourProvider."
147
+ );
148
+ }
149
+ return context;
150
+ }
151
+ function useTour(definition, options) {
152
+ const { startTour } = useTourController();
153
+ const enabled = options?.enabled ?? true;
154
+ const definitionRef = useRef(definition);
155
+ definitionRef.current = definition;
156
+ useEffect(() => {
157
+ if (!enabled) {
158
+ return;
159
+ }
160
+ const frame = window.requestAnimationFrame(
161
+ () => startTour(definitionRef.current)
162
+ );
163
+ return () => window.cancelAnimationFrame(frame);
164
+ }, [definition.id, definition.version, enabled, startTour]);
165
+ return { restart: () => startTour(definitionRef.current, { force: true }) };
166
+ }
167
+
168
+ export { DEFAULT_TOUR_LABELS, TourProvider, resolveSteps, shouldStartTour, stepsForBreakpoint, useTour, useTourController };
169
+ //# sourceMappingURL=chunk-UXL33CZ4.js.map
170
+ //# sourceMappingURL=chunk-UXL33CZ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blocks/tour/gate.ts","../src/blocks/tour/types.ts","../src/blocks/tour/tour.tsx"],"names":[],"mappings":"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","file":"chunk-UXL33CZ4.js","sourcesContent":["import type {\n TourBreakpoint,\n TourDefinition,\n TourStep,\n} from '@/blocks/tour/types';\n\nexport function stepsForBreakpoint(\n steps: TourStep[],\n breakpoint: TourBreakpoint,\n): TourStep[] {\n return steps.filter(\n (step) => !step.breakpoints || step.breakpoints.includes(breakpoint),\n );\n}\n\nexport function resolveSteps(\n steps: TourStep[],\n isPresent: (target: string) => boolean,\n): TourStep[] {\n return steps.filter((step) => isPresent(step.target));\n}\n\nexport function shouldStartTour(input: {\n definition: TourDefinition;\n seen: Record<string, number>;\n resolvedStepCount: number;\n force?: boolean;\n}): boolean {\n if (input.resolvedStepCount === 0) {\n return false;\n }\n\n if (input.force) {\n return true;\n }\n\n return input.definition.version > (input.seen[input.definition.id] ?? 0);\n}\n","export type TourBreakpoint = 'mobile' | 'desktop';\n\nexport type TourOutcome = 'completed' | 'skipped' | 'dismissed';\n\nexport interface TourStep {\n target: string;\n title: string;\n description: string;\n breakpoints?: TourBreakpoint[];\n}\n\nexport interface TourDefinition {\n id: string;\n version: number;\n steps: TourStep[];\n}\n\nexport interface TourProgress {\n tour: string;\n version: number;\n lastStep: number;\n outcome: TourOutcome;\n}\n\nexport interface TourLabels {\n next: string;\n previous: string;\n done: string;\n progress: string;\n}\n\nexport const DEFAULT_TOUR_LABELS: TourLabels = {\n next: 'Next',\n previous: 'Previous',\n done: 'Done',\n progress: '{{current}} of {{total}}',\n};\n","import { driver, type Driver } from 'driver.js';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type PropsWithChildren,\n type ReactElement,\n} from 'react';\n\nimport 'driver.js/dist/driver.css';\n\nimport { shouldStartTour, stepsForBreakpoint } from '@/blocks/tour/gate';\nimport {\n DEFAULT_TOUR_LABELS,\n type TourBreakpoint,\n type TourDefinition,\n type TourLabels,\n type TourOutcome,\n type TourProgress,\n} from '@/blocks/tour/types';\n\ninterface TourControllerValue {\n startTour: (\n definition: TourDefinition,\n options?: { force?: boolean },\n ) => void;\n}\n\nconst TourContext = createContext<TourControllerValue | null>(null);\n\nconst MOBILE_BREAKPOINT = 768;\n\nconst WAIT_FOR_TARGET = 4000;\n\nfunction currentBreakpoint(): TourBreakpoint {\n return window.innerWidth < MOBILE_BREAKPOINT ? 'mobile' : 'desktop';\n}\n\nfunction outcomeOf(instance: Driver, highlighted: boolean): TourOutcome {\n if (!highlighted) {\n return 'dismissed';\n }\n\n return instance.hasNextStep() ? 'skipped' : 'completed';\n}\n\nexport function TourProvider({\n children,\n seen,\n onProgress,\n labels,\n}: PropsWithChildren<{\n seen: Record<string, number>;\n onProgress: (progress: TourProgress) => void;\n labels?: Partial<TourLabels>;\n}>): ReactElement {\n const seenRef = useRef(seen);\n seenRef.current = seen;\n\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n\n const driverRef = useRef<Driver | null>(null);\n const activeRef = useRef<{\n definition: TourDefinition;\n lastStep: number;\n highlighted: boolean;\n } | null>(null);\n\n const resolvedLabels = useMemo(\n () => ({ ...DEFAULT_TOUR_LABELS, ...labels }),\n [labels],\n );\n\n const report = useCallback((outcome: TourOutcome): void => {\n const active = activeRef.current;\n\n if (!active) {\n return;\n }\n\n activeRef.current = null;\n\n onProgressRef.current({\n tour: active.definition.id,\n version: active.definition.version,\n lastStep: active.lastStep,\n outcome,\n });\n }, []);\n\n const startTour = useCallback(\n (definition: TourDefinition, options?: { force?: boolean }): void => {\n const alreadyRunning =\n activeRef.current?.definition.id === definition.id;\n\n if (alreadyRunning && !options?.force) {\n return;\n }\n\n const steps = stepsForBreakpoint(\n definition.steps,\n currentBreakpoint(),\n );\n\n const allowed = shouldStartTour({\n definition,\n seen: seenRef.current,\n resolvedStepCount: steps.length,\n force: options?.force,\n });\n\n if (!allowed) {\n return;\n }\n\n driverRef.current?.destroy();\n activeRef.current = { definition, lastStep: 0, highlighted: false };\n\n const instance = driver({\n showProgress: true,\n progressText: resolvedLabels.progress,\n nextBtnText: resolvedLabels.next,\n prevBtnText: resolvedLabels.previous,\n doneBtnText: resolvedLabels.done,\n popoverClass: 'akira-tour',\n waitForElement: WAIT_FOR_TARGET,\n skipMissingElement: true,\n steps: steps.map((step) => ({\n element: step.target,\n popover: {\n title: step.title,\n description: step.description,\n },\n })),\n onHighlightStarted: () => {\n if (activeRef.current) {\n activeRef.current.lastStep =\n instance.getActiveIndex() ?? 0;\n activeRef.current.highlighted = true;\n }\n },\n onDestroyStarted: () => {\n report(\n outcomeOf(\n instance,\n activeRef.current?.highlighted ?? false,\n ),\n );\n instance.destroy();\n },\n });\n\n driverRef.current = instance;\n instance.drive();\n },\n [report, resolvedLabels],\n );\n\n useEffect(\n () => () => {\n report('dismissed');\n driverRef.current?.destroy();\n driverRef.current = null;\n },\n [report],\n );\n\n const value = useMemo(() => ({ startTour }), [startTour]);\n\n return (\n <TourContext.Provider value={value}>{children}</TourContext.Provider>\n );\n}\n\nexport function useTourController(): TourControllerValue {\n const context = useContext(TourContext);\n\n if (!context) {\n throw new Error(\n 'useTourController must be used inside a TourProvider.',\n );\n }\n\n return context;\n}\n\nexport function useTour(\n definition: TourDefinition,\n options?: { enabled?: boolean },\n): { restart: () => void } {\n const { startTour } = useTourController();\n const enabled = options?.enabled ?? true;\n\n const definitionRef = useRef(definition);\n definitionRef.current = definition;\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const frame = window.requestAnimationFrame(() =>\n startTour(definitionRef.current),\n );\n\n return () => window.cancelAnimationFrame(frame);\n }, [definition.id, definition.version, enabled, startTour]);\n\n return { restart: () => startTour(definitionRef.current, { force: true }) };\n}\n"]}
@@ -0,0 +1,149 @@
1
+ import * as React from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { Column, ColumnDef, Row } from '@tanstack/react-table';
4
+ import { I as IconComponent } from './types-Cno1_Ijx.js';
5
+
6
+ interface ComboboxOption {
7
+ value: string;
8
+ label: string;
9
+ }
10
+ interface ComboboxLabels {
11
+ placeholder: string;
12
+ searchPlaceholder: string;
13
+ emptyText: string;
14
+ }
15
+ interface ComboboxProps {
16
+ id?: string;
17
+ value: string;
18
+ options: ComboboxOption[];
19
+ onChange: (value: string) => void;
20
+ placeholder?: ComboboxLabels['placeholder'];
21
+ searchPlaceholder?: ComboboxLabels['searchPlaceholder'];
22
+ emptyText?: ComboboxLabels['emptyText'];
23
+ disabled?: boolean;
24
+ invalid?: boolean;
25
+ }
26
+ declare function Combobox({ id, value, options, onChange, placeholder, searchPlaceholder, emptyText, disabled, invalid, }: ComboboxProps): React.JSX.Element;
27
+
28
+ interface ConfirmDialogLabels {
29
+ title: string;
30
+ description: string;
31
+ confirmText: string;
32
+ cancelText: string;
33
+ }
34
+ interface ConfirmDialogProps {
35
+ open: boolean;
36
+ onOpenChange: (open: boolean) => void;
37
+ title?: ConfirmDialogLabels['title'];
38
+ description?: ConfirmDialogLabels['description'] | ReactNode;
39
+ confirmText?: ConfirmDialogLabels['confirmText'];
40
+ cancelText?: ConfirmDialogLabels['cancelText'];
41
+ variant?: 'destructive' | 'default';
42
+ processing?: boolean;
43
+ onConfirm: () => void;
44
+ onCancel?: () => void;
45
+ }
46
+ declare function ConfirmDialog({ open, onOpenChange, title, description, confirmText, cancelText, variant, processing, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
47
+
48
+ interface DataTableFilter {
49
+ columnId: string;
50
+ label: string;
51
+ options: {
52
+ label: string;
53
+ value: string;
54
+ }[];
55
+ }
56
+ interface DataTableServerFilter {
57
+ paramKey: string;
58
+ label: string;
59
+ options: {
60
+ label: string;
61
+ value: string;
62
+ }[];
63
+ }
64
+ interface DataTableFacetedFilterLabels {
65
+ noOptionsLabel: string;
66
+ }
67
+ declare function FacetedFilter<TData>({ column, filter, noOptionsLabel, }: {
68
+ column?: Column<TData, unknown>;
69
+ filter: DataTableFilter;
70
+ noOptionsLabel?: DataTableFacetedFilterLabels['noOptionsLabel'];
71
+ }): React.JSX.Element;
72
+ declare function ServerFacetedFilter({ filter, selected, onChange, noOptionsLabel, }: {
73
+ filter: DataTableServerFilter;
74
+ selected: string[];
75
+ onChange: (values: string[]) => void;
76
+ noOptionsLabel?: DataTableFacetedFilterLabels['noOptionsLabel'];
77
+ }): React.JSX.Element;
78
+
79
+ interface DataTableRowAction<TData> {
80
+ label: string;
81
+ icon?: IconComponent;
82
+ variant?: 'default' | 'destructive';
83
+ onClick: (row: TData) => void;
84
+ }
85
+ declare function RowActionsMenu<TData>({ row, actions, }: {
86
+ row: TData;
87
+ actions: DataTableRowAction<TData>[];
88
+ }): React.JSX.Element;
89
+
90
+ interface DataTableLabels {
91
+ searchPlaceholder: string;
92
+ emptyLabel: string;
93
+ createLabel: string;
94
+ clearFiltersLabel: string;
95
+ paginationLabel: (page: number, pages: number) => string;
96
+ noOptionsLabel: string;
97
+ totalLabel: (total: number) => string;
98
+ }
99
+ interface DataTableProps<TData, TValue> {
100
+ columns: ColumnDef<TData, TValue>[];
101
+ data: TData[];
102
+ searchPlaceholder?: DataTableLabels['searchPlaceholder'];
103
+ emptyLabel?: DataTableLabels['emptyLabel'];
104
+ createLabel?: DataTableLabels['createLabel'];
105
+ clearFiltersLabel?: DataTableLabels['clearFiltersLabel'];
106
+ paginationLabel?: DataTableLabels['paginationLabel'];
107
+ noOptionsLabel?: DataTableLabels['noOptionsLabel'];
108
+ totalLabel?: DataTableLabels['totalLabel'];
109
+ searchKey?: string;
110
+ pageSize?: number;
111
+ pageSizeOptions?: number[];
112
+ onPageSizeChange?: (size: number) => void;
113
+ filters?: DataTableFilter[];
114
+ serverFilters?: DataTableServerFilter[];
115
+ filterValues?: Record<string, string[]>;
116
+ onFilterChange?: (paramKey: string, values: string[]) => void;
117
+ canClearFilters?: boolean;
118
+ onClearFilters?: () => void;
119
+ toolbarExtra?: ReactNode;
120
+ toolbarAction?: ReactNode;
121
+ renderRow?: (row: Row<TData>) => ReactNode;
122
+ onRowClick?: (row: TData) => void;
123
+ isRowActive?: (row: TData) => boolean;
124
+ rowActions?: DataTableRowAction<TData>[];
125
+ searchValue?: string;
126
+ onSearchChange?: (value: string) => void;
127
+ manualPagination?: boolean;
128
+ pageCount?: number;
129
+ pageIndex?: number;
130
+ total?: number;
131
+ onPageChange?: (pageIndex: number) => void;
132
+ onCreate?: () => void;
133
+ }
134
+ declare function DataTable<TData, TValue>({ columns, data, searchKey, searchPlaceholder, pageSize, pageSizeOptions, onPageSizeChange, filters, serverFilters, filterValues, onFilterChange, canClearFilters, onClearFilters, toolbarExtra, toolbarAction, emptyLabel, clearFiltersLabel, paginationLabel, noOptionsLabel, totalLabel, renderRow, onRowClick, isRowActive, rowActions, searchValue, onSearchChange, manualPagination, pageCount, pageIndex, total, onPageChange, onCreate, createLabel, }: DataTableProps<TData, TValue>): React.JSX.Element;
135
+
136
+ interface DateRangeFilterLabels {
137
+ emptyLabel: string;
138
+ dateFormat: string;
139
+ }
140
+ declare function DateRangeFilter({ from, to, onChange, emptyLabel, dateFormat, }: {
141
+ from?: string;
142
+ to?: string;
143
+ onChange: (range: {
144
+ from?: string;
145
+ to?: string;
146
+ }) => void;
147
+ } & Partial<DateRangeFilterLabels>): React.JSX.Element;
148
+
149
+ export { Combobox as C, DataTable as D, FacetedFilter as F, RowActionsMenu as R, ServerFacetedFilter as S, type ComboboxLabels as a, type ComboboxOption as b, ConfirmDialog as c, type ConfirmDialogLabels as d, type DataTableFacetedFilterLabels as e, type DataTableFilter as f, type DataTableLabels as g, type DataTableRowAction as h, type DataTableServerFilter as i, DateRangeFilter as j, type DateRangeFilterLabels as k };