@pravalabs/ui 0.0.0-stage → 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -2
  3. package/dist/Accordion-CVRdRha1.js +107 -0
  4. package/dist/Alert-Bxv6CGPj.js +54 -0
  5. package/dist/Avatar-DUw9xBQ-.js +49 -0
  6. package/dist/Badge-cupXlWce.js +37 -0
  7. package/dist/Button-vjrnnaM_.js +65 -0
  8. package/dist/Card-BJNdpGjM.js +44 -0
  9. package/dist/Checkbox-BQtcnwwC.js +60 -0
  10. package/dist/Container-DO8bd1tv.js +19 -0
  11. package/dist/Dialog-D3-sT_1Z.js +147 -0
  12. package/dist/Drawer-BRzJmvQx.js +21 -0
  13. package/dist/DropdownMenu-CFa2vgXi.js +137 -0
  14. package/dist/FormField-CoC946w9.js +61 -0
  15. package/dist/Grid-vTrChm2w.js +31 -0
  16. package/dist/Input-B97l8Dj0.js +82 -0
  17. package/dist/Label-DYOFzyEM.js +25 -0
  18. package/dist/Popover-C9Vgtm3q.js +81 -0
  19. package/dist/PravaProvider-0znpKV4G.js +59 -0
  20. package/dist/Progress-_Hz8dxM4.js +51 -0
  21. package/dist/RadioGroup-CvdV80Pg.js +90 -0
  22. package/dist/Select-_urp2aA_.js +451 -0
  23. package/dist/Separator-MnFbL0eH.js +23 -0
  24. package/dist/Skeleton-CyjiU8o1.js +25 -0
  25. package/dist/Spinner-Da7h4BDn.js +77 -0
  26. package/dist/Stack-DNtmh6BN.js +30 -0
  27. package/dist/Switch-Cp-wriw6.js +50 -0
  28. package/dist/Tabs-C0SRJSv1.js +158 -0
  29. package/dist/Textarea-D0fNA7sQ.js +69 -0
  30. package/dist/Toast-7qJXHzEb.js +110 -0
  31. package/dist/Tooltip-CyW8YfU9.js +57 -0
  32. package/dist/accordion.js +8 -0
  33. package/dist/alert.js +7 -0
  34. package/dist/avatar.js +7 -0
  35. package/dist/badge.js +7 -0
  36. package/dist/button.js +7 -0
  37. package/dist/card.js +10 -0
  38. package/dist/checkbox.js +8 -0
  39. package/dist/components/accordion/Accordion.d.ts +42 -0
  40. package/dist/components/accordion/index.d.ts +2 -0
  41. package/dist/components/alert/Alert.d.ts +35 -0
  42. package/dist/components/alert/index.d.ts +2 -0
  43. package/dist/components/avatar/Avatar.d.ts +16 -0
  44. package/dist/components/avatar/index.d.ts +2 -0
  45. package/dist/components/badge/Badge.d.ts +22 -0
  46. package/dist/components/badge/index.d.ts +2 -0
  47. package/dist/components/button/Button.d.ts +50 -0
  48. package/dist/components/button/index.d.ts +2 -0
  49. package/dist/components/card/Card.d.ts +49 -0
  50. package/dist/components/card/index.d.ts +2 -0
  51. package/dist/components/checkbox/Checkbox.d.ts +23 -0
  52. package/dist/components/checkbox/index.d.ts +2 -0
  53. package/dist/components/container/Container.d.ts +22 -0
  54. package/dist/components/container/index.d.ts +2 -0
  55. package/dist/components/dialog/Dialog.d.ts +89 -0
  56. package/dist/components/dialog/index.d.ts +2 -0
  57. package/dist/components/drawer/Drawer.d.ts +46 -0
  58. package/dist/components/drawer/index.d.ts +2 -0
  59. package/dist/components/dropdown-menu/DropdownMenu.d.ts +59 -0
  60. package/dist/components/dropdown-menu/index.d.ts +2 -0
  61. package/dist/components/field/field.d.ts +87 -0
  62. package/dist/components/form-field/FormField.d.ts +41 -0
  63. package/dist/components/form-field/index.d.ts +2 -0
  64. package/dist/components/grid/Grid.d.ts +36 -0
  65. package/dist/components/grid/index.d.ts +2 -0
  66. package/dist/components/input/Input.d.ts +35 -0
  67. package/dist/components/input/index.d.ts +2 -0
  68. package/dist/components/label/Label.d.ts +15 -0
  69. package/dist/components/label/index.d.ts +2 -0
  70. package/dist/components/popover/Popover.d.ts +35 -0
  71. package/dist/components/popover/index.d.ts +2 -0
  72. package/dist/components/progress/Progress.d.ts +15 -0
  73. package/dist/components/progress/index.d.ts +2 -0
  74. package/dist/components/provider/PravaProvider.d.ts +69 -0
  75. package/dist/components/provider/index.d.ts +2 -0
  76. package/dist/components/radio-group/RadioGroup.d.ts +58 -0
  77. package/dist/components/radio-group/index.d.ts +2 -0
  78. package/dist/components/select/Select.d.ts +76 -0
  79. package/dist/components/select/index.d.ts +2 -0
  80. package/dist/components/separator/Separator.d.ts +9 -0
  81. package/dist/components/separator/index.d.ts +2 -0
  82. package/dist/components/skeleton/Skeleton.d.ts +7 -0
  83. package/dist/components/skeleton/index.d.ts +2 -0
  84. package/dist/components/spinner/Spinner.d.ts +15 -0
  85. package/dist/components/spinner/index.d.ts +2 -0
  86. package/dist/components/stack/Stack.d.ts +38 -0
  87. package/dist/components/stack/index.d.ts +2 -0
  88. package/dist/components/switch/Switch.d.ts +19 -0
  89. package/dist/components/switch/index.d.ts +2 -0
  90. package/dist/components/tabs/Tabs.d.ts +69 -0
  91. package/dist/components/tabs/index.d.ts +2 -0
  92. package/dist/components/textarea/Textarea.d.ts +26 -0
  93. package/dist/components/textarea/index.d.ts +2 -0
  94. package/dist/components/toast/Toast.d.ts +55 -0
  95. package/dist/components/toast/index.d.ts +2 -0
  96. package/dist/components/tooltip/Tooltip.d.ts +22 -0
  97. package/dist/components/tooltip/index.d.ts +2 -0
  98. package/dist/container.js +7 -0
  99. package/dist/dialog.js +8 -0
  100. package/dist/drawer.js +8 -0
  101. package/dist/dropdown-menu.js +8 -0
  102. package/dist/field-U1YinldE.js +152 -0
  103. package/dist/form-field.js +8 -0
  104. package/dist/grid.js +7 -0
  105. package/dist/index.d.ts +59 -0
  106. package/dist/index.js +29 -0
  107. package/dist/input.js +8 -0
  108. package/dist/internal/overlay.d.ts +39 -0
  109. package/dist/internal/useControllable.d.ts +2 -0
  110. package/dist/label.js +8 -0
  111. package/dist/overlay-9zlvgpUZ.js +121 -0
  112. package/dist/popover.js +8 -0
  113. package/dist/progress.js +7 -0
  114. package/dist/provider.js +7 -0
  115. package/dist/radio-group.js +8 -0
  116. package/dist/select.js +8 -0
  117. package/dist/separator.js +7 -0
  118. package/dist/skeleton.js +7 -0
  119. package/dist/spinner.js +7 -0
  120. package/dist/stack.js +7 -0
  121. package/dist/styles/components/accordion.css +1 -0
  122. package/dist/styles/components/alert.css +1 -0
  123. package/dist/styles/components/avatar.css +1 -0
  124. package/dist/styles/components/badge.css +1 -0
  125. package/dist/styles/components/button.css +1 -0
  126. package/dist/styles/components/card.css +1 -0
  127. package/dist/styles/components/checkbox.css +1 -0
  128. package/dist/styles/components/container.css +1 -0
  129. package/dist/styles/components/dialog.css +1 -0
  130. package/dist/styles/components/drawer.css +1 -0
  131. package/dist/styles/components/dropdown-menu.css +1 -0
  132. package/dist/styles/components/field.css +1 -0
  133. package/dist/styles/components/floating.css +1 -0
  134. package/dist/styles/components/form-field.css +1 -0
  135. package/dist/styles/components/grid.css +1 -0
  136. package/dist/styles/components/input.css +1 -0
  137. package/dist/styles/components/label.css +1 -0
  138. package/dist/styles/components/popover.css +1 -0
  139. package/dist/styles/components/progress.css +1 -0
  140. package/dist/styles/components/provider.css +1 -0
  141. package/dist/styles/components/radio-group.css +1 -0
  142. package/dist/styles/components/select.css +1 -0
  143. package/dist/styles/components/separator.css +1 -0
  144. package/dist/styles/components/skeleton.css +1 -0
  145. package/dist/styles/components/spinner.css +1 -0
  146. package/dist/styles/components/stack.css +1 -0
  147. package/dist/styles/components/switch.css +1 -0
  148. package/dist/styles/components/tabs.css +1 -0
  149. package/dist/styles/components/textarea.css +1 -0
  150. package/dist/styles/components/toast.css +1 -0
  151. package/dist/styles/components/tooltip.css +1 -0
  152. package/dist/styles.css +1 -0
  153. package/dist/switch.js +8 -0
  154. package/dist/tabs.js +10 -0
  155. package/dist/textarea.js +8 -0
  156. package/dist/toast.js +9 -0
  157. package/dist/tokens.css +192 -0
  158. package/dist/tooltip.js +8 -0
  159. package/dist/useControllable-C2Te1pSd.js +14 -0
  160. package/package.json +223 -4
@@ -0,0 +1,2 @@
1
+ export { Tooltip } from './Tooltip';
2
+ export type { TooltipProps } from './Tooltip';
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/container.css';
4
+ import { C as a } from "./Container-DO8bd1tv.js";
5
+ export {
6
+ a as Container
7
+ };
package/dist/dialog.js ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/dialog.css';
4
+ import { D as l, a as s } from "./Dialog-D3-sT_1Z.js";
5
+ export {
6
+ l as Dialog,
7
+ s as DialogClose
8
+ };
package/dist/drawer.js ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/drawer.css';
4
+ import { D as e, a as o } from "./Drawer-BRzJmvQx.js";
5
+ export {
6
+ e as Drawer,
7
+ o as DrawerClose
8
+ };
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/floating.css';
4
+ import './styles/components/dropdown-menu.css';
5
+ import { D as e } from "./DropdownMenu-CFa2vgXi.js";
6
+ export {
7
+ e as DropdownMenu
8
+ };
@@ -0,0 +1,152 @@
1
+ "use client";
2
+ import { jsxs as h, Fragment as F, jsx as d } from "react/jsx-runtime";
3
+ import { useContext as O, useId as P, useState as S, useRef as E, forwardRef as k, createContext as T } from "react";
4
+ import { u as L } from "./PravaProvider-0znpKV4G.js";
5
+ const U = T(!1), y = (e) => e != null && e !== !1 && e !== !0 && e !== "", N = (e, r) => {
6
+ typeof e == "function" ? e(r) : e && (e.current = r);
7
+ };
8
+ function q({ field: e, ...r }, n, t = "value") {
9
+ if (!e) return { ...r, ref: n };
10
+ const { ref: i, onChange: a, onBlur: l, value: c, ...u } = e;
11
+ return {
12
+ ...u,
13
+ // register() has no value key and leaves the control uncontrolled; Controller's value drives it.
14
+ ..."value" in e && {
15
+ [t]: t === "checked" ? !!c : c
16
+ },
17
+ ...r,
18
+ onChange: (s) => {
19
+ r.onChange?.(s), a?.(s);
20
+ },
21
+ onBlur: (s) => {
22
+ r.onBlur?.(s), l?.(s);
23
+ },
24
+ ref: (s) => {
25
+ N(i, s), N(n, s);
26
+ }
27
+ };
28
+ }
29
+ const $ = (e, r, n) => e.replace(/\{(\w+)\}/g, (t, i) => {
30
+ const a = r[i];
31
+ return typeof a == "number" ? new Intl.NumberFormat(n).format(a) : String(a);
32
+ }), x = /* @__PURE__ */ new WeakSet();
33
+ function z(e, r, n) {
34
+ if (x.has(e)) return;
35
+ x.add(e);
36
+ let t = e, i;
37
+ for (; t && !i; )
38
+ i = Object.getOwnPropertyDescriptor(t, r), t = Object.getPrototypeOf(t);
39
+ const { get: a, set: l } = i ?? {};
40
+ !a || !l || Object.defineProperty(e, r, {
41
+ configurable: !0,
42
+ get() {
43
+ return a.call(this);
44
+ },
45
+ set(c) {
46
+ l.call(this, c), n();
47
+ }
48
+ });
49
+ }
50
+ function D(e, r, n) {
51
+ const t = e.validity;
52
+ if (t.valid) return;
53
+ const i = (a) => $(
54
+ a,
55
+ new Proxy(
56
+ {},
57
+ {
58
+ get: (l, c) => {
59
+ const u = String(
60
+ e[c]
61
+ );
62
+ return u !== "" && Number.isFinite(Number(u)) ? Number(u) : u;
63
+ }
64
+ }
65
+ ),
66
+ n
67
+ );
68
+ return t.valueMissing ? e.tagName === "SELECT" || e.type === "checkbox" || e.type === "radio" ? r.valueMissingChoice : r.valueMissing : t.typeMismatch ? e.type === "url" ? r.typeMismatchUrl : r.typeMismatchEmail : t.badInput ? r.badInput : t.patternMismatch ? e.title || r.patternMismatch : t.tooShort ? i(r.tooShort) : t.tooLong ? i(r.tooLong) : t.rangeUnderflow ? i(r.rangeUnderflow) : t.rangeOverflow ? i(r.rangeOverflow) : t.stepMismatch ? r.stepMismatch : e.validationMessage;
69
+ }
70
+ function G({
71
+ id: e,
72
+ description: r,
73
+ error: n,
74
+ invalid: t,
75
+ onBlur: i,
76
+ onChange: a,
77
+ onInvalid: l,
78
+ ...c
79
+ }) {
80
+ const u = O(U), { messages: s, locale: C } = L(), B = P(), [m, I] = S(), M = E(!1), v = e ?? B, _ = y(n) ? n : m, g = y(r) ? `${v}-description` : void 0, p = y(_) ? `${v}-error` : void 0, j = t || n === !0 || !!p || c["aria-invalid"] === !0 || c["aria-invalid"] === "true", b = (o, f = !1) => {
81
+ u || !f && o.form?.noValidate || I(D(o, s, C));
82
+ };
83
+ return {
84
+ id: v,
85
+ controlProps: {
86
+ id: v,
87
+ "aria-invalid": j || void 0,
88
+ "aria-describedby": [c["aria-describedby"], g, p].filter(Boolean).join(" ") || void 0,
89
+ onBlur: (o) => {
90
+ i?.(o), (M.current || m) && b(o.currentTarget);
91
+ },
92
+ onChange: (o) => {
93
+ a?.(o), M.current = !0, m && b(o.currentTarget);
94
+ },
95
+ onInvalid: (o) => {
96
+ if (l?.(o), o.defaultPrevented || u) return;
97
+ o.preventDefault();
98
+ const f = o.currentTarget;
99
+ b(f, !0), Array.from(f.form?.elements ?? []).find(
100
+ (w) => w.willValidate && !w.validity.valid
101
+ ) === f && f.focus();
102
+ }
103
+ },
104
+ messages: /* @__PURE__ */ h(F, { children: [
105
+ g && /* @__PURE__ */ d("div", { id: g, className: "prava-field__description", children: r }),
106
+ p && /* @__PURE__ */ h("div", { id: p, className: "prava-field__error", children: [
107
+ /* @__PURE__ */ h("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [
108
+ /* @__PURE__ */ d("circle", { cx: "8", cy: "8", r: "6.5" }),
109
+ /* @__PURE__ */ d("path", { d: "M8 4.75v3.5M8 11h.01" })
110
+ ] }),
111
+ /* @__PURE__ */ d("span", { children: _ })
112
+ ] })
113
+ ] })
114
+ };
115
+ }
116
+ const H = k(function({ kind: r, label: n, className: t, style: i, ...a }, l) {
117
+ return /* @__PURE__ */ h(
118
+ "label",
119
+ {
120
+ className: ["prava-choice", `prava-${r}`, t].filter(Boolean).join(" "),
121
+ style: i,
122
+ children: [
123
+ /* @__PURE__ */ h("span", { className: "prava-choice__control", children: [
124
+ /* @__PURE__ */ d(
125
+ "input",
126
+ {
127
+ ...a,
128
+ ref: l,
129
+ type: r === "radio" ? "radio" : "checkbox",
130
+ role: r === "switch" ? "switch" : void 0,
131
+ className: "prava-choice__input"
132
+ }
133
+ ),
134
+ /* @__PURE__ */ d("span", { className: "prava-choice__indicator", "aria-hidden": "true", children: r === "checkbox" && /* @__PURE__ */ h("svg", { viewBox: "0 0 16 16", children: [
135
+ /* @__PURE__ */ d("path", { className: "prava-choice__check", d: "M3.5 8.5l3 3 6-7" }),
136
+ /* @__PURE__ */ d("path", { className: "prava-choice__dash", d: "M4 8h8" })
137
+ ] }) })
138
+ ] }),
139
+ n != null && /* @__PURE__ */ d("span", { className: "prava-choice__label", children: n })
140
+ ]
141
+ }
142
+ );
143
+ });
144
+ export {
145
+ H as C,
146
+ U as F,
147
+ q as b,
148
+ $ as f,
149
+ z as o,
150
+ N as s,
151
+ G as u
152
+ };
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/field.css';
4
+ import './styles/components/form-field.css';
5
+ import { F } from "./FormField-CoC946w9.js";
6
+ export {
7
+ F as FormField
8
+ };
package/dist/grid.js ADDED
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/grid.css';
4
+ import { G } from "./Grid-vTrChm2w.js";
5
+ export {
6
+ G as Grid
7
+ };
@@ -0,0 +1,59 @@
1
+ export { Button } from './components/button';
2
+ export type { ButtonProps } from './components/button';
3
+ export { Badge } from './components/badge';
4
+ export type { BadgeProps } from './components/badge';
5
+ export { Avatar } from './components/avatar';
6
+ export type { AvatarProps } from './components/avatar';
7
+ export { Spinner } from './components/spinner';
8
+ export type { SpinnerProps } from './components/spinner';
9
+ export { Input } from './components/input';
10
+ export type { InputProps } from './components/input';
11
+ export { Card, CardContent, CardFooter, CardHeader } from './components/card';
12
+ export type { CardContentProps, CardFooterProps, CardHeaderProps, CardProps, } from './components/card';
13
+ export { Separator } from './components/separator';
14
+ export type { SeparatorProps } from './components/separator';
15
+ export { Skeleton } from './components/skeleton';
16
+ export type { SkeletonProps } from './components/skeleton';
17
+ export { Progress } from './components/progress';
18
+ export type { ProgressProps } from './components/progress';
19
+ export { Textarea } from './components/textarea';
20
+ export type { TextareaProps } from './components/textarea';
21
+ export { Label } from './components/label';
22
+ export type { LabelProps } from './components/label';
23
+ export { FormField } from './components/form-field';
24
+ export type { FormFieldProps } from './components/form-field';
25
+ export { PravaProvider } from './components/provider';
26
+ export type { BuiltInMessages, PravaProviderProps, } from './components/provider';
27
+ export { Checkbox } from './components/checkbox';
28
+ export type { CheckboxProps } from './components/checkbox';
29
+ export { Switch } from './components/switch';
30
+ export type { SwitchProps } from './components/switch';
31
+ export { RadioGroup } from './components/radio-group';
32
+ export type { RadioGroupProps, RadioOption } from './components/radio-group';
33
+ export { Select } from './components/select';
34
+ export type { SelectOption, SelectOptionGroup, SelectProps, } from './components/select';
35
+ export { Alert } from './components/alert';
36
+ export type { AlertProps } from './components/alert';
37
+ export { Container } from './components/container';
38
+ export type { ContainerProps } from './components/container';
39
+ export { Stack } from './components/stack';
40
+ export type { StackProps } from './components/stack';
41
+ export { Grid } from './components/grid';
42
+ export type { GridProps } from './components/grid';
43
+ export { Dialog, DialogClose } from './components/dialog';
44
+ export type { DialogProps } from './components/dialog';
45
+ export { Drawer, DrawerClose } from './components/drawer';
46
+ export type { DrawerProps } from './components/drawer';
47
+ export { Popover } from './components/popover';
48
+ export type { PopoverProps } from './components/popover';
49
+ export { Tooltip } from './components/tooltip';
50
+ export type { TooltipProps } from './components/tooltip';
51
+ export { DropdownMenu } from './components/dropdown-menu';
52
+ export type { DropdownMenuAction, DropdownMenuGroup, DropdownMenuItem, DropdownMenuProps, DropdownMenuSeparator, } from './components/dropdown-menu';
53
+ export { Tab, TabList, TabPanel, Tabs } from './components/tabs';
54
+ export type { TabListProps, TabPanelProps, TabProps, TabsProps, } from './components/tabs';
55
+ export { Accordion, AccordionItem } from './components/accordion';
56
+ export type { AccordionItemProps, AccordionProps, } from './components/accordion';
57
+ export { dismissToast, toast, Toaster } from './components/toast';
58
+ export type { ToasterProps, ToastOptions } from './components/toast';
59
+ export type { FieldBinding, FieldProps } from './components/field/field';
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ export * from './button.js';
2
+ export * from './badge.js';
3
+ export * from './avatar.js';
4
+ export * from './spinner.js';
5
+ export * from './input.js';
6
+ export * from './card.js';
7
+ export * from './separator.js';
8
+ export * from './skeleton.js';
9
+ export * from './progress.js';
10
+ export * from './textarea.js';
11
+ export * from './label.js';
12
+ export * from './form-field.js';
13
+ export * from './checkbox.js';
14
+ export * from './switch.js';
15
+ export * from './radio-group.js';
16
+ export * from './select.js';
17
+ export * from './alert.js';
18
+ export * from './container.js';
19
+ export * from './stack.js';
20
+ export * from './grid.js';
21
+ export * from './dialog.js';
22
+ export * from './drawer.js';
23
+ export * from './popover.js';
24
+ export * from './tooltip.js';
25
+ export * from './dropdown-menu.js';
26
+ export * from './tabs.js';
27
+ export * from './accordion.js';
28
+ export * from './toast.js';
29
+ export * from './provider.js';
package/dist/input.js ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/field.css';
4
+ import './styles/components/input.css';
5
+ import { I as r } from "./Input-B97l8Dj0.js";
6
+ export {
7
+ r as Input
8
+ };
@@ -0,0 +1,39 @@
1
+ import { ReactElement, RefObject } from 'react';
2
+ type Props = Record<string, unknown>;
3
+ /** Merges handlers so the consumer's runs first and `preventDefault` opts out of Prava's. */
4
+ export declare function mergeHandlers(own: object, extra: Props): {
5
+ [x: string]: unknown;
6
+ };
7
+ /** Adds ARIA and handlers to a consumer's trigger element without a wrapper or a ref. */
8
+ export declare const cloneTrigger: (trigger: ReactElement, extra: Props) => ReactElement<Props, string | import('react').JSXElementConstructor<any>>;
9
+ /**
10
+ * Stays true after `open` turns false until the element's exit transition ends, so content
11
+ * can unmount without cutting the animation short. No transition (reduced motion) ends at once.
12
+ */
13
+ export declare function usePresence(open: boolean, ref: RefObject<HTMLElement | null>): boolean;
14
+ /** Stops the page scrolling behind a modal without shifting layout; nested modals share one lock. */
15
+ export declare function lockScroll(): () => void;
16
+ export type FloatingPlacement = "top" | "bottom" | "start" | "end";
17
+ export type FloatingAlign = "start" | "center" | "end";
18
+ export type FloatingOptions = {
19
+ /** Space between anchor and popup. */
20
+ gap?: number;
21
+ /** Space kept from the viewport edges. */
22
+ margin?: number;
23
+ /** Full height of a popup whose inner scroller hides it from `scrollHeight`. */
24
+ contentHeight?: number;
25
+ /** Opens beside the anchor when neither above nor below can show this many pixels. */
26
+ minBlockRoom?: number;
27
+ /** Keeps `placement` whenever it leaves usable room, instead of moving to a roomier side. */
28
+ strict?: boolean;
29
+ };
30
+ /** Positions `popup` beside `anchor`, flipping to the roomier side and staying on screen. */
31
+ export declare function placeFloating(anchor: Element, popup: HTMLElement, placement: FloatingPlacement, align: FloatingAlign, { gap, margin, contentHeight, minBlockRoom, strict, }?: FloatingOptions): void;
32
+ /**
33
+ * Shows `popup` in the top layer while open and keeps it attached to the first element in `root`.
34
+ * The top layer is what lets it escape a Card, a scroll container, or a modal Dialog.
35
+ */
36
+ export declare function useFloating(open: boolean, root: RefObject<HTMLElement | null>, popup: RefObject<HTMLElement | null>, placement: FloatingPlacement, align: FloatingAlign): void;
37
+ /** Closes on a press outside `root`, which holds both the trigger and the popup. */
38
+ export declare function useOutsidePress(open: boolean, root: RefObject<HTMLElement | null>, close: () => void): void;
39
+ export {};
@@ -0,0 +1,2 @@
1
+ /** Controlled when `value` is defined; otherwise keeps its own state starting at `defaultValue`. */
2
+ export declare function useControllable<T>(value: T | undefined, defaultValue: T, onChange?: (next: T) => void): readonly [T, (next: T) => void];
package/dist/label.js ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/field.css';
4
+ import './styles/components/label.css';
5
+ import { L as o } from "./Label-DYOFzyEM.js";
6
+ export {
7
+ o as Label
8
+ };
@@ -0,0 +1,121 @@
1
+ "use client";
2
+ import { useState as O, useEffect as M, cloneElement as $ } from "react";
3
+ function C(t, e) {
4
+ const o = { ...e };
5
+ for (const n of Object.keys(e)) {
6
+ const s = t[n], i = e[n];
7
+ n.startsWith("on") && typeof s == "function" && (o[n] = (u) => {
8
+ s(u), u.defaultPrevented || i(u);
9
+ });
10
+ }
11
+ return o;
12
+ }
13
+ const B = (t, e) => $(
14
+ t,
15
+ C(t.props, e)
16
+ );
17
+ function R(t, e) {
18
+ const [o, n] = O(t);
19
+ return t && !o && n(!0), M(() => {
20
+ if (t || !o) return;
21
+ let s = !0;
22
+ return Promise.allSettled(
23
+ (e.current?.getAnimations?.() ?? []).map((i) => i.finished)
24
+ ).then(() => {
25
+ s && n(!1);
26
+ }), () => {
27
+ s = !1;
28
+ };
29
+ }, [t, o, e]), o;
30
+ }
31
+ let P = 0, W = () => {
32
+ };
33
+ function j() {
34
+ if (P++ === 0) {
35
+ const { style: t, clientWidth: e } = document.documentElement, { overflow: o, scrollbarGutter: n } = t;
36
+ window.innerWidth > e && (t.scrollbarGutter = "stable"), t.overflow = "hidden", W = () => {
37
+ t.overflow = o, t.scrollbarGutter = n;
38
+ };
39
+ }
40
+ return () => {
41
+ --P === 0 && W();
42
+ };
43
+ }
44
+ const E = {
45
+ top: "bottom",
46
+ bottom: "top",
47
+ left: "right",
48
+ right: "left"
49
+ }, k = (t, e, o) => Math.max(o, Math.min(t, e - o));
50
+ function F(t, e, o, n, {
51
+ gap: s = 6,
52
+ margin: i = 8,
53
+ contentHeight: u,
54
+ minBlockRoom: h = 0,
55
+ strict: v = !1
56
+ } = {}) {
57
+ const { style: f } = e;
58
+ f.left = f.top = "0px";
59
+ const c = t.getBoundingClientRect(), g = getComputedStyle(e), y = g.direction === "rtl", S = document.documentElement.clientWidth, x = window.innerHeight, m = parseFloat(g.width) || e.offsetWidth, a = u ?? e.scrollHeight, d = {
60
+ top: c.top - s - i,
61
+ bottom: x - c.bottom - s - i,
62
+ left: c.left - s - i,
63
+ right: S - c.right - s - i
64
+ }, p = y ? "right" : "left";
65
+ let r = o === "start" ? p : o === "end" ? E[p] : o;
66
+ const z = r === "left" || r === "right", H = d[r] >= (z ? m : Math.min(a, h));
67
+ if ((!v || !H) && (d[r] < (z ? m : a) && d[E[r]] > d[r] && (r = E[r]), (r === "left" || r === "right") && d[r] < m && (r = d.bottom >= d.top ? "bottom" : "top"), Math.max(d.top, d.bottom) < Math.min(a, h))) {
68
+ const l = [E[p], p].find(
69
+ (L) => d[L] >= m
70
+ );
71
+ l && (r = l);
72
+ }
73
+ let w, b;
74
+ if (r === "top" || r === "bottom") {
75
+ const l = Math.min(a, Math.max(d[r], 0));
76
+ f.maxBlockSize = l < a ? `${l}px` : "", b = r === "bottom" ? c.bottom + s : c.top - s - l, w = n === "center" ? c.left + (c.width - m) / 2 : (y ? n === "end" : n === "start") ? c.left : c.right - m, w = k(w, S - m, i);
77
+ } else {
78
+ const l = Math.min(a, x - i * 2);
79
+ f.maxBlockSize = l < a ? `${l}px` : "", w = r === "right" ? c.right + s : c.left - s - m, b = n === "center" ? c.top + (c.height - l) / 2 : n === "start" ? c.top : c.bottom - l, b = k(b, x - l, i);
80
+ }
81
+ e.dataset.side = r, f.left = `${w}px`, f.top = `${b}px`;
82
+ }
83
+ function A(t, e, o, n, s) {
84
+ M(() => {
85
+ const i = o.current, u = e.current?.firstElementChild;
86
+ if (!i || !u) return;
87
+ if (!t) {
88
+ i.matches?.(":popover-open") && i.hidePopover();
89
+ return;
90
+ }
91
+ i.showPopover?.();
92
+ const h = () => F(u, i, n, s);
93
+ h();
94
+ const v = (c) => {
95
+ i.contains(c.target) || h();
96
+ };
97
+ window.addEventListener("resize", h), window.addEventListener("scroll", v, !0);
98
+ const f = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(h);
99
+ return f?.observe(i), () => {
100
+ window.removeEventListener("resize", h), window.removeEventListener("scroll", v, !0), f?.disconnect();
101
+ };
102
+ }, [t, e, o, n, s]);
103
+ }
104
+ function T(t, e, o) {
105
+ M(() => {
106
+ if (!t) return;
107
+ const n = (s) => {
108
+ e.current?.contains(s.target) || o();
109
+ };
110
+ return document.addEventListener("pointerdown", n), () => document.removeEventListener("pointerdown", n);
111
+ }, [t, e, o]);
112
+ }
113
+ export {
114
+ A as a,
115
+ T as b,
116
+ B as c,
117
+ j as l,
118
+ C as m,
119
+ F as p,
120
+ R as u
121
+ };
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/floating.css';
4
+ import './styles/components/popover.css';
5
+ import { P as e } from "./Popover-C9Vgtm3q.js";
6
+ export {
7
+ e as Popover
8
+ };
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/progress.css';
4
+ import { P as s } from "./Progress-_Hz8dxM4.js";
5
+ export {
6
+ s as Progress
7
+ };
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/provider.css';
4
+ import { P as o } from "./PravaProvider-0znpKV4G.js";
5
+ export {
6
+ o as PravaProvider
7
+ };
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/field.css';
4
+ import './styles/components/radio-group.css';
5
+ import { R as a } from "./RadioGroup-CvdV80Pg.js";
6
+ export {
7
+ a as RadioGroup
8
+ };
package/dist/select.js ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/field.css';
4
+ import './styles/components/select.css';
5
+ import { S as r } from "./Select-_urp2aA_.js";
6
+ export {
7
+ r as Select
8
+ };
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/separator.css';
4
+ import { S as o } from "./Separator-MnFbL0eH.js";
5
+ export {
6
+ o as Separator
7
+ };
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/skeleton.css';
4
+ import { S as r } from "./Skeleton-CyjiU8o1.js";
5
+ export {
6
+ r as Skeleton
7
+ };
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/spinner.css';
4
+ import { S as n } from "./Spinner-Da7h4BDn.js";
5
+ export {
6
+ n as Spinner
7
+ };
package/dist/stack.js ADDED
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import './tokens.css';
3
+ import './styles/components/stack.css';
4
+ import { S as r } from "./Stack-DNtmh6BN.js";
5
+ export {
6
+ r as Stack
7
+ };
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid}}}@layer prava.components{.prava-accordion{min-width:0;font-size:var(--prava-font-size-3);color:var(--prava-color-text);line-height:var(--prava-line-height-normal)}.prava-accordion__item{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--prava-color-border)}.prava-accordion__item:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.prava-accordion__heading{font:inherit;margin:0}.prava-accordion__trigger{box-sizing:border-box;min-height:calc(var(--spacing,.25rem) * 12);cursor:pointer;justify-content:space-between;align-items:center;gap:calc(var(--spacing,.25rem) * 3);border-style:var(--tw-border-style);width:100%;padding-inline:calc(var(--spacing,.25rem) * 2);padding-block:calc(var(--spacing,.25rem) * 3);text-align:start;color:var(--prava-color-text);font:inherit;font-weight:var(--prava-font-weight-medium);outline:var(--prava-stroke) solid transparent;outline-offset:calc(var(--prava-stroke) * -1);border-radius:var(--prava-radius-sm);transition:background-color var(--prava-duration-fast) var(--prava-ease-standard);-webkit-tap-highlight-color:transparent;background-color:#0000;border-width:0;display:flex}@media(hover:hover){.prava-accordion__trigger:not(:disabled):hover{background-color:var(--prava-color-surface-hover)}}.prava-accordion__trigger:focus-visible{outline-color:var(--prava-color-focus)}.prava-accordion__trigger:disabled{cursor:not-allowed;opacity:.5}.prava-accordion__title{overflow-wrap:anywhere;min-width:0}.prava-accordion__chevron{width:calc(var(--spacing,.25rem) * 4);height:calc(var(--spacing,.25rem) * 4);color:var(--prava-color-text-muted);fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;transition:rotate var(--prava-duration-normal) var(--prava-ease-standard);flex:none}.prava-accordion__item[data-open]>*>*>.prava-accordion__chevron{rotate:180deg}.prava-accordion__panel{visibility:hidden;transition:grid-template-rows var(--prava-duration-normal) var(--prava-ease-standard),visibility var(--prava-duration-normal) allow-discrete;grid-template-rows:0fr;display:grid}.prava-accordion__item[data-open]>.prava-accordion__panel{visibility:visible;grid-template-rows:1fr}.prava-accordion__clip{min-height:0;overflow:hidden}.prava-accordion__content{padding-inline:calc(var(--spacing,.25rem) * 2);padding-bottom:calc(var(--spacing,.25rem) * 4);color:var(--prava-color-text-muted)}@media(prefers-reduced-motion:reduce){.prava-accordion__trigger,.prava-accordion__chevron,.prava-accordion__panel{transition:none}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-border-style:solid}}}@layer prava.components{.prava-alert{box-sizing:border-box;align-items:flex-start;column-gap:calc(var(--spacing,.25rem) * 3);row-gap:calc(var(--spacing,.25rem) * 2);border-radius:var(--prava-radius-control);min-width:0;max-width:100%;padding-inline:calc(var(--spacing,.25rem) * 4);padding-block:calc(var(--spacing,.25rem) * 3);font-size:var(--prava-font-size-3);line-height:var(--prava-line-height-normal);animation:prava-alert-in var(--prava-duration-normal) var(--prava-ease-standard);flex-wrap:wrap;display:flex;position:relative}@keyframes prava-alert-in{0%{opacity:0}}.prava-alert[data-tone=neutral]{background-color:var(--prava-color-surface-sunken);color:var(--prava-color-text)}.prava-alert[data-tone=info]{background-color:var(--prava-color-info);color:var(--prava-color-on-info)}.prava-alert[data-tone=success]{background-color:var(--prava-color-success);color:var(--prava-color-on-success)}.prava-alert[data-tone=warning]{background-color:var(--prava-color-warning);color:var(--prava-color-on-warning)}.prava-alert[data-tone=danger]{background-color:var(--prava-color-danger-container);color:var(--prava-color-on-danger-container)}.prava-alert__icon{height:calc(var(--spacing,.25rem) * 5);flex:none;align-items:center;display:flex}.prava-alert__icon svg,.prava-alert__dismiss svg{width:calc(var(--spacing,.25rem) * 4);height:calc(var(--spacing,.25rem) * 4);fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.prava-alert[data-dismissible]{padding-inline-end:calc(var(--spacing,.25rem) * 11)}.prava-alert__body{gap:calc(var(--spacing,.25rem) * .5);flex:11rem;min-width:0;display:grid}.prava-alert__title{--tw-font-weight:var(--prava-font-weight-semibold);font-weight:var(--prava-font-weight-semibold)}.prava-alert__action{align-items:center;gap:calc(var(--spacing,.25rem) * 2);flex-wrap:wrap;margin-inline-start:auto;display:flex}.prava-alert__dismiss{inset-inline-end:calc(var(--spacing,.25rem) * 2);top:calc(var(--spacing,.25rem) * 2);width:calc(var(--spacing,.25rem) * 7);height:calc(var(--spacing,.25rem) * 7);cursor:pointer;border-radius:var(--prava-radius-sm);border-style:var(--tw-border-style);color:inherit;outline:var(--prava-stroke) solid transparent;transition:outline-color var(--prava-duration-fast) var(--prava-ease-standard);background-color:#0000;border-width:0;place-items:center;padding:0;display:grid;position:absolute}.prava-alert__dismiss:before{content:"";border-radius:inherit;opacity:0;transition:opacity var(--prava-duration-fast) var(--prava-ease-standard);background:currentColor;position:absolute;inset:0}.prava-alert__dismiss:focus-visible{outline-color:var(--prava-color-focus)}@media(hover:hover){.prava-alert__dismiss:hover:before{opacity:.12}}@media(pointer:coarse){.prava-alert[data-dismissible]{padding-inline-end:calc(var(--spacing,.25rem) * 13)}.prava-alert__dismiss{inset-inline-end:calc(var(--spacing,.25rem) * .5);top:calc(var(--spacing,.25rem) * .5);width:calc(var(--spacing,.25rem) * 11);height:calc(var(--spacing,.25rem) * 11)}}@media(prefers-reduced-motion:reduce){.prava-alert__dismiss,.prava-alert__dismiss:before{transition:none}}}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial}}}@layer prava.components{.prava-avatar{background-color:var(--prava-color-surface-raised);vertical-align:middle;--tw-font-weight:var(--prava-font-weight-semibold);font-weight:var(--prava-font-weight-semibold);color:var(--prava-color-text);-webkit-user-select:none;user-select:none;box-shadow:inset 0 0 0 1px var(--prava-color-border);border-radius:2147483647px;flex:none;justify-content:center;align-items:center;line-height:1;display:inline-flex;overflow:hidden}.prava-avatar[data-size=sm]{width:calc(var(--spacing,.25rem) * 8);height:calc(var(--spacing,.25rem) * 8);font-size:var(--prava-font-size-1)}.prava-avatar[data-size=md]{width:calc(var(--spacing,.25rem) * 10);height:calc(var(--spacing,.25rem) * 10);font-size:var(--prava-font-size-3)}.prava-avatar[data-size=lg]{width:calc(var(--spacing,.25rem) * 12);height:calc(var(--spacing,.25rem) * 12);font-size:var(--prava-font-size-4)}.prava-avatar img{object-fit:cover;width:100%;height:100%}.prava-avatar[data-tone]{box-shadow:none}.prava-avatar[data-tone=primary]{background-color:var(--prava-color-primary-container);color:var(--prava-color-on-primary-container)}.prava-avatar[data-tone=success]{background-color:var(--prava-color-success);color:var(--prava-color-on-success)}.prava-avatar[data-tone=warning]{background-color:var(--prava-color-warning);color:var(--prava-color-on-warning)}.prava-avatar[data-tone=info]{background-color:var(--prava-color-info);color:var(--prava-color-on-info)}.prava-avatar[data-tone=danger]{background-color:var(--prava-color-danger-container);color:var(--prava-color-on-danger-container)}}@property --tw-font-weight{syntax:"*";inherits:false}
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial}}}@layer prava.components{.prava-badge{vertical-align:middle;--prava-badge-flip:1;max-width:100%;display:inline-flex;position:relative}.prava-badge:dir(rtl){--prava-badge-flip:-1}.prava-badge__target{max-width:100%;display:inline-flex}.prava-badge__indicator{pointer-events:none;justify-content:center;align-items:center;gap:var(--spacing,.25rem);max-width:100%;font-size:var(--prava-font-size-1);--tw-font-weight:var(--prava-font-weight-semibold);font-weight:var(--prava-font-weight-semibold);white-space:nowrap;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, );border-radius:2147483647px;line-height:1;display:inline-flex}.prava-badge:not([data-standalone]) .prava-badge__indicator{z-index:10;box-shadow:0 0 0 var(--prava-stroke) var(--prava-color-surface);position:absolute}.prava-badge__indicator[data-placement^=top]{top:0}.prava-badge__indicator[data-placement^=bottom]{bottom:0}.prava-badge__indicator[data-placement$=end]{translate:calc(50% * var(--prava-badge-flip)) 0;inset-inline-end:0}.prava-badge__indicator[data-placement$=start]{translate:calc(-50% * var(--prava-badge-flip)) 0;inset-inline-start:0}.prava-badge__indicator[data-placement^=top]{margin-block-start:-.5rem}.prava-badge__indicator[data-placement^=bottom]{margin-block-end:-.5rem}.prava-badge__indicator[data-size=sm]{height:calc(var(--spacing,.25rem) * 4.5);min-width:calc(var(--spacing,.25rem) * 4.5);padding-inline:calc(var(--spacing,.25rem) * 1.5)}.prava-badge__indicator[data-size=md]{height:calc(var(--spacing,.25rem) * 5.5);min-width:calc(var(--spacing,.25rem) * 5.5);padding-inline:calc(var(--spacing,.25rem) * 2);font-size:var(--prava-font-size-2)}.prava-badge[data-standalone] .prava-badge__indicator[data-size=sm]{height:calc(var(--spacing,.25rem) * 5);padding-inline:calc(var(--spacing,.25rem) * 2)}.prava-badge[data-standalone] .prava-badge__indicator[data-size=md]{height:calc(var(--spacing,.25rem) * 6);padding-inline:calc(var(--spacing,.25rem) * 2.5)}.prava-badge__indicator[data-tone=neutral]{background-color:var(--prava-color-surface-raised);color:var(--prava-color-text)}.prava-badge__indicator[data-tone=primary]{background-color:var(--prava-color-primary-container);color:var(--prava-color-on-primary-container)}.prava-badge__indicator[data-tone=success]{background-color:var(--prava-color-success);color:var(--prava-color-on-success)}.prava-badge__indicator[data-tone=warning]{background-color:var(--prava-color-warning);color:var(--prava-color-on-warning)}.prava-badge__indicator[data-tone=danger]{background-color:var(--prava-color-danger-container);color:var(--prava-color-on-danger-container)}.prava-badge__indicator[data-tone=info]{background-color:var(--prava-color-info);color:var(--prava-color-on-info)}.prava-badge:not([data-standalone]) .prava-badge__indicator[data-tone=primary]{background-color:var(--prava-color-primary);color:var(--prava-color-on-primary)}.prava-badge:not([data-standalone]) .prava-badge__indicator[data-tone=danger]{background-color:var(--prava-color-danger);color:var(--prava-color-on-danger)}}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer prava.components{.prava-button{box-sizing:border-box;cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing,.25rem) * 2);border-radius:var(--prava-radius-control);border-style:var(--tw-border-style);text-align:center;white-space:nowrap;-webkit-user-select:none;user-select:none;max-width:100%;font:inherit;font-weight:var(--prava-font-weight-semibold);line-height:var(--prava-line-height-tight);outline:var(--prava-stroke) solid transparent;outline-offset:0;transition-property:background-color,border-color,color,box-shadow,outline-color,outline-offset,scale;transition-duration:var(--prava-duration-fast);transition-timing-function:var(--prava-ease-standard);-webkit-tap-highlight-color:transparent;border-width:1px;border-color:#0000;flex-shrink:0;text-decoration-line:none;display:inline-flex;position:relative}.prava-button:focus-visible{outline-offset:2px;outline-color:var(--prava-color-focus)}.prava-button[data-full-width]{width:100%;display:flex}.prava-button[data-variant=primary]{background-color:var(--prava-color-primary);color:var(--prava-color-on-primary);--tw-shadow:var(--prava-shadow-control-filled);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.prava-button:not(:disabled,[aria-disabled=true])[data-variant=primary]:hover{background-color:var(--prava-color-primary-hover)}}.prava-button:not(:disabled,[aria-disabled=true])[data-variant=primary]:active{background-color:var(--prava-color-primary-active)}.prava-button[data-variant=secondary]{border-color:var(--prava-color-border);background-color:var(--prava-color-surface);color:var(--prava-color-text);--tw-shadow:var(--prava-shadow-control);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.prava-button:not(:disabled,[aria-disabled=true])[data-variant=secondary]:hover{background-color:var(--prava-color-surface-hover);--tw-shadow:var(--prava-shadow-control-hover);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.prava-button[data-variant=outline]{border-color:var(--prava-color-border);color:var(--prava-color-text);background-color:#0000}.prava-button[data-variant=ghost]{color:var(--prava-color-text);background-color:#0000}@media(hover:hover){.prava-button:not(:disabled,[aria-disabled=true])[data-variant=outline]:hover,.prava-button:not(:disabled,[aria-disabled=true])[data-variant=ghost]:hover{background-color:var(--prava-color-surface-hover)}}.prava-button[data-variant=destructive]{background-color:var(--prava-color-danger);color:var(--prava-color-on-danger);--tw-shadow:var(--prava-shadow-control-filled);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.prava-button:not(:disabled,[aria-disabled=true])[data-variant=destructive]:hover{background-color:var(--prava-color-danger-hover)}}.prava-button:not(:disabled,[aria-disabled=true]):active{--tw-scale-x:98%;--tw-scale-y:98%;--tw-scale-z:98%;scale:var(--tw-scale-x) var(--tw-scale-y);--tw-shadow:var(--prava-shadow-pressed);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-timing-function:var(--prava-ease-press)}.prava-button[data-size=sm]{height:var(--prava-control-height-sm);gap:calc(var(--spacing,.25rem) * 1.5);padding-inline:calc(var(--spacing,.25rem) * 3);font-size:var(--prava-font-size-2)}.prava-button[data-size=md]{height:var(--prava-control-height-md);padding-inline:calc(var(--spacing,.25rem) * 4);font-size:var(--prava-font-size-3)}.prava-button[data-size=lg]{height:var(--prava-control-height-lg);padding-inline:calc(var(--spacing,.25rem) * 5);font-size:var(--prava-font-size-4)}.prava-button[data-type=icon]{aspect-ratio:1;padding-inline:0}.prava-button__content,.prava-button__icon{justify-content:center;align-items:center;gap:inherit;display:inline-flex}.prava-button__icon>svg{flex-shrink:0;width:1.15em;height:1.15em}.prava-button[data-loading]{cursor:progress}.prava-button[data-loading] .prava-button__content{visibility:hidden}.prava-button__loader{place-items:center;display:grid;position:absolute;inset:0}.prava-button:disabled,.prava-button[aria-disabled=true]:not([data-loading]){cursor:not-allowed;opacity:.5;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.prava-button[data-motion=none],.prava-button[data-motion=none] .prava-spinner *{transition:none;animation:none;scale:none}@media(prefers-reduced-motion:reduce){.prava-button{transition:none}.prava-button:active{scale:none}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}@layer prava.components{.prava-card{border-radius:var(--prava-radius-card);border-style:var(--tw-border-style);border-width:1px;border-color:var(--prava-color-border);background-color:var(--prava-color-surface);min-width:0;max-width:100%;color:var(--prava-color-text);box-shadow:var(--prava-shadow-control);overflow:hidden}.prava-card__header,.prava-card__content{min-width:0;padding-inline:calc(var(--spacing,.25rem) * 5);padding-block:calc(var(--spacing,.25rem) * 4)}.prava-card__header{gap:var(--spacing,.25rem);padding-bottom:0;display:grid}.prava-card__header+.prava-card__content{padding-top:calc(var(--spacing,.25rem) * 4)}.prava-card__header :is(h1,h2,h3,h4,h5,h6){font-size:var(--prava-font-size-5);--tw-font-weight:var(--prava-font-weight-semibold);font-weight:var(--prava-font-weight-semibold);line-height:var(--prava-line-height-tight);text-wrap:balance;margin:0}.prava-card__header p{font-size:var(--prava-font-size-3);color:var(--prava-color-text-muted);line-height:var(--prava-line-height-normal);margin:0}.prava-card__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing,.25rem) * 2);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--prava-color-border);background-color:var(--prava-color-canvas);min-width:0;padding-inline:calc(var(--spacing,.25rem) * 5);padding-block:calc(var(--spacing,.25rem) * 3);flex-wrap:wrap;display:flex}@media(max-width:30rem){.prava-card__header,.prava-card__content,.prava-card__footer{padding-inline:calc(var(--spacing,.25rem) * 4)}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
@@ -0,0 +1 @@
1
+ @layer prava.components{.prava-checkbox .prava-choice__indicator{border-radius:var(--prava-radius-sm)}.prava-checkbox svg{width:calc(var(--spacing,.25rem) * 3.5);height:calc(var(--spacing,.25rem) * 3.5);fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.prava-choice__check{stroke-dasharray:14;stroke-dashoffset:14px;transition:stroke-dashoffset var(--prava-duration-normal) var(--prava-ease-standard)}.prava-choice__dash{opacity:0}.prava-choice__input:checked:not(:indeterminate)+.prava-choice__indicator .prava-choice__check{stroke-dashoffset:0}.prava-choice__input:indeterminate+.prava-choice__indicator .prava-choice__dash{opacity:1}}
@@ -0,0 +1 @@
1
+ @layer prava.components{.prava-container{--prava-container-max:72rem;box-sizing:border-box;width:100%;min-width:0;max-inline-size:var(--prava-container-max);margin-inline:auto;padding-inline:clamp(1rem,4vw,2rem)}.prava-container[data-size=sm]{--prava-container-max:40rem}.prava-container[data-size=md]{--prava-container-max:56rem}.prava-container[data-size=xl]{--prava-container-max:88rem}.prava-container[data-size=fluid]{--prava-container-max:100%}}