@lssm/lib.ui-kit 1.7.4 → 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.
Files changed (169) hide show
  1. package/README.md +82 -0
  2. package/dist/node_modules/react-hook-form/dist/index.esm.js +27 -16
  3. package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -1
  4. package/dist/node_modules/zod/v4/core/core.js +0 -1
  5. package/dist/node_modules/zod/v4/core/core.js.map +1 -1
  6. package/dist/node_modules/zod/v4/core/registries.js +0 -2
  7. package/dist/node_modules/zod/v4/core/registries.js.map +1 -1
  8. package/dist/tsconfig.tsbuildinfo +1 -1
  9. package/dist/ui/accordion.js +4 -4
  10. package/dist/ui/accordion.js.map +1 -1
  11. package/dist/ui/alert-dialog.d.ts +11 -11
  12. package/dist/ui/alert-dialog.js +9 -9
  13. package/dist/ui/alert-dialog.js.map +1 -1
  14. package/dist/ui/alert.d.ts +4 -4
  15. package/dist/ui/alert.d.ts.map +1 -1
  16. package/dist/ui/alert.js +3 -3
  17. package/dist/ui/alert.js.map +1 -1
  18. package/dist/ui/avatar.d.ts +4 -4
  19. package/dist/ui/avatar.d.ts.map +1 -1
  20. package/dist/ui/avatar.js +3 -3
  21. package/dist/ui/avatar.js.map +1 -1
  22. package/dist/ui/badge.d.ts +2 -2
  23. package/dist/ui/badge.js +1 -1
  24. package/dist/ui/badge.js.map +1 -1
  25. package/dist/ui/breadcrumb.d.ts +8 -8
  26. package/dist/ui/breadcrumb.js +6 -6
  27. package/dist/ui/breadcrumb.js.map +1 -1
  28. package/dist/ui/button.js +1 -1
  29. package/dist/ui/button.js.map +1 -1
  30. package/dist/ui/card.d.ts +7 -7
  31. package/dist/ui/card.d.ts.map +1 -1
  32. package/dist/ui/card.js +6 -6
  33. package/dist/ui/card.js.map +1 -1
  34. package/dist/ui/checkbox.d.ts +3 -3
  35. package/dist/ui/checkbox.d.ts.map +1 -1
  36. package/dist/ui/checkbox.js +1 -1
  37. package/dist/ui/checkbox.js.map +1 -1
  38. package/dist/ui/collapsible.d.ts +8 -8
  39. package/dist/ui/collapsible.d.ts.map +1 -1
  40. package/dist/ui/context-menu.d.ts +16 -16
  41. package/dist/ui/context-menu.js +9 -9
  42. package/dist/ui/context-menu.js.map +1 -1
  43. package/dist/ui/date-picker.d.ts +2 -2
  44. package/dist/ui/date-range-picker.d.ts +2 -2
  45. package/dist/ui/datetime-picker.d.ts +2 -2
  46. package/dist/ui/dialog.d.ts +10 -10
  47. package/dist/ui/dialog.js +7 -7
  48. package/dist/ui/dialog.js.map +1 -1
  49. package/dist/ui/dropdown-menu.d.ts +16 -16
  50. package/dist/ui/dropdown-menu.js +9 -9
  51. package/dist/ui/dropdown-menu.js.map +1 -1
  52. package/dist/ui/empty-state.d.ts +4 -4
  53. package/dist/ui/empty-state.d.ts.map +1 -1
  54. package/dist/ui/empty.d.ts +9 -9
  55. package/dist/ui/empty.d.ts.map +1 -1
  56. package/dist/ui/empty.js +6 -6
  57. package/dist/ui/empty.js.map +1 -1
  58. package/dist/ui/fab.d.ts +3 -3
  59. package/dist/ui/fab.d.ts.map +1 -1
  60. package/dist/ui/field.d.ts +14 -14
  61. package/dist/ui/field.d.ts.map +1 -1
  62. package/dist/ui/field.js +10 -11
  63. package/dist/ui/field.js.map +1 -1
  64. package/dist/ui/form.d.ts +7 -7
  65. package/dist/ui/form.d.ts.map +1 -1
  66. package/dist/ui/form.js +5 -6
  67. package/dist/ui/form.js.map +1 -1
  68. package/dist/ui/hover-card.d.ts +6 -6
  69. package/dist/ui/hover-card.d.ts.map +1 -1
  70. package/dist/ui/hover-card.js +1 -1
  71. package/dist/ui/hover-card.js.map +1 -1
  72. package/dist/ui/input.d.ts +2 -2
  73. package/dist/ui/input.d.ts.map +1 -1
  74. package/dist/ui/input.js +1 -1
  75. package/dist/ui/input.js.map +1 -1
  76. package/dist/ui/label.d.ts +2 -2
  77. package/dist/ui/label.d.ts.map +1 -1
  78. package/dist/ui/label.js +1 -1
  79. package/dist/ui/label.js.map +1 -1
  80. package/dist/ui/link.d.ts +2 -2
  81. package/dist/ui/link.d.ts.map +1 -1
  82. package/dist/ui/link.js +1 -1
  83. package/dist/ui/link.js.map +1 -1
  84. package/dist/ui/loading-button.d.ts +2 -2
  85. package/dist/ui/loading-button.d.ts.map +1 -1
  86. package/dist/ui/loading-button.js +1 -1
  87. package/dist/ui/loading-button.js.map +1 -1
  88. package/dist/ui/loading-overlay.d.ts +2 -2
  89. package/dist/ui/loading-overlay.d.ts.map +1 -1
  90. package/dist/ui/loading-screen.d.ts +2 -2
  91. package/dist/ui/marketing/FeatureGrid.d.ts +2 -2
  92. package/dist/ui/marketing/Hero.d.ts +2 -2
  93. package/dist/ui/marketing/PricingTable.d.ts +2 -2
  94. package/dist/ui/menubar.d.ts +17 -17
  95. package/dist/ui/menubar.d.ts.map +1 -1
  96. package/dist/ui/menubar.js +11 -11
  97. package/dist/ui/menubar.js.map +1 -1
  98. package/dist/ui/molecules/SkeletonList.d.ts +2 -2
  99. package/dist/ui/navigation-menu.d.ts +12 -12
  100. package/dist/ui/navigation-menu.js +6 -6
  101. package/dist/ui/navigation-menu.js.map +1 -1
  102. package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.d.ts +2 -2
  103. package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.js +0 -1
  104. package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.js.map +1 -1
  105. package/dist/ui/organisms/ListPage/ListPage.d.ts +2 -2
  106. package/dist/ui/page-header.d.ts +4 -4
  107. package/dist/ui/page-header.d.ts.map +1 -1
  108. package/dist/ui/password-strength.d.ts +2 -2
  109. package/dist/ui/popover.d.ts +6 -6
  110. package/dist/ui/popover.js +1 -1
  111. package/dist/ui/popover.js.map +1 -1
  112. package/dist/ui/progress.d.ts +2 -2
  113. package/dist/ui/progress.js +1 -1
  114. package/dist/ui/progress.js.map +1 -1
  115. package/dist/ui/radio-group.d.ts +3 -3
  116. package/dist/ui/radio-group.js +2 -2
  117. package/dist/ui/radio-group.js.map +1 -1
  118. package/dist/ui/select.d.ts +13 -13
  119. package/dist/ui/select.js +7 -7
  120. package/dist/ui/select.js.map +1 -1
  121. package/dist/ui/separator.d.ts +2 -2
  122. package/dist/ui/separator.js +1 -1
  123. package/dist/ui/separator.js.map +1 -1
  124. package/dist/ui/skeleton.d.ts +2 -2
  125. package/dist/ui/skeleton.js +1 -1
  126. package/dist/ui/skeleton.js.map +1 -1
  127. package/dist/ui/stack.d.ts +4 -4
  128. package/dist/ui/stack.js +3 -3
  129. package/dist/ui/stack.js.map +1 -1
  130. package/dist/ui/stepper.d.ts +2 -2
  131. package/dist/ui/switch.d.ts +2 -2
  132. package/dist/ui/switch.js +2 -2
  133. package/dist/ui/switch.js.map +1 -1
  134. package/dist/ui/table.d.ts +8 -8
  135. package/dist/ui/table.js +7 -7
  136. package/dist/ui/table.js.map +1 -1
  137. package/dist/ui/tabs.d.ts +11 -11
  138. package/dist/ui/tabs.js +3 -3
  139. package/dist/ui/tabs.js.map +1 -1
  140. package/dist/ui/text.d.ts +2 -2
  141. package/dist/ui/text.d.ts.map +1 -1
  142. package/dist/ui/text.js +1 -1
  143. package/dist/ui/text.js.map +1 -1
  144. package/dist/ui/textarea.js +1 -1
  145. package/dist/ui/textarea.js.map +1 -1
  146. package/dist/ui/time-picker.d.ts +2 -2
  147. package/dist/ui/time-picker.d.ts.map +1 -1
  148. package/dist/ui/toggle-group.d.ts +4 -4
  149. package/dist/ui/toggle-group.d.ts.map +1 -1
  150. package/dist/ui/toggle-group.js +3 -3
  151. package/dist/ui/toggle-group.js.map +1 -1
  152. package/dist/ui/toggle.d.ts +6 -6
  153. package/dist/ui/toggle.d.ts.map +1 -1
  154. package/dist/ui/toggle.js +2 -2
  155. package/dist/ui/toggle.js.map +1 -1
  156. package/dist/ui/tooltip.d.ts +6 -6
  157. package/dist/ui/tooltip.d.ts.map +1 -1
  158. package/dist/ui/tooltip.js +1 -1
  159. package/dist/ui/tooltip.js.map +1 -1
  160. package/dist/ui/typography.d.ts +12 -12
  161. package/dist/ui/typography.d.ts.map +1 -1
  162. package/dist/ui/typography.js +11 -11
  163. package/dist/ui/typography.js.map +1 -1
  164. package/dist/ui/useColorScheme.d.ts +2 -2
  165. package/dist/ui/useColorScheme.d.ts.map +1 -1
  166. package/dist/ui/usecases/UseCaseCard.d.ts +2 -2
  167. package/dist/ui/usecases/UserStoryCard.d.ts +2 -2
  168. package/dist/ui/usecases/UserStoryCard.d.ts.map +1 -1
  169. 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,...data } = props;
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 === object2;
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 !== val2) return false;
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) if (isTraversable(data[key])) {
626
- fields[key] = Array.isArray(data[key]) ? [] : {};
627
- markFieldsDirty(data[key], fields[key]);
628
- } else if (!isUndefined(data[key])) fields[key] = true;
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) if (isTraversable(data[key])) if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) dirtyFieldsFromValues[key] = markFieldsDirty(data[key], Array.isArray(data[key]) ? [] : {});
634
- else getDirtyFields(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
635
- else dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);
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,...currentField } = field;
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,...formState } = formStateData;
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,...fieldValue } = field;
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,...restOfErrorTree } = get(_formState.errors, name) || {};
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,...rest } = createFormControl(props);
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();