@lssm/lib.ui-kit 1.7.3 → 1.9.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 +82 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js +27 -16
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -1
- package/dist/node_modules/zod/v4/core/core.js +0 -1
- package/dist/node_modules/zod/v4/core/core.js.map +1 -1
- package/dist/node_modules/zod/v4/core/registries.js +0 -2
- package/dist/node_modules/zod/v4/core/registries.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/accordion.d.ts +5 -5
- package/dist/ui/accordion.js +4 -4
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/alert-dialog.d.ts +11 -11
- package/dist/ui/alert-dialog.js +9 -9
- package/dist/ui/alert-dialog.js.map +1 -1
- package/dist/ui/alert.d.ts +4 -4
- package/dist/ui/alert.d.ts.map +1 -1
- package/dist/ui/alert.js +3 -3
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/aspect-ratio.d.ts +5 -5
- package/dist/ui/aspect-ratio.d.ts.map +1 -1
- package/dist/ui/avatar.d.ts +4 -4
- package/dist/ui/avatar.d.ts.map +1 -1
- package/dist/ui/avatar.js +3 -3
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/badge.d.ts +3 -3
- package/dist/ui/badge.js +1 -1
- package/dist/ui/badge.js.map +1 -1
- package/dist/ui/breadcrumb.d.ts +8 -8
- package/dist/ui/breadcrumb.js +6 -6
- package/dist/ui/breadcrumb.js.map +1 -1
- package/dist/ui/button.d.ts +4 -4
- package/dist/ui/button.d.ts.map +1 -1
- package/dist/ui/button.js +1 -1
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/card.d.ts +7 -7
- package/dist/ui/card.js +6 -6
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/checkbox.d.ts +3 -3
- package/dist/ui/checkbox.d.ts.map +1 -1
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/checkbox.js.map +1 -1
- package/dist/ui/collapsible.d.ts +8 -8
- package/dist/ui/context-menu.d.ts +16 -16
- package/dist/ui/context-menu.d.ts.map +1 -1
- package/dist/ui/context-menu.js +9 -9
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/date-picker.d.ts +2 -2
- package/dist/ui/date-range-picker.d.ts +2 -2
- package/dist/ui/datetime-picker.d.ts +2 -2
- package/dist/ui/datetime-picker.d.ts.map +1 -1
- package/dist/ui/dialog.d.ts +10 -10
- package/dist/ui/dialog.js +7 -7
- package/dist/ui/dialog.js.map +1 -1
- package/dist/ui/dropdown-menu.d.ts +16 -16
- package/dist/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/ui/dropdown-menu.js +9 -9
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/empty-state.d.ts +4 -4
- package/dist/ui/empty-state.d.ts.map +1 -1
- package/dist/ui/empty.d.ts +9 -9
- package/dist/ui/empty.d.ts.map +1 -1
- package/dist/ui/empty.js +6 -6
- package/dist/ui/empty.js.map +1 -1
- package/dist/ui/fab.d.ts +3 -3
- package/dist/ui/field.d.ts +14 -14
- package/dist/ui/field.d.ts.map +1 -1
- package/dist/ui/field.js +10 -11
- package/dist/ui/field.js.map +1 -1
- package/dist/ui/form.d.ts +7 -7
- package/dist/ui/form.d.ts.map +1 -1
- package/dist/ui/form.js +5 -6
- package/dist/ui/form.js.map +1 -1
- package/dist/ui/hover-card.d.ts +6 -6
- package/dist/ui/hover-card.d.ts.map +1 -1
- package/dist/ui/hover-card.js +1 -1
- package/dist/ui/hover-card.js.map +1 -1
- package/dist/ui/input.d.ts +2 -2
- package/dist/ui/input.d.ts.map +1 -1
- package/dist/ui/input.js +1 -1
- package/dist/ui/input.js.map +1 -1
- package/dist/ui/label.d.ts +2 -2
- package/dist/ui/label.d.ts.map +1 -1
- package/dist/ui/label.js +1 -1
- package/dist/ui/label.js.map +1 -1
- package/dist/ui/link.d.ts +2 -2
- package/dist/ui/link.d.ts.map +1 -1
- package/dist/ui/link.js +1 -1
- package/dist/ui/link.js.map +1 -1
- package/dist/ui/loading-button.d.ts +2 -2
- package/dist/ui/loading-button.d.ts.map +1 -1
- package/dist/ui/loading-button.js +1 -1
- package/dist/ui/loading-button.js.map +1 -1
- package/dist/ui/loading-overlay.d.ts +2 -2
- package/dist/ui/loading-overlay.d.ts.map +1 -1
- package/dist/ui/loading-screen.d.ts +2 -2
- package/dist/ui/marketing/FeatureGrid.d.ts +2 -2
- package/dist/ui/marketing/Hero.d.ts +2 -2
- package/dist/ui/marketing/PricingTable.d.ts +2 -2
- package/dist/ui/menubar.d.ts +17 -17
- package/dist/ui/menubar.d.ts.map +1 -1
- package/dist/ui/menubar.js +11 -11
- package/dist/ui/menubar.js.map +1 -1
- package/dist/ui/molecules/SkeletonList.d.ts +2 -2
- package/dist/ui/navigation-menu.d.ts +10 -10
- package/dist/ui/navigation-menu.js +6 -6
- package/dist/ui/navigation-menu.js.map +1 -1
- package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.d.ts +2 -2
- package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
- package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.js +0 -1
- package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.js.map +1 -1
- package/dist/ui/organisms/ListPage/ListPage.d.ts +2 -2
- package/dist/ui/organisms/ListPage/ListPage.d.ts.map +1 -1
- package/dist/ui/page-header.d.ts +4 -4
- package/dist/ui/page-header.d.ts.map +1 -1
- package/dist/ui/password-strength.d.ts +2 -2
- package/dist/ui/password-strength.d.ts.map +1 -1
- package/dist/ui/popover.d.ts +8 -8
- package/dist/ui/popover.d.ts.map +1 -1
- package/dist/ui/popover.js +1 -1
- package/dist/ui/popover.js.map +1 -1
- package/dist/ui/progress.d.ts +2 -2
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +1 -1
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/radio-group.d.ts +3 -3
- package/dist/ui/radio-group.js +2 -2
- package/dist/ui/radio-group.js.map +1 -1
- package/dist/ui/select.d.ts +13 -13
- package/dist/ui/select.d.ts.map +1 -1
- package/dist/ui/select.js +7 -7
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/separator.d.ts +2 -2
- package/dist/ui/separator.d.ts.map +1 -1
- package/dist/ui/separator.js +1 -1
- package/dist/ui/separator.js.map +1 -1
- package/dist/ui/skeleton.d.ts +2 -2
- package/dist/ui/skeleton.js +1 -1
- package/dist/ui/skeleton.js.map +1 -1
- package/dist/ui/stack.d.ts +17 -17
- package/dist/ui/stack.d.ts.map +1 -1
- package/dist/ui/stack.js +3 -3
- package/dist/ui/stack.js.map +1 -1
- package/dist/ui/stepper.d.ts +4 -4
- package/dist/ui/stepper.d.ts.map +1 -1
- package/dist/ui/switch.d.ts +2 -2
- package/dist/ui/switch.js +2 -2
- package/dist/ui/switch.js.map +1 -1
- package/dist/ui/table.d.ts +8 -8
- package/dist/ui/table.js +7 -7
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/tabs.d.ts +11 -11
- package/dist/ui/tabs.js +3 -3
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/text.d.ts +2 -2
- package/dist/ui/text.d.ts.map +1 -1
- package/dist/ui/text.js +1 -1
- package/dist/ui/text.js.map +1 -1
- package/dist/ui/textarea.js +1 -1
- package/dist/ui/textarea.js.map +1 -1
- package/dist/ui/time-picker.d.ts +2 -2
- package/dist/ui/time-picker.d.ts.map +1 -1
- package/dist/ui/toggle-group.d.ts +4 -4
- package/dist/ui/toggle-group.d.ts.map +1 -1
- package/dist/ui/toggle-group.js +3 -3
- package/dist/ui/toggle-group.js.map +1 -1
- package/dist/ui/toggle.d.ts +6 -6
- package/dist/ui/toggle.d.ts.map +1 -1
- package/dist/ui/toggle.js +2 -2
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/tooltip.d.ts +6 -6
- package/dist/ui/tooltip.d.ts.map +1 -1
- package/dist/ui/tooltip.js +1 -1
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/ui/typography.d.ts +12 -12
- package/dist/ui/typography.d.ts.map +1 -1
- package/dist/ui/typography.js +11 -11
- package/dist/ui/typography.js.map +1 -1
- package/dist/ui/useColorScheme.d.ts +2 -2
- package/dist/ui/useColorScheme.d.ts.map +1 -1
- package/dist/ui/usecases/UseCaseCard.d.ts +2 -2
- package/dist/ui/usecases/UserStoryCard.d.ts +2 -2
- package/dist/ui/usecases/UserStoryCard.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @lssm/lib.ui-kit
|
|
2
|
+
|
|
3
|
+
Universal UI components for React Native and Web, built on top of `nativewind` and `@rn-primitives`.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
To provide a set of high-quality, accessible, and unstyled components that work seamlessly across mobile (React Native) and web (React/Next.js) platforms. This library serves as the foundation for the LSSM design system.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @lssm/lib.ui-kit
|
|
13
|
+
# or
|
|
14
|
+
bun add @lssm/lib.ui-kit
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Key Concepts
|
|
18
|
+
|
|
19
|
+
- **Universal**: Components are designed to render natively on iOS/Android and as standard HTML on the web.
|
|
20
|
+
- **Styled with NativeWind**: Uses Tailwind CSS classes for styling, enabling rapid UI development with a familiar syntax.
|
|
21
|
+
- **Accessible Primitives**: Leverages `@rn-primitives` (Radix UI for Native) to ensure accessibility best practices.
|
|
22
|
+
- **Atomic Design**: Exports atoms, molecules, and organisms to build complex UIs.
|
|
23
|
+
|
|
24
|
+
## Exports
|
|
25
|
+
|
|
26
|
+
The library exports components via subpaths to allow for tree-shaking and cleaner imports.
|
|
27
|
+
|
|
28
|
+
### Core UI Components
|
|
29
|
+
|
|
30
|
+
- `accordion`, `alert-dialog`, `alert`, `aspect-ratio`, `avatar`, `badge`
|
|
31
|
+
- `breadcrumb`, `button`, `card`, `checkbox`, `collapsible`, `command`
|
|
32
|
+
- `context-menu`, `date-picker`, `dialog`, `dropdown-menu`, `form`
|
|
33
|
+
- `hover-card`, `input`, `label`, `menubar`, `navigation-menu`, `popover`
|
|
34
|
+
- `progress`, `radio-group`, `select`, `separator`, `sheet`, `skeleton`
|
|
35
|
+
- `slider`, `switch`, `table`, `tabs`, `textarea`, `toggle-group`, `toggle`, `tooltip`
|
|
36
|
+
|
|
37
|
+
### Layout & Utilities
|
|
38
|
+
|
|
39
|
+
- `stack`, `text`, `typography`
|
|
40
|
+
- `useColorScheme`
|
|
41
|
+
|
|
42
|
+
### Higher-Order Patterns (Molecules/Organisms)
|
|
43
|
+
|
|
44
|
+
- `marketing/*`: `Hero`, `FeatureGrid`, `PricingTable`
|
|
45
|
+
- `usecases/*`: `UseCaseCard`, `UserStoryCard`
|
|
46
|
+
- `molecules/*`: `SearchAndFilter`, `Autocomplete`
|
|
47
|
+
- `organisms/*`: `ListPage`, `ErrorBoundary`
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { Button } from '@lssm/lib.ui-kit/ui/button';
|
|
53
|
+
import { Text } from '@lssm/lib.ui-kit/ui/text';
|
|
54
|
+
import {
|
|
55
|
+
Card,
|
|
56
|
+
CardHeader,
|
|
57
|
+
CardTitle,
|
|
58
|
+
CardContent,
|
|
59
|
+
} from '@lssm/lib.ui-kit/ui/card';
|
|
60
|
+
|
|
61
|
+
export function MyComponent() {
|
|
62
|
+
return (
|
|
63
|
+
<Card className="w-full max-w-md">
|
|
64
|
+
<CardHeader>
|
|
65
|
+
<CardTitle>Welcome</CardTitle>
|
|
66
|
+
</CardHeader>
|
|
67
|
+
<CardContent className="gap-4">
|
|
68
|
+
<Text>This is a universal component.</Text>
|
|
69
|
+
<Button onPress={() => console.log('Clicked!')}>Click me</Button>
|
|
70
|
+
</CardContent>
|
|
71
|
+
</Card>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
@@ -138,7 +138,7 @@ const useFormContext = () => React.useContext(HookFormContext);
|
|
|
138
138
|
* ```
|
|
139
139
|
*/
|
|
140
140
|
const FormProvider = (props) => {
|
|
141
|
-
const { children
|
|
141
|
+
const { children, ...data } = props;
|
|
142
142
|
return React.createElement(HookFormContext.Provider, { value: data }, children);
|
|
143
143
|
};
|
|
144
144
|
var getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {
|
|
@@ -228,7 +228,7 @@ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) =>
|
|
|
228
228
|
};
|
|
229
229
|
var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
|
|
230
230
|
function deepEqual(object1, object2, _internal_visited = /* @__PURE__ */ new WeakSet()) {
|
|
231
|
-
if (isPrimitive(object1) || isPrimitive(object2)) return object1
|
|
231
|
+
if (isPrimitive(object1) || isPrimitive(object2)) return Object.is(object1, object2);
|
|
232
232
|
if (isDateObject(object1) && isDateObject(object2)) return object1.getTime() === object2.getTime();
|
|
233
233
|
const keys1 = Object.keys(object1);
|
|
234
234
|
const keys2 = Object.keys(object2);
|
|
@@ -241,7 +241,7 @@ function deepEqual(object1, object2, _internal_visited = /* @__PURE__ */ new Wea
|
|
|
241
241
|
if (!keys2.includes(key)) return false;
|
|
242
242
|
if (key !== "ref") {
|
|
243
243
|
const val2 = object2[key];
|
|
244
|
-
if (isDateObject(val1) && isDateObject(val2) || isObject(val1) && isObject(val2) || Array.isArray(val1) && Array.isArray(val2) ? !deepEqual(val1, val2, _internal_visited) : val1
|
|
244
|
+
if (isDateObject(val1) && isDateObject(val2) || isObject(val1) && isObject(val2) || Array.isArray(val1) && Array.isArray(val2) ? !deepEqual(val1, val2, _internal_visited) : !Object.is(val1, val2)) return false;
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
return true;
|
|
@@ -622,17 +622,26 @@ function isTraversable(value) {
|
|
|
622
622
|
return Array.isArray(value) || isObject(value) && !objectHasFunction(value);
|
|
623
623
|
}
|
|
624
624
|
function markFieldsDirty(data, fields = {}) {
|
|
625
|
-
for (const key in data)
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
625
|
+
for (const key in data) {
|
|
626
|
+
const value = data[key];
|
|
627
|
+
if (isTraversable(value)) {
|
|
628
|
+
fields[key] = Array.isArray(value) ? [] : {};
|
|
629
|
+
markFieldsDirty(value, fields[key]);
|
|
630
|
+
} else if (!isUndefined(value)) fields[key] = true;
|
|
631
|
+
}
|
|
629
632
|
return fields;
|
|
630
633
|
}
|
|
631
634
|
function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
|
|
632
635
|
if (!dirtyFieldsFromValues) dirtyFieldsFromValues = markFieldsDirty(formValues);
|
|
633
|
-
for (const key in data)
|
|
634
|
-
|
|
635
|
-
|
|
636
|
+
for (const key in data) {
|
|
637
|
+
const value = data[key];
|
|
638
|
+
if (isTraversable(value)) if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {});
|
|
639
|
+
else getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
|
|
640
|
+
else {
|
|
641
|
+
const formValue = formValues[key];
|
|
642
|
+
dirtyFieldsFromValues[key] = !deepEqual(value, formValue);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
636
645
|
return dirtyFieldsFromValues;
|
|
637
646
|
}
|
|
638
647
|
const defaultResult = {
|
|
@@ -706,7 +715,7 @@ const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
|
|
|
706
715
|
for (const key of fieldsNames || Object.keys(fields)) {
|
|
707
716
|
const field = get(fields, key);
|
|
708
717
|
if (field) {
|
|
709
|
-
const { _f
|
|
718
|
+
const { _f, ...currentField } = field;
|
|
710
719
|
if (_f) {
|
|
711
720
|
if (_f.refs && _f.refs[0] && action(_f.refs[0], key) && !abortEarly) return true;
|
|
712
721
|
else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) return true;
|
|
@@ -743,7 +752,7 @@ function schemaErrorLookup(errors, _fields, name) {
|
|
|
743
752
|
}
|
|
744
753
|
var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {
|
|
745
754
|
updateFormState(formStateData);
|
|
746
|
-
const { name
|
|
755
|
+
const { name, ...formState } = formStateData;
|
|
747
756
|
return isEmptyObject(formState) || Object.keys(formState).length >= Object.keys(_proxyFormState).length || Object.keys(formState).find((key) => _proxyFormState[key] === (!isRoot || VALIDATION_MODE.all));
|
|
748
757
|
};
|
|
749
758
|
var shouldSubscribeByName = (name, signalName, exact) => !name || !signalName || name === signalName || convertToArrayPayload(name).some((currentName) => currentName && (exact ? currentName === signalName : currentName.startsWith(signalName) || signalName.startsWith(currentName)));
|
|
@@ -1029,7 +1038,7 @@ function createFormControl(props = {}) {
|
|
|
1029
1038
|
if (field) {
|
|
1030
1039
|
const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
|
|
1031
1040
|
isUndefined(defaultValue) || ref && ref.defaultChecked || shouldSkipSetValueAs ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f)) : setFieldValue(name, defaultValue);
|
|
1032
|
-
_state.mount && _setValid();
|
|
1041
|
+
_state.mount && !_state.action && _setValid();
|
|
1033
1042
|
}
|
|
1034
1043
|
};
|
|
1035
1044
|
const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {
|
|
@@ -1105,7 +1114,7 @@ function createFormControl(props = {}) {
|
|
|
1105
1114
|
for (const name in fields) {
|
|
1106
1115
|
const field = fields[name];
|
|
1107
1116
|
if (field) {
|
|
1108
|
-
const { _f
|
|
1117
|
+
const { _f, ...fieldValue } = field;
|
|
1109
1118
|
if (_f) {
|
|
1110
1119
|
const isFieldArrayRoot = _names.array.has(_f.name);
|
|
1111
1120
|
const isPromiseFunction = field._f && hasPromiseValidation(field._f);
|
|
@@ -1311,7 +1320,7 @@ function createFormControl(props = {}) {
|
|
|
1311
1320
|
};
|
|
1312
1321
|
const setError = (name, error, options) => {
|
|
1313
1322
|
const ref = (get(_fields, name, { _f: {} })._f || {}).ref;
|
|
1314
|
-
const { ref: currentRef, message, type
|
|
1323
|
+
const { ref: currentRef, message, type, ...restOfErrorTree } = get(_formState.errors, name) || {};
|
|
1315
1324
|
set(_formState.errors, name, {
|
|
1316
1325
|
...restOfErrorTree,
|
|
1317
1326
|
...error,
|
|
@@ -1987,7 +1996,7 @@ function useForm(props = {}) {
|
|
|
1987
1996
|
};
|
|
1988
1997
|
if (props.defaultValues && !isFunction(props.defaultValues)) props.formControl.reset(props.defaultValues, props.resetOptions);
|
|
1989
1998
|
} else {
|
|
1990
|
-
const { formControl
|
|
1999
|
+
const { formControl, ...rest } = createFormControl(props);
|
|
1991
2000
|
_formControl.current = {
|
|
1992
2001
|
...rest,
|
|
1993
2002
|
formState
|
|
@@ -2033,11 +2042,13 @@ function useForm(props = {}) {
|
|
|
2033
2042
|
}
|
|
2034
2043
|
}, [control, formState.isDirty]);
|
|
2035
2044
|
React.useEffect(() => {
|
|
2045
|
+
var _a;
|
|
2036
2046
|
if (props.values && !deepEqual(props.values, _values.current)) {
|
|
2037
2047
|
control._reset(props.values, {
|
|
2038
2048
|
keepFieldsRef: true,
|
|
2039
2049
|
...control._options.resetOptions
|
|
2040
2050
|
});
|
|
2051
|
+
if (!((_a = control._options.resetOptions) === null || _a === void 0 ? void 0 : _a.keepIsValid)) control._setValid();
|
|
2041
2052
|
_values.current = props.values;
|
|
2042
2053
|
updateFormState((state) => ({ ...state }));
|
|
2043
2054
|
} else control._resetDefaultValues();
|