native-document 1.0.14 → 1.0.16-8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/.npmrc.example +1 -0
  2. package/.vitepress/config.js +166 -0
  3. package/CHANGELOG.md +153 -0
  4. package/cdn.js +19 -0
  5. package/components.d.ts +2 -0
  6. package/components.js +30 -0
  7. package/devtools/ComponentRegistry.js +113 -0
  8. package/devtools/index.js +8 -0
  9. package/devtools/plugin/dev-tools-plugin.js +15 -0
  10. package/devtools/transformers/nd-vite-devtools.js +55 -0
  11. package/devtools/transformers/src/transformComponentForHrm.js +73 -0
  12. package/devtools/transformers/src/transformJsFile.js +9 -0
  13. package/devtools/transformers/src/utils.js +79 -0
  14. package/devtools/transformers/templates/hrm.hook.template.js +46 -0
  15. package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
  16. package/devtools/widget/Widget.js +49 -0
  17. package/devtools/widget/widget.css +81 -0
  18. package/devtools/widget.js +23 -0
  19. package/dist/native-document.components.min.css +1 -0
  20. package/dist/native-document.components.min.js +23847 -0
  21. package/dist/native-document.dev.js +8665 -1313
  22. package/dist/native-document.dev.js.map +1 -0
  23. package/dist/native-document.devtools.min.js +1 -0
  24. package/dist/native-document.min.js +1 -1
  25. package/docs/advanced-components.md +419 -0
  26. package/docs/anchor.md +218 -131
  27. package/docs/cache.md +180 -0
  28. package/docs/cli.md +179 -0
  29. package/docs/components/accordion.md +172 -0
  30. package/docs/components/alert.md +99 -0
  31. package/docs/components/avatar.md +160 -0
  32. package/docs/components/badge.md +102 -0
  33. package/docs/components/breadcrumb.md +89 -0
  34. package/docs/components/button.md +183 -0
  35. package/docs/components/card.md +69 -0
  36. package/docs/components/context-menu.md +118 -0
  37. package/docs/components/data-table.md +345 -0
  38. package/docs/components/dropdown.md +214 -0
  39. package/docs/components/form/autocomplete-field.md +81 -0
  40. package/docs/components/form/checkbox-field.md +41 -0
  41. package/docs/components/form/checkbox-group-field.md +54 -0
  42. package/docs/components/form/color-field.md +64 -0
  43. package/docs/components/form/date-field.md +92 -0
  44. package/docs/components/form/field-collection.md +63 -0
  45. package/docs/components/form/file-field.md +203 -0
  46. package/docs/components/form/form-control.md +87 -0
  47. package/docs/components/form/image-field.md +90 -0
  48. package/docs/components/form/index.md +115 -0
  49. package/docs/components/form/number-field.md +65 -0
  50. package/docs/components/form/radio-field.md +51 -0
  51. package/docs/components/form/select-field.md +123 -0
  52. package/docs/components/form/slider.md +136 -0
  53. package/docs/components/form/string-field.md +134 -0
  54. package/docs/components/form/textarea-field.md +65 -0
  55. package/docs/components/form-fields.md +372 -0
  56. package/docs/components/getting-started.md +264 -0
  57. package/docs/components/index.md +337 -0
  58. package/docs/components/layout.md +279 -0
  59. package/docs/components/list.md +73 -0
  60. package/docs/components/menu.md +215 -0
  61. package/docs/components/modal.md +156 -0
  62. package/docs/components/pagination.md +95 -0
  63. package/docs/components/popover.md +131 -0
  64. package/docs/components/progress.md +111 -0
  65. package/docs/components/shortcut-manager.md +221 -0
  66. package/docs/components/simple-table.md +107 -0
  67. package/docs/components/skeleton.md +155 -0
  68. package/docs/components/spinner.md +100 -0
  69. package/docs/components/splitter.md +133 -0
  70. package/docs/components/stepper.md +163 -0
  71. package/docs/components/switch.md +113 -0
  72. package/docs/components/tabs.md +153 -0
  73. package/docs/components/toast.md +119 -0
  74. package/docs/components/tooltip.md +151 -0
  75. package/docs/components/traits.md +261 -0
  76. package/docs/conditional-rendering.md +177 -501
  77. package/docs/contributing.md +300 -25
  78. package/docs/core-concepts.md +209 -367
  79. package/docs/elements.md +268 -255
  80. package/docs/extending-native-document-element.md +259 -0
  81. package/docs/filters.md +247 -0
  82. package/docs/getting-started.md +199 -260
  83. package/docs/i18n.md +241 -0
  84. package/docs/index.md +76 -0
  85. package/docs/lifecycle-events.md +146 -67
  86. package/docs/list-rendering.md +387 -0
  87. package/docs/memory-management.md +135 -46
  88. package/docs/native-document-element.md +487 -0
  89. package/docs/native-fetch.md +213 -0
  90. package/docs/observable-resource.md +364 -0
  91. package/docs/observables.md +690 -356
  92. package/docs/routing.md +246 -646
  93. package/docs/state-management.md +213 -306
  94. package/docs/svg-elements.md +231 -0
  95. package/docs/theming.md +409 -0
  96. package/docs/tutorials/.gitkeep +0 -0
  97. package/docs/validation.md +98 -93
  98. package/docs/vitepress-conventions.md +219 -0
  99. package/elements.d.ts +7 -0
  100. package/elements.js +3 -4
  101. package/eslint.config.js +35 -0
  102. package/i18n.js +1 -0
  103. package/i18n.ts +2 -0
  104. package/index.d.ts +21 -0
  105. package/index.def.js +1086 -0
  106. package/index.js +19 -8
  107. package/package.json +59 -9
  108. package/readme.md +294 -90
  109. package/rollup.config.js +52 -3
  110. package/router.d.ts +7 -0
  111. package/router.js +0 -0
  112. package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
  113. package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
  114. package/src/components/$traits/has-draggable/has-draggable.css +8 -0
  115. package/src/components/$traits/has-items/HasItems.d.ts +9 -0
  116. package/src/components/$traits/has-items/HasItems.js +64 -0
  117. package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
  118. package/src/components/$traits/has-position/HasFullPosition.js +95 -0
  119. package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
  120. package/src/components/$traits/has-position/HasPosition.js +45 -0
  121. package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
  122. package/src/components/$traits/has-resizable/HasResizable.js +122 -0
  123. package/src/components/$traits/has-resizable/has-resizable.css +121 -0
  124. package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
  125. package/src/components/$traits/has-validation/HasValidation.js +133 -0
  126. package/src/components/BaseComponent.d.ts +32 -0
  127. package/src/components/BaseComponent.js +247 -0
  128. package/src/components/accordion/Accordion.js +268 -0
  129. package/src/components/accordion/AccordionItem.js +233 -0
  130. package/src/components/accordion/index.js +7 -0
  131. package/src/components/accordion/types/Accordion.d.ts +47 -0
  132. package/src/components/accordion/types/AccordionItem.d.ts +48 -0
  133. package/src/components/alert/Alert.js +350 -0
  134. package/src/components/alert/index.js +6 -0
  135. package/src/components/alert/types/Alert.d.ts +62 -0
  136. package/src/components/avatar/Avatar.js +430 -0
  137. package/src/components/avatar/AvatarGroup.js +97 -0
  138. package/src/components/avatar/index.js +7 -0
  139. package/src/components/avatar/types/Avatar.d.ts +74 -0
  140. package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
  141. package/src/components/badge/Badge.js +245 -0
  142. package/src/components/badge/index.js +6 -0
  143. package/src/components/badge/types/Badge.d.ts +51 -0
  144. package/src/components/base-component.css +0 -0
  145. package/src/components/breadcrumb/BreadCrumb.js +138 -0
  146. package/src/components/breadcrumb/index.js +5 -0
  147. package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
  148. package/src/components/button/Button.js +320 -0
  149. package/src/components/button/index.js +5 -0
  150. package/src/components/button/types/Button.d.ts +62 -0
  151. package/src/components/card/Card.js +282 -0
  152. package/src/components/card/index.js +5 -0
  153. package/src/components/card/types/Card.d.ts +42 -0
  154. package/src/components/context-menu/ContextMenu.js +127 -0
  155. package/src/components/context-menu/ContextMenuGroup.js +29 -0
  156. package/src/components/context-menu/ContextMenuItem.js +28 -0
  157. package/src/components/context-menu/index.js +10 -0
  158. package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
  159. package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
  160. package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
  161. package/src/components/divider/Divider.js +256 -0
  162. package/src/components/divider/index.js +6 -0
  163. package/src/components/divider/types/Divider.d.ts +55 -0
  164. package/src/components/dropdown/Dropdown.js +531 -0
  165. package/src/components/dropdown/DropdownDivider.js +45 -0
  166. package/src/components/dropdown/DropdownGroup.js +83 -0
  167. package/src/components/dropdown/DropdownItem.js +150 -0
  168. package/src/components/dropdown/DropdownTrigger.js +93 -0
  169. package/src/components/dropdown/helpers.js +53 -0
  170. package/src/components/dropdown/index.js +13 -0
  171. package/src/components/dropdown/types/Dropdown.d.ts +88 -0
  172. package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
  173. package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
  174. package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
  175. package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
  176. package/src/components/form/FormControl.js +498 -0
  177. package/src/components/form/field/Field.js +419 -0
  178. package/src/components/form/field/FieldCollection.js +292 -0
  179. package/src/components/form/field/types/AutocompleteField.js +168 -0
  180. package/src/components/form/field/types/CheckboxField.js +77 -0
  181. package/src/components/form/field/types/CheckboxGroupField.js +171 -0
  182. package/src/components/form/field/types/ColorField.js +102 -0
  183. package/src/components/form/field/types/DateField.js +315 -0
  184. package/src/components/form/field/types/EmailField.js +104 -0
  185. package/src/components/form/field/types/FileField.js +276 -0
  186. package/src/components/form/field/types/HiddenField.js +44 -0
  187. package/src/components/form/field/types/ImageField.js +138 -0
  188. package/src/components/form/field/types/NumberField.js +177 -0
  189. package/src/components/form/field/types/PasswordField.js +200 -0
  190. package/src/components/form/field/types/RadioField.js +145 -0
  191. package/src/components/form/field/types/RangeField.js +117 -0
  192. package/src/components/form/field/types/SearchField.js +66 -0
  193. package/src/components/form/field/types/SelectField.js +247 -0
  194. package/src/components/form/field/types/StringField.js +148 -0
  195. package/src/components/form/field/types/TelField.js +98 -0
  196. package/src/components/form/field/types/TextAreaField.js +142 -0
  197. package/src/components/form/field/types/TimeField.js +215 -0
  198. package/src/components/form/field/types/UrlField.js +115 -0
  199. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
  200. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
  201. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
  202. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
  203. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
  204. package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
  205. package/src/components/form/index.js +61 -0
  206. package/src/components/form/merge +0 -0
  207. package/src/components/form/types/Field.d.ts +73 -0
  208. package/src/components/form/types/FieldCollection.d.ts +53 -0
  209. package/src/components/form/types/FormControl.d.ts +64 -0
  210. package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
  211. package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
  212. package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
  213. package/src/components/form/types/fields/ColorField.d.ts +37 -0
  214. package/src/components/form/types/fields/DateField.d.ts +70 -0
  215. package/src/components/form/types/fields/EmailField.d.ts +35 -0
  216. package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
  217. package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
  218. package/src/components/form/types/fields/FileField.d.ts +56 -0
  219. package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
  220. package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
  221. package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
  222. package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
  223. package/src/components/form/types/fields/HiddenField.d.ts +26 -0
  224. package/src/components/form/types/fields/ImageField.d.ts +45 -0
  225. package/src/components/form/types/fields/NumberField.d.ts +48 -0
  226. package/src/components/form/types/fields/PasswordField.d.ts +46 -0
  227. package/src/components/form/types/fields/RadioField.d.ts +48 -0
  228. package/src/components/form/types/fields/RangeField.d.ts +44 -0
  229. package/src/components/form/types/fields/SearchField.d.ts +34 -0
  230. package/src/components/form/types/fields/SelectField.d.ts +71 -0
  231. package/src/components/form/types/fields/StringField.d.ts +48 -0
  232. package/src/components/form/types/fields/TelField.d.ts +37 -0
  233. package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
  234. package/src/components/form/types/fields/TimeField.d.ts +51 -0
  235. package/src/components/form/types/fields/UrlField.d.ts +35 -0
  236. package/src/components/form/utils.js +17 -0
  237. package/src/components/form/validation/Validation.js +565 -0
  238. package/src/components/index.d.ts +160 -0
  239. package/src/components/list/HasListItem.js +171 -0
  240. package/src/components/list/List.js +125 -0
  241. package/src/components/list/ListDivider.js +39 -0
  242. package/src/components/list/ListGroup.js +135 -0
  243. package/src/components/list/ListItem.js +212 -0
  244. package/src/components/list/index.js +12 -0
  245. package/src/components/list/types/List.d.ts +43 -0
  246. package/src/components/list/types/ListGroup.d.ts +37 -0
  247. package/src/components/list/types/ListItem.d.ts +53 -0
  248. package/src/components/menu/HasMenuItem.js +182 -0
  249. package/src/components/menu/Menu.js +227 -0
  250. package/src/components/menu/MenuDivider.js +37 -0
  251. package/src/components/menu/MenuGroup.js +126 -0
  252. package/src/components/menu/MenuItem.js +190 -0
  253. package/src/components/menu/MenuLink.js +51 -0
  254. package/src/components/menu/index.js +14 -0
  255. package/src/components/menu/types/Menu.d.ts +60 -0
  256. package/src/components/menu/types/MenuDivider.d.ts +19 -0
  257. package/src/components/menu/types/MenuGroup.d.ts +44 -0
  258. package/src/components/menu/types/MenuItem.d.ts +46 -0
  259. package/src/components/menu/types/MenuLink.d.ts +16 -0
  260. package/src/components/modal/Modal.js +524 -0
  261. package/src/components/modal/index.js +5 -0
  262. package/src/components/modal/types/Modal.d.ts +94 -0
  263. package/src/components/pagination/Pagination.js +411 -0
  264. package/src/components/pagination/index.js +5 -0
  265. package/src/components/pagination/types/Pagination.d.ts +68 -0
  266. package/src/components/popover/Popover.js +459 -0
  267. package/src/components/popover/PopoverFooter.js +61 -0
  268. package/src/components/popover/PopoverHeader.js +68 -0
  269. package/src/components/popover/index.js +10 -0
  270. package/src/components/popover/types/Popover.d.ts +83 -0
  271. package/src/components/popover/types/PopoverFooter.d.ts +24 -0
  272. package/src/components/popover/types/PopoverHeader.d.ts +26 -0
  273. package/src/components/progress/Progress.js +401 -0
  274. package/src/components/progress/index.js +6 -0
  275. package/src/components/progress/types/Progress.d.ts +77 -0
  276. package/src/components/skeleton/Skeleton.js +228 -0
  277. package/src/components/skeleton/index.js +6 -0
  278. package/src/components/skeleton/types/Skeleton.d.ts +55 -0
  279. package/src/components/slider/Slider.js +406 -0
  280. package/src/components/slider/index.js +5 -0
  281. package/src/components/slider/types/Slider.d.ts +82 -0
  282. package/src/components/spacer/Spacer.js +27 -0
  283. package/src/components/spacer/index.js +5 -0
  284. package/src/components/spacer/types/Spacer.d.ts +19 -0
  285. package/src/components/spinner/Spinner.js +350 -0
  286. package/src/components/spinner/index.js +5 -0
  287. package/src/components/spinner/types/Spinner.d.ts +71 -0
  288. package/src/components/splitter/Splitter.js +164 -0
  289. package/src/components/splitter/SplitterGutter.js +140 -0
  290. package/src/components/splitter/SplitterPanel.js +143 -0
  291. package/src/components/splitter/index.js +10 -0
  292. package/src/components/splitter/types/Splitter.d.ts +38 -0
  293. package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
  294. package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
  295. package/src/components/stacks/AbsoluteStack.js +53 -0
  296. package/src/components/stacks/FixedStack.js +53 -0
  297. package/src/components/stacks/HStack.js +54 -0
  298. package/src/components/stacks/PositionStack.js +254 -0
  299. package/src/components/stacks/RelativeStack.js +53 -0
  300. package/src/components/stacks/Stack.js +166 -0
  301. package/src/components/stacks/VStack.js +55 -0
  302. package/src/components/stacks/index.js +21 -0
  303. package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
  304. package/src/components/stacks/types/FixedStack.d.ts +16 -0
  305. package/src/components/stacks/types/HStack.d.ts +16 -0
  306. package/src/components/stacks/types/PositionStack.d.ts +54 -0
  307. package/src/components/stacks/types/RelativeStack.d.ts +17 -0
  308. package/src/components/stacks/types/Stack.d.ts +39 -0
  309. package/src/components/stacks/types/VStack.d.ts +16 -0
  310. package/src/components/stepper/Stepper.js +461 -0
  311. package/src/components/stepper/StepperStep.js +241 -0
  312. package/src/components/stepper/index.js +8 -0
  313. package/src/components/stepper/types/Stepper.d.ts +68 -0
  314. package/src/components/stepper/types/StepperStep.d.ts +54 -0
  315. package/src/components/switch/Switch.js +266 -0
  316. package/src/components/switch/index.js +6 -0
  317. package/src/components/switch/types/Switch.d.ts +55 -0
  318. package/src/components/table/Column.js +212 -0
  319. package/src/components/table/ColumnGroup.js +90 -0
  320. package/src/components/table/DataTable.js +720 -0
  321. package/src/components/table/SimpleTable.js +139 -0
  322. package/src/components/table/index.js +7 -0
  323. package/src/components/table/types/Column.d.ts +49 -0
  324. package/src/components/table/types/ColumnGroup.d.ts +28 -0
  325. package/src/components/table/types/DataTable.d.ts +97 -0
  326. package/src/components/table/types/SimpleTable.d.ts +40 -0
  327. package/src/components/tabs/Tabs.js +395 -0
  328. package/src/components/tabs/index.js +6 -0
  329. package/src/components/tabs/types/Tabs.d.ts +78 -0
  330. package/src/components/toast/Toast.js +262 -0
  331. package/src/components/toast/ToastError.js +0 -0
  332. package/src/components/toast/ToastInfo.js +0 -0
  333. package/src/components/toast/ToastSuccess.js +0 -0
  334. package/src/components/toast/ToastWarning.js +0 -0
  335. package/src/components/toast/index.js +5 -0
  336. package/src/components/toast/types/Toast.d.ts +57 -0
  337. package/src/components/toast/types/ToastError.d.ts +7 -0
  338. package/src/components/toast/types/ToastInfo.d.ts +7 -0
  339. package/src/components/toast/types/ToastSuccess.d.ts +7 -0
  340. package/src/components/toast/types/ToastWarning.d.ts +7 -0
  341. package/src/components/tooltip/Tooltip.js +359 -0
  342. package/src/components/tooltip/index.js +5 -0
  343. package/src/components/tooltip/prototypes.js +6 -0
  344. package/src/components/tooltip/types/Tooltip.d.ts +65 -0
  345. package/src/{data → core/data}/MemoryManager.js +9 -22
  346. package/src/core/data/Observable.js +227 -0
  347. package/src/core/data/ObservableArray.js +522 -0
  348. package/src/core/data/ObservableChecker.js +39 -0
  349. package/src/core/data/ObservableItem.js +611 -0
  350. package/src/core/data/ObservableObject.js +274 -0
  351. package/src/core/data/ObservableResource.js +315 -0
  352. package/src/core/data/ObservableWhen.js +54 -0
  353. package/src/core/data/Store.js +520 -0
  354. package/src/core/data/observable-helpers/observable.is-to.js +390 -0
  355. package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
  356. package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
  357. package/src/core/elements/anchor/anchor.js +210 -0
  358. package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
  359. package/src/core/elements/content-formatter.js +169 -0
  360. package/src/core/elements/control/for-each-array.js +292 -0
  361. package/src/core/elements/control/for-each.js +170 -0
  362. package/src/core/elements/control/show-if.js +94 -0
  363. package/src/core/elements/control/show-when.js +54 -0
  364. package/src/core/elements/control/switch.js +141 -0
  365. package/src/core/elements/description-list.js +19 -0
  366. package/src/core/elements/form.js +255 -0
  367. package/src/core/elements/fragment.js +8 -0
  368. package/src/core/elements/html5-semantics.js +55 -0
  369. package/src/core/elements/img.js +59 -0
  370. package/src/{elements → core/elements}/index.js +5 -4
  371. package/src/core/elements/interactive.js +25 -0
  372. package/src/core/elements/list.js +37 -0
  373. package/src/core/elements/medias.js +37 -0
  374. package/src/core/elements/meta-data.js +43 -0
  375. package/src/core/elements/svg.js +61 -0
  376. package/src/core/elements/table.js +73 -0
  377. package/src/{errors → core/errors}/ArgTypesError.js +1 -1
  378. package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
  379. package/src/core/utils/HasEventEmitter.js +85 -0
  380. package/src/core/utils/args-types.js +140 -0
  381. package/src/core/utils/cache.js +5 -0
  382. package/src/core/utils/callback-handler.js +50 -0
  383. package/src/core/utils/debug-manager.js +40 -0
  384. package/src/core/utils/events.js +148 -0
  385. package/src/core/utils/filters/date.js +178 -0
  386. package/src/core/utils/filters/index.js +4 -0
  387. package/src/core/utils/filters/standard.js +263 -0
  388. package/src/core/utils/filters/strings.js +67 -0
  389. package/src/core/utils/filters/utils.js +77 -0
  390. package/src/core/utils/formatters.js +90 -0
  391. package/src/core/utils/helpers.js +144 -0
  392. package/src/core/utils/localstorage.js +57 -0
  393. package/src/core/utils/memoize.js +115 -0
  394. package/src/core/utils/plugins-manager.js +81 -0
  395. package/src/core/utils/property-accumulator.js +72 -0
  396. package/src/core/utils/prototypes.js +44 -0
  397. package/src/core/utils/shortcut-manager.js +242 -0
  398. package/src/{utils → core/utils}/validator.js +58 -22
  399. package/src/core/wrappers/AttributesWrapper.js +181 -0
  400. package/src/core/wrappers/DocumentObserver.js +182 -0
  401. package/src/core/wrappers/ElementCreator.js +110 -0
  402. package/src/core/wrappers/HtmlElementWrapper.js +98 -0
  403. package/src/core/wrappers/NDElement.js +613 -0
  404. package/src/core/wrappers/NdPrototype.js +233 -0
  405. package/src/core/wrappers/SingletonView.js +99 -0
  406. package/src/core/wrappers/SvgElementWrapper.js +15 -0
  407. package/src/core/wrappers/TemplateBinding.js +7 -0
  408. package/src/core/wrappers/constants.js +66 -0
  409. package/src/core/wrappers/prototypes/attributes-extensions.js +24 -0
  410. package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
  411. package/src/core/wrappers/prototypes/nd-element-extensions.js +149 -0
  412. package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
  413. package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
  414. package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
  415. package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
  416. package/src/core/wrappers/template-cloner/utils.js +173 -0
  417. package/src/fetch/NativeFetch.js +89 -0
  418. package/src/i18n/bin/scan.js +132 -0
  419. package/src/i18n/index.d.ts +2 -0
  420. package/src/i18n/service/I18nService.d.ts +27 -0
  421. package/src/i18n/service/I18nService.js +46 -0
  422. package/src/i18n/service/functions.d.ts +22 -0
  423. package/src/i18n/service/functions.js +29 -0
  424. package/src/router/Route.js +33 -8
  425. package/src/router/RouteGroupHelper.js +10 -2
  426. package/src/router/Router.js +63 -22
  427. package/src/router/RouterComponent.js +114 -6
  428. package/src/{errors → router/errors}/RouterError.js +0 -1
  429. package/src/router/link.js +9 -10
  430. package/src/router/modes/HashRouter.js +2 -2
  431. package/src/router/modes/HistoryRouter.js +2 -3
  432. package/src/router/modes/MemoryRouter.js +1 -1
  433. package/src/ui/components/accordion/AccordionItemRender.js +63 -0
  434. package/src/ui/components/accordion/AccordionRender.js +35 -0
  435. package/src/ui/components/accordion/accordion.css +121 -0
  436. package/src/ui/components/alert/AlertRender.js +81 -0
  437. package/src/ui/components/alert/alert.css +163 -0
  438. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
  439. package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
  440. package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
  441. package/src/ui/components/avatar/avatar/avatar.css +189 -0
  442. package/src/ui/components/badge/BadgeRender.js +25 -0
  443. package/src/ui/components/badge/badge.css +168 -0
  444. package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
  445. package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
  446. package/src/ui/components/button/ButtonRender.js +65 -0
  447. package/src/ui/components/button/button.css +296 -0
  448. package/src/ui/components/card/CardRender.js +133 -0
  449. package/src/ui/components/card/card.css +169 -0
  450. package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
  451. package/src/ui/components/contextmenu/contextmenu.css +36 -0
  452. package/src/ui/components/divider/DividerRender.js +70 -0
  453. package/src/ui/components/divider/divider.css +70 -0
  454. package/src/ui/components/dropdown/DropdownRender.js +92 -0
  455. package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
  456. package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
  457. package/src/ui/components/dropdown/dropdown.css +179 -0
  458. package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
  459. package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
  460. package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
  461. package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
  462. package/src/ui/components/form/FieldCollectionRender.js +110 -0
  463. package/src/ui/components/form/FormControlRender.js +85 -0
  464. package/src/ui/components/form/field-collection.css +55 -0
  465. package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
  466. package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
  467. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
  468. package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
  469. package/src/ui/components/form/fields/DateFieldRender.js +155 -0
  470. package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
  471. package/src/ui/components/form/fields/FieldRender.js +118 -0
  472. package/src/ui/components/form/fields/FileFieldRender.js +41 -0
  473. package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
  474. package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
  475. package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
  476. package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
  477. package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
  478. package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
  479. package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
  480. package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
  481. package/src/ui/components/form/fields/StringFieldRender.js +6 -0
  482. package/src/ui/components/form/fields/TelFieldRender.js +6 -0
  483. package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
  484. package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
  485. package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
  486. package/src/ui/components/form/fields/date-field.css +32 -0
  487. package/src/ui/components/form/fields/field.css +402 -0
  488. package/src/ui/components/form/fields/file-field.css +79 -0
  489. package/src/ui/components/form/fields/password-field.css +50 -0
  490. package/src/ui/components/form/fields/range-field.css +120 -0
  491. package/src/ui/components/form/fields/slider.css +195 -0
  492. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
  493. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
  494. package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
  495. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
  496. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
  497. package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
  498. package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
  499. package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
  500. package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
  501. package/src/ui/components/form/form-control.css +40 -0
  502. package/src/ui/components/form/helpers.js +111 -0
  503. package/src/ui/components/form/index.js +27 -0
  504. package/src/ui/components/list/ListRender.js +18 -0
  505. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  506. package/src/ui/components/list/divider/list-divider.css +12 -0
  507. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  508. package/src/ui/components/list/group/list-group.css +62 -0
  509. package/src/ui/components/list/item/ListItemRender.js +238 -0
  510. package/src/ui/components/list/item/list-item.css +191 -0
  511. package/src/ui/components/list/list.css +24 -0
  512. package/src/ui/components/menu/MenuDividerRender.js +12 -0
  513. package/src/ui/components/menu/MenuGroupRender.js +59 -0
  514. package/src/ui/components/menu/MenuItemRender.js +57 -0
  515. package/src/ui/components/menu/MenuLinkRender.js +55 -0
  516. package/src/ui/components/menu/MenuRender.js +22 -0
  517. package/src/ui/components/menu/helpers.js +121 -0
  518. package/src/ui/components/menu/menu.css +308 -0
  519. package/src/ui/components/modal/ModalRender.js +118 -0
  520. package/src/ui/components/modal/modal.css +156 -0
  521. package/src/ui/components/pagination/PaginationRender.js +112 -0
  522. package/src/ui/components/pagination/pagination.css +63 -0
  523. package/src/ui/components/popover/PopoverRender.js +233 -0
  524. package/src/ui/components/popover/popover.css +139 -0
  525. package/src/ui/components/progress/ProgressRender.js +168 -0
  526. package/src/ui/components/progress/progress.css +197 -0
  527. package/src/ui/components/skeleton/SkeletonRender.js +136 -0
  528. package/src/ui/components/skeleton/skeleton.css +154 -0
  529. package/src/ui/components/spacer/SpacerRender.js +10 -0
  530. package/src/ui/components/spinner/SpinnerRender.js +47 -0
  531. package/src/ui/components/spinner/spinner.css +152 -0
  532. package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
  533. package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
  534. package/src/ui/components/splitter/SplitterRender.js +75 -0
  535. package/src/ui/components/splitter/splitter.css +128 -0
  536. package/src/ui/components/stacks/PositionStackRender.js +39 -0
  537. package/src/ui/components/stacks/StackRender.js +41 -0
  538. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
  539. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
  540. package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
  541. package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
  542. package/src/ui/components/stacks/index.js +5 -0
  543. package/src/ui/components/stacks/position-stack.css +62 -0
  544. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
  545. package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
  546. package/src/ui/components/stacks/stack.css +78 -0
  547. package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
  548. package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
  549. package/src/ui/components/stepper/StepperRender.js +71 -0
  550. package/src/ui/components/stepper/StepperStepRender.js +67 -0
  551. package/src/ui/components/stepper/stepper.css +359 -0
  552. package/src/ui/components/switch/SwitchRender.js +83 -0
  553. package/src/ui/components/switch/switch.css +143 -0
  554. package/src/ui/components/table/data-table/DataTableRender.js +50 -0
  555. package/src/ui/components/table/data-table/bulk-actions.js +34 -0
  556. package/src/ui/components/table/data-table/data-table.css +246 -0
  557. package/src/ui/components/table/data-table/pagination.js +56 -0
  558. package/src/ui/components/table/data-table/tables.js +368 -0
  559. package/src/ui/components/table/data-table/toolbar.js +67 -0
  560. package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
  561. package/src/ui/components/table/simple-table/simple-table.css +50 -0
  562. package/src/ui/components/tabs/TabsRender.js +226 -0
  563. package/src/ui/components/tabs/tabs.css +253 -0
  564. package/src/ui/components/toast/ToastRender.js +99 -0
  565. package/src/ui/components/toast/toast.css +201 -0
  566. package/src/ui/components/tooltip/TooltipRender.js +8 -0
  567. package/src/ui/components/tooltip/tooltip.css +113 -0
  568. package/src/ui/index.js +47 -0
  569. package/src/ui/theme.js +0 -0
  570. package/src/ui/theme.scss +1 -0
  571. package/src/ui/tokens/animation.scss +36 -0
  572. package/src/ui/tokens/colors-dark.scss +58 -0
  573. package/src/ui/tokens/colors.scss +54 -0
  574. package/src/ui/tokens/components.scss +32 -0
  575. package/src/ui/tokens/fonts.scss +57 -0
  576. package/src/ui/tokens/glass.scss +10 -0
  577. package/src/ui/tokens/index.scss +38 -0
  578. package/src/ui/tokens/layouts.scss +228 -0
  579. package/src/ui/tokens/opacity.scss +21 -0
  580. package/src/ui/tokens/others.scss +11 -0
  581. package/src/ui/tokens/radius.scss +6 -0
  582. package/src/ui/tokens/reset.scss +51 -0
  583. package/src/ui/tokens/shadows.scss +29 -0
  584. package/src/ui/tokens/spacings.scss +13 -0
  585. package/src/ui/tokens/vars.scss +35 -0
  586. package/src/ui/tokens/viewports.scss +30 -0
  587. package/types/args-types.d.ts +58 -0
  588. package/types/control-flow.d.ts +62 -0
  589. package/types/elements.d.ts +231 -0
  590. package/types/filters/dates.d.ts +43 -0
  591. package/types/filters/index.d.ts +4 -0
  592. package/types/filters/standard.d.ts +70 -0
  593. package/types/filters/strings.d.ts +21 -0
  594. package/types/filters/types.d.ts +20 -0
  595. package/types/forms.d.ts +84 -0
  596. package/types/globals.d.ts +543 -0
  597. package/types/images.d.ts +23 -0
  598. package/types/localStorage.ts +102 -0
  599. package/types/memoize.d.ts +26 -0
  600. package/types/native-fetch.d.ts +72 -0
  601. package/types/nd-element.d.ts +407 -0
  602. package/types/observable-resource.d.ts +3 -0
  603. package/types/observable.d.ts +227 -0
  604. package/types/plugins-manager.d.ts +65 -0
  605. package/types/polyfill.d.ts +18 -0
  606. package/types/property-accumulator.d.ts +33 -0
  607. package/types/router.d.ts +85 -0
  608. package/types/service.d.ts +23 -0
  609. package/types/singleton.d.ts +19 -0
  610. package/types/store.d.ts +63 -0
  611. package/types/template-cloner.ts +43 -0
  612. package/types/validator.ts +66 -0
  613. package/ui.js +1 -0
  614. package/utils.d.ts +4 -0
  615. package/utils.js +12 -0
  616. package/src/data/Observable.js +0 -233
  617. package/src/data/ObservableChecker.js +0 -38
  618. package/src/data/ObservableItem.js +0 -116
  619. package/src/data/Store.js +0 -74
  620. package/src/elements/anchor.js +0 -84
  621. package/src/elements/content-formatter.js +0 -32
  622. package/src/elements/control/for-each.js +0 -174
  623. package/src/elements/control/show-if.js +0 -79
  624. package/src/elements/control/switch.js +0 -98
  625. package/src/elements/description-list.js +0 -5
  626. package/src/elements/form.js +0 -71
  627. package/src/elements/html5-semantics.js +0 -12
  628. package/src/elements/img.js +0 -45
  629. package/src/elements/interactive.js +0 -7
  630. package/src/elements/list.js +0 -6
  631. package/src/elements/medias.js +0 -8
  632. package/src/elements/meta-data.js +0 -9
  633. package/src/elements/table.js +0 -14
  634. package/src/utils/args-types.js +0 -100
  635. package/src/utils/debug-manager.js +0 -31
  636. package/src/utils/helpers.js +0 -37
  637. package/src/utils/plugins-manager.js +0 -12
  638. package/src/utils/prototypes.js +0 -45
  639. package/src/wrappers/AttributesWrapper.js +0 -157
  640. package/src/wrappers/DocumentObserver.js +0 -51
  641. package/src/wrappers/HtmlElementEventsWrapper.js +0 -77
  642. package/src/wrappers/HtmlElementWrapper.js +0 -206
  643. package/src/wrappers/constants.js +0 -2
package/index.js CHANGED
@@ -1,13 +1,24 @@
1
- export { default as HtmlElementWrapper, ElementCreator } from './src/wrappers/HtmlElementWrapper'
2
1
 
3
- import './src/utils/prototypes.js';
4
2
 
5
- export * from './src/utils/plugins-manager';
6
- export * from './src/utils/args-types';
7
- export * from './src/utils/validator'
8
- export * from './src/data/Observable';
9
- 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
+
10
20
  import * as elements from './elements';
11
21
  import * as router from './router';
22
+ import * as utils from './utils';
12
23
 
13
- 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.14",
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.on.click(() => 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.on.click(() => {
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.on.click(() => 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.on.click(() => 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,40 +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
- - **[Routing](docs/routing.md)** - Navigation and URL management
195
- - **[State Management](docs/state-management.md)** - Global state patterns
196
- - **[Lifecycle Events](docs/lifecycle-events.md)** - Lifecycle events
197
- - **[Memory Management](docs/memory-management.md)** - Memory management
198
- - **[Anchor](docs/anchor.md)** - Anchor
255
+ const items = Observable.array(['Apple', 'Banana', 'Cherry']);
199
256
 
200
- ## Examples
257
+ ForEach(items, (item, index) =>
258
+ Div([index, '. ', item])
259
+ )
201
260
 
202
- ### Todo App
203
- ```bash
204
- # Complete todo application with local storage
205
- git clone https://github.com/afrocodeur/native-document-examples
206
- cd examples/todo-app
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
+ )
207
271
  ```
208
272
 
209
- ### SPA Router
210
- ```bash
211
- # Single Page Application with routing
212
- 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')
213
296
  ```
214
297
 
215
- ### Reusable Components
216
- ```bash
217
- # Component library patterns
218
- 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)
219
359
  ```
220
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
+
221
420
  ## Key Features Deep Dive
222
421
 
223
422
  ### Performance Optimized
@@ -225,28 +424,34 @@ cd examples/components
225
424
  - Automatic batching of updates
226
425
  - Lazy evaluation of computed values
227
426
  - Efficient list rendering with keyed updates
427
+ - Tree-shaking — only bundle what you use
228
428
 
229
429
  ### Developer Experience
230
430
  ```javascript
431
+ import { ArgTypes } from 'native-document';
432
+
231
433
  // Built-in debugging
232
- Observable.debug.enable()
434
+ Observable.debug.enable();
233
435
 
234
436
  // Argument validation
235
- const createUser = (function (name, age) {
236
- // Auto-validates argument types
237
- }).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'));
238
440
 
239
441
  // Error boundaries
240
- const AppWithBoundayError = App.errorBoundary(() => {
241
- return Div('Error in the Create User component');
242
- })
442
+ const SafeApp = App.errorBoundary((error, { caller, args }) => {
443
+ return Div({ class: 'error' }, [
444
+ 'An error occurred: ',
445
+ error.message
446
+ ]);
447
+ });
243
448
 
244
- document.body.appendChild(AppWithBoundayError());
449
+ document.body.appendChild(SafeApp());
245
450
  ```
246
451
 
247
452
  ## Contributing
248
453
 
249
- 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.
250
455
 
251
456
  ### Development Setup
252
457
  ```bash
@@ -286,11 +491,10 @@ Your support helps me:
286
491
 
287
492
  Thanks for your support! 🙏
288
493
 
289
-
290
494
  ## Acknowledgments
291
495
 
292
496
  Thanks to all contributors and the JavaScript community for inspiration.
293
497
 
294
498
  ---
295
499
 
296
- **Ready to build with native simplicity?** [Get Started ](docs/getting-started.md)
500
+ **Ready to build with native simplicity?** [Get Started ->](./getting-started.md)