native-document 1.0.165 → 1.0.168

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 (488) hide show
  1. package/.vitepress/config.js +166 -0
  2. package/CHANGELOG.md +153 -0
  3. package/components.d.ts +2 -0
  4. package/components.js +2 -1
  5. package/devtools/widget.js +1 -1
  6. package/dist/native-document.components.min.js +11589 -2983
  7. package/dist/native-document.dev.js +2280 -396
  8. package/dist/native-document.dev.js.map +1 -1
  9. package/dist/native-document.min.js +1 -1
  10. package/docs/advanced-components.md +213 -608
  11. package/docs/anchor.md +173 -312
  12. package/docs/cache.md +95 -803
  13. package/docs/cli.md +179 -0
  14. package/docs/components/accordion.md +172 -0
  15. package/docs/components/alert.md +99 -0
  16. package/docs/components/avatar.md +160 -0
  17. package/docs/components/badge.md +102 -0
  18. package/docs/components/breadcrumb.md +89 -0
  19. package/docs/components/button.md +183 -0
  20. package/docs/components/card.md +69 -0
  21. package/docs/components/context-menu.md +118 -0
  22. package/docs/components/data-table.md +345 -0
  23. package/docs/components/dropdown.md +214 -0
  24. package/docs/components/form/autocomplete-field.md +81 -0
  25. package/docs/components/form/checkbox-field.md +41 -0
  26. package/docs/components/form/checkbox-group-field.md +54 -0
  27. package/docs/components/form/color-field.md +64 -0
  28. package/docs/components/form/date-field.md +92 -0
  29. package/docs/components/form/field-collection.md +63 -0
  30. package/docs/components/form/file-field.md +203 -0
  31. package/docs/components/form/form-control.md +87 -0
  32. package/docs/components/form/image-field.md +90 -0
  33. package/docs/components/form/index.md +115 -0
  34. package/docs/components/form/number-field.md +65 -0
  35. package/docs/components/form/radio-field.md +51 -0
  36. package/docs/components/form/select-field.md +123 -0
  37. package/docs/components/form/slider.md +136 -0
  38. package/docs/components/form/string-field.md +134 -0
  39. package/docs/components/form/textarea-field.md +65 -0
  40. package/docs/components/form-fields.md +372 -0
  41. package/docs/components/getting-started.md +264 -0
  42. package/docs/components/index.md +337 -0
  43. package/docs/components/layout.md +279 -0
  44. package/docs/components/list.md +73 -0
  45. package/docs/components/menu.md +215 -0
  46. package/docs/components/modal.md +156 -0
  47. package/docs/components/pagination.md +95 -0
  48. package/docs/components/popover.md +131 -0
  49. package/docs/components/progress.md +111 -0
  50. package/docs/components/shortcut-manager.md +221 -0
  51. package/docs/components/simple-table.md +107 -0
  52. package/docs/components/skeleton.md +155 -0
  53. package/docs/components/spinner.md +100 -0
  54. package/docs/components/splitter.md +133 -0
  55. package/docs/components/stepper.md +163 -0
  56. package/docs/components/switch.md +113 -0
  57. package/docs/components/tabs.md +153 -0
  58. package/docs/components/toast.md +119 -0
  59. package/docs/components/tooltip.md +151 -0
  60. package/docs/components/traits.md +261 -0
  61. package/docs/conditional-rendering.md +170 -588
  62. package/docs/contributing.md +300 -25
  63. package/docs/core-concepts.md +205 -374
  64. package/docs/elements.md +251 -367
  65. package/docs/extending-native-document-element.md +192 -207
  66. package/docs/filters.md +153 -1122
  67. package/docs/getting-started.md +193 -267
  68. package/docs/i18n.md +241 -0
  69. package/docs/index.md +76 -0
  70. package/docs/lifecycle-events.md +143 -75
  71. package/docs/list-rendering.md +227 -852
  72. package/docs/memory-management.md +134 -47
  73. package/docs/native-document-element.md +337 -186
  74. package/docs/native-fetch.md +99 -630
  75. package/docs/observable-resource.md +364 -0
  76. package/docs/observables.md +592 -526
  77. package/docs/routing.md +244 -653
  78. package/docs/state-management.md +134 -241
  79. package/docs/svg-elements.md +231 -0
  80. package/docs/theming.md +409 -0
  81. package/docs/validation.md +95 -97
  82. package/docs/vitepress-conventions.md +219 -0
  83. package/eslint.config.js +28 -33
  84. package/i18n.js +1 -1
  85. package/i18n.ts +2 -0
  86. package/index.js +3 -0
  87. package/package.json +36 -14
  88. package/readme.md +269 -89
  89. package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
  90. package/src/components/$traits/has-draggable/HasDraggable.js +13 -0
  91. package/src/components/$traits/has-items/HasItems.d.ts +9 -0
  92. package/src/components/$traits/has-items/HasItems.js +6 -6
  93. package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
  94. package/src/components/$traits/has-position/HasFullPosition.js +44 -0
  95. package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
  96. package/src/components/$traits/has-position/HasPosition.js +23 -1
  97. package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
  98. package/src/components/$traits/has-resizable/HasResizable.js +9 -0
  99. package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
  100. package/src/components/$traits/has-validation/HasValidation.js +54 -7
  101. package/src/components/BaseComponent.d.ts +32 -0
  102. package/src/components/BaseComponent.js +65 -9
  103. package/src/components/accordion/Accordion.js +39 -14
  104. package/src/components/accordion/AccordionItem.js +45 -14
  105. package/src/components/accordion/index.js +2 -2
  106. package/src/components/accordion/types/Accordion.d.ts +47 -0
  107. package/src/components/accordion/types/AccordionItem.d.ts +48 -0
  108. package/src/components/alert/Alert.js +70 -38
  109. package/src/components/alert/index.js +2 -2
  110. package/src/components/alert/types/Alert.d.ts +62 -0
  111. package/src/components/avatar/Avatar.js +49 -12
  112. package/src/components/avatar/AvatarGroup.js +50 -2
  113. package/src/components/avatar/index.js +2 -2
  114. package/src/components/avatar/types/Avatar.d.ts +74 -0
  115. package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
  116. package/src/components/badge/Badge.js +125 -5
  117. package/src/components/badge/index.js +2 -2
  118. package/src/components/badge/types/Badge.d.ts +51 -0
  119. package/src/components/breadcrumb/BreadCrumb.js +61 -5
  120. package/src/components/breadcrumb/index.js +2 -2
  121. package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
  122. package/src/components/button/Button.js +164 -9
  123. package/src/components/button/index.js +1 -1
  124. package/src/components/button/types/Button.d.ts +62 -0
  125. package/src/components/card/Card.js +204 -32
  126. package/src/components/card/index.js +4 -4
  127. package/src/components/card/types/Card.d.ts +42 -0
  128. package/src/components/context-menu/ContextMenu.js +49 -5
  129. package/src/components/context-menu/ContextMenuGroup.js +15 -2
  130. package/src/components/context-menu/ContextMenuItem.js +14 -2
  131. package/src/components/context-menu/index.js +5 -5
  132. package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
  133. package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
  134. package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
  135. package/src/components/divider/Divider.js +120 -4
  136. package/src/components/divider/index.js +3 -3
  137. package/src/components/divider/types/Divider.d.ts +55 -0
  138. package/src/components/dropdown/Dropdown.js +239 -16
  139. package/src/components/dropdown/DropdownDivider.js +22 -2
  140. package/src/components/dropdown/DropdownGroup.js +44 -5
  141. package/src/components/dropdown/DropdownItem.js +76 -3
  142. package/src/components/dropdown/DropdownTrigger.js +49 -20
  143. package/src/components/dropdown/helpers.js +1 -1
  144. package/src/components/dropdown/index.js +6 -6
  145. package/src/components/dropdown/types/Dropdown.d.ts +88 -0
  146. package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
  147. package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
  148. package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
  149. package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
  150. package/src/components/form/FormControl.js +156 -13
  151. package/src/components/form/field/Field.js +172 -9
  152. package/src/components/form/field/FieldCollection.js +116 -12
  153. package/src/components/form/field/types/AutocompleteField.js +92 -2
  154. package/src/components/form/field/types/CheckboxField.js +43 -2
  155. package/src/components/form/field/types/CheckboxGroupField.js +83 -6
  156. package/src/components/form/field/types/ColorField.js +56 -3
  157. package/src/components/form/field/types/DateField.js +155 -4
  158. package/src/components/form/field/types/EmailField.js +54 -4
  159. package/src/components/form/field/types/FileField.js +140 -6
  160. package/src/components/form/field/types/HiddenField.js +27 -1
  161. package/src/components/form/field/types/ImageField.js +82 -3
  162. package/src/components/form/field/types/NumberField.js +97 -4
  163. package/src/components/form/field/types/PasswordField.js +103 -7
  164. package/src/components/form/field/types/RadioField.js +75 -4
  165. package/src/components/form/field/types/RangeField.js +67 -1
  166. package/src/components/form/field/types/SearchField.js +41 -2
  167. package/src/components/form/field/types/SelectField.js +133 -4
  168. package/src/components/form/field/types/StringField.js +91 -2
  169. package/src/components/form/field/types/TelField.js +55 -4
  170. package/src/components/form/field/types/TextAreaField.js +76 -2
  171. package/src/components/form/field/types/TimeField.js +120 -5
  172. package/src/components/form/field/types/UrlField.js +59 -4
  173. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +83 -4
  174. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +61 -3
  175. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +79 -3
  176. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +24 -2
  177. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +64 -3
  178. package/src/components/form/field/types/file-field-mode/FileWallMode.js +56 -3
  179. package/src/components/form/index.js +28 -28
  180. package/src/components/form/types/Field.d.ts +73 -0
  181. package/src/components/form/types/FieldCollection.d.ts +53 -0
  182. package/src/components/form/types/FormControl.d.ts +64 -0
  183. package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
  184. package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
  185. package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
  186. package/src/components/form/types/fields/ColorField.d.ts +37 -0
  187. package/src/components/form/types/fields/DateField.d.ts +70 -0
  188. package/src/components/form/types/fields/EmailField.d.ts +35 -0
  189. package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
  190. package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
  191. package/src/components/form/types/fields/FileField.d.ts +56 -0
  192. package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
  193. package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
  194. package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
  195. package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
  196. package/src/components/form/types/fields/HiddenField.d.ts +26 -0
  197. package/src/components/form/types/fields/ImageField.d.ts +45 -0
  198. package/src/components/form/types/fields/NumberField.d.ts +48 -0
  199. package/src/components/form/types/fields/PasswordField.d.ts +46 -0
  200. package/src/components/form/types/fields/RadioField.d.ts +48 -0
  201. package/src/components/form/types/fields/RangeField.d.ts +44 -0
  202. package/src/components/form/types/fields/SearchField.d.ts +34 -0
  203. package/src/components/form/types/fields/SelectField.d.ts +71 -0
  204. package/src/components/form/types/fields/StringField.d.ts +48 -0
  205. package/src/components/form/types/fields/TelField.d.ts +37 -0
  206. package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
  207. package/src/components/form/types/fields/TimeField.d.ts +51 -0
  208. package/src/components/form/types/fields/UrlField.d.ts +35 -0
  209. package/src/components/form/validation/Validation.js +54 -54
  210. package/src/components/index.d.ts +160 -0
  211. package/src/components/list/HasListItem.js +171 -0
  212. package/src/components/list/List.js +85 -67
  213. package/src/components/list/ListDivider.js +39 -0
  214. package/src/components/list/ListGroup.js +105 -38
  215. package/src/components/list/ListItem.js +158 -49
  216. package/src/components/list/index.js +8 -6
  217. package/src/components/list/types/List.d.ts +43 -0
  218. package/src/components/list/types/ListGroup.d.ts +37 -0
  219. package/src/components/list/types/ListItem.d.ts +53 -0
  220. package/src/components/menu/HasMenuItem.js +55 -6
  221. package/src/components/menu/Menu.js +113 -22
  222. package/src/components/menu/MenuDivider.js +18 -2
  223. package/src/components/menu/MenuGroup.js +61 -6
  224. package/src/components/menu/MenuItem.js +95 -11
  225. package/src/components/menu/MenuLink.js +27 -2
  226. package/src/components/menu/index.js +6 -6
  227. package/src/components/menu/types/Menu.d.ts +60 -0
  228. package/src/components/menu/types/MenuDivider.d.ts +19 -0
  229. package/src/components/menu/types/MenuGroup.d.ts +44 -0
  230. package/src/components/menu/types/MenuItem.d.ts +46 -0
  231. package/src/components/menu/types/MenuLink.d.ts +16 -0
  232. package/src/components/modal/Modal.js +258 -17
  233. package/src/components/modal/index.js +3 -3
  234. package/src/components/modal/types/Modal.d.ts +94 -0
  235. package/src/components/pagination/Pagination.js +155 -7
  236. package/src/components/pagination/index.js +3 -3
  237. package/src/components/pagination/types/Pagination.d.ts +68 -0
  238. package/src/components/popover/Popover.js +198 -11
  239. package/src/components/popover/PopoverFooter.js +33 -9
  240. package/src/components/popover/PopoverHeader.js +33 -8
  241. package/src/components/popover/index.js +4 -4
  242. package/src/components/popover/types/Popover.d.ts +83 -0
  243. package/src/components/popover/types/PopoverFooter.d.ts +24 -0
  244. package/src/components/popover/types/PopoverHeader.d.ts +26 -0
  245. package/src/components/progress/Progress.js +182 -13
  246. package/src/components/progress/index.js +3 -3
  247. package/src/components/progress/types/Progress.d.ts +77 -0
  248. package/src/components/skeleton/Skeleton.js +117 -49
  249. package/src/components/skeleton/index.js +3 -3
  250. package/src/components/skeleton/types/Skeleton.d.ts +55 -0
  251. package/src/components/slider/Slider.js +207 -10
  252. package/src/components/slider/index.js +2 -2
  253. package/src/components/slider/types/Slider.d.ts +82 -0
  254. package/src/components/spacer/Spacer.js +12 -3
  255. package/src/components/spacer/index.js +2 -2
  256. package/src/components/spacer/types/Spacer.d.ts +19 -0
  257. package/src/components/spinner/Spinner.js +180 -9
  258. package/src/components/spinner/index.js +3 -3
  259. package/src/components/spinner/types/Spinner.d.ts +71 -0
  260. package/src/components/splitter/Splitter.js +76 -13
  261. package/src/components/splitter/SplitterGutter.js +67 -5
  262. package/src/components/splitter/SplitterPanel.js +69 -2
  263. package/src/components/splitter/index.js +5 -5
  264. package/src/components/splitter/types/Splitter.d.ts +38 -0
  265. package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
  266. package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
  267. package/src/components/stacks/AbsoluteStack.js +23 -3
  268. package/src/components/stacks/FixedStack.js +23 -3
  269. package/src/components/stacks/HStack.js +24 -3
  270. package/src/components/stacks/PositionStack.js +111 -3
  271. package/src/components/stacks/RelativeStack.js +23 -3
  272. package/src/components/stacks/Stack.js +73 -2
  273. package/src/components/stacks/VStack.js +24 -4
  274. package/src/components/stacks/index.js +7 -7
  275. package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
  276. package/src/components/stacks/types/FixedStack.d.ts +16 -0
  277. package/src/components/stacks/types/HStack.d.ts +16 -0
  278. package/src/components/stacks/types/PositionStack.d.ts +54 -0
  279. package/src/components/stacks/types/RelativeStack.d.ts +17 -0
  280. package/src/components/stacks/types/Stack.d.ts +39 -0
  281. package/src/components/stacks/types/VStack.d.ts +16 -0
  282. package/src/components/stepper/Stepper.js +152 -12
  283. package/src/components/stepper/StepperStep.js +104 -3
  284. package/src/components/stepper/index.js +4 -4
  285. package/src/components/stepper/types/Stepper.d.ts +68 -0
  286. package/src/components/stepper/types/StepperStep.d.ts +54 -0
  287. package/src/components/switch/Switch.js +143 -6
  288. package/src/components/switch/index.js +1 -1
  289. package/src/components/switch/types/Switch.d.ts +55 -0
  290. package/src/components/table/Column.js +105 -6
  291. package/src/components/table/ColumnGroup.js +48 -3
  292. package/src/components/table/DataTable.js +256 -19
  293. package/src/components/table/SimpleTable.js +58 -4
  294. package/src/components/table/index.js +2 -2
  295. package/src/components/table/types/Column.d.ts +49 -0
  296. package/src/components/table/types/ColumnGroup.d.ts +28 -0
  297. package/src/components/table/types/DataTable.d.ts +97 -0
  298. package/src/components/table/types/SimpleTable.d.ts +40 -0
  299. package/src/components/tabs/Tabs.js +192 -5
  300. package/src/components/tabs/index.js +3 -3
  301. package/src/components/tabs/types/Tabs.d.ts +78 -0
  302. package/src/components/toast/Toast.js +133 -5
  303. package/src/components/toast/index.js +3 -3
  304. package/src/components/toast/types/Toast.d.ts +57 -0
  305. package/src/components/toast/types/ToastError.d.ts +7 -0
  306. package/src/components/toast/types/ToastInfo.d.ts +7 -0
  307. package/src/components/toast/types/ToastSuccess.d.ts +7 -0
  308. package/src/components/toast/types/ToastWarning.d.ts +7 -0
  309. package/src/components/tooltip/Tooltip.js +157 -13
  310. package/src/components/tooltip/index.js +2 -2
  311. package/src/components/tooltip/prototypes.js +1 -1
  312. package/src/components/tooltip/types/Tooltip.d.ts +65 -0
  313. package/src/core/data/MemoryManager.js +2 -2
  314. package/src/core/data/Observable.js +15 -18
  315. package/src/core/data/ObservableArray.js +118 -46
  316. package/src/core/data/ObservableChecker.js +2 -2
  317. package/src/core/data/ObservableItem.js +135 -21
  318. package/src/core/data/ObservableObject.js +126 -35
  319. package/src/core/data/ObservableResource.js +118 -3
  320. package/src/core/data/Store.js +142 -26
  321. package/src/core/data/observable-helpers/observable.is-to.js +196 -1
  322. package/src/core/data/observable-helpers/observable.prototypes.js +35 -8
  323. package/src/core/elements/anchor/anchor-with-sentinel.js +23 -2
  324. package/src/core/elements/anchor/anchor.js +16 -7
  325. package/src/core/elements/anchor/one-child-anchor-overwriting.js +2 -2
  326. package/src/core/elements/content-formatter.js +1 -1
  327. package/src/core/elements/control/for-each-array.js +9 -9
  328. package/src/core/elements/control/for-each.js +14 -14
  329. package/src/core/elements/control/show-if.js +11 -11
  330. package/src/core/elements/control/show-when.js +5 -5
  331. package/src/core/elements/control/switch.js +14 -14
  332. package/src/core/elements/description-list.js +1 -1
  333. package/src/core/elements/form.js +2 -2
  334. package/src/core/elements/fragment.js +1 -1
  335. package/src/core/elements/html5-semantics.js +1 -1
  336. package/src/core/elements/img.js +3 -3
  337. package/src/core/elements/interactive.js +1 -1
  338. package/src/core/elements/list.js +1 -1
  339. package/src/core/elements/medias.js +1 -1
  340. package/src/core/elements/meta-data.js +1 -1
  341. package/src/core/elements/svg.js +1 -1
  342. package/src/core/elements/table.js +1 -1
  343. package/src/core/errors/ArgTypesError.js +1 -1
  344. package/src/core/utils/HasEventEmitter.js +36 -2
  345. package/src/core/utils/args-types.js +9 -9
  346. package/src/core/utils/cache.js +1 -1
  347. package/src/core/utils/callback-handler.js +29 -0
  348. package/src/core/utils/debug-manager.js +6 -6
  349. package/src/core/utils/events.js +139 -139
  350. package/src/core/utils/filters/date.js +84 -3
  351. package/src/core/utils/filters/standard.js +136 -11
  352. package/src/core/utils/filters/strings.js +34 -2
  353. package/src/core/utils/filters/utils.js +40 -4
  354. package/src/core/utils/formatters.js +4 -4
  355. package/src/core/utils/helpers.js +39 -7
  356. package/src/core/utils/localstorage.js +11 -11
  357. package/src/core/utils/memoize.js +56 -3
  358. package/src/core/utils/plugins-manager.js +3 -3
  359. package/src/core/utils/property-accumulator.js +6 -6
  360. package/src/core/utils/prototypes.js +26 -1
  361. package/src/core/utils/shortcut-manager.js +2 -2
  362. package/src/core/utils/validator.js +8 -8
  363. package/src/core/wrappers/AttributesWrapper.js +32 -22
  364. package/src/core/wrappers/DocumentObserver.js +3 -3
  365. package/src/core/wrappers/ElementCreator.js +5 -5
  366. package/src/core/wrappers/HtmlElementWrapper.js +38 -12
  367. package/src/core/wrappers/NDElement.js +328 -22
  368. package/src/core/wrappers/NdPrototype.js +60 -16
  369. package/src/core/wrappers/SingletonView.js +50 -2
  370. package/src/core/wrappers/SvgElementWrapper.js +1 -1
  371. package/src/core/wrappers/constants.js +35 -2
  372. package/src/core/wrappers/prototypes/attributes-extensions.js +7 -7
  373. package/src/core/wrappers/prototypes/nd-element-extensions.js +72 -6
  374. package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +42 -2
  375. package/src/core/wrappers/template-cloner/NodeCloner.js +53 -8
  376. package/src/core/wrappers/template-cloner/TemplateCloner.js +75 -6
  377. package/src/core/wrappers/template-cloner/attributes-hydrator.js +58 -2
  378. package/src/core/wrappers/template-cloner/utils.js +42 -6
  379. package/src/fetch/NativeFetch.js +3 -3
  380. package/src/i18n/bin/scan.js +6 -6
  381. package/src/i18n/index.d.ts +2 -0
  382. package/src/i18n/service/I18nService.d.ts +27 -0
  383. package/src/i18n/service/I18nService.js +5 -5
  384. package/src/i18n/service/functions.d.ts +22 -0
  385. package/src/i18n/service/functions.js +2 -2
  386. package/src/router/Route.js +3 -3
  387. package/src/router/RouteGroupHelper.js +2 -2
  388. package/src/router/Router.js +15 -15
  389. package/src/router/RouterComponent.js +33 -7
  390. package/src/router/link.js +4 -4
  391. package/src/router/modes/HashRouter.js +2 -2
  392. package/src/router/modes/HistoryRouter.js +2 -2
  393. package/src/router/modes/MemoryRouter.js +1 -1
  394. package/src/ui/components/accordion/AccordionItemRender.js +3 -3
  395. package/src/ui/components/accordion/AccordionRender.js +1 -1
  396. package/src/ui/components/alert/AlertRender.js +10 -10
  397. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +1 -1
  398. package/src/ui/components/avatar/avatar/AvatarRender.js +1 -1
  399. package/src/ui/components/breadcrumb/BreadcrumbRender.js +2 -2
  400. package/src/ui/components/button/ButtonRender.js +1 -1
  401. package/src/ui/components/card/CardRender.js +133 -0
  402. package/src/ui/components/card/card.css +169 -0
  403. package/src/ui/components/contextmenu/ContextmenuRender.js +6 -6
  404. package/src/ui/components/dropdown/DropdownRender.js +8 -8
  405. package/src/ui/components/dropdown/group/DropdownGroupRender.js +2 -2
  406. package/src/ui/components/dropdown/item/DropdownItemRender.js +1 -1
  407. package/src/ui/components/form/FieldCollectionRender.js +2 -2
  408. package/src/ui/components/form/FormControlRender.js +5 -5
  409. package/src/ui/components/form/fields/AutocompleteFieldRender.js +3 -3
  410. package/src/ui/components/form/fields/CheckboxFieldRender.js +1 -1
  411. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +1 -1
  412. package/src/ui/components/form/fields/DateFieldRender.js +7 -7
  413. package/src/ui/components/form/fields/EmailFieldRender.js +1 -1
  414. package/src/ui/components/form/fields/FieldRender.js +4 -4
  415. package/src/ui/components/form/fields/FileFieldRender.js +1 -1
  416. package/src/ui/components/form/fields/PasswordFieldRender.js +2 -2
  417. package/src/ui/components/form/fields/RadioFieldRender.js +1 -1
  418. package/src/ui/components/form/fields/RangeFieldRender.js +1 -1
  419. package/src/ui/components/form/fields/SelectFieldRender.js +2 -2
  420. package/src/ui/components/form/fields/SliderFieldRender.js +6 -6
  421. package/src/ui/components/form/fields/StringFieldRender.js +1 -1
  422. package/src/ui/components/form/fields/TelFieldRender.js +1 -1
  423. package/src/ui/components/form/fields/TextAreaFieldRender.js +1 -1
  424. package/src/ui/components/form/fields/TimeFieldRender.js +3 -3
  425. package/src/ui/components/form/fields/UrlFieldRender.js +1 -1
  426. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +1 -1
  427. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +2 -2
  428. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +2 -2
  429. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +1 -1
  430. package/src/ui/components/form/helpers.js +8 -8
  431. package/src/ui/components/form/index.js +27 -27
  432. package/src/ui/components/list/ListRender.js +18 -0
  433. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  434. package/src/ui/components/list/divider/list-divider.css +12 -0
  435. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  436. package/src/ui/components/list/group/list-group.css +62 -0
  437. package/src/ui/components/list/item/ListItemRender.js +238 -0
  438. package/src/ui/components/list/item/list-item.css +191 -0
  439. package/src/ui/components/list/list.css +24 -0
  440. package/src/ui/components/menu/MenuDividerRender.js +1 -1
  441. package/src/ui/components/menu/MenuGroupRender.js +3 -3
  442. package/src/ui/components/menu/MenuItemRender.js +2 -2
  443. package/src/ui/components/menu/MenuLinkRender.js +3 -3
  444. package/src/ui/components/menu/helpers.js +4 -4
  445. package/src/ui/components/modal/ModalRender.js +4 -4
  446. package/src/ui/components/pagination/PaginationRender.js +9 -9
  447. package/src/ui/components/popover/PopoverRender.js +7 -7
  448. package/src/ui/components/progress/ProgressRender.js +12 -12
  449. package/src/ui/components/skeleton/SkeletonRender.js +56 -0
  450. package/src/ui/components/spacer/SpacerRender.js +10 -0
  451. package/src/ui/components/splitter/SplitterGutterRender.js +1 -1
  452. package/src/ui/components/splitter/SplitterPanelRender.js +2 -2
  453. package/src/ui/components/stacks/PositionStackRender.js +1 -1
  454. package/src/ui/components/stacks/StackRender.js +1 -1
  455. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +1 -1
  456. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +1 -1
  457. package/src/ui/components/stacks/h-stack/HStackRender.js +1 -1
  458. package/src/ui/components/stacks/index.js +5 -5
  459. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +1 -1
  460. package/src/ui/components/stacks/v-stack/VStackRender.js +1 -1
  461. package/src/ui/components/stepper/StepperRender.js +2 -2
  462. package/src/ui/components/stepper/StepperStepRender.js +4 -4
  463. package/src/ui/components/switch/SwitchRender.js +4 -4
  464. package/src/ui/components/table/data-table/DataTableRender.js +5 -5
  465. package/src/ui/components/table/data-table/bulk-actions.js +7 -7
  466. package/src/ui/components/table/data-table/pagination.js +6 -6
  467. package/src/ui/components/table/data-table/tables.js +25 -25
  468. package/src/ui/components/table/data-table/toolbar.js +3 -3
  469. package/src/ui/components/table/simple-table/SimpleTableRender.js +8 -8
  470. package/src/ui/components/tabs/TabsRender.js +11 -11
  471. package/src/ui/components/toast/ToastRender.js +3 -3
  472. package/src/ui/components/tooltip/TooltipRender.js +1 -1
  473. package/src/ui/index.js +44 -36
  474. package/types/elements.d.ts +163 -1037
  475. package/types/forms.d.ts +16 -20
  476. package/types/globals.d.ts +543 -0
  477. package/types/images.d.ts +2 -2
  478. package/types/observable-resource.d.ts +3 -0
  479. package/types/property-accumulator.d.ts +4 -4
  480. package/types/store.d.ts +26 -2
  481. package/types/validator.ts +3 -3
  482. package/ui.js +1 -0
  483. package/src/components/form/field/DefaultRender.js +0 -77
  484. package/src/components/form/field/FieldFactory.js +0 -107
  485. package/src/components/skeleton/SkeletonList.js +0 -0
  486. package/src/components/skeleton/SkeletonParagraph.js +0 -0
  487. package/src/components/skeleton/SkeletonTable.js +0 -0
  488. /package/{src/components/skeleton/SkeletonCard.js → docs/tutorials/.gitkeep} +0 -0
@@ -1,16 +1,24 @@
1
- import DebugManager from "../../core/utils/debug-manager";
2
- import MemoryManager from "./MemoryManager";
3
- import NativeDocumentError from "../../core/errors/NativeDocumentError";
4
- import PluginsManager from "../../core/utils/plugins-manager";
5
- import Validator from "../../core/utils/validator";
6
- import {deepClone} from "../utils/helpers";
7
- import {$getFromStorage, $saveToStorage} from "../utils/localstorage";
1
+ import DebugManager from '../../core/utils/debug-manager';
2
+ import MemoryManager from './MemoryManager';
3
+ import NativeDocumentError from '../../core/errors/NativeDocumentError';
4
+ import PluginsManager from '../../core/utils/plugins-manager';
5
+ import Validator from '../../core/utils/validator';
6
+ import {deepClone} from '../utils/helpers';
7
+ import {$getFromStorage, $saveToStorage} from '../utils/localstorage';
8
8
 
9
9
  /**
10
+ * Reactive primitive value container.
11
+ * Notifies subscribers whenever its value changes.
12
+ * The core building block of NativeDocument's reactivity system.
10
13
  *
11
- * @param {*} value
12
- * @param {{ propagation: boolean, reset: boolean} | null} configs
13
- * @class ObservableItem
14
+ * @constructor
15
+ * @param {*} value - Initial value of the observable
16
+ * @param {{ propagation?: boolean, reset?: boolean, deep?: boolean } | null} [configs=null] - Optional configuration
17
+ * @param {boolean} [configs.reset] - If true, stores the initial value for later reset via .reset()
18
+ * @param {boolean} [configs.propagation] - Controls whether changes propagate to parent observables
19
+ * @example
20
+ * const count = new ObservableItem(0);
21
+ * const name = new ObservableItem('John', { reset: true });
14
22
  */
15
23
  export default function ObservableItem(value, configs = null) {
16
24
  value = Validator.isObservable(value) ? value.val() : value;
@@ -71,15 +79,34 @@ ObservableItem.prototype.intercept = function(callback) {
71
79
  return this;
72
80
  };
73
81
 
82
+ /**
83
+ * Intercepts mutations of the array observable before they are applied.
84
+ * Allows transforming or cancelling array operations.
85
+ *
86
+ * @param {(operation: { action: string, args: any[] }) => void} callback - Called before each mutation with the operation details
87
+ * @returns {ObservableItem} this
88
+ */
74
89
  ObservableItem.prototype.interceptMutations = function(callback) {
75
90
  this.$mutationInterceptor = callback;
76
91
  return this;
77
92
  };
78
93
 
94
+ /**
95
+ * Calls the first registered subscriber directly (internal optimisation).
96
+ *
97
+ * @internal
98
+ * @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
99
+ */
79
100
  ObservableItem.prototype.triggerFirstListener = function(operations) {
80
101
  this.$firstListener(this.$currentValue, this.$previousValue, operations);
81
102
  };
82
103
 
104
+ /**
105
+ * Calls all registered subscribers (internal).
106
+ *
107
+ * @internal
108
+ * @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
109
+ */
83
110
  ObservableItem.prototype.triggerListeners = function(operations) {
84
111
  const $listeners = this.$listeners;
85
112
  const $previousValue = this.$previousValue;
@@ -90,6 +117,12 @@ ObservableItem.prototype.triggerListeners = function(operations) {
90
117
  }
91
118
  };
92
119
 
120
+ /**
121
+ * Triggers callbacks registered via .on() for the current and previous values (internal).
122
+ *
123
+ * @internal
124
+ * @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
125
+ */
93
126
  ObservableItem.prototype.triggerWatchers = function(operations) {
94
127
  const $watchers = this.$watchers;
95
128
  const $previousValue = this.$previousValue;
@@ -105,28 +138,47 @@ ObservableItem.prototype.triggerWatchers = function(operations) {
105
138
  }
106
139
  };
107
140
 
141
+ /**
142
+ * Triggers both watchers and all subscribers (internal).
143
+ *
144
+ * @internal
145
+ * @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
146
+ */
108
147
  ObservableItem.prototype.triggerAll = function(operations) {
109
148
  this.triggerWatchers(operations);
110
149
  this.triggerListeners(operations);
111
150
  };
112
151
 
152
+ /**
153
+ * Triggers both watchers and the first subscriber only (internal optimization).
154
+ *
155
+ * @internal
156
+ * @param {{ action?: string, args?: any[], result?: any }} [operations] - Mutation metadata
157
+ */
113
158
  ObservableItem.prototype.triggerWatchersAndFirstListener = function(operations) {
114
159
  this.triggerWatchers(operations);
115
160
  this.triggerFirstListener(operations);
116
161
  };
117
162
 
163
+ /**
164
+ * Selects and assigns the optimal trigger strategy based on the current
165
+ * combination of listeners and watchers (internal).
166
+ * Called automatically after every subscribe / unsubscribe / on / off.
167
+ *
168
+ * @internal
169
+ */
118
170
  ObservableItem.prototype.assocTrigger = function() {
119
171
  this.$firstListener = null;
120
172
  if(this.$watchers?.size && this.$listeners?.length) {
121
173
  this.$firstListener = this.$listeners[0];
122
- this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener
174
+ this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener;
123
175
  this.trigger = (this.$listeners.length === 1) ? this.triggerWatchersAndFirstListener : this.triggerAll;
124
176
  return;
125
177
  }
126
178
  if(this.$listeners?.length) {
127
179
  if(this.$listeners.length === 1) {
128
180
  this.$firstListener = this.$listeners[0];
129
- this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener
181
+ this.trigger = this.$firstListener.length === 0 ? this.$firstListener : this.triggerFirstListener;
130
182
  }
131
183
  else {
132
184
  this.trigger = this.triggerListeners;
@@ -179,16 +231,30 @@ ObservableItem.prototype.$setWithInterceptor = function(data) {
179
231
  * @param {*} data
180
232
  */
181
233
  ObservableItem.prototype.$basicSet = function(data) {
182
- let newValue = (typeof data === 'function') ? data(this.$currentValue) : data;
234
+ const newValue = (typeof data === 'function') ? data(this.$currentValue) : data;
183
235
  this.$updateWithNewValue(newValue);
184
236
  };
185
237
 
186
238
  ObservableItem.prototype.set = ObservableItem.prototype.$basicSet;
187
239
 
240
+ /**
241
+ * Returns the current value of the observable.
242
+ *
243
+ * @returns {*} The current value
244
+ * @example
245
+ * const count = Observable(42);
246
+ * count.val(); // 42
247
+ */
188
248
  ObservableItem.prototype.val = function() {
189
249
  return this.$currentValue;
190
250
  };
191
251
 
252
+ /**
253
+ * Disconnects all listeners and watchers and nullifies internal state.
254
+ * Does not trigger cleanup callbacks. Prefer .cleanup() for full disposal.
255
+ *
256
+ * @returns {void}
257
+ */
192
258
  ObservableItem.prototype.disconnectAll = function() {
193
259
  this.$previousValue = null;
194
260
  this.$currentValue = null;
@@ -212,6 +278,16 @@ ObservableItem.prototype.onCleanup = function(callback) {
212
278
  this.$cleanupListeners.push(callback);
213
279
  };
214
280
 
281
+ /**
282
+ * Disposes the observable: runs cleanup callbacks, unregisters from MemoryManager,
283
+ * disconnects all listeners and removes the $value property.
284
+ *
285
+ * @returns {void}
286
+ * @example
287
+ * const obs = Observable(0);
288
+ * obs.onCleanup(() => console.log('disposed'));
289
+ * obs.cleanup(); // logs 'disposed', frees memory
290
+ */
215
291
  ObservableItem.prototype.cleanup = function() {
216
292
  if (this.$cleanupListeners) {
217
293
  for (let i = 0; i < this.$cleanupListeners.length; i++) {
@@ -227,10 +303,16 @@ ObservableItem.prototype.cleanup = function() {
227
303
  delete this.$value;
228
304
  };
229
305
 
306
+
230
307
  /**
308
+ * Subscribes to value changes. The callback is called every time the value changes.
309
+ * Returns nothing — use .unsubscribe(callback) to remove the listener.
231
310
  *
232
- * @param {Function} callback
233
- * @returns {(function(): void)}
311
+ * @param {(current: *, previous: *, operations?: { action?: string }) => void} callback - Called on each value change
312
+ * @example
313
+ * const count = Observable(0);
314
+ * count.subscribe((val) => console.log('New value:', val));
315
+ * count.$value++; // logs 'New value: 1'
234
316
  */
235
317
  ObservableItem.prototype.subscribe = function(callback) {
236
318
  if(process.env.NODE_ENV === 'development') {
@@ -280,7 +362,7 @@ ObservableItem.prototype.on = function(value, callback) {
280
362
  for(let i = 0, length = watchValueList.length; i < length; i++) {
281
363
  watchValueList[i](value);
282
364
  }
283
- }
365
+ };
284
366
  callback.list = watchValueList;
285
367
  this.$watchers.set(value, callback);
286
368
  } else {
@@ -346,9 +428,16 @@ ObservableItem.prototype.once = function(predicate, callback) {
346
428
  this.subscribe(handler);
347
429
  };
348
430
 
431
+
349
432
  /**
350
- * Unsubscribe from an observable.
351
- * @param {Function} callback
433
+ * Removes a previously registered subscriber.
434
+ *
435
+ * @param {Function} callback - The exact function reference passed to .subscribe()
436
+ * @returns {void}
437
+ * @example
438
+ * const handler = (val) => console.log(val);
439
+ * count.subscribe(handler);
440
+ * count.unsubscribe(handler);
352
441
  */
353
442
  ObservableItem.prototype.unsubscribe = function(callback) {
354
443
  if(!this.$listeners) return;
@@ -445,7 +534,7 @@ ObservableItem.prototype.reset = function() {
445
534
  observable.reset();
446
535
  })
447
536
  : this.$initialValue;
448
- this.set(resetValue)
537
+ this.set(resetValue);
449
538
  };
450
539
 
451
540
  /**
@@ -467,8 +556,22 @@ ObservableItem.prototype.valueOf = function() {
467
556
  return this.$currentValue;
468
557
  };
469
558
 
470
-
471
-
559
+ /**
560
+ * Syncs this observable's value to localStorage and restores it on load.
561
+ * Optionally transforms values on get and set.
562
+ *
563
+ * @param {string} key - localStorage key
564
+ * @param {{ get?: (stored: any) => T, set?: (value: T) => any }} [options={}] - Transform options
565
+ * @param {Function} [options.get] - Transform the stored value before applying it
566
+ * @param {Function} [options.set] - Transform the value before saving it
567
+ * @returns {ObservableItem} this — chainable
568
+ * @example
569
+ * const theme = Observable('light').persist('app-theme');
570
+ * const count = Observable(0).persist('count', {
571
+ * get: (v) => parseInt(v),
572
+ * set: (v) => String(v),
573
+ * });
574
+ */
472
575
  ObservableItem.prototype.persist = function(key, options = {}) {
473
576
  let value = $getFromStorage(key, this.$currentValue);
474
577
  if(options.get) {
@@ -482,6 +585,17 @@ ObservableItem.prototype.persist = function(key, options = {}) {
482
585
  return this;
483
586
  };
484
587
 
588
+ /**
589
+ * Creates a new ObservableItem with a deep clone of the current value.
590
+ * For objects implementing a .clone() method, delegates to that method.
591
+ *
592
+ * @returns {ObservableItem} A new independent observable with the cloned value
593
+ * @example
594
+ * const original = Observable({ x: 1 });
595
+ * const copy = original.clone();
596
+ * copy.set({ x: 99 });
597
+ * original.val(); // { x: 1 } — untouched
598
+ */
485
599
  ObservableItem.prototype.clone = function() {
486
600
  let clonedValue = this.$currentValue;
487
601
 
@@ -1,24 +1,49 @@
1
- import ObservableItem from "./ObservableItem";
2
- import Validator from "../utils/validator";
3
- import {nextTick} from "../utils/helpers";
4
- import ObservableArray from "./ObservableArray";
1
+ import ObservableItem from './ObservableItem';
2
+ import Validator from '../utils/validator';
3
+ import {nextTick} from '../utils/helpers';
4
+ import ObservableArray from './ObservableArray';
5
5
 
6
+ /**
7
+ * Reactive object container extending ObservableItem.
8
+ * Each property of the target object becomes an individual ObservableItem (or ObservableArray/ObservableObject for nested structures).
9
+ * Use Observable.object() or Observable.init() rather than instantiating directly.
10
+ *
11
+ * @constructor
12
+ * @param {Record<string, *>} target - Plain object to make reactive
13
+ * @param {{ deep?: boolean, reset?: boolean, propagation?: boolean }|null} [configs] - Configuration
14
+ * @param {boolean} [configs.deep] - If false, nested objects and arrays are not wrapped recursively (default: true)
15
+ * @example
16
+ * const user = Observable.object({ name: 'John', age: 25 });
17
+ * user.name.$value = 'Jane'; // triggers reactivity on name only
18
+ */
6
19
  export const ObservableObject = function(target, configs) {
7
20
  ObservableItem.call(this, target);
8
21
  this.$observables = {};
9
22
  this.configs = configs;
10
23
 
11
- this.$load(target);
12
-
13
- for(const name in target) {
14
- if(!Object.hasOwn(this, name)) {
15
- Object.defineProperty(this, name, {
16
- get: () => this.$observables[name],
17
- set: (value) => this.$observables[name].set(value)
24
+ for(const key in target) {
25
+ if(!Object.hasOwn(this, key)) {
26
+ Object.defineProperty(this, key, {
27
+ get: () => this.$observables[key],
28
+ set: (value) => {
29
+ this.$observables[key].set(value);
30
+ },
31
+ configurable: true,
32
+ enumerable: true,
18
33
  });
19
34
  }
20
35
  }
21
36
 
37
+ this.$load(target);
38
+
39
+ Object.defineProperty(this, '$currentValue', {
40
+ get: function() {
41
+ return this.val();
42
+ },
43
+ set(value) {
44
+ this.set(value);
45
+ }
46
+ });
22
47
  };
23
48
 
24
49
  ObservableObject.prototype = Object.create(ObservableItem.prototype);
@@ -29,12 +54,19 @@ Object.defineProperty(ObservableObject, '$value', {
29
54
  },
30
55
  set(value) {
31
56
  this.set(value);
32
- }
33
- })
57
+ },
58
+ });
34
59
 
35
60
  ObservableObject.prototype.__$isObservableObject = true;
36
61
  ObservableObject.prototype.__isProxy__ = true;
37
62
 
63
+ /**
64
+ * Initialises (or reinitialize) the internal observables map from a plain object.
65
+ * Called automatically in the constructor.
66
+ *
67
+ * @internal
68
+ * @param {Record<string, *>} initialValue - Object whose properties are turned into observables
69
+ */
38
70
  ObservableObject.prototype.$load = function(initialValue) {
39
71
  const configs = this.configs;
40
72
  for(const key in initialValue) {
@@ -56,34 +88,39 @@ ObservableObject.prototype.$load = function(initialValue) {
56
88
  this.$observables[key] = new ObservableArray(itemValue, configs);
57
89
  continue;
58
90
  }
59
- if(Validator.isObservable(itemValue) || Validator.isProxy(itemValue)) {
91
+ if(itemValue?.__$Observable) {
60
92
  this.$observables[key] = itemValue;
61
93
  continue;
62
94
  }
63
- this.$observables[key] = (typeof itemValue === 'object') ? new ObservableObject(itemValue, configs) : new ObservableItem(itemValue, configs);
95
+ this.$observables[key] = (Validator.isJson(itemValue)) ? new ObservableObject(itemValue, configs) : new ObservableItem(itemValue, configs);
64
96
  }
65
97
  };
66
98
 
99
+ /**
100
+ * Returns a plain snapshot of all observable values.
101
+ * Unwraps nested ObservableItem, ObservableArray, and ObservableObject recursively.
102
+ * Alias: $val()
103
+ *
104
+ * @returns {Record<string, *>} Plain object with current values
105
+ * @example
106
+ * const user = Observable.object({ name: 'John', age: 25 });
107
+ * user.val(); // { name: 'John', age: 25 }
108
+ */
67
109
  ObservableObject.prototype.val = function() {
68
110
  const result = {};
69
111
  for(const key in this.$observables) {
70
112
  const dataItem = this.$observables[key];
71
- if(Validator.isObservable(dataItem)) {
113
+ if(dataItem?.__$Observable) {
72
114
  let value = dataItem.val();
73
115
  if(Array.isArray(value)) {
74
116
  value = value.map(item => {
75
- if(Validator.isObservable(item)) {
117
+ if(item.__$Observable) {
76
118
  return item.val();
77
119
  }
78
- if(Validator.isProxy(item)) {
79
- return item.$value;
80
- }
81
120
  return item;
82
121
  });
83
122
  }
84
123
  result[key] = value;
85
- } else if(Validator.isProxy(dataItem)) {
86
- result[key] = dataItem.$value;
87
124
  } else {
88
125
  result[key] = dataItem;
89
126
  }
@@ -92,20 +129,37 @@ ObservableObject.prototype.val = function() {
92
129
  };
93
130
  ObservableObject.prototype.$val = ObservableObject.prototype.val;
94
131
 
132
+ /**
133
+ * Returns the current value of a single property, unwrapped from its observable.
134
+ * Alias: $get(property)
135
+ *
136
+ * @param {string} property - Property name
137
+ * @returns {*} The current value of that property
138
+ * @example
139
+ * const user = Observable.object({ name: 'John' });
140
+ * user.get('name'); // 'John'
141
+ */
95
142
  ObservableObject.prototype.get = function(property) {
96
143
  const item = this.$observables[property];
97
- if(Validator.isObservable(item)) {
144
+ if(item?.__$Observable) {
98
145
  return item.val();
99
146
  }
100
- if(Validator.isProxy(item)) {
101
- return item.$value;
102
- }
103
147
  return item;
104
148
  };
105
149
  ObservableObject.prototype.$get = ObservableObject.prototype.get;
106
150
 
151
+ /**
152
+ * Updates one or more properties with new values.
153
+ * Supports partial updates — only provided keys are changed.
154
+ * Aliases: $set(newData), $updateWith(newData), update(newData)
155
+ *
156
+ * @param {Partial<Record<string, *>>} newData - Object with properties to update
157
+ * @example
158
+ * const user = Observable.object({ name: 'John', age: 25 });
159
+ * user.set({ name: 'Jane' }); // Only name changes, age stays 25
160
+ */
107
161
  ObservableObject.prototype.set = function(newData) {
108
- const data = Validator.isProxy(newData) ? newData.$value : newData;
162
+ const data = newData?.__$Observable ? newData.$value : newData;
109
163
  const configs = this.configs;
110
164
 
111
165
  for(const key in data) {
@@ -113,15 +167,19 @@ ObservableObject.prototype.set = function(newData) {
113
167
  const newValueOrigin = newData[key];
114
168
  const newValue = data[key];
115
169
 
116
- if(Validator.isObservable(targetItem)) {
170
+ if(targetItem?.__$Observable) {
171
+ if(targetItem.__$isObservableObject) {
172
+ targetItem.update(newValue);
173
+ continue;
174
+ }
117
175
  if(!Validator.isArray(newValue)) {
118
176
  targetItem.set(newValue);
119
177
  continue;
120
178
  }
121
179
  const firstElementFromOriginalValue = newValueOrigin.at(0);
122
- if(Validator.isObservable(firstElementFromOriginalValue) || Validator.isProxy(firstElementFromOriginalValue)) {
180
+ if(firstElementFromOriginalValue?.__$Observable) {
123
181
  const newValues = newValue.map(item => {
124
- if(Validator.isProxy(firstElementFromOriginalValue)) {
182
+ if(firstElementFromOriginalValue.__$isObservableObject) {
125
183
  return new ObservableObject(item, configs);
126
184
  }
127
185
  return ObservableItem(item, configs);
@@ -132,35 +190,68 @@ ObservableObject.prototype.set = function(newData) {
132
190
  targetItem.set([...newValue]);
133
191
  continue;
134
192
  }
135
- if(Validator.isProxy(targetItem)) {
136
- targetItem.update(newValue);
137
- continue;
138
- }
139
193
  this[key] = newValue;
140
194
  }
141
195
  };
142
196
  ObservableObject.prototype.$set = ObservableObject.prototype.set;
143
197
  ObservableObject.prototype.$updateWith = ObservableObject.prototype.set;
144
198
 
199
+ /**
200
+ * Returns an array of all internal observable instances (one per property).
201
+ * Alias: $observables()
202
+ *
203
+ * @returns {ObservableItem[]} Array of observable instances
204
+ */
145
205
  ObservableObject.prototype.observables = function() {
146
206
  return Object.values(this.$observables);
147
207
  };
148
208
  ObservableObject.prototype.$observables = ObservableObject.prototype.observables;
149
209
 
210
+ /**
211
+ * Returns all property names of the observable object.
212
+ * Alias: $keys()
213
+ *
214
+ * @returns {string[]} Array of property names
215
+ */
150
216
  ObservableObject.prototype.keys = function() {
151
217
  return Object.keys(this.$observables);
152
218
  };
153
219
  ObservableObject.prototype.$keys = ObservableObject.prototype.keys;
220
+
221
+ /**
222
+ * Creates a new ObservableObject with a snapshot of the current values.
223
+ * Changes to the clone do not affect the original.
224
+ * Alias: $clone()
225
+ *
226
+ * @returns {ObservableObject} New independent ObservableObject with the same structure and values
227
+ */
154
228
  ObservableObject.prototype.clone = function() {
155
229
  return new ObservableObject(this.val(), this.configs);
156
230
  };
157
231
  ObservableObject.prototype.$clone = ObservableObject.prototype.clone;
232
+
233
+ /**
234
+ * Resets all properties to their initial values by calling .reset() on each child observable.
235
+ * Only works if observables were created with { reset: true }.
236
+ */
158
237
  ObservableObject.prototype.reset = function() {
159
238
  for(const key in this.$observables) {
160
239
  this.$observables[key].reset();
161
240
  }
162
241
  };
163
242
  ObservableObject.prototype.originalSubscribe = ObservableObject.prototype.subscribe;
243
+
244
+ /**
245
+ * Subscribes to changes across all nested observables.
246
+ * The callback is called whenever any property (or nested value) changes.
247
+ * Internally uses debouncing (nextTick) to batch multiple simultaneous changes.
248
+ *
249
+ * @param {(value: Record<string, *>) => void} callback - Called on any nested change
250
+ * @example
251
+ * const user = Observable.object({ name: 'John', age: 25 });
252
+ * user.subscribe(() => console.log('user changed:', user.val()));
253
+ * user.name.$value = 'Jane'; // logs 'user changed: { name: "Jane", age: 25 }'
254
+ */
164
255
  ObservableObject.prototype.subscribe = function(callback) {
165
256
  const observables = this.observables();
166
257
  const updatedValue = nextTick(() => this.trigger());
@@ -171,7 +262,7 @@ ObservableObject.prototype.subscribe = function(callback) {
171
262
  const observable = observables[i];
172
263
  if (observable.__$isObservableArray) {
173
264
  observable.deepSubscribe(updatedValue);
174
- continue
265
+ continue;
175
266
  }
176
267
  observable.subscribe(updatedValue);
177
268
  }