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/docs/elements.md CHANGED
@@ -1,384 +1,396 @@
1
+ ---
2
+ title: Elements
3
+ description: Create reactive HTML elements with a declarative syntax - every HTML element has a corresponding function in NativeDocument
4
+ ---
5
+
1
6
  # Elements
2
7
 
3
- NativeDocument provides a simple and intuitive way to create HTML elements with a declarative syntax. Every HTML element has a corresponding function that creates reactive DOM elements.
8
+ NativeDocument provides a simple and intuitive way to create HTML elements with a declarative syntax. Every HTML element has a corresponding function that creates a reactive DOM element.
4
9
 
5
10
  ## Basic Element Creation
6
11
 
7
12
  ```javascript
8
- // Simple elements with attributes
9
- const title = H1({ class: "main-title" }, "Welcome to my app");
10
- const description = P({ class: "description" }, "This is a paragraph");
13
+ // With attributes
14
+ const title = H1({ class: 'main-title' }, 'Welcome to my app');
15
+ const description = P({ class: 'description' }, 'This is a paragraph');
11
16
 
12
- // Elements without attributes (attributes omitted)
13
- const simpleTitle = H1("Welcome to my app");
14
- const simplePara = P("This is a paragraph");
15
- const container = Div("Content here");
17
+ // Without attributes
18
+ const simpleTitle = H1('Welcome to my app');
19
+ const simplePara = P('This is a paragraph');
20
+ const container = Div('Content here');
16
21
 
17
- // Elements without content
22
+ // Self-closing elements
18
23
  const separator = Hr();
19
- const lineBreak = Br();
24
+ const lineBreak = Br();
20
25
  ```
21
26
 
22
27
  ## Element Structure
23
28
 
24
29
  All element functions follow the same pattern:
30
+
25
31
  ```javascript
26
32
  ElementName(attributes, children)
27
33
  // or
28
34
  ElementName(children) // attributes are optional
29
35
  ```
30
36
 
31
- - **attributes**: Object with HTML attributes (optional, can be `null` or omitted)
32
- - **children**: Content inside the element (text, number, observable, other elements, or arrays)
37
+ - **attributes** - object with HTML attributes (optional, can be `null` or omitted)
38
+ - **children** - text, number, observable, other elements, closures (no-param functions), or an array of any of these. Closures are accepted as-is - no need to call them if they take no parameters.
33
39
 
34
40
  ## Working with Attributes
35
41
 
36
42
  ```javascript
37
43
  // Static attributes
38
- const link = Link({
39
- href: "/about",
40
- class: "nav-link",
41
- id: "about-link"
42
- }, "About Us");
44
+ const link = Link({
45
+ href: '/about',
46
+ class: 'nav-link',
47
+ id: 'about-link'
48
+ }, 'About Us');
43
49
 
44
50
  // Boolean attributes
45
- const input = Input({
46
- type: "checkbox",
47
- checked: true,
48
- disabled: false
51
+ const checkbox = Input({
52
+ type: 'checkbox',
53
+ checked: true,
54
+ disabled: false
49
55
  });
50
56
 
51
57
  // Data attributes
52
- const element = Div({
53
- "data-id": "123",
54
- "data-category": "important"
55
- }, "Content");
58
+ const card = Div({
59
+ 'data-id': '123',
60
+ 'data-category': 'important'
61
+ }, 'Content');
56
62
  ```
57
63
 
58
- ## Reactive Attributes with Observables
64
+ ## Reactive Attributes
65
+
66
+ Pass an observable directly as an attribute value - it updates automatically when the observable changes:
59
67
 
60
68
  ```javascript
61
69
  const isVisible = Observable(true);
62
- const userName = Observable("Guest");
63
- const theme = Observable("dark");
70
+ const userName = Observable('Guest');
71
+ const theme = Observable('dark');
64
72
 
65
- // Reactive attributes
66
73
  const greeting = Div({
67
- class: theme, // Updates when theme changes
68
- hidden: isVisible.check(val => !val) // Hide when isVisible is false
69
- }, `Hello ${userName}!`); // Reactive text content
74
+ class: theme,
75
+ hidden: isVisible.isFalsy()
76
+ }, ['Hello ', userName, '!']);
70
77
 
71
78
  // Reactive styles
72
79
  const box = Div({
73
- style: {
74
- backgroundColor: theme.check(t => t === "dark" ? "#333" : "#fff"),
75
- color: theme.check(t => t === "dark" ? "#fff" : "#333")
76
- }
77
- }, "Themed content");
80
+ style: {
81
+ backgroundColor: theme.is('dark').check(v => v ? '#333' : '#fff'),
82
+ color: theme.is('dark').check(v => v ? '#fff' : '#333')
83
+ }
84
+ }, 'Themed content');
85
+ ```
86
+
87
+ ## Conditional Classes
88
+
89
+ ```javascript
90
+ const isActive = Observable(false);
91
+ const count = Observable(0);
92
+
93
+ const item = Div({
94
+ class: {
95
+ 'item': true, // always present
96
+ 'active': isActive, // present when isActive is true
97
+ 'highlighted': count.check(c => c > 5) // present when count > 5
98
+ }
99
+ }, 'List item');
78
100
  ```
79
101
 
80
102
  ## Children and Content
81
103
 
82
104
  ```javascript
83
- // Text content (no attributes needed)
84
- const simple = P("Simple text");
105
+ // Single text child
106
+ const simple = P('Simple text');
85
107
 
86
- // Single child element
87
- const wrapper = Div({ class: "wrapper" },
88
- P("Wrapped paragraph")
89
- );
108
+ // Single element child
109
+ const wrapper = Div({ class: 'wrapper' }, P('Wrapped paragraph'));
90
110
 
91
111
  // Multiple children as array
92
- const list = Div({ class: "item-list" }, [
93
- P("First item"),
94
- P("Second item"),
95
- P("Third item")
112
+ const list = Div({ class: 'item-list' }, [
113
+ P('First item'),
114
+ P('Second item'),
115
+ P('Third item')
96
116
  ]);
97
117
 
98
118
  // Mixed content
99
119
  const mixed = Div([
100
- H2("Title"),
101
- "Some text between elements",
102
- P("A paragraph"),
103
- Button("Click me")
120
+ H2('Title'),
121
+ 'Some text between elements',
122
+ P('A paragraph'),
123
+ Button('Click me')
104
124
  ]);
105
125
  ```
106
126
 
107
- ## Event Handling with .nd API
127
+ ## Event Handling with the `.nd` API
108
128
 
109
- The `.nd` (NativeDocument) API provides a fluent interface for adding functionality to elements.
129
+ The `.nd` API provides a fluent interface for events, lifecycle, and DOM utilities:
110
130
 
111
131
  ```javascript
112
- const button = Button("Click me")
113
- .nd.onClick(() => {
114
- console.log("Button clicked!");
115
- });
116
-
117
- // With attributes and events
118
- const styledButton = Button({ class: "btn" }, "Click me")
119
- .nd.onClick(() => {
120
- console.log("Button clicked!");
121
- });
122
-
123
- // Multiple events
124
- const input = Input({ type: "text", placeholder: "Type here..." })
125
- .nd.onFocus(() => console.log("Input focused"))
126
- .nd.onBlur(() => console.log("Input blurred"))
127
- .nd.onInput(event => console.log("Input value:", event.target.value));
128
-
129
- // Or
130
- const input = Input({ type: "text", placeholder: "Type here..." })
131
- .nd.on({
132
- focus: () => console.log("Input focused"),
133
- blur: () => console.log("Input blurred"),
134
- input: event => console.log("Input value:", event.target.value)
135
- });
136
-
137
- // Prevent default behavior
132
+ const button = Button('Click me')
133
+ .nd.onClick(() => console.log('Clicked!'));
134
+
135
+ // With attributes
136
+ const styledButton = Button({ class: 'btn' }, 'Click me')
137
+ .nd.onClick(() => console.log('Clicked!'));
138
+
139
+ // Multiple events - chained
140
+ const input = Input({ type: 'text', placeholder: 'Type here...' })
141
+ .nd
142
+ .onFocus(() => console.log('Focused'))
143
+ .onBlur(() => console.log('Blurred'))
144
+ .onInput(e => console.log('Value:', e.target.value));
145
+
146
+ // Single event via .on() - name, callback, options (standard addEventListener signature)
147
+ const input2 = Input({ type: 'text' })
148
+ .nd
149
+ .on('input', e => console.log('Value:', e.target.value))
150
+ .on('focus', () => console.log('Focused'), { once: true });
151
+
152
+ // Prevent default
138
153
  const form = Form()
139
- .nd.onPreventSubmit(event => {
140
- console.log("Form submitted without page reload");
141
- // Handle form submission
142
- });
154
+ .nd.onPreventSubmit(e => {
155
+ console.log('Submitted without page reload');
156
+ });
143
157
  ```
144
158
 
145
159
  ## Form Elements and Two-Way Binding
146
160
 
147
- ```javascript
148
- const name = Observable("");
149
- const email = Observable("");
150
- const isChecked = Observable(false);
151
-
152
- // Text input with two-way binding
153
- const nameInput = Input({
154
- type: "text",
155
- value: name, // Automatic two-way binding
156
- placeholder: "Enter your name"
157
- });
158
-
159
- // Email input
160
- const emailInput = Input({
161
- type: "email",
162
- value: email,
163
- placeholder: "Enter your email"
164
- });
165
-
166
- // Checkbox with binding
167
- const checkbox = Input({
168
- type: "checkbox",
169
- checked: isChecked // Automatic two-way binding
170
- });
171
- ```
172
-
173
- ## Conditional Classes and Styles
161
+ Passing an observable to `value` or `checked` creates automatic two-way binding:
174
162
 
175
163
  ```javascript
176
- const isActive = Observable(false);
177
- const count = Observable(0);
164
+ const name = Observable('');
165
+ const email = Observable('');
166
+ const isChecked = Observable(false);
178
167
 
179
- // Conditional classes
180
- const item = Div({
181
- class: {
182
- "item": true, // Always present
183
- "active": isActive, // Present when isActive is true
184
- "highlighted": count.check(c => c > 5) // Present when count > 5
185
- }
186
- }, "List item");
187
-
188
- // Dynamic styles
189
- const progress = Div({
190
- style: {
191
- width: count.check(c => `${c}%`),
192
- backgroundColor: count.check(c => c > 50 ? "green" : "red")
193
- }
194
- }, "Progress bar");
168
+ const nameInput = Input({ type: 'text', value: name, placeholder: 'Your name' });
169
+ const emailInput = Input({ type: 'email', value: email, placeholder: 'Your email' });
170
+ const checkbox = Input({ type: 'checkbox', checked: isChecked });
195
171
  ```
196
172
 
197
173
  ## Lifecycle Management
198
174
 
199
175
  ```javascript
200
- const component = Div("Component content")
176
+ const component = Div('Component content')
201
177
  .nd.mounted(element => {
202
- console.log("Component mounted to DOM");
203
- // Initialize component
178
+ console.log('Mounted to DOM');
204
179
  })
205
180
  .nd.unmounted(element => {
206
- console.log("Component removed from DOM");
207
- // Cleanup resources
181
+ console.log('Removed from DOM');
208
182
  });
209
183
 
210
- // Combined lifecycle
211
- const widget = Div("Widget")
184
+ // Combined
185
+ const widget = Div('Widget')
212
186
  .nd.lifecycle({
213
- mounted: element => console.log("Widget mounted"),
214
- unmounted: element => console.log("Widget unmounted")
187
+ mounted: element => console.log('Mounted'),
188
+ unmounted: element => console.log('Unmounted')
215
189
  });
216
190
  ```
217
191
 
192
+ ## Manual DOM Manipulation
193
+
194
+ ```javascript
195
+ // Remove all children
196
+ const container = Div([P('Child 1'), P('Child 2')]);
197
+ container.nd.unmountChildren();
198
+
199
+ // Remove element from DOM
200
+ const element = Div('Content');
201
+ element.nd.remove();
202
+ ```
203
+
218
204
  ## Element References
219
205
 
206
+ `.ref()` and `.refSelf()` both store a reference on a target object, but they store different things:
207
+
208
+ - **`.ref(target, name)`** - stores the **native HTML element** (`this.$element`) → use when you need direct DOM access
209
+ - **`.refSelf(target, name)`** - stores the **`NDElement` instance** (`this`) → use when you need to keep calling `.nd` methods
210
+
220
211
  ```javascript
221
212
  const refs = {};
222
213
 
223
214
  const app = Div([
224
- Input({ type: "text" })
225
- .nd.ref(refs, "nameInput"), // Store reference as refs.nameInput
215
+ Input({ type: 'text' })
216
+ .nd.ref(refs, 'nameInput'), // refs.nameInput → HTMLInputElement
217
+
218
+ Input({ type: 'text' })
219
+ .nd.refSelf(refs, 'emailInput'), // refs.emailInput → NDElement instance
226
220
 
227
- Button("Focus Input")
221
+ Button('Actions')
228
222
  .nd.onClick(() => {
229
- refs.nameInput.focus(); // Use the reference
223
+ refs.nameInput.focus(); // native DOM method
224
+ refs.emailInput.onInput(e => console.log(e.target.value)); // nd method
230
225
  })
231
226
  ]);
232
227
  ```
233
228
 
234
- ## Practical Example: Simple Button with Event
229
+ ## `.nd.with()` - Instance-level Custom Methods
230
+
231
+ Add custom methods to a single element instance without affecting other elements:
235
232
 
236
233
  ```javascript
237
- const count = Observable(0);
238
-
239
- const incrementButton = Button({
240
- class: "btn btn-primary",
241
- type: "button"
242
- }, "Increment")
243
- .nd.onClick(() => {
244
- count.set(count.val() + 1);
245
- });
234
+ const customButton = Button('Click me')
235
+ .nd.with({
236
+ highlight() {
237
+ this.$element.style.backgroundColor = 'yellow';
238
+ return this;
239
+ },
240
+ resetStyle() {
241
+ this.$element.style.backgroundColor = '';
242
+ return this;
243
+ }
244
+ })
245
+ .highlight();
246
246
 
247
- const display = Div({ class: "counter-display" }, [
248
- P("Current count: "),
249
- Strong(count) // Reactive display
250
- ]);
247
+ customButton.resetStyle().highlight();
248
+ ```
251
249
 
252
- const app = Div({ class: "counter-app" }, [
253
- display,
254
- incrementButton
255
- ]);
250
+ > `.nd.with()` only affects the current instance. To add methods to **all** elements, extend `NDElement.prototype` - see [Extending NDElement](./extending-native-document-element.md).
251
+
252
+ ## `.nd.attach()` - Template Binding
253
+
254
+ Attaches a template binding hydrator to the element. Used internally by the `useCache` and `useSingleton` rendering systems:
255
+
256
+ ```javascript
257
+ // methodName - the event/method name to hydrate
258
+ // bindingHydrator - a binding with a $hydrate method, or a plain function
259
+ element.nd.attach('onClick', bindingHydrator);
256
260
  ```
257
261
 
258
- ## Practical Example: Form with Validation
262
+ See [Advanced Components](./advanced-components.md) for practical usage with `useCache`.
263
+
264
+ ## Class and Style Accumulators
265
+
266
+ Build classes and styles programmatically before passing them to an element:
259
267
 
260
268
  ```javascript
261
- const formData = Observable.object({
262
- name: "",
263
- email: "",
264
- age: ""
265
- });
269
+ import { classPropertyAccumulator, cssPropertyAccumulator } from 'native-document';
266
270
 
267
- const errors = Observable.object({
268
- name: "",
269
- email: "",
270
- age: ""
271
- });
271
+ // Class accumulator
272
+ const classes = classPropertyAccumulator(['btn']);
273
+ classes.add('primary');
274
+ classes.add('large');
275
+
276
+ const button = Button({ class: classes.value() }, 'Submit');
277
+ // class="btn primary large"
278
+
279
+ // Object form
280
+ const classObj = classPropertyAccumulator({ btn: true });
281
+ classObj.add('primary', true);
282
+ classObj.add('disabled', false);
283
+ classObj.value(); // { btn: true, primary: true, disabled: false }
284
+
285
+ // CSS accumulator
286
+ const styles = cssPropertyAccumulator({ color: 'red' });
287
+ styles.add('font-size', '16px');
288
+ styles.add('margin', '10px');
289
+
290
+ const element = Div({ style: styles.value() }, 'Styled content');
291
+ // style="color: red; font-size: 16px; margin: 10px"
292
+ ```
293
+
294
+ ## Shadow DOM
295
+
296
+ ```javascript
297
+ // Open shadow DOM (inspectable in DevTools)
298
+ const widget = Div('Widget content')
299
+ .nd.openShadow(`
300
+ :host { display: block; padding: 20px; }
301
+ p { color: blue; }
302
+ `);
303
+
304
+ // Closed shadow DOM (private)
305
+ const privateWidget = Div('Private content')
306
+ .nd.closedShadow(`p { color: red; }`);
307
+
308
+ // Manual mode
309
+ const customWidget = Div('Custom')
310
+ .nd.shadow('open', `/* scoped styles */`);
311
+ ```
312
+
313
+ ## Practical Example: Form with Validation
314
+
315
+ ```javascript
316
+ const formData = Observable.object({ name: '', email: '', age: '' });
317
+ const errors = Observable.object({ name: '', email: '', age: '' });
272
318
 
273
- // Validation function
274
319
  const validateForm = () => {
275
320
  const data = formData.$value;
276
- const newErrors = {};
277
-
278
- newErrors.name = data.name.length < 2 ? "Name must be at least 2 characters" : "";
279
- newErrors.email = !data.email.includes("@") ? "Invalid email address" : "";
280
- newErrors.age = isNaN(data.age) || data.age < 1 ? "Age must be a valid number" : "";
281
321
 
282
- Observable.update(errors, newErrors);
322
+ errors.name.set(data.name.length < 2 ? 'Name must be at least 2 characters' : '');
323
+ errors.email.set(!data.email.includes('@') ? 'Invalid email address' : '');
324
+ errors.age.set(isNaN(data.age) || data.age < 1 ? 'Age must be a valid number' : '');
283
325
 
284
- return Object.values(newErrors).every(error => error === "");
326
+ return [errors.name, errors.email, errors.age].every(e => e.val() === '');
285
327
  };
286
328
 
287
- const contactForm = Form({ class: "contact-form" }, [
288
- // Name field
289
- Div({ class: "field" }, [
290
- Label("Name:"),
291
- Input({
292
- type: "text",
293
- value: formData.name,
294
- placeholder: "Enter your name"
295
- }).nd.onBlur(validateForm),
296
-
297
- ShowIf(errors.name.check(err => err !== ""),
298
- Span({ class: "error" }, errors.name)
299
- )
329
+ const contactForm = Form({ class: 'contact-form' }, [
330
+
331
+ Div({ class: 'field' }, [
332
+ Label('Name:'),
333
+ Input({ type: 'text', value: formData.name, placeholder: 'Enter your name' })
334
+ .nd.onBlur(validateForm),
335
+ ShowIf(errors.name.isTruthy(), Span({ class: 'error' }, errors.name))
300
336
  ]),
301
337
 
302
- // Email field
303
- Div({ class: "field" }, [
304
- Label("Email:"),
305
- Input({
306
- type: "email",
307
- value: formData.email,
308
- placeholder: "Enter your email"
309
- }).nd.onBlur(validateForm),
310
-
311
- ShowIf(errors.email.check(err => err !== ""),
312
- Span({ class: "error" }, errors.email)
313
- )
338
+ Div({ class: 'field' }, [
339
+ Label('Email:'),
340
+ Input({ type: 'email', value: formData.email, placeholder: 'Enter your email' })
341
+ .nd.onBlur(validateForm),
342
+ ShowIf(errors.email.isTruthy(), Span({ class: 'error' }, errors.email))
314
343
  ]),
315
344
 
316
- // Age field
317
- Div({ class: "field" }, [
318
- Label("Age:"),
319
- Input({
320
- type: "number",
321
- value: formData.age,
322
- placeholder: "Enter your age"
323
- }).nd.onBlur(validateForm),
324
-
325
- ShowIf(errors.age.check(err => err !== ""),
326
- Span({ class: "error" }, errors.age)
327
- )
345
+ Div({ class: 'field' }, [
346
+ Label('Age:'),
347
+ Input({ type: 'number', value: formData.age, placeholder: 'Enter your age' })
348
+ .nd.onBlur(validateForm),
349
+ ShowIf(errors.age.isTruthy(), Span({ class: 'error' }, errors.age))
328
350
  ]),
329
351
 
330
- // Submit button
331
- Button({
332
- type: "submit",
333
- class: "btn btn-primary"
334
- }, "Submit")
335
- ])
336
- .nd.onPreventSubmit(() => {
337
- if (validateForm()) {
338
- console.log("Form is valid!", formData.$value);
339
- // Handle successful submission
340
- } else {
341
- console.log("Form has errors");
342
- }
343
- });
352
+ Button({ type: 'submit', class: 'btn btn-primary' }, 'Submit')
353
+
354
+ ]).nd.onPreventSubmit(() => {
355
+ if (validateForm()) {
356
+ console.log('Form is valid!', formData.$value);
357
+ }
358
+ });
344
359
  ```
345
360
 
346
- ## Available Elements
361
+ ## Available HTML Elements
347
362
 
348
- NativeDocument provides functions for all standard HTML elements:
363
+ **Text:** `H1`, `H2`, `H3`, `H4`, `H5`, `H6`, `P`, `Span`, `Strong`, `Em`, `Small`, `Mark`, `BlockQuote`, `Pre`, `Code`
349
364
 
350
- **Text Elements:** `H1`, `H2`, `H3`, `H4`, `H5`, `H6`, `P`, `Span`, `Strong`, `Em`, `Small`, `Mark`
365
+ **Layout:** `Div`, `Section`, `Article`, `Aside`, `Header`, `Footer`, `Nav`, `Main`
351
366
 
352
- **Layout Elements:** `Div`, `Section`, `Article`, `Aside`, `Header`, `Footer`, `Nav`, `Main`
367
+ **Form:** `Form`, `Input`, `TextArea`, `Select`, `Option`, `Button`, `Label`, `FieldSet`, `Legend`
353
368
 
354
- **Form Elements:** `Form`, `Input`, `TextArea`, `Select`, `Option`, `Button`, `Label`, `FieldSet`, `Legend`
369
+ **List:** `Ul`, `Ol`, `Li`, `Dl`, `Dt`, `Dd`
355
370
 
356
- **List Elements:** `Ul`, `Ol`, `Li`, `Dl`, `Dt`, `Dd`
371
+ **Media:** `Img`, `Audio`, `Video`, `Canvas`
357
372
 
358
- **Media Elements:** `Img`, `Audio`, `Video`, `Canvas`, `Svg`
373
+ **Interactive:** `Link`, `Details`, `Summary`, `Dialog`
359
374
 
360
- **Interactive Elements:** `Link`, `Details`, `Summary`, `Dialog`, `Menu`
375
+ **SVG:** `Svg`, `SvgSvg`, `SvgCircle`, `SvgRect`, `SvgEllipse`, `SvgLine`, `SvgPolyline`, `SvgPolygon`, `SvgPath`, `SvgText`, `SvgTSpan`, `SvgG`, `SvgDefs`, `SvgUse`, `SvgSymbol`, `SvgClipPath`, `SvgMask`, `SvgMarker`, `SvgPattern`, `SvgImage`, `SvgLinearGradient`, `SvgRadialGradient`, `SvgStop`, `SvgFilter`, and more.
361
376
 
362
- And many more following the same naming pattern!
377
+ > For detailed SVG usage and examples, see [SVG Elements](./svg-elements.md).
363
378
 
364
379
  ## Best Practices
365
380
 
366
- 1. **Use semantic HTML elements** for better accessibility
367
- 2. **Leverage reactive attributes** with observables for dynamic UIs
368
- 3. **Group related elements** in logical containers
369
- 4. **Use the `.nd` API** for event handling and lifecycle management
370
- 5. **Validate form data** reactively for better user experience
371
- 6. **Store element references** when you need to manipulate them later
372
- 7. **Use conditional rendering** with `ShowIf` for dynamic content
381
+ 1. Use semantic HTML elements for better accessibility
382
+ 2. Leverage reactive attributes with observables for dynamic UIs
383
+ 3. Use `.nd.with()` for instance-level customization, `NDElement.prototype` for app-wide methods
384
+ 4. Store element references with `.nd.ref()` when you need direct DOM access
385
+ 5. Use `ShowIf` with `.isTruthy()` / `.isFalsy()` for clean conditional rendering
386
+ 6. Group related elements in logical containers
373
387
 
374
388
  ## Next Steps
375
389
 
376
- Now that you understand NativeDocument's elements, explore these advanced topics:
377
-
378
- - **[Conditional Rendering](conditional-rendering.md)** - Dynamic content
379
- - **[List Rendering](list-rendering.md)** - (ForEach | ForEachArray) and dynamic lists
380
- - **[Routing](routing.md)** - Navigation and URL management
381
- - **[State Management](state-management.md)** - Global state patterns
382
- - **[Lifecycle Events](lifecycle-events.md)** - Lifecycle events
383
- - **[Memory Management](memory-management.md)** - Memory management
384
- - **[Anchor](anchor.md)** - Anchor
390
+ - **[Conditional Rendering](./conditional-rendering.md)** - Dynamic content
391
+ - **[List Rendering](./list-rendering.md)** - ForEach and dynamic lists
392
+ - **[NDElement](./native-document-element.md)** - Full `.nd` API reference
393
+ - **[Extending NDElement](./extending-native-document-element.md)** - Custom methods guide
394
+ - **[SVG Elements](./svg-elements.md)** - SVG wrapper functions
395
+ - **[Advanced Components](./advanced-components.md)** - Template caching and singleton views
396
+ - **[Lifecycle Events](./lifecycle-events.md)** - Mounted, unmounted, beforeUnmount