@wellingtonhlc/shared-ui 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/components/ActionBar.d.ts +26 -0
  2. package/dist/components/ActionBar.d.ts.map +1 -0
  3. package/dist/components/ActionBar.js +29 -0
  4. package/dist/components/ActionPrimitives.d.ts +30 -0
  5. package/dist/components/ActionPrimitives.d.ts.map +1 -0
  6. package/dist/components/ActionPrimitives.js +23 -0
  7. package/dist/components/AppShell.d.ts +58 -0
  8. package/dist/components/AppShell.d.ts.map +1 -0
  9. package/dist/components/AppShell.js +45 -0
  10. package/dist/components/AppShellActions.d.ts +24 -0
  11. package/dist/components/AppShellActions.d.ts.map +1 -0
  12. package/dist/components/AppShellActions.js +15 -0
  13. package/dist/components/Badge.d.ts +9 -0
  14. package/dist/components/Badge.d.ts.map +1 -0
  15. package/dist/components/Badge.js +34 -0
  16. package/dist/components/Button.d.ts +14 -0
  17. package/dist/components/Button.d.ts.map +1 -0
  18. package/dist/components/Button.js +40 -0
  19. package/dist/components/Card.d.ts +21 -0
  20. package/dist/components/Card.d.ts.map +1 -0
  21. package/dist/components/Card.js +21 -0
  22. package/dist/components/ConfirmationDialog.d.ts +73 -0
  23. package/dist/components/ConfirmationDialog.d.ts.map +1 -0
  24. package/dist/components/ConfirmationDialog.js +216 -0
  25. package/dist/components/CopyableField.d.ts +10 -0
  26. package/dist/components/CopyableField.d.ts.map +1 -0
  27. package/dist/components/CopyableField.js +38 -0
  28. package/dist/components/DateField.d.ts +17 -0
  29. package/dist/components/DateField.d.ts.map +1 -0
  30. package/dist/components/DateField.js +127 -0
  31. package/dist/components/DecimalField.d.ts +21 -0
  32. package/dist/components/DecimalField.d.ts.map +1 -0
  33. package/dist/components/DecimalField.js +137 -0
  34. package/dist/components/EmptyState.d.ts +13 -0
  35. package/dist/components/EmptyState.d.ts.map +1 -0
  36. package/dist/components/EmptyState.js +15 -0
  37. package/dist/components/FieldControl.d.ts +17 -0
  38. package/dist/components/FieldControl.d.ts.map +1 -0
  39. package/dist/components/FieldControl.js +72 -0
  40. package/dist/components/FieldGroup.d.ts +10 -0
  41. package/dist/components/FieldGroup.d.ts.map +1 -0
  42. package/dist/components/FieldGroup.js +11 -0
  43. package/dist/components/FieldSkeleton.d.ts +14 -0
  44. package/dist/components/FieldSkeleton.d.ts.map +1 -0
  45. package/dist/components/FieldSkeleton.js +23 -0
  46. package/dist/components/FieldValidationError.d.ts +8 -0
  47. package/dist/components/FieldValidationError.d.ts.map +1 -0
  48. package/dist/components/FieldValidationError.js +7 -0
  49. package/dist/components/FormControl.d.ts +17 -0
  50. package/dist/components/FormControl.d.ts.map +1 -0
  51. package/dist/components/FormControl.js +72 -0
  52. package/dist/components/FormValidationError.d.ts +8 -0
  53. package/dist/components/FormValidationError.d.ts.map +1 -0
  54. package/dist/components/FormValidationError.js +7 -0
  55. package/dist/components/Input.d.ts +19 -0
  56. package/dist/components/Input.d.ts.map +1 -0
  57. package/dist/components/Input.js +41 -0
  58. package/dist/components/Modal.d.ts +60 -0
  59. package/dist/components/Modal.d.ts.map +1 -0
  60. package/dist/components/Modal.js +84 -0
  61. package/dist/components/MultiSelectField.d.ts +22 -0
  62. package/dist/components/MultiSelectField.d.ts.map +1 -0
  63. package/dist/components/MultiSelectField.js +84 -0
  64. package/dist/components/Page.d.ts +55 -0
  65. package/dist/components/Page.d.ts.map +1 -0
  66. package/dist/components/Page.js +81 -0
  67. package/dist/components/PageMessage.d.ts +12 -0
  68. package/dist/components/PageMessage.d.ts.map +1 -0
  69. package/dist/components/PageMessage.js +36 -0
  70. package/dist/components/Pagination.d.ts +13 -0
  71. package/dist/components/Pagination.d.ts.map +1 -0
  72. package/dist/components/Pagination.js +37 -0
  73. package/dist/components/PasswordInput.d.ts +8 -0
  74. package/dist/components/PasswordInput.d.ts.map +1 -0
  75. package/dist/components/PasswordInput.js +17 -0
  76. package/dist/components/RadioGroup.d.ts +34 -0
  77. package/dist/components/RadioGroup.d.ts.map +1 -0
  78. package/dist/components/RadioGroup.js +52 -0
  79. package/dist/components/RenderCase.d.ts +26 -0
  80. package/dist/components/RenderCase.d.ts.map +1 -0
  81. package/dist/components/RenderCase.js +32 -0
  82. package/dist/components/RenderIf.d.ts +11 -0
  83. package/dist/components/RenderIf.d.ts.map +1 -0
  84. package/dist/components/RenderIf.js +10 -0
  85. package/dist/components/SearchField.d.ts +22 -0
  86. package/dist/components/SearchField.d.ts.map +1 -0
  87. package/dist/components/SearchField.js +43 -0
  88. package/dist/components/Select.d.ts +24 -0
  89. package/dist/components/Select.d.ts.map +1 -0
  90. package/dist/components/Select.js +26 -0
  91. package/dist/components/SelectField.d.ts +22 -0
  92. package/dist/components/SelectField.d.ts.map +1 -0
  93. package/dist/components/SelectField.js +24 -0
  94. package/dist/components/Sidebar.d.ts +104 -0
  95. package/dist/components/Sidebar.d.ts.map +1 -0
  96. package/dist/components/Sidebar.js +146 -0
  97. package/dist/components/StatCard.d.ts +16 -0
  98. package/dist/components/StatCard.d.ts.map +1 -0
  99. package/dist/components/StatCard.js +62 -0
  100. package/dist/components/Switch.d.ts +20 -0
  101. package/dist/components/Switch.d.ts.map +1 -0
  102. package/dist/components/Switch.js +57 -0
  103. package/dist/components/Table.d.ts +25 -0
  104. package/dist/components/Table.d.ts.map +1 -0
  105. package/dist/components/Table.js +40 -0
  106. package/dist/components/TabsUnderlined.d.ts +21 -0
  107. package/dist/components/TabsUnderlined.d.ts.map +1 -0
  108. package/dist/components/TabsUnderlined.js +20 -0
  109. package/dist/components/TextField.d.ts +17 -0
  110. package/dist/components/TextField.d.ts.map +1 -0
  111. package/dist/components/TextField.js +43 -0
  112. package/dist/components/Textarea.d.ts +8 -0
  113. package/dist/components/Textarea.d.ts.map +1 -0
  114. package/dist/components/Textarea.js +12 -0
  115. package/dist/components/TextareaField.d.ts +12 -0
  116. package/dist/components/TextareaField.d.ts.map +1 -0
  117. package/dist/components/TextareaField.js +26 -0
  118. package/dist/components/ThemePreferencesSelector.d.ts +24 -0
  119. package/dist/components/ThemePreferencesSelector.d.ts.map +1 -0
  120. package/dist/components/ThemePreferencesSelector.js +34 -0
  121. package/dist/components/Tooltip.d.ts +12 -0
  122. package/dist/components/Tooltip.d.ts.map +1 -0
  123. package/dist/components/Tooltip.js +6 -0
  124. package/dist/components/form-control-helpers.d.ts +23 -0
  125. package/dist/components/form-control-helpers.d.ts.map +1 -0
  126. package/dist/components/form-control-helpers.js +18 -0
  127. package/dist/index.d.ts +38 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +37 -0
  130. package/dist/styles.css +3615 -0
  131. package/dist/tailwind-preset.d.ts +23 -0
  132. package/dist/tailwind-preset.d.ts.map +1 -0
  133. package/dist/tailwind-preset.js +22 -0
  134. package/dist/utils/cn.d.ts +2 -0
  135. package/dist/utils/cn.d.ts.map +1 -0
  136. package/dist/utils/cn.js +3 -0
  137. package/package.json +63 -0
@@ -0,0 +1,216 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useId, useMemo, useRef, useState, } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ import { AlertTriangleIcon, HelpCircleIcon, InfoIcon, XIcon } from 'lucide-react';
5
+ import { cn } from '../utils/cn';
6
+ import { Button as BaseButton } from './Button';
7
+ const ConfirmationDialogContext = createContext(null);
8
+ const dialogVariantStyles = {
9
+ default: {
10
+ icon: InfoIcon,
11
+ iconClassName: 'text-brand',
12
+ titleClassName: 'text-foreground',
13
+ },
14
+ question: {
15
+ icon: HelpCircleIcon,
16
+ iconClassName: 'text-foreground-muted',
17
+ titleClassName: 'text-foreground',
18
+ },
19
+ destructive: {
20
+ icon: AlertTriangleIcon,
21
+ iconClassName: 'text-destructive',
22
+ titleClassName: 'text-foreground',
23
+ },
24
+ };
25
+ const buttonVariantDefaults = {
26
+ cancel: { label: 'Cancelar', buttonVariant: 'outline' },
27
+ confirm: { label: 'Confirmar', buttonVariant: 'default' },
28
+ danger: { label: 'Não', buttonVariant: 'outline' },
29
+ success: { label: 'Sim', buttonVariant: 'default' },
30
+ };
31
+ function useConfirmationDialog() {
32
+ const context = useContext(ConfirmationDialogContext);
33
+ if (!context) {
34
+ throw new Error('ConfirmationDialog components must be used inside ConfirmationDialog.Root.');
35
+ }
36
+ return context;
37
+ }
38
+ function Root({ children, className, closeOnEscape = true, onOpenChange, open, overlayClassName, variant = 'default', }) {
39
+ const titleId = useId();
40
+ const descriptionId = useId();
41
+ const [submittingId, setSubmittingId] = useState(null);
42
+ const [focusedId, setFocusedId] = useState(null);
43
+ const buttonRefs = useRef({});
44
+ const buttonOrder = useRef([]);
45
+ const isBusy = submittingId !== null;
46
+ function close() {
47
+ if (!isBusy) {
48
+ onOpenChange(false);
49
+ }
50
+ }
51
+ function registerButton(id, element) {
52
+ buttonRefs.current[id] = element;
53
+ if (element && !buttonOrder.current.includes(id)) {
54
+ buttonOrder.current.push(id);
55
+ }
56
+ if (!element) {
57
+ buttonOrder.current = buttonOrder.current.filter((buttonId) => buttonId !== id);
58
+ delete buttonRefs.current[id];
59
+ }
60
+ }
61
+ function focusButton(direction) {
62
+ const availableButtons = buttonOrder.current
63
+ .map((id) => buttonRefs.current[id])
64
+ .filter((button) => !!button && !button.disabled);
65
+ if (!availableButtons.length)
66
+ return;
67
+ const currentIndex = availableButtons.findIndex((button) => button === document.activeElement);
68
+ const nextIndex = currentIndex === -1
69
+ ? 0
70
+ : (currentIndex + direction + availableButtons.length) % availableButtons.length;
71
+ availableButtons[nextIndex]?.focus();
72
+ }
73
+ async function runAction(id, action, submit = false, closeOnSuccess = true) {
74
+ if (isBusy)
75
+ return;
76
+ if (submit) {
77
+ setSubmittingId(id);
78
+ }
79
+ try {
80
+ await action?.();
81
+ if (closeOnSuccess) {
82
+ onOpenChange(false);
83
+ }
84
+ }
85
+ finally {
86
+ if (submit) {
87
+ setSubmittingId(null);
88
+ }
89
+ }
90
+ }
91
+ useEffect(() => {
92
+ if (!open)
93
+ return;
94
+ function handleKeyDown(event) {
95
+ if (event.key === 'Escape' && closeOnEscape && !isBusy) {
96
+ event.preventDefault();
97
+ onOpenChange(false);
98
+ }
99
+ if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
100
+ event.preventDefault();
101
+ focusButton(1);
102
+ }
103
+ if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
104
+ event.preventDefault();
105
+ focusButton(-1);
106
+ }
107
+ }
108
+ window.addEventListener('keydown', handleKeyDown);
109
+ return () => window.removeEventListener('keydown', handleKeyDown);
110
+ }, [closeOnEscape, isBusy, onOpenChange, open]);
111
+ useEffect(() => {
112
+ if (!open)
113
+ return;
114
+ const timeoutId = window.setTimeout(() => {
115
+ const firstButton = buttonOrder.current
116
+ .map((id) => buttonRefs.current[id])
117
+ .find((button) => !!button && !button.disabled);
118
+ firstButton?.focus();
119
+ }, 0);
120
+ return () => window.clearTimeout(timeoutId);
121
+ }, [open]);
122
+ const value = useMemo(() => ({
123
+ close,
124
+ descriptionId,
125
+ focusButton,
126
+ focusedId,
127
+ isBusy,
128
+ registerButton,
129
+ runAction,
130
+ setFocusedId,
131
+ submittingId,
132
+ titleId,
133
+ variant,
134
+ }), [descriptionId, focusedId, isBusy, submittingId, titleId, variant]);
135
+ if (!open) {
136
+ return null;
137
+ }
138
+ return createPortal(_jsx(ConfirmationDialogContext.Provider, { value: value, children: _jsx("div", { className: cn('fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4 backdrop-blur-[2px]', overlayClassName), role: "presentation", children: _jsxs("section", { "aria-describedby": descriptionId, "aria-labelledby": titleId, "aria-modal": "true", className: cn('border-app-border bg-background-secondary text-foreground relative grid gap-4 rounded-xl border p-6 shadow-2xl', className), role: "alertdialog", style: { width: 'min(29rem, calc(100vw - 2rem))' }, children: [_jsx("button", { "aria-label": "Fechar", className: cn('text-foreground-muted hover:bg-background hover:text-foreground absolute right-4 top-4 inline-flex size-7 cursor-pointer items-center justify-center rounded-md opacity-60 transition disabled:cursor-not-allowed disabled:opacity-30'), disabled: isBusy, onClick: close, type: "button", children: _jsx(XIcon, { className: "size-3.5" }) }), children] }) }) }), document.body);
139
+ }
140
+ function Icon({ className }) {
141
+ const { variant } = useConfirmationDialog();
142
+ const variantStyle = dialogVariantStyles[variant];
143
+ const DialogIcon = variantStyle.icon;
144
+ return _jsx(DialogIcon, { className: cn('size-4 shrink-0', variantStyle.iconClassName, className) });
145
+ }
146
+ function Title({ children, className }) {
147
+ const { titleId, variant } = useConfirmationDialog();
148
+ const variantStyle = dialogVariantStyles[variant];
149
+ return (_jsxs("h2", { className: cn('flex items-center gap-2 text-base font-semibold leading-tight', variantStyle.titleClassName, className), id: titleId, children: [_jsx(Icon, {}), _jsx("span", { children: children })] }));
150
+ }
151
+ function Description({ children, className }) {
152
+ const { descriptionId } = useConfirmationDialog();
153
+ return (_jsx("p", { className: cn('text-foreground-muted min-h-[2.5rem] min-w-[18rem] text-sm leading-relaxed', className), id: descriptionId, children: children }));
154
+ }
155
+ function Body({ children, className }) {
156
+ return _jsx("div", { className: cn('text-foreground-muted text-sm', className), children: children });
157
+ }
158
+ function Footer({ children, className }) {
159
+ return (_jsx("footer", { className: cn('border-app-border mt-2 flex justify-end gap-2 border-t pt-4', className), children: children }));
160
+ }
161
+ function Button({ children, closeOnSuccess = true, disabled, label, minWidth = 100, onClick, size = 'sm', submit = false, variant = 'confirm', ...props }) {
162
+ const id = useId();
163
+ const { focusedId, isBusy, registerButton, runAction, setFocusedId, submittingId } = useConfirmationDialog();
164
+ const defaults = buttonVariantDefaults[variant];
165
+ const { buttonVariant, className, onBlur, onFocus, style, ...buttonProps } = props;
166
+ const isSubmitting = submittingId === id;
167
+ const isFocused = focusedId === id;
168
+ function handleClick() {
169
+ void runAction(id, onClick, submit, closeOnSuccess);
170
+ }
171
+ function handleFocus(event) {
172
+ setFocusedId(id);
173
+ onFocus?.(event);
174
+ }
175
+ function handleBlur(event) {
176
+ setFocusedId(null);
177
+ onBlur?.(event);
178
+ }
179
+ return (_jsx(BaseButton, { ...buttonProps, ref: (element) => registerButton(id, element), disabled: disabled || (isBusy && !isSubmitting), isSubmitting: isSubmitting, minWidth: minWidth, onBlur: handleBlur, onClick: handleClick, onFocus: handleFocus, size: size, variant: buttonVariant ?? defaults.buttonVariant, className: cn('h-9 min-h-9 rounded-md px-3 py-0 text-sm leading-none', 'focus:outline-none focus-visible:outline-none', className), style: {
180
+ ...style,
181
+ ...(isFocused
182
+ ? {
183
+ boxShadow: '0 0 0 2px var(--background-secondary), 0 0 0 4px rgba(245, 158, 11, 0.62)',
184
+ }
185
+ : {}),
186
+ }, children: children ?? label ?? defaults.label }));
187
+ }
188
+ function ConfirmationDialogSimple({ actions, cancelLabel = 'Não', children, className, confirmLabel = 'Sim', description, onClose, onConfirm, open, title = 'Tem certeza?', variant = 'default', }) {
189
+ function handleOpenChange(nextOpen) {
190
+ if (!nextOpen) {
191
+ onClose();
192
+ }
193
+ }
194
+ function handleConfirm() {
195
+ return onConfirm?.();
196
+ }
197
+ const resolvedActions = actions?.length
198
+ ? actions.map((action, index) => {
199
+ const { children: actionChildren, label: actionLabel, onSelect, variant: actionVariant, ...actionProps } = action;
200
+ return (_jsx(Button, { ...actionProps, buttonVariant: actionVariant, closeOnSuccess: true, label: actionLabel, onClick: onSelect, submit: index === actions.length - 1, variant: index === actions.length - 1 ? 'success' : 'cancel', children: actionChildren }, index));
201
+ })
202
+ : [
203
+ _jsx(Button, { label: cancelLabel, onClick: onClose, variant: "danger" }, "cancel"),
204
+ _jsx(Button, { label: confirmLabel, onClick: handleConfirm, submit: true, variant: "success" }, "confirm"),
205
+ ];
206
+ return (_jsxs(Root, { className: className, onOpenChange: handleOpenChange, open: open, variant: variant, children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Title, { children: title }), description ? _jsx(Description, { children: description }) : null] }), children ? _jsx(Body, { children: children }) : null, _jsx(Footer, { children: resolvedActions })] }));
207
+ }
208
+ export const ConfirmationDialog = Object.assign(ConfirmationDialogSimple, {
209
+ Root,
210
+ Icon,
211
+ Title,
212
+ Description,
213
+ Body,
214
+ Footer,
215
+ Button,
216
+ });
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface CopyableFieldProps extends React.HTMLAttributes<HTMLElement> {
3
+ value?: string | number | null;
4
+ children: React.ReactNode;
5
+ asChild?: boolean;
6
+ successMessage?: string;
7
+ errorMessage?: string;
8
+ }
9
+ export declare const CopyableField: React.ForwardRefExoticComponent<CopyableFieldProps & React.RefAttributes<HTMLElement>>;
10
+ //# sourceMappingURL=CopyableField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyableField.d.ts","sourceRoot":"","sources":["../../src/components/CopyableField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,WAAW,kBAAmB,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,wFAiExB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Slot } from '@radix-ui/react-slot';
4
+ import { toast } from 'sonner';
5
+ import { cn } from '../utils/cn';
6
+ export const CopyableField = React.forwardRef(function CopyableField({ asChild = false, children, className, errorMessage = 'Nao foi possivel copiar o valor.', onClick, onKeyDown, successMessage = 'Valor copiado.', title = 'Clique para copiar', value, ...props }, ref) {
7
+ const Component = asChild ? Slot : 'span';
8
+ const copyValue = value === null || value === undefined ? '' : String(value);
9
+ const canCopy = copyValue.trim().length > 0;
10
+ async function copy() {
11
+ if (!canCopy)
12
+ return;
13
+ try {
14
+ await navigator.clipboard.writeText(copyValue);
15
+ toast.success(successMessage);
16
+ }
17
+ catch {
18
+ toast.error(errorMessage);
19
+ }
20
+ }
21
+ function handleClick(event) {
22
+ onClick?.(event);
23
+ if (event.defaultPrevented)
24
+ return;
25
+ void copy();
26
+ }
27
+ function handleKeyDown(event) {
28
+ onKeyDown?.(event);
29
+ if (event.defaultPrevented)
30
+ return;
31
+ if (event.key === 'Enter' || event.key === ' ') {
32
+ event.preventDefault();
33
+ void copy();
34
+ }
35
+ }
36
+ return (_jsx(Component, { ref: ref, role: canCopy ? 'button' : undefined, tabIndex: canCopy ? 0 : -1, title: canCopy ? title : undefined, "aria-disabled": !canCopy, className: cn(canCopy &&
37
+ 'hover:border-brand/60 hover:bg-brand/10 focus-visible:border-brand/60 focus-visible:ring-brand/40 cursor-pointer rounded-md border border-transparent transition-colors focus-visible:ring-2 focus-visible:outline-none', className), onClick: handleClick, onKeyDown: handleKeyDown, ...props, children: children }));
38
+ });
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export interface DateFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'value' | 'onChange'> {
3
+ label?: string;
4
+ value?: string | Date | null;
5
+ onChange?: ((value: string) => void) | React.ChangeEventHandler<HTMLInputElement>;
6
+ inputRef?: React.Ref<HTMLInputElement>;
7
+ errorMessage?: string;
8
+ wrapperClassName?: string;
9
+ labelClassName?: string;
10
+ size?: 'sm' | 'md' | 'lg';
11
+ roundedFull?: boolean;
12
+ enableTime?: boolean;
13
+ timeIntervals?: number;
14
+ noPortal?: boolean;
15
+ }
16
+ export declare const DateField: React.ForwardRefExoticComponent<DateFieldProps & React.RefAttributes<HTMLInputElement>>;
17
+ //# sourceMappingURL=DateField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateField.d.ts","sourceRoot":"","sources":["../../src/components/DateField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAiE1B,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC/H,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAClF,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,yFAwIrB,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import DatePicker, { registerLocale } from 'react-datepicker';
4
+ import { Calendar, CalendarClock } from 'lucide-react';
5
+ import { ptBR } from 'date-fns/locale';
6
+ import { cn } from '../utils/cn';
7
+ import { controlClasses } from './form-control-helpers';
8
+ import { FieldControl } from './FieldControl';
9
+ registerLocale('pt-BR', ptBR);
10
+ function toDateOnlyString(value) {
11
+ if (value === undefined)
12
+ return undefined;
13
+ if (value === null || value === '')
14
+ return '';
15
+ if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value))
16
+ return value;
17
+ const date = value instanceof Date ? value : new Date(value);
18
+ if (Number.isNaN(date.getTime()))
19
+ return '';
20
+ const year = date.getFullYear();
21
+ const month = String(date.getMonth() + 1).padStart(2, '0');
22
+ const day = String(date.getDate()).padStart(2, '0');
23
+ return `${year}-${month}-${day}`;
24
+ }
25
+ function toDateTimeString(value) {
26
+ if (value === undefined)
27
+ return undefined;
28
+ if (value === null || value === '')
29
+ return '';
30
+ const date = value instanceof Date ? value : new Date(value);
31
+ if (Number.isNaN(date.getTime()))
32
+ return '';
33
+ const pad = (n) => String(n).padStart(2, '0');
34
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;
35
+ }
36
+ function toDateOnlyObject(value) {
37
+ const str = toDateOnlyString(value);
38
+ if (!str)
39
+ return null;
40
+ const [year, month, day] = str.split('-').map(Number);
41
+ const d = new Date(year, month - 1, day);
42
+ return Number.isNaN(d.getTime()) ? null : d;
43
+ }
44
+ function toDateTimeObject(value) {
45
+ if (!value)
46
+ return null;
47
+ const date = value instanceof Date ? value : new Date(value);
48
+ return Number.isNaN(date.getTime()) ? null : date;
49
+ }
50
+ function toOptionalDate(value) {
51
+ if (typeof value !== 'string' || !value)
52
+ return undefined;
53
+ return toDateOnlyObject(value) ?? undefined;
54
+ }
55
+ function assignRef(ref, value) {
56
+ if (!ref)
57
+ return;
58
+ if (typeof ref === 'function') {
59
+ ref(value);
60
+ return;
61
+ }
62
+ ref.current = value;
63
+ }
64
+ export const DateField = React.forwardRef(({ label, onChange, onBlur, inputRef, disabled, errorMessage, id, className, wrapperClassName, labelClassName, size = 'sm', roundedFull = false, noPortal = false, enableTime = false, timeIntervals = 5, value, name, placeholder, min, max, autoComplete = 'off', autoFocus, }, ref) => {
65
+ const sizeMap = {
66
+ sm: 'h-9 text-sm px-3 rounded-md',
67
+ md: 'h-12 text-sm px-4 rounded-md',
68
+ lg: 'h-14 text-base px-6 rounded-lg',
69
+ };
70
+ const sizeClass = sizeMap[size ?? 'sm'];
71
+ const hiddenInputRef = React.useRef(null);
72
+ const toInputValue = enableTime ? toDateTimeString : toDateOnlyString;
73
+ const toDateObj = enableTime ? toDateTimeObject : toDateOnlyObject;
74
+ const normalizedValue = toInputValue(value);
75
+ const [selectedDate, setSelectedDate] = React.useState(() => toDateObj(value));
76
+ React.useEffect(() => {
77
+ if (value !== undefined)
78
+ setSelectedDate(toDateObj(value));
79
+ }, [value, enableTime]);
80
+ React.useEffect(() => {
81
+ if (hiddenInputRef.current && normalizedValue !== undefined) {
82
+ hiddenInputRef.current.value = normalizedValue;
83
+ }
84
+ }, [normalizedValue]);
85
+ const emitChange = (nextValue) => {
86
+ if (hiddenInputRef.current)
87
+ hiddenInputRef.current.value = nextValue;
88
+ if (!onChange)
89
+ return;
90
+ const syntheticEvent = {
91
+ target: { name, value: nextValue },
92
+ currentTarget: { name, value: nextValue },
93
+ type: 'change',
94
+ };
95
+ if (onChange.length === 1 && onChange.toString().includes('event')) {
96
+ onChange(syntheticEvent);
97
+ return;
98
+ }
99
+ onChange(nextValue);
100
+ };
101
+ const handleDateChange = (nextDate) => {
102
+ const resolved = Array.isArray(nextDate) ? (nextDate[0] ?? null) : nextDate;
103
+ setSelectedDate(resolved);
104
+ emitChange(toInputValue(resolved) ?? '');
105
+ };
106
+ return (_jsx(FieldControl, { label: label, id: id || name, wrapperClassName: wrapperClassName, labelClassName: labelClassName, errorMessage: errorMessage, roundedFull: roundedFull, size: size, disabled: disabled, children: ({ controlId, describedBy, errorMessage: controlError, disabled: controlDisabled }) => (_jsxs("div", { className: "relative", children: [_jsx("input", { type: "hidden", ref: (node) => {
107
+ hiddenInputRef.current = node;
108
+ assignRef(ref, node);
109
+ assignRef(inputRef, node);
110
+ }, name: name, disabled: controlDisabled, defaultValue: normalizedValue }), _jsx(DatePicker, { id: controlId, selected: selectedDate, onChange: handleDateChange, ...(!noPortal && { portalId: 'datepicker-portal' }), onBlur: (event) => {
111
+ if (!onBlur || !hiddenInputRef.current)
112
+ return;
113
+ const syntheticEvent = {
114
+ ...event,
115
+ target: hiddenInputRef.current,
116
+ currentTarget: hiddenInputRef.current,
117
+ };
118
+ onBlur(syntheticEvent);
119
+ }, ...(enableTime
120
+ ? { showTimeSelect: true, timeIntervals, dateFormat: 'dd/MM/yyyy HH:mm', timeFormat: 'HH:mm', timeCaption: 'Hora' }
121
+ : { dateFormat: 'dd/MM/yyyy', minDate: toOptionalDate(min), maxDate: toOptionalDate(max) }), locale: "pt-BR", placeholderText: placeholder ?? label, disabled: controlDisabled, showPopperArrow: false, popperClassName: "app-datepicker-popper", calendarClassName: "app-datepicker", wrapperClassName: "w-full", formatWeekDay: (day) => day.slice(0, 3), ariaDescribedBy: describedBy, ariaInvalid: controlError ? 'true' : undefined, autoComplete: autoComplete, autoFocus: autoFocus, className: controlClasses({
122
+ errorMessage: controlError,
123
+ disabled: controlDisabled,
124
+ extra: cn(className, 'w-full cursor-pointer pr-10', sizeClass),
125
+ }) }), _jsx("div", { className: "pointer-events-none absolute top-1/2 right-3 flex -translate-y-1/2 items-center justify-center", children: enableTime ? _jsx(CalendarClock, { className: "text-foreground-muted h-4 w-4" }) : _jsx(Calendar, { className: "text-foreground-muted h-4 w-4" }) })] })) }));
126
+ });
127
+ DateField.displayName = 'DateField';
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { type FieldValues } from 'react-hook-form';
3
+ export interface DecimalFieldProps<TFieldValues extends FieldValues = FieldValues> extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'value' | 'onChange'> {
4
+ value?: number | null;
5
+ onChange?: ((value: number) => void) | React.ChangeEventHandler<HTMLInputElement>;
6
+ decimals?: number;
7
+ currency?: string | null;
8
+ locale?: string;
9
+ control?: unknown;
10
+ rules?: unknown;
11
+ label?: string;
12
+ errorMessage?: string;
13
+ wrapperClassName?: string;
14
+ labelClassName?: string;
15
+ roundedFull?: boolean;
16
+ size?: 'xs' | 'sm' | 'md' | 'lg';
17
+ labelPosition?: 'top' | 'right' | 'bottom' | 'left';
18
+ variant?: 'default' | 'neutral';
19
+ }
20
+ export declare const DecimalField: <TFieldValues extends FieldValues = FieldValues>(props: DecimalFieldProps<TFieldValues> & React.RefAttributes<HTMLInputElement>) => React.ReactElement;
21
+ //# sourceMappingURL=DecimalField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecimalField.d.ts","sourceRoot":"","sources":["../../src/components/DecimalField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW,CAC/E,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACxF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC;AA+PD,eAAO,MAAM,YAAY,EAQnB,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW,EACnD,KAAK,EAAE,iBAAiB,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAC3E,KAAK,CAAC,YAAY,CAAC"}
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useRef, useState } from 'react';
3
+ import { useController, } from 'react-hook-form';
4
+ import { cn } from '../utils/cn';
5
+ import { controlClasses } from './form-control-helpers';
6
+ import { FieldControl } from './FieldControl';
7
+ function assignInputRef(forwardedRef, inputRef, node) {
8
+ if (typeof inputRef === 'function')
9
+ inputRef(node);
10
+ else if (inputRef)
11
+ inputRef.current = node;
12
+ if (typeof forwardedRef === 'function') {
13
+ forwardedRef(node);
14
+ return;
15
+ }
16
+ if (forwardedRef)
17
+ forwardedRef.current = node;
18
+ }
19
+ const DecimalFieldBase = React.forwardRef(function DecimalFieldBase({ value, onChange, decimals = 2, currency = null, className = '', placeholder = '', id, label, errorMessage, wrapperClassName = '', labelClassName = '', labelPosition = 'top', disabled = false, locale = 'pt-BR', roundedFull = false, size = 'sm', name, onBlur, onKeyDown, inputName, inputValue, inputDisabled, inputOnBlur, inputRef, onValueChange, variant, ...props }, ref) {
20
+ const [digits, setDigits] = useState('');
21
+ const previousValueRef = useRef(undefined);
22
+ const resolvedValue = inputValue ?? value;
23
+ const resolvedName = inputName ?? name;
24
+ const resolvedDisabled = inputDisabled ?? disabled;
25
+ useEffect(() => {
26
+ if (previousValueRef.current === resolvedValue)
27
+ return;
28
+ if (resolvedValue === null || resolvedValue === undefined || Number(resolvedValue) === 0) {
29
+ setDigits('');
30
+ }
31
+ else {
32
+ const factor = Math.pow(10, decimals);
33
+ const integerValue = Math.round(Number(resolvedValue) * factor);
34
+ setDigits(String(integerValue));
35
+ }
36
+ previousValueRef.current = resolvedValue;
37
+ }, [resolvedValue, decimals]);
38
+ function notify(nextDigits, event) {
39
+ setDigits(nextDigits);
40
+ const factor = Math.pow(10, decimals);
41
+ const nextValue = nextDigits === '' ? 0 : Number(nextDigits) / factor;
42
+ previousValueRef.current = nextValue;
43
+ if (onValueChange) {
44
+ onValueChange(nextValue, event);
45
+ return;
46
+ }
47
+ if (!onChange)
48
+ return;
49
+ if (event && onChange.length === 1 && event.nativeEvent) {
50
+ onChange(event);
51
+ return;
52
+ }
53
+ onChange(nextValue);
54
+ }
55
+ function formatDisplay(valueToFormat) {
56
+ if (valueToFormat === '')
57
+ return '';
58
+ const factor = Math.pow(10, decimals);
59
+ const numericValue = Number(valueToFormat) / factor;
60
+ return numericValue.toLocaleString(locale, {
61
+ minimumFractionDigits: decimals,
62
+ maximumFractionDigits: decimals,
63
+ });
64
+ }
65
+ function handleKeyDown(event) {
66
+ if (resolvedDisabled)
67
+ return;
68
+ const { key } = event;
69
+ if (key === 'Backspace' ||
70
+ key === 'Delete' ||
71
+ key === 'ArrowLeft' ||
72
+ key === 'ArrowRight' ||
73
+ key === 'Tab' ||
74
+ key === 'Enter') {
75
+ if (key === 'Backspace' || key === 'Delete') {
76
+ event.preventDefault();
77
+ notify(digits.slice(0, -1), undefined);
78
+ }
79
+ if (key === 'Enter')
80
+ onKeyDown?.(event);
81
+ return;
82
+ }
83
+ if (/^[0-9]$/.test(key)) {
84
+ event.preventDefault();
85
+ notify(digits + key, undefined);
86
+ return;
87
+ }
88
+ event.preventDefault();
89
+ }
90
+ function handlePaste(event) {
91
+ if (resolvedDisabled)
92
+ return;
93
+ event.preventDefault();
94
+ const pasted = event.clipboardData.getData('text').replace(/\D/g, '');
95
+ if (!pasted)
96
+ return;
97
+ notify(digits + pasted, undefined);
98
+ }
99
+ function handleBlur(event) {
100
+ inputOnBlur?.(event);
101
+ onBlur?.(event);
102
+ }
103
+ function handleChange(event) {
104
+ notify(event.target.value.replace(/\D/g, ''), event);
105
+ }
106
+ const sizeMap = {
107
+ xs: 'h-7 text-xs px-2 rounded-md',
108
+ sm: 'h-9 text-sm px-3 rounded-md',
109
+ md: 'h-12 text-sm px-4 rounded-md',
110
+ lg: 'h-14 text-base px-6 rounded-lg',
111
+ };
112
+ return (_jsx(FieldControl, { label: label, id: id || resolvedName, labelClassName: labelClassName, labelPosition: labelPosition, wrapperClassName: wrapperClassName, errorMessage: errorMessage, roundedFull: roundedFull, size: size, disabled: resolvedDisabled, children: ({ controlId, describedBy, errorMessage: controlError, disabled: controlDisabled }) => (_jsxs("div", { className: "relative", children: [currency ? (_jsx("span", { className: "text-foreground-muted absolute top-1/2 left-3 -translate-y-1/2 text-sm", children: currency })) : null, _jsx("input", { ref: (node) => assignInputRef(ref, inputRef, node), inputMode: "numeric", ...props, id: controlId, name: resolvedName, disabled: controlDisabled, placeholder: placeholder ||
113
+ (0).toLocaleString(locale, {
114
+ minimumFractionDigits: decimals,
115
+ maximumFractionDigits: decimals,
116
+ }), value: formatDisplay(digits), onKeyDown: handleKeyDown, onPaste: handlePaste, onBlur: handleBlur, onChange: handleChange, "aria-label": props['aria-label'] ?? placeholder ?? label ?? 'campo numérico', "aria-invalid": !!controlError, "aria-describedby": describedBy, className: controlClasses({
117
+ errorMessage: controlError,
118
+ disabled: controlDisabled,
119
+ variant,
120
+ extra: cn(className, 'field-decimal text-right', currency ? 'pr-4 pl-12' : 'px-4', sizeMap[size ?? 'sm']),
121
+ }) })] })) }));
122
+ });
123
+ function HookFormDecimalField(props) {
124
+ const { control, rules, name, forwardedRef, variant, ...rest } = props;
125
+ const { field } = useController({
126
+ control: control,
127
+ name: name,
128
+ rules: rules,
129
+ });
130
+ return (_jsx(DecimalFieldBase, { ...rest, ref: forwardedRef, name: name, variant: variant, inputName: field.name, inputValue: Number(field.value ?? 0), inputDisabled: field.disabled, inputRef: field.ref, inputOnBlur: field.onBlur, onValueChange: field.onChange }));
131
+ }
132
+ export const DecimalField = React.forwardRef(function DecimalField(props, ref) {
133
+ if (props.control && props.name) {
134
+ return _jsx(HookFormDecimalField, { ...props, forwardedRef: ref });
135
+ }
136
+ return _jsx(DecimalFieldBase, { ...props, ref: ref });
137
+ });
@@ -0,0 +1,13 @@
1
+ import { type ReactNode } from 'react';
2
+ export type EmptyStateVariant = 'default' | 'compact';
3
+ export interface EmptyStateProps {
4
+ title?: string;
5
+ description?: string;
6
+ icon?: ReactNode;
7
+ showIcon?: boolean;
8
+ variant?: EmptyStateVariant;
9
+ className?: string;
10
+ children?: ReactNode;
11
+ }
12
+ export declare function EmptyState({ title, description, icon, showIcon, variant, className, children, }: EmptyStateProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAwB,EACxB,WAAW,EACX,IAA2B,EAC3B,QAAe,EACf,OAAmB,EACnB,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,+BA4BjB"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cloneElement, isValidElement } from 'react';
3
+ import { cn } from '../utils/cn';
4
+ export function EmptyState({ title = 'Nada por aqui.', description, icon = _jsx(DefaultEmptyIcon, {}), showIcon = true, variant = 'default', className, children, }) {
5
+ const isCompact = variant === 'compact';
6
+ const styledIcon = isValidElement(icon)
7
+ ? cloneElement(icon, {
8
+ className: cn('h-10 w-10 text-foreground-muted', icon.props.className),
9
+ })
10
+ : icon;
11
+ return (_jsx("div", { className: cn('m-2 flex min-h-0 flex-1 items-center justify-center rounded-[1.5rem] border border-dashed rounded rounded-md bg-surface text-center text-foreground-muted', isCompact ? 'px-4 py-6' : 'px-5 py-10', className), children: _jsxs("div", { className: cn('mx-auto grid justify-items-center', isCompact ? 'max-w-xs gap-1.5' : 'max-w-sm gap-2'), children: [showIcon && styledIcon ? (_jsx("div", { className: "text-foreground-muted mb-1 flex h-11 w-11 items-center justify-center", children: styledIcon })) : null, _jsx("strong", { className: "text-foreground text-sm font-semibold", children: title }), description ? _jsx("p", { className: "text-foreground-muted text-xs leading-5", children: description }) : null, children ? _jsx("div", { className: cn('mt-2 flex flex-wrap items-center justify-center gap-2', isCompact ? 'text-xs' : 'text-sm'), children: children }) : null] }) }));
12
+ }
13
+ function DefaultEmptyIcon() {
14
+ return (_jsx("svg", { "aria-hidden": "true", className: "h-10 w-10", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: "1.8", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 8.75 6.2 5.4A2 2 0 0 1 7.82 4.6h8.36a2 2 0 0 1 1.62.8l2.45 3.35M3.75 8.75v6.9A3.75 3.75 0 0 0 7.5 19.4h9a3.75 3.75 0 0 0 3.75-3.75v-6.9M3.75 8.75h4.92a1.5 1.5 0 0 1 1.34.83l.28.56a1.5 1.5 0 0 0 1.34.83h.74a1.5 1.5 0 0 0 1.34-.83l.28-.56a1.5 1.5 0 0 1 1.34-.83h4.92" }) }));
15
+ }
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { type FormControlRenderProps, type FormControlSize } from './form-control-helpers';
3
+ export interface FieldControlProps {
4
+ label?: string;
5
+ id?: string;
6
+ labelClassName?: string;
7
+ wrapperClassName?: string;
8
+ errorMessage?: string | undefined;
9
+ hasValidation?: boolean;
10
+ roundedFull?: boolean;
11
+ size?: FormControlSize;
12
+ labelPosition?: 'top' | 'right' | 'bottom' | 'left';
13
+ disabled?: boolean;
14
+ children?: React.ReactNode | ((props: FormControlRenderProps) => React.ReactNode);
15
+ }
16
+ export declare const FieldControl: React.FC<FieldControlProps>;
17
+ //# sourceMappingURL=FieldControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldControl.d.ts","sourceRoot":"","sources":["../../src/components/FieldControl.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,aAAa,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;CACnF;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAmHpD,CAAC"}