@zvk/ui 0.1.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.
Files changed (278) hide show
  1. package/LICENSE.md +26 -0
  2. package/README.md +31 -0
  3. package/dist/components/accordion/accordion.d.ts +43 -0
  4. package/dist/components/accordion/accordion.js +207 -0
  5. package/dist/components/accordion/index.d.ts +2 -0
  6. package/dist/components/accordion/index.js +2 -0
  7. package/dist/components/alert/alert.d.ts +24 -0
  8. package/dist/components/alert/alert.js +17 -0
  9. package/dist/components/alert/index.d.ts +2 -0
  10. package/dist/components/alert/index.js +1 -0
  11. package/dist/components/alert-dialog/alert-dialog.d.ts +46 -0
  12. package/dist/components/alert-dialog/alert-dialog.js +112 -0
  13. package/dist/components/alert-dialog/index.d.ts +2 -0
  14. package/dist/components/alert-dialog/index.js +2 -0
  15. package/dist/components/avatar/avatar.d.ts +14 -0
  16. package/dist/components/avatar/avatar.js +22 -0
  17. package/dist/components/avatar/index.d.ts +2 -0
  18. package/dist/components/avatar/index.js +2 -0
  19. package/dist/components/badge/badge.d.ts +11 -0
  20. package/dist/components/badge/badge.js +6 -0
  21. package/dist/components/badge/index.d.ts +2 -0
  22. package/dist/components/badge/index.js +1 -0
  23. package/dist/components/breadcrumbs/breadcrumbs.d.ts +24 -0
  24. package/dist/components/breadcrumbs/breadcrumbs.js +18 -0
  25. package/dist/components/breadcrumbs/index.d.ts +2 -0
  26. package/dist/components/breadcrumbs/index.js +1 -0
  27. package/dist/components/button/button.d.ts +13 -0
  28. package/dist/components/button/button.js +8 -0
  29. package/dist/components/button/index.d.ts +2 -0
  30. package/dist/components/button/index.js +1 -0
  31. package/dist/components/card/card.d.ts +31 -0
  32. package/dist/components/card/card.js +28 -0
  33. package/dist/components/card/index.d.ts +2 -0
  34. package/dist/components/card/index.js +1 -0
  35. package/dist/components/checkbox/checkbox.d.ts +11 -0
  36. package/dist/components/checkbox/checkbox.js +30 -0
  37. package/dist/components/checkbox/index.d.ts +2 -0
  38. package/dist/components/checkbox/index.js +2 -0
  39. package/dist/components/code-block/code-block.d.ts +10 -0
  40. package/dist/components/code-block/code-block.js +16 -0
  41. package/dist/components/code-block/index.d.ts +2 -0
  42. package/dist/components/code-block/index.js +1 -0
  43. package/dist/components/collapsible/collapsible.d.ts +23 -0
  44. package/dist/components/collapsible/collapsible.js +52 -0
  45. package/dist/components/collapsible/index.d.ts +2 -0
  46. package/dist/components/collapsible/index.js +2 -0
  47. package/dist/components/combobox/combobox.d.ts +20 -0
  48. package/dist/components/combobox/combobox.js +121 -0
  49. package/dist/components/combobox/index.d.ts +2 -0
  50. package/dist/components/combobox/index.js +2 -0
  51. package/dist/components/command/command-dialog.d.ts +2 -0
  52. package/dist/components/command/command-dialog.js +1 -0
  53. package/dist/components/command/command-filter.d.ts +7 -0
  54. package/dist/components/command/command-filter.js +14 -0
  55. package/dist/components/command/command.d.ts +55 -0
  56. package/dist/components/command/command.js +200 -0
  57. package/dist/components/command/index.d.ts +2 -0
  58. package/dist/components/command/index.js +2 -0
  59. package/dist/components/context-menu/context-menu.d.ts +34 -0
  60. package/dist/components/context-menu/context-menu.js +154 -0
  61. package/dist/components/context-menu/index.d.ts +2 -0
  62. package/dist/components/context-menu/index.js +2 -0
  63. package/dist/components/conversation/conversation.d.ts +60 -0
  64. package/dist/components/conversation/conversation.js +49 -0
  65. package/dist/components/conversation/index.d.ts +2 -0
  66. package/dist/components/conversation/index.js +1 -0
  67. package/dist/components/copy-button/copy-button.d.ts +23 -0
  68. package/dist/components/copy-button/copy-button.js +50 -0
  69. package/dist/components/copy-button/index.d.ts +2 -0
  70. package/dist/components/copy-button/index.js +2 -0
  71. package/dist/components/dialog/dialog.d.ts +62 -0
  72. package/dist/components/dialog/dialog.js +141 -0
  73. package/dist/components/dialog/index.d.ts +2 -0
  74. package/dist/components/dialog/index.js +2 -0
  75. package/dist/components/dropdown-menu/dropdown-menu.d.ts +43 -0
  76. package/dist/components/dropdown-menu/dropdown-menu.js +286 -0
  77. package/dist/components/dropdown-menu/index.d.ts +2 -0
  78. package/dist/components/dropdown-menu/index.js +2 -0
  79. package/dist/components/empty-state/empty-state.d.ts +13 -0
  80. package/dist/components/empty-state/empty-state.js +34 -0
  81. package/dist/components/empty-state/index.d.ts +2 -0
  82. package/dist/components/empty-state/index.js +1 -0
  83. package/dist/components/error-boundary/error-boundary.d.ts +29 -0
  84. package/dist/components/error-boundary/error-boundary.js +43 -0
  85. package/dist/components/error-boundary/index.d.ts +2 -0
  86. package/dist/components/error-boundary/index.js +2 -0
  87. package/dist/components/field/field.d.ts +23 -0
  88. package/dist/components/field/field.js +20 -0
  89. package/dist/components/field/index.d.ts +2 -0
  90. package/dist/components/field/index.js +1 -0
  91. package/dist/components/file-upload-input/file-upload-input.d.ts +13 -0
  92. package/dist/components/file-upload-input/file-upload-input.js +41 -0
  93. package/dist/components/file-upload-input/index.d.ts +2 -0
  94. package/dist/components/file-upload-input/index.js +2 -0
  95. package/dist/components/form/form.d.ts +30 -0
  96. package/dist/components/form/form.js +88 -0
  97. package/dist/components/form/index.d.ts +2 -0
  98. package/dist/components/form/index.js +2 -0
  99. package/dist/components/icon-button/icon-button.d.ts +10 -0
  100. package/dist/components/icon-button/icon-button.js +8 -0
  101. package/dist/components/icon-button/index.d.ts +2 -0
  102. package/dist/components/icon-button/index.js +1 -0
  103. package/dist/components/index.d.ts +102 -0
  104. package/dist/components/index.js +51 -0
  105. package/dist/components/input/index.d.ts +2 -0
  106. package/dist/components/input/index.js +1 -0
  107. package/dist/components/input/input.d.ts +11 -0
  108. package/dist/components/input/input.js +27 -0
  109. package/dist/components/label/index.d.ts +2 -0
  110. package/dist/components/label/index.js +1 -0
  111. package/dist/components/label/label.d.ts +9 -0
  112. package/dist/components/label/label.js +6 -0
  113. package/dist/components/menubar/index.d.ts +2 -0
  114. package/dist/components/menubar/index.js +2 -0
  115. package/dist/components/menubar/menubar.d.ts +39 -0
  116. package/dist/components/menubar/menubar.js +214 -0
  117. package/dist/components/pagination/index.d.ts +2 -0
  118. package/dist/components/pagination/index.js +1 -0
  119. package/dist/components/pagination/pagination.d.ts +21 -0
  120. package/dist/components/pagination/pagination.js +92 -0
  121. package/dist/components/popover/index.d.ts +2 -0
  122. package/dist/components/popover/index.js +2 -0
  123. package/dist/components/popover/popover.d.ts +28 -0
  124. package/dist/components/popover/popover.js +164 -0
  125. package/dist/components/progress/index.d.ts +2 -0
  126. package/dist/components/progress/index.js +1 -0
  127. package/dist/components/progress/progress.d.ts +24 -0
  128. package/dist/components/progress/progress.js +29 -0
  129. package/dist/components/radio-group/index.d.ts +2 -0
  130. package/dist/components/radio-group/index.js +2 -0
  131. package/dist/components/radio-group/radio-group.d.ts +42 -0
  132. package/dist/components/radio-group/radio-group.js +69 -0
  133. package/dist/components/responsive-container/index.d.ts +2 -0
  134. package/dist/components/responsive-container/index.js +1 -0
  135. package/dist/components/responsive-container/responsive-container.d.ts +10 -0
  136. package/dist/components/responsive-container/responsive-container.js +6 -0
  137. package/dist/components/scroll-area/index.d.ts +2 -0
  138. package/dist/components/scroll-area/index.js +2 -0
  139. package/dist/components/scroll-area/scroll-area.d.ts +21 -0
  140. package/dist/components/scroll-area/scroll-area.js +23 -0
  141. package/dist/components/sectioned-sidebar-nav/index.d.ts +2 -0
  142. package/dist/components/sectioned-sidebar-nav/index.js +1 -0
  143. package/dist/components/sectioned-sidebar-nav/sectioned-sidebar-nav.d.ts +39 -0
  144. package/dist/components/sectioned-sidebar-nav/sectioned-sidebar-nav.js +37 -0
  145. package/dist/components/select/index.d.ts +2 -0
  146. package/dist/components/select/index.js +2 -0
  147. package/dist/components/select/select.d.ts +46 -0
  148. package/dist/components/select/select.js +239 -0
  149. package/dist/components/separator/index.d.ts +2 -0
  150. package/dist/components/separator/index.js +1 -0
  151. package/dist/components/separator/separator.d.ts +8 -0
  152. package/dist/components/separator/separator.js +6 -0
  153. package/dist/components/sheet/index.d.ts +2 -0
  154. package/dist/components/sheet/index.js +2 -0
  155. package/dist/components/sheet/sheet.d.ts +49 -0
  156. package/dist/components/sheet/sheet.js +116 -0
  157. package/dist/components/sidebar-shell/index.d.ts +2 -0
  158. package/dist/components/sidebar-shell/index.js +1 -0
  159. package/dist/components/sidebar-shell/sidebar-shell.d.ts +35 -0
  160. package/dist/components/sidebar-shell/sidebar-shell.js +28 -0
  161. package/dist/components/skeleton/index.d.ts +2 -0
  162. package/dist/components/skeleton/index.js +1 -0
  163. package/dist/components/skeleton/skeleton.d.ts +10 -0
  164. package/dist/components/skeleton/skeleton.js +16 -0
  165. package/dist/components/slider/index.d.ts +2 -0
  166. package/dist/components/slider/index.js +2 -0
  167. package/dist/components/slider/slider.d.ts +12 -0
  168. package/dist/components/slider/slider.js +30 -0
  169. package/dist/components/spinner/index.d.ts +2 -0
  170. package/dist/components/spinner/index.js +1 -0
  171. package/dist/components/spinner/spinner.d.ts +10 -0
  172. package/dist/components/spinner/spinner.js +7 -0
  173. package/dist/components/stat/index.d.ts +2 -0
  174. package/dist/components/stat/index.js +1 -0
  175. package/dist/components/stat/stat.d.ts +13 -0
  176. package/dist/components/stat/stat.js +8 -0
  177. package/dist/components/switch/index.d.ts +2 -0
  178. package/dist/components/switch/index.js +2 -0
  179. package/dist/components/switch/switch.d.ts +11 -0
  180. package/dist/components/switch/switch.js +27 -0
  181. package/dist/components/table/index.d.ts +2 -0
  182. package/dist/components/table/index.js +1 -0
  183. package/dist/components/table/table.d.ts +45 -0
  184. package/dist/components/table/table.js +36 -0
  185. package/dist/components/tabs/index.d.ts +2 -0
  186. package/dist/components/tabs/index.js +2 -0
  187. package/dist/components/tabs/tabs.d.ts +34 -0
  188. package/dist/components/tabs/tabs.js +233 -0
  189. package/dist/components/tabs-with-sidebar/index.d.ts +2 -0
  190. package/dist/components/tabs-with-sidebar/index.js +2 -0
  191. package/dist/components/tabs-with-sidebar/tabs-with-sidebar.d.ts +21 -0
  192. package/dist/components/tabs-with-sidebar/tabs-with-sidebar.js +18 -0
  193. package/dist/components/textarea/index.d.ts +2 -0
  194. package/dist/components/textarea/index.js +2 -0
  195. package/dist/components/textarea/textarea.d.ts +11 -0
  196. package/dist/components/textarea/textarea.js +28 -0
  197. package/dist/components/toast/index.d.ts +2 -0
  198. package/dist/components/toast/index.js +1 -0
  199. package/dist/components/toast/toast.d.ts +33 -0
  200. package/dist/components/toast/toast.js +27 -0
  201. package/dist/components/toggle/index.d.ts +2 -0
  202. package/dist/components/toggle/index.js +2 -0
  203. package/dist/components/toggle/toggle.d.ts +12 -0
  204. package/dist/components/toggle/toggle.js +18 -0
  205. package/dist/components/toggle-group/index.d.ts +2 -0
  206. package/dist/components/toggle-group/index.js +2 -0
  207. package/dist/components/toggle-group/toggle-group.d.ts +28 -0
  208. package/dist/components/toggle-group/toggle-group.js +67 -0
  209. package/dist/components/tooltip/index.d.ts +2 -0
  210. package/dist/components/tooltip/index.js +2 -0
  211. package/dist/components/tooltip/tooltip.d.ts +10 -0
  212. package/dist/components/tooltip/tooltip.js +100 -0
  213. package/dist/hooks/index.d.ts +7 -0
  214. package/dist/hooks/index.js +5 -0
  215. package/dist/hooks/use-composed-refs.d.ts +3 -0
  216. package/dist/hooks/use-composed-refs.js +18 -0
  217. package/dist/hooks/use-controllable-state.d.ts +7 -0
  218. package/dist/hooks/use-controllable-state.js +30 -0
  219. package/dist/hooks/use-disclosure.d.ts +13 -0
  220. package/dist/hooks/use-disclosure.js +20 -0
  221. package/dist/hooks/use-event.d.ts +1 -0
  222. package/dist/hooks/use-event.js +11 -0
  223. package/dist/index.d.ts +3 -0
  224. package/dist/index.js +3 -0
  225. package/dist/internal/collection/collection.d.ts +18 -0
  226. package/dist/internal/collection/collection.js +54 -0
  227. package/dist/internal/collection/index.d.ts +2 -0
  228. package/dist/internal/collection/index.js +1 -0
  229. package/dist/internal/dismissable-layer/dismissable-layer.d.ts +13 -0
  230. package/dist/internal/dismissable-layer/dismissable-layer.js +73 -0
  231. package/dist/internal/dismissable-layer/index.d.ts +2 -0
  232. package/dist/internal/dismissable-layer/index.js +1 -0
  233. package/dist/internal/floating/auto-update.d.ts +9 -0
  234. package/dist/internal/floating/auto-update.js +48 -0
  235. package/dist/internal/floating/compute-position.d.ts +2 -0
  236. package/dist/internal/floating/compute-position.js +96 -0
  237. package/dist/internal/floating/detect-overflow.d.ts +13 -0
  238. package/dist/internal/floating/detect-overflow.js +13 -0
  239. package/dist/internal/floating/floating-types.d.ts +42 -0
  240. package/dist/internal/floating/floating-types.js +1 -0
  241. package/dist/internal/floating/index.d.ts +27 -0
  242. package/dist/internal/floating/index.js +5 -0
  243. package/dist/internal/floating/middleware.d.ts +11 -0
  244. package/dist/internal/floating/middleware.js +42 -0
  245. package/dist/internal/floating/use-floating-position.d.ts +2 -0
  246. package/dist/internal/floating/use-floating-position.js +113 -0
  247. package/dist/internal/focus/focus-scope.d.ts +10 -0
  248. package/dist/internal/focus/focus-scope.js +68 -0
  249. package/dist/internal/focus/focus-utils.d.ts +9 -0
  250. package/dist/internal/focus/focus-utils.js +94 -0
  251. package/dist/internal/focus/index.d.ts +3 -0
  252. package/dist/internal/focus/index.js +2 -0
  253. package/dist/internal/overlay-stack/index.d.ts +1 -0
  254. package/dist/internal/overlay-stack/index.js +1 -0
  255. package/dist/internal/overlay-stack/overlay-stack.d.ts +12 -0
  256. package/dist/internal/overlay-stack/overlay-stack.js +41 -0
  257. package/dist/internal/portal/index.d.ts +2 -0
  258. package/dist/internal/portal/index.js +1 -0
  259. package/dist/internal/portal/portal.d.ts +7 -0
  260. package/dist/internal/portal/portal.js +19 -0
  261. package/dist/internal/scroll-lock/index.d.ts +1 -0
  262. package/dist/internal/scroll-lock/index.js +1 -0
  263. package/dist/internal/scroll-lock/scroll-lock.d.ts +4 -0
  264. package/dist/internal/scroll-lock/scroll-lock.js +69 -0
  265. package/dist/styles.css +3852 -0
  266. package/dist/tokens/index.d.ts +2 -0
  267. package/dist/tokens/index.js +1 -0
  268. package/dist/tokens/token-types.d.ts +23 -0
  269. package/dist/tokens/token-types.js +1 -0
  270. package/dist/tokens/tokens.d.ts +139 -0
  271. package/dist/tokens/tokens.js +139 -0
  272. package/dist/utils/cn.d.ts +2 -0
  273. package/dist/utils/cn.js +3 -0
  274. package/dist/utils/compose-event-handlers.d.ts +6 -0
  275. package/dist/utils/compose-event-handlers.js +8 -0
  276. package/dist/utils/index.d.ts +4 -0
  277. package/dist/utils/index.js +2 -0
  278. package/package.json +282 -0
package/LICENSE.md ADDED
@@ -0,0 +1,26 @@
1
+ # Free Use, No Redistribution License
2
+ Copyright (c) 2026 Brandon Schabel. All rights reserved.
3
+ This software package is proprietary and is not open source.
4
+ ## Permission Granted
5
+ You may install and use this package for free in your own personal,
6
+ internal, or commercial applications.
7
+ You may import, compile, bundle, and run this package as part of an application
8
+ you are developing.
9
+ ## Restrictions
10
+ You may not redistribute, republish, resell, sublicense, mirror, host, or make
11
+ this package available as a standalone package, source code package, package
12
+ registry entry, archive, fork, or competing component library.
13
+ You may not claim ownership of this package or remove copyright, license,
14
+ or attribution notices.
15
+ You may not create or distribute modified versions of this package without
16
+ written permission from the copyright holder.
17
+ ## Applications Built With This Package
18
+ You may distribute applications that use this package, provided that this
19
+ package is not distributed as a standalone reusable library or component kit.
20
+ ## No Warranty
21
+ This software is provided "as is", without warranty of any kind, express or
22
+ implied. The copyright holder is not liable for any claim, damages, or other
23
+ liability arising from use of the software.
24
+ ## Future Licensing
25
+ The copyright holder may release future versions of this package under a
26
+ different license, including an open-source license.
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # @zvk/ui
2
+
3
+ @zvk/ui is an internal React 19 component library for polished application interfaces. It is styled by default, TypeScript-first, dependency-conscious, and built around explicit subpath imports.
4
+
5
+ `ZVK` is short for **Zero Vendor Kit**.
6
+
7
+ ```tsx
8
+ import { Button } from "@zvk/ui/button";
9
+ import { Card } from "@zvk/ui/card";
10
+ import "@zvk/ui/styles.css";
11
+ ```
12
+
13
+ ## Package Policy
14
+
15
+ - Runtime dependencies stay empty: `dependencies: {}`.
16
+ - Peer dependencies are limited to `react` and `react-dom` with React 19 compatibility.
17
+ - Styling ships through one public stylesheet: `@zvk/ui/styles.css`.
18
+ - Components use plain CSS classes, CSS variables, and data attributes.
19
+ - First-slice overlays such as Dialog, Popover, Tooltip, Select, and DropdownMenu are intentionally deferred.
20
+
21
+ ## First Slice
22
+
23
+ The initial build includes Button, IconButton, Badge, Card, Separator, Spinner, Skeleton, Field, Input, and the hooks/utilities named in the checked-in plans.
24
+
25
+ ## License
26
+
27
+ This package is free to use but is not open source yet.
28
+ You may use it in personal, internal, or commercial applications, but you may
29
+ not redistribute, republish, resell, fork, mirror, or repackage it as a standalone
30
+ library or competing component system.
31
+ See [LICENSE.md](./LICENSE.md) for details.
@@ -0,0 +1,43 @@
1
+ import * as React from "react";
2
+ export type AccordionType = "single" | "multiple";
3
+ export type AccordionValue = string | readonly string[];
4
+ interface AccordionBaseProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ collapsible?: boolean;
6
+ disabled?: boolean;
7
+ ref?: React.Ref<HTMLDivElement>;
8
+ }
9
+ export interface AccordionSingleProps extends AccordionBaseProps {
10
+ type?: "single";
11
+ value?: string;
12
+ defaultValue?: string;
13
+ onValueChange?: (value: string) => void;
14
+ }
15
+ export interface AccordionMultipleProps extends AccordionBaseProps {
16
+ type: "multiple";
17
+ value?: readonly string[];
18
+ defaultValue?: readonly string[];
19
+ onValueChange?: (value: readonly string[]) => void;
20
+ }
21
+ export type AccordionProps = AccordionSingleProps | AccordionMultipleProps;
22
+ export interface AccordionItemProps extends React.HTMLAttributes<HTMLDivElement> {
23
+ value: string;
24
+ disabled?: boolean;
25
+ ref?: React.Ref<HTMLDivElement>;
26
+ }
27
+ export interface AccordionTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
28
+ ref?: React.Ref<HTMLButtonElement>;
29
+ }
30
+ export interface AccordionContentProps extends React.HTMLAttributes<HTMLDivElement> {
31
+ forceMount?: boolean;
32
+ ref?: React.Ref<HTMLDivElement>;
33
+ }
34
+ declare function AccordionRoot({ children, className, collapsible, defaultValue, onValueChange, disabled, ref, type, value, ...props }: AccordionProps): React.JSX.Element;
35
+ declare function AccordionItem({ className, children, disabled, ref, value, ...props }: AccordionItemProps): React.JSX.Element;
36
+ declare function AccordionTrigger({ className, onClick, onKeyDown, ref, type, ...props }: AccordionTriggerProps): React.JSX.Element;
37
+ declare function AccordionContent({ className, forceMount, ref, ...props }: AccordionContentProps): React.JSX.Element | null;
38
+ export declare const Accordion: typeof AccordionRoot & {
39
+ Item: typeof AccordionItem;
40
+ Trigger: typeof AccordionTrigger;
41
+ Content: typeof AccordionContent;
42
+ };
43
+ export {};
@@ -0,0 +1,207 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { composeEventHandlers } from "../../utils/compose-event-handlers.js";
5
+ import { useControllableState } from "../../hooks/use-controllable-state.js";
6
+ import { cn } from "../../utils/cn.js";
7
+ const AccordionRootContext = React.createContext(null);
8
+ const AccordionItemContext = React.createContext(null);
9
+ function useAccordionRootContext(calledBy) {
10
+ const context = React.useContext(AccordionRootContext);
11
+ if (!context) {
12
+ throw new Error(`"${calledBy}" must be used within an <Accordion />`);
13
+ }
14
+ return context;
15
+ }
16
+ function useAccordionItemContext(calledBy) {
17
+ const context = React.useContext(AccordionItemContext);
18
+ if (!context) {
19
+ throw new Error(`"${calledBy}" must be used within an <Accordion.Item />`);
20
+ }
21
+ return context;
22
+ }
23
+ function getValueIsOpen(type, values, value) {
24
+ if (type === "multiple") {
25
+ return Array.isArray(values) && values.includes(value);
26
+ }
27
+ return typeof values === "string" && values === value;
28
+ }
29
+ function toggleValue({ type, currentValue, itemValue, collapsible }) {
30
+ if (type === "multiple") {
31
+ const items = Array.isArray(currentValue) ? currentValue : [];
32
+ if (items.includes(itemValue)) {
33
+ return items.filter((item) => item !== itemValue);
34
+ }
35
+ return [...items, itemValue];
36
+ }
37
+ if (currentValue === itemValue) {
38
+ return collapsible ? "" : itemValue;
39
+ }
40
+ return itemValue;
41
+ }
42
+ function getNextEnabledTriggerIndex(currentIndex, direction, triggers) {
43
+ if (triggers.length === 0) {
44
+ return -1;
45
+ }
46
+ for (let step = 1; step <= triggers.length; step += 1) {
47
+ const nextIndex = (currentIndex + step * direction + triggers.length) % triggers.length;
48
+ if (!triggers[nextIndex]?.disabled) {
49
+ return nextIndex;
50
+ }
51
+ }
52
+ return currentIndex;
53
+ }
54
+ function getFirstEnabledTriggerIndex(triggers) {
55
+ return triggers.findIndex((trigger) => !trigger.disabled);
56
+ }
57
+ function getLastEnabledTriggerIndex(triggers) {
58
+ for (let index = triggers.length - 1; index >= 0; index -= 1) {
59
+ if (!triggers[index]?.disabled) {
60
+ return index;
61
+ }
62
+ }
63
+ return -1;
64
+ }
65
+ function AccordionRoot({ children, className, collapsible = false, defaultValue, onValueChange, disabled = false, ref, type = "single", value, ...props }) {
66
+ const triggerRegistry = React.useRef(new Map());
67
+ const triggerOrder = React.useRef([]);
68
+ const defaultForType = type === "multiple" && Array.isArray(defaultValue)
69
+ ? defaultValue
70
+ : type === "single" && typeof defaultValue === "string"
71
+ ? defaultValue
72
+ : type === "multiple"
73
+ ? []
74
+ : "";
75
+ const [currentValue, setCurrentValue] = useControllableState({
76
+ ...(value !== undefined ? { value: value } : {}),
77
+ defaultValue: defaultForType,
78
+ ...(onValueChange ? { onChange: onValueChange } : {})
79
+ });
80
+ const registerTrigger = React.useCallback((triggerValue, triggerRef, isDisabled) => {
81
+ if (!triggerRegistry.current.has(triggerValue)) {
82
+ triggerOrder.current.push(triggerValue);
83
+ }
84
+ triggerRegistry.current.set(triggerValue, {
85
+ ref: triggerRef,
86
+ disabled: isDisabled
87
+ });
88
+ }, []);
89
+ const unregisterTrigger = React.useCallback((triggerValue) => {
90
+ triggerRegistry.current.delete(triggerValue);
91
+ triggerOrder.current = triggerOrder.current.filter((registeredValue) => registeredValue !== triggerValue);
92
+ }, []);
93
+ const getOrderedTriggers = React.useCallback(() => triggerOrder.current
94
+ .map((registeredValue) => ({
95
+ value: registeredValue,
96
+ ...triggerRegistry.current.get(registeredValue)
97
+ }))
98
+ .filter((trigger) => Boolean(trigger.ref) && trigger.ref !== null), []);
99
+ return (_jsx(AccordionRootContext.Provider, { value: {
100
+ value: currentValue,
101
+ setValue: setCurrentValue,
102
+ type,
103
+ collapsible,
104
+ disabled,
105
+ registerTrigger,
106
+ unregisterTrigger,
107
+ getOrderedTriggers
108
+ }, children: _jsx("div", { ...props, ref: ref, className: cn("liano-accordion", className), "data-state": type, "data-disabled": disabled ? "true" : undefined, children: children }) }));
109
+ }
110
+ function AccordionItem({ className, children, disabled = false, ref, value, ...props }) {
111
+ const generatedId = React.useId();
112
+ const rootContext = useAccordionRootContext("Accordion.Item");
113
+ const triggerId = `${generatedId}-trigger`;
114
+ const defaultContentId = `${generatedId}-content`;
115
+ const [contentId, setContentId] = React.useState(defaultContentId);
116
+ return (_jsx(AccordionItemContext.Provider, { value: {
117
+ value,
118
+ disabled: disabled || rootContext.disabled,
119
+ triggerId,
120
+ contentId,
121
+ defaultContentId,
122
+ setContentId
123
+ }, children: _jsx("div", { ...props, ref: ref, className: cn("liano-accordion__item", className), "data-state": getValueIsOpen(rootContext.type, rootContext.value, value) ? "open" : "closed", "data-disabled": disabled || rootContext.disabled ? "true" : undefined, children: children }) }));
124
+ }
125
+ function AccordionTrigger({ className, onClick, onKeyDown, ref, type = "button", ...props }) {
126
+ const rootContext = useAccordionRootContext("Accordion.Trigger");
127
+ const itemContext = useAccordionItemContext("Accordion.Trigger");
128
+ const isItemOpen = getValueIsOpen(rootContext.type, rootContext.value, itemContext.value);
129
+ const isDisabled = rootContext.disabled || itemContext.disabled;
130
+ const triggerRef = React.useRef(null);
131
+ React.useLayoutEffect(() => {
132
+ rootContext.registerTrigger(itemContext.value, triggerRef.current, isDisabled);
133
+ return () => rootContext.unregisterTrigger(itemContext.value);
134
+ }, [itemContext.value, isDisabled, rootContext]);
135
+ const moveFocusTo = (nextValue) => {
136
+ const triggers = rootContext.getOrderedTriggers();
137
+ const target = triggers.find((trigger) => trigger.value === nextValue);
138
+ target?.ref?.focus();
139
+ };
140
+ const handleKeyDown = (event) => {
141
+ if (isDisabled || rootContext.disabled) {
142
+ return;
143
+ }
144
+ const triggers = rootContext.getOrderedTriggers();
145
+ const currentIndex = triggers.findIndex((trigger) => trigger.value === itemContext.value);
146
+ if (currentIndex === -1) {
147
+ return;
148
+ }
149
+ let nextIndex = -1;
150
+ if (event.key === "ArrowDown") {
151
+ nextIndex = getNextEnabledTriggerIndex(currentIndex, 1, triggers);
152
+ }
153
+ else if (event.key === "ArrowUp") {
154
+ nextIndex = getNextEnabledTriggerIndex(currentIndex, -1, triggers);
155
+ }
156
+ else if (event.key === "Home") {
157
+ nextIndex = getFirstEnabledTriggerIndex(triggers);
158
+ }
159
+ else if (event.key === "End") {
160
+ nextIndex = getLastEnabledTriggerIndex(triggers);
161
+ }
162
+ if (nextIndex >= 0) {
163
+ event.preventDefault();
164
+ moveFocusTo(triggers[nextIndex]?.value);
165
+ }
166
+ };
167
+ return (_jsx("button", { ...props, ref: (node) => {
168
+ triggerRef.current = node;
169
+ if (typeof ref === "function") {
170
+ ref(node);
171
+ }
172
+ else if (ref) {
173
+ ref.current = node;
174
+ }
175
+ }, id: itemContext.triggerId, "aria-controls": itemContext.contentId, "aria-expanded": isItemOpen, className: cn("liano-accordion__trigger", className), "data-state": isItemOpen ? "open" : "closed", "data-disabled": isDisabled ? "true" : undefined, disabled: isDisabled, onClick: composeEventHandlers(onClick, () => {
176
+ if (!isDisabled && !rootContext.disabled) {
177
+ rootContext.setValue(toggleValue({
178
+ type: rootContext.type,
179
+ currentValue: rootContext.value,
180
+ itemValue: itemContext.value,
181
+ collapsible: rootContext.collapsible
182
+ }));
183
+ }
184
+ }), onKeyDown: composeEventHandlers(onKeyDown, handleKeyDown, { checkDefaultPrevented: false }), type: type }));
185
+ }
186
+ function AccordionContent({ className, forceMount = false, ref, ...props }) {
187
+ const rootContext = useAccordionRootContext("Accordion.Content");
188
+ const itemContext = useAccordionItemContext("Accordion.Content");
189
+ const { defaultContentId, setContentId } = itemContext;
190
+ const isItemOpen = getValueIsOpen(rootContext.type, rootContext.value, itemContext.value);
191
+ const resolvedId = props.id ?? defaultContentId;
192
+ React.useLayoutEffect(() => {
193
+ setContentId(resolvedId);
194
+ return () => {
195
+ setContentId(defaultContentId);
196
+ };
197
+ }, [defaultContentId, resolvedId, setContentId]);
198
+ if (!forceMount && !isItemOpen) {
199
+ return null;
200
+ }
201
+ return (_jsx("div", { ...props, id: resolvedId, ref: ref, "aria-labelledby": itemContext.triggerId, className: cn("liano-accordion__content", className), "data-state": isItemOpen ? "open" : "closed", hidden: isItemOpen ? undefined : true }));
202
+ }
203
+ export const Accordion = Object.assign(AccordionRoot, {
204
+ Item: AccordionItem,
205
+ Trigger: AccordionTrigger,
206
+ Content: AccordionContent
207
+ });
@@ -0,0 +1,2 @@
1
+ export { Accordion } from "./accordion.js";
2
+ export type { AccordionType, AccordionValue, AccordionProps, AccordionItemProps, AccordionTriggerProps, AccordionContentProps } from "./accordion.js";
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ export { Accordion } from "./accordion.js";
@@ -0,0 +1,24 @@
1
+ import * as React from "react";
2
+ export type AlertTone = "info" | "success" | "warning" | "destructive" | "neutral";
3
+ export interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
4
+ tone?: AlertTone;
5
+ icon?: React.ReactNode;
6
+ title?: React.ReactNode;
7
+ role?: React.AriaRole;
8
+ ref?: React.Ref<HTMLDivElement>;
9
+ }
10
+ export interface AlertTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
11
+ ref?: React.Ref<HTMLHeadingElement>;
12
+ }
13
+ export interface AlertDescriptionProps extends React.HTMLAttributes<HTMLDivElement> {
14
+ ref?: React.Ref<HTMLDivElement>;
15
+ }
16
+ export type AlertRoot = (props: AlertProps) => React.ReactElement;
17
+ declare function AlertRoot({ children, className, icon, ref, role, title, tone, ...props }: AlertProps): React.JSX.Element;
18
+ declare function AlertTitle({ className, ref, ...props }: AlertTitleProps): React.JSX.Element;
19
+ declare function AlertDescription({ className, ref, ...props }: AlertDescriptionProps): React.JSX.Element;
20
+ export declare const Alert: typeof AlertRoot & {
21
+ Title: typeof AlertTitle;
22
+ Description: typeof AlertDescription;
23
+ };
24
+ export {};
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../utils/cn.js";
4
+ function AlertRoot({ children, className, icon, ref, role, title, tone = "info", ...props }) {
5
+ const resolvedRole = role ?? (tone === "destructive" ? "alert" : "status");
6
+ return (_jsxs("div", { ...props, ref: ref, className: cn("liano-alert", className), "data-tone": tone, role: resolvedRole, children: [icon ? (_jsx("span", { "aria-hidden": "true", className: "liano-alert__icon", children: icon })) : null, _jsxs("div", { className: "liano-alert__content", children: [title ? _jsx(AlertTitle, { children: title }) : null, children] })] }));
7
+ }
8
+ function AlertTitle({ className, ref, ...props }) {
9
+ return _jsx("h3", { ...props, ref: ref, className: cn("liano-alert__title", className) });
10
+ }
11
+ function AlertDescription({ className, ref, ...props }) {
12
+ return _jsx("div", { ...props, ref: ref, className: cn("liano-alert__description", className) });
13
+ }
14
+ export const Alert = Object.assign(AlertRoot, {
15
+ Title: AlertTitle,
16
+ Description: AlertDescription
17
+ });
@@ -0,0 +1,2 @@
1
+ export { Alert } from "./alert.js";
2
+ export type { AlertDescriptionProps, AlertProps, AlertRoot, AlertTitleProps, AlertTone } from "./alert.js";
@@ -0,0 +1 @@
1
+ export { Alert } from "./alert.js";
@@ -0,0 +1,46 @@
1
+ import * as React from "react";
2
+ export interface AlertDialogProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ defaultOpen?: boolean;
4
+ onOpenChange?: (open: boolean) => void;
5
+ open?: boolean;
6
+ ref?: React.Ref<HTMLDivElement>;
7
+ }
8
+ export interface AlertDialogTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
9
+ ref?: React.Ref<HTMLButtonElement>;
10
+ }
11
+ export interface AlertDialogContentProps extends React.HTMLAttributes<HTMLDivElement> {
12
+ ref?: React.Ref<HTMLDivElement>;
13
+ }
14
+ export interface AlertDialogTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
15
+ ref?: React.Ref<HTMLHeadingElement>;
16
+ }
17
+ export interface AlertDialogDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {
18
+ ref?: React.Ref<HTMLParagraphElement>;
19
+ }
20
+ export interface AlertDialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {
21
+ ref?: React.Ref<HTMLDivElement>;
22
+ }
23
+ export interface AlertDialogActionProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
24
+ ref?: React.Ref<HTMLButtonElement>;
25
+ }
26
+ export interface AlertDialogCancelProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
27
+ ref?: React.Ref<HTMLButtonElement>;
28
+ }
29
+ declare function AlertDialogRoot({ children, className, defaultOpen, onOpenChange, open: openProp, ref, ...props }: AlertDialogProps): React.JSX.Element;
30
+ declare function AlertDialogTrigger({ className, disabled, onClick, ref, type, ...props }: AlertDialogTriggerProps): React.JSX.Element;
31
+ declare function AlertDialogContent({ children, className, ref, ...props }: AlertDialogContentProps): React.JSX.Element | null;
32
+ declare function AlertDialogTitle({ className, ref, ...props }: AlertDialogTitleProps): React.JSX.Element;
33
+ declare function AlertDialogDescription({ className, ref, ...props }: AlertDialogDescriptionProps): React.JSX.Element;
34
+ declare function AlertDialogFooter({ className, ref, ...props }: AlertDialogFooterProps): React.JSX.Element;
35
+ declare function AlertDialogCloseButton({ className, onClick, ref, type, ...props }: AlertDialogActionProps | AlertDialogCancelProps): React.JSX.Element;
36
+ type AlertDialogComponent = typeof AlertDialogRoot & {
37
+ Action: typeof AlertDialogCloseButton;
38
+ Cancel: typeof AlertDialogCloseButton;
39
+ Content: typeof AlertDialogContent;
40
+ Description: typeof AlertDialogDescription;
41
+ Footer: typeof AlertDialogFooter;
42
+ Title: typeof AlertDialogTitle;
43
+ Trigger: typeof AlertDialogTrigger;
44
+ };
45
+ export declare const AlertDialog: AlertDialogComponent;
46
+ export {};
@@ -0,0 +1,112 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { composeEventHandlers } from "../../utils/compose-event-handlers.js";
5
+ import { cn } from "../../utils/cn.js";
6
+ import { useControllableState } from "../../hooks/use-controllable-state.js";
7
+ import { DismissableLayer } from "../../internal/dismissable-layer/index.js";
8
+ import { FocusScope } from "../../internal/focus/index.js";
9
+ import { Portal } from "../../internal/portal/index.js";
10
+ import { lockScroll, unlockScroll } from "../../internal/scroll-lock/index.js";
11
+ const AlertDialogContext = React.createContext(null);
12
+ function useAlertDialogContext(calledBy) {
13
+ const context = React.useContext(AlertDialogContext);
14
+ if (context === null) {
15
+ throw new Error(`"${calledBy}" must be used inside an <AlertDialog />`);
16
+ }
17
+ return context;
18
+ }
19
+ function composeRefs(...refs) {
20
+ return (node) => {
21
+ for (const ref of refs) {
22
+ if (typeof ref === "function") {
23
+ ref(node);
24
+ }
25
+ else if (ref && "current" in ref) {
26
+ ref.current = node;
27
+ }
28
+ }
29
+ };
30
+ }
31
+ function AlertDialogRoot({ children, className, defaultOpen = false, onOpenChange, open: openProp, ref, ...props }) {
32
+ const [open, setOpen] = useControllableState({
33
+ ...(openProp !== undefined ? { value: openProp } : {}),
34
+ defaultValue: defaultOpen,
35
+ ...(onOpenChange ? { onChange: onOpenChange } : {})
36
+ });
37
+ const instanceId = React.useId();
38
+ const triggerRef = React.useRef(null);
39
+ const [labelledBy, setLabelledBy] = React.useState();
40
+ const [describedBy, setDescribedBy] = React.useState();
41
+ const registerTitle = React.useCallback((id) => {
42
+ setLabelledBy(id);
43
+ return () => setLabelledBy((current) => (current === id ? undefined : current));
44
+ }, []);
45
+ const registerDescription = React.useCallback((id) => {
46
+ setDescribedBy(id);
47
+ return () => setDescribedBy((current) => (current === id ? undefined : current));
48
+ }, []);
49
+ React.useLayoutEffect(() => {
50
+ if (!open) {
51
+ return;
52
+ }
53
+ lockScroll();
54
+ return () => unlockScroll();
55
+ }, [open]);
56
+ return (_jsx(AlertDialogContext.Provider, { value: {
57
+ close: () => setOpen(false),
58
+ contentId: `${instanceId}-content`,
59
+ descriptionId: `${instanceId}-description`,
60
+ describedBy,
61
+ labelledBy,
62
+ open,
63
+ registerDescription,
64
+ registerTitle,
65
+ setOpen,
66
+ titleId: `${instanceId}-title`,
67
+ triggerRef
68
+ }, children: _jsx("div", { ...props, ref: ref, className: cn("liano-alert-dialog", className), "data-state": open ? "open" : "closed", children: children }) }));
69
+ }
70
+ function AlertDialogTrigger({ className, disabled, onClick, ref, type = "button", ...props }) {
71
+ const { contentId, open, setOpen, triggerRef } = useAlertDialogContext("AlertDialog.Trigger");
72
+ return (_jsx("button", { ...props, ref: composeRefs(ref, triggerRef), type: type, disabled: disabled, "aria-controls": contentId, "aria-expanded": open ? "true" : "false", className: cn("liano-alert-dialog__trigger", className), "data-state": open ? "open" : "closed", onClick: composeEventHandlers(onClick, () => {
73
+ if (!disabled) {
74
+ setOpen(true);
75
+ }
76
+ }) }));
77
+ }
78
+ function AlertDialogContent({ children, className, ref, ...props }) {
79
+ const { close, contentId, describedBy, labelledBy, open } = useAlertDialogContext("AlertDialog.Content");
80
+ if (!open) {
81
+ return null;
82
+ }
83
+ return (_jsxs(Portal, { children: [_jsx("div", { "aria-hidden": "true", className: "liano-alert-dialog__overlay" }), _jsx(DismissableLayer, { open: open, onDismiss: close, children: _jsx(FocusScope, { active: open, trapped: true, children: _jsx("div", { ...props, ref: ref, id: contentId, role: "alertdialog", "aria-modal": "true", "aria-describedby": describedBy, "aria-labelledby": labelledBy, className: cn("liano-alert-dialog__content", className), "data-state": open ? "open" : "closed", children: children }) }) })] }));
84
+ }
85
+ function AlertDialogTitle({ className, ref, ...props }) {
86
+ const { registerTitle, titleId } = useAlertDialogContext("AlertDialog.Title");
87
+ const id = props.id ?? titleId;
88
+ React.useLayoutEffect(() => registerTitle(id), [id, registerTitle]);
89
+ return _jsx("h2", { ...props, ref: ref, id: id, className: cn("liano-alert-dialog__title", className) });
90
+ }
91
+ function AlertDialogDescription({ className, ref, ...props }) {
92
+ const { descriptionId, registerDescription } = useAlertDialogContext("AlertDialog.Description");
93
+ const id = props.id ?? descriptionId;
94
+ React.useLayoutEffect(() => registerDescription(id), [id, registerDescription]);
95
+ return _jsx("p", { ...props, ref: ref, id: id, className: cn("liano-alert-dialog__description", className) });
96
+ }
97
+ function AlertDialogFooter({ className, ref, ...props }) {
98
+ return _jsx("div", { ...props, ref: ref, className: cn("liano-alert-dialog__footer", className) });
99
+ }
100
+ function AlertDialogCloseButton({ className, onClick, ref, type = "button", ...props }) {
101
+ const { close } = useAlertDialogContext("AlertDialog.Action");
102
+ return (_jsx("button", { ...props, ref: ref, type: type, className: cn("liano-alert-dialog__button", className), onClick: composeEventHandlers(onClick, close) }));
103
+ }
104
+ export const AlertDialog = Object.assign(AlertDialogRoot, {
105
+ Action: AlertDialogCloseButton,
106
+ Cancel: AlertDialogCloseButton,
107
+ Content: AlertDialogContent,
108
+ Description: AlertDialogDescription,
109
+ Footer: AlertDialogFooter,
110
+ Title: AlertDialogTitle,
111
+ Trigger: AlertDialogTrigger
112
+ });
@@ -0,0 +1,2 @@
1
+ export { AlertDialog } from "./alert-dialog.js";
2
+ export type { AlertDialogActionProps, AlertDialogCancelProps, AlertDialogContentProps, AlertDialogDescriptionProps, AlertDialogFooterProps, AlertDialogProps, AlertDialogTitleProps, AlertDialogTriggerProps } from "./alert-dialog.js";
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ export { AlertDialog } from "./alert-dialog.js";
@@ -0,0 +1,14 @@
1
+ import * as React from "react";
2
+ export type AvatarSize = "sm" | "md" | "lg";
3
+ export type AvatarShape = "circle" | "square";
4
+ export interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ src?: string;
6
+ alt?: string;
7
+ name?: string;
8
+ fallback?: React.ReactNode;
9
+ size?: AvatarSize;
10
+ shape?: AvatarShape;
11
+ ref?: React.Ref<HTMLSpanElement>;
12
+ }
13
+ export declare function getAvatarInitials(name: string | undefined): string;
14
+ export declare function Avatar({ alt, className, fallback, name, ref, shape, size, src, ...props }: AvatarProps): React.JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../utils/cn.js";
5
+ export function getAvatarInitials(name) {
6
+ const words = (name ?? "").trim().split(/\s+/).filter(Boolean);
7
+ if (words.length === 0) {
8
+ return "";
9
+ }
10
+ const first = words[0]?.[0] ?? "";
11
+ const last = words.length > 1 ? words[words.length - 1]?.[0] ?? "" : "";
12
+ return `${first}${last}`.toUpperCase();
13
+ }
14
+ export function Avatar({ alt, className, fallback, name, ref, shape = "circle", size = "md", src, ...props }) {
15
+ const [imageFailed, setImageFailed] = React.useState(false);
16
+ const showImage = Boolean(src) && !imageFailed;
17
+ const fallbackContent = fallback ?? getAvatarInitials(name);
18
+ React.useEffect(() => {
19
+ setImageFailed(false);
20
+ }, [src]);
21
+ return (_jsx("span", { ...props, ref: ref, className: cn("liano-avatar", className), "data-shape": shape, "data-size": size, children: showImage ? (_jsx("img", { alt: alt ?? name ?? "", className: "liano-avatar__image", onError: () => setImageFailed(true), src: src })) : (_jsx("span", { "aria-hidden": fallbackContent ? undefined : "true", className: "liano-avatar__fallback", children: fallbackContent })) }));
22
+ }
@@ -0,0 +1,2 @@
1
+ export { Avatar, getAvatarInitials } from "./avatar.js";
2
+ export type { AvatarProps, AvatarShape, AvatarSize } from "./avatar.js";
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ export { Avatar, getAvatarInitials } from "./avatar.js";
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ export type BadgeTone = "neutral" | "primary" | "success" | "warning" | "destructive" | "info";
3
+ export type BadgeVariant = "soft" | "solid" | "outline";
4
+ export type BadgeSize = "sm" | "md";
5
+ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
6
+ tone?: BadgeTone;
7
+ variant?: BadgeVariant;
8
+ size?: BadgeSize;
9
+ ref?: React.Ref<HTMLSpanElement>;
10
+ }
11
+ export declare function Badge({ className, ref, size, tone, variant, ...props }: BadgeProps): React.JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../utils/cn.js";
4
+ export function Badge({ className, ref, size = "sm", tone = "neutral", variant = "soft", ...props }) {
5
+ return (_jsx("span", { ...props, ref: ref, className: cn("liano-badge", className), "data-size": size, "data-tone": tone, "data-variant": variant }));
6
+ }
@@ -0,0 +1,2 @@
1
+ export { Badge } from "./badge.js";
2
+ export type { BadgeProps, BadgeSize, BadgeTone, BadgeVariant } from "./badge.js";
@@ -0,0 +1 @@
1
+ export { Badge } from "./badge.js";
@@ -0,0 +1,24 @@
1
+ import * as React from "react";
2
+ export interface BreadcrumbsProps extends React.HTMLAttributes<HTMLElement> {
3
+ children?: React.ReactNode;
4
+ label?: string;
5
+ separator?: React.ReactNode;
6
+ ref?: React.Ref<HTMLElement>;
7
+ }
8
+ export interface BreadcrumbsItemProps extends React.HTMLAttributes<HTMLLIElement> {
9
+ children?: React.ReactNode;
10
+ href?: string;
11
+ current?: boolean;
12
+ linkProps?: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href" | "children">;
13
+ ref?: React.Ref<HTMLLIElement>;
14
+ }
15
+ interface BreadcrumbsItemInternalProps extends BreadcrumbsItemProps {
16
+ hasSeparator?: boolean;
17
+ separator?: React.ReactNode;
18
+ }
19
+ declare function BreadcrumbsRoot({ className, children, label, separator, ref, ...props }: BreadcrumbsProps): React.JSX.Element;
20
+ declare function BreadcrumbsItem({ children, className, current, href, hasSeparator, linkProps, ref, separator, ...props }: BreadcrumbsItemInternalProps): React.JSX.Element;
21
+ export declare const Breadcrumbs: typeof BreadcrumbsRoot & {
22
+ Item: typeof BreadcrumbsItem;
23
+ };
24
+ export {};