performa 1.0.1 → 1.0.3
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 +51 -13
- package/dist/index.cjs +38 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -38
- package/dist/index.js.map +1 -1
- package/dist/nextjs.cjs +20 -20
- package/dist/nextjs.cjs.map +1 -1
- package/dist/nextjs.js +20 -20
- package/dist/nextjs.js.map +1 -1
- package/dist/react-router.cjs +20 -20
- package/dist/react-router.cjs.map +1 -1
- package/dist/react-router.js +20 -20
- package/dist/react-router.js.map +1 -1
- package/dist/tanstack-start.cjs +20 -20
- package/dist/tanstack-start.cjs.map +1 -1
- package/dist/tanstack-start.js +20 -20
- package/dist/tanstack-start.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ A lightweight, framework-agnostic React form library with built-in server-side v
|
|
|
8
8
|
- **Server-Side Validation**: Secure form validation with comprehensive validation rules
|
|
9
9
|
- **TypeScript First**: Full type safety with excellent IDE autocomplete
|
|
10
10
|
- **Accessible**: Built-in ARIA attributes and keyboard navigation
|
|
11
|
-
- **Themeable**: Fully
|
|
11
|
+
- **Themeable**: Fully customisable with Tailwind CSS or custom styling
|
|
12
12
|
- **Lightweight**: Core library is only 7.69 KB (brotli compressed)
|
|
13
13
|
- **File Uploads**: Built-in support for file validation and previews
|
|
14
14
|
- **Dark Mode**: Native dark mode support out of the box
|
|
@@ -36,12 +36,50 @@ For TanStack Start:
|
|
|
36
36
|
npm install performa @tanstack/start
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
+
### Tailwind CSS Setup
|
|
40
|
+
|
|
41
|
+
performa uses Tailwind CSS for styling. The setup depends on your Tailwind version:
|
|
42
|
+
|
|
43
|
+
#### Tailwind CSS v4.0+
|
|
44
|
+
|
|
45
|
+
Add the `@source` directive to your main CSS file to scan the performa library:
|
|
46
|
+
|
|
47
|
+
```css
|
|
48
|
+
@import "tailwindcss";
|
|
49
|
+
|
|
50
|
+
/* Add performa library as a source */
|
|
51
|
+
@source "../node_modules/performa/dist";
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### Tailwind CSS v3.x
|
|
55
|
+
|
|
56
|
+
Add the performa library path to your `tailwind.config.js` or `tailwind.config.ts`:
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
/** @type {import('tailwindcss').Config} */
|
|
60
|
+
module.exports = {
|
|
61
|
+
content: [
|
|
62
|
+
'./app/**/*.{js,ts,jsx,tsx}', // Your app files
|
|
63
|
+
'./pages/**/*.{js,ts,jsx,tsx}',
|
|
64
|
+
'./components/**/*.{js,ts,jsx,tsx}',
|
|
65
|
+
// Add performa library path
|
|
66
|
+
'./node_modules/performa/dist/**/*.{js,mjs}',
|
|
67
|
+
],
|
|
68
|
+
theme: {
|
|
69
|
+
extend: {},
|
|
70
|
+
},
|
|
71
|
+
plugins: [],
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
That's it! performa uses standard Tailwind colors and works out of the box. If you want to customize the styling, use the [FormThemeProvider](#theming) to override the default theme.
|
|
76
|
+
|
|
39
77
|
## Quick Start
|
|
40
78
|
|
|
41
79
|
### 1. Define Your Form Configuration
|
|
42
80
|
|
|
43
81
|
```typescript
|
|
44
|
-
import { FormConfig } from 'performa';
|
|
82
|
+
import type { FormConfig } from 'performa';
|
|
45
83
|
|
|
46
84
|
const loginForm = {
|
|
47
85
|
key: 'login',
|
|
@@ -299,12 +337,12 @@ const { email, password } = result.values;
|
|
|
299
337
|
|
|
300
338
|
### Custom Error Messages
|
|
301
339
|
|
|
302
|
-
You can
|
|
340
|
+
You can customise validation error messages:
|
|
303
341
|
|
|
304
342
|
```typescript
|
|
305
343
|
import { defaultErrorMessages } from 'performa/server';
|
|
306
344
|
|
|
307
|
-
//
|
|
345
|
+
// customise individual messages
|
|
308
346
|
defaultErrorMessages.required = (label) => `${label} is mandatory`;
|
|
309
347
|
defaultErrorMessages.minLength = (label, min) =>
|
|
310
348
|
`${label} needs at least ${min} characters`;
|
|
@@ -521,7 +559,7 @@ The complete theme object structure:
|
|
|
521
559
|
|
|
522
560
|
### Custom Labels
|
|
523
561
|
|
|
524
|
-
|
|
562
|
+
customise form labels and messages:
|
|
525
563
|
|
|
526
564
|
```typescript
|
|
527
565
|
import { FormThemeProvider } from 'performa';
|
|
@@ -621,7 +659,7 @@ function CustomForm() {
|
|
|
621
659
|
### Conditional Fields
|
|
622
660
|
|
|
623
661
|
```typescript
|
|
624
|
-
const formConfig
|
|
662
|
+
const formConfig = {
|
|
625
663
|
key: 'signup',
|
|
626
664
|
fields: {
|
|
627
665
|
accountType: {
|
|
@@ -642,29 +680,29 @@ const formConfig: FormConfig = {
|
|
|
642
680
|
},
|
|
643
681
|
}),
|
|
644
682
|
},
|
|
645
|
-
}
|
|
683
|
+
} satisfies FormConfig
|
|
646
684
|
```
|
|
647
685
|
|
|
648
686
|
### Multi-Step Forms
|
|
649
687
|
|
|
650
688
|
```typescript
|
|
651
|
-
const step1Config
|
|
689
|
+
const step1Config = {
|
|
652
690
|
key: 'registration-step1',
|
|
653
691
|
fields: {
|
|
654
692
|
email: { type: 'email', label: 'Email', rules: { required: true } },
|
|
655
693
|
password: { type: 'password', label: 'Password', rules: { required: true } },
|
|
656
694
|
submit: { type: 'submit', label: 'Continue' },
|
|
657
695
|
},
|
|
658
|
-
};
|
|
696
|
+
} satisfies FormConfig;
|
|
659
697
|
|
|
660
|
-
const step2Config
|
|
698
|
+
const step2Config = {
|
|
661
699
|
key: 'registration-step2',
|
|
662
700
|
fields: {
|
|
663
701
|
firstName: { type: 'text', label: 'First Name', rules: { required: true } },
|
|
664
702
|
lastName: { type: 'text', label: 'Last Name', rules: { required: true } },
|
|
665
703
|
submit: { type: 'submit', label: 'Complete Registration' },
|
|
666
704
|
},
|
|
667
|
-
};
|
|
705
|
+
} satisfies FormConfig;
|
|
668
706
|
|
|
669
707
|
function MultiStepForm() {
|
|
670
708
|
const [step, setStep] = useState(1);
|
|
@@ -701,7 +739,7 @@ function DynamicForm() {
|
|
|
701
739
|
.then(data => setCategories(data));
|
|
702
740
|
}, []);
|
|
703
741
|
|
|
704
|
-
const formConfig
|
|
742
|
+
const formConfig = {
|
|
705
743
|
key: 'product',
|
|
706
744
|
fields: {
|
|
707
745
|
category: {
|
|
@@ -714,7 +752,7 @@ function DynamicForm() {
|
|
|
714
752
|
rules: { required: true },
|
|
715
753
|
},
|
|
716
754
|
},
|
|
717
|
-
}
|
|
755
|
+
} satisfies FormConfig
|
|
718
756
|
|
|
719
757
|
return <NextForm config={formConfig} action={submitProduct} />;
|
|
720
758
|
}
|
package/dist/index.cjs
CHANGED
|
@@ -107,48 +107,48 @@ var defaultTheme = {
|
|
|
107
107
|
required: "text-red-500 ml-1"
|
|
108
108
|
},
|
|
109
109
|
input: {
|
|
110
|
-
base: "block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring focus:ring-
|
|
110
|
+
base: "block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500",
|
|
111
111
|
error: "border-red-500 dark:border-red-400",
|
|
112
112
|
disabled: "disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed",
|
|
113
|
-
focus: "focus:outline-none focus:ring focus:ring-
|
|
113
|
+
focus: "focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500"
|
|
114
114
|
},
|
|
115
115
|
select: {
|
|
116
|
-
base: "mt-1 block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring focus:ring-
|
|
116
|
+
base: "mt-1 block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed",
|
|
117
117
|
error: "border-red-500 dark:border-red-400",
|
|
118
118
|
disabled: "disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed",
|
|
119
119
|
option: "bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100"
|
|
120
120
|
},
|
|
121
121
|
textarea: {
|
|
122
|
-
base: "mt-1 block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring focus:ring-
|
|
122
|
+
base: "mt-1 block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed",
|
|
123
123
|
error: "border-red-500 dark:border-red-400",
|
|
124
124
|
disabled: "disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed"
|
|
125
125
|
},
|
|
126
126
|
checkbox: {
|
|
127
|
-
base: "h-4 w-4 text-
|
|
127
|
+
base: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 dark:border-gray-600 dark:bg-gray-800 rounded disabled:cursor-not-allowed",
|
|
128
128
|
error: "border-red-500 dark:border-red-400",
|
|
129
129
|
label: "ml-2 block text-sm font-medium text-gray-700 dark:text-gray-300"
|
|
130
130
|
},
|
|
131
131
|
toggle: {
|
|
132
|
-
track: "absolute inset-0 rounded-full transition-colors duration-200 bg-gray-300 dark:bg-gray-600 peer-focus:ring-2 peer-focus:ring-
|
|
133
|
-
trackActive: "peer-checked:bg-
|
|
132
|
+
track: "absolute inset-0 rounded-full transition-colors duration-200 bg-gray-300 dark:bg-gray-600 peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2 dark:peer-focus:ring-offset-gray-800",
|
|
133
|
+
trackActive: "peer-checked:bg-blue-600 peer-checked:dark:bg-blue-500",
|
|
134
134
|
thumb: "absolute left-1 top-1 w-4 h-4 bg-white dark:bg-gray-200 rounded-full transition-transform duration-200 peer-checked:translate-x-5",
|
|
135
135
|
label: "block text-sm font-medium text-gray-700 dark:text-gray-300"
|
|
136
136
|
},
|
|
137
137
|
radio: {
|
|
138
|
-
base: "h-4 w-4 text-
|
|
138
|
+
base: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 dark:border-gray-600 dark:bg-gray-800 disabled:cursor-not-allowed",
|
|
139
139
|
label: "ml-2 text-sm text-gray-700 dark:text-gray-300",
|
|
140
140
|
group: "mt-1"
|
|
141
141
|
},
|
|
142
142
|
file: {
|
|
143
|
-
dropzone: "flex flex-col items-center justify-center w-full p-6 border-2 border-dashed rounded-md cursor-pointer border-gray-300 dark:border-gray-600 hover:border-
|
|
144
|
-
dropzoneActive: "border-
|
|
143
|
+
dropzone: "flex flex-col items-center justify-center w-full p-6 border-2 border-dashed rounded-md cursor-pointer border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500 transition-colors duration-200",
|
|
144
|
+
dropzoneActive: "border-blue-500 bg-blue-50 dark:bg-blue-900/20",
|
|
145
145
|
dropzoneError: "border-red-500 dark:border-red-400 hover:border-red-500 dark:hover:border-red-400",
|
|
146
146
|
icon: "w-8 h-8 text-gray-400 dark:text-gray-500",
|
|
147
147
|
text: "mt-2 text-sm text-gray-500 dark:text-gray-400",
|
|
148
148
|
hint: "mt-1 text-xs text-gray-500 dark:text-gray-400"
|
|
149
149
|
},
|
|
150
150
|
submit: {
|
|
151
|
-
base: "mt-1 flex items-center justify-center w-full px-4 py-2 border border-transparent rounded-md shadow-sm text-white bg-
|
|
151
|
+
base: "mt-1 flex items-center justify-center w-full px-4 py-2 border border-transparent rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-500 focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-800 focus:ring-blue-500 transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed",
|
|
152
152
|
loading: "opacity-75",
|
|
153
153
|
spinner: "mr-3 -ml-1 size-5 animate-spin text-white"
|
|
154
154
|
},
|
|
@@ -161,18 +161,18 @@ var defaultTheme = {
|
|
|
161
161
|
info: "bg-blue-50 dark:bg-blue-900/20 text-blue-800 dark:text-blue-200 border-blue-200 dark:border-blue-800"
|
|
162
162
|
},
|
|
163
163
|
datetime: {
|
|
164
|
-
input: "block w-full px-3 py-2 pr-10 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring focus:ring-
|
|
164
|
+
input: "block w-full px-3 py-2 pr-10 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed cursor-pointer",
|
|
165
165
|
dropdown: "absolute z-50 mt-2 p-4 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg w-80",
|
|
166
166
|
picker: "absolute z-50 mt-2 p-4 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg w-80",
|
|
167
167
|
calendar: "grid grid-cols-7 gap-1 mb-4",
|
|
168
|
-
day: "p-2 text-sm rounded hover:bg-
|
|
169
|
-
daySelected: "bg-
|
|
170
|
-
dayButton: "p-2 text-sm rounded hover:bg-
|
|
171
|
-
dayButtonSelected: "bg-
|
|
168
|
+
day: "p-2 text-sm rounded hover:bg-blue-600 hover:text-white transition-colors text-gray-700 dark:text-gray-300",
|
|
169
|
+
daySelected: "bg-blue-600 text-white",
|
|
170
|
+
dayButton: "p-2 text-sm rounded hover:bg-blue-600 hover:text-white transition-colors text-gray-700 dark:text-gray-300",
|
|
171
|
+
dayButtonSelected: "bg-blue-600 text-white",
|
|
172
172
|
timeInput: "w-14 px-2 py-1 text-center border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",
|
|
173
173
|
timeLabel: "text-xs font-medium text-gray-700 dark:text-gray-300",
|
|
174
174
|
periodButton: "px-3 py-1 text-xs rounded bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300",
|
|
175
|
-
periodButtonActive: "bg-
|
|
175
|
+
periodButtonActive: "bg-blue-600 text-white",
|
|
176
176
|
iconButton: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-500 dark:text-gray-400",
|
|
177
177
|
navButton: "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded text-gray-700 dark:text-white",
|
|
178
178
|
monthYear: "text-sm font-medium text-gray-900 dark:text-gray-100",
|
|
@@ -180,7 +180,7 @@ var defaultTheme = {
|
|
|
180
180
|
formatButton: "px-2 py-1 text-xs bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded hover:bg-gray-200 dark:hover:bg-gray-600"
|
|
181
181
|
},
|
|
182
182
|
button: {
|
|
183
|
-
primary: "flex-1 px-3 py-2 text-sm bg-
|
|
183
|
+
primary: "flex-1 px-3 py-2 text-sm bg-blue-600 text-white rounded hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2",
|
|
184
184
|
secondary: "flex-1 px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
|
|
185
185
|
},
|
|
186
186
|
readonly: "mt-1 block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-gray-100",
|
|
@@ -200,48 +200,48 @@ var lightOnlyTheme = {
|
|
|
200
200
|
required: "text-red-500 ml-1"
|
|
201
201
|
},
|
|
202
202
|
input: {
|
|
203
|
-
base: "block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring focus:ring-
|
|
203
|
+
base: "block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500",
|
|
204
204
|
error: "border-red-500",
|
|
205
205
|
disabled: "disabled:bg-gray-100 disabled:cursor-not-allowed",
|
|
206
|
-
focus: "focus:outline-none focus:ring focus:ring-
|
|
206
|
+
focus: "focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500"
|
|
207
207
|
},
|
|
208
208
|
select: {
|
|
209
|
-
base: "mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 focus:outline-none focus:ring focus:ring-
|
|
209
|
+
base: "mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed",
|
|
210
210
|
error: "border-red-500",
|
|
211
211
|
disabled: "disabled:bg-gray-100 disabled:cursor-not-allowed",
|
|
212
212
|
option: "bg-white text-gray-900"
|
|
213
213
|
},
|
|
214
214
|
textarea: {
|
|
215
|
-
base: "mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring focus:ring-
|
|
215
|
+
base: "mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed",
|
|
216
216
|
error: "border-red-500",
|
|
217
217
|
disabled: "disabled:bg-gray-100 disabled:cursor-not-allowed"
|
|
218
218
|
},
|
|
219
219
|
checkbox: {
|
|
220
|
-
base: "h-4 w-4 text-
|
|
220
|
+
base: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded disabled:cursor-not-allowed",
|
|
221
221
|
error: "border-red-500",
|
|
222
222
|
label: "ml-2 block text-sm font-medium text-gray-700"
|
|
223
223
|
},
|
|
224
224
|
toggle: {
|
|
225
|
-
track: "absolute inset-0 rounded-full transition-colors duration-200 bg-gray-300 peer-focus:ring-2 peer-focus:ring-
|
|
226
|
-
trackActive: "peer-checked:bg-
|
|
225
|
+
track: "absolute inset-0 rounded-full transition-colors duration-200 bg-gray-300 peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2",
|
|
226
|
+
trackActive: "peer-checked:bg-blue-600",
|
|
227
227
|
thumb: "absolute left-1 top-1 w-4 h-4 bg-white rounded-full transition-transform duration-200 peer-checked:translate-x-5",
|
|
228
228
|
label: "block text-sm font-medium text-gray-700"
|
|
229
229
|
},
|
|
230
230
|
radio: {
|
|
231
|
-
base: "h-4 w-4 text-
|
|
231
|
+
base: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 disabled:cursor-not-allowed",
|
|
232
232
|
label: "ml-2 text-sm text-gray-700",
|
|
233
233
|
group: "mt-1"
|
|
234
234
|
},
|
|
235
235
|
file: {
|
|
236
|
-
dropzone: "flex flex-col items-center justify-center w-full p-6 border-2 border-dashed rounded-md cursor-pointer border-gray-300 hover:border-
|
|
237
|
-
dropzoneActive: "border-
|
|
236
|
+
dropzone: "flex flex-col items-center justify-center w-full p-6 border-2 border-dashed rounded-md cursor-pointer border-gray-300 hover:border-blue-500 transition-colors duration-200",
|
|
237
|
+
dropzoneActive: "border-blue-500 bg-blue-50",
|
|
238
238
|
dropzoneError: "border-red-500 hover:border-red-500",
|
|
239
239
|
icon: "w-8 h-8 text-gray-400",
|
|
240
240
|
text: "mt-2 text-sm text-gray-500",
|
|
241
241
|
hint: "mt-1 text-xs text-gray-500"
|
|
242
242
|
},
|
|
243
243
|
submit: {
|
|
244
|
-
base: "mt-1 flex items-center justify-center w-full px-4 py-2 border border-transparent rounded-md shadow-sm text-white bg-
|
|
244
|
+
base: "mt-1 flex items-center justify-center w-full px-4 py-2 border border-transparent rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed",
|
|
245
245
|
loading: "opacity-75",
|
|
246
246
|
spinner: "mr-3 -ml-1 size-5 animate-spin text-white"
|
|
247
247
|
},
|
|
@@ -254,18 +254,18 @@ var lightOnlyTheme = {
|
|
|
254
254
|
info: "bg-blue-50 text-blue-800 border-blue-200"
|
|
255
255
|
},
|
|
256
256
|
datetime: {
|
|
257
|
-
input: "block w-full px-3 py-2 pr-10 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring focus:ring-
|
|
257
|
+
input: "block w-full px-3 py-2 pr-10 border border-gray-300 rounded-md shadow-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring focus:ring-blue-500 focus:border-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed cursor-pointer",
|
|
258
258
|
dropdown: "absolute z-50 mt-2 p-4 bg-white border border-gray-300 rounded-lg shadow-lg w-80",
|
|
259
259
|
picker: "absolute z-50 mt-2 p-4 bg-white border border-gray-300 rounded-lg shadow-lg w-80",
|
|
260
260
|
calendar: "grid grid-cols-7 gap-1 mb-4",
|
|
261
|
-
day: "p-2 text-sm rounded hover:bg-
|
|
262
|
-
daySelected: "bg-
|
|
263
|
-
dayButton: "p-2 text-sm rounded hover:bg-
|
|
264
|
-
dayButtonSelected: "bg-
|
|
261
|
+
day: "p-2 text-sm rounded hover:bg-blue-600 hover:text-white transition-colors text-gray-700",
|
|
262
|
+
daySelected: "bg-blue-600 text-white",
|
|
263
|
+
dayButton: "p-2 text-sm rounded hover:bg-blue-600 hover:text-white transition-colors text-gray-700",
|
|
264
|
+
dayButtonSelected: "bg-blue-600 text-white",
|
|
265
265
|
timeInput: "w-14 px-2 py-1 text-center border border-gray-300 rounded bg-white text-gray-900",
|
|
266
266
|
timeLabel: "text-xs font-medium text-gray-700",
|
|
267
267
|
periodButton: "px-3 py-1 text-xs rounded bg-gray-100 text-gray-700",
|
|
268
|
-
periodButtonActive: "bg-
|
|
268
|
+
periodButtonActive: "bg-blue-600 text-white",
|
|
269
269
|
iconButton: "absolute right-2 top-1/2 -translate-y-1/2 text-gray-500",
|
|
270
270
|
navButton: "p-1 hover:bg-gray-100 rounded text-gray-700",
|
|
271
271
|
monthYear: "text-sm font-medium text-gray-900",
|
|
@@ -273,7 +273,7 @@ var lightOnlyTheme = {
|
|
|
273
273
|
formatButton: "px-2 py-1 text-xs bg-gray-100 text-gray-700 rounded hover:bg-gray-200"
|
|
274
274
|
},
|
|
275
275
|
button: {
|
|
276
|
-
primary: "flex-1 px-3 py-2 text-sm bg-
|
|
276
|
+
primary: "flex-1 px-3 py-2 text-sm bg-blue-600 text-white rounded hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2",
|
|
277
277
|
secondary: "flex-1 px-3 py-2 text-sm border border-gray-300 rounded hover:bg-gray-50 text-gray-700"
|
|
278
278
|
},
|
|
279
279
|
readonly: "mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm bg-gray-100 text-gray-900",
|
|
@@ -1173,7 +1173,7 @@ function FileInput({
|
|
|
1173
1173
|
)
|
|
1174
1174
|
}
|
|
1175
1175
|
),
|
|
1176
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: theme.file?.text, children: fileName ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-
|
|
1176
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: theme.file?.text, children: fileName ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-blue-600 dark:text-blue-400", children: fileName }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1177
1177
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: labels.fileUpload?.clickToUpload }),
|
|
1178
1178
|
" ",
|
|
1179
1179
|
labels.fileUpload?.dragAndDrop
|
|
@@ -1210,7 +1210,7 @@ function FileInput({
|
|
|
1210
1210
|
href: fileUrl,
|
|
1211
1211
|
target: "_blank",
|
|
1212
1212
|
rel: "noopener noreferrer",
|
|
1213
|
-
className: "mt-2 inline-flex items-center text-xs text-
|
|
1213
|
+
className: "mt-2 inline-flex items-center text-xs text-blue-600 hover:underline dark:text-blue-400",
|
|
1214
1214
|
children: [
|
|
1215
1215
|
"View Current ",
|
|
1216
1216
|
label,
|