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
package/package.json CHANGED
@@ -1,7 +1,30 @@
1
1
  {
2
2
  "name": "native-document",
3
- "version": "1.0.165",
4
- "sideEffects": [
3
+ "version": "1.0.168",
4
+ "description": "A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features",
5
+ "author": "AfroCodeur <https://github.com/afrocodeur>",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/afrocodeur/native-document#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/afrocodeur/native-document.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/afrocodeur/native-document/issues"
14
+ },
15
+ "keywords": [
16
+ "reactive",
17
+ "framework",
18
+ "dom",
19
+ "vanilla",
20
+ "javascript",
21
+ "observable",
22
+ "no-virtual-dom",
23
+ "ui"
24
+ ],
25
+ "type": "module",
26
+ "main": "index.js",
27
+ "sideEffects": [
5
28
  "index.js",
6
29
  "elements.js",
7
30
  "**/*.css",
@@ -14,16 +37,16 @@
14
37
  "**/observable.prototypes.js",
15
38
  "**/observable.is-to.js"
16
39
  ],
17
- "main": "index.js",
18
- "type": "module",
19
40
  "scripts": {
20
- "build": "rollup --config rollup.config.js --watch",
21
- "lint": "eslint ./src"
41
+ "build": "rollup --config rollup.config.js",
42
+ "build:watch": "rollup --config rollup.config.js --watch",
43
+ "lint": "eslint ./src",
44
+ "lint:fix": "eslint ./src --fix"
45
+ },
46
+ "dependencies": {
47
+ "@floating-ui/dom": "^1.7.6",
48
+ "i18next": "^25.8.0"
22
49
  },
23
- "keywords": [],
24
- "author": "",
25
- "license": "ISC",
26
- "description": "",
27
50
  "devDependencies": {
28
51
  "@babel/parser": "^7.28.5",
29
52
  "@babel/traverse": "^7.28.5",
@@ -37,8 +60,7 @@
37
60
  "rollup": "^4.53.3",
38
61
  "rollup-plugin-postcss": "^4.0.2"
39
62
  },
40
- "dependencies": {
41
- "@floating-ui/dom": "^1.7.6",
42
- "i18next": "^25.8.0"
63
+ "engines": {
64
+ "node": ">=18.0.0"
43
65
  }
44
- }
66
+ }
package/readme.md CHANGED
@@ -1,8 +1,13 @@
1
+ ---
2
+ title: NativeDocument
3
+ description: A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features
4
+ ---
5
+
1
6
  # NativeDocument
2
7
 
3
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
4
9
  [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen.svg)](#)
5
- [![Version](https://img.shields.io/badge/Version-1.0.0-orange.svg)](#)
10
+ [![Version](https://img.shields.io/badge/Version-1.0.161-orange.svg)](#)
6
11
  [![Bundle Size](https://img.shields.io/badge/Bundle%20Size-~25kb-green.svg)](#)
7
12
 
8
13
  > **A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features**
@@ -10,7 +15,8 @@
10
15
  NativeDocument combines the familiarity of vanilla JavaScript with the power of modern reactivity. No compilation, no virtual DOM, just pure JavaScript with an intuitive API.
11
16
 
12
17
  ## Why NativeDocument?
13
- > **Note**: NativeDocument works best with a bundler (Vite, Webpack, Rollup) for tree-shaking and optimal bundle size. The CDN version includes all features
18
+
19
+ > **Note**: NativeDocument works best with a bundler (Vite, Webpack, Rollup) for tree-shaking and optimal bundle size. The CDN version includes all features.
14
20
 
15
21
  ### **Instant Start**
16
22
  ```html
@@ -29,41 +35,58 @@ import { Observable } from 'native-document';
29
35
  const count = Observable(0);
30
36
 
31
37
  const App = Div({ class: 'app' }, [
32
- Div([ 'Count ', count]),
33
- Button('Increment').nd.onClick(() => count.set(count.val() + 1))
38
+ Div(['Count ', count]),
39
+ Button('Increment').nd
40
+ .onClick(() => count.$value++)
34
41
  ]);
35
42
 
36
43
  document.body.appendChild(App);
37
44
  ```
38
45
 
39
46
  ### **Complete Features**
40
- - **Native reactivity** with observables
41
- - **Global store** for state management
42
- - **Built-in conditional rendering**
43
- - **Full-featured router** (hash, history, memory modes)
47
+ - **Native reactivity** with observables, computed values, and batched updates
48
+ - **Global store** for state management with groups, persistence, and computed stores
49
+ - **Built-in conditional rendering** (`ShowIf`, `Match`, `Switch`, `When`)
50
+ - **Full-featured router** (hash, history, memory modes) with layouts and middlewares
51
+ - **Headless UI components** with an optional rendering system (50+ components)
52
+ - **Built-in i18n** via `tr()`, locale-aware `Observable.format()`, and `Formatters`
53
+ - **Advanced data filtering** with composable filter helpers
54
+ - **Official CLI** for scaffolding projects, pages, components, and services
44
55
  - **Advanced debugging system**
45
- - **Automatic memory management** via FinalizationRegistry
56
+ - **Automatic memory management** via `FinalizationRegistry`
57
+ - **Tree-shaking** support — only bundle what you use
46
58
 
47
59
  ## Quick Installation
48
60
 
49
- ### Option 1: CDN (Instant Start)
61
+ ### Option 1: CLI (Recommended)
62
+
63
+ The fastest way to start a complete project:
64
+
65
+ ```bash
66
+ npm install -g @native-document/cli
67
+
68
+ nd create MyApp # default structure
69
+ nd create MyApp --feature # feature-based architecture
70
+
71
+ cd MyApp
72
+ npm install
73
+ npm start
74
+ ```
75
+
76
+ > The CLI source is available at [github.com/afrocodeur/native-document-cli](https://github.com/afrocodeur/native-document-cli).
77
+
78
+ See the **[CLI guide](./cli.md)** for all available commands (`nd create:page`, `nd create:component`, `nd create:service` and more).
79
+
80
+ ### Option 2: CDN (No build step)
50
81
  ```html
51
- <script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document/dist/native-document.min.js"></script>
82
+ <script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document@latest/dist/native-document.min.js"></script>
52
83
  <script>
53
- const { Div } = NativeDocument.elements
54
- const { Observable } = NativeDocument
84
+ const { Div } = NativeDocument.elements;
85
+ const { Observable } = NativeDocument;
55
86
  // Your code here
56
87
  </script>
57
88
  ```
58
89
 
59
- ### Option 2: Vite Template (Complete Project)
60
- ```bash
61
- npx degit afrocodeur/native-document-vite my-app
62
- cd my-app
63
- npm install
64
- npm run start
65
- ```
66
-
67
90
  ### Option 3: NPM/Yarn
68
91
  ```bash
69
92
  npm install native-document
@@ -74,16 +97,16 @@ yarn add native-document
74
97
  ## Quick Example
75
98
 
76
99
  ```javascript
77
- import { Div, Input, Button, ShowIf, ForEach } from 'native-document/elements'
78
- import { Observable } from 'native-document'
100
+ import { Div, Input, Button, ShowIf, ForEach } from 'native-document/elements';
101
+ import { Observable } from 'native-document';
79
102
 
80
103
  // CDN
81
104
  // const { Div, Input, Button, ShowIf, ForEach } = NativeDocument.elements;
82
105
  // const { Observable } = NativeDocument;
83
106
 
84
107
  // Reactive state
85
- const todos = Observable.array([])
86
- const newTodo = Observable('')
108
+ const todos = Observable.array([]);
109
+ const newTodo = Observable('');
87
110
 
88
111
  // Todo Component
89
112
  const TodoApp = Div({ class: 'todo-app' }, [
@@ -92,10 +115,11 @@ const TodoApp = Div({ class: 'todo-app' }, [
92
115
  Input({ placeholder: 'Add new task...', value: newTodo }),
93
116
 
94
117
  // Add button
95
- Button('Add Todo').nd.onClick(() => {
118
+ Button('Add Todo').nd
119
+ .onClick(() => {
96
120
  if (newTodo.val().trim()) {
97
- todos.push({ id: Date.now(), text: newTodo.val(), done: false })
98
- newTodo.set('')
121
+ todos.push({ id: Date.now(), text: newTodo.val(), done: false });
122
+ newTodo.set('');
99
123
  }
100
124
  }),
101
125
 
@@ -104,17 +128,19 @@ const TodoApp = Div({ class: 'todo-app' }, [
104
128
  Div({ class: 'todo-item' }, [
105
129
  Input({ type: 'checkbox', checked: todo.done }),
106
130
  `${todo.text}`,
107
- Button('Delete').nd.onClick(() => todos.splice(index.val(), 1))
108
- ]), (item) => item.id ), // Key function - use unique identifier
131
+ Button('Delete').nd
132
+ .onClick(() => todos.splice(index.val(), 1))
133
+ ]),
134
+ (item) => item.id // Key function — use unique identifier
135
+ ),
109
136
 
110
137
  // Empty state
111
- ShowIf(
112
- todos.check(list => list.length === 0),
138
+ ShowIf(todos.isEmpty(),
113
139
  Div({ class: 'empty' }, 'No todos yet!')
114
140
  )
115
141
  ]);
116
142
 
117
- document.body.appendChild(TodoApp)
143
+ document.body.appendChild(TodoApp);
118
144
  ```
119
145
 
120
146
  ## Core Concepts
@@ -122,47 +148,77 @@ document.body.appendChild(TodoApp)
122
148
  ### Observables
123
149
  Reactive data that automatically updates the DOM:
124
150
  ```javascript
125
- import { Div } from 'native-document/elements'
126
- import { Observable } from 'native-document'
151
+ import { Div } from 'native-document/elements';
152
+ import { Observable } from 'native-document';
127
153
 
128
154
  // CDN
129
- // const { Div } = NativeDocument.elements;
155
+ // const { Div } = NativeDocument.elements;
130
156
  // const { Observable } = NativeDocument;
131
157
 
132
158
  const user = Observable({ name: 'John', age: 25 });
133
- const greeting = Observable.computed(() => `Hello ${user.$value.name}!`, [user])
134
- // Or const greeting = Observable.computed(() => `Hello ${user.val().name}!`, [user])
159
+ const greeting = Observable.computed(() => `Hello ${user.val().name}!`, [user]);
135
160
 
136
161
  document.body.appendChild(Div(greeting));
137
162
 
138
163
  // Direct mutation won't trigger updates
139
- user.name = 'Fausty';
164
+ // user.name = 'Fausty'; // Wrong!
140
165
 
141
166
  // These will trigger updates:
142
- user.$value = { ...user.$value, name: ' Hermes!' };
167
+ user.$value = { ...user.$value, name: 'Hermes!' };
143
168
  user.set(data => ({ ...data, name: 'Hermes!' }));
144
169
  user.set({ ...user.val(), name: 'Hermes!' });
145
170
  ```
146
171
 
172
+ ### Formatting & i18n
173
+ Format observable values reactively with built-in locale awareness.
174
+ You must set a locale observable before using `Observable.format()`:
175
+
176
+ ```javascript
177
+ import { Observable } from 'native-document';
178
+ import { tr } from 'native-document/i18n';
179
+
180
+ // Set the locale first — formats react to it automatically
181
+ const $locale = Observable('fr');
182
+ Observable.setLocale($locale);
183
+
184
+ const price = Observable(4999);
185
+ const date = Observable(Date.now());
186
+
187
+ export function PriceDisplay() {
188
+ return Div([
189
+ Div(price.format('currency', { currency: 'USD' })),
190
+ Div(date.format('date', { dateStyle: 'long' })),
191
+ Button('Switch to English').nd
192
+ .onClick(() => $locale.set('en'))
193
+ ]);
194
+ }
195
+
196
+ // Built-in format types: currency, number, percent, date, time, datetime, relative, plural
197
+
198
+ // Translation helper
199
+ P(tr('welcome_message'))
200
+ ```
201
+
147
202
  ### Elements
148
203
  Familiar HTML element creation with reactive bindings:
149
204
  ```javascript
150
- import { Div, Button } from 'native-document/elements'
151
- import { Observable } from 'native-document'
205
+ import { Div, Button } from 'native-document/elements';
206
+ import { Observable } from 'native-document';
152
207
 
153
208
  // CDN
154
- // const { Div, Button } = NativeDocument.elements;
209
+ // const { Div, Button } = NativeDocument.elements;
155
210
  // const { Observable } = NativeDocument;
156
211
 
157
- const App = function() {
158
- const isVisible = Observable(true)
159
-
212
+ const App = function() {
213
+ const isVisible = Observable(true);
214
+
160
215
  return Div([
161
216
  Div({
162
- class: { 'hidden': isVisible.check(v => !v) },
163
- style: { opacity: isVisible.check(v => v ? 1 : 0.2) }
217
+ class: { 'hidden': isVisible.isFalsy() },
218
+ style: { opacity: isVisible.format(v => v ? 1 : 0.2) }
164
219
  }, 'Content'),
165
- Button('Toggle').nd.onClick(() => isVisible.set(v => !v)),
220
+ Button('Toggle').nd
221
+ .onClick(() => isVisible.toggle()),
166
222
  ]);
167
223
  };
168
224
 
@@ -172,13 +228,15 @@ document.body.appendChild(App());
172
228
  ### Conditional Rendering
173
229
  Built-in components for dynamic content:
174
230
  ```javascript
175
- ShowIf(user.check(u => u.isLoggedIn),
176
- Div('Welcome back!')
231
+ import { ShowIf, Match, Switch, When } from 'native-document/elements';
232
+
233
+ ShowIf(user.is(u => u.isLoggedIn),
234
+ Div('Welcome back!')
177
235
  )
178
236
 
179
237
  Match(theme, {
180
- 'dark': Div({ class: 'dark-mode' }),
181
- 'light': Div({ class: 'light-mode' })
238
+ 'dark': Div({ class: 'dark-mode' }),
239
+ 'light': Div({ class: 'light-mode' })
182
240
  })
183
241
 
184
242
  Switch(condition, onTrue, onFalse)
@@ -191,51 +249,173 @@ When(condition)
191
249
  ### List Rendering
192
250
  Efficient rendering of lists with automatic updates:
193
251
  ```javascript
194
- import { ForEach, Div } from 'native-document/elements'
195
- import { Observable } from 'native-document'
252
+ import { ForEach, Div } from 'native-document/elements';
253
+ import { Observable } from 'native-document';
196
254
 
197
- const items = Observable.array(['Apple', 'Banana', 'Cherry'])
255
+ const items = Observable.array(['Apple', 'Banana', 'Cherry']);
198
256
 
199
- ForEach(items, (item, index) =>
257
+ ForEach(items, (item, index) =>
200
258
  Div([index, '. ', item])
201
259
  )
202
260
 
203
- // With object arrays - use key function
261
+ // With object arrays use a key function for efficient updates
204
262
  const users = Observable.array([
205
263
  { id: 1, name: 'Alice' },
206
264
  { id: 2, name: 'Bob' }
207
- ])
265
+ ]);
208
266
 
209
- ForEach(users, (user) =>
267
+ ForEach(users, (user) =>
210
268
  Div(user.name),
211
269
  (user) => user.id // Key for efficient updates
212
270
  )
213
271
  ```
214
272
 
273
+ ### Routing
274
+ Full-featured router with hash, history, and memory modes.
275
+ Use `to` with a route name (string) or `{ name, params }` object. Use `href` for direct path links:
276
+
277
+ ```javascript
278
+ import { Router, Link } from 'native-document/router';
279
+
280
+ Router.create({ name: 'default', mode: 'history' }, (router) => {
281
+ router.group('', { layout: DefaultLayout }, () => {
282
+ router.add('/', HomePage);
283
+ router.add('/user/{id}', UserPage);
284
+ router.add('{*}', NotFoundPage);
285
+ });
286
+ });
287
+
288
+ // Named route link
289
+ Link({ to: 'home' }, 'Home')
290
+
291
+ // Named route with params
292
+ Link({ to: { name: 'user', params: { id: 42 } } }, 'User Profile')
293
+
294
+ // Direct path link
295
+ Link({ href: '/about' }, 'About')
296
+ ```
297
+
298
+ ### State Management
299
+ Global state with groups, persistence, and computed stores:
300
+ ```javascript
301
+ import { Store } from 'native-document';
302
+
303
+ // Simple store
304
+ Store.create('theme', 'light');
305
+
306
+ // Persistent store — survives page reloads
307
+ Store.createPersistent('settings', { lang: 'en', darkMode: false });
308
+
309
+ // Grouped stores — isolated namespaces
310
+ const CartStore = Store.group('cart', (group) => {
311
+ group.create('items', []);
312
+ group.createComposed('total', () => {
313
+ return CartStore.get('items').val()
314
+ .reduce((sum, item) => sum + item.price * item.qty, 0);
315
+ }, ['items']);
316
+ });
317
+
318
+ // Access in components
319
+ const items = CartStore.use('items'); // two-way reactive
320
+ const total = CartStore.follow('total'); // read-only reactive
321
+ ```
322
+
323
+ ### Data Filters
324
+ Composable filter helpers for `ObservableArray` only:
325
+
326
+ ```javascript
327
+ import { Observable } from 'native-document';
328
+ import { equals, greaterThan, lessThan, and, or, not } from 'native-document/filters';
329
+
330
+ const users = Observable.array([
331
+ { name: 'Alice', age: 17, role: 'user' },
332
+ { name: 'Bob', age: 25, role: 'admin' },
333
+ { name: 'Carol', age: 32, role: 'user' },
334
+ ]);
335
+
336
+ // and — field must pass ALL conditions
337
+ const youngAdults = users.where({
338
+ age: and(greaterThan(18), lessThan(30))
339
+ });
340
+ // → Bob (25)
341
+
342
+ // or — field must pass AT LEAST ONE condition
343
+ const adminOrEditor = users.where({
344
+ role: or(equals('admin'), equals('editor'))
345
+ });
346
+ // → Bob
347
+
348
+ // not — inverts a filter
349
+ const nonAdmins = users.where({
350
+ role: not(equals('admin'))
351
+ });
352
+ // → Alice, Carol
353
+
354
+ // Cross-field logic — use the _ key with a plain function
355
+ const adminsOrMinors = users.where({
356
+ _: (item) => item.role === 'admin' || item.age < 18
357
+ });
358
+ // → Alice (minor), Bob (admin)
359
+ ```
360
+
361
+ > `and`, `or`, and `not` work on **filter result objects** — they operate on a single field.
362
+ > For cross-field logic use the `_` key with a plain function.
363
+ > `.where()` returns a new live `ObservableArray` that re-filters automatically when the source changes.
364
+
215
365
  ## Documentation
216
366
 
217
- - **[Getting Started](docs/getting-started.md)** - Installation and first steps
218
- - **[Core Concepts](docs/core-concepts.md)** - Understanding the fundamentals
219
- - **[Observables](docs/observables.md)** - Reactive state management
220
- - **[Elements](docs/elements.md)** - Creating and composing UI
221
- - **[Conditional Rendering](docs/conditional-rendering.md)** - Dynamic content
222
- - **[List Rendering](docs/list-rendering.md)** - List Rendering
223
- - **[Routing](docs/routing.md)** - Navigation and URL management
224
- - **[State Management](docs/state-management.md)** - Global state patterns
225
- - **[Lifecycle Events](docs/lifecycle-events.md)** - Lifecycle events
226
- - **[NDElement](docs/native-document-element.md)** - Native Document Element
227
- - **[Extending NDElement](docs/extending-native-document-element.md)** - Custom Methods Guide
228
- - **[Advanced Components](docs/advanced-components.md)** - Template caching and singleton views
229
- - **[Args Validation](docs/validation.md)** - Function Argument Validation
230
- - **[Memory Management](docs/memory-management.md)** - Memory management
231
- - **[Anchor](docs/anchor.md)** - Anchor
367
+ - **[Getting Started](./getting-started.md)** Installation and first steps
368
+ - **[CLI](./cli.md)** Scaffolding projects, pages, and components
369
+ - **[Core Concepts](./core-concepts.md)** Understanding the fundamentals
370
+ - **[Observables](./observables.md)** Reactive state management
371
+ - **[Observable Resource](./observable-resource.md)** Async data fetching
372
+ - **[Elements](./elements.md)** Creating and composing UI
373
+ - **[Conditional Rendering](./conditional-rendering.md)** Dynamic content
374
+ - **[List Rendering](./list-rendering.md)** ForEach and dynamic lists
375
+ - **[Routing](./routing.md)** Navigation and URL management
376
+ - **[State Management](./state-management.md)** Global state patterns
377
+ - **[Lifecycle Events](./lifecycle-events.md)** Lifecycle events
378
+ - **[NDElement](./native-document-element.md)** Native Document Element
379
+ - **[Extending NDElement](./extending-native-document-element.md)** Custom Methods Guide
380
+ - **[Advanced Components](./advanced-components.md)** Template caching and singleton views
381
+ - **[Args Validation](./validation.md)** Function Argument Validation
382
+ - **[Memory Management](./memory-management.md)** — Memory management
383
+ - **[Anchor](./anchor.md)** — Anchor
384
+ - **[SVG Elements](./svg-elements.md)** — SVG wrapper functions
385
+ - **[i18n & Formatting](./i18n.md)** — Locale-aware formatting and translations
386
+
387
+ ### Components
388
+
389
+ - **[Components Overview](./components/index.md)** — Headless UI component system
390
+ - **[Getting Started](./components/getting-started.md)** — First component and renderer setup
391
+ - **[Traits](./components/traits.md)** — Draggable, Resizable, EventEmitter
392
+ - **[Layout](./components/layout.md)** — Stack, Row, Col, Divider
393
+ - **[Accordion](./components/accordion.md)**
394
+ - **[Alert, Badge, Spinner, Skeleton, Progress](./components/alert.md)**
395
+ - **[Avatar](./components/avatar.md)**
396
+ - **[Breadcrumb](./components/breadcrumb.md)**
397
+ - **[Button](./components/button.md)**
398
+ - **[Context Menu](./components/context-menu.md)**
399
+ - **[Data Table](./components/data-table.md)**
400
+ - **[Dropdown](./components/dropdown.md)**
401
+ - **[File Upload](./components/file.md)**
402
+ - **[Form Fields](./components/form-fields.md)**
403
+ - **[Checkbox & Radio](./components/checkbox-radio.md)**
404
+ - **[Select](./components/select.md)**
405
+ - **[Menu](./components/menu.md)**
406
+ - **[Modal & Popover](./components/modal.md)**
407
+ - **[Slider & Stepper](./components/slider-stepper.md)**
408
+ - **[Splitter](./components/splitter.md)**
409
+ - **[Switch](./components/switch.md)**
410
+ - **[Tabs](./components/tabs.md)**
411
+ - **[Toast](./components/toast.md)**
412
+ - **[Tooltip](./components/tooltip.md)**
232
413
 
233
414
  ### Utilities
234
415
 
235
- - **[Cache](docs/utils/cache.md)** - Lazy initialization and singleton patterns
236
- - **[NativeFetch](docs/utils/native-fetch.md)** - HTTP client with interceptors
237
- - **[Filters](docs/utils/filters.md)** - Data filtering helpers
238
-
416
+ - **[Cache](./utils/cache.md)** Lazy initialization and singleton patterns
417
+ - **[NativeFetch](./utils/native-fetch.md)** HTTP client with interceptors
418
+ - **[Filters](./utils/filters.md)** Data filtering helpers
239
419
 
240
420
  ## Key Features Deep Dive
241
421
 
@@ -244,25 +424,26 @@ ForEach(users, (user) =>
244
424
  - Automatic batching of updates
245
425
  - Lazy evaluation of computed values
246
426
  - Efficient list rendering with keyed updates
427
+ - Tree-shaking — only bundle what you use
247
428
 
248
429
  ### Developer Experience
249
430
  ```javascript
250
- import { ArgTypes } from 'native-document'
431
+ import { ArgTypes } from 'native-document';
251
432
 
252
433
  // Built-in debugging
253
- Observable.debug.enable()
434
+ Observable.debug.enable();
254
435
 
255
436
  // Argument validation
256
- const createUser = (function (name, age) {
257
- // Auto-validates argument types
258
- }).args(ArgTypes.string('name'), ArgTypes.number('age'))
259
-
437
+ const createUser = (function(name, age) {
438
+ // Auto-validates argument types in development
439
+ }).args(ArgTypes.string('name'), ArgTypes.number('age'));
260
440
 
441
+ // Error boundaries
261
442
  const SafeApp = App.errorBoundary((error, { caller, args }) => {
262
443
  return Div({ class: 'error' }, [
263
444
  'An error occurred: ',
264
445
  error.message
265
- ])
446
+ ]);
266
447
  });
267
448
 
268
449
  document.body.appendChild(SafeApp());
@@ -270,7 +451,7 @@ document.body.appendChild(SafeApp());
270
451
 
271
452
  ## Contributing
272
453
 
273
- We welcome contributions! Please see our [Contributing Guide](docs/contributing.md) for details.
454
+ We welcome contributions! Please see our [Contributing Guide](./contributing.md) for details.
274
455
 
275
456
  ### Development Setup
276
457
  ```bash
@@ -310,11 +491,10 @@ Your support helps me:
310
491
 
311
492
  Thanks for your support! 🙏
312
493
 
313
-
314
494
  ## Acknowledgments
315
495
 
316
496
  Thanks to all contributors and the JavaScript community for inspiration.
317
497
 
318
498
  ---
319
499
 
320
- **Ready to build with native simplicity?** [Get Started ->](docs/getting-started.md)
500
+ **Ready to build with native simplicity?** [Get Started ->](./getting-started.md)
@@ -0,0 +1,4 @@
1
+ export interface HasDraggable {
2
+ move(x: number, y: number): void;
3
+ makeDraggable(parent: HTMLElement, grip?: HTMLElement | null): () => void;
4
+ }
@@ -1,8 +1,16 @@
1
1
 
2
2
  import './has-draggable.css';
3
3
 
4
+ /**
5
+ * @class
6
+ * */
4
7
  export default function HasDraggable() {}
5
8
 
9
+
10
+ /**
11
+ * @param {number} x
12
+ * @param {number} y
13
+ */
6
14
  HasDraggable.prototype.move = function(x, y) {
7
15
  if(!this.$movableElement) {
8
16
  return;
@@ -13,6 +21,11 @@ HasDraggable.prototype.move = function(x, y) {
13
21
  this.$movableElement.style.margin = '0';
14
22
  };
15
23
 
24
+ /**
25
+ * @param {HTMLElement} parent
26
+ * @param {HTMLElement|null} [grip=null]
27
+ * @returns {() => void}
28
+ */
16
29
  HasDraggable.prototype.makeDraggable = function(parent, grip = null) {
17
30
  if(!this.emit) {
18
31
  throw new Error('HasDraggable requires HasEventEmitter - add it via BaseComponent.use(Component, HasEventEmitter, HasDraggable).');
@@ -0,0 +1,9 @@
1
+ import type { ObservableItem } from '../../../types/observable';
2
+
3
+ export interface HasItems {
4
+ dynamic(observableArray?: ObservableItem<unknown[]> | null): this;
5
+ bind(observableArray?: ObservableItem<unknown[]> | null): this;
6
+ items(items: unknown[]): this;
7
+ clear(): this;
8
+ removeItem(item: unknown): this;
9
+ }