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,47 +1,116 @@
1
- import Validator from "../../utils/validator";
2
- import { createFilter, createMultiSourceFilter } from "./utils";
3
- import DebugManager from "../debug-manager";
4
-
1
+ import Validator from '../../utils/validator';
2
+ import { createFilter, createMultiSourceFilter } from './utils';
3
+ import DebugManager from '../debug-manager';
5
4
 
5
+ /**
6
+ * Creates a filter that passes values strictly equal to the target.
7
+ *
8
+ * @param {*|ObservableItem} observableOrValue - Static value or observable to compare against
9
+ * @returns {FilterResult}
10
+ * @example
11
+ * const statusFilter = equals('active');
12
+ * users.where({ status: statusFilter });
13
+ */
6
14
  export function equals(observableOrValue){
7
15
  return createFilter(observableOrValue, (value, target) => value === target);
8
16
  }
9
17
 
18
+ /**
19
+ * Creates a filter that passes values not strictly equal to the target.
20
+ *
21
+ * @param {*|ObservableItem} observableOrValue - Static value or observable
22
+ * @returns {FilterResult}
23
+ */
10
24
  export function notEquals(observableOrValue){
11
25
  return createFilter(observableOrValue, (value, target) => value !== target);
12
26
  }
13
27
 
28
+ /**
29
+ * Creates a filter that passes values greater than the target.
30
+ *
31
+ * @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
32
+ * @returns {FilterResult}
33
+ */
14
34
  export function greaterThan(observableOrValue){
15
35
  return createFilter(observableOrValue, (value, target) => value > target);
16
36
  }
17
37
 
38
+ /**
39
+ * Creates a filter that passes values greater than or equal to the target.
40
+ *
41
+ * @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
42
+ * @returns {FilterResult}
43
+ */
18
44
  export function greaterThanOrEqual(observableOrValue){
19
45
  return createFilter(observableOrValue, (value, target) => value >= target);
20
46
  }
21
47
 
48
+ /**
49
+ * Creates a filter that passes values less than the target.
50
+ *
51
+ * @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
52
+ * @returns {FilterResult}
53
+ */
22
54
  export function lessThan(observableOrValue){
23
55
  return createFilter(observableOrValue, (value, target) => value < target);
24
56
  }
25
57
 
58
+ /**
59
+ * Creates a filter that passes values less than or equal to the target.
60
+ *
61
+ * @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
62
+ * @returns {FilterResult}
63
+ */
26
64
  export function lessThanOrEqual(observableOrValue){
27
65
  return createFilter(observableOrValue, (value, target) => value <= target);
28
66
  }
29
67
 
68
+ /**
69
+ * Creates a filter that passes values between min and max (inclusive).
70
+ * Both min and max can be static values or observables.
71
+ *
72
+ * @param {number|ObservableItem<number>} minObservableOrValue - Lower bound
73
+ * @param {number|ObservableItem<number>} maxObservableOrValue - Upper bound
74
+ * @returns {FilterResult}
75
+ * @example
76
+ * items.where({ age: between(18, 65) });
77
+ */
30
78
  export function between(minObservableOrValue, maxObservableOrValue){
31
79
  return createMultiSourceFilter(
32
80
  [minObservableOrValue, maxObservableOrValue],
33
- (value, [min, max]) => value >= min && value <= max
81
+ (value, [min, max]) => value >= min && value <= max,
34
82
  );
35
83
  }
36
84
 
85
+ /**
86
+ * Creates a filter that passes values included in the given array.
87
+ *
88
+ * @param {Array|ObservableItem<Array>} observableOrArray - Array to check membership in
89
+ * @returns {FilterResult}
90
+ * @example
91
+ * items.where({ role: inArray(['admin', 'editor']) });
92
+ */
37
93
  export function inArray(observableOrArray){
38
94
  return createFilter(observableOrArray, (value, arr) => arr.includes(value));
39
95
  }
40
96
 
97
+ /**
98
+ * Creates a filter that passes values not included in the given array.
99
+ *
100
+ * @param {Array|ObservableItem<Array>} observableOrArray - Array to check exclusion from
101
+ * @returns {FilterResult}
102
+ */
41
103
  export function notIn(observableOrArray){
42
104
  return createFilter(observableOrArray, (value, arr) => !arr.includes(value));
43
105
  }
44
106
 
107
+ /**
108
+ * Creates a filter that passes when the value is empty (null, undefined, empty string, or empty array).
109
+ * Pass false as the argument to filter for non-empty values instead.
110
+ *
111
+ * @param {boolean|ObservableItem<boolean>} [observableOrValue=true] - If true, filters empty values; if false, filters non-empty
112
+ * @returns {FilterResult}
113
+ */
45
114
  export function isEmpty(observableOrValue = true){
46
115
  return createFilter(observableOrValue, (value, shouldBeEmpty) => {
47
116
  const isActuallyEmpty = !value || value === '' ||
@@ -51,6 +120,13 @@ export function isEmpty(observableOrValue = true){
51
120
  });
52
121
  }
53
122
 
123
+ /**
124
+ * Creates a filter that passes when the value is not empty.
125
+ * Pass false as the argument to filter for empty values instead.
126
+ *
127
+ * @param {boolean|ObservableItem<boolean>} [observableOrValue=true] - If true, filters non-empty values
128
+ * @returns {FilterResult}
129
+ */
54
130
  export function isNotEmpty(observableOrValue = true){
55
131
  return createFilter(observableOrValue, (value, shouldBeNotEmpty) => {
56
132
  const isActuallyNotEmpty = !!value && value !== '' &&
@@ -60,6 +136,18 @@ export function isNotEmpty(observableOrValue = true){
60
136
  });
61
137
  }
62
138
 
139
+ /**
140
+ * Creates a filter that tests the value against a pattern (string or regex).
141
+ *
142
+ * @param {string|RegExp|ObservableItem} patternObservableOrValue - Pattern to match against
143
+ * @param {boolean|ObservableItem<boolean>} [asRegexObservableOrValue=true] - If true, treat pattern as a regex; if false, use case-insensitive substring match
144
+ * @param {string|ObservableItem<string>} [flagsObservableOrValue=''] - Regex flags (e.g. 'i', 'g')
145
+ * @returns {FilterResult}
146
+ * @example
147
+ * const search = Observable('john');
148
+ * users.where({ name: match(search) }); // regex match, reactive
149
+ * users.where({ name: match('john', false) }); // case-insensitive substring
150
+ */
63
151
  export function match(patternObservableOrValue, asRegexObservableOrValue = true, flagsObservableOrValue = ''){
64
152
  return createMultiSourceFilter(
65
153
  [patternObservableOrValue, asRegexObservableOrValue, flagsObservableOrValue],
@@ -80,10 +168,19 @@ export function match(patternObservableOrValue, asRegexObservableOrValue = true,
80
168
  return String(value).toLowerCase().includes(String(pattern).toLowerCase());
81
169
  }
82
170
  return String(value).includes(String(pattern));
83
- }
171
+ },
84
172
  );
85
173
  }
86
174
 
175
+ /**
176
+ * Combines multiple filters with AND logic — all filters must pass.
177
+ * Merges dependencies from all child filters automatically.
178
+ *
179
+ * @param {...FilterResult} filters - Filters to combine
180
+ * @returns {FilterResult}
181
+ * @example
182
+ * items.where({ _: and(greaterThan(18), lessThan(65)) });
183
+ */
87
184
  export function and(...filters){
88
185
  const dependencies = filters
89
186
  .flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
@@ -91,10 +188,19 @@ export function and(...filters){
91
188
 
92
189
  return {
93
190
  dependencies: dependencies.length > 0 ? dependencies : null,
94
- callback: (value) => filters.every(f => f.callback(value))
191
+ callback: (value) => filters.every(f => f.callback(value)),
95
192
  };
96
193
  }
97
194
 
195
+ /**
196
+ * Combines multiple filters with OR logic — at least one filter must pass.
197
+ * Merges dependencies from all child filters automatically.
198
+ *
199
+ * @param {...FilterResult} filters - Filters to combine
200
+ * @returns {FilterResult}
201
+ * @example
202
+ * items.where({ _: or(equals('admin'), equals('editor')) });
203
+ */
98
204
  export function or(...filters){
99
205
  const dependencies = filters
100
206
  .flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
@@ -102,17 +208,36 @@ export function or(...filters){
102
208
 
103
209
  return {
104
210
  dependencies: dependencies.length > 0 ? dependencies : null,
105
- callback: (value) => filters.some(f => f.callback(value))
211
+ callback: (value) => filters.some(f => f.callback(value)),
106
212
  };
107
213
  }
108
214
 
215
+ /**
216
+ * Negates a filter — passes when the given filter does not pass.
217
+ *
218
+ * @param {FilterResult} filter - Filter to negate
219
+ * @returns {FilterResult}
220
+ * @example
221
+ * items.where({ status: not(equals('deleted')) });
222
+ */
109
223
  export function not(filter){
110
224
  return {
111
225
  dependencies: filter.dependencies,
112
- callback: (value) => !filter.callback(value)
226
+ callback: (value) => !filter.callback(value),
113
227
  };
114
228
  }
115
229
 
230
+ /**
231
+ * Creates a custom filter from a callback and a list of observable dependencies.
232
+ * The callback receives the item value followed by the current values of all observables.
233
+ *
234
+ * @param {(value: *, ...depValues: any[]) => boolean} callbackFn - Filter function
235
+ * @param {...ObservableItem} observables - Observable dependencies passed as extra arguments to callback
236
+ * @returns {FilterResult}
237
+ * @example
238
+ * const minAge = Observable(18);
239
+ * items.where({ age: custom((age, min) => age >= min, minAge) });
240
+ */
116
241
  export function custom(callbackFn, ...observables){
117
242
  const dependencies = observables.filter(Validator.isObservable);
118
243
 
@@ -120,10 +245,10 @@ export function custom(callbackFn, ...observables){
120
245
  dependencies: dependencies.length > 0 ? dependencies : null,
121
246
  callback: (value) => {
122
247
  const values = observables.map(o =>
123
- Validator.isObservable(o) ? o.val() : o
248
+ Validator.isObservable(o) ? o.val() : o,
124
249
  );
125
250
  return callbackFn(value, ...values);
126
- }
251
+ },
127
252
  };
128
253
  }
129
254
 
@@ -1,6 +1,18 @@
1
- import { createFilter, createMultiSourceFilter } from "./utils";
2
-
1
+ import { createFilter, createMultiSourceFilter } from './utils';
3
2
 
3
+ /**
4
+ * Creates a filter that passes when the value includes the given query string.
5
+ * Case-insensitive by default.
6
+ * Alias: contains
7
+ *
8
+ * @param {string|ObservableItem<string>} observableOrValue - Substring to search for
9
+ * @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
10
+ * @returns {FilterResult}
11
+ * @example
12
+ * const search = Observable('john');
13
+ * users.where({ name: includes(search) }); // reactive, case-insensitive
14
+ * users.where({ name: includes('John', true) }); // case-sensitive
15
+ */
4
16
  export function includes(observableOrValue, caseSensitive = false){
5
17
  return createFilter(observableOrValue, (value, query) => {
6
18
  if (!value) return false;
@@ -14,6 +26,16 @@ export function includes(observableOrValue, caseSensitive = false){
14
26
 
15
27
  export const contains = includes;
16
28
 
29
+ /**
30
+ * Creates a filter that passes when the value starts with the given query string.
31
+ * Case-insensitive by default.
32
+ *
33
+ * @param {string|ObservableItem<string>} observableOrValue - Prefix to search for
34
+ * @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
35
+ * @returns {FilterResult}
36
+ * @example
37
+ * users.where({ name: startsWith('Jo') });
38
+ */
17
39
  export function startsWith(observableOrValue, caseSensitive = false){
18
40
  return createFilter(observableOrValue, (value, query) => {
19
41
  if (!query) return true;
@@ -24,6 +46,16 @@ export function startsWith(observableOrValue, caseSensitive = false){
24
46
  });
25
47
  }
26
48
 
49
+ /**
50
+ * Creates a filter that passes when the value ends with the given query string.
51
+ * Case-insensitive by default.
52
+ *
53
+ * @param {string|ObservableItem<string>} observableOrValue - Suffix to search for
54
+ * @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
55
+ * @returns {FilterResult}
56
+ * @example
57
+ * files.where({ name: endsWith('.js') });
58
+ */
27
59
  export function endsWith(observableOrValue, caseSensitive = false){
28
60
  return createFilter(observableOrValue, (value, query) => {
29
61
  if (!query) return true;
@@ -1,10 +1,23 @@
1
- import Validator from "../../utils/validator";
1
+ import Validator from '../../utils/validator';
2
2
 
3
+ /**
4
+ * Converts a value to a Date object. Returns the value as-is if it's already a Date.
5
+ *
6
+ * @param {Date|number|string} value - Value to convert
7
+ * @returns {Date}
8
+ */
3
9
  export function toDate(value) {
4
10
  if (value instanceof Date) return value;
5
11
  return new Date(value);
6
12
  }
7
13
 
14
+ /**
15
+ * Returns true if two date values fall on the same calendar day (year, month, day).
16
+ *
17
+ * @param {Date|number|string} date1 - First date
18
+ * @param {Date|number|string} date2 - Second date
19
+ * @returns {boolean}
20
+ */
8
21
  export function isSameDay(date1, date2) {
9
22
  const d1 = toDate(date1);
10
23
  const d2 = toDate(date2);
@@ -13,29 +26,52 @@ export function isSameDay(date1, date2) {
13
26
  d1.getDate() === d2.getDate();
14
27
  }
15
28
 
29
+ /**
30
+ * Returns the total number of seconds elapsed since midnight for the given date's time component.
31
+ * Used internally for time range comparisons.
32
+ *
33
+ * @param {Date|number|string} date - Date value to extract time from
34
+ * @returns {number} Seconds since midnight (0–86399)
35
+ */
16
36
  export function getSecondsOfDay(date) {
17
37
  const d = toDate(date);
18
38
  return (d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds();
19
39
  }
20
40
 
41
+ /**
42
+ * Creates a FilterResult from a single observable or static value and a comparison callback.
43
+ * If the value is an observable, it is registered as a dependency so the filter reacts to changes.
44
+ *
45
+ * @param {*|ObservableItem} observableOrValue - Observable or static value used as the comparison target
46
+ * @param {(value: *, target: *) => boolean} callbackFn - Filter function receiving (item value, target value)
47
+ * @returns {{ dependencies: ObservableItem|null, callback: (value: *) => boolean }} FilterResult
48
+ */
21
49
  export function createFilter(observableOrValue, callbackFn){
22
50
  const isObservable = Validator.isObservable(observableOrValue);
23
51
 
24
52
  return {
25
53
  dependencies: isObservable ? observableOrValue : null,
26
- callback: (value) => callbackFn(value, isObservable ? observableOrValue.val() : observableOrValue)
54
+ callback: (value) => callbackFn(value, isObservable ? observableOrValue.val() : observableOrValue),
27
55
  };
28
56
  }
29
57
 
58
+ /**
59
+ * Creates a FilterResult from multiple observable or static sources and a multi-value comparison callback.
60
+ * All observable sources are registered as dependencies.
61
+ *
62
+ * @param {Array<*|ObservableItem>} sources - Array of observables or static values
63
+ * @param {(value: *, targets: any[]) => boolean} callbackFn - Filter function receiving (item value, array of resolved source values)
64
+ * @returns {{ dependencies: ObservableItem[]|null, callback: (value: *) => boolean }} FilterResult
65
+ */
30
66
  export function createMultiSourceFilter(sources, callbackFn){
31
67
  const observables = sources.filter(Validator.isObservable);
32
68
 
33
69
  const getValues = () => sources.map(src =>
34
- Validator.isObservable(src) ? src.val() : src
70
+ Validator.isObservable(src) ? src.val() : src,
35
71
  );
36
72
 
37
73
  return {
38
74
  dependencies: observables.length > 0 ? observables : null,
39
- callback: (value) => callbackFn(value, getValues())
75
+ callback: (value) => callbackFn(value, getValues()),
40
76
  };
41
77
  }
@@ -12,7 +12,7 @@ const $parseDateParts = (value, locale) => {
12
12
  }).formatToParts(d).reduce((acc, { type, value }) => {
13
13
  acc[type] = value;
14
14
  return acc;
15
- }, {})
15
+ }, {}),
16
16
  };
17
17
  };
18
18
 
@@ -38,20 +38,20 @@ export const Formatters = {
38
38
  currency,
39
39
  notation,
40
40
  minimumFractionDigits,
41
- maximumFractionDigits
41
+ maximumFractionDigits,
42
42
  }).format(value),
43
43
 
44
44
  number: (value, locale, { notation, minimumFractionDigits, maximumFractionDigits } = {}) =>
45
45
  new Intl.NumberFormat(locale, {
46
46
  notation,
47
47
  minimumFractionDigits,
48
- maximumFractionDigits
48
+ maximumFractionDigits,
49
49
  }).format(value),
50
50
 
51
51
  percent: (value, locale, { decimals = 1 } = {}) =>
52
52
  new Intl.NumberFormat(locale, {
53
53
  style: 'percent',
54
- maximumFractionDigits: decimals
54
+ maximumFractionDigits: decimals,
55
55
  }).format(value),
56
56
 
57
57
  date: (value, locale, { format, dateStyle = 'long' } = {}) => {
@@ -1,5 +1,13 @@
1
- import Validator from "./validator";
1
+ import Validator from './validator';
2
2
 
3
+ /**
4
+ * Calls a function with the given arguments and optional context.
5
+ *
6
+ * @internal
7
+ * @param {Function} fn - Function to invoke
8
+ * @param {Array} args - Arguments to pass
9
+ * @param {Object|null} [context] - `this` context, or null to call without binding
10
+ */
3
11
  const invoke = function(fn, args, context) {
4
12
  if(context) {
5
13
  fn.apply(context, args);
@@ -32,7 +40,7 @@ export const debounce = function(fn, delay, options = {}) {
32
40
  // debounce mode: reset the timer for each call
33
41
  clearTimeout(timer);
34
42
  timer = setTimeout(() => invoke(fn, lastArgs, context), delay);
35
- }
43
+ };
36
44
  };
37
45
 
38
46
  export const nextTick = function(fn) {
@@ -48,12 +56,18 @@ export const nextTick = function(fn) {
48
56
  };
49
57
  };
50
58
 
59
+
51
60
  /**
61
+ * Returns the unique key for a given item, used by ForEach and ForEachArray for DOM diffing.
62
+ * Resolution order:
63
+ * 1. If key is a function: calls key(item, defaultKey)
64
+ * 2. If key is a string: reads item[key] (unwrapping observables)
65
+ * 3. Otherwise: returns item value or defaultKey
52
66
  *
53
- * @param {*} item
54
- * @param {string|null} defaultKey
55
- * @param {?Function} key
56
- * @returns {*}
67
+ * @param {*} item - The item to extract a key from
68
+ * @param {string|number} defaultKey - Fallback key (usually the array index)
69
+ * @param {string|Function|null} key - Key property name or custom key function
70
+ * @returns {string|number} The resolved unique key
57
71
  */
58
72
  export const getKey = (item, defaultKey, key) => {
59
73
  if (Validator.isString(key)) {
@@ -70,10 +84,28 @@ export const getKey = (item, defaultKey, key) => {
70
84
  return val ?? defaultKey;
71
85
  };
72
86
 
87
+ /**
88
+ * Trims all leading and trailing occurrences of char from str.
89
+ *
90
+ * @param {string} str - String to trim
91
+ * @param {string} char - Character to remove from both ends
92
+ * @returns {string} Trimmed string
93
+ * @example
94
+ * trim('/foo/bar/', '/'); // 'foo/bar'
95
+ */
73
96
  export const trim = function(str, char) {
74
97
  return str.replace(new RegExp(`^[${char}]+|[${char}]+$`, 'g'), '');
75
- }
98
+ };
76
99
 
100
+ /**
101
+ * Deep clones a value. Uses structuredClone when available.
102
+ * Handles: primitives, Dates, Arrays, plain Objects.
103
+ * Observables are kept by reference (not cloned); onObservableFound is called for each.
104
+ *
105
+ * @param {*} value - Value to clone
106
+ * @param {((observable: ObservableItem) => void)?} [onObservableFound] - Called for each observable encountered
107
+ * @returns {*} Deep clone of the value
108
+ */
77
109
  export const deepClone = (value, onObservableFound) => {
78
110
  try {
79
111
  if(window.structuredClone !== undefined) {
@@ -1,8 +1,8 @@
1
- import NativeDocumentError from "../errors/NativeDocumentError";
1
+ import NativeDocumentError from '../errors/NativeDocumentError';
2
2
 
3
3
  export const LocalStorage = {
4
4
  getJson(key) {
5
- let value = localStorage.getItem(key);
5
+ const value = localStorage.getItem(key);
6
6
  try {
7
7
  return JSON.parse(value);
8
8
  } catch (e) {
@@ -33,25 +33,25 @@ export const LocalStorage = {
33
33
  },
34
34
  has(key) {
35
35
  return localStorage.getItem(key) != null;
36
- }
37
- }
36
+ },
37
+ };
38
38
 
39
39
  export const $getFromStorage = (key, value) => {
40
40
  if(!LocalStorage.has(key)) {
41
41
  return value;
42
42
  }
43
43
  switch (typeof value) {
44
- case 'object': return LocalStorage.getJson(key) ?? value;
45
- case 'boolean': return LocalStorage.getBool(key) ?? value;
46
- case 'number': return LocalStorage.getNumber(key) ?? value;
47
- default: return LocalStorage.get(key, value) ?? value;
44
+ case 'object': return LocalStorage.getJson(key) ?? value;
45
+ case 'boolean': return LocalStorage.getBool(key) ?? value;
46
+ case 'number': return LocalStorage.getNumber(key) ?? value;
47
+ default: return LocalStorage.get(key, value) ?? value;
48
48
  }
49
49
  };
50
50
 
51
51
  export const $saveToStorage = (value) => {
52
52
  switch (typeof value) {
53
- case 'object': return LocalStorage.setJson;
54
- case 'boolean': return LocalStorage.setBool;
55
- default: return LocalStorage.set;
53
+ case 'object': return LocalStorage.setJson;
54
+ case 'boolean': return LocalStorage.setBool;
55
+ default: return LocalStorage.set;
56
56
  }
57
57
  };
@@ -1,5 +1,17 @@
1
1
 
2
2
 
3
+ /**
4
+ * Wraps a function so it executes at most once.
5
+ * Later calls return the cached result without re-executing the function.
6
+ *
7
+ * @template T
8
+ * @param {(...args: any[]) => T} fn - Function to wrap
9
+ * @returns {(...args: any[]) => T} Memoized function
10
+ * @example
11
+ * const init = once(() => expensiveSetup());
12
+ * init(); // runs setup
13
+ * init(); // returns cached result
14
+ */
3
15
  export const once = (fn) => {
4
16
  let result = null;
5
17
  return (...args) => {
@@ -11,6 +23,18 @@ export const once = (fn) => {
11
23
  };
12
24
  };
13
25
 
26
+ /**
27
+ * Creates a lazy proxy that calls fn() once on first property access,
28
+ * then returns properties from the cached result for all later accesses.
29
+ *
30
+ * @template T
31
+ * @param {() => T} fn - Factory function to call once
32
+ * @returns {T} Proxy to the lazily created object
33
+ * @example
34
+ * const store = autoOnce(() => createExpensiveStore());
35
+ * store.count; // triggers createExpensiveStore() on first access
36
+ * store.name; // uses a cached result
37
+ */
14
38
  export const autoOnce = (fn) => {
15
39
  let target = null;
16
40
  return new Proxy({}, {
@@ -20,10 +44,22 @@ export const autoOnce = (fn) => {
20
44
  }
21
45
  target = fn();
22
46
  return target[key];
23
- }
47
+ },
24
48
  });
25
49
  };
26
50
 
51
+ /**
52
+ * Wraps a function with key-based memoization.
53
+ * The first argument is used as the cache key; later arguments are passed to fn.
54
+ *
55
+ * @template T
56
+ * @param {(...args: any[]) => T} fn - Function to memoize
57
+ * @returns {(key: any, ...args: any[]) => T} Memoized function
58
+ * @example
59
+ * const getUser = memoize((id) => fetchUser(id));
60
+ * getUser('user-1', 1); // fetches
61
+ * getUser('user-1', 1); // returns cached
62
+ */
27
63
  export const memoize = (fn) => {
28
64
  const cache = new Map();
29
65
  return (...args) => {
@@ -38,6 +74,23 @@ export const memoize = (fn) => {
38
74
  };
39
75
  };
40
76
 
77
+ /**
78
+ * Creates a proxy where each property access memorizes the result of calling fn with the property key.
79
+ * If fn accepts arguments (fn.length > 0), the proxy returns a memoized function instead.
80
+ *
81
+ * @template T
82
+ * @param {((key: string|symbol, ...args?: any[]) => T)} fn - Factory function
83
+ * @returns {Record<string|symbol, T>} Proxy with per-key memoized results
84
+ * @example
85
+ * // fn with no args — result memoized by key
86
+ * const icons = autoMemoize((name) => loadIcon(name));
87
+ * icons.home; // calls loadIcon('home'), caches result
88
+ * icons.home; // returns cached
89
+ *
90
+ * // fn with args — returns a memoized function per key
91
+ * const formatters = autoMemoize((locale, value) => format(value, locale));
92
+ * formatters.fr('hello'); // calls format('hello', 'fr'), caches under 'fr'
93
+ */
41
94
  export const autoMemoize = (fn) => {
42
95
  const cache = new Map();
43
96
  return new Proxy({}, {
@@ -52,11 +105,11 @@ export const autoMemoize = (fn) => {
52
105
  const result = fn(...args, key);
53
106
  cache.set(key, result);
54
107
  return result;
55
- }
108
+ };
56
109
  }
57
110
  const result = fn(key);
58
111
  cache.set(key, result);
59
112
  return result;
60
- }
113
+ },
61
114
  });
62
115
  };
@@ -1,4 +1,4 @@
1
- import DebugManager from "./debug-manager";
1
+ import DebugManager from './debug-manager';
2
2
 
3
3
  let PluginsManager = null;
4
4
 
@@ -18,7 +18,7 @@ if(process.env.NODE_ENV === 'development') {
18
18
  }
19
19
  name = name || plugin.name;
20
20
  if (!name || typeof name !== 'string') {
21
- throw new Error(`Please, provide a valid plugin name`);
21
+ throw new Error('Please, provide a valid plugin name');
22
22
  }
23
23
  if($plugins.has(name)) {
24
24
  return;
@@ -73,7 +73,7 @@ if(process.env.NODE_ENV === 'development') {
73
73
  }
74
74
  }
75
75
  }
76
- }
76
+ },
77
77
  };
78
78
  }());
79
79
  }