@nild/components 0.0.52 → 0.0.54

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 (31) hide show
  1. package/dist/_shared/contexts/index.d.ts +1 -0
  2. package/dist/_shared/contexts/portal-container/__tests__/index.test.d.ts +0 -0
  3. package/dist/_shared/contexts/portal-container/index.d.ts +5 -0
  4. package/dist/_shared/contexts/portal-container/index.js +1 -0
  5. package/dist/alert/interfaces/index.d.ts +20 -0
  6. package/dist/button/interfaces/index.d.ts +24 -0
  7. package/dist/checkbox/interfaces/index.d.ts +33 -0
  8. package/dist/divider/interfaces/index.d.ts +10 -0
  9. package/dist/field/interfaces/index.d.ts +28 -0
  10. package/dist/form/interfaces/index.d.ts +32 -0
  11. package/dist/input/interfaces/index.d.ts +76 -0
  12. package/dist/modal/Portal.js +1 -1
  13. package/dist/modal/hooks/useModalFocusScope.d.ts +2 -1
  14. package/dist/modal/hooks/useModalFocusScope.js +1 -1
  15. package/dist/modal/hooks/useModalStack.d.ts +1 -1
  16. package/dist/modal/hooks/useModalStack.js +1 -1
  17. package/dist/modal/interfaces/index.d.ts +64 -0
  18. package/dist/popover/interfaces/index.d.ts +17 -0
  19. package/dist/popup/Portal.js +1 -1
  20. package/dist/popup/interfaces/index.d.ts +31 -0
  21. package/dist/popup/style/index.js +1 -1
  22. package/dist/radio/interfaces/index.d.ts +33 -0
  23. package/dist/segment/interfaces/index.d.ts +20 -0
  24. package/dist/select/interfaces/index.d.ts +46 -0
  25. package/dist/switch/interfaces/index.d.ts +27 -0
  26. package/dist/tabs/interfaces/index.d.ts +36 -0
  27. package/dist/tailwind.css +1 -1
  28. package/dist/tooltip/interfaces/index.d.ts +16 -0
  29. package/dist/typography/interfaces/index.d.ts +23 -0
  30. package/dist/watermark/interfaces/index.d.ts +51 -0
  31. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export * from './portal-container';
@@ -0,0 +1,5 @@
1
+ export interface PortalContainerContextValue {
2
+ container: HTMLElement | null;
3
+ }
4
+ declare const PortalContainerProvider: import('react').Provider<PortalContainerContextValue>, usePortalContainerContext: () => PortalContainerContextValue;
5
+ export { PortalContainerProvider, usePortalContainerContext };
@@ -0,0 +1 @@
1
+ import{createContextSuite as t}from"@nild/shared";const[e,o]=t({defaultValue:{container:null}});export{e as PortalContainerProvider,o as usePortalContainerContext};
@@ -0,0 +1,20 @@
1
+ import { HTMLAttributes, MouseEvent, ReactNode } from 'react';
2
+ export type AlertType = 'info' | 'success' | 'warning' | 'error';
3
+
4
+ export interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
5
+ type?: AlertType;
6
+ closable?: boolean;
7
+ visible?: boolean;
8
+ defaultVisible?: boolean;
9
+ closeAriaLabel?: string;
10
+ onClose?: (event: MouseEvent<HTMLButtonElement>) => void;
11
+ children?: ReactNode;
12
+ }
13
+
14
+ export interface IconProps extends HTMLAttributes<HTMLSpanElement> {
15
+ children?: ReactNode;
16
+ }
17
+
18
+ export interface TitleProps extends HTMLAttributes<HTMLDivElement> {
19
+ children?: ReactNode;
20
+ }
@@ -0,0 +1,24 @@
1
+ import { ButtonHTMLAttributes, HTMLAttributes, ReactElement } from 'react';
2
+ export type ButtonVariant = 'solid' | 'outlined' | 'filled' | 'text';
3
+ export type ButtonSize = 'small' | 'medium' | 'large';
4
+ export type ButtonShape = 'round' | 'square';
5
+
6
+ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
7
+ variant?: ButtonVariant;
8
+ size?: ButtonSize;
9
+ shape?: ButtonShape;
10
+ equal?: boolean;
11
+ disabled?: boolean;
12
+ block?: boolean;
13
+ }
14
+
15
+ export type GroupDirection = 'horizontal' | 'vertical';
16
+
17
+ export interface GroupProps extends HTMLAttributes<HTMLDivElement> {
18
+ direction?: GroupDirection;
19
+ variant?: ButtonVariant;
20
+ size?: ButtonSize;
21
+ equal?: boolean;
22
+ disabled?: boolean;
23
+ children?: ReactElement<ButtonProps> | ReactElement<ButtonProps>[];
24
+ }
@@ -0,0 +1,33 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ export type CheckboxVariant = 'solid' | 'outlined';
3
+ export type CheckboxSize = 'small' | 'medium' | 'large';
4
+
5
+ export interface CheckboxProps extends Omit<HTMLAttributes<HTMLLabelElement>, 'onChange' | 'defaultValue'> {
6
+ variant?: CheckboxVariant;
7
+ size?: CheckboxSize;
8
+ disabled?: boolean;
9
+ checked?: boolean;
10
+ defaultChecked?: boolean;
11
+ value?: unknown;
12
+ onChange?: (checked: boolean) => void;
13
+ }
14
+
15
+ export interface IndicatorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
16
+ children?: (checked: boolean) => ReactNode;
17
+ }
18
+
19
+ export interface LabelProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
20
+ children?: ReactNode | ((checked: boolean) => ReactNode);
21
+ }
22
+
23
+ export type GroupDirection = 'horizontal' | 'vertical';
24
+
25
+ export interface GroupProps<T = unknown> extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {
26
+ direction?: GroupDirection;
27
+ variant?: CheckboxVariant;
28
+ size?: CheckboxSize;
29
+ disabled?: boolean;
30
+ value?: T[];
31
+ defaultValue?: T[];
32
+ onChange?: (value: T[]) => void;
33
+ }
@@ -0,0 +1,10 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export type DividerVariant = 'solid' | 'dashed' | 'dotted';
3
+ export type DividerDirection = 'horizontal' | 'vertical';
4
+ export type DividerAlign = 'left' | 'center' | 'right';
5
+
6
+ export interface DividerProps extends HTMLAttributes<HTMLDivElement> {
7
+ variant?: DividerVariant;
8
+ direction?: DividerDirection;
9
+ align?: DividerAlign;
10
+ }
@@ -0,0 +1,28 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ export type FieldStatus = 'success' | 'warning' | 'error';
3
+ export type FieldBind = 'value' | 'checked';
4
+
5
+ export interface FieldProps extends HTMLAttributes<HTMLDivElement> {
6
+ name?: string;
7
+ required?: boolean;
8
+ disabled?: boolean;
9
+ bind?: FieldBind;
10
+ children?: ReactNode;
11
+ }
12
+
13
+ export interface LabelProps extends HTMLAttributes<HTMLSpanElement> {
14
+ children?: ReactNode;
15
+ }
16
+
17
+ export interface HelperProps extends HTMLAttributes<HTMLDivElement> {
18
+ children?: ReactNode;
19
+ }
20
+
21
+ export interface StatusProps extends HTMLAttributes<HTMLDivElement> {
22
+ type?: FieldStatus;
23
+ children?: ReactNode;
24
+ }
25
+
26
+ export interface RequiredIndicatorProps extends HTMLAttributes<HTMLSpanElement> {
27
+ children?: ReactNode;
28
+ }
@@ -0,0 +1,32 @@
1
+ import { FormEvent, FormHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
2
+ export type ValidateTrigger = 'change' | 'submit';
3
+ export type FormValue = Record<string, unknown>;
4
+ export type FormIssue = ReactNode | { message: ReactNode };
5
+ export type FormIssueMap = Record<string, FormIssue | FormIssue[] | undefined>;
6
+
7
+ export interface FormResolverResult {
8
+ value?: FormValue;
9
+ errors?: FormIssueMap;
10
+ warnings?: FormIssueMap;
11
+ }
12
+
13
+ export type FormResolver = (value: FormValue) => FormResolverResult | Promise<FormResolverResult>;
14
+
15
+ export interface ActionsProps extends HTMLAttributes<HTMLDivElement> {
16
+ children?: ReactNode;
17
+ }
18
+
19
+ export interface FormProps
20
+ extends Omit<
21
+ FormHTMLAttributes<HTMLFormElement>,
22
+ 'children' | 'defaultValue' | 'onChange' | 'onInvalid' | 'onSubmit'
23
+ > {
24
+ children?: ReactNode;
25
+ defaultValue?: FormValue;
26
+ resolver?: FormResolver;
27
+ validateTrigger?: ValidateTrigger | ValidateTrigger[];
28
+ onChange?: (value: FormValue) => void;
29
+ onInvalid?: (errors: FormIssueMap, value: FormValue, evt: FormEvent<HTMLFormElement>) => void;
30
+ onSubmit?: (value: FormValue, evt: FormEvent<HTMLFormElement>) => void | Promise<void>;
31
+ disabled?: boolean;
32
+ }
@@ -0,0 +1,76 @@
1
+ import { InputHTMLAttributes, HTMLAttributes, FocusEvent, ChangeEvent, ReactElement, ReactNode, SyntheticEvent } from 'react';
2
+ export type InputVariant = 'outlined' | 'filled' | 'underlined';
3
+ export type InputSize = 'small' | 'medium' | 'large';
4
+
5
+ export interface InputProps
6
+ extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'value' | 'defaultValue' | 'onChange'> {
7
+ variant?: InputVariant;
8
+ size?: InputSize;
9
+ block?: boolean;
10
+ disabled?: boolean;
11
+ value?: string | number;
12
+ defaultValue?: string | number;
13
+ onChange?: (value: string | number, evt: ChangeEvent<HTMLInputElement>) => void;
14
+ }
15
+
16
+ export type PrefixProps = HTMLAttributes<HTMLSpanElement>;
17
+ export type SuffixProps = HTMLAttributes<HTMLSpanElement>;
18
+
19
+ export type PrependProps = HTMLAttributes<HTMLDivElement>;
20
+ export type AppendProps = HTMLAttributes<HTMLDivElement>;
21
+
22
+ export interface CompositeProps extends HTMLAttributes<HTMLDivElement> {
23
+ variant?: InputVariant;
24
+ size?: InputSize;
25
+ disabled?: boolean;
26
+ block?: boolean;
27
+ children?:
28
+ | ReactElement<PrependProps | InputProps | AppendProps>
29
+ | Array<ReactElement<PrependProps | InputProps | AppendProps>>;
30
+ }
31
+
32
+ export interface SearchProps extends Omit<InputProps, 'value' | 'defaultValue' | 'onChange'> {
33
+ value?: string;
34
+ defaultValue?: string;
35
+ keyword?: string;
36
+ defaultKeyword?: string;
37
+ onChange?: (value: string, evt: ChangeEvent<HTMLInputElement>) => void;
38
+ onSearch?: (value: string) => void;
39
+ }
40
+
41
+ export interface PasswordProps extends Omit<InputProps, 'value' | 'defaultValue' | 'onChange'> {
42
+ value?: string;
43
+ defaultValue?: string;
44
+ onChange?: (value: string, evt: ChangeEvent<HTMLInputElement>) => void;
45
+ visible?: boolean;
46
+ defaultVisible?: boolean;
47
+ onVisibleChange?: (visible: boolean) => void;
48
+ }
49
+
50
+ export interface OTPRef {
51
+ focus: (index?: number) => void;
52
+ blur: () => void;
53
+ }
54
+
55
+ export interface OTPProps
56
+ extends Omit<HTMLAttributes<HTMLSpanElement>, 'placeholder' | 'onFocus' | 'onChange'>,
57
+ Pick<InputProps, 'variant' | 'type' | 'block' | 'size' | 'disabled'> {
58
+ placeholder?: string[];
59
+ length?: number;
60
+ separator?: ReactNode | ((index: number) => ReactNode);
61
+ value?: string[];
62
+ defaultValue?: string[];
63
+ onFocus?: (index: number, evt: FocusEvent<HTMLInputElement>) => void;
64
+ onBlur?: (evt: FocusEvent<HTMLSpanElement>) => void;
65
+ onChange?: (value: string[], evt: SyntheticEvent) => void;
66
+ onComplete?: (value: string[], evt: SyntheticEvent) => void;
67
+ }
68
+
69
+ export interface NumberProps extends Omit<InputProps, 'value' | 'defaultValue' | 'onChange'> {
70
+ min?: number;
71
+ max?: number;
72
+ step?: number;
73
+ value?: number;
74
+ defaultValue?: number;
75
+ onChange?: (value: number | undefined, evt?: ChangeEvent<HTMLInputElement>) => void;
76
+ }
@@ -1 +1 @@
1
- import{jsxs as E,jsx as v}from"react/jsx-runtime";import{useEffectCallback as g,useScrollLock as T,useEventListener as B}from"@nild/hooks";import{cnMerge as n,mergeRefs as H}from"@nild/shared";import{forwardRef as V,useRef as q,isValidElement as A}from"react";import{createPortal as G}from"react-dom";import J from"../_shared/utils/get-owner-document/index.js";import K from"../_shared/utils/register-slots/index.js";import{isBodyElement as Q}from"./Body.js";import U,{isCloseElement as W}from"./Close.js";import{useModalContext as X}from"./contexts/index.js";import{isFooterElement as Y}from"./Footer.js";import{isHeaderElement as Z}from"./Header.js";import{useModalStack as _}from"./hooks/useModalStack.js";import{useModalFocusScope as $}from"./hooks/useModalFocusScope.js";import c from"./style/index.js";const ee=e=>A(e)&&e.type===m,ae=K({header:{isMatched:e=>Z(e)},body:{isMatched:e=>Q(e)},footer:{isMatched:e=>Y(e)},close:{isMatched:e=>W(e)}}),m=V(({className:e,style:h,children:M,container:d,overlayless:p=!1,overlayClassName:k,surfaceClassName:N,onTransitionEnd:x,...C},F)=>{const{open:s,variant:R,placement:f,size:z,closeOnEscape:w,closeOnOverlayClick:I,trapFocus:O,lockScroll:P,restoreFocus:S,accessibility:l,refs:u,updateOpen:b}=X(),t=q(null),a=J(d,t.current,u.trigger.current),r=d??a?.body??null,{zIndex:j,topmost:i}=_(a,!!r),D=g(()=>{p||!s||!I||!i||b(!1)}),L=g(y=>{!s||!i||y.key==="Escape"&&w&&(y.preventDefault(),b(!1))});if(T(a,P&&!!r),$({open:s,trapFocus:O,restoreFocus:S,topmost:i,ownerDocument:a,surfaceRef:t,triggerRef:u.trigger}),B(a,"keydown",L),!r)return null;const{slots:o}=ae(M);return G(E("div",{className:n(c.portal({placement:f}),e),style:{zIndex:j,...h},...C,children:[!p&&v("div",{className:n(c.overlay(),k),onClick:D}),E("div",{ref:H(t,F),className:n(c.surface({variant:R,placement:f,size:z}),N),"aria-describedby":l["aria-describedby"],"aria-label":l["aria-label"],"aria-labelledby":l["aria-labelledby"],"aria-modal":"true",role:"dialog",tabIndex:-1,onTransitionEnd:x,children:[o.header.el,o.body.el,o.footer.el,o.close.el??v(U,{})]})]}),r)});m.displayName="Modal.Portal";export{m as default,ee as isPortalElement};
1
+ import{jsx as n,jsxs as h}from"react/jsx-runtime";import{useRefState as q,useEffectCallback as g,useScrollLock as A,useEventListener as G}from"@nild/hooks";import{cnMerge as m,mergeRefs as J}from"@nild/shared";import{forwardRef as K,useRef as Q,useMemo as U,isValidElement as W}from"react";import{createPortal as X}from"react-dom";import{PortalContainerProvider as Y}from"../_shared/contexts/portal-container/index.js";import Z from"../_shared/utils/get-owner-document/index.js";import _ from"../_shared/utils/register-slots/index.js";import{isBodyElement as $}from"./Body.js";import ee,{isCloseElement as ae}from"./Close.js";import{useModalContext as re}from"./contexts/index.js";import{isFooterElement as oe}from"./Footer.js";import{isHeaderElement as se}from"./Header.js";import{useModalStack as te}from"./hooks/useModalStack.js";import{useModalFocusScope as le}from"./hooks/useModalFocusScope.js";import c from"./style/index.js";const ie=e=>W(e)&&e.type===d,ne=_({header:{isMatched:e=>se(e)},body:{isMatched:e=>$(e)},footer:{isMatched:e=>oe(e)},close:{isMatched:e=>ae(e)}}),d=K(({className:e,style:M,children:k,container:p,overlayless:f=!1,overlayClassName:C,surfaceClassName:N,onTransitionEnd:x,...F},R)=>{const{open:s,variant:P,placement:u,size:z,closeOnEscape:O,closeOnOverlayClick:S,trapFocus:w,lockScroll:I,restoreFocus:j,accessibility:t,refs:y,updateOpen:b}=re(),l=Q(null),[v,D,L]=q(null),a=Z(p,l.current,y.trigger.current),r=p??a?.body??null,{zIndex:T,topmost:i}=te(a,!!r),B=U(()=>({container:v}),[v]),H=g(()=>{f||!s||!S||!i||b(!1)}),V=g(E=>{!s||!i||E.key==="Escape"&&O&&(E.preventDefault(),b(!1))});if(A(a,I&&!!r),le({open:s,trapFocus:w,restoreFocus:j,topmost:i,ownerDocument:a,portalContainerRef:L,surfaceRef:l,triggerRef:y.trigger}),G(a,"keydown",V),!r)return null;const{slots:o}=ne(k);return X(n(Y,{value:B,children:h("div",{ref:D,className:m(c.portal({placement:u}),e),style:{zIndex:T,...M},...F,children:[!f&&n("div",{className:m(c.overlay(),C),onClick:H}),h("div",{ref:J(l,R),className:m(c.surface({variant:P,placement:u,size:z}),N),"aria-describedby":t["aria-describedby"],"aria-label":t["aria-label"],"aria-labelledby":t["aria-labelledby"],"aria-modal":"true",role:"dialog",tabIndex:-1,onTransitionEnd:x,children:[o.header.el,o.body.el,o.footer.el,o.close.el??n(ee,{})]})]})}),r)});d.displayName="Modal.Portal";export{d as default,ie as isPortalElement};
@@ -5,8 +5,9 @@ interface UseModalFocusScopeOptions {
5
5
  restoreFocus: boolean;
6
6
  topmost: boolean;
7
7
  ownerDocument: Document | null;
8
+ portalContainerRef?: RefObject<HTMLElement>;
8
9
  surfaceRef: RefObject<HTMLElement>;
9
10
  triggerRef: RefObject<Element>;
10
11
  }
11
- export declare const useModalFocusScope: ({ open, trapFocus, restoreFocus, topmost, ownerDocument, surfaceRef, triggerRef, }: UseModalFocusScopeOptions) => void;
12
+ export declare const useModalFocusScope: ({ open, trapFocus, restoreFocus, topmost, ownerDocument, portalContainerRef, surfaceRef, triggerRef, }: UseModalFocusScopeOptions) => void;
12
13
  export {};
@@ -1 +1 @@
1
- import{useTimeout as C,useEffectCallback as h,useIsomorphicLayoutEffect as w,useEventListener as y}from"@nild/hooks";import{useRef as E,useEffect as g}from"react";const K=["a[href]","area[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","iframe","summary",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),S=e=>{const n=e.ownerDocument.defaultView;if(!n)return!e.hidden;const u=n.getComputedStyle(e);return u.display!=="none"&&u.visibility!=="hidden"&&!e.hidden},x=e=>Array.from(e.querySelectorAll(K)).filter(n=>!n.hasAttribute("disabled")&&n.getAttribute("aria-hidden")!=="true"&&n.tabIndex>=0&&S(n)),p=(e,n=!1)=>{const u=x(e).at(n?-1:0)??e;return u.focus(),u},k=(e,n)=>{var u;const c=e!=null&&e.isConnected?e:n!=null&&n.isConnected?n:null;(u=c?.focus)==null||u.call(c)},F=({open:e,trapFocus:n,restoreFocus:u,topmost:c,ownerDocument:o,surfaceRef:a,triggerRef:b})=>{const v=E(null),i=E(e),d=C(()=>{const t=a.current;if(!t||!c)return;const r=o?.activeElement;(!r||!t.contains(r))&&p(t)},0),D=h(t=>{const r=a.current;if(!r||!e||!c||t.key!=="Tab"||!n)return;const s=x(r),l=o?.activeElement;if(s.length===0){t.preventDefault(),r.focus();return}if(!l||!r.contains(l)){t.preventDefault(),p(r,t.shiftKey);return}const f=s[0],m=s.at(-1);t.shiftKey&&l===f?(t.preventDefault(),m?.focus()):!t.shiftKey&&l===m&&(t.preventDefault(),f?.focus())}),A=h(t=>{const r=a.current,s=t.target;!r||!n||!e||!c||!s||r.contains(s)||p(r)});g(()=>{const t=i.current;e&&!t&&(v.current=o?.activeElement),i.current=e},[e,o]),g(()=>{const t=b.current;return()=>{!u||i.current||k(v.current,t)}},[u,b]),w(()=>{if(e)return d.run(),d.cancel},[d,e,o,a,c]),y(o,"keydown",D),y(o,"focusin",A)};export{F as useModalFocusScope};
1
+ import{useTimeout as F,useEffectCallback as E,useIsomorphicLayoutEffect as K,useEventListener as g}from"@nild/hooks";import{useRef as D,useEffect as A}from"react";const R=["a[href]","area[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","iframe","summary",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),S=e=>{const n=e.ownerDocument.defaultView;if(!n)return!e.hidden;const o=n.getComputedStyle(e);return o.display!=="none"&&o.visibility!=="hidden"&&!e.hidden},C=e=>Array.from(e.querySelectorAll(R)).filter(n=>!n.hasAttribute("disabled")&&n.getAttribute("aria-hidden")!=="true"&&n.tabIndex>=0&&S(n)),b=(e,n=!1)=>{const o=C(e).at(n?-1:0)??e;return o.focus(),o},k=(e,n)=>{var o;const a=e!=null&&e.isConnected?e:n!=null&&n.isConnected?n:null;(o=a?.focus)==null||o.call(a)},I=({open:e,trapFocus:n,restoreFocus:o,topmost:a,ownerDocument:u,portalContainerRef:i,surfaceRef:s,triggerRef:h})=>{const y=D(null),d=D(e),m=F(()=>{const t=s.current;if(!t||!a)return;const r=u?.activeElement;(!r||!t.contains(r))&&b(t)},0),w=E(t=>{const r=s.current,c=i?.current??r;if(!r||!c||!e||!a||t.key!=="Tab"||!n)return;const l=C(r),f=u?.activeElement;if(l.length===0){t.preventDefault(),r.focus();return}if(!f||!c.contains(f)){t.preventDefault(),b(r,t.shiftKey);return}const p=l[0],v=l.at(-1);t.shiftKey&&f===p?(t.preventDefault(),v?.focus()):!t.shiftKey&&f===v&&(t.preventDefault(),p?.focus())}),x=E(t=>{const r=s.current,c=i?.current??r,l=t.target;!r||!c||!n||!e||!a||!l||c.contains(l)||b(r)});A(()=>{const t=d.current;e&&!t&&(y.current=u?.activeElement),d.current=e},[e,u]),A(()=>{const t=h.current;return()=>{!o||d.current||k(y.current,t)}},[o,h]),K(()=>{if(e)return m.run(),m.cancel},[m,e,u,s,a]),g(u,"keydown",w),g(u,"focusin",x)};export{I as useModalFocusScope};
@@ -1,4 +1,4 @@
1
1
  export declare const useModalStack: (ownerDocument: Document | null, present: boolean) => {
2
- zIndex: number;
2
+ zIndex: string;
3
3
  topmost: boolean;
4
4
  };
@@ -1 +1 @@
1
- import{useRef as l,useEffect as m,useSyncExternalStore as S}from"react";import{getModalStackStore as d,EMPTY_MODAL_STACK as u}from"../_shared/stack.js";const f=40,i=(e,o)=>{const r=l(Symbol("modal")),t=e?d(e):null;m(()=>{if(!(!o||!t))return t.mount(r.current)},[o,t]);const n=S(c=>t?.subscribe(c)??(()=>{}),()=>t?.getSnapshot()??u,()=>u),s=n.indexOf(r.current),a=n.at(-1)===r.current;return{zIndex:f+(s===-1?0:s),topmost:a}};export{i as useModalStack};
1
+ import{useRef as m,useEffect as d,useSyncExternalStore as i}from"react";import{getModalStackStore as S,EMPTY_MODAL_STACK as s}from"../_shared/stack.js";const n="var(--z-index-modal)",f=o=>o<=0?n:`calc(${n} + ${o})`,p=(o,e)=>{const r=m(Symbol("modal")),t=o?S(o):null;d(()=>{if(!(!e||!t))return t.mount(r.current)},[e,t]);const a=i(l=>t?.subscribe(l)??(()=>{}),()=>t?.getSnapshot()??s,()=>s),u=a.indexOf(r.current),c=a.at(-1)===r.current;return{zIndex:f(u),topmost:c}};export{p as useModalStack};
@@ -0,0 +1,64 @@
1
+ import { ButtonProps } from '../../button';
2
+ import { HTMLAttributes, ReactNode } from 'react';
3
+ export type ModalPlacement = 'center' | 'left' | 'right' | 'top' | 'bottom';
4
+ export type ModalSize = 'small' | 'medium' | 'large' | 'full';
5
+ export type ModalVariant = 'dialog' | 'drawer';
6
+ export type DrawerPlacement = Exclude<ModalPlacement, 'center'>;
7
+
8
+ export interface TriggerProps {
9
+ children?: ReactNode;
10
+ }
11
+
12
+ export interface PortalProps
13
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'aria-label' | 'aria-labelledby' | 'aria-describedby'> {
14
+ children?: ReactNode;
15
+ container?: Element | DocumentFragment;
16
+ overlayless?: boolean;
17
+ overlayClassName?: string;
18
+ surfaceClassName?: string;
19
+ }
20
+
21
+ export interface HeaderProps extends HTMLAttributes<HTMLDivElement> {
22
+ children?: ReactNode;
23
+ }
24
+
25
+ export interface BodyProps extends HTMLAttributes<HTMLDivElement> {
26
+ children?: ReactNode;
27
+ }
28
+
29
+ export interface FooterProps extends HTMLAttributes<HTMLDivElement> {
30
+ children?: ReactNode;
31
+ }
32
+
33
+ export type CloseProps = ButtonProps;
34
+
35
+ export interface ModalCommonProps {
36
+ children?: ReactNode;
37
+ size?: ModalSize;
38
+ open?: boolean;
39
+ defaultOpen?: boolean;
40
+ disabled?: boolean;
41
+ closeOnEscape?: boolean;
42
+ closeOnOverlayClick?: boolean;
43
+ trapFocus?: boolean;
44
+ restoreFocus?: boolean;
45
+ lockScroll?: boolean;
46
+ 'aria-label'?: string;
47
+ 'aria-labelledby'?: string;
48
+ 'aria-describedby'?: string;
49
+ onOpen?: () => void;
50
+ onClose?: () => void;
51
+ }
52
+
53
+ export interface DialogProps extends ModalCommonProps {
54
+ variant?: 'dialog';
55
+ placement?: 'center';
56
+ }
57
+
58
+ export interface DrawerProps extends ModalCommonProps {
59
+ variant: 'drawer';
60
+ placement?: DrawerPlacement;
61
+ }
62
+
63
+ export type ModalProps = DialogProps | DrawerProps;
64
+ export type ModalAccessibility = Pick<ModalCommonProps, 'aria-label' | 'aria-labelledby' | 'aria-describedby'>;
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from 'react';
2
+ import { PopupSize, TriggerAction } from '../../popup';
3
+ import { OffsetOptions, Placement } from '@floating-ui/dom';
4
+ export interface PopoverProps {
5
+ children?: ReactNode;
6
+ placement?: Placement;
7
+ offset?: OffsetOptions;
8
+ action?: TriggerAction | TriggerAction[];
9
+ arrowed?: boolean;
10
+ size?: PopupSize;
11
+ delay?: number | [number] | [number, number];
12
+ open?: boolean;
13
+ defaultOpen?: boolean;
14
+ disabled?: boolean;
15
+ onOpen?: () => void;
16
+ onClose?: () => void;
17
+ }
@@ -1 +1 @@
1
- import{jsxs as P,jsx as g}from"react/jsx-runtime";import{useEffectCallback as t}from"@nild/hooks";import{mergeRefs as h,cnMerge as n,getDPR as R}from"@nild/shared";import{forwardRef as b,Children as j,isValidElement as w,cloneElement as z}from"react";import{createPortal as L}from"react-dom";import $ from"./Arrow.js";import{usePopupContext as k,usePortalContext as A}from"./contexts/index.js";import m from"./style/index.js";const i=b(({className:p,style:f,children:u,container:c=document.body,...o},d)=>{var s;const{size:v,inverse:x,refs:y,enter:C,leave:E}=k(),{coords:l}=A(),e=j.toArray(u).find(r=>w(r)),M=t(r=>{var a;(a=o?.onMouseEnter)==null||a.call(o,r),C()}),N=t(r=>{var a;(a=o?.onMouseLeave)==null||a.call(o,r),E()});return e?L(P("div",{...o,className:n(m.portal(),p),style:{transform:`translate(${l.x}px, ${l.y}px)`,...R()>=1.5&&{willChange:"transform"},...f},onMouseEnter:M,onMouseLeave:N,ref:h(y.portal,d),children:[z(e,{...e.props,className:n(m.portalContent({size:v,inverse:x}),(s=e?.props)==null?void 0:s.className)}),g($,{})]}),c):null});i.displayName="Popup.Portal";export{i as default};
1
+ import{jsxs as R,jsx as b}from"react/jsx-runtime";import{useEffectCallback as p}from"@nild/hooks";import{mergeRefs as j,cnMerge as u,getDPR as w}from"@nild/shared";import{forwardRef as z,Children as L,isValidElement as $,cloneElement as k}from"react";import{createPortal as A}from"react-dom";import{usePortalContainerContext as D}from"../_shared/contexts/portal-container/index.js";import V from"../_shared/utils/get-owner-document/index.js";import q from"./Arrow.js";import{usePopupContext as B,usePortalContext as F}from"./contexts/index.js";import f from"./style/index.js";const c=z(({className:d,style:v,children:x,container:s,...e},C)=>{var t;const{size:y,inverse:P,refs:l,enter:g,leave:E}=B(),{coords:n}=F(),M=D(),r=L.toArray(x).find(a=>$(a)),i=V(s,l.trigger.current),m=s??M.container??i?.body??null,N=p(a=>{var o;(o=e?.onMouseEnter)==null||o.call(e,a),g()}),h=p(a=>{var o;(o=e?.onMouseLeave)==null||o.call(e,a),E()});return!r||!m?null:A(R("div",{...e,className:u(f.portal(),d),style:{transform:`translate(${n.x}px, ${n.y}px)`,...w()>=1.5&&{willChange:"transform"},...v},onMouseEnter:N,onMouseLeave:h,ref:j(l.portal,C),children:[k(r,{...r.props,className:u(f.portalContent({size:y,inverse:P}),(t=r?.props)==null?void 0:t.className)}),b(q,{})]}),m)});c.displayName="Popup.Portal";export{c as default};
@@ -0,0 +1,31 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ import { OffsetOptions, Placement } from '@floating-ui/dom';
3
+ export type ArrowOrientation = 'up' | 'down' | 'left' | 'right';
4
+
5
+ export type TriggerAction = 'click' | 'hover' | 'focus' | 'contextMenu';
6
+
7
+ export interface TriggerProps {
8
+ children?: ReactNode;
9
+ }
10
+
11
+ export interface PortalProps extends HTMLAttributes<HTMLDivElement> {
12
+ container?: Element | DocumentFragment;
13
+ }
14
+
15
+ export type PopupSize = 'small' | 'medium' | 'large';
16
+
17
+ export interface PopupProps {
18
+ children?: ReactNode;
19
+ placement?: Placement;
20
+ offset?: OffsetOptions;
21
+ action?: TriggerAction | TriggerAction[];
22
+ size?: PopupSize;
23
+ arrowed?: boolean;
24
+ inverse?: boolean;
25
+ delay?: number | [number] | [number, number];
26
+ open?: boolean;
27
+ defaultOpen?: boolean;
28
+ disabled?: boolean;
29
+ onOpen?: () => void;
30
+ onClose?: () => void;
31
+ }
@@ -1 +1 @@
1
- import{cva as r}from"@nild/shared";const a=r(["nd-popup-trigger"]),e=r(["nd-popup-portal",["absolute","top-0","left-0"]]),t=r(["rounded-md","shadow-lg"],{variants:{size:{small:["px-2","py-1"],medium:["px-4","py-3"],large:["px-6","py-5"]},inverse:{true:["bg-canvas-inverse","text-main-inverse"],false:["bg-surface","text-main"]}}}),o=r(["nd-popup-arrow","absolute"],{variants:{size:{small:["w-1.5","h-1.5"],medium:["w-3","h-3"],large:["w-4.5","h-4.5"]},arrowed:{true:"",false:["opacity-0","invisible"]},inverse:{true:["bg-canvas-inverse"],false:["bg-surface"]},orientation:{up:["transform-[translateY(-50%)_rotate(45deg)]","rounded-tl-sm"],down:["transform-[translateY(50%)_rotate(45deg)]","rounded-br-sm"],left:["transform-[translateX(-50%)_rotate(45deg)]","rounded-bl-sm"],right:["transform-[translateX(50%)_rotate(45deg)]","rounded-tr-sm"]}},compoundVariants:[{orientation:"up",className:["shadow-[-1px_-1px_0_0_var(--border-color-muted)]"]},{orientation:"down",className:["shadow-[1px_1px_0_0_var(--border-color-muted)]"]},{orientation:"left",className:["shadow-[-1px_1px_0_0_var(--border-color-muted)]"]},{orientation:"right",className:["shadow-[1px_-1px_0_0_var(--border-color-muted)]"]}]}),s={trigger:a,portal:e,portalContent:t,arrow:o};export{s as default};
1
+ import{cva as r}from"@nild/shared";const a=r(["nd-popup-trigger"]),e=r(["nd-popup-portal",["absolute","top-0","left-0","z-popup"]]),t=r(["rounded-md","shadow-lg"],{variants:{size:{small:["px-2","py-1"],medium:["px-4","py-3"],large:["px-6","py-5"]},inverse:{true:["bg-canvas-inverse","text-main-inverse"],false:["bg-surface","text-main"]}}}),o=r(["nd-popup-arrow","absolute"],{variants:{size:{small:["w-1.5","h-1.5"],medium:["w-3","h-3"],large:["w-4.5","h-4.5"]},arrowed:{true:"",false:["opacity-0","invisible"]},inverse:{true:["bg-canvas-inverse"],false:["bg-surface"]},orientation:{up:["transform-[translateY(-50%)_rotate(45deg)]","rounded-tl-sm"],down:["transform-[translateY(50%)_rotate(45deg)]","rounded-br-sm"],left:["transform-[translateX(-50%)_rotate(45deg)]","rounded-bl-sm"],right:["transform-[translateX(50%)_rotate(45deg)]","rounded-tr-sm"]}},compoundVariants:[{orientation:"up",className:["shadow-[-1px_-1px_0_0_var(--border-color-muted)]"]},{orientation:"down",className:["shadow-[1px_1px_0_0_var(--border-color-muted)]"]},{orientation:"left",className:["shadow-[-1px_1px_0_0_var(--border-color-muted)]"]},{orientation:"right",className:["shadow-[1px_-1px_0_0_var(--border-color-muted)]"]}]}),s={trigger:a,portal:e,portalContent:t,arrow:o};export{s as default};
@@ -0,0 +1,33 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ export type RadioVariant = 'solid' | 'outlined';
3
+ export type RadioSize = 'small' | 'medium' | 'large';
4
+
5
+ export interface RadioProps extends Omit<HTMLAttributes<HTMLLabelElement>, 'onChange' | 'defaultValue'> {
6
+ variant?: RadioVariant;
7
+ size?: RadioSize;
8
+ disabled?: boolean;
9
+ checked?: boolean;
10
+ defaultChecked?: boolean;
11
+ value?: unknown;
12
+ onChange?: (checked: boolean) => void;
13
+ }
14
+
15
+ export interface IndicatorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
16
+ children?: (checked: boolean) => ReactNode;
17
+ }
18
+
19
+ export interface LabelProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
20
+ children?: ReactNode | ((checked: boolean) => ReactNode);
21
+ }
22
+
23
+ export type GroupDirection = 'horizontal' | 'vertical';
24
+
25
+ export interface GroupProps<T = unknown> extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {
26
+ direction?: GroupDirection;
27
+ variant?: RadioVariant;
28
+ size?: RadioSize;
29
+ disabled?: boolean;
30
+ value?: T;
31
+ defaultValue?: T;
32
+ onChange?: (value: T) => void;
33
+ }
@@ -0,0 +1,20 @@
1
+ import { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
2
+ export type SegmentSize = 'small' | 'medium' | 'large';
3
+ export type SegmentOrientation = 'horizontal' | 'vertical';
4
+
5
+ export interface SegmentProps<T = unknown> extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {
6
+ children?: ReactNode;
7
+ value?: T;
8
+ defaultValue?: T;
9
+ onChange?: (value: T) => void;
10
+ size?: SegmentSize;
11
+ orientation?: SegmentOrientation;
12
+ disabled?: boolean;
13
+ block?: boolean;
14
+ }
15
+
16
+ export interface ItemProps<T = unknown> extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'onChange'> {
17
+ value: T;
18
+ disabled?: boolean;
19
+ children?: ReactNode;
20
+ }
@@ -0,0 +1,46 @@
1
+ import { InputSize, InputVariant } from '../../input';
2
+ import { OffsetOptions, Placement } from '@floating-ui/dom';
3
+ import { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
4
+ export type SelectVariant = InputVariant;
5
+ export type SelectSize = InputSize;
6
+
7
+ export interface SelectCommonProps
8
+ extends Omit<
9
+ ButtonHTMLAttributes<HTMLButtonElement>,
10
+ 'children' | 'defaultValue' | 'id' | 'onChange' | 'size' | 'value'
11
+ > {
12
+ children?: ReactNode;
13
+ placeholder?: string;
14
+ variant?: SelectVariant;
15
+ size?: SelectSize;
16
+ block?: boolean;
17
+ disabled?: boolean;
18
+ placement?: Placement;
19
+ offset?: OffsetOptions;
20
+ }
21
+
22
+ export interface SingleSelectProps<T = unknown> extends SelectCommonProps {
23
+ multiple?: false;
24
+ value?: T;
25
+ defaultValue?: T;
26
+ onChange?: (value: T | undefined) => void;
27
+ }
28
+
29
+ export interface MultipleSelectProps<T = unknown> extends SelectCommonProps {
30
+ multiple: true;
31
+ value?: T[];
32
+ defaultValue?: T[];
33
+ onChange?: (value: T[]) => void;
34
+ }
35
+
36
+ export type SelectProps<T = unknown> = SingleSelectProps<T> | MultipleSelectProps<T>;
37
+
38
+ export interface SelectOptionProps<T = unknown> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'value'> {
39
+ value: T;
40
+ label: string;
41
+ size?: SelectSize;
42
+ disabled?: boolean;
43
+ selected?: boolean;
44
+ active?: boolean;
45
+ children?: ReactNode;
46
+ }
@@ -0,0 +1,27 @@
1
+ import { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
2
+ export type SwitchVariant = 'solid' | 'outlined';
3
+ export type SwitchSize = 'small' | 'medium' | 'large';
4
+ export type SwitchShape = 'round' | 'square';
5
+
6
+ export interface SwitchProps
7
+ extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'defaultValue' | 'onChange'> {
8
+ variant?: SwitchVariant;
9
+ size?: SwitchSize;
10
+ shape?: SwitchShape;
11
+ checked?: boolean;
12
+ defaultChecked?: boolean;
13
+ value?: boolean;
14
+ defaultValue?: boolean;
15
+ disabled?: boolean;
16
+ onChange?: (checked: boolean) => void;
17
+ }
18
+
19
+ export type TrackType = 'checked' | 'unchecked';
20
+
21
+ export interface TrackProps extends HTMLAttributes<HTMLDivElement> {
22
+ type: TrackType;
23
+ }
24
+
25
+ export interface ThumbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
26
+ children?: (checked: boolean) => ReactNode;
27
+ }
@@ -0,0 +1,36 @@
1
+ import { HTMLAttributes, MouseEvent, ReactNode } from 'react';
2
+ export type TabsVariant = 'line' | 'card';
3
+ export type TabsSize = 'small' | 'medium' | 'large';
4
+ export type TabsOrientation = 'horizontal' | 'vertical';
5
+ export type TabsActivation = 'auto' | 'manual';
6
+
7
+ export interface TabsProps<T = unknown> extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {
8
+ children?: ReactNode;
9
+ value?: T;
10
+ defaultValue?: T;
11
+ onChange?: (value: T) => void;
12
+ variant?: TabsVariant;
13
+ size?: TabsSize;
14
+ orientation?: TabsOrientation;
15
+ activation?: TabsActivation;
16
+ disabled?: boolean;
17
+ closable?: boolean;
18
+ onClose?: (value: T, evt: MouseEvent<HTMLButtonElement>) => void;
19
+ destroyOnInactive?: boolean;
20
+ }
21
+
22
+ export interface ListProps extends HTMLAttributes<HTMLDivElement> {
23
+ children?: ReactNode;
24
+ }
25
+
26
+ export interface TabProps<T = unknown> extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
27
+ value: T;
28
+ disabled?: boolean;
29
+ closable?: boolean;
30
+ children?: ReactNode;
31
+ }
32
+
33
+ export interface PanelProps<T = unknown> extends HTMLAttributes<HTMLDivElement> {
34
+ value: T;
35
+ children?: ReactNode;
36
+ }
package/dist/tailwind.css CHANGED
@@ -1 +1 @@
1
- @theme static{ --nd-brand-h: 255; --nd-brand-c: .14; --nd-neutral-c: .001; --nd-shadow-l: 15%; --nd-shadow-c: .008; --nd-color-brand-0: light-dark( oklch(99% calc(var(--nd-brand-c) * .08) var(--nd-brand-h)), oklch(14% calc(var(--nd-brand-c) * .08) var(--nd-brand-h)) ); --nd-color-brand-5: light-dark( oklch(97% calc(var(--nd-brand-c) * .12) var(--nd-brand-h)), oklch(17% calc(var(--nd-brand-c) * .12) var(--nd-brand-h)) ); --nd-color-brand-10: light-dark( oklch(95% calc(var(--nd-brand-c) * .18) var(--nd-brand-h)), oklch(20% calc(var(--nd-brand-c) * .18) var(--nd-brand-h)) ); --nd-color-brand-15: light-dark( oklch(92% calc(var(--nd-brand-c) * .24) var(--nd-brand-h)), oklch(25% calc(var(--nd-brand-c) * .24) var(--nd-brand-h)) ); --nd-color-brand-20: light-dark( oklch(88% calc(var(--nd-brand-c) * .34) var(--nd-brand-h)), oklch(30% calc(var(--nd-brand-c) * .34) var(--nd-brand-h)) ); --nd-color-brand-30: light-dark( oklch(80% calc(var(--nd-brand-c) * .5) var(--nd-brand-h)), oklch(38% calc(var(--nd-brand-c) * .5) var(--nd-brand-h)) ); --nd-color-brand-40: light-dark( oklch(72% calc(var(--nd-brand-c) * .68) var(--nd-brand-h)), oklch(46% calc(var(--nd-brand-c) * .68) var(--nd-brand-h)) ); --nd-color-brand-50: light-dark( oklch(64% calc(var(--nd-brand-c) * .86) var(--nd-brand-h)), oklch(52% calc(var(--nd-brand-c) * .86) var(--nd-brand-h)) ); --nd-color-brand-60: oklch(58% var(--nd-brand-c) var(--nd-brand-h)); --nd-color-brand-70: light-dark( oklch(50% calc(var(--nd-brand-c) * .94) var(--nd-brand-h)), oklch(66% calc(var(--nd-brand-c) * .94) var(--nd-brand-h)) ); --nd-color-brand-80: light-dark( oklch(40% calc(var(--nd-brand-c) * .78) var(--nd-brand-h)), oklch(76% calc(var(--nd-brand-c) * .78) var(--nd-brand-h)) ); --nd-color-brand-90: light-dark( oklch(30% calc(var(--nd-brand-c) * .55) var(--nd-brand-h)), oklch(88% calc(var(--nd-brand-c) * .55) var(--nd-brand-h)) ); --nd-color-brand-100: light-dark( oklch(20% calc(var(--nd-brand-c) * .36) var(--nd-brand-h)), oklch(96% calc(var(--nd-brand-c) * .36) var(--nd-brand-h)) ); --nd-color-neutral-0: light-dark( oklch(99% var(--nd-neutral-c) var(--nd-brand-h)), oklch(14% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-5: light-dark( oklch(97.5% var(--nd-neutral-c) var(--nd-brand-h)), oklch(17% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-10: light-dark( oklch(95.5% var(--nd-neutral-c) var(--nd-brand-h)), oklch(21% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-15: light-dark( oklch(92.5% var(--nd-neutral-c) var(--nd-brand-h)), oklch(26% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-20: light-dark( oklch(89% var(--nd-neutral-c) var(--nd-brand-h)), oklch(32% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-30: light-dark( oklch(81% var(--nd-neutral-c) var(--nd-brand-h)), oklch(42% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-40: light-dark( oklch(72% var(--nd-neutral-c) var(--nd-brand-h)), oklch(50% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-50: light-dark( oklch(60% var(--nd-neutral-c) var(--nd-brand-h)), oklch(58% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-60: light-dark( oklch(50% var(--nd-neutral-c) var(--nd-brand-h)), oklch(67% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-70: light-dark( oklch(40% var(--nd-neutral-c) var(--nd-brand-h)), oklch(76% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-80: light-dark( oklch(32% var(--nd-neutral-c) var(--nd-brand-h)), oklch(85% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-90: light-dark( oklch(22% var(--nd-neutral-c) var(--nd-brand-h)), oklch(93% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-100: light-dark( oklch(15% var(--nd-neutral-c) var(--nd-brand-h)), oklch(98% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-success-base: oklch(60% .14 140deg); --nd-color-warning-base: oklch(76% .15 80deg); --nd-color-error-base: oklch(58% .16 28deg); --nd-color-shadow-key: light-dark( oklch(var(--nd-shadow-l) var(--nd-shadow-c) var(--nd-brand-h) / 16%), oklch(0% 0 0deg / 65%) ); --nd-color-shadow-ambient: light-dark( oklch(var(--nd-shadow-l) var(--nd-shadow-c) var(--nd-brand-h) / 4%), oklch(0% 0 0deg / 30%) ); --nd-font-family: -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }@theme{ --color-brand: var(--nd-color-brand-60); --color-brand-hover: light-dark(var(--nd-color-brand-50), var(--nd-color-brand-70)); --color-brand-active: var(--nd-color-brand-60); --color-brand-muted: light-dark(var(--nd-color-brand-30), var(--nd-color-brand-40)); --color-brand-subtle: var(--nd-color-brand-10); --color-brand-subtle-hover: var(--nd-color-brand-15); --color-brand-subtle-active: var(--nd-color-brand-20); --color-brand-contrast: light-dark(var(--nd-color-neutral-0), var(--nd-color-neutral-100)); --color-success: color-mix(in oklch, var(--nd-color-success-base) 90%, var(--nd-color-brand-60) 10%); --color-success-hover: light-dark( oklch(from var(--color-success) calc(l + .06) calc(c*.86) h), oklch(from var(--color-success) calc(l + .08) calc(c*.94) h) ); --color-success-muted: light-dark( oklch(from var(--color-success) calc(1 - ((1 - l)*.476)) calc(c/2) h), oklch(from var(--color-success) calc(.14 + (l - .14)*.727) calc(c*.68) h) ); --color-success-subtle: light-dark( oklch(from var(--color-success) calc(1 - ((1 - l)*.119)) calc(c*.18) h), oklch(from var(--color-success) calc(.14 + (l - .14)*.136) calc(c*.18) h) ); --color-success-contrast: light-dark(var(--nd-color-neutral-0), var(--nd-color-neutral-100)); --color-warning: color-mix(in oklch, var(--nd-color-warning-base) 95%, var(--nd-color-brand-60) 5%); --color-warning-hover: light-dark( oklch(from var(--color-warning) calc(l + .06) calc(c*.86) h), oklch(from var(--color-warning) calc(l + .08) calc(c*.94) h) ); --color-warning-muted: light-dark( oklch(from var(--color-warning) calc(1 - ((1 - l)*.476)) calc(c/2) h), oklch(from var(--color-warning) calc(.14 + (l - .14)*.727) calc(c*.68) h) ); --color-warning-subtle: light-dark( oklch(from var(--color-warning) calc(1 - ((1 - l)*.119)) calc(c*.18) h), oklch(from var(--color-warning) calc(.14 + (l - .14)*.136) calc(c*.18) h) ); --color-warning-contrast: light-dark(var(--nd-color-neutral-100), var(--nd-color-neutral-0)); --color-error: color-mix(in oklch, var(--nd-color-error-base) 92%, var(--nd-color-brand-60) 8%); --color-error-hover: light-dark( oklch(from var(--color-error) calc(l + .06) calc(c*.86) h), oklch(from var(--color-error) calc(l + .08) calc(c*.94) h) ); --color-error-muted: light-dark( oklch(from var(--color-error) calc(1 - ((1 - l)*.476)) calc(c/2) h), oklch(from var(--color-error) calc(.14 + (l - .14)*.727) calc(c*.68) h) ); --color-error-subtle: light-dark( oklch(from var(--color-error) calc(1 - ((1 - l)*.119)) calc(c*.18) h), oklch(from var(--color-error) calc(.14 + (l - .14)*.136) calc(c*.18) h) ); --color-error-contrast: light-dark(var(--nd-color-neutral-0), var(--nd-color-neutral-100)); --border-color-main: var(--nd-color-neutral-20); --border-color-muted: var(--nd-color-neutral-15); --border-color-subtle: var(--nd-color-neutral-10); --outline-color-main: var(--border-color-main); --outline-color-muted: var(--border-color-muted); --outline-color-subtle: var(--border-color-subtle); --background-color-canvas: var(--nd-color-neutral-0); --background-color-canvas-inverse: var(--nd-color-neutral-100); --background-color-subtle: var(--nd-color-neutral-5); --background-color-subtle-hover: var(--nd-color-neutral-10); --background-color-muted: var(--nd-color-neutral-10); --background-color-muted-hover: var(--nd-color-neutral-15); --background-color-muted-active: var(--nd-color-neutral-20); --background-color-emphasized: var(--nd-color-neutral-20); --background-color-emphasized-hover: var(--nd-color-neutral-30); --background-color-surface: light-dark( var(--nd-color-neutral-0), var(--nd-color-neutral-10) ); --background-color-surface-subtle: light-dark(var(--nd-color-neutral-5), var(--nd-color-neutral-15)); --background-color-surface-muted: light-dark(var(--nd-color-neutral-10), var(--nd-color-neutral-20)); --text-color-main: var(--nd-color-neutral-100); --text-color-main-inverse: var(--nd-color-neutral-0); --text-color-muted: var(--nd-color-neutral-70); --text-color-subtle: var(--nd-color-neutral-50); --text-sm: .75rem; --text-sm--line-height: 1.25rem; --text-md: .875rem; --text-md--line-height: 1.375rem; --text-lg: 1rem; --text-lg--line-height: 1.5rem; --text-xl: 1.125rem; --text-xl--line-height: 1.625rem; --text-2xl: 1.25rem; --text-2xl--line-height: 1.75rem; --text-3xl: 1.5rem; --text-3xl--line-height: 2rem; --text-4xl: 1.875rem; --text-4xl--line-height: 2.375rem; --text-5xl: 2.375rem; --text-5xl--line-height: 2.875rem; --text-6xl: 2.875rem; --text-6xl--line-height: 3.375rem; --radius-xs: .125rem; --radius-sm: .25rem; --radius-md: .375rem; --radius-lg: .5rem; --radius-xl: .75rem; --radius-2xl: 1rem; --radius-3xl: 1.5rem; --shadow-sm: 0 0 0 .8px var(--border-color-muted), 0 1px 2px 0 var(--nd-color-shadow-key); --shadow-md: 0 0 0 .8px var(--border-color-muted), 0 4px 6px -1px var(--nd-color-shadow-key), 0 2px 4px -2px var(--nd-color-shadow-ambient); --shadow-lg: 0 0 0 .8px var(--border-color-muted), 0 10px 15px -3px var(--nd-color-shadow-key), 0 4px 6px -4px var(--nd-color-shadow-ambient); --shadow-xl: 0 0 0 .8px var(--border-color-muted), 0 20px 25px -5px var(--nd-color-shadow-key), 0 8px 10px -6px var(--nd-color-shadow-ambient); --shadow-2xl: 0 0 0 .8px var(--border-color-muted), 0 25px 50px -12px var(--nd-color-shadow-key), 0 12px 24px -12px var(--nd-color-shadow-ambient); --font-nd: var(--nd-font-family); --default-transition-duration: .2s; }@utility stroke-main{stroke: var(--border-color-main);}@utility stroke-muted{stroke: var(--border-color-muted);}@utility stroke-subtle{stroke: var(--border-color-subtle);}@utility underline{text-decoration: underline; text-underline-offset: .125rem;}@utility ring-focused{outline: none; box-shadow: 0 0 0 .2rem var(--color-brand-muted),var(--tw-shadow, 0 0 #00000000);}@utility ring-focused-with-outline{box-shadow: 0 0 0 .2rem var(--color-brand-muted),var(--tw-shadow, 0 0 #00000000);}@utility r-*{r: --value(number);}@custom-variant focus-visible-within{&:has(:focus-visible) {@slot;}}@custom-variant disabled{&:where(:disabled,[aria-disabled="true"],[data-disabled]) {@slot;}}@custom-variant disabled-visual{&:where(:disabled,[aria-disabled="true"],[data-disabled]):not(:where(.nd-disabled-carrier:where(:disabled,[aria-disabled="true"],[data-disabled])) :where(:disabled,[aria-disabled="true"],[data-disabled])) {@slot;}}@custom-variant enabled{&:not(:disabled,[aria-disabled="true"],[data-disabled]) {@slot;}}
1
+ @theme static{ --nd-brand-h: 255; --nd-brand-c: .14; --nd-neutral-c: .001; --nd-shadow-l: 15%; --nd-shadow-c: .008; --nd-color-brand-0: light-dark( oklch(99% calc(var(--nd-brand-c) * .08) var(--nd-brand-h)), oklch(14% calc(var(--nd-brand-c) * .08) var(--nd-brand-h)) ); --nd-color-brand-5: light-dark( oklch(97% calc(var(--nd-brand-c) * .12) var(--nd-brand-h)), oklch(17% calc(var(--nd-brand-c) * .12) var(--nd-brand-h)) ); --nd-color-brand-10: light-dark( oklch(95% calc(var(--nd-brand-c) * .18) var(--nd-brand-h)), oklch(20% calc(var(--nd-brand-c) * .18) var(--nd-brand-h)) ); --nd-color-brand-15: light-dark( oklch(92% calc(var(--nd-brand-c) * .24) var(--nd-brand-h)), oklch(25% calc(var(--nd-brand-c) * .24) var(--nd-brand-h)) ); --nd-color-brand-20: light-dark( oklch(88% calc(var(--nd-brand-c) * .34) var(--nd-brand-h)), oklch(30% calc(var(--nd-brand-c) * .34) var(--nd-brand-h)) ); --nd-color-brand-30: light-dark( oklch(80% calc(var(--nd-brand-c) * .5) var(--nd-brand-h)), oklch(38% calc(var(--nd-brand-c) * .5) var(--nd-brand-h)) ); --nd-color-brand-40: light-dark( oklch(72% calc(var(--nd-brand-c) * .68) var(--nd-brand-h)), oklch(46% calc(var(--nd-brand-c) * .68) var(--nd-brand-h)) ); --nd-color-brand-50: light-dark( oklch(64% calc(var(--nd-brand-c) * .86) var(--nd-brand-h)), oklch(52% calc(var(--nd-brand-c) * .86) var(--nd-brand-h)) ); --nd-color-brand-60: oklch(58% var(--nd-brand-c) var(--nd-brand-h)); --nd-color-brand-70: light-dark( oklch(50% calc(var(--nd-brand-c) * .94) var(--nd-brand-h)), oklch(66% calc(var(--nd-brand-c) * .94) var(--nd-brand-h)) ); --nd-color-brand-80: light-dark( oklch(40% calc(var(--nd-brand-c) * .78) var(--nd-brand-h)), oklch(76% calc(var(--nd-brand-c) * .78) var(--nd-brand-h)) ); --nd-color-brand-90: light-dark( oklch(30% calc(var(--nd-brand-c) * .55) var(--nd-brand-h)), oklch(88% calc(var(--nd-brand-c) * .55) var(--nd-brand-h)) ); --nd-color-brand-100: light-dark( oklch(20% calc(var(--nd-brand-c) * .36) var(--nd-brand-h)), oklch(96% calc(var(--nd-brand-c) * .36) var(--nd-brand-h)) ); --nd-color-neutral-0: light-dark( oklch(99% var(--nd-neutral-c) var(--nd-brand-h)), oklch(14% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-5: light-dark( oklch(97.5% var(--nd-neutral-c) var(--nd-brand-h)), oklch(17% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-10: light-dark( oklch(95.5% var(--nd-neutral-c) var(--nd-brand-h)), oklch(21% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-15: light-dark( oklch(92.5% var(--nd-neutral-c) var(--nd-brand-h)), oklch(26% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-20: light-dark( oklch(89% var(--nd-neutral-c) var(--nd-brand-h)), oklch(32% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-30: light-dark( oklch(81% var(--nd-neutral-c) var(--nd-brand-h)), oklch(42% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-40: light-dark( oklch(72% var(--nd-neutral-c) var(--nd-brand-h)), oklch(50% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-50: light-dark( oklch(60% var(--nd-neutral-c) var(--nd-brand-h)), oklch(58% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-60: light-dark( oklch(50% var(--nd-neutral-c) var(--nd-brand-h)), oklch(67% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-70: light-dark( oklch(40% var(--nd-neutral-c) var(--nd-brand-h)), oklch(76% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-80: light-dark( oklch(32% var(--nd-neutral-c) var(--nd-brand-h)), oklch(85% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-90: light-dark( oklch(22% var(--nd-neutral-c) var(--nd-brand-h)), oklch(93% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-neutral-100: light-dark( oklch(15% var(--nd-neutral-c) var(--nd-brand-h)), oklch(98% var(--nd-neutral-c) var(--nd-brand-h)) ); --nd-color-success-base: oklch(60% .14 140deg); --nd-color-warning-base: oklch(76% .15 80deg); --nd-color-error-base: oklch(58% .16 28deg); --nd-color-shadow-key: light-dark( oklch(var(--nd-shadow-l) var(--nd-shadow-c) var(--nd-brand-h) / 16%), oklch(0% 0 0deg / 65%) ); --nd-color-shadow-ambient: light-dark( oklch(var(--nd-shadow-l) var(--nd-shadow-c) var(--nd-brand-h) / 4%), oklch(0% 0 0deg / 30%) ); --nd-font-family: -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }@theme{ --color-brand: var(--nd-color-brand-60); --color-brand-hover: light-dark(var(--nd-color-brand-50), var(--nd-color-brand-70)); --color-brand-active: var(--nd-color-brand-60); --color-brand-muted: light-dark(var(--nd-color-brand-30), var(--nd-color-brand-40)); --color-brand-subtle: var(--nd-color-brand-10); --color-brand-subtle-hover: var(--nd-color-brand-15); --color-brand-subtle-active: var(--nd-color-brand-20); --color-brand-contrast: light-dark(var(--nd-color-neutral-0), var(--nd-color-neutral-100)); --color-success: color-mix(in oklch, var(--nd-color-success-base) 90%, var(--nd-color-brand-60) 10%); --color-success-hover: light-dark( oklch(from var(--color-success) calc(l + .06) calc(c*.86) h), oklch(from var(--color-success) calc(l + .08) calc(c*.94) h) ); --color-success-muted: light-dark( oklch(from var(--color-success) calc(1 - ((1 - l)*.476)) calc(c/2) h), oklch(from var(--color-success) calc(.14 + (l - .14)*.727) calc(c*.68) h) ); --color-success-subtle: light-dark( oklch(from var(--color-success) calc(1 - ((1 - l)*.119)) calc(c*.18) h), oklch(from var(--color-success) calc(.14 + (l - .14)*.136) calc(c*.18) h) ); --color-success-contrast: light-dark(var(--nd-color-neutral-0), var(--nd-color-neutral-100)); --color-warning: color-mix(in oklch, var(--nd-color-warning-base) 95%, var(--nd-color-brand-60) 5%); --color-warning-hover: light-dark( oklch(from var(--color-warning) calc(l + .06) calc(c*.86) h), oklch(from var(--color-warning) calc(l + .08) calc(c*.94) h) ); --color-warning-muted: light-dark( oklch(from var(--color-warning) calc(1 - ((1 - l)*.476)) calc(c/2) h), oklch(from var(--color-warning) calc(.14 + (l - .14)*.727) calc(c*.68) h) ); --color-warning-subtle: light-dark( oklch(from var(--color-warning) calc(1 - ((1 - l)*.119)) calc(c*.18) h), oklch(from var(--color-warning) calc(.14 + (l - .14)*.136) calc(c*.18) h) ); --color-warning-contrast: light-dark(var(--nd-color-neutral-100), var(--nd-color-neutral-0)); --color-error: color-mix(in oklch, var(--nd-color-error-base) 92%, var(--nd-color-brand-60) 8%); --color-error-hover: light-dark( oklch(from var(--color-error) calc(l + .06) calc(c*.86) h), oklch(from var(--color-error) calc(l + .08) calc(c*.94) h) ); --color-error-muted: light-dark( oklch(from var(--color-error) calc(1 - ((1 - l)*.476)) calc(c/2) h), oklch(from var(--color-error) calc(.14 + (l - .14)*.727) calc(c*.68) h) ); --color-error-subtle: light-dark( oklch(from var(--color-error) calc(1 - ((1 - l)*.119)) calc(c*.18) h), oklch(from var(--color-error) calc(.14 + (l - .14)*.136) calc(c*.18) h) ); --color-error-contrast: light-dark(var(--nd-color-neutral-0), var(--nd-color-neutral-100)); --border-color-main: var(--nd-color-neutral-20); --border-color-muted: var(--nd-color-neutral-15); --border-color-subtle: var(--nd-color-neutral-10); --outline-color-main: var(--border-color-main); --outline-color-muted: var(--border-color-muted); --outline-color-subtle: var(--border-color-subtle); --background-color-canvas: var(--nd-color-neutral-0); --background-color-canvas-inverse: var(--nd-color-neutral-100); --background-color-subtle: var(--nd-color-neutral-5); --background-color-subtle-hover: var(--nd-color-neutral-10); --background-color-muted: var(--nd-color-neutral-10); --background-color-muted-hover: var(--nd-color-neutral-15); --background-color-muted-active: var(--nd-color-neutral-20); --background-color-emphasized: var(--nd-color-neutral-20); --background-color-emphasized-hover: var(--nd-color-neutral-30); --background-color-surface: light-dark( var(--nd-color-neutral-0), var(--nd-color-neutral-10) ); --background-color-surface-subtle: light-dark(var(--nd-color-neutral-5), var(--nd-color-neutral-15)); --background-color-surface-muted: light-dark(var(--nd-color-neutral-10), var(--nd-color-neutral-20)); --text-color-main: var(--nd-color-neutral-100); --text-color-main-inverse: var(--nd-color-neutral-0); --text-color-muted: var(--nd-color-neutral-70); --text-color-subtle: var(--nd-color-neutral-50); --text-sm: .75rem; --text-sm--line-height: 1.25rem; --text-md: .875rem; --text-md--line-height: 1.375rem; --text-lg: 1rem; --text-lg--line-height: 1.5rem; --text-xl: 1.125rem; --text-xl--line-height: 1.625rem; --text-2xl: 1.25rem; --text-2xl--line-height: 1.75rem; --text-3xl: 1.5rem; --text-3xl--line-height: 2rem; --text-4xl: 1.875rem; --text-4xl--line-height: 2.375rem; --text-5xl: 2.375rem; --text-5xl--line-height: 2.875rem; --text-6xl: 2.875rem; --text-6xl--line-height: 3.375rem; --radius-xs: .125rem; --radius-sm: .25rem; --radius-md: .375rem; --radius-lg: .5rem; --radius-xl: .75rem; --radius-2xl: 1rem; --radius-3xl: 1.5rem; --z-index-popup: 1000; --z-index-modal: 1300; --z-index-toast: 1500; --shadow-sm: 0 0 0 .8px var(--border-color-muted), 0 1px 2px 0 var(--nd-color-shadow-key); --shadow-md: 0 0 0 .8px var(--border-color-muted), 0 4px 6px -1px var(--nd-color-shadow-key), 0 2px 4px -2px var(--nd-color-shadow-ambient); --shadow-lg: 0 0 0 .8px var(--border-color-muted), 0 10px 15px -3px var(--nd-color-shadow-key), 0 4px 6px -4px var(--nd-color-shadow-ambient); --shadow-xl: 0 0 0 .8px var(--border-color-muted), 0 20px 25px -5px var(--nd-color-shadow-key), 0 8px 10px -6px var(--nd-color-shadow-ambient); --shadow-2xl: 0 0 0 .8px var(--border-color-muted), 0 25px 50px -12px var(--nd-color-shadow-key), 0 12px 24px -12px var(--nd-color-shadow-ambient); --font-nd: var(--nd-font-family); --default-transition-duration: .2s; }@utility stroke-main{stroke: var(--border-color-main);}@utility stroke-muted{stroke: var(--border-color-muted);}@utility stroke-subtle{stroke: var(--border-color-subtle);}@utility underline{text-decoration: underline; text-underline-offset: .125rem;}@utility ring-focused{outline: none; box-shadow: 0 0 0 .2rem var(--color-brand-muted),var(--tw-shadow, 0 0 #00000000);}@utility ring-focused-with-outline{box-shadow: 0 0 0 .2rem var(--color-brand-muted),var(--tw-shadow, 0 0 #00000000);}@utility r-*{r: --value(number);}@custom-variant focus-visible-within{&:has(:focus-visible) {@slot;}}@custom-variant disabled{&:where(:disabled,[aria-disabled="true"],[data-disabled]) {@slot;}}@custom-variant disabled-visual{&:where(:disabled,[aria-disabled="true"],[data-disabled]):not(:where(.nd-disabled-carrier:where(:disabled,[aria-disabled="true"],[data-disabled])) :where(:disabled,[aria-disabled="true"],[data-disabled])) {@slot;}}@custom-variant enabled{&:not(:disabled,[aria-disabled="true"],[data-disabled]) {@slot;}}
@@ -0,0 +1,16 @@
1
+ import { ReactNode } from 'react';
2
+ import { PopupSize } from '../../popup';
3
+ import { OffsetOptions, Placement } from '@floating-ui/dom';
4
+ export interface TooltipProps {
5
+ children?: ReactNode;
6
+ placement?: Placement;
7
+ offset?: OffsetOptions;
8
+ arrowed?: boolean;
9
+ size?: PopupSize;
10
+ delay?: number | [number] | [number, number];
11
+ open?: boolean;
12
+ defaultOpen?: boolean;
13
+ disabled?: boolean;
14
+ onOpen?: () => void;
15
+ onClose?: () => void;
16
+ }
@@ -0,0 +1,23 @@
1
+ import { AnchorHTMLAttributes, HTMLAttributes } from 'react';
2
+ export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
3
+ underlined?: boolean;
4
+ disabled?: boolean;
5
+ }
6
+
7
+ export type ParagraphProps = HTMLAttributes<HTMLParagraphElement>;
8
+
9
+ export type TextTag = 'strong' | 'del' | 'u' | 'i' | 'mark' | 'code' | 'kbd';
10
+
11
+ export interface TextProps extends HTMLAttributes<HTMLSpanElement> {
12
+ tags?: TextTag[];
13
+ secondary?: boolean;
14
+ disabled?: boolean;
15
+ }
16
+
17
+ export type TitleLevel = 1 | 2 | 3 | 4 | 5 | 6;
18
+
19
+ export interface TitleProps extends HTMLAttributes<HTMLHeadingElement> {
20
+ level?: TitleLevel;
21
+ }
22
+
23
+ export type TypographyProps = HTMLAttributes<HTMLElement>;
@@ -0,0 +1,51 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export type WatermarkComposition = 'stack' | 'inline' | 'overlay';
3
+
4
+ export type WatermarkGap = number | [number, number];
5
+ export type WatermarkOffset = number | [number, number];
6
+ export type WatermarkImageCrossOrigin = '' | 'anonymous' | 'use-credentials';
7
+ export type WatermarkTamperType = 'removed' | 'reordered' | 'attribute';
8
+ export type WatermarkTamperAttribute = 'aria-hidden' | 'class' | 'hidden' | 'style';
9
+
10
+ export interface WatermarkTamperEvent {
11
+ type: WatermarkTamperType;
12
+ attributeName?: WatermarkTamperAttribute;
13
+ }
14
+
15
+ export interface WatermarkImage {
16
+ src: string;
17
+ width?: number;
18
+ height?: number;
19
+ scale?: number;
20
+ crossOrigin?: WatermarkImageCrossOrigin;
21
+ }
22
+
23
+ export interface WatermarkPattern {
24
+ gap?: WatermarkGap;
25
+ offset?: WatermarkOffset;
26
+ rotate?: number;
27
+ composition?: WatermarkComposition;
28
+ compositionGap?: number;
29
+ }
30
+
31
+ export interface WatermarkTextStyle {
32
+ fontSize?: number;
33
+ fontWeight?: string | number;
34
+ fontFamily?: string;
35
+ fontStyle?: string;
36
+ lineHeight?: number;
37
+ color?: string;
38
+ textAlign?: CanvasTextAlign;
39
+ }
40
+
41
+ export interface WatermarkProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content' | 'onError'> {
42
+ text?: string | string[];
43
+ image?: string | WatermarkImage;
44
+ pattern?: WatermarkPattern;
45
+ textStyle?: WatermarkTextStyle;
46
+ opacity?: number;
47
+ zIndex?: number;
48
+ preserve?: boolean;
49
+ onTamper?: (event: WatermarkTamperEvent) => void;
50
+ onError?: (error: Event | Error, image: WatermarkImage) => void;
51
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nild/components",
3
3
  "private": false,
4
- "version": "0.0.52",
4
+ "version": "0.0.54",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
7
7
  "exports": {