native-document 1.0.14 → 1.0.16-8.1

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 (643) hide show
  1. package/.npmrc.example +1 -0
  2. package/.vitepress/config.js +166 -0
  3. package/CHANGELOG.md +153 -0
  4. package/cdn.js +19 -0
  5. package/components.d.ts +2 -0
  6. package/components.js +30 -0
  7. package/devtools/ComponentRegistry.js +113 -0
  8. package/devtools/index.js +8 -0
  9. package/devtools/plugin/dev-tools-plugin.js +15 -0
  10. package/devtools/transformers/nd-vite-devtools.js +55 -0
  11. package/devtools/transformers/src/transformComponentForHrm.js +73 -0
  12. package/devtools/transformers/src/transformJsFile.js +9 -0
  13. package/devtools/transformers/src/utils.js +79 -0
  14. package/devtools/transformers/templates/hrm.hook.template.js +46 -0
  15. package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
  16. package/devtools/widget/Widget.js +49 -0
  17. package/devtools/widget/widget.css +81 -0
  18. package/devtools/widget.js +23 -0
  19. package/dist/native-document.components.min.css +1 -0
  20. package/dist/native-document.components.min.js +23847 -0
  21. package/dist/native-document.dev.js +8665 -1313
  22. package/dist/native-document.dev.js.map +1 -0
  23. package/dist/native-document.devtools.min.js +1 -0
  24. package/dist/native-document.min.js +1 -1
  25. package/docs/advanced-components.md +419 -0
  26. package/docs/anchor.md +218 -131
  27. package/docs/cache.md +180 -0
  28. package/docs/cli.md +179 -0
  29. package/docs/components/accordion.md +172 -0
  30. package/docs/components/alert.md +99 -0
  31. package/docs/components/avatar.md +160 -0
  32. package/docs/components/badge.md +102 -0
  33. package/docs/components/breadcrumb.md +89 -0
  34. package/docs/components/button.md +183 -0
  35. package/docs/components/card.md +69 -0
  36. package/docs/components/context-menu.md +118 -0
  37. package/docs/components/data-table.md +345 -0
  38. package/docs/components/dropdown.md +214 -0
  39. package/docs/components/form/autocomplete-field.md +81 -0
  40. package/docs/components/form/checkbox-field.md +41 -0
  41. package/docs/components/form/checkbox-group-field.md +54 -0
  42. package/docs/components/form/color-field.md +64 -0
  43. package/docs/components/form/date-field.md +92 -0
  44. package/docs/components/form/field-collection.md +63 -0
  45. package/docs/components/form/file-field.md +203 -0
  46. package/docs/components/form/form-control.md +87 -0
  47. package/docs/components/form/image-field.md +90 -0
  48. package/docs/components/form/index.md +115 -0
  49. package/docs/components/form/number-field.md +65 -0
  50. package/docs/components/form/radio-field.md +51 -0
  51. package/docs/components/form/select-field.md +123 -0
  52. package/docs/components/form/slider.md +136 -0
  53. package/docs/components/form/string-field.md +134 -0
  54. package/docs/components/form/textarea-field.md +65 -0
  55. package/docs/components/form-fields.md +372 -0
  56. package/docs/components/getting-started.md +264 -0
  57. package/docs/components/index.md +337 -0
  58. package/docs/components/layout.md +279 -0
  59. package/docs/components/list.md +73 -0
  60. package/docs/components/menu.md +215 -0
  61. package/docs/components/modal.md +156 -0
  62. package/docs/components/pagination.md +95 -0
  63. package/docs/components/popover.md +131 -0
  64. package/docs/components/progress.md +111 -0
  65. package/docs/components/shortcut-manager.md +221 -0
  66. package/docs/components/simple-table.md +107 -0
  67. package/docs/components/skeleton.md +155 -0
  68. package/docs/components/spinner.md +100 -0
  69. package/docs/components/splitter.md +133 -0
  70. package/docs/components/stepper.md +163 -0
  71. package/docs/components/switch.md +113 -0
  72. package/docs/components/tabs.md +153 -0
  73. package/docs/components/toast.md +119 -0
  74. package/docs/components/tooltip.md +151 -0
  75. package/docs/components/traits.md +261 -0
  76. package/docs/conditional-rendering.md +177 -501
  77. package/docs/contributing.md +300 -25
  78. package/docs/core-concepts.md +209 -367
  79. package/docs/elements.md +268 -255
  80. package/docs/extending-native-document-element.md +259 -0
  81. package/docs/filters.md +247 -0
  82. package/docs/getting-started.md +199 -260
  83. package/docs/i18n.md +241 -0
  84. package/docs/index.md +76 -0
  85. package/docs/lifecycle-events.md +146 -67
  86. package/docs/list-rendering.md +387 -0
  87. package/docs/memory-management.md +135 -46
  88. package/docs/native-document-element.md +487 -0
  89. package/docs/native-fetch.md +213 -0
  90. package/docs/observable-resource.md +364 -0
  91. package/docs/observables.md +690 -356
  92. package/docs/routing.md +246 -646
  93. package/docs/state-management.md +213 -306
  94. package/docs/svg-elements.md +231 -0
  95. package/docs/theming.md +409 -0
  96. package/docs/tutorials/.gitkeep +0 -0
  97. package/docs/validation.md +98 -93
  98. package/docs/vitepress-conventions.md +219 -0
  99. package/elements.d.ts +7 -0
  100. package/elements.js +3 -4
  101. package/eslint.config.js +35 -0
  102. package/i18n.js +1 -0
  103. package/i18n.ts +2 -0
  104. package/index.d.ts +21 -0
  105. package/index.def.js +1086 -0
  106. package/index.js +19 -8
  107. package/package.json +59 -9
  108. package/readme.md +294 -90
  109. package/rollup.config.js +52 -3
  110. package/router.d.ts +7 -0
  111. package/router.js +0 -0
  112. package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
  113. package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
  114. package/src/components/$traits/has-draggable/has-draggable.css +8 -0
  115. package/src/components/$traits/has-items/HasItems.d.ts +9 -0
  116. package/src/components/$traits/has-items/HasItems.js +64 -0
  117. package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
  118. package/src/components/$traits/has-position/HasFullPosition.js +95 -0
  119. package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
  120. package/src/components/$traits/has-position/HasPosition.js +45 -0
  121. package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
  122. package/src/components/$traits/has-resizable/HasResizable.js +122 -0
  123. package/src/components/$traits/has-resizable/has-resizable.css +121 -0
  124. package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
  125. package/src/components/$traits/has-validation/HasValidation.js +133 -0
  126. package/src/components/BaseComponent.d.ts +32 -0
  127. package/src/components/BaseComponent.js +247 -0
  128. package/src/components/accordion/Accordion.js +268 -0
  129. package/src/components/accordion/AccordionItem.js +233 -0
  130. package/src/components/accordion/index.js +7 -0
  131. package/src/components/accordion/types/Accordion.d.ts +47 -0
  132. package/src/components/accordion/types/AccordionItem.d.ts +48 -0
  133. package/src/components/alert/Alert.js +350 -0
  134. package/src/components/alert/index.js +6 -0
  135. package/src/components/alert/types/Alert.d.ts +62 -0
  136. package/src/components/avatar/Avatar.js +430 -0
  137. package/src/components/avatar/AvatarGroup.js +97 -0
  138. package/src/components/avatar/index.js +7 -0
  139. package/src/components/avatar/types/Avatar.d.ts +74 -0
  140. package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
  141. package/src/components/badge/Badge.js +245 -0
  142. package/src/components/badge/index.js +6 -0
  143. package/src/components/badge/types/Badge.d.ts +51 -0
  144. package/src/components/base-component.css +0 -0
  145. package/src/components/breadcrumb/BreadCrumb.js +138 -0
  146. package/src/components/breadcrumb/index.js +5 -0
  147. package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
  148. package/src/components/button/Button.js +320 -0
  149. package/src/components/button/index.js +5 -0
  150. package/src/components/button/types/Button.d.ts +62 -0
  151. package/src/components/card/Card.js +282 -0
  152. package/src/components/card/index.js +5 -0
  153. package/src/components/card/types/Card.d.ts +42 -0
  154. package/src/components/context-menu/ContextMenu.js +127 -0
  155. package/src/components/context-menu/ContextMenuGroup.js +29 -0
  156. package/src/components/context-menu/ContextMenuItem.js +28 -0
  157. package/src/components/context-menu/index.js +10 -0
  158. package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
  159. package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
  160. package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
  161. package/src/components/divider/Divider.js +256 -0
  162. package/src/components/divider/index.js +6 -0
  163. package/src/components/divider/types/Divider.d.ts +55 -0
  164. package/src/components/dropdown/Dropdown.js +531 -0
  165. package/src/components/dropdown/DropdownDivider.js +45 -0
  166. package/src/components/dropdown/DropdownGroup.js +83 -0
  167. package/src/components/dropdown/DropdownItem.js +150 -0
  168. package/src/components/dropdown/DropdownTrigger.js +93 -0
  169. package/src/components/dropdown/helpers.js +53 -0
  170. package/src/components/dropdown/index.js +13 -0
  171. package/src/components/dropdown/types/Dropdown.d.ts +88 -0
  172. package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
  173. package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
  174. package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
  175. package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
  176. package/src/components/form/FormControl.js +498 -0
  177. package/src/components/form/field/Field.js +419 -0
  178. package/src/components/form/field/FieldCollection.js +292 -0
  179. package/src/components/form/field/types/AutocompleteField.js +168 -0
  180. package/src/components/form/field/types/CheckboxField.js +77 -0
  181. package/src/components/form/field/types/CheckboxGroupField.js +171 -0
  182. package/src/components/form/field/types/ColorField.js +102 -0
  183. package/src/components/form/field/types/DateField.js +315 -0
  184. package/src/components/form/field/types/EmailField.js +104 -0
  185. package/src/components/form/field/types/FileField.js +276 -0
  186. package/src/components/form/field/types/HiddenField.js +44 -0
  187. package/src/components/form/field/types/ImageField.js +138 -0
  188. package/src/components/form/field/types/NumberField.js +177 -0
  189. package/src/components/form/field/types/PasswordField.js +200 -0
  190. package/src/components/form/field/types/RadioField.js +145 -0
  191. package/src/components/form/field/types/RangeField.js +117 -0
  192. package/src/components/form/field/types/SearchField.js +66 -0
  193. package/src/components/form/field/types/SelectField.js +247 -0
  194. package/src/components/form/field/types/StringField.js +148 -0
  195. package/src/components/form/field/types/TelField.js +98 -0
  196. package/src/components/form/field/types/TextAreaField.js +142 -0
  197. package/src/components/form/field/types/TimeField.js +215 -0
  198. package/src/components/form/field/types/UrlField.js +115 -0
  199. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
  200. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
  201. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
  202. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
  203. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
  204. package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
  205. package/src/components/form/index.js +61 -0
  206. package/src/components/form/merge +0 -0
  207. package/src/components/form/types/Field.d.ts +73 -0
  208. package/src/components/form/types/FieldCollection.d.ts +53 -0
  209. package/src/components/form/types/FormControl.d.ts +64 -0
  210. package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
  211. package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
  212. package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
  213. package/src/components/form/types/fields/ColorField.d.ts +37 -0
  214. package/src/components/form/types/fields/DateField.d.ts +70 -0
  215. package/src/components/form/types/fields/EmailField.d.ts +35 -0
  216. package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
  217. package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
  218. package/src/components/form/types/fields/FileField.d.ts +56 -0
  219. package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
  220. package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
  221. package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
  222. package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
  223. package/src/components/form/types/fields/HiddenField.d.ts +26 -0
  224. package/src/components/form/types/fields/ImageField.d.ts +45 -0
  225. package/src/components/form/types/fields/NumberField.d.ts +48 -0
  226. package/src/components/form/types/fields/PasswordField.d.ts +46 -0
  227. package/src/components/form/types/fields/RadioField.d.ts +48 -0
  228. package/src/components/form/types/fields/RangeField.d.ts +44 -0
  229. package/src/components/form/types/fields/SearchField.d.ts +34 -0
  230. package/src/components/form/types/fields/SelectField.d.ts +71 -0
  231. package/src/components/form/types/fields/StringField.d.ts +48 -0
  232. package/src/components/form/types/fields/TelField.d.ts +37 -0
  233. package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
  234. package/src/components/form/types/fields/TimeField.d.ts +51 -0
  235. package/src/components/form/types/fields/UrlField.d.ts +35 -0
  236. package/src/components/form/utils.js +17 -0
  237. package/src/components/form/validation/Validation.js +565 -0
  238. package/src/components/index.d.ts +160 -0
  239. package/src/components/list/HasListItem.js +171 -0
  240. package/src/components/list/List.js +125 -0
  241. package/src/components/list/ListDivider.js +39 -0
  242. package/src/components/list/ListGroup.js +135 -0
  243. package/src/components/list/ListItem.js +212 -0
  244. package/src/components/list/index.js +12 -0
  245. package/src/components/list/types/List.d.ts +43 -0
  246. package/src/components/list/types/ListGroup.d.ts +37 -0
  247. package/src/components/list/types/ListItem.d.ts +53 -0
  248. package/src/components/menu/HasMenuItem.js +182 -0
  249. package/src/components/menu/Menu.js +227 -0
  250. package/src/components/menu/MenuDivider.js +37 -0
  251. package/src/components/menu/MenuGroup.js +126 -0
  252. package/src/components/menu/MenuItem.js +190 -0
  253. package/src/components/menu/MenuLink.js +51 -0
  254. package/src/components/menu/index.js +14 -0
  255. package/src/components/menu/types/Menu.d.ts +60 -0
  256. package/src/components/menu/types/MenuDivider.d.ts +19 -0
  257. package/src/components/menu/types/MenuGroup.d.ts +44 -0
  258. package/src/components/menu/types/MenuItem.d.ts +46 -0
  259. package/src/components/menu/types/MenuLink.d.ts +16 -0
  260. package/src/components/modal/Modal.js +524 -0
  261. package/src/components/modal/index.js +5 -0
  262. package/src/components/modal/types/Modal.d.ts +94 -0
  263. package/src/components/pagination/Pagination.js +411 -0
  264. package/src/components/pagination/index.js +5 -0
  265. package/src/components/pagination/types/Pagination.d.ts +68 -0
  266. package/src/components/popover/Popover.js +459 -0
  267. package/src/components/popover/PopoverFooter.js +61 -0
  268. package/src/components/popover/PopoverHeader.js +68 -0
  269. package/src/components/popover/index.js +10 -0
  270. package/src/components/popover/types/Popover.d.ts +83 -0
  271. package/src/components/popover/types/PopoverFooter.d.ts +24 -0
  272. package/src/components/popover/types/PopoverHeader.d.ts +26 -0
  273. package/src/components/progress/Progress.js +401 -0
  274. package/src/components/progress/index.js +6 -0
  275. package/src/components/progress/types/Progress.d.ts +77 -0
  276. package/src/components/skeleton/Skeleton.js +228 -0
  277. package/src/components/skeleton/index.js +6 -0
  278. package/src/components/skeleton/types/Skeleton.d.ts +55 -0
  279. package/src/components/slider/Slider.js +406 -0
  280. package/src/components/slider/index.js +5 -0
  281. package/src/components/slider/types/Slider.d.ts +82 -0
  282. package/src/components/spacer/Spacer.js +27 -0
  283. package/src/components/spacer/index.js +5 -0
  284. package/src/components/spacer/types/Spacer.d.ts +19 -0
  285. package/src/components/spinner/Spinner.js +350 -0
  286. package/src/components/spinner/index.js +5 -0
  287. package/src/components/spinner/types/Spinner.d.ts +71 -0
  288. package/src/components/splitter/Splitter.js +164 -0
  289. package/src/components/splitter/SplitterGutter.js +140 -0
  290. package/src/components/splitter/SplitterPanel.js +143 -0
  291. package/src/components/splitter/index.js +10 -0
  292. package/src/components/splitter/types/Splitter.d.ts +38 -0
  293. package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
  294. package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
  295. package/src/components/stacks/AbsoluteStack.js +53 -0
  296. package/src/components/stacks/FixedStack.js +53 -0
  297. package/src/components/stacks/HStack.js +54 -0
  298. package/src/components/stacks/PositionStack.js +254 -0
  299. package/src/components/stacks/RelativeStack.js +53 -0
  300. package/src/components/stacks/Stack.js +166 -0
  301. package/src/components/stacks/VStack.js +55 -0
  302. package/src/components/stacks/index.js +21 -0
  303. package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
  304. package/src/components/stacks/types/FixedStack.d.ts +16 -0
  305. package/src/components/stacks/types/HStack.d.ts +16 -0
  306. package/src/components/stacks/types/PositionStack.d.ts +54 -0
  307. package/src/components/stacks/types/RelativeStack.d.ts +17 -0
  308. package/src/components/stacks/types/Stack.d.ts +39 -0
  309. package/src/components/stacks/types/VStack.d.ts +16 -0
  310. package/src/components/stepper/Stepper.js +461 -0
  311. package/src/components/stepper/StepperStep.js +241 -0
  312. package/src/components/stepper/index.js +8 -0
  313. package/src/components/stepper/types/Stepper.d.ts +68 -0
  314. package/src/components/stepper/types/StepperStep.d.ts +54 -0
  315. package/src/components/switch/Switch.js +266 -0
  316. package/src/components/switch/index.js +6 -0
  317. package/src/components/switch/types/Switch.d.ts +55 -0
  318. package/src/components/table/Column.js +212 -0
  319. package/src/components/table/ColumnGroup.js +90 -0
  320. package/src/components/table/DataTable.js +720 -0
  321. package/src/components/table/SimpleTable.js +139 -0
  322. package/src/components/table/index.js +7 -0
  323. package/src/components/table/types/Column.d.ts +49 -0
  324. package/src/components/table/types/ColumnGroup.d.ts +28 -0
  325. package/src/components/table/types/DataTable.d.ts +97 -0
  326. package/src/components/table/types/SimpleTable.d.ts +40 -0
  327. package/src/components/tabs/Tabs.js +395 -0
  328. package/src/components/tabs/index.js +6 -0
  329. package/src/components/tabs/types/Tabs.d.ts +78 -0
  330. package/src/components/toast/Toast.js +262 -0
  331. package/src/components/toast/ToastError.js +0 -0
  332. package/src/components/toast/ToastInfo.js +0 -0
  333. package/src/components/toast/ToastSuccess.js +0 -0
  334. package/src/components/toast/ToastWarning.js +0 -0
  335. package/src/components/toast/index.js +5 -0
  336. package/src/components/toast/types/Toast.d.ts +57 -0
  337. package/src/components/toast/types/ToastError.d.ts +7 -0
  338. package/src/components/toast/types/ToastInfo.d.ts +7 -0
  339. package/src/components/toast/types/ToastSuccess.d.ts +7 -0
  340. package/src/components/toast/types/ToastWarning.d.ts +7 -0
  341. package/src/components/tooltip/Tooltip.js +359 -0
  342. package/src/components/tooltip/index.js +5 -0
  343. package/src/components/tooltip/prototypes.js +6 -0
  344. package/src/components/tooltip/types/Tooltip.d.ts +65 -0
  345. package/src/{data → core/data}/MemoryManager.js +9 -22
  346. package/src/core/data/Observable.js +227 -0
  347. package/src/core/data/ObservableArray.js +522 -0
  348. package/src/core/data/ObservableChecker.js +39 -0
  349. package/src/core/data/ObservableItem.js +611 -0
  350. package/src/core/data/ObservableObject.js +274 -0
  351. package/src/core/data/ObservableResource.js +315 -0
  352. package/src/core/data/ObservableWhen.js +54 -0
  353. package/src/core/data/Store.js +520 -0
  354. package/src/core/data/observable-helpers/observable.is-to.js +390 -0
  355. package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
  356. package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
  357. package/src/core/elements/anchor/anchor.js +210 -0
  358. package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
  359. package/src/core/elements/content-formatter.js +169 -0
  360. package/src/core/elements/control/for-each-array.js +292 -0
  361. package/src/core/elements/control/for-each.js +170 -0
  362. package/src/core/elements/control/show-if.js +94 -0
  363. package/src/core/elements/control/show-when.js +54 -0
  364. package/src/core/elements/control/switch.js +141 -0
  365. package/src/core/elements/description-list.js +19 -0
  366. package/src/core/elements/form.js +255 -0
  367. package/src/core/elements/fragment.js +8 -0
  368. package/src/core/elements/html5-semantics.js +55 -0
  369. package/src/core/elements/img.js +59 -0
  370. package/src/{elements → core/elements}/index.js +5 -4
  371. package/src/core/elements/interactive.js +25 -0
  372. package/src/core/elements/list.js +37 -0
  373. package/src/core/elements/medias.js +37 -0
  374. package/src/core/elements/meta-data.js +43 -0
  375. package/src/core/elements/svg.js +61 -0
  376. package/src/core/elements/table.js +73 -0
  377. package/src/{errors → core/errors}/ArgTypesError.js +1 -1
  378. package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
  379. package/src/core/utils/HasEventEmitter.js +85 -0
  380. package/src/core/utils/args-types.js +140 -0
  381. package/src/core/utils/cache.js +5 -0
  382. package/src/core/utils/callback-handler.js +50 -0
  383. package/src/core/utils/debug-manager.js +40 -0
  384. package/src/core/utils/events.js +148 -0
  385. package/src/core/utils/filters/date.js +178 -0
  386. package/src/core/utils/filters/index.js +4 -0
  387. package/src/core/utils/filters/standard.js +263 -0
  388. package/src/core/utils/filters/strings.js +67 -0
  389. package/src/core/utils/filters/utils.js +77 -0
  390. package/src/core/utils/formatters.js +90 -0
  391. package/src/core/utils/helpers.js +144 -0
  392. package/src/core/utils/localstorage.js +57 -0
  393. package/src/core/utils/memoize.js +115 -0
  394. package/src/core/utils/plugins-manager.js +81 -0
  395. package/src/core/utils/property-accumulator.js +72 -0
  396. package/src/core/utils/prototypes.js +44 -0
  397. package/src/core/utils/shortcut-manager.js +242 -0
  398. package/src/{utils → core/utils}/validator.js +58 -22
  399. package/src/core/wrappers/AttributesWrapper.js +181 -0
  400. package/src/core/wrappers/DocumentObserver.js +182 -0
  401. package/src/core/wrappers/ElementCreator.js +110 -0
  402. package/src/core/wrappers/HtmlElementWrapper.js +98 -0
  403. package/src/core/wrappers/NDElement.js +613 -0
  404. package/src/core/wrappers/NdPrototype.js +233 -0
  405. package/src/core/wrappers/SingletonView.js +99 -0
  406. package/src/core/wrappers/SvgElementWrapper.js +15 -0
  407. package/src/core/wrappers/TemplateBinding.js +7 -0
  408. package/src/core/wrappers/constants.js +66 -0
  409. package/src/core/wrappers/prototypes/attributes-extensions.js +24 -0
  410. package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
  411. package/src/core/wrappers/prototypes/nd-element-extensions.js +149 -0
  412. package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
  413. package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
  414. package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
  415. package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
  416. package/src/core/wrappers/template-cloner/utils.js +173 -0
  417. package/src/fetch/NativeFetch.js +89 -0
  418. package/src/i18n/bin/scan.js +132 -0
  419. package/src/i18n/index.d.ts +2 -0
  420. package/src/i18n/service/I18nService.d.ts +27 -0
  421. package/src/i18n/service/I18nService.js +46 -0
  422. package/src/i18n/service/functions.d.ts +22 -0
  423. package/src/i18n/service/functions.js +29 -0
  424. package/src/router/Route.js +33 -8
  425. package/src/router/RouteGroupHelper.js +10 -2
  426. package/src/router/Router.js +63 -22
  427. package/src/router/RouterComponent.js +114 -6
  428. package/src/{errors → router/errors}/RouterError.js +0 -1
  429. package/src/router/link.js +9 -10
  430. package/src/router/modes/HashRouter.js +2 -2
  431. package/src/router/modes/HistoryRouter.js +2 -3
  432. package/src/router/modes/MemoryRouter.js +1 -1
  433. package/src/ui/components/accordion/AccordionItemRender.js +63 -0
  434. package/src/ui/components/accordion/AccordionRender.js +35 -0
  435. package/src/ui/components/accordion/accordion.css +121 -0
  436. package/src/ui/components/alert/AlertRender.js +81 -0
  437. package/src/ui/components/alert/alert.css +163 -0
  438. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
  439. package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
  440. package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
  441. package/src/ui/components/avatar/avatar/avatar.css +189 -0
  442. package/src/ui/components/badge/BadgeRender.js +25 -0
  443. package/src/ui/components/badge/badge.css +168 -0
  444. package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
  445. package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
  446. package/src/ui/components/button/ButtonRender.js +65 -0
  447. package/src/ui/components/button/button.css +296 -0
  448. package/src/ui/components/card/CardRender.js +133 -0
  449. package/src/ui/components/card/card.css +169 -0
  450. package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
  451. package/src/ui/components/contextmenu/contextmenu.css +36 -0
  452. package/src/ui/components/divider/DividerRender.js +70 -0
  453. package/src/ui/components/divider/divider.css +70 -0
  454. package/src/ui/components/dropdown/DropdownRender.js +92 -0
  455. package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
  456. package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
  457. package/src/ui/components/dropdown/dropdown.css +179 -0
  458. package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
  459. package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
  460. package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
  461. package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
  462. package/src/ui/components/form/FieldCollectionRender.js +110 -0
  463. package/src/ui/components/form/FormControlRender.js +85 -0
  464. package/src/ui/components/form/field-collection.css +55 -0
  465. package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
  466. package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
  467. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
  468. package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
  469. package/src/ui/components/form/fields/DateFieldRender.js +155 -0
  470. package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
  471. package/src/ui/components/form/fields/FieldRender.js +118 -0
  472. package/src/ui/components/form/fields/FileFieldRender.js +41 -0
  473. package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
  474. package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
  475. package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
  476. package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
  477. package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
  478. package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
  479. package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
  480. package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
  481. package/src/ui/components/form/fields/StringFieldRender.js +6 -0
  482. package/src/ui/components/form/fields/TelFieldRender.js +6 -0
  483. package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
  484. package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
  485. package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
  486. package/src/ui/components/form/fields/date-field.css +32 -0
  487. package/src/ui/components/form/fields/field.css +402 -0
  488. package/src/ui/components/form/fields/file-field.css +79 -0
  489. package/src/ui/components/form/fields/password-field.css +50 -0
  490. package/src/ui/components/form/fields/range-field.css +120 -0
  491. package/src/ui/components/form/fields/slider.css +195 -0
  492. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
  493. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
  494. package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
  495. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
  496. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
  497. package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
  498. package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
  499. package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
  500. package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
  501. package/src/ui/components/form/form-control.css +40 -0
  502. package/src/ui/components/form/helpers.js +111 -0
  503. package/src/ui/components/form/index.js +27 -0
  504. package/src/ui/components/list/ListRender.js +18 -0
  505. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  506. package/src/ui/components/list/divider/list-divider.css +12 -0
  507. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  508. package/src/ui/components/list/group/list-group.css +62 -0
  509. package/src/ui/components/list/item/ListItemRender.js +238 -0
  510. package/src/ui/components/list/item/list-item.css +191 -0
  511. package/src/ui/components/list/list.css +24 -0
  512. package/src/ui/components/menu/MenuDividerRender.js +12 -0
  513. package/src/ui/components/menu/MenuGroupRender.js +59 -0
  514. package/src/ui/components/menu/MenuItemRender.js +57 -0
  515. package/src/ui/components/menu/MenuLinkRender.js +55 -0
  516. package/src/ui/components/menu/MenuRender.js +22 -0
  517. package/src/ui/components/menu/helpers.js +121 -0
  518. package/src/ui/components/menu/menu.css +308 -0
  519. package/src/ui/components/modal/ModalRender.js +118 -0
  520. package/src/ui/components/modal/modal.css +156 -0
  521. package/src/ui/components/pagination/PaginationRender.js +112 -0
  522. package/src/ui/components/pagination/pagination.css +63 -0
  523. package/src/ui/components/popover/PopoverRender.js +233 -0
  524. package/src/ui/components/popover/popover.css +139 -0
  525. package/src/ui/components/progress/ProgressRender.js +168 -0
  526. package/src/ui/components/progress/progress.css +197 -0
  527. package/src/ui/components/skeleton/SkeletonRender.js +136 -0
  528. package/src/ui/components/skeleton/skeleton.css +154 -0
  529. package/src/ui/components/spacer/SpacerRender.js +10 -0
  530. package/src/ui/components/spinner/SpinnerRender.js +47 -0
  531. package/src/ui/components/spinner/spinner.css +152 -0
  532. package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
  533. package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
  534. package/src/ui/components/splitter/SplitterRender.js +75 -0
  535. package/src/ui/components/splitter/splitter.css +128 -0
  536. package/src/ui/components/stacks/PositionStackRender.js +39 -0
  537. package/src/ui/components/stacks/StackRender.js +41 -0
  538. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
  539. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
  540. package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
  541. package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
  542. package/src/ui/components/stacks/index.js +5 -0
  543. package/src/ui/components/stacks/position-stack.css +62 -0
  544. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
  545. package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
  546. package/src/ui/components/stacks/stack.css +78 -0
  547. package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
  548. package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
  549. package/src/ui/components/stepper/StepperRender.js +71 -0
  550. package/src/ui/components/stepper/StepperStepRender.js +67 -0
  551. package/src/ui/components/stepper/stepper.css +359 -0
  552. package/src/ui/components/switch/SwitchRender.js +83 -0
  553. package/src/ui/components/switch/switch.css +143 -0
  554. package/src/ui/components/table/data-table/DataTableRender.js +50 -0
  555. package/src/ui/components/table/data-table/bulk-actions.js +34 -0
  556. package/src/ui/components/table/data-table/data-table.css +246 -0
  557. package/src/ui/components/table/data-table/pagination.js +56 -0
  558. package/src/ui/components/table/data-table/tables.js +368 -0
  559. package/src/ui/components/table/data-table/toolbar.js +67 -0
  560. package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
  561. package/src/ui/components/table/simple-table/simple-table.css +50 -0
  562. package/src/ui/components/tabs/TabsRender.js +226 -0
  563. package/src/ui/components/tabs/tabs.css +253 -0
  564. package/src/ui/components/toast/ToastRender.js +99 -0
  565. package/src/ui/components/toast/toast.css +201 -0
  566. package/src/ui/components/tooltip/TooltipRender.js +8 -0
  567. package/src/ui/components/tooltip/tooltip.css +113 -0
  568. package/src/ui/index.js +47 -0
  569. package/src/ui/theme.js +0 -0
  570. package/src/ui/theme.scss +1 -0
  571. package/src/ui/tokens/animation.scss +36 -0
  572. package/src/ui/tokens/colors-dark.scss +58 -0
  573. package/src/ui/tokens/colors.scss +54 -0
  574. package/src/ui/tokens/components.scss +32 -0
  575. package/src/ui/tokens/fonts.scss +57 -0
  576. package/src/ui/tokens/glass.scss +10 -0
  577. package/src/ui/tokens/index.scss +38 -0
  578. package/src/ui/tokens/layouts.scss +228 -0
  579. package/src/ui/tokens/opacity.scss +21 -0
  580. package/src/ui/tokens/others.scss +11 -0
  581. package/src/ui/tokens/radius.scss +6 -0
  582. package/src/ui/tokens/reset.scss +51 -0
  583. package/src/ui/tokens/shadows.scss +29 -0
  584. package/src/ui/tokens/spacings.scss +13 -0
  585. package/src/ui/tokens/vars.scss +35 -0
  586. package/src/ui/tokens/viewports.scss +30 -0
  587. package/types/args-types.d.ts +58 -0
  588. package/types/control-flow.d.ts +62 -0
  589. package/types/elements.d.ts +231 -0
  590. package/types/filters/dates.d.ts +43 -0
  591. package/types/filters/index.d.ts +4 -0
  592. package/types/filters/standard.d.ts +70 -0
  593. package/types/filters/strings.d.ts +21 -0
  594. package/types/filters/types.d.ts +20 -0
  595. package/types/forms.d.ts +84 -0
  596. package/types/globals.d.ts +543 -0
  597. package/types/images.d.ts +23 -0
  598. package/types/localStorage.ts +102 -0
  599. package/types/memoize.d.ts +26 -0
  600. package/types/native-fetch.d.ts +72 -0
  601. package/types/nd-element.d.ts +407 -0
  602. package/types/observable-resource.d.ts +3 -0
  603. package/types/observable.d.ts +227 -0
  604. package/types/plugins-manager.d.ts +65 -0
  605. package/types/polyfill.d.ts +18 -0
  606. package/types/property-accumulator.d.ts +33 -0
  607. package/types/router.d.ts +85 -0
  608. package/types/service.d.ts +23 -0
  609. package/types/singleton.d.ts +19 -0
  610. package/types/store.d.ts +63 -0
  611. package/types/template-cloner.ts +43 -0
  612. package/types/validator.ts +66 -0
  613. package/ui.js +1 -0
  614. package/utils.d.ts +4 -0
  615. package/utils.js +12 -0
  616. package/src/data/Observable.js +0 -233
  617. package/src/data/ObservableChecker.js +0 -38
  618. package/src/data/ObservableItem.js +0 -116
  619. package/src/data/Store.js +0 -74
  620. package/src/elements/anchor.js +0 -84
  621. package/src/elements/content-formatter.js +0 -32
  622. package/src/elements/control/for-each.js +0 -174
  623. package/src/elements/control/show-if.js +0 -79
  624. package/src/elements/control/switch.js +0 -98
  625. package/src/elements/description-list.js +0 -5
  626. package/src/elements/form.js +0 -71
  627. package/src/elements/html5-semantics.js +0 -12
  628. package/src/elements/img.js +0 -45
  629. package/src/elements/interactive.js +0 -7
  630. package/src/elements/list.js +0 -6
  631. package/src/elements/medias.js +0 -8
  632. package/src/elements/meta-data.js +0 -9
  633. package/src/elements/table.js +0 -14
  634. package/src/utils/args-types.js +0 -100
  635. package/src/utils/debug-manager.js +0 -31
  636. package/src/utils/helpers.js +0 -37
  637. package/src/utils/plugins-manager.js +0 -12
  638. package/src/utils/prototypes.js +0 -45
  639. package/src/wrappers/AttributesWrapper.js +0 -157
  640. package/src/wrappers/DocumentObserver.js +0 -51
  641. package/src/wrappers/HtmlElementEventsWrapper.js +0 -77
  642. package/src/wrappers/HtmlElementWrapper.js +0 -206
  643. package/src/wrappers/constants.js +0 -2
@@ -0,0 +1,178 @@
1
+ import {createFilter, createMultiSourceFilter, getSecondsOfDay, isSameDay, toDate} from './utils';
2
+
3
+ /**
4
+ * Creates a filter that passes when the date value is on the same day as the target date.
5
+ * Accepts Date objects, timestamps, or ISO strings.
6
+ *
7
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target date to compare against
8
+ * @returns {FilterResult}
9
+ * @example
10
+ * const today = new Date();
11
+ * events.where({ date: dateEquals(today) });
12
+ */
13
+ export const dateEquals = (observableOrValue) => {
14
+ return createFilter(observableOrValue, (value, target) => {
15
+ if (!value || !target) return false;
16
+ return isSameDay(value, target);
17
+ });
18
+ };
19
+
20
+ /**
21
+ * Creates a filter that passes when the date value is strictly before the target date (day comparison).
22
+ *
23
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target date
24
+ * @returns {FilterResult}
25
+ */
26
+ export const dateBefore = (observableOrValue) => {
27
+ return createFilter(observableOrValue, (value, target) => {
28
+ if (!value || !target) return false;
29
+ return toDate(value) < toDate(target);
30
+ });
31
+ };
32
+
33
+ /**
34
+ * Creates a filter that passes when the date value is strictly after the target date (day comparison).
35
+ *
36
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target date
37
+ * @returns {FilterResult}
38
+ */
39
+ export const dateAfter = (observableOrValue) => {
40
+ return createFilter(observableOrValue, (value, target) => {
41
+ if (!value || !target) return false;
42
+ return toDate(value) > toDate(target);
43
+ });
44
+ };
45
+
46
+ /**
47
+ * Creates a filter that passes when the date value falls within the given date range (inclusive, day comparison).
48
+ *
49
+ * @param {Date|number|string|ObservableItem} startObservableOrValue - Start of the range
50
+ * @param {Date|number|string|ObservableItem} endObservableOrValue - End of the range
51
+ * @returns {FilterResult}
52
+ * @example
53
+ * events.where({ date: dateBetween(startDate, endDate) });
54
+ */
55
+ export const dateBetween = (startObservableOrValue, endObservableOrValue) => {
56
+ return createMultiSourceFilter(
57
+ [startObservableOrValue, endObservableOrValue],
58
+ (value, [start, end]) => {
59
+ if (!value || !start || !end) return false;
60
+ const date = toDate(value);
61
+ return date >= toDate(start) && date <= toDate(end);
62
+ },
63
+ );
64
+ };
65
+
66
+ /**
67
+ * Creates a filter that passes when the time component (HH:MM:SS) equals the target time.
68
+ *
69
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target time
70
+ * @returns {FilterResult}
71
+ */
72
+ export const timeEquals = (observableOrValue) => {
73
+ return createFilter(observableOrValue, (value, target) => {
74
+ if (!value || !target) return false;
75
+ const d1 = toDate(value);
76
+ const d2 = toDate(target);
77
+ return d1.getHours() === d2.getHours() &&
78
+ d1.getMinutes() === d2.getMinutes() &&
79
+ d1.getSeconds() === d2.getSeconds();
80
+ });
81
+ };
82
+
83
+ /**
84
+ * Creates a filter that passes when the time component is strictly after the target time.
85
+ *
86
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target time
87
+ * @returns {FilterResult}
88
+ */
89
+ export const timeAfter = (observableOrValue) => {
90
+ return createFilter(observableOrValue, (value, target) => {
91
+ if (!value || !target) return false;
92
+ return getSecondsOfDay(value) > getSecondsOfDay(target);
93
+ });
94
+ };
95
+
96
+ /**
97
+ * Creates a filter that passes when the time component is strictly before the target time.
98
+ *
99
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target time
100
+ * @returns {FilterResult}
101
+ */
102
+ export const timeBefore = (observableOrValue) => {
103
+ return createFilter(observableOrValue, (value, target) => {
104
+ if (!value || !target) return false;
105
+ return getSecondsOfDay(value) < getSecondsOfDay(target);
106
+ });
107
+ };
108
+
109
+ /**
110
+ * Creates a filter that passes when the time component falls within the given time range (inclusive).
111
+ *
112
+ * @param {Date|number|string|ObservableItem} startObservableOrValue - Start time
113
+ * @param {Date|number|string|ObservableItem} endObservableOrValue - End time
114
+ * @returns {FilterResult}
115
+ */
116
+ export const timeBetween = (startObservableOrValue, endObservableOrValue) => {
117
+ return createMultiSourceFilter([startObservableOrValue, endObservableOrValue],
118
+ (value, [start, end]) => {
119
+ if (!value || !start || !end) return false;
120
+ const date = getSecondsOfDay(value);
121
+ return date >= getSecondsOfDay(start) && date <= getSecondsOfDay(end);
122
+ },
123
+ );
124
+ };
125
+
126
+ /**
127
+ * Creates a filter that passes when the full datetime (date + time) equals the target exactly.
128
+ *
129
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target datetime
130
+ * @returns {FilterResult}
131
+ */
132
+ export const dateTimeEquals = (observableOrValue) => {
133
+ return createFilter(observableOrValue, (value, target) => {
134
+ if (!value || !target) return false;
135
+ return toDate(value).getTime() === toDate(target).getTime();
136
+ });
137
+ };
138
+
139
+ /**
140
+ * Creates a filter that passes when the full datetime is strictly after the target.
141
+ *
142
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target datetime
143
+ * @returns {FilterResult}
144
+ */
145
+ export const dateTimeAfter = (observableOrValue) => {
146
+ return createFilter(observableOrValue, (value, target) => {
147
+ if (!value || !target) return false;
148
+ return toDate(value) > toDate(target);
149
+ });
150
+ };
151
+
152
+ /**
153
+ * Creates a filter that passes when the full datetime is strictly before the target.
154
+ *
155
+ * @param {Date|number|string|ObservableItem} observableOrValue - Target datetime
156
+ * @returns {FilterResult}
157
+ */
158
+ export const dateTimeBefore = (observableOrValue) => {
159
+ return createFilter(observableOrValue, (value, target) => {
160
+ if (!value || !target) return false;
161
+ return toDate(value) < toDate(target);
162
+ });
163
+ };
164
+
165
+ /**
166
+ * Creates a filter that passes when the full datetime falls within the given range (inclusive).
167
+ *
168
+ * @param {Date|number|string|ObservableItem} startObservableOrValue - Start of the range
169
+ * @param {Date|number|string|ObservableItem} endObservableOrValue - End of the range
170
+ * @returns {FilterResult}
171
+ */
172
+ export const dateTimeBetween = (startObservableOrValue, endObservableOrValue) => {
173
+ return createMultiSourceFilter([startObservableOrValue, endObservableOrValue], (value, [start, end]) => {
174
+ if (!value || !start || !end) return false;
175
+ const date = toDate(value);
176
+ return date >= toDate(start) && date <= toDate(end);
177
+ });
178
+ };
@@ -0,0 +1,4 @@
1
+ export * from './utils';
2
+ export * from './standard';
3
+ export * from './date';
4
+ export * from './strings';
@@ -0,0 +1,263 @@
1
+ import Validator from '../../utils/validator';
2
+ import { createFilter, createMultiSourceFilter } from './utils';
3
+ import DebugManager from '../debug-manager';
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
+ */
14
+ export function equals(observableOrValue){
15
+ return createFilter(observableOrValue, (value, target) => value === target);
16
+ }
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
+ */
24
+ export function notEquals(observableOrValue){
25
+ return createFilter(observableOrValue, (value, target) => value !== target);
26
+ }
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
+ */
34
+ export function greaterThan(observableOrValue){
35
+ return createFilter(observableOrValue, (value, target) => value > target);
36
+ }
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
+ */
44
+ export function greaterThanOrEqual(observableOrValue){
45
+ return createFilter(observableOrValue, (value, target) => value >= target);
46
+ }
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
+ */
54
+ export function lessThan(observableOrValue){
55
+ return createFilter(observableOrValue, (value, target) => value < target);
56
+ }
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
+ */
64
+ export function lessThanOrEqual(observableOrValue){
65
+ return createFilter(observableOrValue, (value, target) => value <= target);
66
+ }
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
+ */
78
+ export function between(minObservableOrValue, maxObservableOrValue){
79
+ return createMultiSourceFilter(
80
+ [minObservableOrValue, maxObservableOrValue],
81
+ (value, [min, max]) => value >= min && value <= max,
82
+ );
83
+ }
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
+ */
93
+ export function inArray(observableOrArray){
94
+ return createFilter(observableOrArray, (value, arr) => arr.includes(value));
95
+ }
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
+ */
103
+ export function notIn(observableOrArray){
104
+ return createFilter(observableOrArray, (value, arr) => !arr.includes(value));
105
+ }
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
+ */
114
+ export function isEmpty(observableOrValue = true){
115
+ return createFilter(observableOrValue, (value, shouldBeEmpty) => {
116
+ const isActuallyEmpty = !value || value === '' ||
117
+ (Array.isArray(value) && value.length === 0);
118
+
119
+ return shouldBeEmpty ? isActuallyEmpty : !isActuallyEmpty;
120
+ });
121
+ }
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
+ */
130
+ export function isNotEmpty(observableOrValue = true){
131
+ return createFilter(observableOrValue, (value, shouldBeNotEmpty) => {
132
+ const isActuallyNotEmpty = !!value && value !== '' &&
133
+ (!Array.isArray(value) || value.length > 0);
134
+
135
+ return shouldBeNotEmpty ? isActuallyNotEmpty : !isActuallyNotEmpty;
136
+ });
137
+ }
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
+ */
151
+ export function match(patternObservableOrValue, asRegexObservableOrValue = true, flagsObservableOrValue = ''){
152
+ return createMultiSourceFilter(
153
+ [patternObservableOrValue, asRegexObservableOrValue, flagsObservableOrValue],
154
+ (value, [pattern, asRegex, flags]) => {
155
+ if (!pattern) return true;
156
+
157
+ if (asRegex){
158
+ try {
159
+ const regex = new RegExp(pattern, flags);
160
+ return regex.test(String(value));
161
+ } catch (error){
162
+ DebugManager.warn('Invalid regex pattern:', pattern, error);
163
+ return false;
164
+ }
165
+ }
166
+
167
+ if (!flags || flags === ''){
168
+ return String(value).toLowerCase().includes(String(pattern).toLowerCase());
169
+ }
170
+ return String(value).includes(String(pattern));
171
+ },
172
+ );
173
+ }
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
+ */
184
+ export function and(...filters){
185
+ const dependencies = filters
186
+ .flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
187
+ .filter(Validator.isObservable);
188
+
189
+ return {
190
+ dependencies: dependencies.length > 0 ? dependencies : null,
191
+ callback: (value) => filters.every(f => f.callback(value)),
192
+ };
193
+ }
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
+ */
204
+ export function or(...filters){
205
+ const dependencies = filters
206
+ .flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
207
+ .filter(Validator.isObservable);
208
+
209
+ return {
210
+ dependencies: dependencies.length > 0 ? dependencies : null,
211
+ callback: (value) => filters.some(f => f.callback(value)),
212
+ };
213
+ }
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
+ */
223
+ export function not(filter){
224
+ return {
225
+ dependencies: filter.dependencies,
226
+ callback: (value) => !filter.callback(value),
227
+ };
228
+ }
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
+ */
241
+ export function custom(callbackFn, ...observables){
242
+ const dependencies = observables.filter(Validator.isObservable);
243
+
244
+ return {
245
+ dependencies: dependencies.length > 0 ? dependencies : null,
246
+ callback: (value) => {
247
+ const values = observables.map(o =>
248
+ Validator.isObservable(o) ? o.val() : o,
249
+ );
250
+ return callbackFn(value, ...values);
251
+ },
252
+ };
253
+ }
254
+
255
+ export const gt = greaterThan;
256
+ export const gte = greaterThanOrEqual;
257
+ export const lt = lessThan;
258
+ export const lte = lessThanOrEqual;
259
+ export const eq = equals;
260
+ export const neq = notEquals;
261
+ export const all = and;
262
+ export const any = or;
263
+
@@ -0,0 +1,67 @@
1
+ import { createFilter, createMultiSourceFilter } from './utils';
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
+ */
16
+ export function includes(observableOrValue, caseSensitive = false){
17
+ return createFilter(observableOrValue, (value, query) => {
18
+ if (!value) return false;
19
+ if (!query) return true;
20
+ if (!caseSensitive){
21
+ return String(value).toLowerCase().includes(String(query).toLowerCase());
22
+ }
23
+ return String(value).includes(String(query));
24
+ });
25
+ }
26
+
27
+ export const contains = includes;
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
+ */
39
+ export function startsWith(observableOrValue, caseSensitive = false){
40
+ return createFilter(observableOrValue, (value, query) => {
41
+ if (!query) return true;
42
+ if (!caseSensitive){
43
+ return String(value).toLowerCase().startsWith(String(query).toLowerCase());
44
+ }
45
+ return String(value).startsWith(String(query));
46
+ });
47
+ }
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
+ */
59
+ export function endsWith(observableOrValue, caseSensitive = false){
60
+ return createFilter(observableOrValue, (value, query) => {
61
+ if (!query) return true;
62
+ if (!caseSensitive){
63
+ return String(value).toLowerCase().endsWith(String(query).toLowerCase());
64
+ }
65
+ return String(value).endsWith(String(query));
66
+ });
67
+ }
@@ -0,0 +1,77 @@
1
+ import Validator from '../../utils/validator';
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
+ */
9
+ export function toDate(value) {
10
+ if (value instanceof Date) return value;
11
+ return new Date(value);
12
+ }
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
+ */
21
+ export function isSameDay(date1, date2) {
22
+ const d1 = toDate(date1);
23
+ const d2 = toDate(date2);
24
+ return d1.getFullYear() === d2.getFullYear() &&
25
+ d1.getMonth() === d2.getMonth() &&
26
+ d1.getDate() === d2.getDate();
27
+ }
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
+ */
36
+ export function getSecondsOfDay(date) {
37
+ const d = toDate(date);
38
+ return (d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds();
39
+ }
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
+ */
49
+ export function createFilter(observableOrValue, callbackFn){
50
+ const isObservable = Validator.isObservable(observableOrValue);
51
+
52
+ return {
53
+ dependencies: isObservable ? observableOrValue : null,
54
+ callback: (value) => callbackFn(value, isObservable ? observableOrValue.val() : observableOrValue),
55
+ };
56
+ }
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
+ */
66
+ export function createMultiSourceFilter(sources, callbackFn){
67
+ const observables = sources.filter(Validator.isObservable);
68
+
69
+ const getValues = () => sources.map(src =>
70
+ Validator.isObservable(src) ? src.val() : src,
71
+ );
72
+
73
+ return {
74
+ dependencies: observables.length > 0 ? observables : null,
75
+ callback: (value) => callbackFn(value, getValues()),
76
+ };
77
+ }
@@ -0,0 +1,90 @@
1
+ const $parseDateParts = (value, locale) => {
2
+ const d = new Date(value);
3
+ return {
4
+ d,
5
+ parts: new Intl.DateTimeFormat(locale, {
6
+ year: 'numeric',
7
+ month: 'long',
8
+ day: '2-digit',
9
+ hour: '2-digit',
10
+ minute: '2-digit',
11
+ second: '2-digit',
12
+ }).formatToParts(d).reduce((acc, { type, value }) => {
13
+ acc[type] = value;
14
+ return acc;
15
+ }, {}),
16
+ };
17
+ };
18
+
19
+ const $applyDatePattern = (pattern, d, parts) => {
20
+ const pad = n => String(n).padStart(2, '0');
21
+ return pattern
22
+ .replace('YYYY', parts.year)
23
+ .replace('YY', parts.year.slice(-2))
24
+ .replace('MMMM', parts.month)
25
+ .replace('MMM', parts.month.slice(0, 3))
26
+ .replace('MM', pad(d.getMonth() + 1))
27
+ .replace('DD', pad(d.getDate()))
28
+ .replace('D', d.getDate())
29
+ .replace('HH', parts.hour)
30
+ .replace('mm', parts.minute)
31
+ .replace('ss', parts.second);
32
+ };
33
+
34
+ export const Formatters = {
35
+ currency: (value, locale, { currency = 'XOF', notation, minimumFractionDigits, maximumFractionDigits } = {}) =>
36
+ new Intl.NumberFormat(locale, {
37
+ style: 'currency',
38
+ currency,
39
+ notation,
40
+ minimumFractionDigits,
41
+ maximumFractionDigits,
42
+ }).format(value),
43
+
44
+ number: (value, locale, { notation, minimumFractionDigits, maximumFractionDigits } = {}) =>
45
+ new Intl.NumberFormat(locale, {
46
+ notation,
47
+ minimumFractionDigits,
48
+ maximumFractionDigits,
49
+ }).format(value),
50
+
51
+ percent: (value, locale, { decimals = 1 } = {}) =>
52
+ new Intl.NumberFormat(locale, {
53
+ style: 'percent',
54
+ maximumFractionDigits: decimals,
55
+ }).format(value),
56
+
57
+ date: (value, locale, { format, dateStyle = 'long' } = {}) => {
58
+ if (format) {
59
+ const { d, parts } = $parseDateParts(value, locale);
60
+ return $applyDatePattern(format, d, parts);
61
+ }
62
+ return new Intl.DateTimeFormat(locale, { dateStyle }).format(new Date(value));
63
+ },
64
+
65
+ time: (value, locale, { format, hour = '2-digit', minute = '2-digit', second } = {}) => {
66
+ if (format) {
67
+ const { d, parts } = $parseDateParts(value, locale);
68
+ return $applyDatePattern(format, d, parts);
69
+ }
70
+ return new Intl.DateTimeFormat(locale, { hour, minute, second }).format(new Date(value));
71
+ },
72
+
73
+ datetime: (value, locale, { format, dateStyle = 'long', hour = '2-digit', minute = '2-digit', second } = {}) => {
74
+ if (format) {
75
+ const { d, parts } = $parseDateParts(value, locale);
76
+ return $applyDatePattern(format, d, parts);
77
+ }
78
+ return new Intl.DateTimeFormat(locale, { dateStyle, hour, minute, second }).format(new Date(value));
79
+ },
80
+
81
+ relative: (value, locale, { unit = 'day', numeric = 'auto' } = {}) => {
82
+ const diff = Math.round((value - Date.now()) / (1000 * 60 * 60 * 24));
83
+ return new Intl.RelativeTimeFormat(locale, { numeric }).format(diff, unit);
84
+ },
85
+
86
+ plural: (value, locale, { singular, plural } = {}) => {
87
+ const rule = new Intl.PluralRules(locale).select(value);
88
+ return `${value} ${rule === 'one' ? singular : plural}`;
89
+ },
90
+ };