@koobiq/react-components 0.0.1-beta.32 → 0.0.1-beta.34

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 (37) hide show
  1. package/dist/components/DateInput/DateInput.d.ts +5 -0
  2. package/dist/components/DateInput/DateInput.js +104 -0
  3. package/dist/components/DateInput/DateInput.module.css.js +8 -0
  4. package/dist/components/DateInput/components/DateInputSegment/DateInputSegment.d.ts +7 -0
  5. package/dist/components/DateInput/components/DateInputSegment/DateInputSegment.js +27 -0
  6. package/dist/components/DateInput/components/DateInputSegment/DateInputSegment.module.css.js +17 -0
  7. package/dist/components/DateInput/components/DateInputSegment/index.d.ts +1 -0
  8. package/dist/components/DateInput/components/index.d.ts +1 -0
  9. package/dist/components/DateInput/index.d.ts +2 -0
  10. package/dist/components/DateInput/types.d.ts +47 -0
  11. package/dist/components/DateInput/types.js +4 -0
  12. package/dist/components/DatePicker/DatePicker._stories_.d.ts +13 -0
  13. package/dist/components/DatePicker/DatePicker.d.ts +3 -0
  14. package/dist/components/DatePicker/index.d.ts +0 -0
  15. package/dist/components/FieldComponents/FieldInputDate/FieldInputDate.d.ts +12 -0
  16. package/dist/components/FieldComponents/FieldInputDate/FieldInputDate.js +32 -0
  17. package/dist/components/FieldComponents/FieldInputDate/FieldInputDate.module.css.js +20 -0
  18. package/dist/components/FieldComponents/FieldInputDate/index.d.ts +1 -0
  19. package/dist/components/FieldComponents/index.d.ts +1 -0
  20. package/dist/components/Input/Input.d.ts +1 -1
  21. package/dist/components/Input/types.d.ts +1 -1
  22. package/dist/components/InputNumber/InputNumber.d.ts +1 -1
  23. package/dist/components/InputNumber/types.d.ts +1 -1
  24. package/dist/components/Link/types.d.ts +1 -1
  25. package/dist/components/Menu/Menu.js +1 -1
  26. package/dist/components/Popover/Popover.d.ts +0 -3
  27. package/dist/components/Popover/Popover.js +5 -140
  28. package/dist/components/Popover/PopoverInner.d.ts +3 -0
  29. package/dist/components/Popover/PopoverInner.js +142 -0
  30. package/dist/components/RadioGroup/types.d.ts +1 -1
  31. package/dist/components/Select/Select.js +1 -1
  32. package/dist/components/Textarea/Textarea.d.ts +1 -1
  33. package/dist/components/Textarea/types.d.ts +1 -1
  34. package/dist/components/index.d.ts +2 -1
  35. package/dist/index.js +8 -3
  36. package/dist/style.css +107 -0
  37. package/package.json +5 -5
@@ -0,0 +1,5 @@
1
+ import type { Ref } from 'react';
2
+ import type { DateValue } from '@koobiq/react-primitives';
3
+ import type { DateInputRef, DateInputProps, DateInputComponentProp } from './types';
4
+ export declare function DateInputRender<T extends DateValue>(props: Omit<DateInputProps<T>, 'ref'>, ref: Ref<DateInputRef>): import("react/jsx-runtime").JSX.Element;
5
+ export declare const DateInput: DateInputComponentProp;
@@ -0,0 +1,104 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { createCalendar } from "@internationalized/date";
5
+ import { useDOMRef, mergeProps, clsx } from "@koobiq/react-core";
6
+ import { useLocale, useDateFieldState, removeDataAttributes, useDateField } from "@koobiq/react-primitives";
7
+ import s from "./DateInput.module.css.js";
8
+ import { FieldInputDate } from "../FieldComponents/FieldInputDate/FieldInputDate.js";
9
+ import { DateInputSegment } from "./components/DateInputSegment/DateInputSegment.js";
10
+ import { FieldControl } from "../FieldComponents/FieldControl/FieldControl.js";
11
+ import { FieldLabel } from "../FieldComponents/FieldLabel/FieldLabel.js";
12
+ import { FieldInputGroup } from "../FieldComponents/FieldInputGroup/FieldInputGroup.js";
13
+ import { FieldCaption } from "../FieldComponents/FieldCaption/FieldCaption.js";
14
+ import { FieldError } from "../FieldComponents/FieldError/FieldError.js";
15
+ function DateInputRender(props, ref) {
16
+ const { errorMessage } = props;
17
+ const { locale } = useLocale();
18
+ const {
19
+ variant = "filled",
20
+ slotProps,
21
+ caption,
22
+ startAddon,
23
+ endAddon,
24
+ isLabelHidden,
25
+ label,
26
+ className,
27
+ style,
28
+ fullWidth,
29
+ isReadOnly,
30
+ "data-testid": testId
31
+ } = props;
32
+ const state = useDateFieldState({
33
+ ...removeDataAttributes(props),
34
+ locale,
35
+ createCalendar
36
+ });
37
+ const domRef = useDOMRef(ref);
38
+ const {
39
+ labelProps: labelPropReactAria,
40
+ fieldProps,
41
+ descriptionProps,
42
+ errorMessageProps,
43
+ ...validation
44
+ } = useDateField({ ...removeDataAttributes(props) }, state, domRef);
45
+ const { isInvalid, isRequired, isDisabled } = state;
46
+ const rootProps = mergeProps(
47
+ {
48
+ style,
49
+ fullWidth,
50
+ "data-testid": testId,
51
+ "data-variant": variant,
52
+ "data-invalid": isInvalid,
53
+ "data-disabled": isDisabled,
54
+ "data-fullwidth": fullWidth,
55
+ "data-required": isRequired,
56
+ "data-readonly": isReadOnly,
57
+ className: clsx(s.base, className)
58
+ },
59
+ slotProps?.root
60
+ );
61
+ const labelProps = mergeProps(
62
+ { isHidden: isLabelHidden, children: label, isRequired },
63
+ labelPropReactAria,
64
+ slotProps?.label
65
+ );
66
+ const groupProps = mergeProps(
67
+ {
68
+ endAddon,
69
+ isInvalid,
70
+ startAddon
71
+ },
72
+ slotProps?.group
73
+ );
74
+ const captionProps = mergeProps({ children: caption }, slotProps?.caption, descriptionProps);
75
+ const errorProps = mergeProps(
76
+ {
77
+ isInvalid,
78
+ children: typeof errorMessage === "function" ? errorMessage({ ...validation }) : errorMessage
79
+ },
80
+ slotProps?.errorMessage,
81
+ errorMessageProps
82
+ );
83
+ const controlProps = mergeProps(
84
+ {
85
+ variant,
86
+ isInvalid,
87
+ isDisabled,
88
+ ref: domRef
89
+ },
90
+ slotProps?.inputDate,
91
+ fieldProps
92
+ );
93
+ return /* @__PURE__ */ jsxs(FieldControl, { ...rootProps, children: [
94
+ /* @__PURE__ */ jsx(FieldLabel, { ...labelProps }),
95
+ /* @__PURE__ */ jsx(FieldInputGroup, { ...groupProps, children: /* @__PURE__ */ jsx(FieldInputDate, { ...controlProps, children: state.segments.map((segment, i) => /* @__PURE__ */ jsx(DateInputSegment, { segment, state }, i)) }) }),
96
+ /* @__PURE__ */ jsx(FieldCaption, { ...captionProps }),
97
+ /* @__PURE__ */ jsx(FieldError, { ...errorProps })
98
+ ] });
99
+ }
100
+ const DateInput = forwardRef(DateInputRender);
101
+ export {
102
+ DateInput,
103
+ DateInputRender
104
+ };
@@ -0,0 +1,8 @@
1
+ const base = "kbq-dateinput-a4c39b";
2
+ const s = {
3
+ base
4
+ };
5
+ export {
6
+ base,
7
+ s as default
8
+ };
@@ -0,0 +1,7 @@
1
+ import type { DateSegment, DateFieldState } from '@koobiq/react-primitives';
2
+ type DateInputSegmentProps = {
3
+ segment: DateSegment;
4
+ state: DateFieldState;
5
+ };
6
+ export declare function DateInputSegment({ segment, state }: DateInputSegmentProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,27 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useRef } from "react";
3
+ import { clsx } from "@koobiq/react-core";
4
+ import { useDateSegment } from "@koobiq/react-primitives";
5
+ import s from "./DateInputSegment.module.css.js";
6
+ function DateInputSegment({ segment, state }) {
7
+ const ref = useRef(null);
8
+ const { segmentProps } = useDateSegment(segment, state, ref);
9
+ const { text, isPlaceholder, type } = segment;
10
+ return /* @__PURE__ */ jsx(
11
+ "span",
12
+ {
13
+ ...segmentProps,
14
+ ref,
15
+ className: clsx(
16
+ s.base,
17
+ s[type],
18
+ state.value !== null && s.hasValue,
19
+ isPlaceholder && s.placeholder
20
+ ),
21
+ children: text
22
+ }
23
+ );
24
+ }
25
+ export {
26
+ DateInputSegment
27
+ };
@@ -0,0 +1,17 @@
1
+ const base = "kbq-dateinputsegment-996e10";
2
+ const placeholder = "kbq-dateinputsegment-placeholder-be1df1";
3
+ const literal = "kbq-dateinputsegment-literal-d722fc";
4
+ const hasValue = "kbq-dateinputsegment-hasValue-886d0f";
5
+ const s = {
6
+ base,
7
+ placeholder,
8
+ literal,
9
+ hasValue
10
+ };
11
+ export {
12
+ base,
13
+ s as default,
14
+ hasValue,
15
+ literal,
16
+ placeholder
17
+ };
@@ -0,0 +1 @@
1
+ export * from './DateInputSegment';
@@ -0,0 +1 @@
1
+ export * from './DateInputSegment';
@@ -0,0 +1,2 @@
1
+ export * from './DateInput';
2
+ export * from './types';
@@ -0,0 +1,47 @@
1
+ import type { ComponentRef, CSSProperties, ReactElement, ReactNode, Ref } from 'react';
2
+ import type { AriaDateFieldProps, DateValue } from '@koobiq/react-primitives';
3
+ import type { FieldCaptionProps, FieldControlProps, FieldErrorProps, FieldInputDateProps, FieldInputGroupProps, FieldLabelProps } from '../FieldComponents';
4
+ export declare const dateInputPropVariant: readonly ["filled", "transparent"];
5
+ export type DateInputPropVariant = (typeof dateInputPropVariant)[number];
6
+ export type DateInputProps<T extends DateValue> = {
7
+ /** Inline styles. */
8
+ style?: CSSProperties;
9
+ /** Additional CSS-classes. */
10
+ className?: string;
11
+ /** Unique identifier for testing purposes. */
12
+ 'data-testid'?: string | number;
13
+ /** The helper text content. */
14
+ caption?: string | number;
15
+ /**
16
+ * The variant to use.
17
+ * @default filled
18
+ */
19
+ variant?: DateInputPropVariant;
20
+ /**
21
+ * If true, the input will take up the full width of its container.
22
+ * @default false
23
+ */
24
+ fullWidth?: boolean;
25
+ /** The props used for each slot inside. */
26
+ slotProps?: {
27
+ root?: FieldControlProps;
28
+ label?: FieldLabelProps;
29
+ group?: FieldInputGroupProps;
30
+ caption?: FieldCaptionProps;
31
+ inputDate?: FieldInputDateProps;
32
+ errorMessage?: FieldErrorProps;
33
+ };
34
+ /** Ref to the control */
35
+ ref?: Ref<HTMLDivElement>;
36
+ /**
37
+ * If `true`, the label is hidden. Be sure to add aria-label to the input element.
38
+ * @default false
39
+ */
40
+ isLabelHidden?: boolean;
41
+ /** Addon placed before the children. */
42
+ startAddon?: ReactNode;
43
+ /** Addon placed after the children. */
44
+ endAddon?: ReactNode;
45
+ } & Omit<AriaDateFieldProps<T>, 'description' | 'validationBehavior' | 'validate' | 'validationState'>;
46
+ export type DateInputComponentProp = <T extends DateValue>(props: DateInputProps<T>) => ReactElement | null;
47
+ export type DateInputRef = ComponentRef<'div'>;
@@ -0,0 +1,4 @@
1
+ const dateInputPropVariant = ["filled", "transparent"];
2
+ export {
3
+ dateInputPropVariant
4
+ };
@@ -0,0 +1,13 @@
1
+ import type { StoryObj } from '@storybook/react';
2
+ import { DatePicker } from './DatePicker';
3
+ declare const meta: {
4
+ title: string;
5
+ component: typeof DatePicker;
6
+ parameters: {
7
+ layout: string;
8
+ };
9
+ argTypes: {};
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof meta>;
13
+ export declare const Base: Story;
@@ -0,0 +1,3 @@
1
+ import type { AriaDatePickerProps, DateValue } from '@koobiq/react-primitives';
2
+ export type DatePickerProps<T extends DateValue> = AriaDatePickerProps<T>;
3
+ export declare function DatePicker<T extends DateValue>(props: DatePickerProps<T>): import("react/jsx-runtime").JSX.Element;
File without changes
@@ -0,0 +1,12 @@
1
+ import { type ReactNode, type Ref } from 'react';
2
+ import type { InputPropVariant } from '../../Input';
3
+ export type FieldInputDateProps = {
4
+ isInvalid?: boolean;
5
+ isDisabled?: boolean;
6
+ variant?: InputPropVariant;
7
+ className?: string;
8
+ children?: ReactNode;
9
+ 'data-testid'?: string;
10
+ ref?: Ref<HTMLDivElement>;
11
+ };
12
+ export declare const FieldInputDate: import("react").ForwardRefExoticComponent<Omit<FieldInputDateProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,32 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { clsx } from "@koobiq/react-core";
4
+ import s from "./FieldInputDate.module.css.js";
5
+ const FieldInputDate = forwardRef(
6
+ ({
7
+ isInvalid = false,
8
+ isDisabled = false,
9
+ variant = "filled",
10
+ children,
11
+ className,
12
+ ...other
13
+ }, ref) => /* @__PURE__ */ jsx(
14
+ "div",
15
+ {
16
+ ...other,
17
+ className: clsx(
18
+ s.base,
19
+ s[variant],
20
+ isInvalid && s.invalid,
21
+ isDisabled && s.disabled,
22
+ className
23
+ ),
24
+ ref,
25
+ children
26
+ }
27
+ )
28
+ );
29
+ FieldInputDate.displayName = "FieldSelect";
30
+ export {
31
+ FieldInputDate
32
+ };
@@ -0,0 +1,20 @@
1
+ const base = "kbq-fieldinputdate-a54331";
2
+ const transparent = "kbq-fieldinputdate-transparent-04d912";
3
+ const filled = "kbq-fieldinputdate-filled-02db7d";
4
+ const invalid = "kbq-fieldinputdate-invalid-d764c6";
5
+ const disabled = "kbq-fieldinputdate-disabled-692832";
6
+ const s = {
7
+ base,
8
+ transparent,
9
+ filled,
10
+ invalid,
11
+ disabled
12
+ };
13
+ export {
14
+ base,
15
+ s as default,
16
+ disabled,
17
+ filled,
18
+ invalid,
19
+ transparent
20
+ };
@@ -0,0 +1 @@
1
+ export * from './FieldInputDate';
@@ -6,3 +6,4 @@ export * from './FieldAddon';
6
6
  export * from './FieldCaption';
7
7
  export * from './FieldError';
8
8
  export * from './FieldInputGroup';
9
+ export * from './FieldInputDate';
@@ -1,6 +1,6 @@
1
1
  import { TextField } from '@koobiq/react-primitives';
2
2
  import { type FieldLabelProps, type FieldInputGroupProps, type FieldCaptionProps, type FieldErrorProps, type FieldInputProps, type FieldControlProps } from '../FieldComponents';
3
- export declare const Input: import("react").ForwardRefExoticComponent<Omit<Omit<import("@koobiq/react-primitives").TextFieldProps<HTMLInputElement>, "children" | "style" | "className" | "validationBehavior" | "validate" | "description" | "inputElementType">, "value" | "caption" | "label" | "style" | "className" | "defaultValue" | "onChange" | "placeholder" | "isDisabled" | "variant" | "slotProps" | "fullWidth" | "data-testid" | "isInvalid" | "isReadOnly" | "isRequired" | "errorMessage" | "startAddon" | "endAddon" | "isLabelHidden" | keyof {
3
+ export declare const Input: import("react").ForwardRefExoticComponent<Omit<Omit<import("@koobiq/react-primitives").TextFieldProps<HTMLInputElement>, "children" | "validationBehavior" | "validate" | "description" | "inputElementType">, "value" | "caption" | "label" | "style" | "className" | "defaultValue" | "onChange" | "placeholder" | "isDisabled" | "variant" | "slotProps" | "fullWidth" | "data-testid" | "isInvalid" | "isReadOnly" | "isRequired" | "errorMessage" | "startAddon" | "endAddon" | "isLabelHidden" | keyof {
4
4
  disabled?: boolean;
5
5
  error?: boolean;
6
6
  required?: boolean;
@@ -115,6 +115,6 @@ export type InputProps = ExtendableProps<{
115
115
  errorMessage?: FieldErrorProps;
116
116
  input?: FieldInputProps<'input'>;
117
117
  };
118
- } & InputDeprecatedProps, Omit<TextFieldProps<HTMLInputElement>, 'description' | 'validationBehavior' | 'validate' | 'children' | 'style' | 'className' | 'inputElementType'>>;
118
+ } & InputDeprecatedProps, Omit<TextFieldProps<HTMLInputElement>, 'description' | 'validationBehavior' | 'validate' | 'children' | 'inputElementType'>>;
119
119
  export type InputRef = ComponentRef<'input'>;
120
120
  export {};
@@ -1,6 +1,6 @@
1
1
  import { NumberField } from '@koobiq/react-primitives';
2
2
  import { type FieldControlProps, type FieldLabelProps, type FieldCaptionProps, type FieldErrorProps, type FieldInputGroupProps, type FieldInputProps } from '../FieldComponents';
3
- export declare const InputNumber: import("react").ForwardRefExoticComponent<Omit<Omit<import("@react-types/numberfield").AriaNumberFieldProps, "inputElementType">, "caption" | "label" | "style" | "className" | "isDisabled" | "variant" | "slotProps" | "fullWidth" | "data-testid" | "isInvalid" | "isRequired" | "errorMessage" | "startAddon" | "endAddon" | "isLabelHidden" | keyof {
3
+ export declare const InputNumber: import("react").ForwardRefExoticComponent<Omit<Omit<import("@react-types/numberfield").AriaNumberFieldProps, "children" | "validationBehavior" | "validate" | "description" | "inputElementType">, "caption" | "label" | "style" | "className" | "isDisabled" | "variant" | "slotProps" | "fullWidth" | "data-testid" | "isInvalid" | "isRequired" | "errorMessage" | "startAddon" | "endAddon" | "isLabelHidden" | keyof {
4
4
  disabled?: boolean;
5
5
  error?: boolean;
6
6
  required?: boolean;
@@ -102,6 +102,6 @@ export type InputNumberProps = ExtendableProps<{
102
102
  group?: FieldInputGroupProps;
103
103
  errorMessage?: FieldErrorProps;
104
104
  };
105
- } & InputNumberDeprecatedProps, Omit<UseNumberFieldProps, 'inputElementType'>>;
105
+ } & InputNumberDeprecatedProps, Omit<UseNumberFieldProps, 'description' | 'validationBehavior' | 'validate' | 'children' | 'inputElementType'>>;
106
106
  export type InputNumberRef = ComponentRef<'input'>;
107
107
  export {};
@@ -57,5 +57,5 @@ export type LinkBaseProps = ExtendableProps<{
57
57
  className?: string;
58
58
  /** Inline styles */
59
59
  style?: CSSProperties;
60
- } & LinkDeprecatedProps, UseLinkProps>;
60
+ } & LinkDeprecatedProps, Omit<UseLinkProps, 'elementType'>>;
61
61
  export {};
@@ -3,11 +3,11 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
3
  import { forwardRef, useRef } from "react";
4
4
  import { useDOMRef, mergeProps, clsx, Pressable } from "@koobiq/react-core";
5
5
  import { useMenuTriggerState, useMenuTrigger } from "@koobiq/react-primitives";
6
+ import { PopoverInner } from "../Popover/PopoverInner.js";
6
7
  import s from "./Menu.module.css.js";
7
8
  import { MenuInner } from "./components/MenuInner/MenuInner.js";
8
9
  import { Header } from "../Collections/Header.js";
9
10
  import { Divider } from "../Collections/Divider.js";
10
- import { PopoverInner } from "../Popover/Popover.js";
11
11
  import { Item } from "../Collections/Item.js";
12
12
  import { Section } from "../Collections/Section.js";
13
13
  import { ListItemText } from "../List/components/ListItemText/ListItemText.js";
@@ -1,7 +1,4 @@
1
- import type { FC } from 'react';
2
1
  import { Dialog } from '../Dialog';
3
- import type { PopoverInnerProps } from './types';
4
- export declare const PopoverInner: FC<PopoverInnerProps>;
5
2
  declare const PopoverComponent: import("react").ForwardRefExoticComponent<import("./types").PopoverBaseProps & import("react").RefAttributes<HTMLDivElement>>;
6
3
  type CompoundedComponent = typeof PopoverComponent & {
7
4
  Header: typeof Dialog.Header;
@@ -1,143 +1,9 @@
1
1
  "use client";
2
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
- import { forwardRef, useRef, cloneElement, isValidElement } from "react";
4
- import { useDOMRef, useBoolean, mergeProps, clsx } from "@koobiq/react-core";
5
- import { useOverlayTrigger, usePopover, Overlay, useOverlayTriggerState } from "@koobiq/react-primitives";
6
- import { Transition } from "react-transition-group";
7
- import s from "./Popover.module.css.js";
8
- import { normalizeInlineSize } from "./utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { useOverlayTriggerState } from "@koobiq/react-primitives";
5
+ import { PopoverInner } from "./PopoverInner.js";
9
6
  import { Dialog } from "../Dialog/Dialog.js";
10
- const PopoverInner = (props) => {
11
- const {
12
- offset = 0,
13
- size = "medium",
14
- crossOffset = 0,
15
- hideArrow = false,
16
- containerPadding = 12,
17
- arrowBoundaryOffset = 20,
18
- placement: placementProp = "top",
19
- maxBlockSize = 480,
20
- type = "dialog",
21
- state,
22
- control,
23
- children,
24
- anchorRef,
25
- slotProps,
26
- className,
27
- isNonModal,
28
- popoverRef,
29
- portalContainer,
30
- hideCloseButton,
31
- disableFocusManagement,
32
- disableExitOnEscapeKeyDown,
33
- shouldCloseOnInteractOutside,
34
- ...other
35
- } = props;
36
- const showArrow = !hideArrow;
37
- const domRef = useDOMRef(popoverRef);
38
- const controlRef = useRef(null);
39
- const openState = state.isOpen;
40
- const [opened, { on, off }] = useBoolean(openState);
41
- const { triggerProps, overlayProps } = useOverlayTrigger(
42
- { type },
43
- { ...state, isOpen: openState }
44
- );
45
- const {
46
- popoverProps,
47
- underlayProps,
48
- arrowProps: arrowPropsCommon,
49
- placement
50
- } = usePopover(
51
- {
52
- ...props,
53
- offset,
54
- isNonModal,
55
- crossOffset,
56
- containerPadding,
57
- popoverRef: domRef,
58
- arrowBoundaryOffset,
59
- maxHeight: maxBlockSize,
60
- placement: placementProp,
61
- shouldCloseOnInteractOutside,
62
- triggerRef: anchorRef || controlRef,
63
- isKeyboardDismissDisabled: disableExitOnEscapeKeyDown
64
- },
65
- { ...state, isOpen: openState || opened }
66
- );
67
- const resolvedChildren = () => {
68
- if (typeof children === "function")
69
- return cloneElement(children({ close: state.close }), overlayProps);
70
- if (isValidElement(children)) return cloneElement(children, overlayProps);
71
- return children;
72
- };
73
- const arrowProps = mergeProps(
74
- { className: s.arrow },
75
- arrowPropsCommon,
76
- slotProps?.arrow
77
- );
78
- const dialogProps = mergeProps(
79
- {
80
- role: "dialog",
81
- hideCloseButton,
82
- className: s.dialog,
83
- onClose: state.close
84
- },
85
- slotProps?.dialog
86
- );
87
- const backdropProps = mergeProps(
88
- { className: s.underlay },
89
- slotProps?.backdrop,
90
- underlayProps
91
- );
92
- const transitionProps = mergeProps(
93
- {
94
- timeout: 120,
95
- onEnter: on,
96
- onExited: off,
97
- appear: true,
98
- in: openState,
99
- nodeRef: domRef,
100
- unmountOnExit: true
101
- },
102
- slotProps?.transition
103
- );
104
- return /* @__PURE__ */ jsxs(Fragment, { children: [
105
- control?.({
106
- ref: controlRef,
107
- ...triggerProps
108
- }),
109
- /* @__PURE__ */ jsx(Transition, { ...transitionProps, children: (transition) => /* @__PURE__ */ jsxs(
110
- Overlay,
111
- {
112
- portalContainer,
113
- disableFocusManagement,
114
- children: [
115
- /* @__PURE__ */ jsx("div", { ...backdropProps }),
116
- /* @__PURE__ */ jsxs(
117
- "div",
118
- {
119
- ref: domRef,
120
- "data-size": size,
121
- "data-arrow": showArrow,
122
- "data-placement": placement,
123
- "data-transition": transition,
124
- className: clsx(s.base, s[size], className),
125
- ...mergeProps(popoverProps, other),
126
- style: {
127
- ...popoverProps.style,
128
- "--popover-inline-size": normalizeInlineSize(size)
129
- },
130
- children: [
131
- showArrow && /* @__PURE__ */ jsx("div", { ...arrowProps, "data-placement": placement }),
132
- /* @__PURE__ */ jsx("div", { className: s.container, children: type === "dialog" ? /* @__PURE__ */ jsx(Dialog, { ...dialogProps, children: resolvedChildren() }) : resolvedChildren() })
133
- ]
134
- }
135
- )
136
- ]
137
- }
138
- ) })
139
- ] });
140
- };
141
7
  const PopoverComponent = forwardRef(
142
8
  (props, ref) => {
143
9
  const { open, onOpenChange, defaultOpen, ...other } = props;
@@ -156,6 +22,5 @@ Popover.Header = Dialog.Header;
156
22
  Popover.Body = Dialog.Body;
157
23
  Popover.Footer = Dialog.Footer;
158
24
  export {
159
- Popover,
160
- PopoverInner
25
+ Popover
161
26
  };
@@ -0,0 +1,3 @@
1
+ import { type FC } from 'react';
2
+ import type { PopoverInnerProps } from './types';
3
+ export declare const PopoverInner: FC<PopoverInnerProps>;
@@ -0,0 +1,142 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { useRef, cloneElement, isValidElement } from "react";
3
+ import { useDOMRef, useBoolean, mergeProps, clsx } from "@koobiq/react-core";
4
+ import { useOverlayTrigger, usePopover, Overlay } from "@koobiq/react-primitives";
5
+ import { Transition } from "react-transition-group";
6
+ import s from "./Popover.module.css.js";
7
+ import { normalizeInlineSize } from "./utils.js";
8
+ import { Dialog } from "../Dialog/Dialog.js";
9
+ const PopoverInner = (props) => {
10
+ const {
11
+ offset = 0,
12
+ size = "medium",
13
+ crossOffset = 0,
14
+ hideArrow = false,
15
+ containerPadding = 12,
16
+ arrowBoundaryOffset = 20,
17
+ placement: placementProp = "top",
18
+ maxBlockSize = 480,
19
+ type = "dialog",
20
+ state,
21
+ control,
22
+ children,
23
+ anchorRef,
24
+ slotProps,
25
+ className,
26
+ isNonModal,
27
+ popoverRef,
28
+ portalContainer,
29
+ hideCloseButton,
30
+ disableFocusManagement,
31
+ disableExitOnEscapeKeyDown,
32
+ shouldCloseOnInteractOutside,
33
+ ...other
34
+ } = props;
35
+ const showArrow = !hideArrow;
36
+ const domRef = useDOMRef(popoverRef);
37
+ const controlRef = useRef(null);
38
+ const openState = state.isOpen;
39
+ const [opened, { on, off }] = useBoolean(openState);
40
+ const { triggerProps, overlayProps } = useOverlayTrigger(
41
+ { type },
42
+ { ...state, isOpen: openState }
43
+ );
44
+ const {
45
+ popoverProps,
46
+ underlayProps,
47
+ arrowProps: arrowPropsCommon,
48
+ placement
49
+ } = usePopover(
50
+ {
51
+ ...props,
52
+ offset,
53
+ isNonModal,
54
+ crossOffset,
55
+ containerPadding,
56
+ popoverRef: domRef,
57
+ arrowBoundaryOffset,
58
+ maxHeight: maxBlockSize,
59
+ placement: placementProp,
60
+ shouldCloseOnInteractOutside,
61
+ triggerRef: anchorRef || controlRef,
62
+ isKeyboardDismissDisabled: disableExitOnEscapeKeyDown
63
+ },
64
+ { ...state, isOpen: openState || opened }
65
+ );
66
+ const resolvedChildren = () => {
67
+ if (typeof children === "function")
68
+ return cloneElement(children({ close: state.close }), overlayProps);
69
+ if (isValidElement(children)) return cloneElement(children, overlayProps);
70
+ return children;
71
+ };
72
+ const arrowProps = mergeProps(
73
+ { className: s.arrow },
74
+ arrowPropsCommon,
75
+ slotProps?.arrow
76
+ );
77
+ const dialogProps = mergeProps(
78
+ {
79
+ role: "dialog",
80
+ hideCloseButton,
81
+ className: s.dialog,
82
+ onClose: state.close
83
+ },
84
+ slotProps?.dialog
85
+ );
86
+ const backdropProps = mergeProps(
87
+ { className: s.underlay },
88
+ slotProps?.backdrop,
89
+ underlayProps
90
+ );
91
+ const transitionProps = mergeProps(
92
+ {
93
+ timeout: 120,
94
+ onEnter: on,
95
+ onExited: off,
96
+ appear: true,
97
+ in: openState,
98
+ nodeRef: domRef,
99
+ unmountOnExit: true
100
+ },
101
+ slotProps?.transition
102
+ );
103
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
104
+ control?.({
105
+ ref: controlRef,
106
+ ...triggerProps
107
+ }),
108
+ /* @__PURE__ */ jsx(Transition, { ...transitionProps, children: (transition) => /* @__PURE__ */ jsxs(
109
+ Overlay,
110
+ {
111
+ portalContainer,
112
+ disableFocusManagement,
113
+ children: [
114
+ /* @__PURE__ */ jsx("div", { ...backdropProps }),
115
+ /* @__PURE__ */ jsxs(
116
+ "div",
117
+ {
118
+ ref: domRef,
119
+ "data-size": size,
120
+ "data-arrow": showArrow,
121
+ "data-placement": placement,
122
+ "data-transition": transition,
123
+ className: clsx(s.base, s[size], className),
124
+ ...mergeProps(popoverProps, other),
125
+ style: {
126
+ ...popoverProps.style,
127
+ "--popover-inline-size": normalizeInlineSize(size)
128
+ },
129
+ children: [
130
+ showArrow && /* @__PURE__ */ jsx("div", { ...arrowProps, "data-placement": placement }),
131
+ /* @__PURE__ */ jsx("div", { className: s.container, children: type === "dialog" ? /* @__PURE__ */ jsx(Dialog, { ...dialogProps, children: resolvedChildren() }) : resolvedChildren() })
132
+ ]
133
+ }
134
+ )
135
+ ]
136
+ }
137
+ ) })
138
+ ] });
139
+ };
140
+ export {
141
+ PopoverInner
142
+ };
@@ -33,5 +33,5 @@ export type RadioGroupBaseProps = ExtendableProps<{
33
33
  defaultValue?: UseRadioGroupProps['defaultValue'];
34
34
  /** Handler that is called when the value changes. */
35
35
  onChange?: UseRadioGroupProps['onChange'];
36
- }, UseRadioGroupProps>;
36
+ }, Omit<UseRadioGroupProps, 'validationBehavior' | 'validate' | 'validationState'>>;
37
37
  export type RadioGroupProps = ExtendableComponentPropsWithRef<RadioGroupBaseProps, 'div'>;
@@ -4,9 +4,9 @@ import { deprecate } from "@koobiq/logger";
4
4
  import { useDOMRef, useBoolean, useElementSize, mergeProps, clsx } from "@koobiq/react-core";
5
5
  import { IconChevronDownS16 } from "@koobiq/react-icons";
6
6
  import { useSelectState, removeDataAttributes, useSelect, HiddenSelect } from "@koobiq/react-primitives";
7
+ import { PopoverInner } from "../Popover/PopoverInner.js";
7
8
  import s from "./Select.module.css.js";
8
9
  import { FieldSelect } from "../FieldComponents/FieldSelect/FieldSelect.js";
9
- import { PopoverInner } from "../Popover/Popover.js";
10
10
  import { ListInner } from "../List/List.js";
11
11
  import { FieldControl } from "../FieldComponents/FieldControl/FieldControl.js";
12
12
  import { FieldLabel } from "../FieldComponents/FieldLabel/FieldLabel.js";
@@ -4,7 +4,7 @@ export declare const Textarea: import("react").ForwardRefExoticComponent<Omit<{
4
4
  required?: boolean;
5
5
  hiddenLabel?: boolean;
6
6
  readonly?: boolean;
7
- } & Omit<import("@koobiq/react-primitives").TextFieldProps<HTMLTextAreaElement>, "children" | "style" | "className" | "validationBehavior" | "validate" | "description" | "inputElementType">, "caption" | "label" | "className" | "cols" | "rows" | "isDisabled" | "variant" | "slotProps" | "fullWidth" | "data-testid" | "isInvalid" | "isReadOnly" | "isRequired" | "errorMessage" | "isLabelHidden" | "expand"> & {
7
+ } & Omit<import("@koobiq/react-primitives").TextFieldProps<HTMLTextAreaElement>, "children" | "style" | "className" | "validationState" | "validationBehavior" | "validate" | "description" | "inputElementType">, "caption" | "label" | "className" | "cols" | "rows" | "isDisabled" | "variant" | "slotProps" | "fullWidth" | "data-testid" | "isInvalid" | "isReadOnly" | "isRequired" | "errorMessage" | "isLabelHidden" | "expand"> & {
8
8
  label?: import("react").ReactNode;
9
9
  className?: string;
10
10
  variant?: import("./types").TextareaPropVariant;
@@ -112,6 +112,6 @@ export type TextareaProps = ExtendableProps<{
112
112
  textarea?: FieldInputProps<'textarea'>;
113
113
  errorMessage?: FieldErrorProps;
114
114
  };
115
- }, TextareaDeprecatedProps & Omit<TextFieldProps<HTMLTextAreaElement>, 'description' | 'validationBehavior' | 'validate' | 'children' | 'style' | 'className' | 'inputElementType'>>;
115
+ }, TextareaDeprecatedProps & Omit<TextFieldProps<HTMLTextAreaElement>, 'description' | 'validationBehavior' | 'validationState' | 'validate' | 'children' | 'style' | 'className' | 'inputElementType'>>;
116
116
  export type TextareaRef = ComponentRef<'textarea'>;
117
117
  export {};
@@ -31,6 +31,7 @@ export * from './ButtonToggleGroup';
31
31
  export * from './TagGroup';
32
32
  export * from './Table';
33
33
  export * from './Calendar';
34
+ export * from './DateInput';
34
35
  export * from './layout';
35
- export { useListData } from '@koobiq/react-primitives';
36
+ export { useListData, useDateFormatter, type DateFormatterOptions, } from '@koobiq/react-primitives';
36
37
  export { useRouter, RouterProvider } from '@koobiq/react-primitives';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { RouterProvider, useListData, useLocale, useRouter } from "@koobiq/react-primitives";
2
+ import { RouterProvider, useDateFormatter, useListData, useLocale, useRouter } from "@koobiq/react-primitives";
3
3
  import { Provider, defaultBreakpoints } from "./components/Provider/Provider.js";
4
4
  import { BreakpointsProvider } from "./components/Provider/BreakpointsProvider.js";
5
5
  import { ProviderContext, useProvider } from "./components/Provider/ProviderContext.js";
@@ -50,7 +50,7 @@ import { ModalContent, ModalFooter, ModalHeader } from "./components/Modal/index
50
50
  import { SidePanel } from "./components/SidePanel/SidePanel.js";
51
51
  import { sidePanelPropPosition, sidePanelPropSize } from "./components/SidePanel/types.js";
52
52
  import { SidePanelContent, SidePanelFooter, SidePanelHeader } from "./components/SidePanel/index.js";
53
- import { Popover, PopoverInner } from "./components/Popover/Popover.js";
53
+ import { Popover } from "./components/Popover/Popover.js";
54
54
  import { popoverPropPlacement, popoverPropSize, popoverPropType } from "./components/Popover/types.js";
55
55
  import { PopoverContent, PopoverFooter, PopoverHeader } from "./components/Popover/index.js";
56
56
  import { Tooltip } from "./components/Tooltip/Tooltip.js";
@@ -73,6 +73,8 @@ import { Tag } from "./components/TagGroup/Tag.js";
73
73
  import { tagGroupPropVariant } from "./components/TagGroup/types.js";
74
74
  import { Table } from "./components/Table/Table.js";
75
75
  import { Calendar } from "./components/Calendar/Calendar.js";
76
+ import { DateInput, DateInputRender } from "./components/DateInput/DateInput.js";
77
+ import { dateInputPropVariant } from "./components/DateInput/types.js";
76
78
  import { flex, flexPropAlignItems, flexPropDirection, flexPropFlex, flexPropGap, flexPropJustifyContent, flexPropOrder, flexPropWrap } from "./components/layout/flex/flex.js";
77
79
  import { spacing, spacingGap } from "./components/layout/spacing/spacing.js";
78
80
  export {
@@ -87,6 +89,8 @@ export {
87
89
  Calendar,
88
90
  Checkbox,
89
91
  Container,
92
+ DateInput,
93
+ DateInputRender,
90
94
  Divider,
91
95
  FlexBox,
92
96
  Grid,
@@ -109,7 +113,6 @@ export {
109
113
  PopoverContent,
110
114
  PopoverFooter,
111
115
  PopoverHeader,
112
- PopoverInner,
113
116
  ProgressBar,
114
117
  ProgressSpinner,
115
118
  Provider,
@@ -142,6 +145,7 @@ export {
142
145
  checkboxPropSize,
143
146
  containerMarginsProp,
144
147
  containerPositionProp,
148
+ dateInputPropVariant,
145
149
  defaultBreakpoints,
146
150
  dividerPropDisplay,
147
151
  dividerPropOrientation,
@@ -187,6 +191,7 @@ export {
187
191
  typographyPropDisplay,
188
192
  typographyPropVariant,
189
193
  useBreakpoints,
194
+ useDateFormatter,
190
195
  useListData,
191
196
  useLocale,
192
197
  useMatchedBreakpoints,
package/dist/style.css CHANGED
@@ -3750,6 +3750,113 @@
3750
3750
  color: var(--kbq-states-foreground-disabled);
3751
3751
  cursor: not-allowed;
3752
3752
  }
3753
+ .kbq-dateinput-a4c39b {
3754
+ min-inline-size: 150px;
3755
+ }
3756
+ .kbq-fieldinputdate-a54331 {
3757
+ --field-input-outline-width: var(--kbq-size-3xs);
3758
+ --field-input-color: var(--kbq-foreground-contrast);
3759
+ --field-input-border-color: var(--kbq-line-contrast-fade);
3760
+ --field-input-outline-color: var(--kbq-states-line-focus-theme);
3761
+ --field-input-bg-color: var(--kbq-background-bg);
3762
+ --field-input-placeholder-color: var(--kbq-foreground-contrast-tertiary);
3763
+ cursor: pointer;
3764
+ outline-offset: -1px;
3765
+ box-sizing: border-box;
3766
+ inline-size: 100%;
3767
+ block-size: var(--kbq-size-3xl);
3768
+ border-radius: var(--kbq-size-s);
3769
+ color: var(--field-input-color);
3770
+ background: var(--field-input-bg-color);
3771
+ border: 1px solid var(--field-input-border-color);
3772
+ outline: var(--field-input-outline-width) solid transparent;
3773
+ padding-block: var(--field-input-padding-block-start) var(--field-input-padding-block-end);
3774
+ padding-inline: var(--field-input-padding-inline-start) var(--field-input-padding-inline-end);
3775
+ font-size: var(--kbq-typography-text-normal-font-size);
3776
+ font-weight: var(--kbq-typography-text-normal-font-weight);
3777
+ line-height: var(--kbq-typography-text-normal-line-height);
3778
+ font-family: var(--kbq-typography-text-normal-font-family);
3779
+ font-style: var(--kbq-typography-text-normal-font-style);
3780
+ text-transform: var(--kbq-typography-text-normal-text-transform);
3781
+ font-feature-settings: var(--kbq-typography-text-normal-font-feature-settings);
3782
+ letter-spacing: var(--kbq-typography-text-normal-letter-spacing);
3783
+ text-underline-offset: calc(( var(--kbq-typography-text-normal-line-height) - var(--kbq-typography-text-normal-font-size)) / 2);
3784
+ transition: color var(--kbq-transition-default), outline-color var(--kbq-transition-default), background-color var(--kbq-transition-default), border-color var(--kbq-transition-default);
3785
+ align-items: center;
3786
+ display: flex;
3787
+ }
3788
+
3789
+ .kbq-fieldinputdate-a54331:focus-within {
3790
+ outline-color: var(--field-input-outline-color);
3791
+ }
3792
+
3793
+ .kbq-fieldinputdate-transparent-04d912 {
3794
+ --field-input-color: var(--kbq-foreground-contrast);
3795
+ --field-input-border-color: transparent;
3796
+ --field-input-outline-color: transparent;
3797
+ --field-input-bg-color: transparent;
3798
+ --field-input-placeholder-color: var(--kbq-foreground-contrast-tertiary);
3799
+ }
3800
+
3801
+ .kbq-fieldinputdate-filled-02db7d {
3802
+ --field-input-color: var(--kbq-foreground-contrast);
3803
+ --field-input-border-color: var(--kbq-line-contrast-fade);
3804
+ --field-input-outline-color: var(--kbq-states-line-focus-theme);
3805
+ --field-input-bg-color: var(--kbq-background-bg);
3806
+ --field-input-placeholder-color: var(--kbq-foreground-contrast-tertiary);
3807
+ }
3808
+
3809
+ .kbq-fieldinputdate-filled-02db7d:where(.kbq-fieldinputdate-invalid-d764c6) {
3810
+ --field-input-color: var(--kbq-foreground-error);
3811
+ --field-input-border-color: var(--kbq-line-error);
3812
+ --field-input-outline-color: var(--kbq-states-line-focus-error);
3813
+ --field-input-bg-color: var(--kbq-states-background-error-less);
3814
+ --field-input-placeholder-color: var(--kbq-foreground-error-tertiary);
3815
+ }
3816
+
3817
+ .kbq-fieldinputdate-transparent-04d912:where(.kbq-fieldinputdate-invalid-d764c6) {
3818
+ --field-input-color: var(--kbq-foreground-error);
3819
+ --field-input-border-color: transparent;
3820
+ --field-input-outline-color: transparent;
3821
+ --field-input-bg-color: transparent;
3822
+ --field-input-placeholder-color: var(--kbq-foreground-error-tertiary);
3823
+ }
3824
+
3825
+ .kbq-fieldinputdate-disabled-692832 {
3826
+ cursor: not-allowed;
3827
+ }
3828
+
3829
+ .kbq-fieldinputdate-filled-02db7d:where(.kbq-fieldinputdate-disabled-692832) {
3830
+ --field-input-color: var(--kbq-states-foreground-disabled);
3831
+ --field-input-border-color: var(--kbq-states-line-disabled);
3832
+ --field-input-bg-color: var(--kbq-states-background-disabled);
3833
+ }
3834
+
3835
+ .kbq-fieldinputdate-transparent-04d912:where(.kbq-fieldinputdate-disabled-692832) {
3836
+ --field-input-color: var(--kbq-states-foreground-disabled);
3837
+ }
3838
+ .kbq-dateinputsegment-996e10 {
3839
+ --date-input-segment-color: var(--field-input-color);
3840
+ color: var(--date-input-segment-color);
3841
+ }
3842
+
3843
+ .kbq-dateinputsegment-996e10:focus {
3844
+ color: var(--date-input-segment-color);
3845
+ background-color: highlight;
3846
+ outline: none;
3847
+ }
3848
+
3849
+ .kbq-dateinputsegment-placeholder-be1df1 {
3850
+ color: var(--field-input-placeholder-color);
3851
+ }
3852
+
3853
+ .kbq-dateinputsegment-literal-d722fc {
3854
+ white-space: pre;
3855
+ }
3856
+
3857
+ .kbq-dateinputsegment-literal-d722fc:not(.kbq-dateinputsegment-hasValue-886d0f) {
3858
+ color: var(--field-input-placeholder-color);
3859
+ }
3753
3860
  .kbq-spacing-mbs_0-be7021 {
3754
3861
  margin-block-start: 0;
3755
3862
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koobiq/react-components",
3
- "version": "0.0.1-beta.32",
3
+ "version": "0.0.1-beta.34",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -27,10 +27,10 @@
27
27
  "@koobiq/design-tokens": "^3.12.1",
28
28
  "@types/react-transition-group": "^4.4.12",
29
29
  "react-transition-group": "^4.4.5",
30
- "@koobiq/logger": "0.0.1-beta.32",
31
- "@koobiq/react-core": "0.0.1-beta.32",
32
- "@koobiq/react-primitives": "0.0.1-beta.32",
33
- "@koobiq/react-icons": "0.0.1-beta.32"
30
+ "@koobiq/react-core": "0.0.1-beta.34",
31
+ "@koobiq/react-icons": "0.0.1-beta.34",
32
+ "@koobiq/react-primitives": "0.0.1-beta.34",
33
+ "@koobiq/logger": "0.0.1-beta.34"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@koobiq/design-tokens": "^3.11.2",