jvdm-ui 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/bin/jvdm-ui.mjs +49 -0
  4. package/dist/atoms/index.d.ts +343 -0
  5. package/dist/atoms/index.js +3 -0
  6. package/dist/atoms/index.js.map +1 -0
  7. package/dist/chunk-AHE2576G.js +682 -0
  8. package/dist/chunk-AHE2576G.js.map +1 -0
  9. package/dist/chunk-CGDYSB4G.js +3 -0
  10. package/dist/chunk-CGDYSB4G.js.map +1 -0
  11. package/dist/chunk-JYNDKPAH.js +362 -0
  12. package/dist/chunk-JYNDKPAH.js.map +1 -0
  13. package/dist/chunk-WWOXGKLF.js +724 -0
  14. package/dist/chunk-WWOXGKLF.js.map +1 -0
  15. package/dist/client/code-block.d.ts +9 -0
  16. package/dist/client/code-block.js +65 -0
  17. package/dist/client/code-block.js.map +1 -0
  18. package/dist/client/confirm-dialog.d.ts +16 -0
  19. package/dist/client/confirm-dialog.js +181 -0
  20. package/dist/client/confirm-dialog.js.map +1 -0
  21. package/dist/client/date-picker.d.ts +10 -0
  22. package/dist/client/date-picker.js +236 -0
  23. package/dist/client/date-picker.js.map +1 -0
  24. package/dist/client/file-upload.d.ts +12 -0
  25. package/dist/client/file-upload.js +58 -0
  26. package/dist/client/file-upload.js.map +1 -0
  27. package/dist/client/gallery.d.ts +14 -0
  28. package/dist/client/gallery.js +122 -0
  29. package/dist/client/gallery.js.map +1 -0
  30. package/dist/client/menu.d.ts +24 -0
  31. package/dist/client/menu.js +115 -0
  32. package/dist/client/menu.js.map +1 -0
  33. package/dist/client/modal.d.ts +19 -0
  34. package/dist/client/modal.js +147 -0
  35. package/dist/client/modal.js.map +1 -0
  36. package/dist/client/multi-select.d.ts +16 -0
  37. package/dist/client/multi-select.js +84 -0
  38. package/dist/client/multi-select.js.map +1 -0
  39. package/dist/client/number-input.d.ts +6 -0
  40. package/dist/client/number-input.js +59 -0
  41. package/dist/client/number-input.js.map +1 -0
  42. package/dist/client/password-input.d.ts +16 -0
  43. package/dist/client/password-input.js +103 -0
  44. package/dist/client/password-input.js.map +1 -0
  45. package/dist/client/pin-input.d.ts +10 -0
  46. package/dist/client/pin-input.js +55 -0
  47. package/dist/client/pin-input.js.map +1 -0
  48. package/dist/client/theme-toggle.d.ts +8 -0
  49. package/dist/client/theme-toggle.js +126 -0
  50. package/dist/client/theme-toggle.js.map +1 -0
  51. package/dist/client/theme.d.ts +8 -0
  52. package/dist/client/theme.js +32 -0
  53. package/dist/client/theme.js.map +1 -0
  54. package/dist/client/time-picker.d.ts +10 -0
  55. package/dist/client/time-picker.js +140 -0
  56. package/dist/client/time-picker.js.map +1 -0
  57. package/dist/index.d.ts +5 -0
  58. package/dist/index.js +6 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/molecules/index.d.ts +309 -0
  61. package/dist/molecules/index.js +4 -0
  62. package/dist/molecules/index.js.map +1 -0
  63. package/dist/organisms/index.d.ts +113 -0
  64. package/dist/organisms/index.js +4 -0
  65. package/dist/organisms/index.js.map +1 -0
  66. package/dist/presets/gavel.css +19 -0
  67. package/dist/theme/index.d.ts +60 -0
  68. package/dist/theme/index.js +85 -0
  69. package/dist/theme/index.js.map +1 -0
  70. package/dist/tokens/index.d.ts +8 -0
  71. package/dist/tokens/index.js +3 -0
  72. package/dist/tokens/index.js.map +1 -0
  73. package/dist/tokens.css +129 -0
  74. package/package.json +114 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/accordion/index.tsx","../src/molecules/banner/index.tsx","../src/molecules/breadcrumb/locales.ts","../src/molecules/breadcrumb/index.tsx","../src/molecules/callout/index.tsx","../src/molecules/card-title/index.tsx","../src/molecules/command-menu/locales.ts","../src/molecules/command-menu/index.tsx","../src/molecules/drawer/locales.ts","../src/molecules/drawer/index.tsx","../src/molecules/dropdown-menu/index.tsx","../src/molecules/empty/index.tsx","../src/molecules/field/index.tsx","../src/molecules/filter-bar/locales.ts","../src/molecules/filter-bar/index.tsx","../src/molecules/load-error/locales.ts","../src/molecules/load-error/index.tsx","../src/molecules/image-preview/index.tsx","../src/molecules/tree-view/node.tsx","../src/molecules/tree-view/locales.ts","../src/molecules/tree-view/index.tsx","../src/molecules/metric-card/index.tsx","../src/molecules/menu/menu-item-style.ts","../src/molecules/page-header/index.tsx","../src/molecules/pagination/locales.ts","../src/molecules/pagination/index.tsx","../src/molecules/snackbar-stack/locales.ts","../src/molecules/snackbar-stack/index.tsx","../src/molecules/stat-card/index.tsx","../src/molecules/stepper/index.tsx","../src/molecules/tabs/locales.ts","../src/molecules/tabs/index.tsx","../src/molecules/tooltip/index.tsx","../src/molecules/toast/locales.ts","../src/molecules/toast/index.tsx"],"names":["jsxs","jsx","TONES","locales","useRef","useEffect"],"mappings":"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","file":"chunk-AHE2576G.js","sourcesContent":["import type { ReactNode } from \"react\";\n\nimport { ChevronIcon } from \"../../atoms\";\n\nexport type AccordionItem = {\n id: string;\n title: ReactNode;\n content: ReactNode;\n defaultOpen?: boolean;\n};\n\nexport function Accordion({\n items,\n exclusive = false,\n name = \"accordion\",\n className = \"\",\n}: {\n items: readonly AccordionItem[];\n exclusive?: boolean;\n name?: string;\n className?: string;\n}) {\n return (\n <div\n className={`divide-y divide-line overflow-hidden rounded-md border border-line ${className}`}\n >\n {items.map((item) => (\n <details\n key={item.id}\n name={exclusive ? name : undefined}\n open={item.defaultOpen}\n className=\"group bg-surface\"\n >\n <summary className=\"flex min-h-12 cursor-pointer list-none items-center justify-between gap-3 px-4 text-sm text-ink transition-colors duration-(--duration-fast) ease-out hover:bg-raised focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-accent\">\n {item.title}\n <ChevronIcon\n className=\"text-ink-muted transition-transform duration-(--duration-fast) ease-out group-open:-rotate-180\"\n size=\"md\"\n />\n </summary>\n <div className=\"px-4 pb-4 text-sm text-ink-soft\">{item.content}</div>\n </details>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nconst TONES = {\n info: \"border-info/40 bg-info-soft text-info\",\n ok: \"border-ok/40 bg-ok-soft text-ok\",\n warn: \"border-warn/40 bg-warn-soft text-warn\",\n danger: \"border-danger/40 bg-danger-soft text-danger\",\n} as const;\nexport type BannerTone = keyof typeof TONES;\n\nexport function Banner({\n tone = \"info\",\n title,\n children,\n action,\n className = \"\",\n}: {\n tone?: BannerTone;\n title: string;\n children?: ReactNode;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <aside\n className={`flex flex-wrap items-center gap-4 rounded-md border px-4 py-3 ${TONES[tone]} ${className}`}\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{title}</p>\n {children ? <div className=\"mt-1 text-xs opacity-80\">{children}</div> : null}\n </div>\n {action}\n </aside>\n );\n}\n","export const locales = {\n label: \"Breadcrumb\",\n};\n","import type { ReactNode } from \"react\";\n\nimport { ChevronIcon } from \"../../atoms\";\nimport { locales } from \"./locales\";\n\nexport type Crumb = { id: string; label: ReactNode; href?: string };\n\nexport function Breadcrumb({\n items,\n label = locales.label,\n className = \"\",\n}: {\n items: readonly Crumb[];\n label?: string;\n className?: string;\n}) {\n return (\n <nav aria-label={label} className={className}>\n <ol className=\"flex flex-wrap items-center gap-1 text-xs\">\n {items.map((item, index) => {\n const last = index === items.length - 1;\n\n return (\n <li key={item.id} className=\"flex items-center gap-1\">\n {index > 0 ? <ChevronIcon className=\"-rotate-90 text-ink-dim\" size=\"sm\" /> : null}\n {last || !item.href ? (\n <span\n aria-current={last ? \"page\" : undefined}\n className={last ? \"font-medium text-ink\" : \"text-ink-muted\"}\n >\n {item.label}\n </span>\n ) : (\n <a\n href={item.href}\n className=\"rounded-xs px-1 py-0.5 text-ink-muted transition-colors duration-(--duration-fast) ease-out hover:bg-raised hover:text-ink-soft focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\"\n >\n {item.label}\n </a>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import type { ReactNode } from \"react\";\n\nconst TONES = {\n info: \"border-info/35 bg-info-soft text-info\",\n ok: \"border-ok/35 bg-ok-soft text-ok\",\n warn: \"border-warn/35 bg-warn-soft text-warn\",\n danger: \"border-danger/35 bg-danger-soft text-danger\",\n} as const;\n\nexport type CalloutTone = keyof typeof TONES;\n\nexport function Callout({\n tone = \"info\",\n title,\n children,\n className = \"\",\n}: {\n tone?: CalloutTone;\n title: string;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <aside className={`rounded-md border px-4 py-3 ${TONES[tone]} ${className}`}>\n <p className=\"text-sm font-medium\">{title}</p>\n <div className=\"mt-1 text-sm opacity-80\">{children}</div>\n </aside>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function CardTitle({ children, hint }: { children: ReactNode; hint?: ReactNode }) {\n return (\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"text-sm font-medium\">{children}</span>\n {hint ? <span className=\"shrink-0 text-xs text-ink-muted\">{hint}</span> : null}\n </div>\n );\n}\n","export const locales = { empty: \"No matching commands\", open: \"Open command menu\" };\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport { Button, Input, Kbd } from \"../../atoms\";\nimport { locales } from \"./locales\";\n\nexport type CommandItem = { id: string; label: string; description?: string; icon?: ReactNode };\n\nexport function CommandMenu({\n items,\n onSelect,\n label = \"Search commands\",\n global = false,\n}: {\n items: readonly CommandItem[];\n onSelect?: (item: CommandItem) => void;\n label?: string;\n global?: boolean;\n}) {\n const [query, setQuery] = useState(\"\");\n const [open, setOpen] = useState(!global);\n const inputRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (!global) return;\n function handleKey(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n event.preventDefault();\n setOpen(true);\n }\n if (event.key === \"Escape\") setOpen(false);\n }\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [global]);\n useEffect(() => {\n if (open) inputRef.current?.focus();\n }, [open]);\n const filtered = useMemo(\n () =>\n items.filter((item) =>\n `${item.label} ${item.description ?? \"\"}`.toLowerCase().includes(query.toLowerCase()),\n ),\n [items, query],\n );\n\n if (global && !open)\n return (\n <Button onClick={() => setOpen(true)} variant=\"secondary\">\n {locales.open}\n </Button>\n );\n const menu = (\n <div className=\"flex w-full max-w-lg flex-col gap-3 rounded-xl border border-line bg-surface p-3 shadow-modal\">\n <div className=\"flex items-center gap-3\">\n <Input\n aria-label={label}\n ref={inputRef}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={label}\n value={query}\n />\n <Kbd>⌘K</Kbd>\n </div>\n <div className=\"flex max-h-72 flex-col gap-1 overflow-y-auto\">\n {filtered.length ? (\n filtered.map((item) => (\n <Button\n className=\"justify-start text-left\"\n key={item.id}\n onClick={() => onSelect?.(item)}\n variant=\"ghost\"\n >\n <span className=\"flex min-w-0 flex-col items-start\">\n {item.label}\n {item.description ? (\n <span className=\"text-2xs text-ink-dim\">{item.description}</span>\n ) : null}\n </span>\n </Button>\n ))\n ) : (\n <p className=\"px-3 py-6 text-center text-sm text-ink-muted\">{locales.empty}</p>\n )}\n </div>\n </div>\n );\n return global ? (\n <div\n className=\"fixed inset-0 z-30 flex items-start justify-center bg-app/70 p-4 pt-24 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n >\n <div onClick={(event) => event.stopPropagation()}>{menu}</div>\n </div>\n ) : (\n menu\n );\n}\n","export const locales = { close: \"Close drawer\" };\n","\"use client\";\n\nimport { useEffect, useRef, type ReactNode } from \"react\";\n\nimport { CloseIcon, IconButton } from \"../../atoms\";\nimport { locales } from \"./locales\";\n\nexport function Drawer({\n isOpen,\n onClose,\n title,\n children,\n closeLabel = locales.close,\n}: {\n isOpen: boolean;\n onClose: () => void;\n title: ReactNode;\n children: ReactNode;\n closeLabel?: string;\n}) {\n const ref = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n const dialog = ref.current;\n if (!dialog) return;\n if (isOpen && !dialog.open) dialog.showModal();\n if (!isOpen && dialog.open) dialog.close();\n }, [isOpen]);\n\n useEffect(() => {\n const dialog = ref.current;\n if (!dialog) return;\n dialog.addEventListener(\"close\", onClose);\n return () => dialog.removeEventListener(\"close\", onClose);\n }, [onClose]);\n\n return (\n <dialog\n ref={ref}\n className=\"fixed inset-y-0 right-0 left-auto m-0 h-full max-h-none w-full max-w-md border-y-0 border-r-0 border-line bg-surface p-0 text-ink shadow-modal backdrop:bg-app/70 backdrop:backdrop-blur-sm sm:rounded-l-xl\"\n aria-modal=\"true\"\n >\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between gap-4 border-b border-line px-5 py-4\">\n <h2 className=\"text-lg font-bold\">{title}</h2>\n <IconButton label={closeLabel} onClick={onClose}>\n <CloseIcon size=\"md\" />\n </IconButton>\n </div>\n <div className=\"flex-1 overflow-y-auto px-5 py-5\">{children}</div>\n </div>\n </dialog>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function DropdownMenu({\n trigger,\n children,\n align = \"start\",\n className = \"\",\n}: {\n trigger: ReactNode;\n children: ReactNode;\n align?: \"start\" | \"end\";\n className?: string;\n}) {\n return (\n <details className={`group relative ${className}`}>\n <summary className=\"list-none [&::-webkit-details-marker]:hidden\">{trigger}</summary>\n <div\n className={`absolute top-full z-20 mt-2 min-w-48 rounded-md border border-line bg-surface p-1 shadow-popover ${align === \"end\" ? \"right-0\" : \"left-0\"}`}\n >\n {children}\n </div>\n </details>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function Empty({ title, description }: { title: string; description?: ReactNode }) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 py-16 text-center\">\n <p className=\"text-sm font-medium text-ink-soft\">{title}</p>\n {description ? <p className=\"max-w-sm text-sm text-ink-muted\">{description}</p> : null}\n </div>\n );\n}\n","import { cloneElement, isValidElement, useId, type ReactElement, type ReactNode } from \"react\";\n\nexport function Field({\n label,\n htmlFor,\n error,\n action,\n className = \"\",\n children,\n}: {\n label: string;\n htmlFor?: string;\n error?: string;\n action?: ReactNode;\n className?: string;\n children: ReactNode;\n}) {\n const errorId = useId();\n const control = isValidElement(children)\n ? (() => {\n const child = children as ReactElement<Record<string, unknown>>;\n const props = child.props;\n return cloneElement(child, {\n \"aria-describedby\": error\n ? [props[\"aria-describedby\"], errorId].filter(Boolean).join(\" \")\n : props[\"aria-describedby\"],\n \"aria-invalid\": error ? true : props[\"aria-invalid\"],\n });\n })()\n : children;\n\n return (\n <div className={`flex min-w-0 flex-col gap-2 ${className}`}>\n <div className=\"flex items-baseline justify-between gap-3\">\n <label htmlFor={htmlFor} className=\"text-xs font-medium text-ink-soft\">\n {label}\n </label>\n {action}\n </div>\n {control}\n {error ? (\n <span className=\"text-2xs text-danger\" id={errorId}>\n {error}\n </span>\n ) : null}\n </div>\n );\n}\n","export const locales = { clear: \"Clear filters\" };\n","import type { ReactNode } from \"react\";\n\nimport { locales } from \"./locales\";\n\nexport function FilterBar({\n children,\n resultLabel,\n onClear,\n className = \"\",\n}: {\n children: ReactNode;\n resultLabel?: string;\n onClear?: () => void;\n className?: string;\n}) {\n return (\n <div\n className={`flex flex-wrap items-center gap-3 rounded-md border border-line bg-panel p-3 ${className}`}\n >\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-3\">{children}</div>\n {resultLabel ? <span className=\"text-xs text-ink-muted\">{resultLabel}</span> : null}\n {onClear ? (\n <button\n className=\"text-xs text-accent-ink underline underline-offset-4\"\n onClick={onClear}\n type=\"button\"\n >\n {locales.clear}\n </button>\n ) : null}\n </div>\n );\n}\n","export const LOAD_ERROR = {\n retry: \"Try again\",\n};\n","import { buttonClass } from \"../../atoms\";\nimport { LOAD_ERROR as T } from \"./locales\";\n\nexport function LoadError({\n message,\n onRetry,\n retryLabel = T.retry,\n}: {\n message: string;\n onRetry?: () => void;\n retryLabel?: string;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 py-16 text-center\">\n <p className=\"text-sm text-danger\">{message}</p>\n {onRetry ? (\n <button type=\"button\" onClick={onRetry} className={buttonClass({ variant: \"secondary\" })}>\n {retryLabel}\n </button>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function ImagePreview({\n src,\n alt,\n fallback,\n className = \"\",\n}: {\n src?: string;\n alt: string;\n fallback?: ReactNode;\n className?: string;\n}) {\n return (\n <details className={`group ${className}`}>\n <summary className=\"cursor-zoom-in list-none overflow-hidden rounded-md bg-raised [&::-webkit-details-marker]:hidden\">\n {src ? (\n <img\n alt={alt}\n className=\"aspect-[4/3] w-full object-cover transition-transform duration-(--duration-base) ease-out group-hover:scale-[1.02]\"\n src={src}\n />\n ) : (\n fallback\n )}\n </summary>\n {src ? (\n <div className=\"fixed inset-0 z-30 flex items-center justify-center bg-app/85 p-6 backdrop-blur-sm\">\n <img\n alt={alt}\n className=\"max-h-[90dvh] max-w-full rounded-md object-contain shadow-modal\"\n src={src}\n />\n </div>\n ) : null}\n </details>\n );\n}\n","import type { TreeNode } from \"./index\";\n\nexport function TreeNodeView({ node }: { node: TreeNode }) {\n return node.children?.length ? (\n <details className=\"group\" open>\n <summary className=\"cursor-pointer list-none rounded-sm px-3 py-2 text-sm text-ink-soft hover:bg-raised [&::-webkit-details-marker]:hidden\">\n <span className=\"mr-2 text-ink-dim transition-transform duration-(--duration-fast) ease-out group-open:rotate-90\">\n ›\n </span>\n {node.label}\n </summary>\n <div className=\"ml-4 border-l border-line pl-2\">\n {node.children.map((child) => (\n <TreeNodeView key={child.id} node={child} />\n ))}\n </div>\n </details>\n ) : (\n <div className=\"rounded-sm px-3 py-2 text-sm text-ink-muted hover:bg-raised\">{node.label}</div>\n );\n}\n","export const locales = { label: \"Tree\" };\n","import type { ReactNode } from \"react\";\n\nimport { TreeNodeView } from \"./node\";\nimport { locales } from \"./locales\";\n\nexport type TreeNode = { id: string; label: ReactNode; children?: readonly TreeNode[] };\n\nexport function TreeView({\n nodes,\n className = \"\",\n}: {\n nodes: readonly TreeNode[];\n className?: string;\n}) {\n return (\n <nav aria-label={locales.label} className={`flex flex-col gap-1 ${className}`}>\n {nodes.map((node) => (\n <TreeNodeView key={node.id} node={node} />\n ))}\n </nav>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function MetricCard({\n label,\n value,\n change,\n trend = \"neutral\",\n hint,\n children,\n className = \"\",\n}: {\n label: string;\n value: ReactNode;\n change?: string;\n trend?: \"neutral\" | \"up\" | \"down\";\n hint?: string;\n children?: ReactNode;\n className?: string;\n}) {\n const trendColor =\n trend === \"up\" ? \"text-ok\" : trend === \"down\" ? \"text-danger\" : \"text-ink-muted\";\n return (\n <article className={`rounded-md border border-line bg-surface p-5 ${className}`}>\n <div className=\"flex items-start justify-between gap-4\">\n <span className=\"text-xs text-ink-muted\">{label}</span>\n {change ? <span className={`text-xs font-medium ${trendColor}`}>{change}</span> : null}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-ink\">{value}</p>\n {hint ? <p className=\"mt-1 text-xs text-ink-dim\">{hint}</p> : null}\n {children ? <div className=\"mt-4\">{children}</div> : null}\n </article>\n );\n}\n","export type MenuItemTone = \"neutral\" | \"danger\";\n\nconst TONES: Record<MenuItemTone, string> = {\n neutral: \"text-ink-soft hover:bg-raised hover:text-ink\",\n danger: \"text-danger hover:bg-danger-soft\",\n};\n\nconst BASE =\n \"flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-xs transition-colors duration-(--duration-fast) ease-out\" +\n \" focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\";\n\nexport type MenuItemOptions = {\n tone?: MenuItemTone;\n className?: string;\n};\n\nexport function menuItemClass({ tone = \"neutral\", className = \"\" }: MenuItemOptions = {}) {\n return `${BASE} ${TONES[tone]} ${className}`;\n}\n","import type { ReactNode } from \"react\";\n\nexport function PageHeader({\n title,\n subtitle,\n children,\n className = \"\",\n}: {\n title: ReactNode;\n subtitle?: ReactNode;\n children?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={`flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between sm:gap-4 ${className}`}\n >\n <div className=\"flex min-w-0 flex-col gap-1\">\n <h1 className=\"truncate text-xl font-bold\">{title}</h1>\n {subtitle ? <p className=\"text-sm text-ink-muted\">{subtitle}</p> : null}\n </div>\n {children ? <div className=\"flex w-full flex-wrap gap-3 sm:w-auto\">{children}</div> : null}\n </div>\n );\n}\n","export const PAGINATION = {\n label: { \"en-US\": \"Pagination\", \"pt-BR\": \"Paginação\" },\n previous: { \"en-US\": \"Previous\", \"pt-BR\": \"Anterior\" },\n next: { \"en-US\": \"Next\", \"pt-BR\": \"Próxima\" },\n page: { \"en-US\": (page: number) => `Page ${page}`, \"pt-BR\": (page: number) => `Página ${page}` },\n};\n","import { PAGINATION as T } from \"./locales\";\n\nexport function Pagination({\n page,\n pages,\n onPageChange,\n previousLabel = T.previous[\"en-US\"],\n nextLabel = T.next[\"en-US\"],\n pageLabel = T.page[\"en-US\"],\n label = T.label[\"en-US\"],\n className = \"\",\n}: {\n page: number;\n pages: number;\n onPageChange: (page: number) => void;\n previousLabel?: string;\n nextLabel?: string;\n pageLabel?: (page: number) => string;\n label?: string;\n className?: string;\n}) {\n const current = Math.min(Math.max(page, 1), Math.max(pages, 1));\n\n return (\n <nav aria-label={label} className={`flex flex-wrap items-center gap-2 ${className}`}>\n <button\n className=\"min-h-10 rounded-md border border-line-strong px-3 text-sm text-ink-soft transition-colors duration-(--duration-fast) ease-out hover:bg-raised disabled:pointer-events-none disabled:opacity-40\"\n disabled={current === 1}\n onClick={() => onPageChange(current - 1)}\n type=\"button\"\n >\n {previousLabel}\n </button>\n <span className=\"min-h-10 px-2 text-sm text-ink-muted\" aria-current=\"page\">\n {pageLabel(current)}\n </span>\n <button\n className=\"min-h-10 rounded-md border border-line-strong px-3 text-sm text-ink-soft transition-colors duration-(--duration-fast) ease-out hover:bg-raised disabled:pointer-events-none disabled:opacity-40\"\n disabled={current === pages}\n onClick={() => onPageChange(current + 1)}\n type=\"button\"\n >\n {nextLabel}\n </button>\n </nav>\n );\n}\n","export const locales = { dismiss: \"Dismiss notification\" };\n","import type { ReactNode } from \"react\";\n\nimport { locales } from \"./locales\";\n\nexport type Snackbar = {\n id: string;\n title: string;\n message?: ReactNode;\n tone?: \"neutral\" | \"ok\" | \"warn\" | \"danger\";\n};\n\nconst TONES = {\n neutral: \"border-line-strong\",\n ok: \"border-ok/50\",\n warn: \"border-warn/50\",\n danger: \"border-danger/50\",\n} as const;\n\nexport function SnackbarStack({\n items,\n onDismiss,\n className = \"\",\n}: {\n items: readonly Snackbar[];\n onDismiss?: (id: string) => void;\n className?: string;\n}) {\n return (\n <div\n aria-live=\"polite\"\n className={`fixed right-4 bottom-4 z-20 flex w-[min(24rem,calc(100vw-2rem))] flex-col gap-2 ${className}`}\n >\n {items.map((item) => (\n <div\n className={`flex items-start gap-3 rounded-md border bg-surface p-4 text-ink shadow-popover ${TONES[item.tone ?? \"neutral\"]}`}\n key={item.id}\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{item.title}</p>\n {item.message ? (\n <div className=\"mt-1 text-xs text-ink-muted\">{item.message}</div>\n ) : null}\n </div>\n {onDismiss ? (\n <button\n aria-label={locales.dismiss}\n className=\"text-xs text-ink-muted hover:text-ink\"\n onClick={() => onDismiss(item.id)}\n type=\"button\"\n >\n ×\n </button>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Card, Label } from \"../../atoms\";\n\nexport function StatCard({\n label,\n value,\n hint,\n color = \"\",\n attention = false,\n className = \"\",\n}: {\n label: string;\n value: ReactNode;\n hint?: string;\n color?: string;\n attention?: boolean;\n className?: string;\n}) {\n const length = String(value).length;\n const size = length <= 7 ? \"text-2xl\" : length <= 12 ? \"text-lg\" : \"text-sm\";\n\n return (\n <Card\n padding=\"sm\"\n className={`flex flex-col gap-1 ${attention ? \"attention\" : \"\"} ${className}`}\n >\n <Label>{label}</Label>\n <span className={`truncate ${size} leading-tight font-bold ${color}`}>{value}</span>\n {hint ? <span className=\"truncate text-xs text-ink-muted\">{hint}</span> : null}\n </Card>\n );\n}\n","export type Step = { id: string; label: string; description?: string };\n\nexport function Stepper({\n steps,\n current,\n className = \"\",\n}: {\n steps: readonly Step[];\n current: number;\n className?: string;\n}) {\n return (\n <ol className={`flex flex-col gap-4 sm:flex-row sm:items-start sm:gap-0 ${className}`}>\n {steps.map((step, index) => (\n <li\n className=\"relative flex flex-1 items-start gap-3 sm:flex-col sm:items-center sm:text-center\"\n key={step.id}\n >\n {index < steps.length - 1 ? (\n <span className=\"absolute top-5 left-5 h-full w-px bg-line sm:top-5 sm:left-1/2 sm:h-px sm:w-full\" />\n ) : null}\n <span\n className={`relative z-1 flex size-10 shrink-0 items-center justify-center rounded-full border text-sm font-medium ${index < current ? \"border-accent bg-accent text-on-accent\" : index === current ? \"border-accent text-accent-ink ring-4 ring-accent-soft\" : \"border-line-strong text-ink-dim\"}`}\n >\n {index + 1}\n </span>\n <span className=\"relative z-1 flex flex-col pt-2 sm:pt-3\">\n <strong className=\"text-sm text-ink\">{step.label}</strong>\n {step.description ? (\n <span className=\"mt-1 text-xs text-ink-muted\">{step.description}</span>\n ) : null}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n","export const TABS = {\n label: { \"en-US\": \"Tabs\", \"pt-BR\": \"Abas\" },\n};\n","import type { KeyboardEvent, ReactNode } from \"react\";\nimport { TABS as T } from \"./locales\";\n\nexport type Tab = {\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n};\n\nexport function Tabs({\n items,\n value,\n onValueChange,\n label = T.label[\"en-US\"],\n className = \"\",\n}: {\n items: Tab[];\n value: string;\n onValueChange: (value: string) => void;\n label?: string;\n className?: string;\n}) {\n const active = items.find((item) => item.value === value) ?? items[0];\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n const index = items.findIndex((item) => item.value === active?.value);\n const direction = event.key === \"ArrowRight\" ? 1 : event.key === \"ArrowLeft\" ? -1 : 0;\n const target =\n event.key === \"Home\"\n ? items[0]\n : event.key === \"End\"\n ? items.at(-1)\n : direction\n ? items[(index + direction + items.length) % items.length]\n : undefined;\n\n if (!target || target.disabled) return;\n event.preventDefault();\n onValueChange(target.value);\n }\n\n return (\n <div className={`flex min-w-0 flex-col gap-4 ${className}`}>\n <div\n aria-label={label}\n className=\"flex min-w-0 gap-1 overflow-x-auto border-b border-line\"\n role=\"tablist\"\n >\n {items.map((item) => (\n <button\n aria-selected={item.value === active?.value}\n id={`tab-${item.value}`}\n className={`min-h-10 shrink-0 border-b-2 px-3 text-sm transition-colors duration-(--duration-fast) ease-out ${\n item.value === active?.value\n ? \"border-accent font-medium text-ink\"\n : \"border-transparent text-ink-muted hover:border-line-strong hover:text-ink\"\n }`}\n disabled={item.disabled}\n key={item.value}\n onClick={() => onValueChange(item.value)}\n onKeyDown={onKeyDown}\n role=\"tab\"\n tabIndex={item.value === active?.value ? 0 : -1}\n type=\"button\"\n >\n {item.label}\n </button>\n ))}\n </div>\n {active ? (\n <div aria-labelledby={`tab-${active.value}`} role=\"tabpanel\">\n {active.content}\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nconst SIDES = {\n top: \"bottom-full left-1/2 mb-2 -translate-x-1/2\",\n bottom: \"top-full left-1/2 mt-2 -translate-x-1/2\",\n left: \"right-full top-1/2 mr-2 -translate-y-1/2\",\n right: \"left-full top-1/2 ml-2 -translate-y-1/2\",\n} as const;\n\nexport type TooltipSide = keyof typeof SIDES;\n\nexport function Tooltip({\n id,\n content,\n side = \"top\",\n children,\n className = \"\",\n}: {\n id: string;\n content: ReactNode;\n side?: TooltipSide;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <span className={`group relative inline-flex ${className}`}>\n <span aria-describedby={id} className=\"inline-flex\">\n {children}\n </span>\n <span\n id={id}\n role=\"tooltip\"\n className={`pointer-events-none absolute z-50 w-max max-w-64 rounded-sm border border-line-strong bg-raised px-2 py-1 text-2xs text-ink-soft opacity-0 shadow-popover transition-opacity duration-(--duration-fast) ease-out group-focus-within:opacity-100 group-hover:opacity-100 ${SIDES[side]}`}\n >\n {content}\n </span>\n </span>\n );\n}\n","export const locales = { dismiss: \"Dismiss notification\" };\n","import type { ReactNode } from \"react\";\n\nimport { locales } from \"./locales\";\n\nconst TONES = {\n info: \"border-info/35 bg-surface\",\n ok: \"border-ok/35 bg-surface\",\n warn: \"border-warn/35 bg-surface\",\n danger: \"border-danger/35 bg-surface\",\n} as const;\n\nexport type ToastTone = keyof typeof TONES;\n\nexport function Toast({\n tone = \"info\",\n title,\n children,\n onDismiss,\n dismissLabel = locales.dismiss,\n className = \"\",\n}: {\n tone?: ToastTone;\n title: string;\n children?: ReactNode;\n onDismiss?: () => void;\n dismissLabel?: string;\n className?: string;\n}) {\n return (\n <div\n aria-live=\"polite\"\n className={`flex items-start gap-4 rounded-md border p-4 shadow-popover ${TONES[tone]} ${className}`}\n role=\"status\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-ink\">{title}</p>\n {children ? <div className=\"mt-1 text-xs text-ink-muted\">{children}</div> : null}\n </div>\n {onDismiss ? (\n <button\n aria-label={dismissLabel}\n className=\"rounded-xs px-1 text-xs text-ink-muted transition-colors duration-(--duration-fast) ease-out hover:text-ink focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\"\n onClick={onDismiss}\n type=\"button\"\n >\n ×\n </button>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { applyStoredTheme, useTheme } from 'jvdm-ui/client/theme';
2
+ //# sourceMappingURL=chunk-CGDYSB4G.js.map
3
+ //# sourceMappingURL=chunk-CGDYSB4G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CGDYSB4G.js","sourcesContent":[]}
@@ -0,0 +1,362 @@
1
+ import { Input, Label } from './chunk-WWOXGKLF.js';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+ import 'react';
4
+
5
+ function BarChart({
6
+ data,
7
+ top,
8
+ ticks,
9
+ describe,
10
+ tooltip,
11
+ peakKey,
12
+ zeroStub = false
13
+ }) {
14
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
15
+ /* @__PURE__ */ jsxs("div", { className: "relative h-32 pl-8", children: [
16
+ ticks.map((t) => /* @__PURE__ */ jsxs(
17
+ "div",
18
+ {
19
+ className: "absolute right-0 left-8 flex items-center",
20
+ style: { bottom: `${t / top * 100}%` },
21
+ children: [
22
+ /* @__PURE__ */ jsx("span", { className: "absolute right-full mr-2 text-2xs text-ink-dim tabular-nums", children: t }),
23
+ /* @__PURE__ */ jsx("div", { className: "h-px w-full bg-line" })
24
+ ]
25
+ },
26
+ t
27
+ )),
28
+ /* @__PURE__ */ jsx("div", { className: "relative flex h-full items-end gap-2", children: data.map((bar) => {
29
+ const isPeak = bar.key === peakKey;
30
+ const empty = bar.value <= 0;
31
+ return /* @__PURE__ */ jsxs(
32
+ "div",
33
+ {
34
+ tabIndex: 0,
35
+ "aria-label": describe(bar),
36
+ className: "group relative flex h-full flex-1 items-end rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
37
+ children: [
38
+ /* @__PURE__ */ jsx(
39
+ "div",
40
+ {
41
+ className: `mx-auto w-full max-w-6 rounded-t-xs transition-colors duration-(--duration-fast) ease-out ${empty ? zeroStub ? "bg-line-strong" : "" : `min-h-1 ${isPeak ? "bg-accent" : "bg-accent/60 group-hover:bg-accent"}`}`,
42
+ style: {
43
+ height: empty ? zeroStub ? "4px" : 0 : `${bar.value / top * 100}%`
44
+ }
45
+ }
46
+ ),
47
+ isPeak ? /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute inset-x-0 bottom-full mb-1 text-center text-2xs font-medium tabular-nums group-hover:opacity-0", children: bar.value }) : null,
48
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 -translate-x-1/2 rounded-md border border-line-strong bg-raised px-2 py-1 text-2xs whitespace-nowrap text-ink-soft opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100", children: tooltip(bar) })
49
+ ]
50
+ },
51
+ bar.key
52
+ );
53
+ }) })
54
+ ] }),
55
+ /* @__PURE__ */ jsx("div", { className: "flex gap-2 pl-8", children: data.map((bar, i) => /* @__PURE__ */ jsx("span", { className: "flex-1 text-center text-2xs text-ink-dim", children: i % 2 === 0 ? bar.label : "" }, bar.key)) })
56
+ ] });
57
+ }
58
+ function LineChart({
59
+ data,
60
+ top,
61
+ ticks,
62
+ describe,
63
+ tooltip,
64
+ area = true
65
+ }) {
66
+ const span = Math.max(data.length - 1, 1);
67
+ const at = (point, index) => ({
68
+ x: index / span * 100,
69
+ y: 100 - Math.min(point.value, top) / top * 100
70
+ });
71
+ const points = data.map((point, index) => at(point, index));
72
+ const line = points.map((p) => `${p.x},${p.y}`).join(" ");
73
+ const shape = `0,100 ${line} 100,100`;
74
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
75
+ /* @__PURE__ */ jsxs("div", { className: "relative h-32 pl-8", children: [
76
+ ticks.map((t) => /* @__PURE__ */ jsxs(
77
+ "div",
78
+ {
79
+ className: "absolute right-0 left-8 flex items-center",
80
+ style: { bottom: `${t / top * 100}%` },
81
+ children: [
82
+ /* @__PURE__ */ jsx("span", { className: "absolute right-full mr-2 text-2xs text-ink-dim tabular-nums", children: t }),
83
+ /* @__PURE__ */ jsx("div", { className: "h-px w-full bg-line" })
84
+ ]
85
+ },
86
+ t
87
+ )),
88
+ /* @__PURE__ */ jsxs("div", { className: "relative h-full", children: [
89
+ /* @__PURE__ */ jsxs(
90
+ "svg",
91
+ {
92
+ className: "h-full w-full overflow-visible",
93
+ viewBox: "0 0 100 100",
94
+ preserveAspectRatio: "none",
95
+ "aria-hidden": "true",
96
+ children: [
97
+ area ? /* @__PURE__ */ jsx("polygon", { points: shape, className: "fill-accent/12" }) : null,
98
+ /* @__PURE__ */ jsx(
99
+ "polyline",
100
+ {
101
+ points: line,
102
+ className: "stroke-accent",
103
+ fill: "none",
104
+ strokeWidth: "2",
105
+ strokeLinecap: "round",
106
+ strokeLinejoin: "round",
107
+ vectorEffect: "non-scaling-stroke"
108
+ }
109
+ )
110
+ ]
111
+ }
112
+ ),
113
+ data.map((point, index) => {
114
+ const p = points[index];
115
+ return /* @__PURE__ */ jsxs(
116
+ "div",
117
+ {
118
+ tabIndex: 0,
119
+ "aria-label": describe(point),
120
+ className: "group absolute size-6 -translate-x-1/2 -translate-y-1/2 rounded-full focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
121
+ style: { left: `${p.x}%`, top: `${p.y}%` },
122
+ children: [
123
+ /* @__PURE__ */ jsx("span", { className: "absolute inset-0 m-auto size-2 rounded-full bg-app ring-2 ring-accent transition-transform duration-(--duration-fast) ease-out group-hover:scale-150 group-focus-visible:scale-150" }),
124
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 -translate-x-1/2 rounded-sm border border-line-strong bg-raised px-2 py-1 text-2xs whitespace-nowrap text-ink-soft opacity-0 shadow-popover transition-opacity duration-(--duration-fast) ease-out group-hover:opacity-100 group-focus-visible:opacity-100", children: tooltip(point) })
125
+ ]
126
+ },
127
+ point.key
128
+ );
129
+ })
130
+ ] })
131
+ ] }),
132
+ /* @__PURE__ */ jsx("div", { className: "flex gap-2 pl-8", children: data.map((point, i) => /* @__PURE__ */ jsx("span", { className: "flex-1 text-center text-2xs text-ink-dim", children: i % 2 === 0 ? point.label : "" }, point.key)) })
133
+ ] });
134
+ }
135
+ function DonutChart({
136
+ data,
137
+ total,
138
+ label,
139
+ children
140
+ }) {
141
+ const circumference = 2 * Math.PI * 38;
142
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
143
+ /* @__PURE__ */ jsxs("div", { className: "relative size-36 shrink-0", children: [
144
+ /* @__PURE__ */ jsxs("svg", { className: "size-full -rotate-90", viewBox: "0 0 100 100", role: "img", "aria-label": label, children: [
145
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "38", fill: "none", stroke: "var(--color-line)", strokeWidth: "12" }),
146
+ data.map((datum, index) => {
147
+ const length = datum.value / total * circumference;
148
+ const offset = data.slice(0, index).reduce((sum, item) => sum + item.value / total * circumference, 0);
149
+ return /* @__PURE__ */ jsx(
150
+ "circle",
151
+ {
152
+ cx: "50",
153
+ cy: "50",
154
+ r: "38",
155
+ fill: "none",
156
+ stroke: datum.color,
157
+ strokeDasharray: `${length} ${circumference - length}`,
158
+ strokeDashoffset: -offset,
159
+ strokeWidth: "12"
160
+ },
161
+ datum.id
162
+ );
163
+ })
164
+ ] }),
165
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-center", children })
166
+ ] }),
167
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: data.map((datum) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-ink-muted", children: [
168
+ /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full", style: { backgroundColor: datum.color } }),
169
+ datum.label,
170
+ /* @__PURE__ */ jsx("span", { className: "ml-auto pl-4 font-mono text-2xs text-ink-dim", children: datum.value })
171
+ ] }, datum.id)) })
172
+ ] });
173
+ }
174
+ function AreaChart({
175
+ data,
176
+ top,
177
+ label
178
+ }) {
179
+ const span = Math.max(data.length - 1, 1);
180
+ const points = data.map(
181
+ (point, index) => `${index / span * 100},${100 - Math.min(point.value, top) / top * 100}`
182
+ );
183
+ const line = points.join(" ");
184
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
185
+ /* @__PURE__ */ jsxs(
186
+ "svg",
187
+ {
188
+ "aria-label": label,
189
+ className: "h-40 w-full overflow-visible",
190
+ preserveAspectRatio: "none",
191
+ role: "img",
192
+ viewBox: "0 0 100 100",
193
+ children: [
194
+ /* @__PURE__ */ jsx("polygon", { className: "fill-accent-soft", points: `0,100 ${line} 100,100` }),
195
+ /* @__PURE__ */ jsx(
196
+ "polyline",
197
+ {
198
+ className: "stroke-accent",
199
+ fill: "none",
200
+ points: line,
201
+ strokeWidth: "2",
202
+ vectorEffect: "non-scaling-stroke"
203
+ }
204
+ )
205
+ ]
206
+ }
207
+ ),
208
+ /* @__PURE__ */ jsx("div", { className: "flex justify-between text-2xs text-ink-dim", children: data.map((point) => /* @__PURE__ */ jsx("span", { children: point.label }, point.label)) })
209
+ ] });
210
+ }
211
+ function Sparkline({ data, describe }) {
212
+ const max = Math.max(...data.map((b) => b.value), 1);
213
+ return /* @__PURE__ */ jsx("div", { className: "flex h-[72px] items-end gap-2", children: data.map((bar) => /* @__PURE__ */ jsx(
214
+ "div",
215
+ {
216
+ className: "flex-1 rounded-xs bg-accent/70",
217
+ style: { height: `${bar.value / max * 100}%` },
218
+ title: describe(bar)
219
+ },
220
+ bar.key
221
+ )) });
222
+ }
223
+
224
+ // src/organisms/data-table/locales.ts
225
+ var locales = { filterLabel: "Filter table", filterPlaceholder: "Filter rows" };
226
+ var GRID_ROW = "grid grid-cols-[var(--cols)] items-center";
227
+ var HEADER = `${GRID_ROW} h-[34px]`;
228
+ function DataTable({
229
+ columns,
230
+ items,
231
+ rowKey,
232
+ headerClassName = "px-4 border-b border-line",
233
+ bodyClassName = "",
234
+ loading,
235
+ empty,
236
+ className = "",
237
+ filter = "",
238
+ onFilterChange,
239
+ sort,
240
+ onSortChange
241
+ }) {
242
+ const style = { "--cols": columns.map((c) => c.width).join(" ") };
243
+ const visibleItems = items?.filter(
244
+ (item) => !filter || columns.some(
245
+ (column) => String(column.render(item)).toLowerCase().includes(filter.toLowerCase())
246
+ )
247
+ );
248
+ const sortedItems = sort ? [...visibleItems ?? []].sort((a, b) => {
249
+ const column = columns.find((item) => item.key === sort.key);
250
+ if (!column?.sortValue) return 0;
251
+ const left = column.sortValue(a);
252
+ const right = column.sortValue(b);
253
+ return (left < right ? -1 : left > right ? 1 : 0) * (sort.direction === "asc" ? 1 : -1);
254
+ }) : visibleItems;
255
+ return /* @__PURE__ */ jsx("div", { className: "min-w-0 overflow-x-auto overscroll-contain", children: /* @__PURE__ */ jsxs(
256
+ "div",
257
+ {
258
+ "aria-rowcount": items?.length,
259
+ className: `flex min-h-0 min-w-[32rem] flex-col ${className}`,
260
+ role: "table",
261
+ style,
262
+ children: [
263
+ onFilterChange ? /* @__PURE__ */ jsx("div", { className: "border-b border-line px-4 py-3", children: /* @__PURE__ */ jsx(
264
+ Input,
265
+ {
266
+ "aria-label": locales.filterLabel,
267
+ onChange: (event) => onFilterChange(event.target.value),
268
+ placeholder: locales.filterPlaceholder,
269
+ value: filter
270
+ }
271
+ ) }) : null,
272
+ /* @__PURE__ */ jsx("div", { className: `${HEADER} ${headerClassName}`, role: "row", children: columns.map((c) => /* @__PURE__ */ jsx(
273
+ "div",
274
+ {
275
+ className: c.align === "right" ? "text-right" : "",
276
+ role: "columnheader",
277
+ children: c.sortable && onSortChange ? /* @__PURE__ */ jsxs("button", { className: "text-left", onClick: () => onSortChange(c.key), type: "button", children: [
278
+ /* @__PURE__ */ jsx(Label, { tone: "dim", children: c.label }),
279
+ sort?.key === c.key ? /* @__PURE__ */ jsx("span", { className: "ml-2 text-2xs text-accent-ink", children: sort.direction === "asc" ? "\u2191" : "\u2193" }) : null
280
+ ] }) : /* @__PURE__ */ jsx(Label, { tone: "dim", children: c.label })
281
+ },
282
+ c.key
283
+ )) }),
284
+ /* @__PURE__ */ jsxs("div", { className: bodyClassName, children: [
285
+ loading ?? null,
286
+ !loading && sortedItems?.length === 0 ? empty : null,
287
+ !loading ? sortedItems?.map((item) => /* @__PURE__ */ jsx("div", { className: `${GRID_ROW} h-12 px-4 text-sm`, role: "row", children: columns.map((column) => /* @__PURE__ */ jsx(
288
+ "span",
289
+ {
290
+ className: column.align === "right" ? "text-right" : "",
291
+ role: "cell",
292
+ children: column.render(item)
293
+ },
294
+ column.key
295
+ )) }, rowKey(item))) : null
296
+ ] })
297
+ ]
298
+ }
299
+ ) });
300
+ }
301
+ function KanbanBoard({
302
+ columns,
303
+ className = ""
304
+ }) {
305
+ return /* @__PURE__ */ jsx(
306
+ "div",
307
+ {
308
+ className: `grid min-w-[48rem] grid-cols-${columns.length} gap-4 ${className}`,
309
+ style: { gridTemplateColumns: `repeat(${columns.length}, minmax(15rem, 1fr))` },
310
+ children: columns.map((column) => /* @__PURE__ */ jsxs("section", { className: "flex flex-col gap-3 rounded-md bg-panel p-3", children: [
311
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
312
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-medium text-ink", children: column.title }),
313
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-2xs text-ink-dim", children: column.cards.length })
314
+ ] }),
315
+ column.cards.map((card) => /* @__PURE__ */ jsxs(
316
+ "article",
317
+ {
318
+ className: "rounded-sm border border-line bg-surface p-4 transition-transform duration-(--duration-fast) ease-out hover:-translate-y-0.5",
319
+ children: [
320
+ /* @__PURE__ */ jsx("h4", { className: "text-sm font-medium text-ink", children: card.title }),
321
+ card.description ? /* @__PURE__ */ jsx("div", { className: "mt-2 text-xs text-ink-muted", children: card.description }) : null,
322
+ card.meta ? /* @__PURE__ */ jsx("div", { className: "mt-4 text-2xs text-ink-dim", children: card.meta }) : null
323
+ ]
324
+ },
325
+ card.id
326
+ ))
327
+ ] }, column.id))
328
+ }
329
+ );
330
+ }
331
+ var DOTS = {
332
+ neutral: "bg-line-strong",
333
+ accent: "bg-accent",
334
+ ok: "bg-ok",
335
+ warn: "bg-warn",
336
+ danger: "bg-danger"
337
+ };
338
+ function Timeline({
339
+ items,
340
+ className = ""
341
+ }) {
342
+ return /* @__PURE__ */ jsx("ol", { className: `flex flex-col ${className}`, children: items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: "relative flex gap-4 pb-6 last:pb-0", children: [
343
+ index < items.length - 1 ? /* @__PURE__ */ jsx("span", { className: "absolute top-3 bottom-0 left-1 w-px bg-line" }) : null,
344
+ /* @__PURE__ */ jsx(
345
+ "span",
346
+ {
347
+ className: `relative z-1 mt-1 size-2.5 shrink-0 rounded-full ring-4 ring-surface ${DOTS[item.tone ?? "neutral"]}`
348
+ }
349
+ ),
350
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
351
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1", children: [
352
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-ink", children: item.title }),
353
+ /* @__PURE__ */ jsx("time", { className: "text-2xs text-ink-dim", children: item.meta })
354
+ ] }),
355
+ item.children ? /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-ink-muted", children: item.children }) : null
356
+ ] })
357
+ ] }, item.id)) });
358
+ }
359
+
360
+ export { AreaChart, BarChart, DataTable, DonutChart, GRID_ROW, KanbanBoard, LineChart, Sparkline, Timeline };
361
+ //# sourceMappingURL=chunk-JYNDKPAH.js.map
362
+ //# sourceMappingURL=chunk-JYNDKPAH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/organisms/chart/bar-chart/index.tsx","../src/organisms/chart/line-chart/index.tsx","../src/organisms/chart/donut-chart/index.tsx","../src/organisms/chart/area-chart/index.tsx","../src/organisms/chart/sparkline/index.tsx","../src/organisms/data-table/locales.ts","../src/organisms/data-table/index.tsx","../src/organisms/kanban-board/index.tsx","../src/organisms/timeline/index.tsx"],"names":["jsxs","Fragment","jsx"],"mappings":"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","file":"chunk-JYNDKPAH.js","sourcesContent":["import type { ReactNode } from \"react\";\n\nimport type { Bar } from \"../bar\";\nexport function BarChart({\n data,\n top,\n ticks,\n describe,\n tooltip,\n peakKey,\n zeroStub = false,\n}: {\n data: Bar[];\n top: number;\n ticks: number[];\n describe: (bar: Bar) => string;\n tooltip: (bar: Bar) => ReactNode;\n peakKey?: string;\n zeroStub?: boolean;\n}) {\n return (\n <>\n <div className=\"relative h-32 pl-8\">\n {ticks.map((t) => (\n <div\n key={t}\n className=\"absolute right-0 left-8 flex items-center\"\n style={{ bottom: `${(t / top) * 100}%` }}\n >\n <span className=\"absolute right-full mr-2 text-2xs text-ink-dim tabular-nums\">{t}</span>\n <div className=\"h-px w-full bg-line\" />\n </div>\n ))}\n\n <div className=\"relative flex h-full items-end gap-2\">\n {data.map((bar) => {\n const isPeak = bar.key === peakKey;\n const empty = bar.value <= 0;\n\n return (\n <div\n key={bar.key}\n tabIndex={0}\n aria-label={describe(bar)}\n className=\"group relative flex h-full flex-1 items-end rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\"\n >\n <div\n className={`mx-auto w-full max-w-6 rounded-t-xs transition-colors duration-(--duration-fast) ease-out ${\n empty\n ? zeroStub\n ? \"bg-line-strong\"\n : \"\"\n : `min-h-1 ${isPeak ? \"bg-accent\" : \"bg-accent/60 group-hover:bg-accent\"}`\n }`}\n style={{\n height: empty ? (zeroStub ? \"4px\" : 0) : `${(bar.value / top) * 100}%`,\n }}\n />\n\n {}\n {isPeak ? (\n <span className=\"pointer-events-none absolute inset-x-0 bottom-full mb-1 text-center text-2xs font-medium tabular-nums group-hover:opacity-0\">\n {bar.value}\n </span>\n ) : null}\n\n <span className=\"pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 -translate-x-1/2 rounded-md border border-line-strong bg-raised px-2 py-1 text-2xs whitespace-nowrap text-ink-soft opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100\">\n {tooltip(bar)}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"flex gap-2 pl-8\">\n {data.map((bar, i) => (\n <span key={bar.key} className=\"flex-1 text-center text-2xs text-ink-dim\">\n {i % 2 === 0 ? bar.label : \"\"}\n </span>\n ))}\n </div>\n </>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport type { Bar } from \"../bar\";\n\nexport function LineChart({\n data,\n top,\n ticks,\n describe,\n tooltip,\n area = true,\n}: {\n data: Bar[];\n top: number;\n ticks: number[];\n describe: (point: Bar) => string;\n tooltip: (point: Bar) => ReactNode;\n area?: boolean;\n}) {\n const span = Math.max(data.length - 1, 1);\n const at = (point: Bar, index: number) => ({\n x: (index / span) * 100,\n y: 100 - (Math.min(point.value, top) / top) * 100,\n });\n\n const points = data.map((point, index) => at(point, index));\n const line = points.map((p) => `${p.x},${p.y}`).join(\" \");\n const shape = `0,100 ${line} 100,100`;\n\n return (\n <>\n <div className=\"relative h-32 pl-8\">\n {ticks.map((t) => (\n <div\n key={t}\n className=\"absolute right-0 left-8 flex items-center\"\n style={{ bottom: `${(t / top) * 100}%` }}\n >\n <span className=\"absolute right-full mr-2 text-2xs text-ink-dim tabular-nums\">{t}</span>\n <div className=\"h-px w-full bg-line\" />\n </div>\n ))}\n\n <div className=\"relative h-full\">\n <svg\n className=\"h-full w-full overflow-visible\"\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n {area ? <polygon points={shape} className=\"fill-accent/12\" /> : null}\n <polyline\n points={line}\n className=\"stroke-accent\"\n fill=\"none\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n\n {data.map((point, index) => {\n const p = points[index];\n\n return (\n <div\n key={point.key}\n tabIndex={0}\n aria-label={describe(point)}\n className=\"group absolute size-6 -translate-x-1/2 -translate-y-1/2 rounded-full focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\"\n style={{ left: `${p.x}%`, top: `${p.y}%` }}\n >\n <span className=\"absolute inset-0 m-auto size-2 rounded-full bg-app ring-2 ring-accent transition-transform duration-(--duration-fast) ease-out group-hover:scale-150 group-focus-visible:scale-150\" />\n <span className=\"pointer-events-none absolute bottom-full left-1/2 z-10 mb-1 -translate-x-1/2 rounded-sm border border-line-strong bg-raised px-2 py-1 text-2xs whitespace-nowrap text-ink-soft opacity-0 shadow-popover transition-opacity duration-(--duration-fast) ease-out group-hover:opacity-100 group-focus-visible:opacity-100\">\n {tooltip(point)}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"flex gap-2 pl-8\">\n {data.map((point, i) => (\n <span key={point.key} className=\"flex-1 text-center text-2xs text-ink-dim\">\n {i % 2 === 0 ? point.label : \"\"}\n </span>\n ))}\n </div>\n </>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type DonutDatum = { id: string; label: string; value: number; color: string };\n\nexport function DonutChart({\n data,\n total,\n label,\n children,\n}: {\n data: readonly DonutDatum[];\n total: number;\n label: string;\n children?: ReactNode;\n}) {\n const circumference = 2 * Math.PI * 38;\n return (\n <div className=\"flex items-center gap-6\">\n <div className=\"relative size-36 shrink-0\">\n <svg className=\"size-full -rotate-90\" viewBox=\"0 0 100 100\" role=\"img\" aria-label={label}>\n <circle cx=\"50\" cy=\"50\" r=\"38\" fill=\"none\" stroke=\"var(--color-line)\" strokeWidth=\"12\" />\n {data.map((datum, index) => {\n const length = (datum.value / total) * circumference;\n const offset = data\n .slice(0, index)\n .reduce((sum, item) => sum + (item.value / total) * circumference, 0);\n return (\n <circle\n key={datum.id}\n cx=\"50\"\n cy=\"50\"\n r=\"38\"\n fill=\"none\"\n stroke={datum.color}\n strokeDasharray={`${length} ${circumference - length}`}\n strokeDashoffset={-offset}\n strokeWidth=\"12\"\n />\n );\n })}\n </svg>\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\n {children}\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n {data.map((datum) => (\n <div className=\"flex items-center gap-2 text-xs text-ink-muted\" key={datum.id}>\n <span className=\"size-2 rounded-full\" style={{ backgroundColor: datum.color }} />\n {datum.label}\n <span className=\"ml-auto pl-4 font-mono text-2xs text-ink-dim\">{datum.value}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","export type AreaPoint = { label: string; value: number };\n\nexport function AreaChart({\n data,\n top,\n label,\n}: {\n data: readonly AreaPoint[];\n top: number;\n label: string;\n}) {\n const span = Math.max(data.length - 1, 1);\n const points = data.map(\n (point, index) => `${(index / span) * 100},${100 - (Math.min(point.value, top) / top) * 100}`,\n );\n const line = points.join(\" \");\n return (\n <div className=\"flex flex-col gap-2\">\n <svg\n aria-label={label}\n className=\"h-40 w-full overflow-visible\"\n preserveAspectRatio=\"none\"\n role=\"img\"\n viewBox=\"0 0 100 100\"\n >\n <polygon className=\"fill-accent-soft\" points={`0,100 ${line} 100,100`} />\n <polyline\n className=\"stroke-accent\"\n fill=\"none\"\n points={line}\n strokeWidth=\"2\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n <div className=\"flex justify-between text-2xs text-ink-dim\">\n {data.map((point) => (\n <span key={point.label}>{point.label}</span>\n ))}\n </div>\n </div>\n );\n}\n","import type { Bar } from \"../bar\";\n\nexport function Sparkline({ data, describe }: { data: Bar[]; describe: (bar: Bar) => string }) {\n const max = Math.max(...data.map((b) => b.value), 1);\n\n return (\n <div className=\"flex h-[72px] items-end gap-2\">\n {data.map((bar) => (\n <div\n key={bar.key}\n className=\"flex-1 rounded-xs bg-accent/70\"\n style={{ height: `${(bar.value / max) * 100}%` }}\n title={describe(bar)}\n />\n ))}\n </div>\n );\n}\n","export const locales = { filterLabel: \"Filter table\", filterPlaceholder: \"Filter rows\" };\n","import { type CSSProperties, type ReactNode } from \"react\";\n\nimport { Input, Label } from \"../../atoms\";\nimport { locales } from \"./locales\";\n\nexport type Column<T = unknown> = {\n key: string;\n label: string;\n width: string;\n align?: \"left\" | \"right\";\n render: (item: T) => ReactNode;\n sortable?: boolean;\n sortValue?: (item: T) => string | number;\n};\n\nexport const GRID_ROW = \"grid grid-cols-[var(--cols)] items-center\";\n\nconst HEADER = `${GRID_ROW} h-[34px]`;\n\nexport function DataTable<T>({\n columns,\n items,\n rowKey,\n headerClassName = \"px-4 border-b border-line\",\n bodyClassName = \"\",\n loading,\n empty,\n className = \"\",\n filter = \"\",\n onFilterChange,\n sort,\n onSortChange,\n}: {\n columns: Column<T>[];\n items?: T[];\n rowKey: (item: T) => string;\n headerClassName?: string;\n bodyClassName?: string;\n loading?: ReactNode;\n empty?: ReactNode;\n className?: string;\n filter?: string;\n onFilterChange?: (value: string) => void;\n sort?: { key: string; direction: \"asc\" | \"desc\" };\n onSortChange?: (key: string) => void;\n}) {\n const style = { \"--cols\": columns.map((c) => c.width).join(\" \") } as CSSProperties;\n const visibleItems = items?.filter(\n (item) =>\n !filter ||\n columns.some((column) =>\n String(column.render(item)).toLowerCase().includes(filter.toLowerCase()),\n ),\n );\n const sortedItems = sort\n ? [...(visibleItems ?? [])].sort((a, b) => {\n const column = columns.find((item) => item.key === sort.key);\n if (!column?.sortValue) return 0;\n const left = column.sortValue(a);\n const right = column.sortValue(b);\n return (left < right ? -1 : left > right ? 1 : 0) * (sort.direction === \"asc\" ? 1 : -1);\n })\n : visibleItems;\n\n return (\n <div className=\"min-w-0 overflow-x-auto overscroll-contain\">\n <div\n aria-rowcount={items?.length}\n className={`flex min-h-0 min-w-[32rem] flex-col ${className}`}\n role=\"table\"\n style={style}\n >\n {onFilterChange ? (\n <div className=\"border-b border-line px-4 py-3\">\n <Input\n aria-label={locales.filterLabel}\n onChange={(event) => onFilterChange(event.target.value)}\n placeholder={locales.filterPlaceholder}\n value={filter}\n />\n </div>\n ) : null}\n <div className={`${HEADER} ${headerClassName}`} role=\"row\">\n {columns.map((c) => (\n <div\n key={c.key}\n className={c.align === \"right\" ? \"text-right\" : \"\"}\n role=\"columnheader\"\n >\n {c.sortable && onSortChange ? (\n <button className=\"text-left\" onClick={() => onSortChange(c.key)} type=\"button\">\n <Label tone=\"dim\">{c.label}</Label>\n {sort?.key === c.key ? (\n <span className=\"ml-2 text-2xs text-accent-ink\">\n {sort.direction === \"asc\" ? \"↑\" : \"↓\"}\n </span>\n ) : null}\n </button>\n ) : (\n <Label tone=\"dim\">{c.label}</Label>\n )}\n </div>\n ))}\n </div>\n\n <div className={bodyClassName}>\n {loading ?? null}\n {!loading && sortedItems?.length === 0 ? empty : null}\n {!loading\n ? sortedItems?.map((item) => (\n <div key={rowKey(item)} className={`${GRID_ROW} h-12 px-4 text-sm`} role=\"row\">\n {columns.map((column) => (\n <span\n key={column.key}\n className={column.align === \"right\" ? \"text-right\" : \"\"}\n role=\"cell\"\n >\n {column.render(item)}\n </span>\n ))}\n </div>\n ))\n : null}\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type KanbanCard = { id: string; title: string; description?: ReactNode; meta?: ReactNode };\nexport type KanbanColumn = { id: string; title: string; cards: readonly KanbanCard[] };\n\nexport function KanbanBoard({\n columns,\n className = \"\",\n}: {\n columns: readonly KanbanColumn[];\n className?: string;\n}) {\n return (\n <div\n className={`grid min-w-[48rem] grid-cols-${columns.length} gap-4 ${className}`}\n style={{ gridTemplateColumns: `repeat(${columns.length}, minmax(15rem, 1fr))` }}\n >\n {columns.map((column) => (\n <section className=\"flex flex-col gap-3 rounded-md bg-panel p-3\" key={column.id}>\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-ink\">{column.title}</h3>\n <span className=\"font-mono text-2xs text-ink-dim\">{column.cards.length}</span>\n </div>\n {column.cards.map((card) => (\n <article\n className=\"rounded-sm border border-line bg-surface p-4 transition-transform duration-(--duration-fast) ease-out hover:-translate-y-0.5\"\n key={card.id}\n >\n <h4 className=\"text-sm font-medium text-ink\">{card.title}</h4>\n {card.description ? (\n <div className=\"mt-2 text-xs text-ink-muted\">{card.description}</div>\n ) : null}\n {card.meta ? <div className=\"mt-4 text-2xs text-ink-dim\">{card.meta}</div> : null}\n </article>\n ))}\n </section>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type TimelineItem = {\n id: string;\n title: string;\n meta: string;\n children?: ReactNode;\n tone?: \"neutral\" | \"accent\" | \"ok\" | \"warn\" | \"danger\";\n};\n\nconst DOTS = {\n neutral: \"bg-line-strong\",\n accent: \"bg-accent\",\n ok: \"bg-ok\",\n warn: \"bg-warn\",\n danger: \"bg-danger\",\n} as const;\n\nexport function Timeline({\n items,\n className = \"\",\n}: {\n items: readonly TimelineItem[];\n className?: string;\n}) {\n return (\n <ol className={`flex flex-col ${className}`}>\n {items.map((item, index) => (\n <li className=\"relative flex gap-4 pb-6 last:pb-0\" key={item.id}>\n {index < items.length - 1 ? (\n <span className=\"absolute top-3 bottom-0 left-1 w-px bg-line\" />\n ) : null}\n <span\n className={`relative z-1 mt-1 size-2.5 shrink-0 rounded-full ring-4 ring-surface ${DOTS[item.tone ?? \"neutral\"]}`}\n />\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1\">\n <p className=\"text-sm font-medium text-ink\">{item.title}</p>\n <time className=\"text-2xs text-ink-dim\">{item.meta}</time>\n </div>\n {item.children ? (\n <div className=\"mt-1 text-xs text-ink-muted\">{item.children}</div>\n ) : null}\n </div>\n </li>\n ))}\n </ol>\n );\n}\n"]}