@true-kit/ui 0.1.2 → 0.1.5

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/dist/index.css CHANGED
@@ -35,4 +35,60 @@
35
35
  opacity: 0.5;
36
36
  cursor: not-allowed;
37
37
  }
38
+
39
+ /* src/components/InputController/Controller.css */
40
+ .ui-input-controller {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: var(--ui-spacing-xs);
44
+ }
45
+ .ui-input-controller__label {
46
+ font-family: var(--ui-font-family);
47
+ font-size: var(--ui-font-size-sm);
48
+ color: var(--ui-color-foreground);
49
+ cursor: pointer;
50
+ }
51
+ .ui-input-controller__input {
52
+ width: 100%;
53
+ box-sizing: border-box;
54
+ padding: var(--ui-spacing-sm) var(--ui-spacing-md);
55
+ font-family: var(--ui-font-family);
56
+ font-size: var(--ui-font-size-md);
57
+ color: var(--ui-color-foreground);
58
+ background: var(--ui-color-background);
59
+ border: 1px solid var(--ui-color-border);
60
+ border-radius: var(--ui-radius-md);
61
+ outline: none;
62
+ transition:
63
+ border-color 150ms ease,
64
+ box-shadow 150ms ease,
65
+ opacity 150ms ease;
66
+ }
67
+ .ui-input-controller__input::placeholder {
68
+ color: var(--ui-color-muted-foreground);
69
+ }
70
+ .ui-input-controller__input:hover:not(:disabled) {
71
+ border-color: var(--ui-color-primary);
72
+ }
73
+ .ui-input-controller__input:focus {
74
+ border-color: var(--ui-color-primary);
75
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--ui-color-primary) 15%, transparent);
76
+ }
77
+ .ui-input-controller__input--error {
78
+ border-color: var(--ui-color-danger);
79
+ }
80
+ .ui-input-controller__input--error:focus {
81
+ border-color: var(--ui-color-danger);
82
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--ui-color-danger) 15%, transparent);
83
+ }
84
+ .ui-input-controller__input--disabled,
85
+ .ui-input-controller__input:disabled {
86
+ opacity: 0.5;
87
+ cursor: not-allowed;
88
+ }
89
+ .ui-input-controller__error {
90
+ font-family: var(--ui-font-family);
91
+ font-size: var(--ui-font-size-sm);
92
+ color: var(--ui-color-danger);
93
+ }
38
94
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Button/Button.css"],"sourcesContent":[".ui-button {\r\n border: 0;\r\n\r\n font-family: var(--ui-font-family);\r\n font-size: var(--ui-font-size-md);\r\n\r\n border-radius: var(--ui-radius-md);\r\n\r\n cursor: pointer;\r\n\r\n transition:\r\n background-color 150ms ease,\r\n opacity 150ms ease;\r\n}\r\n\r\n.ui-button--sm {\r\n padding:\r\n var(--ui-spacing-xs) var(--ui-spacing-sm);\r\n}\r\n\r\n.ui-button--md {\r\n padding:\r\n var(--ui-spacing-sm) var(--ui-spacing-md);\r\n}\r\n\r\n.ui-button--lg {\r\n padding:\r\n var(--ui-spacing-md) var(--ui-spacing-lg);\r\n}\r\n\r\n.ui-button--primary {\r\n background: var(--ui-color-primary);\r\n color: var(--ui-color-primary-foreground);\r\n}\r\n\r\n.ui-button--primary:hover:not(:disabled) {\r\n background: var(--ui-color-primary-hover);\r\n}\r\n\r\n.ui-button--secondary {\r\n background: var(--ui-color-secondary);\r\n color: var(--ui-color-secondary-foreground);\r\n}\r\n\r\n.ui-button--danger {\r\n background: var(--ui-color-danger);\r\n color: #ffffff;\r\n}\r\n\r\n.ui-button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}"],"mappings":";AAAA,CAAC;AACG,UAAQ;AAER,eAAa,IAAI;AACjB,aAAW,IAAI;AAEf,iBAAe,IAAI;AAEnB,UAAQ;AAER,cACI,iBAAiB,MAAM,IAAI,EAC3B,QAAQ,MAAM;AACtB;AAEA,CAAC;AACG,WACI,IAAI,iBAAiB,IAAI;AACjC;AAEA,CAAC;AACG,WACI,IAAI,iBAAiB,IAAI;AACjC;AAEA,CAAC;AACG,WACI,IAAI,iBAAiB,IAAI;AACjC;AAEA,CAAC;AACG,cAAY,IAAI;AAChB,SAAO,IAAI;AACf;AAEA,CALC,kBAKkB,MAAM,KAAK;AAC1B,cAAY,IAAI;AACpB;AAEA,CAAC;AACG,cAAY,IAAI;AAChB,SAAO,IAAI;AACf;AAEA,CAAC;AACG,cAAY,IAAI;AAChB,SAAO;AACX;AAEA,CAjDC,SAiDS;AACN,WAAS;AACT,UAAQ;AACZ;","names":[]}
1
+ {"version":3,"sources":["../src/components/Button/Button.css","../src/components/InputController/Controller.css"],"sourcesContent":[".ui-button {\r\n border: 0;\r\n\r\n font-family: var(--ui-font-family);\r\n font-size: var(--ui-font-size-md);\r\n\r\n border-radius: var(--ui-radius-md);\r\n\r\n cursor: pointer;\r\n\r\n transition:\r\n background-color 150ms ease,\r\n opacity 150ms ease;\r\n}\r\n\r\n.ui-button--sm {\r\n padding:\r\n var(--ui-spacing-xs) var(--ui-spacing-sm);\r\n}\r\n\r\n.ui-button--md {\r\n padding:\r\n var(--ui-spacing-sm) var(--ui-spacing-md);\r\n}\r\n\r\n.ui-button--lg {\r\n padding:\r\n var(--ui-spacing-md) var(--ui-spacing-lg);\r\n}\r\n\r\n.ui-button--primary {\r\n background: var(--ui-color-primary);\r\n color: var(--ui-color-primary-foreground);\r\n}\r\n\r\n.ui-button--primary:hover:not(:disabled) {\r\n background: var(--ui-color-primary-hover);\r\n}\r\n\r\n.ui-button--secondary {\r\n background: var(--ui-color-secondary);\r\n color: var(--ui-color-secondary-foreground);\r\n}\r\n\r\n.ui-button--danger {\r\n background: var(--ui-color-danger);\r\n color: #ffffff;\r\n}\r\n\r\n.ui-button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}",".ui-input-controller {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-xs);\r\n}\r\n\r\n.ui-input-controller__label {\r\n font-family: var(--ui-font-family);\r\n font-size: var(--ui-font-size-sm);\r\n color: var(--ui-color-foreground);\r\n\r\n cursor: pointer;\r\n}\r\n\r\n.ui-input-controller__input {\r\n width: 100%;\r\n box-sizing: border-box;\r\n\r\n padding:\r\n var(--ui-spacing-sm) var(--ui-spacing-md);\r\n\r\n font-family: var(--ui-font-family);\r\n font-size: var(--ui-font-size-md);\r\n\r\n color: var(--ui-color-foreground);\r\n background: var(--ui-color-background);\r\n\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n\r\n outline: none;\r\n\r\n transition:\r\n border-color 150ms ease,\r\n box-shadow 150ms ease,\r\n opacity 150ms ease;\r\n}\r\n\r\n.ui-input-controller__input::placeholder {\r\n color: var(--ui-color-muted-foreground);\r\n}\r\n\r\n.ui-input-controller__input:hover:not(:disabled) {\r\n border-color: var(--ui-color-primary);\r\n}\r\n\r\n.ui-input-controller__input:focus {\r\n border-color: var(--ui-color-primary);\r\n\r\n box-shadow:\r\n 0 0 0 2px color-mix(in srgb,\r\n var(--ui-color-primary) 15%,\r\n transparent);\r\n}\r\n\r\n.ui-input-controller__input--error {\r\n border-color: var(--ui-color-danger);\r\n}\r\n\r\n.ui-input-controller__input--error:focus {\r\n border-color: var(--ui-color-danger);\r\n\r\n box-shadow:\r\n 0 0 0 2px color-mix(in srgb,\r\n var(--ui-color-danger) 15%,\r\n transparent);\r\n}\r\n\r\n.ui-input-controller__input--disabled,\r\n.ui-input-controller__input:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ui-input-controller__error {\r\n font-family: var(--ui-font-family);\r\n font-size: var(--ui-font-size-sm);\r\n color: var(--ui-color-danger);\r\n}"],"mappings":";AAAA,CAAC;AACG,UAAQ;AAER,eAAa,IAAI;AACjB,aAAW,IAAI;AAEf,iBAAe,IAAI;AAEnB,UAAQ;AAER,cACI,iBAAiB,MAAM,IAAI,EAC3B,QAAQ,MAAM;AACtB;AAEA,CAAC;AACG,WACI,IAAI,iBAAiB,IAAI;AACjC;AAEA,CAAC;AACG,WACI,IAAI,iBAAiB,IAAI;AACjC;AAEA,CAAC;AACG,WACI,IAAI,iBAAiB,IAAI;AACjC;AAEA,CAAC;AACG,cAAY,IAAI;AAChB,SAAO,IAAI;AACf;AAEA,CALC,kBAKkB,MAAM,KAAK;AAC1B,cAAY,IAAI;AACpB;AAEA,CAAC;AACG,cAAY,IAAI;AAChB,SAAO,IAAI;AACf;AAEA,CAAC;AACG,cAAY,IAAI;AAChB,SAAO;AACX;AAEA,CAjDC,SAiDS;AACN,WAAS;AACT,UAAQ;AACZ;;;ACpDA,CAAC;AACG,WAAS;AACT,kBAAgB;AAChB,OAAK,IAAI;AACb;AAEA,CAAC;AACG,eAAa,IAAI;AACjB,aAAW,IAAI;AACf,SAAO,IAAI;AAEX,UAAQ;AACZ;AAEA,CAAC;AACG,SAAO;AACP,cAAY;AAEZ,WACI,IAAI,iBAAiB,IAAI;AAE7B,eAAa,IAAI;AACjB,aAAW,IAAI;AAEf,SAAO,IAAI;AACX,cAAY,IAAI;AAEhB,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe,IAAI;AAEnB,WAAS;AAET;AAAA,IACI,aAAa,MAAM,IAAI;AAAA,IACvB,WAAW,MAAM,IAAI;AAAA,IACrB,QAAQ,MAAM;AACtB;AAEA,CAxBC,0BAwB0B;AACvB,SAAO,IAAI;AACf;AAEA,CA5BC,0BA4B0B,MAAM,KAAK;AAClC,gBAAc,IAAI;AACtB;AAEA,CAhCC,0BAgC0B;AACvB,gBAAc,IAAI;AAElB,cACI,EAAE,EAAE,EAAE,IAAI,UAAU,GAAG,IAAI,EACvB,IAAI,oBAAoB,GAAG,EAC3B;AACZ;AAEA,CAAC;AACG,gBAAc,IAAI;AACtB;AAEA,CAJC,iCAIiC;AAC9B,gBAAc,IAAI;AAElB,cACI,EAAE,EAAE,EAAE,IAAI,UAAU,GAAG,IAAI,EACvB,IAAI,mBAAmB,GAAG,EAC1B;AACZ;AAEA,CAAC;AACD,CAvDC,0BAuD0B;AACvB,WAAS;AACT,UAAQ;AACZ;AAEA,CAAC;AACG,eAAa,IAAI;AACjB,aAAW,IAAI;AACf,SAAO,IAAI;AACf;","names":[]}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, ButtonHTMLAttributes } from 'react';
2
+ import { ReactNode, ButtonHTMLAttributes, InputHTMLAttributes } from 'react';
3
+ import { FieldValues, Control, FieldPath } from 'react-hook-form';
3
4
 
4
5
  interface UITheme {
5
6
  color?: {
@@ -66,4 +67,21 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
66
67
 
67
68
  declare function Button({ children, variant, size, loading, disabled, className, ...props }: ButtonProps): react.JSX.Element;
68
69
 
69
- export { Button, type ButtonProps, UIProvider, type UITheme, useUITheme };
70
+ interface InputControllerClasses {
71
+ root?: string;
72
+ label?: string;
73
+ input?: string;
74
+ error?: string;
75
+ }
76
+ interface InputControllerProps<TFieldValues extends FieldValues = FieldValues> extends Omit<InputHTMLAttributes<HTMLInputElement>, "name"> {
77
+ label?: ReactNode;
78
+ placeholder?: string;
79
+ control: Control<TFieldValues>;
80
+ name: FieldPath<TFieldValues>;
81
+ classes?: InputControllerClasses;
82
+ showError?: boolean;
83
+ }
84
+
85
+ declare function InputController<TFieldValues extends Record<string, unknown>>({ label, placeholder, control, name, classes, showError, id, ...props }: InputControllerProps<TFieldValues>): react.JSX.Element;
86
+
87
+ export { Button, type ButtonProps, InputController, type InputControllerClasses, type InputControllerProps, UIProvider, type UITheme, useUITheme };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, ButtonHTMLAttributes } from 'react';
2
+ import { ReactNode, ButtonHTMLAttributes, InputHTMLAttributes } from 'react';
3
+ import { FieldValues, Control, FieldPath } from 'react-hook-form';
3
4
 
4
5
  interface UITheme {
5
6
  color?: {
@@ -66,4 +67,21 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
66
67
 
67
68
  declare function Button({ children, variant, size, loading, disabled, className, ...props }: ButtonProps): react.JSX.Element;
68
69
 
69
- export { Button, type ButtonProps, UIProvider, type UITheme, useUITheme };
70
+ interface InputControllerClasses {
71
+ root?: string;
72
+ label?: string;
73
+ input?: string;
74
+ error?: string;
75
+ }
76
+ interface InputControllerProps<TFieldValues extends FieldValues = FieldValues> extends Omit<InputHTMLAttributes<HTMLInputElement>, "name"> {
77
+ label?: ReactNode;
78
+ placeholder?: string;
79
+ control: Control<TFieldValues>;
80
+ name: FieldPath<TFieldValues>;
81
+ classes?: InputControllerClasses;
82
+ showError?: boolean;
83
+ }
84
+
85
+ declare function InputController<TFieldValues extends Record<string, unknown>>({ label, placeholder, control, name, classes, showError, id, ...props }: InputControllerProps<TFieldValues>): react.JSX.Element;
86
+
87
+ export { Button, type ButtonProps, InputController, type InputControllerClasses, type InputControllerProps, UIProvider, type UITheme, useUITheme };
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ "use client";
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -21,6 +22,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
22
  var index_exports = {};
22
23
  __export(index_exports, {
23
24
  Button: () => Button,
25
+ InputController: () => InputController,
24
26
  UIProvider: () => UIProvider,
25
27
  useUITheme: () => useUITheme
26
28
  });
@@ -169,9 +171,94 @@ function Button({
169
171
  }
170
172
  );
171
173
  }
174
+
175
+ // src/components/InputController/Controller.tsx
176
+ var import_react_hook_form = require("react-hook-form");
177
+ var import_jsx_runtime3 = require("react/jsx-runtime");
178
+ function InputController({
179
+ label,
180
+ placeholder,
181
+ control,
182
+ name,
183
+ classes = {},
184
+ showError = true,
185
+ id,
186
+ ...props
187
+ }) {
188
+ const inputId = id ?? String(name);
189
+ const errorId = `${inputId}-error`;
190
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
191
+ import_react_hook_form.Controller,
192
+ {
193
+ name,
194
+ control,
195
+ render: ({
196
+ field,
197
+ fieldState
198
+ }) => {
199
+ const hasError = Boolean(fieldState.error);
200
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
201
+ "div",
202
+ {
203
+ className: [
204
+ "ui-input-controller",
205
+ classes.root
206
+ ].filter(Boolean).join(" "),
207
+ children: [
208
+ label && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
209
+ "label",
210
+ {
211
+ htmlFor: inputId,
212
+ className: [
213
+ "ui-input-controller__label",
214
+ classes.label
215
+ ].filter(Boolean).join(" "),
216
+ children: label
217
+ }
218
+ ),
219
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
220
+ "input",
221
+ {
222
+ ...props,
223
+ ...field,
224
+ id: inputId,
225
+ name: field.name,
226
+ placeholder,
227
+ value: field.value ?? "",
228
+ "aria-invalid": hasError,
229
+ "aria-describedby": hasError && showError ? errorId : void 0,
230
+ disabled: props.disabled || field.disabled,
231
+ className: [
232
+ "ui-input-controller__input",
233
+ hasError ? "ui-input-controller__input--error" : "",
234
+ props.disabled ? "ui-input-controller__input--disabled" : "",
235
+ classes.input
236
+ ].filter(Boolean).join(" ")
237
+ }
238
+ ),
239
+ hasError && showError && fieldState.error?.message && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
240
+ "span",
241
+ {
242
+ id: errorId,
243
+ role: "alert",
244
+ className: [
245
+ "ui-input-controller__error",
246
+ classes.error
247
+ ].filter(Boolean).join(" "),
248
+ children: fieldState.error.message
249
+ }
250
+ )
251
+ ]
252
+ }
253
+ );
254
+ }
255
+ }
256
+ );
257
+ }
172
258
  // Annotate the CommonJS export names for ESM import in node:
173
259
  0 && (module.exports = {
174
260
  Button,
261
+ InputController,
175
262
  UIProvider,
176
263
  useUITheme
177
264
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/theme/UIProvider.tsx","../src/theme/defaultTheme.ts","../src/theme/utils.ts","../src/components/Button/Button.tsx"],"sourcesContent":["export {\r\n UIProvider,\r\n useUITheme,\r\n} from \"./theme/UIProvider\";\r\n\r\nexport type {\r\n UITheme,\r\n} from \"./theme/types\";\r\n\r\nexport {\r\n Button,\r\n} from \"./components/Button\";\r\n\r\nexport type {\r\n ButtonProps,\r\n} from \"./components/Button\";","import {\r\n createContext,\r\n useContext,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport { defaultTheme } from \"./defaultTheme\";\r\nimport { mergeTheme, themeToCSSVariables } from \"./utils\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ninterface UIProviderProps {\r\n children: ReactNode;\r\n theme?: UITheme;\r\n}\r\n\r\nconst ThemeContext = createContext<UITheme>(defaultTheme);\r\n\r\nexport function UIProvider({\r\n children,\r\n theme,\r\n}: UIProviderProps) {\r\n const mergedTheme = useMemo(\r\n () => mergeTheme(defaultTheme as any, theme),\r\n [theme]\r\n );\r\n\r\n const cssVariables = useMemo(\r\n () => themeToCSSVariables(mergedTheme),\r\n [mergedTheme]\r\n );\r\n\r\n return (\r\n <ThemeContext.Provider value={mergedTheme}>\r\n <div\r\n data-ui-provider=\"\"\r\n style={cssVariables as CSSProperties}\r\n >\r\n {children}\r\n </div>\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useUITheme() {\r\n return useContext(ThemeContext);\r\n}","import type { UITheme } from \"./types\";\r\n\r\nexport const defaultTheme: UITheme = {\r\n color: {\r\n primary: \"#2563eb\",\r\n primaryHover: \"#1d4ed8\",\r\n primaryActive: \"#1e40af\",\r\n primaryForeground: \"#ffffff\",\r\n\r\n secondary: \"#64748b\",\r\n secondaryHover: \"#475569\",\r\n secondaryForeground: \"#ffffff\",\r\n\r\n background: \"#ffffff\",\r\n foreground: \"#0f172a\",\r\n surface: \"#f8fafc\",\r\n border: \"#e2e8f0\",\r\n muted: \"#64748b\",\r\n\r\n success: \"#16a34a\",\r\n warning: \"#d97706\",\r\n danger: \"#dc2626\",\r\n },\r\n\r\n radius: {\r\n sm: \"4px\",\r\n md: \"8px\",\r\n lg: \"12px\",\r\n xl: \"16px\",\r\n full: \"9999px\",\r\n },\r\n\r\n spacing: {\r\n xs: \"4px\",\r\n sm: \"8px\",\r\n md: \"16px\",\r\n lg: \"24px\",\r\n xl: \"32px\",\r\n },\r\n\r\n font: {\r\n family: \"inherit\",\r\n\r\n size: {\r\n sm: \"12px\",\r\n md: \"14px\",\r\n lg: \"16px\",\r\n xl: \"20px\",\r\n },\r\n },\r\n\r\n shadow: {\r\n sm: \"0 1px 2px rgba(0,0,0,0.05)\",\r\n md: \"0 4px 6px rgba(0,0,0,0.1)\",\r\n lg: \"0 10px 15px rgba(0,0,0,0.1)\",\r\n },\r\n};","import type { CSSProperties } from \"react\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ntype CSSVariables = CSSProperties & Record<`--ui-${string}`, string>;\r\n\r\nconst camelToKebab = (value: string) =>\r\n value.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n\r\nexport function themeToCSSVariables(\r\n theme: UITheme,\r\n prefix = \"ui\"\r\n): CSSVariables {\r\n const variables: Record<string, string> = {};\r\n\r\n const walk = (\r\n object: Record<string, unknown>,\r\n path: string[] = []\r\n ) => {\r\n Object.entries(object).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n const nextPath = [...path, camelToKebab(key)];\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n walk(value as Record<string, unknown>, nextPath);\r\n return;\r\n }\r\n\r\n variables[\r\n `--${prefix}-${nextPath.join(\"-\")}`\r\n ] = String(value);\r\n });\r\n };\r\n\r\n walk(theme as Record<string, unknown>);\r\n\r\n return variables as CSSVariables;\r\n}\r\n\r\nexport function mergeTheme<T extends Record<string, unknown>>(\r\n target: T,\r\n source?: Partial<T>\r\n): T {\r\n if (!source) {\r\n return { ...target };\r\n }\r\n\r\n const result: Record<string, unknown> = { ...target };\r\n\r\n Object.entries(source).forEach(([key, sourceValue]) => {\r\n const targetValue = result[key];\r\n\r\n if (\r\n sourceValue !== null &&\r\n typeof sourceValue === \"object\" &&\r\n !Array.isArray(sourceValue)\r\n ) {\r\n result[key] = mergeTheme(\r\n (targetValue ?? {}) as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n );\r\n } else if (sourceValue !== undefined) {\r\n result[key] = sourceValue;\r\n }\r\n });\r\n\r\n return result as T;\r\n}","import type { ButtonProps } from \"./Button.types\";\r\n\r\nimport \"./Button.css\";\r\n\r\nexport function Button({\r\n children,\r\n variant = \"primary\",\r\n size = \"md\",\r\n loading = false,\r\n disabled,\r\n className = \"\",\r\n ...props\r\n}: ButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n disabled={disabled || loading}\r\n className={[\r\n \"ui-button\",\r\n `ui-button--${variant}`,\r\n `ui-button--${size}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {loading ? \"Loading...\" : children}\r\n </button>\r\n );\r\n}"],"mappings":"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","names":["import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/theme/UIProvider.tsx","../src/theme/defaultTheme.ts","../src/theme/utils.ts","../src/components/Button/Button.tsx","../src/components/InputController/Controller.tsx"],"sourcesContent":["\"use client\";\r\n// UI Provider\r\nexport { UIProvider, useUITheme } from \"./theme/UIProvider\";\r\n\r\nexport type { UITheme } from \"./theme/types\";\r\n\r\n// Buttons\r\nexport { Button } from \"./components/Button\";\r\n\r\nexport type { ButtonProps } from \"./components/Button\";\r\n\r\n// Controllers\r\n\r\nexport { InputController } from \"./components/InputController\"\r\nexport type { InputControllerClasses, InputControllerProps } from \"./components/InputController\"","\"use client\";\r\nimport {\r\n createContext,\r\n useContext,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport { defaultTheme } from \"./defaultTheme\";\r\nimport { mergeTheme, themeToCSSVariables } from \"./utils\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ninterface UIProviderProps {\r\n children: ReactNode;\r\n theme?: UITheme;\r\n}\r\n\r\nconst ThemeContext = createContext<UITheme>(defaultTheme);\r\n\r\nexport function UIProvider({\r\n children,\r\n theme,\r\n}: UIProviderProps) {\r\n const mergedTheme = useMemo(\r\n () => mergeTheme(defaultTheme as any, theme),\r\n [theme]\r\n );\r\n\r\n const cssVariables = useMemo(\r\n () => themeToCSSVariables(mergedTheme),\r\n [mergedTheme]\r\n );\r\n\r\n return (\r\n <ThemeContext.Provider value={mergedTheme}>\r\n <div\r\n data-ui-provider=\"\"\r\n style={cssVariables as CSSProperties}\r\n >\r\n {children}\r\n </div>\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useUITheme() {\r\n return useContext(ThemeContext);\r\n}","import type { UITheme } from \"./types\";\r\n\r\nexport const defaultTheme: UITheme = {\r\n color: {\r\n primary: \"#2563eb\",\r\n primaryHover: \"#1d4ed8\",\r\n primaryActive: \"#1e40af\",\r\n primaryForeground: \"#ffffff\",\r\n\r\n secondary: \"#64748b\",\r\n secondaryHover: \"#475569\",\r\n secondaryForeground: \"#ffffff\",\r\n\r\n background: \"#ffffff\",\r\n foreground: \"#0f172a\",\r\n surface: \"#f8fafc\",\r\n border: \"#e2e8f0\",\r\n muted: \"#64748b\",\r\n\r\n success: \"#16a34a\",\r\n warning: \"#d97706\",\r\n danger: \"#dc2626\",\r\n },\r\n\r\n radius: {\r\n sm: \"4px\",\r\n md: \"8px\",\r\n lg: \"12px\",\r\n xl: \"16px\",\r\n full: \"9999px\",\r\n },\r\n\r\n spacing: {\r\n xs: \"4px\",\r\n sm: \"8px\",\r\n md: \"16px\",\r\n lg: \"24px\",\r\n xl: \"32px\",\r\n },\r\n\r\n font: {\r\n family: \"inherit\",\r\n\r\n size: {\r\n sm: \"12px\",\r\n md: \"14px\",\r\n lg: \"16px\",\r\n xl: \"20px\",\r\n },\r\n },\r\n\r\n shadow: {\r\n sm: \"0 1px 2px rgba(0,0,0,0.05)\",\r\n md: \"0 4px 6px rgba(0,0,0,0.1)\",\r\n lg: \"0 10px 15px rgba(0,0,0,0.1)\",\r\n },\r\n};","import type { CSSProperties } from \"react\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ntype CSSVariables = CSSProperties & Record<`--ui-${string}`, string>;\r\n\r\nconst camelToKebab = (value: string) =>\r\n value.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n\r\nexport function themeToCSSVariables(\r\n theme: UITheme,\r\n prefix = \"ui\"\r\n): CSSVariables {\r\n const variables: Record<string, string> = {};\r\n\r\n const walk = (\r\n object: Record<string, unknown>,\r\n path: string[] = []\r\n ) => {\r\n Object.entries(object).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n const nextPath = [...path, camelToKebab(key)];\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n walk(value as Record<string, unknown>, nextPath);\r\n return;\r\n }\r\n\r\n variables[\r\n `--${prefix}-${nextPath.join(\"-\")}`\r\n ] = String(value);\r\n });\r\n };\r\n\r\n walk(theme as Record<string, unknown>);\r\n\r\n return variables as CSSVariables;\r\n}\r\n\r\nexport function mergeTheme<T extends Record<string, unknown>>(\r\n target: T,\r\n source?: Partial<T>\r\n): T {\r\n if (!source) {\r\n return { ...target };\r\n }\r\n\r\n const result: Record<string, unknown> = { ...target };\r\n\r\n Object.entries(source).forEach(([key, sourceValue]) => {\r\n const targetValue = result[key];\r\n\r\n if (\r\n sourceValue !== null &&\r\n typeof sourceValue === \"object\" &&\r\n !Array.isArray(sourceValue)\r\n ) {\r\n result[key] = mergeTheme(\r\n (targetValue ?? {}) as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n );\r\n } else if (sourceValue !== undefined) {\r\n result[key] = sourceValue;\r\n }\r\n });\r\n\r\n return result as T;\r\n}","import type { ButtonProps } from \"./Button.types\";\r\n\r\nimport \"./Button.css\";\r\n\r\nexport function Button({\r\n children,\r\n variant = \"primary\",\r\n size = \"md\",\r\n loading = false,\r\n disabled,\r\n className = \"\",\r\n ...props\r\n}: ButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n disabled={disabled || loading}\r\n className={[\r\n \"ui-button\",\r\n `ui-button--${variant}`,\r\n `ui-button--${size}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {loading ? \"Loading...\" : children}\r\n </button>\r\n );\r\n}","\"use client\";\r\n\r\nimport { Controller } from \"react-hook-form\";\r\n\r\nimport type { InputControllerProps } from \"./Controller.types\";\r\n\r\nimport \"./Controller.css\";\r\n\r\nexport function InputController<\r\n TFieldValues extends Record<string, unknown>,\r\n>({\r\n label,\r\n placeholder,\r\n control,\r\n name,\r\n classes = {},\r\n showError = true,\r\n id,\r\n ...props\r\n}: InputControllerProps<TFieldValues>) {\r\n const inputId = id ?? String(name);\r\n const errorId = `${inputId}-error`;\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({\r\n field,\r\n fieldState,\r\n }) => {\r\n const hasError = Boolean(fieldState.error);\r\n\r\n return (\r\n <div\r\n className={[\r\n \"ui-input-controller\",\r\n classes.root,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {label && (\r\n <label\r\n htmlFor={inputId}\r\n className={[\r\n \"ui-input-controller__label\",\r\n classes.label,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <input\r\n {...props}\r\n {...field}\r\n id={inputId}\r\n name={field.name}\r\n placeholder={placeholder}\r\n value={field.value ?? \"\" as any}\r\n aria-invalid={\r\n hasError\r\n }\r\n aria-describedby={\r\n hasError && showError\r\n ? errorId\r\n : undefined\r\n }\r\n disabled={\r\n props.disabled ||\r\n field.disabled\r\n }\r\n className={[\r\n \"ui-input-controller__input\",\r\n hasError\r\n ? \"ui-input-controller__input--error\"\r\n : \"\",\r\n props.disabled\r\n ? \"ui-input-controller__input--disabled\"\r\n : \"\",\r\n classes.input,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n />\r\n\r\n {hasError &&\r\n showError &&\r\n fieldState.error?.message && (\r\n <span\r\n id={errorId}\r\n role=\"alert\"\r\n className={[\r\n \"ui-input-controller__error\",\r\n classes.error,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {\r\n fieldState\r\n .error\r\n .message\r\n }\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }}\r\n />\r\n );\r\n}"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  // src/theme/UIProvider.tsx
2
4
  import {
3
5
  createContext,
@@ -145,8 +147,93 @@ function Button({
145
147
  }
146
148
  );
147
149
  }
150
+
151
+ // src/components/InputController/Controller.tsx
152
+ import { Controller } from "react-hook-form";
153
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
154
+ function InputController({
155
+ label,
156
+ placeholder,
157
+ control,
158
+ name,
159
+ classes = {},
160
+ showError = true,
161
+ id,
162
+ ...props
163
+ }) {
164
+ const inputId = id ?? String(name);
165
+ const errorId = `${inputId}-error`;
166
+ return /* @__PURE__ */ jsx3(
167
+ Controller,
168
+ {
169
+ name,
170
+ control,
171
+ render: ({
172
+ field,
173
+ fieldState
174
+ }) => {
175
+ const hasError = Boolean(fieldState.error);
176
+ return /* @__PURE__ */ jsxs(
177
+ "div",
178
+ {
179
+ className: [
180
+ "ui-input-controller",
181
+ classes.root
182
+ ].filter(Boolean).join(" "),
183
+ children: [
184
+ label && /* @__PURE__ */ jsx3(
185
+ "label",
186
+ {
187
+ htmlFor: inputId,
188
+ className: [
189
+ "ui-input-controller__label",
190
+ classes.label
191
+ ].filter(Boolean).join(" "),
192
+ children: label
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsx3(
196
+ "input",
197
+ {
198
+ ...props,
199
+ ...field,
200
+ id: inputId,
201
+ name: field.name,
202
+ placeholder,
203
+ value: field.value ?? "",
204
+ "aria-invalid": hasError,
205
+ "aria-describedby": hasError && showError ? errorId : void 0,
206
+ disabled: props.disabled || field.disabled,
207
+ className: [
208
+ "ui-input-controller__input",
209
+ hasError ? "ui-input-controller__input--error" : "",
210
+ props.disabled ? "ui-input-controller__input--disabled" : "",
211
+ classes.input
212
+ ].filter(Boolean).join(" ")
213
+ }
214
+ ),
215
+ hasError && showError && fieldState.error?.message && /* @__PURE__ */ jsx3(
216
+ "span",
217
+ {
218
+ id: errorId,
219
+ role: "alert",
220
+ className: [
221
+ "ui-input-controller__error",
222
+ classes.error
223
+ ].filter(Boolean).join(" "),
224
+ children: fieldState.error.message
225
+ }
226
+ )
227
+ ]
228
+ }
229
+ );
230
+ }
231
+ }
232
+ );
233
+ }
148
234
  export {
149
235
  Button,
236
+ InputController,
150
237
  UIProvider,
151
238
  useUITheme
152
239
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/UIProvider.tsx","../src/theme/defaultTheme.ts","../src/theme/utils.ts","../src/components/Button/Button.tsx"],"sourcesContent":["import {\r\n createContext,\r\n useContext,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport { defaultTheme } from \"./defaultTheme\";\r\nimport { mergeTheme, themeToCSSVariables } from \"./utils\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ninterface UIProviderProps {\r\n children: ReactNode;\r\n theme?: UITheme;\r\n}\r\n\r\nconst ThemeContext = createContext<UITheme>(defaultTheme);\r\n\r\nexport function UIProvider({\r\n children,\r\n theme,\r\n}: UIProviderProps) {\r\n const mergedTheme = useMemo(\r\n () => mergeTheme(defaultTheme as any, theme),\r\n [theme]\r\n );\r\n\r\n const cssVariables = useMemo(\r\n () => themeToCSSVariables(mergedTheme),\r\n [mergedTheme]\r\n );\r\n\r\n return (\r\n <ThemeContext.Provider value={mergedTheme}>\r\n <div\r\n data-ui-provider=\"\"\r\n style={cssVariables as CSSProperties}\r\n >\r\n {children}\r\n </div>\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useUITheme() {\r\n return useContext(ThemeContext);\r\n}","import type { UITheme } from \"./types\";\r\n\r\nexport const defaultTheme: UITheme = {\r\n color: {\r\n primary: \"#2563eb\",\r\n primaryHover: \"#1d4ed8\",\r\n primaryActive: \"#1e40af\",\r\n primaryForeground: \"#ffffff\",\r\n\r\n secondary: \"#64748b\",\r\n secondaryHover: \"#475569\",\r\n secondaryForeground: \"#ffffff\",\r\n\r\n background: \"#ffffff\",\r\n foreground: \"#0f172a\",\r\n surface: \"#f8fafc\",\r\n border: \"#e2e8f0\",\r\n muted: \"#64748b\",\r\n\r\n success: \"#16a34a\",\r\n warning: \"#d97706\",\r\n danger: \"#dc2626\",\r\n },\r\n\r\n radius: {\r\n sm: \"4px\",\r\n md: \"8px\",\r\n lg: \"12px\",\r\n xl: \"16px\",\r\n full: \"9999px\",\r\n },\r\n\r\n spacing: {\r\n xs: \"4px\",\r\n sm: \"8px\",\r\n md: \"16px\",\r\n lg: \"24px\",\r\n xl: \"32px\",\r\n },\r\n\r\n font: {\r\n family: \"inherit\",\r\n\r\n size: {\r\n sm: \"12px\",\r\n md: \"14px\",\r\n lg: \"16px\",\r\n xl: \"20px\",\r\n },\r\n },\r\n\r\n shadow: {\r\n sm: \"0 1px 2px rgba(0,0,0,0.05)\",\r\n md: \"0 4px 6px rgba(0,0,0,0.1)\",\r\n lg: \"0 10px 15px rgba(0,0,0,0.1)\",\r\n },\r\n};","import type { CSSProperties } from \"react\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ntype CSSVariables = CSSProperties & Record<`--ui-${string}`, string>;\r\n\r\nconst camelToKebab = (value: string) =>\r\n value.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n\r\nexport function themeToCSSVariables(\r\n theme: UITheme,\r\n prefix = \"ui\"\r\n): CSSVariables {\r\n const variables: Record<string, string> = {};\r\n\r\n const walk = (\r\n object: Record<string, unknown>,\r\n path: string[] = []\r\n ) => {\r\n Object.entries(object).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n const nextPath = [...path, camelToKebab(key)];\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n walk(value as Record<string, unknown>, nextPath);\r\n return;\r\n }\r\n\r\n variables[\r\n `--${prefix}-${nextPath.join(\"-\")}`\r\n ] = String(value);\r\n });\r\n };\r\n\r\n walk(theme as Record<string, unknown>);\r\n\r\n return variables as CSSVariables;\r\n}\r\n\r\nexport function mergeTheme<T extends Record<string, unknown>>(\r\n target: T,\r\n source?: Partial<T>\r\n): T {\r\n if (!source) {\r\n return { ...target };\r\n }\r\n\r\n const result: Record<string, unknown> = { ...target };\r\n\r\n Object.entries(source).forEach(([key, sourceValue]) => {\r\n const targetValue = result[key];\r\n\r\n if (\r\n sourceValue !== null &&\r\n typeof sourceValue === \"object\" &&\r\n !Array.isArray(sourceValue)\r\n ) {\r\n result[key] = mergeTheme(\r\n (targetValue ?? {}) as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n );\r\n } else if (sourceValue !== undefined) {\r\n result[key] = sourceValue;\r\n }\r\n });\r\n\r\n return result as T;\r\n}","import type { ButtonProps } from \"./Button.types\";\r\n\r\nimport \"./Button.css\";\r\n\r\nexport function Button({\r\n children,\r\n variant = \"primary\",\r\n size = \"md\",\r\n loading = false,\r\n disabled,\r\n className = \"\",\r\n ...props\r\n}: ButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n disabled={disabled || loading}\r\n className={[\r\n \"ui-button\",\r\n `ui-button--${variant}`,\r\n `ui-button--${size}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {loading ? \"Loading...\" : children}\r\n </button>\r\n );\r\n}"],"mappings":"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","names":["jsx"]}
1
+ {"version":3,"sources":["../src/theme/UIProvider.tsx","../src/theme/defaultTheme.ts","../src/theme/utils.ts","../src/components/Button/Button.tsx","../src/components/InputController/Controller.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createContext,\r\n useContext,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport { defaultTheme } from \"./defaultTheme\";\r\nimport { mergeTheme, themeToCSSVariables } from \"./utils\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ninterface UIProviderProps {\r\n children: ReactNode;\r\n theme?: UITheme;\r\n}\r\n\r\nconst ThemeContext = createContext<UITheme>(defaultTheme);\r\n\r\nexport function UIProvider({\r\n children,\r\n theme,\r\n}: UIProviderProps) {\r\n const mergedTheme = useMemo(\r\n () => mergeTheme(defaultTheme as any, theme),\r\n [theme]\r\n );\r\n\r\n const cssVariables = useMemo(\r\n () => themeToCSSVariables(mergedTheme),\r\n [mergedTheme]\r\n );\r\n\r\n return (\r\n <ThemeContext.Provider value={mergedTheme}>\r\n <div\r\n data-ui-provider=\"\"\r\n style={cssVariables as CSSProperties}\r\n >\r\n {children}\r\n </div>\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useUITheme() {\r\n return useContext(ThemeContext);\r\n}","import type { UITheme } from \"./types\";\r\n\r\nexport const defaultTheme: UITheme = {\r\n color: {\r\n primary: \"#2563eb\",\r\n primaryHover: \"#1d4ed8\",\r\n primaryActive: \"#1e40af\",\r\n primaryForeground: \"#ffffff\",\r\n\r\n secondary: \"#64748b\",\r\n secondaryHover: \"#475569\",\r\n secondaryForeground: \"#ffffff\",\r\n\r\n background: \"#ffffff\",\r\n foreground: \"#0f172a\",\r\n surface: \"#f8fafc\",\r\n border: \"#e2e8f0\",\r\n muted: \"#64748b\",\r\n\r\n success: \"#16a34a\",\r\n warning: \"#d97706\",\r\n danger: \"#dc2626\",\r\n },\r\n\r\n radius: {\r\n sm: \"4px\",\r\n md: \"8px\",\r\n lg: \"12px\",\r\n xl: \"16px\",\r\n full: \"9999px\",\r\n },\r\n\r\n spacing: {\r\n xs: \"4px\",\r\n sm: \"8px\",\r\n md: \"16px\",\r\n lg: \"24px\",\r\n xl: \"32px\",\r\n },\r\n\r\n font: {\r\n family: \"inherit\",\r\n\r\n size: {\r\n sm: \"12px\",\r\n md: \"14px\",\r\n lg: \"16px\",\r\n xl: \"20px\",\r\n },\r\n },\r\n\r\n shadow: {\r\n sm: \"0 1px 2px rgba(0,0,0,0.05)\",\r\n md: \"0 4px 6px rgba(0,0,0,0.1)\",\r\n lg: \"0 10px 15px rgba(0,0,0,0.1)\",\r\n },\r\n};","import type { CSSProperties } from \"react\";\r\nimport type { UITheme } from \"./types\";\r\n\r\ntype CSSVariables = CSSProperties & Record<`--ui-${string}`, string>;\r\n\r\nconst camelToKebab = (value: string) =>\r\n value.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n\r\nexport function themeToCSSVariables(\r\n theme: UITheme,\r\n prefix = \"ui\"\r\n): CSSVariables {\r\n const variables: Record<string, string> = {};\r\n\r\n const walk = (\r\n object: Record<string, unknown>,\r\n path: string[] = []\r\n ) => {\r\n Object.entries(object).forEach(([key, value]) => {\r\n if (value === undefined || value === null) return;\r\n\r\n const nextPath = [...path, camelToKebab(key)];\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n walk(value as Record<string, unknown>, nextPath);\r\n return;\r\n }\r\n\r\n variables[\r\n `--${prefix}-${nextPath.join(\"-\")}`\r\n ] = String(value);\r\n });\r\n };\r\n\r\n walk(theme as Record<string, unknown>);\r\n\r\n return variables as CSSVariables;\r\n}\r\n\r\nexport function mergeTheme<T extends Record<string, unknown>>(\r\n target: T,\r\n source?: Partial<T>\r\n): T {\r\n if (!source) {\r\n return { ...target };\r\n }\r\n\r\n const result: Record<string, unknown> = { ...target };\r\n\r\n Object.entries(source).forEach(([key, sourceValue]) => {\r\n const targetValue = result[key];\r\n\r\n if (\r\n sourceValue !== null &&\r\n typeof sourceValue === \"object\" &&\r\n !Array.isArray(sourceValue)\r\n ) {\r\n result[key] = mergeTheme(\r\n (targetValue ?? {}) as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n );\r\n } else if (sourceValue !== undefined) {\r\n result[key] = sourceValue;\r\n }\r\n });\r\n\r\n return result as T;\r\n}","import type { ButtonProps } from \"./Button.types\";\r\n\r\nimport \"./Button.css\";\r\n\r\nexport function Button({\r\n children,\r\n variant = \"primary\",\r\n size = \"md\",\r\n loading = false,\r\n disabled,\r\n className = \"\",\r\n ...props\r\n}: ButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n disabled={disabled || loading}\r\n className={[\r\n \"ui-button\",\r\n `ui-button--${variant}`,\r\n `ui-button--${size}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {loading ? \"Loading...\" : children}\r\n </button>\r\n );\r\n}","\"use client\";\r\n\r\nimport { Controller } from \"react-hook-form\";\r\n\r\nimport type { InputControllerProps } from \"./Controller.types\";\r\n\r\nimport \"./Controller.css\";\r\n\r\nexport function InputController<\r\n TFieldValues extends Record<string, unknown>,\r\n>({\r\n label,\r\n placeholder,\r\n control,\r\n name,\r\n classes = {},\r\n showError = true,\r\n id,\r\n ...props\r\n}: InputControllerProps<TFieldValues>) {\r\n const inputId = id ?? String(name);\r\n const errorId = `${inputId}-error`;\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({\r\n field,\r\n fieldState,\r\n }) => {\r\n const hasError = Boolean(fieldState.error);\r\n\r\n return (\r\n <div\r\n className={[\r\n \"ui-input-controller\",\r\n classes.root,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {label && (\r\n <label\r\n htmlFor={inputId}\r\n className={[\r\n \"ui-input-controller__label\",\r\n classes.label,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <input\r\n {...props}\r\n {...field}\r\n id={inputId}\r\n name={field.name}\r\n placeholder={placeholder}\r\n value={field.value ?? \"\" as any}\r\n aria-invalid={\r\n hasError\r\n }\r\n aria-describedby={\r\n hasError && showError\r\n ? errorId\r\n : undefined\r\n }\r\n disabled={\r\n props.disabled ||\r\n field.disabled\r\n }\r\n className={[\r\n \"ui-input-controller__input\",\r\n hasError\r\n ? \"ui-input-controller__input--error\"\r\n : \"\",\r\n props.disabled\r\n ? \"ui-input-controller__input--disabled\"\r\n : \"\",\r\n classes.input,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n />\r\n\r\n {hasError &&\r\n showError &&\r\n fieldState.error?.message && (\r\n <span\r\n id={errorId}\r\n role=\"alert\"\r\n className={[\r\n \"ui-input-controller__error\",\r\n classes.error,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n >\r\n {\r\n fieldState\r\n .error\r\n .message\r\n }\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }}\r\n />\r\n );\r\n}"],"mappings":"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","names":["jsx","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@true-kit/ui",
3
- "version": "0.1.2",
3
+ "version": "0.1.5",
4
4
  "description": "Reusable React UI components",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -21,13 +21,15 @@
21
21
  },
22
22
  "peerDependencies": {
23
23
  "react": ">=18",
24
- "react-dom": ">=18"
24
+ "react-dom": ">=18",
25
+ "react-hook-form": ">=7"
25
26
  },
26
27
  "devDependencies": {
27
28
  "@types/react": "^19.0.0",
28
29
  "@types/react-dom": "^19.0.0",
29
30
  "tsup": "^8.0.0",
30
- "typescript": "^5.0.0"
31
+ "typescript": "^5.0.0",
32
+ "react-hook-form": "^7.87.0"
31
33
  },
32
34
  "publishConfig": {
33
35
  "access": "public"