native-document 1.0.15 → 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 (649) 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 +8421 -1492
  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 +181 -257
  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 -502
  77. package/docs/contributing.md +300 -25
  78. package/docs/core-concepts.md +207 -366
  79. package/docs/elements.md +266 -254
  80. package/docs/extending-native-document-element.md +259 -0
  81. package/docs/filters.md +247 -0
  82. package/docs/getting-started.md +195 -257
  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 +240 -460
  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 -357
  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 -91
  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 -13
  107. package/package.json +59 -9
  108. package/readme.md +296 -93
  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 +2 -3
  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/{elements → core/elements}/control/for-each.js +42 -23
  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 +4 -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 -55
  617. package/src/data/ObservableChecker.js +0 -39
  618. package/src/data/ObservableItem.js +0 -195
  619. package/src/data/Store.js +0 -74
  620. package/src/data/observable-helpers/array.js +0 -74
  621. package/src/data/observable-helpers/batch.js +0 -22
  622. package/src/data/observable-helpers/computed.js +0 -28
  623. package/src/data/observable-helpers/object.js +0 -111
  624. package/src/elements/anchor.js +0 -129
  625. package/src/elements/content-formatter.js +0 -32
  626. package/src/elements/control/for-each-array.js +0 -280
  627. package/src/elements/control/show-if.js +0 -79
  628. package/src/elements/control/switch.js +0 -98
  629. package/src/elements/description-list.js +0 -5
  630. package/src/elements/form.js +0 -71
  631. package/src/elements/html5-semantics.js +0 -12
  632. package/src/elements/img.js +0 -45
  633. package/src/elements/interactive.js +0 -7
  634. package/src/elements/list.js +0 -10
  635. package/src/elements/medias.js +0 -8
  636. package/src/elements/meta-data.js +0 -9
  637. package/src/elements/table.js +0 -14
  638. package/src/utils/args-types.js +0 -100
  639. package/src/utils/debug-manager.js +0 -31
  640. package/src/utils/helpers.js +0 -60
  641. package/src/utils/plugins-manager.js +0 -12
  642. package/src/utils/prototypes.js +0 -45
  643. package/src/wrappers/AttributesWrapper.js +0 -144
  644. package/src/wrappers/DocumentObserver.js +0 -80
  645. package/src/wrappers/ElementCreator.js +0 -114
  646. package/src/wrappers/HtmlElementEventsWrapper.js +0 -64
  647. package/src/wrappers/HtmlElementWrapper.js +0 -50
  648. package/src/wrappers/NdPrototype.js +0 -109
  649. package/src/wrappers/constants.js +0 -2
package/index.js CHANGED
@@ -1,18 +1,24 @@
1
- export { default as HtmlElementWrapper } from './src/wrappers/HtmlElementWrapper'
2
- export { ElementCreator } from './src/wrappers/ElementCreator'
3
1
 
4
- import './src/utils/prototypes.js';
5
2
 
6
- export * from './src/utils/plugins-manager';
7
- export * from './src/utils/args-types';
8
- export * from './src/utils/validator'
9
- export * from './src/data/Observable';
10
- export * from './src/data/observable-helpers/array';
11
- export * from './src/data/observable-helpers/batch';
12
- export * from './src/data/observable-helpers/object';
13
- export * from './src/data/observable-helpers/computed';
14
- export * from './src/data/Store';
3
+ export { default as HtmlElementWrapper, createTextNode } from './src/core/wrappers/HtmlElementWrapper'
4
+ export { ElementCreator } from './src/core/wrappers/ElementCreator';
5
+ export { NDElement } from './src/core/wrappers/NDElement';
6
+ export { TemplateCloner, useCache } from './src/core/wrappers/template-cloner/TemplateCloner';
7
+ export { SingletonView, useSingleton } from './src/core/wrappers/SingletonView';
8
+ export { default as PluginsManager } from './src/core/utils/plugins-manager';
9
+ export { default as Validator } from './src/core/utils/validator';
10
+
11
+ export { Formatters } from "./src/core/utils/formatters";
12
+ export {default as ShortcutManager} from "./src/core/utils/shortcut-manager";
13
+
14
+ export * from './src/core/utils/property-accumulator';
15
+ export * from './src/core/utils/args-types';
16
+ export * from './src/core/utils/memoize';
17
+ export * from './src/core/data/Observable';
18
+ export * from './src/core/data/Store';
19
+
15
20
  import * as elements from './elements';
16
21
  import * as router from './router';
22
+ import * as utils from './utils';
17
23
 
18
- export { elements, router};
24
+ export { elements, router, utils };
package/package.json CHANGED
@@ -1,16 +1,66 @@
1
1
  {
2
2
  "name": "native-document",
3
- "version": "1.0.15",
4
- "main": "index.js",
3
+ "version": "1.0.168.01",
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
+ ],
5
25
  "type": "module",
26
+ "main": "index.js",
27
+ "sideEffects": [
28
+ "index.js",
29
+ "elements.js",
30
+ "**/*.css",
31
+ "**/prototypes",
32
+ "**/NdPrototype.js",
33
+ "**/nd-element-extensions.js",
34
+ "**/nd-element.transition.extensions.js",
35
+ "**/attributes-extensions.js",
36
+ "**/bind-class-extensions.js",
37
+ "**/observable.prototypes.js",
38
+ "**/observable.is-to.js"
39
+ ],
6
40
  "scripts": {
7
- "build": "rollup --config rollup.config.js --watch"
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"
8
49
  },
9
- "keywords": [],
10
- "author": "",
11
- "license": "ISC",
12
- "description": "",
13
50
  "devDependencies": {
14
- "@rollup/plugin-terser": "^0.4.4"
51
+ "@babel/parser": "^7.28.5",
52
+ "@babel/traverse": "^7.28.5",
53
+ "@rollup/plugin-alias": "^5.1.1",
54
+ "@rollup/plugin-replace": "^6.0.2",
55
+ "@rollup/plugin-terser": "^0.4.4",
56
+ "eslint": "^9.33.0",
57
+ "eslint-plugin-jsdoc": "^62.5.4",
58
+ "magic-string": "^0.30.21",
59
+ "postcss": "^8.5.12",
60
+ "rollup": "^4.53.3",
61
+ "rollup-plugin-postcss": "^4.0.2"
62
+ },
63
+ "engines": {
64
+ "node": ">=18.0.0"
15
65
  }
16
- }
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**
@@ -11,14 +16,16 @@ NativeDocument combines the familiarity of vanilla JavaScript with the power of
11
16
 
12
17
  ## Why NativeDocument?
13
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.
20
+
14
21
  ### **Instant Start**
15
22
  ```html
16
- <script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document@latest/dist/native-document.min.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document/dist/native-document.min.js"></script>
17
24
  ```
18
25
 
19
26
  ### **Familiar API**
20
27
  ```javascript
21
- import { Div, Button, Observable } from 'native-document/src/elements';
28
+ import { Div, Button } from 'native-document/elements';
22
29
  import { Observable } from 'native-document';
23
30
 
24
31
  // CDN
@@ -28,41 +35,58 @@ import { Observable } from 'native-document';
28
35
  const count = Observable(0);
29
36
 
30
37
  const App = Div({ class: 'app' }, [
31
- Div([ 'Count ', count]),
32
- // OR 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
82
  <script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document@latest/dist/native-document.min.js"></script>
52
83
  <script>
53
- const { Div, Observable } = NativeDocument.elements
84
+ const { Div } = NativeDocument.elements;
85
+ const { Observable } = NativeDocument;
54
86
  // Your code here
55
87
  </script>
56
88
  ```
57
89
 
58
- ### Option 2: Vite Template (Complete Project)
59
- ```bash
60
- npx degit afrocodeur/native-document-vite my-app
61
- cd my-app
62
- npm install
63
- npm run dev
64
- ```
65
-
66
90
  ### Option 3: NPM/Yarn
67
91
  ```bash
68
92
  npm install native-document
@@ -73,16 +97,16 @@ yarn add native-document
73
97
  ## Quick Example
74
98
 
75
99
  ```javascript
76
- import { Div, Input, Button, ShowIf, ForEach } from 'native-document/src/elements'
77
- import { Observable } from 'native-document'
100
+ import { Div, Input, Button, ShowIf, ForEach } from 'native-document/elements';
101
+ import { Observable } from 'native-document';
78
102
 
79
103
  // CDN
80
104
  // const { Div, Input, Button, ShowIf, ForEach } = NativeDocument.elements;
81
105
  // const { Observable } = NativeDocument;
82
106
 
83
107
  // Reactive state
84
- const todos = Observable.array([])
85
- const newTodo = Observable('')
108
+ const todos = Observable.array([]);
109
+ const newTodo = Observable('');
86
110
 
87
111
  // Todo Component
88
112
  const TodoApp = Div({ class: 'todo-app' }, [
@@ -91,10 +115,11 @@ const TodoApp = Div({ class: 'todo-app' }, [
91
115
  Input({ placeholder: 'Add new task...', value: newTodo }),
92
116
 
93
117
  // Add button
94
- Button('Add Todo').nd.onClick(() => {
118
+ Button('Add Todo').nd
119
+ .onClick(() => {
95
120
  if (newTodo.val().trim()) {
96
- todos.push({ id: Date.now(), text: newTodo.val(), done: false })
97
- newTodo.set('')
121
+ todos.push({ id: Date.now(), text: newTodo.val(), done: false });
122
+ newTodo.set('');
98
123
  }
99
124
  }),
100
125
 
@@ -103,17 +128,19 @@ const TodoApp = Div({ class: 'todo-app' }, [
103
128
  Div({ class: 'todo-item' }, [
104
129
  Input({ type: 'checkbox', checked: todo.done }),
105
130
  `${todo.text}`,
106
- Button('Delete').nd.onClick(() => todos.splice(index.val(), 1))
107
- ]), /*item key (string | callback) */(item) => item),
131
+ Button('Delete').nd
132
+ .onClick(() => todos.splice(index.val(), 1))
133
+ ]),
134
+ (item) => item.id // Key function — use unique identifier
135
+ ),
108
136
 
109
137
  // Empty state
110
- ShowIf(
111
- todos.check(list => list.length === 0),
138
+ ShowIf(todos.isEmpty(),
112
139
  Div({ class: 'empty' }, 'No todos yet!')
113
140
  )
114
141
  ]);
115
142
 
116
- document.body.appendChild(TodoApp)
143
+ document.body.appendChild(TodoApp);
117
144
  ```
118
145
 
119
146
  ## Core Concepts
@@ -121,44 +148,77 @@ document.body.appendChild(TodoApp)
121
148
  ### Observables
122
149
  Reactive data that automatically updates the DOM:
123
150
  ```javascript
124
- import { Div } from 'native-document/src/elements'
125
- import { Observable } from 'native-document'
151
+ import { Div } from 'native-document/elements';
152
+ import { Observable } from 'native-document';
126
153
 
127
154
  // CDN
128
- // const { Div } = NativeDocument.elements;
155
+ // const { Div } = NativeDocument.elements;
129
156
  // const { Observable } = NativeDocument;
130
157
 
131
158
  const user = Observable({ name: 'John', age: 25 });
132
- const greeting = Observable.computed(() => `Hello ${user.$value.name}!`, [user])
133
- // Or const greeting = Observable.computed(() => `Hello ${user.val().name}!`, [user])
159
+ const greeting = Observable.computed(() => `Hello ${user.val().name}!`, [user]);
134
160
 
135
161
  document.body.appendChild(Div(greeting));
136
162
 
137
- // user.name = 'Fausty'; // will not work
138
- // user.$value = { ...user.$value, name: ' Hermes!' }; // will work
139
- // user.set(data => ({ ...data, name: 'Hermes!' })); // will work
163
+ // Direct mutation won't trigger updates
164
+ // user.name = 'Fausty'; // Wrong!
165
+
166
+ // These will trigger updates:
167
+ user.$value = { ...user.$value, name: 'Hermes!' };
168
+ user.set(data => ({ ...data, name: 'Hermes!' }));
140
169
  user.set({ ...user.val(), name: 'Hermes!' });
141
170
  ```
142
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
+
143
202
  ### Elements
144
203
  Familiar HTML element creation with reactive bindings:
145
204
  ```javascript
146
- import { Div, Button } from 'native-document/src/elements'
147
- import { Observable } from 'native-document'
205
+ import { Div, Button } from 'native-document/elements';
206
+ import { Observable } from 'native-document';
148
207
 
149
208
  // CDN
150
- // const { Div, Button } = NativeDocument.elements;
209
+ // const { Div, Button } = NativeDocument.elements;
151
210
  // const { Observable } = NativeDocument;
152
211
 
153
- const App = function() {
154
- const isVisible = Observable(true)
155
-
212
+ const App = function() {
213
+ const isVisible = Observable(true);
214
+
156
215
  return Div([
157
216
  Div({
158
- class: { 'hidden': isVisible.check(v => !v) },
159
- style: { opacity: isVisible.check(v => v ? 1 : 0.2) }
217
+ class: { 'hidden': isVisible.isFalsy() },
218
+ style: { opacity: isVisible.format(v => v ? 1 : 0.2) }
160
219
  }, 'Content'),
161
- Button('Toggle').nd.onClick(() => isVisible.set(v => !v)),
220
+ Button('Toggle').nd
221
+ .onClick(() => isVisible.toggle()),
162
222
  ]);
163
223
  };
164
224
 
@@ -168,13 +228,15 @@ document.body.appendChild(App());
168
228
  ### Conditional Rendering
169
229
  Built-in components for dynamic content:
170
230
  ```javascript
171
- ShowIf(user.check(u => u.isLoggedIn),
172
- 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!')
173
235
  )
174
236
 
175
237
  Match(theme, {
176
- 'dark': Div({ class: 'dark-mode' }),
177
- 'light': Div({ class: 'light-mode' })
238
+ 'dark': Div({ class: 'dark-mode' }),
239
+ 'light': Div({ class: 'light-mode' })
178
240
  })
179
241
 
180
242
  Switch(condition, onTrue, onFalse)
@@ -184,41 +246,177 @@ When(condition)
184
246
  .otherwise(onFalse)
185
247
  ```
186
248
 
187
- ## Documentation
249
+ ### List Rendering
250
+ Efficient rendering of lists with automatic updates:
251
+ ```javascript
252
+ import { ForEach, Div } from 'native-document/elements';
253
+ import { Observable } from 'native-document';
188
254
 
189
- - **[Getting Started](docs/getting-started.md)** - Installation and first steps
190
- - **[Core Concepts](docs/core-concepts.md)** - Understanding the fundamentals
191
- - **[Observables](docs/observables.md)** - Reactive state management
192
- - **[Elements](docs/elements.md)** - Creating and composing UI
193
- - **[Conditional Rendering](docs/conditional-rendering.md)** - Dynamic content
194
- - **[List Rendering](docs/list-rendering.md)** - List Rendering
195
- - **[Routing](docs/routing.md)** - Navigation and URL management
196
- - **[State Management](docs/state-management.md)** - Global state patterns
197
- - **[Lifecycle Events](docs/lifecycle-events.md)** - Lifecycle events
198
- - **[Memory Management](docs/memory-management.md)** - Memory management
199
- - **[Anchor](docs/anchor.md)** - Anchor
200
-
201
- ## Examples
202
-
203
- ### Todo App
204
- ```bash
205
- # Complete todo application with local storage
206
- git clone https://github.com/afrocodeur/native-document-examples
207
- cd examples/todo-app
255
+ const items = Observable.array(['Apple', 'Banana', 'Cherry']);
256
+
257
+ ForEach(items, (item, index) =>
258
+ Div([index, '. ', item])
259
+ )
260
+
261
+ // With object arrays use a key function for efficient updates
262
+ const users = Observable.array([
263
+ { id: 1, name: 'Alice' },
264
+ { id: 2, name: 'Bob' }
265
+ ]);
266
+
267
+ ForEach(users, (user) =>
268
+ Div(user.name),
269
+ (user) => user.id // Key for efficient updates
270
+ )
208
271
  ```
209
272
 
210
- ### SPA Router
211
- ```bash
212
- # Single Page Application with routing
213
- cd examples/routing-spa
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')
214
296
  ```
215
297
 
216
- ### Reusable Components
217
- ```bash
218
- # Component library patterns
219
- cd examples/components
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)
220
359
  ```
221
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
+
365
+ ## Documentation
366
+
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)**
413
+
414
+ ### Utilities
415
+
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
419
+
222
420
  ## Key Features Deep Dive
223
421
 
224
422
  ### Performance Optimized
@@ -226,28 +424,34 @@ cd examples/components
226
424
  - Automatic batching of updates
227
425
  - Lazy evaluation of computed values
228
426
  - Efficient list rendering with keyed updates
427
+ - Tree-shaking — only bundle what you use
229
428
 
230
429
  ### Developer Experience
231
430
  ```javascript
431
+ import { ArgTypes } from 'native-document';
432
+
232
433
  // Built-in debugging
233
- Observable.debug.enable()
434
+ Observable.debug.enable();
234
435
 
235
436
  // Argument validation
236
- const createUser = (function (name, age) {
237
- // Auto-validates argument types
238
- }).args(ArgTypes.string('name'), ArgTypes.number('age'))
437
+ const createUser = (function(name, age) {
438
+ // Auto-validates argument types in development
439
+ }).args(ArgTypes.string('name'), ArgTypes.number('age'));
239
440
 
240
441
  // Error boundaries
241
- const AppWithBoundayError = App.errorBoundary(() => {
242
- return Div('Error in the Create User component');
243
- })
442
+ const SafeApp = App.errorBoundary((error, { caller, args }) => {
443
+ return Div({ class: 'error' }, [
444
+ 'An error occurred: ',
445
+ error.message
446
+ ]);
447
+ });
244
448
 
245
- document.body.appendChild(AppWithBoundayError());
449
+ document.body.appendChild(SafeApp());
246
450
  ```
247
451
 
248
452
  ## Contributing
249
453
 
250
- 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.
251
455
 
252
456
  ### Development Setup
253
457
  ```bash
@@ -287,11 +491,10 @@ Your support helps me:
287
491
 
288
492
  Thanks for your support! 🙏
289
493
 
290
-
291
494
  ## Acknowledgments
292
495
 
293
496
  Thanks to all contributors and the JavaScript community for inspiration.
294
497
 
295
498
  ---
296
499
 
297
- **Ready to build with native simplicity?** [Get Started ](docs/getting-started.md)
500
+ **Ready to build with native simplicity?** [Get Started ->](./getting-started.md)