@wellingtonhlc/shared-ui 0.25.6 → 0.25.8

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.
package/README.md CHANGED
@@ -205,6 +205,40 @@ para declarar o formato esperado pelo campo:
205
205
 
206
206
  `enableTime` permanece suportado como alias legado para `mode="dateTime"`.
207
207
 
208
+ ## FieldGroup
209
+
210
+ `FieldGroup` renderiza um grupo visual de campos com legenda. A borda vem ativa por
211
+ padrao; use `bordered={false}` quando o consumidor precisar manter a semantica de
212
+ grupo sem adicionar contorno visual.
213
+
214
+ ```tsx
215
+ import { FieldGroup, TextField } from '@wellingtonhlc/shared-ui';
216
+
217
+ <FieldGroup title="Endereco" bordered={false}>
218
+ <TextField label="CEP" />
219
+ <TextField label="Cidade" />
220
+ </FieldGroup>;
221
+ ```
222
+
223
+ ## RadioGroup
224
+
225
+ `RadioGroup` segue a mesma escala de altura dos campos base (`xs`, `sm`, `md`,
226
+ `lg`) para alinhar visualmente com `TextField`, `SelectField` e demais controles
227
+ na mesma linha de formulario.
228
+
229
+ O padrao `boxed` renderiza um `fieldset` com legenda, fazendo a borda contornar
230
+ o grupo a partir da label. Use `variant="plain"` quando precisar do grupo sem
231
+ borda.
232
+
233
+ ```tsx
234
+ import { RadioGroup } from '@wellingtonhlc/shared-ui';
235
+
236
+ <RadioGroup label="Tipo Pessoa" value={1} onChange={setType}>
237
+ <RadioGroup.Item value={1} label="Fisica" />
238
+ <RadioGroup.Item value={2} label="Juridica" />
239
+ </RadioGroup>;
240
+ ```
241
+
208
242
  ## AppShell.Topbar.Button
209
243
 
210
244
  Use `AppShell.Topbar.Button` para acoes de icone na barra superior, como notificacoes,
@@ -6,10 +6,10 @@ const variantClasses = {
6
6
  secondary: 'border-[color-mix(in_srgb,var(--brand)_34%,var(--app-border))] bg-[color-mix(in_srgb,var(--brand)_12%,var(--surface))] text-[color-mix(in_srgb,var(--brand)_88%,var(--foreground))] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--brand)_8%,transparent)] hover:border-[color-mix(in_srgb,var(--brand)_48%,var(--app-border))] hover:bg-[color-mix(in_srgb,var(--brand)_18%,var(--surface))] dark:border-[color-mix(in_srgb,var(--brand)_42%,var(--app-border))] dark:bg-[color-mix(in_srgb,var(--brand)_18%,var(--surface))] dark:text-[color-mix(in_srgb,var(--brand)_42%,#fff)] dark:hover:bg-[color-mix(in_srgb,var(--brand)_24%,var(--surface))] dark:hover:text-[color-mix(in_srgb,var(--brand)_30%,#fff)]',
7
7
  ghost: 'border-transparent bg-transparent text-foreground-muted hover:bg-[color-mix(in_srgb,var(--brand)_10%,transparent)] hover:text-[color-mix(in_srgb,var(--brand)_86%,var(--foreground))] dark:hover:bg-[color-mix(in_srgb,var(--brand)_14%,transparent)] dark:hover:text-[color-mix(in_srgb,var(--brand)_78%,#fff)]',
8
8
  outline: 'border-app-border bg-transparent text-foreground hover:border-[color-mix(in_srgb,var(--brand)_46%,var(--app-border))] hover:bg-[color-mix(in_srgb,var(--brand)_8%,transparent)] hover:text-[color-mix(in_srgb,var(--brand)_86%,var(--foreground))] dark:hover:border-[color-mix(in_srgb,var(--brand)_54%,var(--app-border))] dark:hover:bg-[color-mix(in_srgb,var(--brand)_12%,transparent)] dark:hover:text-[color-mix(in_srgb,var(--brand)_78%,#fff)]',
9
- information: 'border-transparent bg-[var(--status-info-text,#1d4ed8)] text-white shadow-[0_10px_22px_-16px_color-mix(in_srgb,var(--status-info-text,#1d4ed8)_70%,#000)] hover:bg-[color-mix(in_srgb,var(--status-info-text,#1d4ed8)_88%,#000)]',
10
- success: 'border-transparent bg-[var(--status-success-text,#15803d)] text-white hover:bg-[color-mix(in_srgb,var(--status-success-text,#15803d)_88%,#000)]',
11
- warning: 'border-transparent bg-[var(--status-warning-text,#92400e)] text-white shadow-[0_10px_22px_-16px_color-mix(in_srgb,var(--status-warning-text,#92400e)_70%,#000)] hover:bg-[color-mix(in_srgb,var(--status-warning-text,#92400e)_88%,#000)]',
12
- danger: 'border-transparent bg-[var(--status-danger-text,#b91c1c)] text-white hover:bg-[color-mix(in_srgb,var(--status-danger-text,#b91c1c)_88%,#000)]',
9
+ information: 'border-[var(--status-info-border,#93c5fd)] bg-[var(--status-info-bg,rgba(219,234,254,0.8))] text-[var(--status-info-text,#1d4ed8)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-info-border,#93c5fd)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-info-bg,rgba(219,234,254,0.8))_78%,var(--status-info-border,#93c5fd))]',
10
+ success: 'border-[var(--status-success-border,#86efac)] bg-[var(--status-success-bg,rgba(220,252,231,0.8))] text-[var(--status-success-text,#15803d)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-success-border,#86efac)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-success-bg,rgba(220,252,231,0.8))_78%,var(--status-success-border,#86efac))]',
11
+ warning: 'border-[var(--status-warning-border,#fcd34d)] bg-[var(--status-warning-bg,rgba(254,243,199,0.8))] text-[var(--status-warning-text,#92400e)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-warning-border,#fcd34d)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-warning-bg,rgba(254,243,199,0.8))_78%,var(--status-warning-border,#fcd34d))]',
12
+ danger: 'border-[var(--status-danger-border,#fca5a5)] bg-[var(--status-danger-bg,rgba(254,202,202,0.8))] text-[var(--status-danger-text,#b91c1c)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--status-danger-border,#fca5a5)_18%,transparent)] hover:bg-[color-mix(in_srgb,var(--status-danger-bg,rgba(254,202,202,0.8))_78%,var(--status-danger-border,#fca5a5))]',
13
13
  destructive: 'border-transparent bg-[var(--destructive)] text-white hover:bg-[color-mix(in_srgb,var(--destructive)_88%,#000)]',
14
14
  sidebar: 'border-transparent bg-transparent text-foreground-muted hover:bg-[color-mix(in_srgb,var(--brand)_10%,transparent)] hover:text-[var(--brand)]',
15
15
  };
@@ -12,7 +12,7 @@ export const FieldControl = ({ label, id, wrapperClassName, labelClassName = '',
12
12
  const roundedClass = roundedFull ? 'fc-rounded-full' : '';
13
13
  const isHorizontal = labelPosition === 'left' || labelPosition === 'right';
14
14
  const labelSizeClassMap = {
15
- xs: 'text-[10px] mb-0.5',
15
+ xs: 'text-[10px]',
16
16
  sm: 'text-xs',
17
17
  md: 'text-sm',
18
18
  lg: 'text-base',
@@ -3,8 +3,9 @@ export interface FieldGroupProps {
3
3
  title: string;
4
4
  children: ReactNode;
5
5
  className?: string;
6
+ bordered?: boolean;
6
7
  titleAlign?: 'left' | 'center' | 'right';
7
8
  }
8
- export declare function FieldGroup({ children, className, title, titleAlign }: FieldGroupProps): import("react").JSX.Element;
9
+ export declare function FieldGroup({ bordered, children, className, title, titleAlign }: FieldGroupProps): import("react").JSX.Element;
9
10
  export declare const FormSection: typeof FieldGroup;
10
11
  //# sourceMappingURL=FieldGroup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FieldGroup.d.ts","sourceRoot":"","sources":["../../src/components/FieldGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC1C;AAQD,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAmB,EAAE,EAAE,eAAe,+BAS9F;AAED,eAAO,MAAM,WAAW,mBAAa,CAAC"}
1
+ {"version":3,"file":"FieldGroup.d.ts","sourceRoot":"","sources":["../../src/components/FieldGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC1C;AAQD,wBAAgB,UAAU,CAAC,EAAE,QAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAmB,EAAE,EAAE,eAAe,+BAS/G;AAED,eAAO,MAAM,WAAW,mBAAa,CAAC"}
@@ -5,7 +5,7 @@ const titleAlignClass = {
5
5
  center: 'mx-auto',
6
6
  right: 'ml-auto',
7
7
  };
8
- export function FieldGroup({ children, className, title, titleAlign = 'left' }) {
9
- return (_jsxs("fieldset", { className: cn('border-app-border rounded-xl border px-4 pb-4 pt-2', className), children: [_jsx("legend", { className: cn('text-foreground-muted px-2 text-xs font-medium', titleAlignClass[titleAlign]), children: title }), children] }));
8
+ export function FieldGroup({ bordered = true, children, className, title, titleAlign = 'left' }) {
9
+ return (_jsxs("fieldset", { className: cn('rounded-xl px-4 pb-4 pt-2', bordered && 'border-app-border border', className), children: [_jsx("legend", { className: cn('text-foreground-muted px-2 text-xs font-medium', titleAlignClass[titleAlign]), children: title }), children] }));
10
10
  }
11
11
  export const FormSection = FieldGroup;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { type FieldValues } from 'react-hook-form';
3
- import type { FormControlSize } from './form-control-helpers';
3
+ import { type FormControlSize } from './form-control-helpers';
4
4
  export interface RadioGroupProps<TFieldValues extends FieldValues = FieldValues> {
5
5
  value?: string | number | null;
6
6
  onChange?: (value: string | number) => void;
@@ -12,6 +12,7 @@ export interface RadioGroupProps<TFieldValues extends FieldValues = FieldValues>
12
12
  disabled?: boolean;
13
13
  size?: FormControlSize;
14
14
  direction?: 'row' | 'column';
15
+ variant?: 'plain' | 'boxed';
15
16
  children?: React.ReactNode;
16
17
  control?: unknown;
17
18
  rules?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../src/components/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAe9D,MAAM,WAAW,eAAe,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0DD,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,mBAAmB,qBA6BrF;AAaD,iBAAS,cAAc,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,YAAY,CAAC,qBAM3G;AAED,eAAO,MAAM,UAAU;;CAA0C,CAAC"}
1
+ {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../src/components/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAe5E,MAAM,WAAW,eAAe,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2JD,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,mBAAmB,qBA6BrF;AAaD,iBAAS,cAAc,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,YAAY,CAAC,qBAM3G;AAED,eAAO,MAAM,UAAU;;CAA0C,CAAC"}
@@ -3,6 +3,8 @@ import React from 'react';
3
3
  import { useController, } from 'react-hook-form';
4
4
  import { cn } from '../utils/cn';
5
5
  import { FieldControl } from './FieldControl';
6
+ import { FieldValidationError } from './FieldValidationError';
7
+ import { fieldWrapper } from './form-control-helpers';
6
8
  const RadioGroupContext = React.createContext({
7
9
  size: 'sm',
8
10
  onChange: () => { },
@@ -13,15 +15,48 @@ const sizeStyles = {
13
15
  md: { outer: 'h-5 w-5', dot: 'h-2.5 w-2.5', text: 'text-sm' },
14
16
  lg: { outer: 'h-6 w-6', dot: 'h-3 w-3', text: 'text-base' },
15
17
  };
16
- function RadioGroupBase({ children, direction = 'row', disabled = false, errorMessage, inputDisabled, inputName, inputOnBlur, inputValue, label, labelClassName = '', name, onChange, onValueChange, size = 'sm', value, wrapperClassName, }) {
18
+ const groupHeightStyles = {
19
+ xs: 'h-7',
20
+ sm: 'h-9',
21
+ md: 'h-12',
22
+ lg: 'h-14',
23
+ };
24
+ const groupMinHeightStyles = {
25
+ xs: 'min-h-7',
26
+ sm: 'min-h-9',
27
+ md: 'min-h-12',
28
+ lg: 'min-h-14',
29
+ };
30
+ const groupPaddingStyles = {
31
+ xs: 'px-2',
32
+ sm: 'px-3',
33
+ md: 'px-4',
34
+ lg: 'px-6',
35
+ };
36
+ const boxedFieldsetHeightStyles = {
37
+ xs: 'min-h-12',
38
+ sm: 'min-h-14',
39
+ md: 'min-h-[4.25rem]',
40
+ lg: 'min-h-[4.75rem]',
41
+ };
42
+ function RadioGroupBase({ children, direction = 'row', disabled = false, errorMessage, inputDisabled, inputName, inputOnBlur, inputValue, label, labelClassName = '', name, onChange, onValueChange, size = 'sm', value, variant = 'boxed', wrapperClassName, }) {
43
+ const generatedId = React.useId().replace(/:/g, '');
17
44
  const resolvedValue = inputValue ?? value;
18
45
  const resolvedName = inputName ?? name;
19
46
  const resolvedDisabled = inputDisabled ?? disabled;
47
+ const legendId = `rg-${generatedId}-legend`;
48
+ const errorId = `rg-${generatedId}-error`;
49
+ const describedBy = errorMessage ? errorId : undefined;
20
50
  function handleChange(nextValue) {
21
51
  onValueChange?.(nextValue);
22
52
  onChange?.(nextValue);
23
53
  }
24
- return (_jsx(RadioGroupContext.Provider, { value: { name: resolvedName, value: resolvedValue, disabled: resolvedDisabled, size, onChange: handleChange }, children: _jsx(FieldControl, { label: label, wrapperClassName: wrapperClassName, labelClassName: labelClassName, errorMessage: errorMessage, size: size, disabled: resolvedDisabled, children: () => (_jsx("div", { role: "radiogroup", "aria-label": label, onBlur: inputOnBlur, className: cn('flex gap-3', direction === 'column' ? 'flex-col' : 'flex-row flex-wrap'), children: children })) }) }));
54
+ const groupClassName = cn('flex gap-3', direction === 'column' ? groupMinHeightStyles[size] : groupHeightStyles[size], direction === 'column' ? 'flex-col items-start justify-center' : 'flex-row flex-wrap items-center');
55
+ const boxedGroupClassName = cn(groupClassName, direction === 'row' && 'justify-around', groupPaddingStyles[size]);
56
+ if (variant === 'plain') {
57
+ return (_jsx(RadioGroupContext.Provider, { value: { name: resolvedName, value: resolvedValue, disabled: resolvedDisabled, size, onChange: handleChange }, children: _jsx(FieldControl, { label: label, wrapperClassName: wrapperClassName, labelClassName: labelClassName, errorMessage: errorMessage, size: size, disabled: resolvedDisabled, children: () => (_jsx("div", { role: "radiogroup", "aria-label": label, "aria-describedby": describedBy, onBlur: inputOnBlur, className: groupClassName, children: children })) }) }));
58
+ }
59
+ return (_jsx(RadioGroupContext.Provider, { value: { name: resolvedName, value: resolvedValue, disabled: resolvedDisabled, size, onChange: handleChange }, children: _jsxs("div", { className: cn(fieldWrapper, wrapperClassName), "data-disabled": resolvedDisabled || undefined, "data-invalid": !!errorMessage || undefined, children: [_jsxs("fieldset", { className: cn('border-app-border flex h-full flex-1 flex-col justify-center rounded-xl border px-3 pb-2 pt-0 transition-[background-color,border-color,box-shadow,color] duration-200', boxedFieldsetHeightStyles[size], resolvedDisabled && 'cursor-not-allowed opacity-60', errorMessage && 'border-red-500 dark:border-red-400'), children: [label ? (_jsx("legend", { id: legendId, className: cn('text-foreground-muted px-2 text-xs font-medium transition-colors', resolvedDisabled && 'cursor-not-allowed opacity-70', errorMessage && 'text-red-600 dark:text-red-400', labelClassName), children: label })) : null, _jsx("div", { role: "radiogroup", "aria-label": label ? undefined : resolvedName, "aria-labelledby": label ? legendId : undefined, "aria-describedby": describedBy, onBlur: inputOnBlur, className: boxedGroupClassName, children: children })] }), _jsx(FieldValidationError, { id: errorId, message: errorMessage })] }) }));
25
60
  }
26
61
  function Item({ className, disabled: itemDisabled, label, value }) {
27
62
  const { value: groupValue, disabled: groupDisabled, size, onChange } = React.useContext(RadioGroupContext);
@@ -1,5 +1,5 @@
1
1
  export declare const fieldWrapper = "flex w-full flex-col space-y-1";
2
- export declare const labelBase = "mb-1 text-md font-medium";
2
+ export declare const labelBase = "text-md font-medium";
3
3
  export type FormControlVariant = 'default' | 'filled' | 'ghost' | 'neutral';
4
4
  interface ControlClassOptions {
5
5
  errorMessage?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"form-control-helpers.d.ts","sourceRoot":"","sources":["../../src/components/form-control-helpers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,mCAAmC,CAAC;AAE7D,eAAO,MAAM,SAAS,6BAA6B,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAgC5E,UAAU,mBAAmB;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;AAClG,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"form-control-helpers.d.ts","sourceRoot":"","sources":["../../src/components/form-control-helpers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,mCAAmC,CAAC;AAE7D,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAgC5E,UAAU,mBAAmB;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;AAClG,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { cn } from '../utils/cn';
2
2
  export const fieldWrapper = 'flex w-full flex-col space-y-1';
3
- export const labelBase = 'mb-1 text-md font-medium';
3
+ export const labelBase = 'text-md font-medium';
4
4
  const controlShared = cn('text-foreground placeholder:text-foreground-muted w-full rounded-md px-3 py-2 font-medium border', 'transition-[background-color,border-color,box-shadow,color] duration-200', 'disabled:cursor-not-allowed disabled:opacity-60');
5
5
  const controlDefault = cn(controlShared, 'bg-surface border-app-border', 'enabled:hover:border-brand', 'focus:outline-none focus:bg-surface focus:border-brand focus:ring-2 focus:ring-inset focus:ring-brand/35', 'disabled:bg-input-bg disabled:border-app-border');
6
6
  const controlFilled = cn(controlShared, 'bg-input-bg border-app-border', 'enabled:hover:border-brand enabled:hover:bg-[color-mix(in_srgb,var(--input-bg)_75%,var(--surface))]', 'focus:outline-none focus:bg-surface focus:border-brand focus:ring-2 focus:ring-inset focus:ring-brand/35', 'disabled:bg-input-bg disabled:border-app-border');
package/dist/styles.css CHANGED
@@ -956,6 +956,9 @@ h2.react-datepicker__current-month {
956
956
  .order-3 {
957
957
  order: 3;
958
958
  }
959
+ .col-span-4 {
960
+ grid-column: span 4 / span 4;
961
+ }
959
962
  .col-span-12 {
960
963
  grid-column: span 12 / span 12;
961
964
  }
@@ -1019,9 +1022,6 @@ h2.react-datepicker__current-month {
1019
1022
  .mb-0 {
1020
1023
  margin-bottom: calc(var(--spacing) * 0);
1021
1024
  }
1022
- .mb-0\.5 {
1023
- margin-bottom: calc(var(--spacing) * 0.5);
1024
- }
1025
1025
  .mb-1 {
1026
1026
  margin-bottom: calc(var(--spacing) * 1);
1027
1027
  }
@@ -1289,6 +1289,12 @@ h2.react-datepicker__current-month {
1289
1289
  .min-h-\[2rem\] {
1290
1290
  min-height: 2rem;
1291
1291
  }
1292
+ .min-h-\[4\.25rem\] {
1293
+ min-height: 4.25rem;
1294
+ }
1295
+ .min-h-\[4\.75rem\] {
1296
+ min-height: 4.75rem;
1297
+ }
1292
1298
  .min-h-\[10rem\] {
1293
1299
  min-height: 10rem;
1294
1300
  }
@@ -1591,6 +1597,9 @@ h2.react-datepicker__current-month {
1591
1597
  .grid-cols-2 {
1592
1598
  grid-template-columns: repeat(2, minmax(0, 1fr));
1593
1599
  }
1600
+ .grid-cols-12 {
1601
+ grid-template-columns: repeat(12, minmax(0, 1fr));
1602
+ }
1594
1603
  .grid-cols-\[8rem_minmax\(0\,1fr\)\] {
1595
1604
  grid-template-columns: 8rem minmax(0,1fr);
1596
1605
  }
@@ -1642,6 +1651,9 @@ h2.react-datepicker__current-month {
1642
1651
  .items-stretch {
1643
1652
  align-items: stretch;
1644
1653
  }
1654
+ .justify-around {
1655
+ justify-content: space-around;
1656
+ }
1645
1657
  .justify-between {
1646
1658
  justify-content: space-between;
1647
1659
  }
@@ -1989,27 +2001,15 @@ h2.react-datepicker__current-month {
1989
2001
  .bg-\[var\(--status-danger-bg\,rgba\(254\,202\,202\,0\.8\)\)\] {
1990
2002
  background-color: var(--status-danger-bg,rgba(254,202,202,0.8));
1991
2003
  }
1992
- .bg-\[var\(--status-danger-text\,\#b91c1c\)\] {
1993
- background-color: var(--status-danger-text,#b91c1c);
1994
- }
1995
2004
  .bg-\[var\(--status-info-bg\,rgba\(219\,234\,254\,0\.8\)\)\] {
1996
2005
  background-color: var(--status-info-bg,rgba(219,234,254,0.8));
1997
2006
  }
1998
- .bg-\[var\(--status-info-text\,\#1d4ed8\)\] {
1999
- background-color: var(--status-info-text,#1d4ed8);
2000
- }
2001
2007
  .bg-\[var\(--status-success-bg\,rgba\(220\,252\,231\,0\.8\)\)\] {
2002
2008
  background-color: var(--status-success-bg,rgba(220,252,231,0.8));
2003
2009
  }
2004
- .bg-\[var\(--status-success-text\,\#15803d\)\] {
2005
- background-color: var(--status-success-text,#15803d);
2006
- }
2007
2010
  .bg-\[var\(--status-warning-bg\,rgba\(254\,243\,199\,0\.8\)\)\] {
2008
2011
  background-color: var(--status-warning-bg,rgba(254,243,199,0.8));
2009
2012
  }
2010
- .bg-\[var\(--status-warning-text\,\#92400e\)\] {
2011
- background-color: var(--status-warning-text,#92400e);
2012
- }
2013
2013
  .bg-app-border {
2014
2014
  background-color: var(--color-app-border);
2015
2015
  }
@@ -2181,6 +2181,9 @@ h2.react-datepicker__current-month {
2181
2181
  .py-10 {
2182
2182
  padding-block: calc(var(--spacing) * 10);
2183
2183
  }
2184
+ .pt-0 {
2185
+ padding-top: calc(var(--spacing) * 0);
2186
+ }
2184
2187
  .pt-2 {
2185
2188
  padding-top: calc(var(--spacing) * 2);
2186
2189
  }
@@ -2618,20 +2621,6 @@ h2.react-datepicker__current-month {
2618
2621
  }
2619
2622
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2620
2623
  }
2621
- .shadow-\[0_10px_22px_-16px_color-mix\(in_srgb\,var\(--status-info-text\,\#1d4ed8\)_70\%\,\#000\)\] {
2622
- --tw-shadow: 0 10px 22px -16px var(--tw-shadow-color, var(--status-info-text,#1d4ed8));
2623
- @supports (color: color-mix(in lab, red, red)) {
2624
- --tw-shadow: 0 10px 22px -16px var(--tw-shadow-color, color-mix(in srgb,var(--status-info-text,#1d4ed8) 70%,#000));
2625
- }
2626
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2627
- }
2628
- .shadow-\[0_10px_22px_-16px_color-mix\(in_srgb\,var\(--status-warning-text\,\#92400e\)_70\%\,\#000\)\] {
2629
- --tw-shadow: 0 10px 22px -16px var(--tw-shadow-color, var(--status-warning-text,#92400e));
2630
- @supports (color: color-mix(in lab, red, red)) {
2631
- --tw-shadow: 0 10px 22px -16px var(--tw-shadow-color, color-mix(in srgb,var(--status-warning-text,#92400e) 70%,#000));
2632
- }
2633
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2634
- }
2635
2624
  .shadow-\[0_12px_32px_rgba\(15\,23\,42\,0\.06\)\] {
2636
2625
  --tw-shadow: 0 12px 32px var(--tw-shadow-color, rgba(15,23,42,0.06));
2637
2626
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2658,6 +2647,34 @@ h2.react-datepicker__current-month {
2658
2647
  }
2659
2648
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2660
2649
  }
2650
+ .shadow-\[inset_0_0_0_1px_color-mix\(in_srgb\,var\(--status-danger-border\,\#fca5a5\)_18\%\,transparent\)\] {
2651
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, var(--status-danger-border,#fca5a5));
2652
+ @supports (color: color-mix(in lab, red, red)) {
2653
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, color-mix(in srgb,var(--status-danger-border,#fca5a5) 18%,transparent));
2654
+ }
2655
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2656
+ }
2657
+ .shadow-\[inset_0_0_0_1px_color-mix\(in_srgb\,var\(--status-info-border\,\#93c5fd\)_18\%\,transparent\)\] {
2658
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, var(--status-info-border,#93c5fd));
2659
+ @supports (color: color-mix(in lab, red, red)) {
2660
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, color-mix(in srgb,var(--status-info-border,#93c5fd) 18%,transparent));
2661
+ }
2662
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2663
+ }
2664
+ .shadow-\[inset_0_0_0_1px_color-mix\(in_srgb\,var\(--status-success-border\,\#86efac\)_18\%\,transparent\)\] {
2665
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, var(--status-success-border,#86efac));
2666
+ @supports (color: color-mix(in lab, red, red)) {
2667
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, color-mix(in srgb,var(--status-success-border,#86efac) 18%,transparent));
2668
+ }
2669
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2670
+ }
2671
+ .shadow-\[inset_0_0_0_1px_color-mix\(in_srgb\,var\(--status-warning-border\,\#fcd34d\)_18\%\,transparent\)\] {
2672
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, var(--status-warning-border,#fcd34d));
2673
+ @supports (color: color-mix(in lab, red, red)) {
2674
+ --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, color-mix(in srgb,var(--status-warning-border,#fcd34d) 18%,transparent));
2675
+ }
2676
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2677
+ }
2661
2678
  .shadow-\[inset_0_0_0_1px_rgb\(var\(--color-brand\)\/0\.10\)\] {
2662
2679
  --tw-shadow: inset 0 0 0 1px var(--tw-shadow-color, rgb(var(--color-brand)/0.10));
2663
2680
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -3077,42 +3094,42 @@ h2.react-datepicker__current-month {
3077
3094
  }
3078
3095
  }
3079
3096
  }
3080
- .hover\:bg-\[color-mix\(in_srgb\,var\(--status-danger-text\,\#b91c1c\)_88\%\,\#000\)\] {
3097
+ .hover\:bg-\[color-mix\(in_srgb\,var\(--status-danger-bg\,rgba\(254\,202\,202\,0\.8\)\)_78\%\,var\(--status-danger-border\,\#fca5a5\)\)\] {
3081
3098
  &:hover {
3082
3099
  @media (hover: hover) {
3083
- background-color: var(--status-danger-text,#b91c1c);
3100
+ background-color: var(--status-danger-bg,rgba(254,202,202,0.8));
3084
3101
  @supports (color: color-mix(in lab, red, red)) {
3085
- background-color: color-mix(in srgb,var(--status-danger-text,#b91c1c) 88%,#000);
3102
+ background-color: color-mix(in srgb,var(--status-danger-bg,rgba(254,202,202,0.8)) 78%,var(--status-danger-border,#fca5a5));
3086
3103
  }
3087
3104
  }
3088
3105
  }
3089
3106
  }
3090
- .hover\:bg-\[color-mix\(in_srgb\,var\(--status-info-text\,\#1d4ed8\)_88\%\,\#000\)\] {
3107
+ .hover\:bg-\[color-mix\(in_srgb\,var\(--status-info-bg\,rgba\(219\,234\,254\,0\.8\)\)_78\%\,var\(--status-info-border\,\#93c5fd\)\)\] {
3091
3108
  &:hover {
3092
3109
  @media (hover: hover) {
3093
- background-color: var(--status-info-text,#1d4ed8);
3110
+ background-color: var(--status-info-bg,rgba(219,234,254,0.8));
3094
3111
  @supports (color: color-mix(in lab, red, red)) {
3095
- background-color: color-mix(in srgb,var(--status-info-text,#1d4ed8) 88%,#000);
3112
+ background-color: color-mix(in srgb,var(--status-info-bg,rgba(219,234,254,0.8)) 78%,var(--status-info-border,#93c5fd));
3096
3113
  }
3097
3114
  }
3098
3115
  }
3099
3116
  }
3100
- .hover\:bg-\[color-mix\(in_srgb\,var\(--status-success-text\,\#15803d\)_88\%\,\#000\)\] {
3117
+ .hover\:bg-\[color-mix\(in_srgb\,var\(--status-success-bg\,rgba\(220\,252\,231\,0\.8\)\)_78\%\,var\(--status-success-border\,\#86efac\)\)\] {
3101
3118
  &:hover {
3102
3119
  @media (hover: hover) {
3103
- background-color: var(--status-success-text,#15803d);
3120
+ background-color: var(--status-success-bg,rgba(220,252,231,0.8));
3104
3121
  @supports (color: color-mix(in lab, red, red)) {
3105
- background-color: color-mix(in srgb,var(--status-success-text,#15803d) 88%,#000);
3122
+ background-color: color-mix(in srgb,var(--status-success-bg,rgba(220,252,231,0.8)) 78%,var(--status-success-border,#86efac));
3106
3123
  }
3107
3124
  }
3108
3125
  }
3109
3126
  }
3110
- .hover\:bg-\[color-mix\(in_srgb\,var\(--status-warning-text\,\#92400e\)_88\%\,\#000\)\] {
3127
+ .hover\:bg-\[color-mix\(in_srgb\,var\(--status-warning-bg\,rgba\(254\,243\,199\,0\.8\)\)_78\%\,var\(--status-warning-border\,\#fcd34d\)\)\] {
3111
3128
  &:hover {
3112
3129
  @media (hover: hover) {
3113
- background-color: var(--status-warning-text,#92400e);
3130
+ background-color: var(--status-warning-bg,rgba(254,243,199,0.8));
3114
3131
  @supports (color: color-mix(in lab, red, red)) {
3115
- background-color: color-mix(in srgb,var(--status-warning-text,#92400e) 88%,#000);
3132
+ background-color: color-mix(in srgb,var(--status-warning-bg,rgba(254,243,199,0.8)) 78%,var(--status-warning-border,#fcd34d));
3116
3133
  }
3117
3134
  }
3118
3135
  }
@@ -3839,6 +3856,11 @@ h2.react-datepicker__current-month {
3839
3856
  }
3840
3857
  }
3841
3858
  }
3859
+ .dark\:border-red-400 {
3860
+ @media (prefers-color-scheme: dark) {
3861
+ border-color: var(--color-red-400);
3862
+ }
3863
+ }
3842
3864
  .dark\:\!bg-\[rgb\(var\(--color-brand\)\/0\.13\)\] {
3843
3865
  @media (prefers-color-scheme: dark) {
3844
3866
  background-color: rgb(var(--color-brand)/0.13) !important;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wellingtonhlc/shared-ui",
3
- "version": "0.25.6",
3
+ "version": "0.25.8",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",