rupoui 1.3.8 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -104,6 +104,74 @@ Apply custom themes using the `data-theme` attribute:
104
104
 
105
105
  ## 🧩 Components
106
106
 
107
+ ### Card
108
+
109
+ A composable container component for grouping related content, with support for layout slots and interactive states.
110
+
111
+ ```tsx
112
+ import { Button, Card, CardBody, CardFooter, CardHeader } from "rupoui";
113
+
114
+ <Card radius="lg" shadow="sm" className="max-w-md">
115
+ <CardHeader>
116
+ <h4 className="text-lg font-semibold">Pro Plan</h4>
117
+ <p className="text-default-500 text-sm">Best for growing teams</p>
118
+ </CardHeader>
119
+ <CardBody>Includes analytics, priority support, and team collaboration features.</CardBody>
120
+ <CardFooter>
121
+ <Button fullWidth>Upgrade</Button>
122
+ </CardFooter>
123
+ </Card>;
124
+ ```
125
+
126
+ **Props:**
127
+
128
+ - `variant`: `solid` (default), `bordered`, `flat`, `ghost`.
129
+ - `color`: `default` (default), `primary`, `secondary`, `success`, `warning`, `danger`.
130
+ - `radius`: `none`, `sm`, `md`, `lg`, `xl`.
131
+ - `shadow`: `none` (default), `sm`, `md`, `lg`.
132
+ - `isHoverable`, `isClickable`, `isBlurred`, `fullWidth`.
133
+ - `classNames`: Slot styling for `base`, `header`, `body`, `footer`.
134
+
135
+ ### Accordion
136
+
137
+ An accessible disclosure component for showing and hiding sections of content.
138
+
139
+ ```tsx
140
+ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "rupoui";
141
+
142
+ <Accordion type="single" defaultValue="item-1" collapsible>
143
+ <AccordionItem value="item-1">
144
+ <AccordionTrigger>What is RupoUI?</AccordionTrigger>
145
+ <AccordionContent>
146
+ RupoUI is a modern React UI library built with TypeScript and Tailwind CSS.
147
+ </AccordionContent>
148
+ </AccordionItem>
149
+
150
+ <AccordionItem value="item-2">
151
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
152
+ <AccordionContent>
153
+ Yes. It supports ARIA semantics and keyboard interactions out of the box.
154
+ </AccordionContent>
155
+ </AccordionItem>
156
+ </Accordion>;
157
+ ```
158
+
159
+ **Props (Accordion):**
160
+
161
+ - `type`: `single` (default) or `multiple`.
162
+ - `value` / `defaultValue` / `onValueChange`: Controlled and uncontrolled state.
163
+ - `collapsible`: Allows closing the open item in `single` mode.
164
+ - `variant`: `solid` (default), `bordered`, `ghost`.
165
+ - `color`: `default` (default), `primary`, `secondary`, `success`, `warning`, `danger`.
166
+ - `radius`: `none`, `sm`, `md` (default), `lg`, `xl`.
167
+ - `fullWidth`: Whether the accordion takes full width.
168
+ - `classNames`: Slot styling for `base`, `item`, `trigger`, `triggerInner`, `indicator`, `content`, `contentInner`.
169
+
170
+ **Accessibility & Keyboard:**
171
+
172
+ - ARIA: `aria-expanded`, `aria-controls`, `role="region"`, `aria-labelledby`.
173
+ - Keyboard: `Enter` / `Space` to toggle, `ArrowUp` / `ArrowDown` to move focus, `Home` / `End` for first/last trigger.
174
+
107
175
  ### Button
108
176
 
109
177
  A versatile button component with support for loading states and icons.
@@ -253,8 +321,8 @@ import { DatePicker } from "rupoui";
253
321
  A component for selecting a start and end date with calendar range selection, hover preview, and text/segmented input modes.
254
322
 
255
323
  ```tsx
256
- import { DateRangePicker } from "rupoui";
257
324
  import { useState } from "react";
325
+ import { DateRangePicker } from "rupoui";
258
326
 
259
327
  const Example = () => {
260
328
  const [range, setRange] = useState<{ start: Date | null; end: Date | null }>({
@@ -264,11 +332,7 @@ const Example = () => {
264
332
 
265
333
  return (
266
334
  <>
267
- <DateRangePicker
268
- label="Travel Dates"
269
- value={range}
270
- onChange={setRange}
271
- />
335
+ <DateRangePicker label="Travel Dates" value={range} onChange={setRange} />
272
336
 
273
337
  <DateRangePicker
274
338
  label="Range (Two Inputs)"
@@ -295,7 +359,7 @@ const Example = () => {
295
359
  - **Validation**: `isInvalid`, `isDisabled`, `isReadOnly`, `minDate`, `maxDate`, `disabledDates`.
296
360
  - **Range Input**:
297
361
  - `rangeInput`: `single` (default) or `two`.
298
- - `separator`: separator string between start/end (default: ` – `).
362
+ - `separator`: separator string between start/end (default: `–`).
299
363
  - `inputMode`: `text` (default) or `segmented`.
300
364
  - **Style Variants**:
301
365
  - `variant`: `solid` (default), `bordered`, `flat`, `ghost`.
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { AccordionProps } from './accordion.types';
3
+
4
+ export declare const Accordion: React.ForwardRefExoticComponent<AccordionProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { AccordionContentProps } from './accordion.types';
3
+
4
+ export declare const AccordionContent: React.ForwardRefExoticComponent<AccordionContentProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { AccordionItemProps } from './accordion.types';
3
+
4
+ export declare const AccordionItem: React.ForwardRefExoticComponent<AccordionItemProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { AccordionTriggerProps } from './accordion.types';
3
+
4
+ export declare const AccordionTrigger: React.ForwardRefExoticComponent<AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,214 @@
1
+ export declare const accordion: import('tailwind-variants').TVReturnType<{
2
+ variant: {
3
+ solid: {
4
+ item: string;
5
+ trigger: string;
6
+ };
7
+ bordered: {
8
+ item: string;
9
+ trigger: string;
10
+ };
11
+ ghost: {
12
+ item: string;
13
+ trigger: string;
14
+ };
15
+ };
16
+ color: {
17
+ default: {
18
+ trigger: string;
19
+ indicator: string;
20
+ };
21
+ primary: {
22
+ trigger: string;
23
+ indicator: string;
24
+ };
25
+ secondary: {
26
+ trigger: string;
27
+ indicator: string;
28
+ };
29
+ success: {
30
+ trigger: string;
31
+ indicator: string;
32
+ };
33
+ warning: {
34
+ trigger: string;
35
+ indicator: string;
36
+ };
37
+ danger: {
38
+ trigger: string;
39
+ indicator: string;
40
+ };
41
+ };
42
+ radius: {
43
+ none: {
44
+ item: string;
45
+ };
46
+ sm: {
47
+ item: string;
48
+ };
49
+ md: {
50
+ item: string;
51
+ };
52
+ lg: {
53
+ item: string;
54
+ };
55
+ xl: {
56
+ item: string;
57
+ };
58
+ };
59
+ fullWidth: {
60
+ true: {
61
+ base: string;
62
+ };
63
+ };
64
+ }, {
65
+ base: string;
66
+ item: string;
67
+ trigger: string;
68
+ triggerInner: string;
69
+ indicator: string;
70
+ content: string;
71
+ contentInner: string;
72
+ }, undefined, {
73
+ variant: {
74
+ solid: {
75
+ item: string;
76
+ trigger: string;
77
+ };
78
+ bordered: {
79
+ item: string;
80
+ trigger: string;
81
+ };
82
+ ghost: {
83
+ item: string;
84
+ trigger: string;
85
+ };
86
+ };
87
+ color: {
88
+ default: {
89
+ trigger: string;
90
+ indicator: string;
91
+ };
92
+ primary: {
93
+ trigger: string;
94
+ indicator: string;
95
+ };
96
+ secondary: {
97
+ trigger: string;
98
+ indicator: string;
99
+ };
100
+ success: {
101
+ trigger: string;
102
+ indicator: string;
103
+ };
104
+ warning: {
105
+ trigger: string;
106
+ indicator: string;
107
+ };
108
+ danger: {
109
+ trigger: string;
110
+ indicator: string;
111
+ };
112
+ };
113
+ radius: {
114
+ none: {
115
+ item: string;
116
+ };
117
+ sm: {
118
+ item: string;
119
+ };
120
+ md: {
121
+ item: string;
122
+ };
123
+ lg: {
124
+ item: string;
125
+ };
126
+ xl: {
127
+ item: string;
128
+ };
129
+ };
130
+ fullWidth: {
131
+ true: {
132
+ base: string;
133
+ };
134
+ };
135
+ }, {
136
+ base: string;
137
+ item: string;
138
+ trigger: string;
139
+ triggerInner: string;
140
+ indicator: string;
141
+ content: string;
142
+ contentInner: string;
143
+ }, import('tailwind-variants').TVReturnType<{
144
+ variant: {
145
+ solid: {
146
+ item: string;
147
+ trigger: string;
148
+ };
149
+ bordered: {
150
+ item: string;
151
+ trigger: string;
152
+ };
153
+ ghost: {
154
+ item: string;
155
+ trigger: string;
156
+ };
157
+ };
158
+ color: {
159
+ default: {
160
+ trigger: string;
161
+ indicator: string;
162
+ };
163
+ primary: {
164
+ trigger: string;
165
+ indicator: string;
166
+ };
167
+ secondary: {
168
+ trigger: string;
169
+ indicator: string;
170
+ };
171
+ success: {
172
+ trigger: string;
173
+ indicator: string;
174
+ };
175
+ warning: {
176
+ trigger: string;
177
+ indicator: string;
178
+ };
179
+ danger: {
180
+ trigger: string;
181
+ indicator: string;
182
+ };
183
+ };
184
+ radius: {
185
+ none: {
186
+ item: string;
187
+ };
188
+ sm: {
189
+ item: string;
190
+ };
191
+ md: {
192
+ item: string;
193
+ };
194
+ lg: {
195
+ item: string;
196
+ };
197
+ xl: {
198
+ item: string;
199
+ };
200
+ };
201
+ fullWidth: {
202
+ true: {
203
+ base: string;
204
+ };
205
+ };
206
+ }, {
207
+ base: string;
208
+ item: string;
209
+ trigger: string;
210
+ triggerInner: string;
211
+ indicator: string;
212
+ content: string;
213
+ contentInner: string;
214
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,36 @@
1
+ import { HTMLMotionProps } from 'framer-motion';
2
+ import { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
3
+ import { accordion } from './accordion.styles';
4
+
5
+ export type AccordionType = "single" | "multiple";
6
+ export type AccordionVariant = "solid" | "bordered" | "ghost";
7
+ export type AccordionColor = "default" | "primary" | "secondary" | "success" | "warning" | "danger";
8
+ export type AccordionRadius = "none" | "sm" | "md" | "lg" | "xl";
9
+ export type AccordionValue = string | string[] | null;
10
+ export type AccordionSlots = keyof ReturnType<typeof accordion>;
11
+ export interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" | "value" | "color"> {
12
+ children: ReactNode;
13
+ type?: AccordionType;
14
+ value?: AccordionValue;
15
+ defaultValue?: AccordionValue;
16
+ onValueChange?: (value: AccordionValue) => void;
17
+ collapsible?: boolean;
18
+ variant?: AccordionVariant;
19
+ color?: AccordionColor;
20
+ radius?: AccordionRadius;
21
+ fullWidth?: boolean;
22
+ className?: string;
23
+ classNames?: Partial<Record<AccordionSlots, string>>;
24
+ }
25
+ export interface AccordionItemProps extends HTMLAttributes<HTMLDivElement> {
26
+ children: ReactNode;
27
+ value: string;
28
+ disabled?: boolean;
29
+ }
30
+ export interface AccordionTriggerProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type"> {
31
+ children: ReactNode;
32
+ indicator?: ReactNode;
33
+ }
34
+ export interface AccordionContentProps extends Omit<HTMLMotionProps<"div">, "ref"> {
35
+ children: ReactNode;
36
+ }
@@ -0,0 +1,39 @@
1
+ import { RefObject } from 'react';
2
+ import { AccordionColor, AccordionProps, AccordionRadius, AccordionValue, AccordionVariant } from './accordion.types';
3
+
4
+ type RegisteredTrigger = {
5
+ id: string;
6
+ ref: RefObject<HTMLButtonElement | null>;
7
+ disabled: boolean;
8
+ };
9
+ export interface AccordionContextValue {
10
+ type: NonNullable<AccordionProps["type"]>;
11
+ value: AccordionValue;
12
+ collapsible: boolean;
13
+ variant: NonNullable<AccordionVariant>;
14
+ color: NonNullable<AccordionColor>;
15
+ radius: NonNullable<AccordionRadius>;
16
+ fullWidth: boolean;
17
+ classNames?: AccordionProps["classNames"];
18
+ isItemOpen: (itemValue: string) => boolean;
19
+ toggleItem: (itemValue: string) => void;
20
+ registerTrigger: (trigger: RegisteredTrigger) => void;
21
+ unregisterTrigger: (id: string) => void;
22
+ focusNextTrigger: (currentId: string) => void;
23
+ focusPreviousTrigger: (currentId: string) => void;
24
+ focusFirstTrigger: () => void;
25
+ focusLastTrigger: () => void;
26
+ }
27
+ export interface AccordionItemContextValue {
28
+ value: string;
29
+ disabled: boolean;
30
+ isOpen: boolean;
31
+ triggerId: string;
32
+ contentId: string;
33
+ toggle: () => void;
34
+ }
35
+ export declare const AccordionContext: import('react').Context<AccordionContextValue | null>;
36
+ export declare const AccordionItemContext: import('react').Context<AccordionItemContextValue | null>;
37
+ export declare const useAccordionContext: () => AccordionContextValue;
38
+ export declare const useAccordionItemContext: () => AccordionItemContextValue;
39
+ export {};
@@ -0,0 +1,6 @@
1
+ export * from './Accordion';
2
+ export * from './AccordionContent';
3
+ export * from './AccordionItem';
4
+ export * from './AccordionTrigger';
5
+ export * from './accordion.styles';
6
+ export * from './accordion.types';
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { CardProps } from './card.types';
3
+
4
+ export declare const Card: React.ForwardRefExoticComponent<CardProps & React.RefAttributes<HTMLElement>>;
@@ -0,0 +1,6 @@
1
+ import { default as React } from 'react';
2
+ import { CardBodyProps, CardFooterProps, CardHeaderProps } from './card.types';
3
+
4
+ export declare const CardHeader: React.ForwardRefExoticComponent<CardHeaderProps & React.RefAttributes<HTMLDivElement>>;
5
+ export declare const CardBody: React.ForwardRefExoticComponent<CardBodyProps & React.RefAttributes<HTMLDivElement>>;
6
+ export declare const CardFooter: React.ForwardRefExoticComponent<CardFooterProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,238 @@
1
+ export declare const card: import('tailwind-variants').TVReturnType<{
2
+ variant: {
3
+ solid: {
4
+ base: string;
5
+ };
6
+ bordered: {
7
+ base: string;
8
+ };
9
+ flat: {
10
+ base: string;
11
+ };
12
+ ghost: {
13
+ base: string;
14
+ };
15
+ };
16
+ color: {
17
+ default: {};
18
+ primary: {};
19
+ secondary: {};
20
+ success: {};
21
+ warning: {};
22
+ danger: {};
23
+ };
24
+ radius: {
25
+ none: {
26
+ base: string;
27
+ };
28
+ sm: {
29
+ base: string;
30
+ };
31
+ md: {
32
+ base: string;
33
+ };
34
+ lg: {
35
+ base: string;
36
+ };
37
+ xl: {
38
+ base: string;
39
+ };
40
+ };
41
+ shadow: {
42
+ none: {
43
+ base: string;
44
+ };
45
+ sm: {
46
+ base: string;
47
+ };
48
+ md: {
49
+ base: string;
50
+ };
51
+ lg: {
52
+ base: string;
53
+ };
54
+ };
55
+ isHoverable: {
56
+ true: {
57
+ base: string;
58
+ };
59
+ };
60
+ isClickable: {
61
+ true: {
62
+ base: string[];
63
+ };
64
+ };
65
+ isBlurred: {
66
+ true: {
67
+ base: string;
68
+ };
69
+ };
70
+ fullWidth: {
71
+ true: {
72
+ base: string;
73
+ };
74
+ };
75
+ }, {
76
+ base: string[];
77
+ header: string;
78
+ body: string;
79
+ footer: string;
80
+ }, undefined, {
81
+ variant: {
82
+ solid: {
83
+ base: string;
84
+ };
85
+ bordered: {
86
+ base: string;
87
+ };
88
+ flat: {
89
+ base: string;
90
+ };
91
+ ghost: {
92
+ base: string;
93
+ };
94
+ };
95
+ color: {
96
+ default: {};
97
+ primary: {};
98
+ secondary: {};
99
+ success: {};
100
+ warning: {};
101
+ danger: {};
102
+ };
103
+ radius: {
104
+ none: {
105
+ base: string;
106
+ };
107
+ sm: {
108
+ base: string;
109
+ };
110
+ md: {
111
+ base: string;
112
+ };
113
+ lg: {
114
+ base: string;
115
+ };
116
+ xl: {
117
+ base: string;
118
+ };
119
+ };
120
+ shadow: {
121
+ none: {
122
+ base: string;
123
+ };
124
+ sm: {
125
+ base: string;
126
+ };
127
+ md: {
128
+ base: string;
129
+ };
130
+ lg: {
131
+ base: string;
132
+ };
133
+ };
134
+ isHoverable: {
135
+ true: {
136
+ base: string;
137
+ };
138
+ };
139
+ isClickable: {
140
+ true: {
141
+ base: string[];
142
+ };
143
+ };
144
+ isBlurred: {
145
+ true: {
146
+ base: string;
147
+ };
148
+ };
149
+ fullWidth: {
150
+ true: {
151
+ base: string;
152
+ };
153
+ };
154
+ }, {
155
+ base: string[];
156
+ header: string;
157
+ body: string;
158
+ footer: string;
159
+ }, import('tailwind-variants').TVReturnType<{
160
+ variant: {
161
+ solid: {
162
+ base: string;
163
+ };
164
+ bordered: {
165
+ base: string;
166
+ };
167
+ flat: {
168
+ base: string;
169
+ };
170
+ ghost: {
171
+ base: string;
172
+ };
173
+ };
174
+ color: {
175
+ default: {};
176
+ primary: {};
177
+ secondary: {};
178
+ success: {};
179
+ warning: {};
180
+ danger: {};
181
+ };
182
+ radius: {
183
+ none: {
184
+ base: string;
185
+ };
186
+ sm: {
187
+ base: string;
188
+ };
189
+ md: {
190
+ base: string;
191
+ };
192
+ lg: {
193
+ base: string;
194
+ };
195
+ xl: {
196
+ base: string;
197
+ };
198
+ };
199
+ shadow: {
200
+ none: {
201
+ base: string;
202
+ };
203
+ sm: {
204
+ base: string;
205
+ };
206
+ md: {
207
+ base: string;
208
+ };
209
+ lg: {
210
+ base: string;
211
+ };
212
+ };
213
+ isHoverable: {
214
+ true: {
215
+ base: string;
216
+ };
217
+ };
218
+ isClickable: {
219
+ true: {
220
+ base: string[];
221
+ };
222
+ };
223
+ isBlurred: {
224
+ true: {
225
+ base: string;
226
+ };
227
+ };
228
+ fullWidth: {
229
+ true: {
230
+ base: string;
231
+ };
232
+ };
233
+ }, {
234
+ base: string[];
235
+ header: string;
236
+ body: string;
237
+ footer: string;
238
+ }, undefined, unknown, unknown, undefined>>;