@parrot-co/parrot-ui 1.0.0-beta.0 → 1.0.0-beta.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.
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React$1 from 'react';
2
2
  import React__default from 'react';
3
3
  import * as react_aria_components from 'react-aria-components';
4
- import { TextFieldProps, NumberFieldProps, ButtonProps as ButtonProps$1, ToggleButtonProps as ToggleButtonProps$1, CheckboxFieldProps, CheckboxGroupProps as CheckboxGroupProps$1, MenuTriggerProps as MenuTriggerProps$1, MenuProps as MenuProps$1, Placement, MenuItemProps as MenuItemProps$1, MenuSectionProps as MenuSectionProps$1, ListBoxProps as ListBoxProps$1, ListBoxItemProps as ListBoxItemProps$1, ListBoxSectionProps as ListBoxSectionProps$1, RadioFieldProps, RadioGroupProps as RadioGroupProps$1, CalendarProps as CalendarProps$1, DateValue, RangeCalendarProps as RangeCalendarProps$1, DateFieldProps as DateFieldProps$1, TimeFieldProps as TimeFieldProps$1, TimeValue, DatePickerProps as DatePickerProps$1, DateRangePickerProps as DateRangePickerProps$1, ProgressBarProps, SwitchFieldProps, SliderProps as SliderProps$1, Key, TabsProps as TabsProps$1, Selection, SortDescriptor, ModalOverlayProps, PopoverProps as PopoverProps$1, TagGroupProps as TagGroupProps$1, TagListProps, TagProps as TagProps$1, Color as Color$1, ColorAreaProps as ColorAreaProps$1, ColorFieldProps as ColorFieldProps$1, ColorSwatchPickerProps as ColorSwatchPickerProps$1, ColorSliderProps as ColorSliderProps$1 } from 'react-aria-components';
4
+ import { TextFieldProps, NumberFieldProps, ButtonProps as ButtonProps$1, ToggleButtonProps as ToggleButtonProps$1, CheckboxFieldProps, CheckboxGroupProps as CheckboxGroupProps$1, MenuTriggerProps as MenuTriggerProps$1, MenuProps as MenuProps$1, Placement, MenuItemProps as MenuItemProps$1, MenuSectionProps as MenuSectionProps$1, ListBoxProps as ListBoxProps$1, ListBoxItemProps as ListBoxItemProps$1, ListBoxSectionProps as ListBoxSectionProps$1, RadioFieldProps, RadioGroupProps as RadioGroupProps$1, SelectProps as SelectProps$1, CalendarProps as CalendarProps$1, DateValue, RangeCalendarProps as RangeCalendarProps$1, DateFieldProps as DateFieldProps$1, TimeFieldProps as TimeFieldProps$1, TimeValue, DatePickerProps as DatePickerProps$1, DateRangePickerProps as DateRangePickerProps$1, ProgressBarProps, SwitchFieldProps, SliderProps as SliderProps$1, Key, TabsProps as TabsProps$1, Selection, SortDescriptor, ModalOverlayProps, PopoverProps as PopoverProps$1, TagGroupProps as TagGroupProps$1, TagListProps, TagProps as TagProps$1, Color as Color$1, ColorAreaProps as ColorAreaProps$1, ColorFieldProps as ColorFieldProps$1, ColorSwatchPickerProps as ColorSwatchPickerProps$1, ColorSliderProps as ColorSliderProps$1, TooltipProps as TooltipProps$1 } from 'react-aria-components';
5
5
  import { OverlayTriggerProps } from 'react-stately';
6
6
 
7
7
  /**
@@ -70,6 +70,11 @@ type ColorVariant = Variant;
70
70
  type InputAppearance = "outline" | "filled" | "filled-outline";
71
71
  /** The shared control-size scale (`.prt-size` recipe). */
72
72
  type Size = "2xs" | "xs" | "sm" | "md" | "lg" | "xl";
73
+ /**
74
+ * The size range every control supports — the valid range for a theme-level
75
+ * `size` default. `2xs` (and larger opt-ins like `2xl`/`3xl`) stay per-component.
76
+ */
77
+ type ControlSize = "xs" | "sm" | "md" | "lg" | "xl";
73
78
  /** The radius scale (`data-radius` recipe). */
74
79
  type Radius = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
75
80
  /** @deprecated use `Radius` */
@@ -77,11 +82,6 @@ type BorderRadius = "none" | "sm" | "md" | "lg" | "full";
77
82
  type Appearance = "light" | "dark";
78
83
  /** @deprecated use `Size` */
79
84
  type ButtonSize = "xs" | "sm" | "md" | "lg" | "xl";
80
- type ButtonAppearance = "primary" | "secondary" | "minimal";
81
- type ButtonAppearanceSchemaType = Partial<Record<ButtonAppearance, {
82
- variant: Variant;
83
- color: Color;
84
- }>>;
85
85
  type SizeOption = "none" | "4xs" | "3xs" | "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
86
86
 
87
87
  type ActionStatus = "idle" | "loading" | "success" | "error";
@@ -373,37 +373,21 @@ interface RadioItemProps extends Omit<RadioFieldProps, "className" | "style" | "
373
373
  }
374
374
  declare function RadioItem({ className, style, classNames, styles, children, ...props }: RadioItemProps): React$1.JSX.Element;
375
375
 
376
- type SingleOrMultipleValue = ID | Array<ID>;
377
376
  type SelectionMode = "single" | "multiple";
378
- interface MockNativeOnChangeEvent {
379
- target: {
380
- value: SingleOrMultipleValue;
381
- name?: string;
382
- };
383
- }
384
- interface SelectProps<T extends object> extends Pick<ListBoxProps<T>, "items" | "labelKey" | "valueKey" | "sectionKey" | "renderOption" | "renderSectionLabel" | "disabledKeys" | "children">, StyleProps<"wrapper" | "trigger" | "value" | "placeholder" | "label" | "popover"> {
377
+ interface SelectProps<T extends object, M extends SelectionMode = "single"> extends Omit<SelectProps$1<T, M>, "className" | "style" | "children" | "isInvalid" | "selectedKey" | "defaultSelectedKey" | "selectedKeys" | "defaultSelectedKeys" | "onSelectionChange">, Pick<ListBoxProps<T>, "items" | "labelKey" | "valueKey" | "sectionKey" | "renderOption" | "renderSectionLabel" | "disabledKeys" | "children">, StyleProps<"wrapper" | "trigger" | "value" | "placeholder" | "label" | "popover"> {
385
378
  label?: React$1.ReactNode;
386
379
  description?: React$1.ReactNode;
387
380
  error?: React$1.ReactNode;
388
- placeholder?: string;
389
- selectionMode?: SelectionMode;
390
- value?: SingleOrMultipleValue;
391
- defaultValue?: SingleOrMultipleValue;
392
- name?: string;
393
- isDisabled?: boolean;
394
- isRequired?: boolean;
395
381
  color?: Color;
396
382
  listBoxColor?: Color;
397
383
  size?: "xs" | "sm" | "md" | "lg" | "xl";
398
- radius?: BorderRadius;
384
+ radius?: Radius;
399
385
  appearance?: InputAppearance;
400
386
  showSectionSeparator?: boolean;
401
387
  showSelectionIndicator?: boolean;
402
388
  renderValue?: (value: T) => React$1.ReactNode;
403
- onChange?: (event: MockNativeOnChangeEvent) => void;
404
- onSelectionChange?: (keys: Array<ID>) => void;
405
389
  }
406
- declare function Select<T extends object>({ label, description, error, placeholder, selectionMode, appearance, renderValue, color, size, radius, listBoxColor, name, value, defaultValue, isDisabled, isRequired, disabledKeys, onChange, onSelectionChange, showSectionSeparator, showSelectionIndicator, items, children, labelKey, valueKey, sectionKey, renderOption, renderSectionLabel, className, classNames, style, styles, }: SelectProps<T>): React$1.JSX.Element;
390
+ declare function Select<T extends object, M extends SelectionMode = "single">({ label, description, error, placeholder, appearance, renderValue, color, size, radius, listBoxColor, showSectionSeparator, showSelectionIndicator, items, children, labelKey, valueKey, sectionKey, renderOption, renderSectionLabel, disabledKeys, className, classNames, style, styles, "aria-label": ariaLabel, ...racProps }: SelectProps<T, M>): React$1.JSX.Element;
407
391
 
408
392
  interface CalendarProps extends Omit<CalendarProps$1<DateValue>, "className" | "style" | "children" | "visibleDuration"> {
409
393
  numberOfMonths?: number;
@@ -599,12 +583,13 @@ interface TableProps<T extends object> extends StyleProps<"wrapper" | "header" |
599
583
  selectionMode?: "none" | "single" | "multiple";
600
584
  selectedKeys?: Selection;
601
585
  onSelectionChange?: (keys: Selection) => void;
586
+ onRowAction?: (key: string | number) => void;
602
587
  sortDescriptor?: SortDescriptor;
603
588
  onSortChange?: (descriptor: SortDescriptor) => void;
604
589
  renderEmptyState?: () => React$1.ReactNode;
605
590
  "aria-label"?: string;
606
591
  }
607
- declare function Table<T extends object>({ columns, data, getRowId, selectionMode, selectedKeys, onSelectionChange, sortDescriptor, onSortChange, renderEmptyState, radius, className, classNames, style, styles, ...props }: TableProps<T>): React$1.JSX.Element;
592
+ declare function Table<T extends object>({ columns, data, getRowId, selectionMode, selectedKeys, onSelectionChange, onRowAction, sortDescriptor, onSortChange, renderEmptyState, radius, className, classNames, style, styles, ...props }: TableProps<T>): React$1.JSX.Element;
608
593
 
609
594
  interface TimelineProps<T> extends StyleProps<"wrapper" | "item" | "content"> {
610
595
  items: Array<T>;
@@ -635,6 +620,58 @@ interface ModalProps extends Omit<ModalOverlayProps, "children" | "className" |
635
620
  declare function Modal({ variant, radius, isDismissable, width, title, description, onConfirm, onCancel, confirmLabel, cancelLabel, confirmButtonProps, cancelButtonProps, showCloseButton, hideTitle, onClose, children, className, style, classNames, styles, ...props }: ModalProps): React$1.JSX.Element;
636
621
  declare function useModal(props?: OverlayTriggerProps): react_aria_components.OverlayTriggerState;
637
622
 
623
+ /**
624
+ * A modal component registered in the registry receives these three props from
625
+ * the provider. Extend it in your own modal components:
626
+ *
627
+ * interface EditUserModalProps extends BaseModalProps<User> { userId: string }
628
+ *
629
+ * Call `onResolve(result)` to close with a value; `onOpenChange(false)` dismisses
630
+ * (resolves with `undefined`). Resolve wins once — call `onResolve`, not
631
+ * `onOpenChange`, when you have a result.
632
+ */
633
+ interface BaseModalProps<TResult = void> extends Pick<ModalOverlayProps, "isOpen" | "onOpenChange"> {
634
+ onResolve: (result: TResult) => void;
635
+ }
636
+ type ModalComponent = React$1.ComponentType<any>;
637
+ type ModalDef<C extends ModalComponent = ModalComponent> = {
638
+ component: C;
639
+ };
640
+ interface ModalRegistry {
641
+ [key: string]: ModalDef;
642
+ }
643
+ /**
644
+ * Ambient registry — augment it (like ParrotColorRegistry) so `useModals().open`
645
+ * is fully typed with no generics at the call site:
646
+ *
647
+ * declare module "@parrot-co/parrot-ui" {
648
+ * interface ParrotModalRegistry {
649
+ * editUser: { component: typeof EditUserModal };
650
+ * }
651
+ * }
652
+ */
653
+ interface ParrotModalRegistry {
654
+ }
655
+ type ModalKey = keyof ParrotModalRegistry & string;
656
+ type ComponentOf<K extends ModalKey> = ParrotModalRegistry[K] extends ModalDef<infer C> ? C : ModalComponent;
657
+ type ModalInputProps<K extends ModalKey> = Omit<React$1.ComponentProps<ComponentOf<K>>, "isOpen" | "onOpenChange" | "onResolve">;
658
+ type ModalResult<K extends ModalKey> = React$1.ComponentProps<ComponentOf<K>> extends {
659
+ onResolve?: (result: infer TResult) => void;
660
+ } ? TResult : void;
661
+ interface ModalControls {
662
+ open: <K extends ModalKey>(key: K, props?: ModalInputProps<K>) => Promise<ModalResult<K>>;
663
+ close: (key: ModalKey) => void;
664
+ update: <K extends ModalKey>(key: K, props: ModalInputProps<K>) => void;
665
+ isOpen: (key: ModalKey) => boolean;
666
+ }
667
+
668
+ interface ModalProviderProps {
669
+ registry: ModalRegistry;
670
+ children: React$1.ReactNode;
671
+ }
672
+ declare function ModalProvider({ registry, children }: ModalProviderProps): React$1.JSX.Element;
673
+ declare function useModals(): ModalControls;
674
+
638
675
  type TagFormat = "text" | "email" | "url" | "number";
639
676
  interface TagInputProps extends FieldComponentProps<"input"> {
640
677
  tags?: Array<string>;
@@ -692,10 +729,9 @@ declare function TagGroupItem({ children, textValue, ...props }: TagGroupItemPro
692
729
 
693
730
  interface ThemeProviderValue {
694
731
  color?: Color;
695
- radius?: BorderRadius;
696
- appearance?: Appearance;
697
- buttonAppearance?: ButtonAppearanceSchemaType;
698
- avatarRadiusSize?: BorderRadius;
732
+ radius?: Radius;
733
+ size?: ControlSize;
734
+ colorScheme?: Appearance;
699
735
  inputAppearance?: InputAppearance;
700
736
  }
701
737
  interface ThemeProviderProps extends ThemeProviderValue {
@@ -770,4 +806,127 @@ interface ToggleProps extends ButtonToggleProps, StyleProps<"wrapper"> {
770
806
  }
771
807
  declare function Toggle({ value, ...props }: ToggleProps): React$1.JSX.Element;
772
808
 
773
- export { Avatar, AvatarGroup, Button, ButtonGroup, Calendar, Checkbox, CheckboxGroup, CheckboxItem, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatchPicker, ComboBox, DateField, DatePicker, DateRangePicker, FileUploader, IconButton, Input, ListBox, ListBoxItem, ListBoxSection, Loader, Menu, MenuContent, MenuItem, MenuSection, MenuTrigger, Modal, type ModalProps, NumberInput, ListBoxItem as Option, Popover, PopoverContent, PopoverTrigger, Progress, Radio, RadioCard, RadioGroup, RadioItem, RangeCalendar, ListBoxSection as Section, Select, Separator, Slider, Space, Sticker, Switch, Tab, Table, Tabs, Tag, TagGroup, TagGroupItem, TagInput, Text, Textarea, ThemeProvider, TimeField, Timeline, Toggle, ToggleButton, ToggleGroup, parseColor, useModal, useTheme };
809
+ type ToastVariant = "default" | "success" | "error" | "warning" | "info";
810
+ type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right";
811
+ interface ToastAction {
812
+ label: string;
813
+ onClick: () => void;
814
+ }
815
+ interface ToastOptions {
816
+ description?: string;
817
+ action?: ToastAction;
818
+ cancel?: ToastAction;
819
+ duration?: number;
820
+ position?: ToastPosition;
821
+ }
822
+ type CustomToastRender = (props: {
823
+ close: () => void;
824
+ }) => React$1.ReactNode;
825
+ interface ToastRegionProps {
826
+ position?: ToastPosition;
827
+ }
828
+ declare function ToastRegion({ position }: ToastRegionProps): React$1.JSX.Element;
829
+ declare function toast(title: string, options?: ToastOptions): string;
830
+ declare namespace toast {
831
+ var success: (title: string, options?: ToastOptions) => string;
832
+ var error: (title: string, options?: ToastOptions) => string;
833
+ var warning: (title: string, options?: ToastOptions) => string;
834
+ var info: (title: string, options?: ToastOptions) => string;
835
+ var custom: (render: CustomToastRender, options?: Pick<ToastOptions, "duration" | "position">) => string;
836
+ var dismiss: (key: string) => void;
837
+ }
838
+
839
+ interface TooltipProps extends Omit<TooltipProps$1, "className" | "style" | "children">, StyleProps<"tooltip"> {
840
+ content: React$1.ReactNode;
841
+ children: React$1.ReactElement;
842
+ delay?: number;
843
+ closeDelay?: number;
844
+ isDisabled?: boolean;
845
+ showArrow?: boolean;
846
+ }
847
+ declare function Tooltip({ content, children, delay, closeDelay, isDisabled, showArrow, placement, offset, className, classNames, style, styles, ...props }: TooltipProps): React$1.JSX.Element;
848
+
849
+ interface HoverCardProps extends Omit<PopoverProps$1, "triggerRef" | "children" | "className" | "style" | "isOpen" | "defaultOpen" | "onOpenChange" | "isNonModal">, StyleProps<"popover" | "content"> {
850
+ children: React$1.ReactElement;
851
+ content: React$1.ReactNode;
852
+ openDelay?: number;
853
+ closeDelay?: number;
854
+ isDisabled?: boolean;
855
+ isOpen?: boolean;
856
+ defaultOpen?: boolean;
857
+ onOpenChange?: (isOpen: boolean) => void;
858
+ }
859
+ declare function HoverCard({ children, content, openDelay, closeDelay, isDisabled, isOpen, defaultOpen, onOpenChange, offset, placement, className, classNames, style, styles, ...props }: HoverCardProps): React$1.JSX.Element;
860
+
861
+ type FieldValidator<T> = (value: unknown, values: T) => string | null;
862
+ interface UseFormOptions<T extends Record<string, unknown>> {
863
+ fields: T;
864
+ validators?: Partial<Record<keyof T, FieldValidator<T>>>;
865
+ optional?: Array<keyof T>;
866
+ resetKey?: string | number | null;
867
+ }
868
+ type Errors<T> = Record<keyof T, string | null>;
869
+ type Touched<T> = Record<keyof T, boolean>;
870
+ interface UseFormReturn<T extends Record<string, unknown>> {
871
+ values: T;
872
+ errors: Errors<T>;
873
+ touched: Touched<T>;
874
+ isDirty: boolean;
875
+ isSubmitting: boolean;
876
+ setIsSubmitting: React$1.Dispatch<React$1.SetStateAction<boolean>>;
877
+ onChange: (fieldName: keyof T, value: unknown) => void;
878
+ getFieldProps: (fieldName: keyof T) => {
879
+ name: string;
880
+ value: string;
881
+ onChange: (value: string) => void;
882
+ error: string | null;
883
+ };
884
+ getNumberFieldProps: (fieldName: keyof T) => {
885
+ name: string;
886
+ value: number;
887
+ onChange: (value: number) => void;
888
+ error: string | null;
889
+ };
890
+ getSelectProps: (fieldName: keyof T) => {
891
+ name: string;
892
+ value: Key | null;
893
+ onChange: (value: Key | null) => void;
894
+ error: string | null;
895
+ };
896
+ getCheckboxGroupProps: (fieldName: keyof T) => {
897
+ name: string;
898
+ value: string[];
899
+ onChange: (value: string[]) => void;
900
+ errorMessage: string | null;
901
+ };
902
+ getRadioGroupProps: (fieldName: keyof T) => {
903
+ name: string;
904
+ value: string;
905
+ onChange: (value: string) => void;
906
+ errorMessage: string | null;
907
+ };
908
+ getSwitchProps: (fieldName: keyof T) => {
909
+ name: string;
910
+ isSelected: boolean;
911
+ onChange: (value: boolean) => void;
912
+ };
913
+ handleSubmit: (callback: (values: T) => void | Promise<void>) => (e: React$1.FormEvent) => void;
914
+ isValid: () => boolean;
915
+ reset: () => void;
916
+ validateAll: () => Errors<T>;
917
+ setFieldValues: (newValues: Partial<T>) => void;
918
+ setFieldError: (fieldName: keyof T, error: string | null) => void;
919
+ }
920
+ declare function useForm<T extends Record<string, unknown>>({ fields: defaultFields, validators, optional, resetKey, }: UseFormOptions<T>): UseFormReturn<T>;
921
+
922
+ declare function required<T>(message?: string): FieldValidator<T>;
923
+ declare function email<T>(message?: string): FieldValidator<T>;
924
+ declare function minLength<T>(length: number, message?: string): FieldValidator<T>;
925
+ declare function maxLength<T>(length: number, message?: string): FieldValidator<T>;
926
+ declare function min<T>(n: number, message?: string): FieldValidator<T>;
927
+ declare function max<T>(n: number, message?: string): FieldValidator<T>;
928
+ declare function pattern<T>(regex: RegExp, message?: string): FieldValidator<T>;
929
+ declare function matches<T>(fieldName: keyof T & string, message?: string): FieldValidator<T>;
930
+ declare function compose<T>(...fns: Array<FieldValidator<T>>): FieldValidator<T>;
931
+
932
+ export { Avatar, AvatarGroup, type BaseModalProps, Button, ButtonGroup, Calendar, Checkbox, CheckboxGroup, CheckboxItem, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatchPicker, ComboBox, type CustomToastRender, DateField, DatePicker, DateRangePicker, type FieldValidator, FileUploader, HoverCard, type HoverCardProps, IconButton, Input, ListBox, ListBoxItem, ListBoxSection, Loader, Menu, MenuContent, MenuItem, MenuSection, MenuTrigger, Modal, type ModalControls, type ModalDef, type ModalInputProps, type ModalKey, type ModalProps, ModalProvider, type ModalProviderProps, type ModalRegistry, type ModalResult, NumberInput, ListBoxItem as Option, type ParrotModalRegistry, Popover, PopoverContent, PopoverTrigger, Progress, Radio, RadioCard, RadioGroup, RadioItem, RangeCalendar, ListBoxSection as Section, Select, Separator, Slider, Space, Sticker, Switch, Tab, Table, Tabs, Tag, TagGroup, TagGroupItem, TagInput, Text, Textarea, ThemeProvider, TimeField, Timeline, type ToastAction, type ToastOptions, type ToastPosition, ToastRegion, type ToastRegionProps, type ToastVariant, Toggle, ToggleButton, ToggleGroup, Tooltip, type TooltipProps, type UseFormOptions, type UseFormReturn, compose, email, matches, max, maxLength, min, minLength, parseColor, pattern, required, toast, useForm, useModal, useModals, useTheme };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React$1 from 'react';
2
2
  import React__default from 'react';
3
3
  import * as react_aria_components from 'react-aria-components';
4
- import { TextFieldProps, NumberFieldProps, ButtonProps as ButtonProps$1, ToggleButtonProps as ToggleButtonProps$1, CheckboxFieldProps, CheckboxGroupProps as CheckboxGroupProps$1, MenuTriggerProps as MenuTriggerProps$1, MenuProps as MenuProps$1, Placement, MenuItemProps as MenuItemProps$1, MenuSectionProps as MenuSectionProps$1, ListBoxProps as ListBoxProps$1, ListBoxItemProps as ListBoxItemProps$1, ListBoxSectionProps as ListBoxSectionProps$1, RadioFieldProps, RadioGroupProps as RadioGroupProps$1, CalendarProps as CalendarProps$1, DateValue, RangeCalendarProps as RangeCalendarProps$1, DateFieldProps as DateFieldProps$1, TimeFieldProps as TimeFieldProps$1, TimeValue, DatePickerProps as DatePickerProps$1, DateRangePickerProps as DateRangePickerProps$1, ProgressBarProps, SwitchFieldProps, SliderProps as SliderProps$1, Key, TabsProps as TabsProps$1, Selection, SortDescriptor, ModalOverlayProps, PopoverProps as PopoverProps$1, TagGroupProps as TagGroupProps$1, TagListProps, TagProps as TagProps$1, Color as Color$1, ColorAreaProps as ColorAreaProps$1, ColorFieldProps as ColorFieldProps$1, ColorSwatchPickerProps as ColorSwatchPickerProps$1, ColorSliderProps as ColorSliderProps$1 } from 'react-aria-components';
4
+ import { TextFieldProps, NumberFieldProps, ButtonProps as ButtonProps$1, ToggleButtonProps as ToggleButtonProps$1, CheckboxFieldProps, CheckboxGroupProps as CheckboxGroupProps$1, MenuTriggerProps as MenuTriggerProps$1, MenuProps as MenuProps$1, Placement, MenuItemProps as MenuItemProps$1, MenuSectionProps as MenuSectionProps$1, ListBoxProps as ListBoxProps$1, ListBoxItemProps as ListBoxItemProps$1, ListBoxSectionProps as ListBoxSectionProps$1, RadioFieldProps, RadioGroupProps as RadioGroupProps$1, SelectProps as SelectProps$1, CalendarProps as CalendarProps$1, DateValue, RangeCalendarProps as RangeCalendarProps$1, DateFieldProps as DateFieldProps$1, TimeFieldProps as TimeFieldProps$1, TimeValue, DatePickerProps as DatePickerProps$1, DateRangePickerProps as DateRangePickerProps$1, ProgressBarProps, SwitchFieldProps, SliderProps as SliderProps$1, Key, TabsProps as TabsProps$1, Selection, SortDescriptor, ModalOverlayProps, PopoverProps as PopoverProps$1, TagGroupProps as TagGroupProps$1, TagListProps, TagProps as TagProps$1, Color as Color$1, ColorAreaProps as ColorAreaProps$1, ColorFieldProps as ColorFieldProps$1, ColorSwatchPickerProps as ColorSwatchPickerProps$1, ColorSliderProps as ColorSliderProps$1, TooltipProps as TooltipProps$1 } from 'react-aria-components';
5
5
  import { OverlayTriggerProps } from 'react-stately';
6
6
 
7
7
  /**
@@ -70,6 +70,11 @@ type ColorVariant = Variant;
70
70
  type InputAppearance = "outline" | "filled" | "filled-outline";
71
71
  /** The shared control-size scale (`.prt-size` recipe). */
72
72
  type Size = "2xs" | "xs" | "sm" | "md" | "lg" | "xl";
73
+ /**
74
+ * The size range every control supports — the valid range for a theme-level
75
+ * `size` default. `2xs` (and larger opt-ins like `2xl`/`3xl`) stay per-component.
76
+ */
77
+ type ControlSize = "xs" | "sm" | "md" | "lg" | "xl";
73
78
  /** The radius scale (`data-radius` recipe). */
74
79
  type Radius = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
75
80
  /** @deprecated use `Radius` */
@@ -77,11 +82,6 @@ type BorderRadius = "none" | "sm" | "md" | "lg" | "full";
77
82
  type Appearance = "light" | "dark";
78
83
  /** @deprecated use `Size` */
79
84
  type ButtonSize = "xs" | "sm" | "md" | "lg" | "xl";
80
- type ButtonAppearance = "primary" | "secondary" | "minimal";
81
- type ButtonAppearanceSchemaType = Partial<Record<ButtonAppearance, {
82
- variant: Variant;
83
- color: Color;
84
- }>>;
85
85
  type SizeOption = "none" | "4xs" | "3xs" | "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
86
86
 
87
87
  type ActionStatus = "idle" | "loading" | "success" | "error";
@@ -373,37 +373,21 @@ interface RadioItemProps extends Omit<RadioFieldProps, "className" | "style" | "
373
373
  }
374
374
  declare function RadioItem({ className, style, classNames, styles, children, ...props }: RadioItemProps): React$1.JSX.Element;
375
375
 
376
- type SingleOrMultipleValue = ID | Array<ID>;
377
376
  type SelectionMode = "single" | "multiple";
378
- interface MockNativeOnChangeEvent {
379
- target: {
380
- value: SingleOrMultipleValue;
381
- name?: string;
382
- };
383
- }
384
- interface SelectProps<T extends object> extends Pick<ListBoxProps<T>, "items" | "labelKey" | "valueKey" | "sectionKey" | "renderOption" | "renderSectionLabel" | "disabledKeys" | "children">, StyleProps<"wrapper" | "trigger" | "value" | "placeholder" | "label" | "popover"> {
377
+ interface SelectProps<T extends object, M extends SelectionMode = "single"> extends Omit<SelectProps$1<T, M>, "className" | "style" | "children" | "isInvalid" | "selectedKey" | "defaultSelectedKey" | "selectedKeys" | "defaultSelectedKeys" | "onSelectionChange">, Pick<ListBoxProps<T>, "items" | "labelKey" | "valueKey" | "sectionKey" | "renderOption" | "renderSectionLabel" | "disabledKeys" | "children">, StyleProps<"wrapper" | "trigger" | "value" | "placeholder" | "label" | "popover"> {
385
378
  label?: React$1.ReactNode;
386
379
  description?: React$1.ReactNode;
387
380
  error?: React$1.ReactNode;
388
- placeholder?: string;
389
- selectionMode?: SelectionMode;
390
- value?: SingleOrMultipleValue;
391
- defaultValue?: SingleOrMultipleValue;
392
- name?: string;
393
- isDisabled?: boolean;
394
- isRequired?: boolean;
395
381
  color?: Color;
396
382
  listBoxColor?: Color;
397
383
  size?: "xs" | "sm" | "md" | "lg" | "xl";
398
- radius?: BorderRadius;
384
+ radius?: Radius;
399
385
  appearance?: InputAppearance;
400
386
  showSectionSeparator?: boolean;
401
387
  showSelectionIndicator?: boolean;
402
388
  renderValue?: (value: T) => React$1.ReactNode;
403
- onChange?: (event: MockNativeOnChangeEvent) => void;
404
- onSelectionChange?: (keys: Array<ID>) => void;
405
389
  }
406
- declare function Select<T extends object>({ label, description, error, placeholder, selectionMode, appearance, renderValue, color, size, radius, listBoxColor, name, value, defaultValue, isDisabled, isRequired, disabledKeys, onChange, onSelectionChange, showSectionSeparator, showSelectionIndicator, items, children, labelKey, valueKey, sectionKey, renderOption, renderSectionLabel, className, classNames, style, styles, }: SelectProps<T>): React$1.JSX.Element;
390
+ declare function Select<T extends object, M extends SelectionMode = "single">({ label, description, error, placeholder, appearance, renderValue, color, size, radius, listBoxColor, showSectionSeparator, showSelectionIndicator, items, children, labelKey, valueKey, sectionKey, renderOption, renderSectionLabel, disabledKeys, className, classNames, style, styles, "aria-label": ariaLabel, ...racProps }: SelectProps<T, M>): React$1.JSX.Element;
407
391
 
408
392
  interface CalendarProps extends Omit<CalendarProps$1<DateValue>, "className" | "style" | "children" | "visibleDuration"> {
409
393
  numberOfMonths?: number;
@@ -599,12 +583,13 @@ interface TableProps<T extends object> extends StyleProps<"wrapper" | "header" |
599
583
  selectionMode?: "none" | "single" | "multiple";
600
584
  selectedKeys?: Selection;
601
585
  onSelectionChange?: (keys: Selection) => void;
586
+ onRowAction?: (key: string | number) => void;
602
587
  sortDescriptor?: SortDescriptor;
603
588
  onSortChange?: (descriptor: SortDescriptor) => void;
604
589
  renderEmptyState?: () => React$1.ReactNode;
605
590
  "aria-label"?: string;
606
591
  }
607
- declare function Table<T extends object>({ columns, data, getRowId, selectionMode, selectedKeys, onSelectionChange, sortDescriptor, onSortChange, renderEmptyState, radius, className, classNames, style, styles, ...props }: TableProps<T>): React$1.JSX.Element;
592
+ declare function Table<T extends object>({ columns, data, getRowId, selectionMode, selectedKeys, onSelectionChange, onRowAction, sortDescriptor, onSortChange, renderEmptyState, radius, className, classNames, style, styles, ...props }: TableProps<T>): React$1.JSX.Element;
608
593
 
609
594
  interface TimelineProps<T> extends StyleProps<"wrapper" | "item" | "content"> {
610
595
  items: Array<T>;
@@ -635,6 +620,58 @@ interface ModalProps extends Omit<ModalOverlayProps, "children" | "className" |
635
620
  declare function Modal({ variant, radius, isDismissable, width, title, description, onConfirm, onCancel, confirmLabel, cancelLabel, confirmButtonProps, cancelButtonProps, showCloseButton, hideTitle, onClose, children, className, style, classNames, styles, ...props }: ModalProps): React$1.JSX.Element;
636
621
  declare function useModal(props?: OverlayTriggerProps): react_aria_components.OverlayTriggerState;
637
622
 
623
+ /**
624
+ * A modal component registered in the registry receives these three props from
625
+ * the provider. Extend it in your own modal components:
626
+ *
627
+ * interface EditUserModalProps extends BaseModalProps<User> { userId: string }
628
+ *
629
+ * Call `onResolve(result)` to close with a value; `onOpenChange(false)` dismisses
630
+ * (resolves with `undefined`). Resolve wins once — call `onResolve`, not
631
+ * `onOpenChange`, when you have a result.
632
+ */
633
+ interface BaseModalProps<TResult = void> extends Pick<ModalOverlayProps, "isOpen" | "onOpenChange"> {
634
+ onResolve: (result: TResult) => void;
635
+ }
636
+ type ModalComponent = React$1.ComponentType<any>;
637
+ type ModalDef<C extends ModalComponent = ModalComponent> = {
638
+ component: C;
639
+ };
640
+ interface ModalRegistry {
641
+ [key: string]: ModalDef;
642
+ }
643
+ /**
644
+ * Ambient registry — augment it (like ParrotColorRegistry) so `useModals().open`
645
+ * is fully typed with no generics at the call site:
646
+ *
647
+ * declare module "@parrot-co/parrot-ui" {
648
+ * interface ParrotModalRegistry {
649
+ * editUser: { component: typeof EditUserModal };
650
+ * }
651
+ * }
652
+ */
653
+ interface ParrotModalRegistry {
654
+ }
655
+ type ModalKey = keyof ParrotModalRegistry & string;
656
+ type ComponentOf<K extends ModalKey> = ParrotModalRegistry[K] extends ModalDef<infer C> ? C : ModalComponent;
657
+ type ModalInputProps<K extends ModalKey> = Omit<React$1.ComponentProps<ComponentOf<K>>, "isOpen" | "onOpenChange" | "onResolve">;
658
+ type ModalResult<K extends ModalKey> = React$1.ComponentProps<ComponentOf<K>> extends {
659
+ onResolve?: (result: infer TResult) => void;
660
+ } ? TResult : void;
661
+ interface ModalControls {
662
+ open: <K extends ModalKey>(key: K, props?: ModalInputProps<K>) => Promise<ModalResult<K>>;
663
+ close: (key: ModalKey) => void;
664
+ update: <K extends ModalKey>(key: K, props: ModalInputProps<K>) => void;
665
+ isOpen: (key: ModalKey) => boolean;
666
+ }
667
+
668
+ interface ModalProviderProps {
669
+ registry: ModalRegistry;
670
+ children: React$1.ReactNode;
671
+ }
672
+ declare function ModalProvider({ registry, children }: ModalProviderProps): React$1.JSX.Element;
673
+ declare function useModals(): ModalControls;
674
+
638
675
  type TagFormat = "text" | "email" | "url" | "number";
639
676
  interface TagInputProps extends FieldComponentProps<"input"> {
640
677
  tags?: Array<string>;
@@ -692,10 +729,9 @@ declare function TagGroupItem({ children, textValue, ...props }: TagGroupItemPro
692
729
 
693
730
  interface ThemeProviderValue {
694
731
  color?: Color;
695
- radius?: BorderRadius;
696
- appearance?: Appearance;
697
- buttonAppearance?: ButtonAppearanceSchemaType;
698
- avatarRadiusSize?: BorderRadius;
732
+ radius?: Radius;
733
+ size?: ControlSize;
734
+ colorScheme?: Appearance;
699
735
  inputAppearance?: InputAppearance;
700
736
  }
701
737
  interface ThemeProviderProps extends ThemeProviderValue {
@@ -770,4 +806,127 @@ interface ToggleProps extends ButtonToggleProps, StyleProps<"wrapper"> {
770
806
  }
771
807
  declare function Toggle({ value, ...props }: ToggleProps): React$1.JSX.Element;
772
808
 
773
- export { Avatar, AvatarGroup, Button, ButtonGroup, Calendar, Checkbox, CheckboxGroup, CheckboxItem, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatchPicker, ComboBox, DateField, DatePicker, DateRangePicker, FileUploader, IconButton, Input, ListBox, ListBoxItem, ListBoxSection, Loader, Menu, MenuContent, MenuItem, MenuSection, MenuTrigger, Modal, type ModalProps, NumberInput, ListBoxItem as Option, Popover, PopoverContent, PopoverTrigger, Progress, Radio, RadioCard, RadioGroup, RadioItem, RangeCalendar, ListBoxSection as Section, Select, Separator, Slider, Space, Sticker, Switch, Tab, Table, Tabs, Tag, TagGroup, TagGroupItem, TagInput, Text, Textarea, ThemeProvider, TimeField, Timeline, Toggle, ToggleButton, ToggleGroup, parseColor, useModal, useTheme };
809
+ type ToastVariant = "default" | "success" | "error" | "warning" | "info";
810
+ type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right";
811
+ interface ToastAction {
812
+ label: string;
813
+ onClick: () => void;
814
+ }
815
+ interface ToastOptions {
816
+ description?: string;
817
+ action?: ToastAction;
818
+ cancel?: ToastAction;
819
+ duration?: number;
820
+ position?: ToastPosition;
821
+ }
822
+ type CustomToastRender = (props: {
823
+ close: () => void;
824
+ }) => React$1.ReactNode;
825
+ interface ToastRegionProps {
826
+ position?: ToastPosition;
827
+ }
828
+ declare function ToastRegion({ position }: ToastRegionProps): React$1.JSX.Element;
829
+ declare function toast(title: string, options?: ToastOptions): string;
830
+ declare namespace toast {
831
+ var success: (title: string, options?: ToastOptions) => string;
832
+ var error: (title: string, options?: ToastOptions) => string;
833
+ var warning: (title: string, options?: ToastOptions) => string;
834
+ var info: (title: string, options?: ToastOptions) => string;
835
+ var custom: (render: CustomToastRender, options?: Pick<ToastOptions, "duration" | "position">) => string;
836
+ var dismiss: (key: string) => void;
837
+ }
838
+
839
+ interface TooltipProps extends Omit<TooltipProps$1, "className" | "style" | "children">, StyleProps<"tooltip"> {
840
+ content: React$1.ReactNode;
841
+ children: React$1.ReactElement;
842
+ delay?: number;
843
+ closeDelay?: number;
844
+ isDisabled?: boolean;
845
+ showArrow?: boolean;
846
+ }
847
+ declare function Tooltip({ content, children, delay, closeDelay, isDisabled, showArrow, placement, offset, className, classNames, style, styles, ...props }: TooltipProps): React$1.JSX.Element;
848
+
849
+ interface HoverCardProps extends Omit<PopoverProps$1, "triggerRef" | "children" | "className" | "style" | "isOpen" | "defaultOpen" | "onOpenChange" | "isNonModal">, StyleProps<"popover" | "content"> {
850
+ children: React$1.ReactElement;
851
+ content: React$1.ReactNode;
852
+ openDelay?: number;
853
+ closeDelay?: number;
854
+ isDisabled?: boolean;
855
+ isOpen?: boolean;
856
+ defaultOpen?: boolean;
857
+ onOpenChange?: (isOpen: boolean) => void;
858
+ }
859
+ declare function HoverCard({ children, content, openDelay, closeDelay, isDisabled, isOpen, defaultOpen, onOpenChange, offset, placement, className, classNames, style, styles, ...props }: HoverCardProps): React$1.JSX.Element;
860
+
861
+ type FieldValidator<T> = (value: unknown, values: T) => string | null;
862
+ interface UseFormOptions<T extends Record<string, unknown>> {
863
+ fields: T;
864
+ validators?: Partial<Record<keyof T, FieldValidator<T>>>;
865
+ optional?: Array<keyof T>;
866
+ resetKey?: string | number | null;
867
+ }
868
+ type Errors<T> = Record<keyof T, string | null>;
869
+ type Touched<T> = Record<keyof T, boolean>;
870
+ interface UseFormReturn<T extends Record<string, unknown>> {
871
+ values: T;
872
+ errors: Errors<T>;
873
+ touched: Touched<T>;
874
+ isDirty: boolean;
875
+ isSubmitting: boolean;
876
+ setIsSubmitting: React$1.Dispatch<React$1.SetStateAction<boolean>>;
877
+ onChange: (fieldName: keyof T, value: unknown) => void;
878
+ getFieldProps: (fieldName: keyof T) => {
879
+ name: string;
880
+ value: string;
881
+ onChange: (value: string) => void;
882
+ error: string | null;
883
+ };
884
+ getNumberFieldProps: (fieldName: keyof T) => {
885
+ name: string;
886
+ value: number;
887
+ onChange: (value: number) => void;
888
+ error: string | null;
889
+ };
890
+ getSelectProps: (fieldName: keyof T) => {
891
+ name: string;
892
+ value: Key | null;
893
+ onChange: (value: Key | null) => void;
894
+ error: string | null;
895
+ };
896
+ getCheckboxGroupProps: (fieldName: keyof T) => {
897
+ name: string;
898
+ value: string[];
899
+ onChange: (value: string[]) => void;
900
+ errorMessage: string | null;
901
+ };
902
+ getRadioGroupProps: (fieldName: keyof T) => {
903
+ name: string;
904
+ value: string;
905
+ onChange: (value: string) => void;
906
+ errorMessage: string | null;
907
+ };
908
+ getSwitchProps: (fieldName: keyof T) => {
909
+ name: string;
910
+ isSelected: boolean;
911
+ onChange: (value: boolean) => void;
912
+ };
913
+ handleSubmit: (callback: (values: T) => void | Promise<void>) => (e: React$1.FormEvent) => void;
914
+ isValid: () => boolean;
915
+ reset: () => void;
916
+ validateAll: () => Errors<T>;
917
+ setFieldValues: (newValues: Partial<T>) => void;
918
+ setFieldError: (fieldName: keyof T, error: string | null) => void;
919
+ }
920
+ declare function useForm<T extends Record<string, unknown>>({ fields: defaultFields, validators, optional, resetKey, }: UseFormOptions<T>): UseFormReturn<T>;
921
+
922
+ declare function required<T>(message?: string): FieldValidator<T>;
923
+ declare function email<T>(message?: string): FieldValidator<T>;
924
+ declare function minLength<T>(length: number, message?: string): FieldValidator<T>;
925
+ declare function maxLength<T>(length: number, message?: string): FieldValidator<T>;
926
+ declare function min<T>(n: number, message?: string): FieldValidator<T>;
927
+ declare function max<T>(n: number, message?: string): FieldValidator<T>;
928
+ declare function pattern<T>(regex: RegExp, message?: string): FieldValidator<T>;
929
+ declare function matches<T>(fieldName: keyof T & string, message?: string): FieldValidator<T>;
930
+ declare function compose<T>(...fns: Array<FieldValidator<T>>): FieldValidator<T>;
931
+
932
+ export { Avatar, AvatarGroup, type BaseModalProps, Button, ButtonGroup, Calendar, Checkbox, CheckboxGroup, CheckboxItem, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatchPicker, ComboBox, type CustomToastRender, DateField, DatePicker, DateRangePicker, type FieldValidator, FileUploader, HoverCard, type HoverCardProps, IconButton, Input, ListBox, ListBoxItem, ListBoxSection, Loader, Menu, MenuContent, MenuItem, MenuSection, MenuTrigger, Modal, type ModalControls, type ModalDef, type ModalInputProps, type ModalKey, type ModalProps, ModalProvider, type ModalProviderProps, type ModalRegistry, type ModalResult, NumberInput, ListBoxItem as Option, type ParrotModalRegistry, Popover, PopoverContent, PopoverTrigger, Progress, Radio, RadioCard, RadioGroup, RadioItem, RangeCalendar, ListBoxSection as Section, Select, Separator, Slider, Space, Sticker, Switch, Tab, Table, Tabs, Tag, TagGroup, TagGroupItem, TagInput, Text, Textarea, ThemeProvider, TimeField, Timeline, type ToastAction, type ToastOptions, type ToastPosition, ToastRegion, type ToastRegionProps, type ToastVariant, Toggle, ToggleButton, ToggleGroup, Tooltip, type TooltipProps, type UseFormOptions, type UseFormReturn, compose, email, matches, max, maxLength, min, minLength, parseColor, pattern, required, toast, useForm, useModal, useModals, useTheme };