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 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 customizable with Tailwind CSS or custom styling
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 customize validation error messages:
340
+ You can customise validation error messages:
303
341
 
304
342
  ```typescript
305
343
  import { defaultErrorMessages } from 'performa/server';
306
344
 
307
- // Customize individual messages
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
- Customize form labels and messages:
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: 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: FormConfig = {
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: FormConfig = {
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: 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-primary focus:border-primary",
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-primary focus:border-primary"
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-primary focus:border-primary disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed",
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-primary focus:border-primary disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed",
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-primary focus:ring-primary border-gray-300 dark:border-gray-600 dark:bg-gray-800 rounded disabled:cursor-not-allowed",
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-primary peer-focus:ring-offset-2 dark:peer-focus:ring-offset-gray-800",
133
- trackActive: "peer-checked:bg-primary peer-checked:dark:bg-primary-light",
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-primary focus:ring-primary border-gray-300 dark:border-gray-600 dark:bg-gray-800 disabled:cursor-not-allowed",
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-primary dark:hover:border-primary transition-colors duration-200",
144
- dropzoneActive: "border-primary bg-primary-50 dark:bg-primary-900/20",
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-primary hover:bg-primary-dark dark:bg-primary-light dark:hover:bg-primary focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-800 focus:ring-primary transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed",
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-primary focus:border-primary disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed cursor-pointer",
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-primary hover:text-white transition-colors text-gray-700 dark:text-gray-300",
169
- daySelected: "bg-primary text-white",
170
- dayButton: "p-2 text-sm rounded hover:bg-primary hover:text-white transition-colors text-gray-700 dark:text-gray-300",
171
- dayButtonSelected: "bg-primary text-white",
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-primary text-white",
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-primary text-white rounded hover:bg-primary-dark focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",
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-primary focus:border-primary",
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-primary focus:border-primary"
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-primary focus:border-primary disabled:bg-gray-100 disabled:cursor-not-allowed",
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-primary focus:border-primary disabled:bg-gray-100 disabled:cursor-not-allowed",
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-primary focus:ring-primary border-gray-300 rounded disabled:cursor-not-allowed",
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-primary peer-focus:ring-offset-2",
226
- trackActive: "peer-checked:bg-primary",
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-primary focus:ring-primary border-gray-300 disabled:cursor-not-allowed",
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-primary transition-colors duration-200",
237
- dropzoneActive: "border-primary bg-primary-50",
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-primary hover:bg-primary-dark focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed",
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-primary focus:border-primary disabled:bg-gray-100 disabled:cursor-not-allowed cursor-pointer",
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-primary hover:text-white transition-colors text-gray-700",
262
- daySelected: "bg-primary text-white",
263
- dayButton: "p-2 text-sm rounded hover:bg-primary hover:text-white transition-colors text-gray-700",
264
- dayButtonSelected: "bg-primary text-white",
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-primary text-white",
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-primary text-white rounded hover:bg-primary-dark focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",
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-primary", children: fileName }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
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-primary hover:underline dark:text-gray-50",
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,