native-document 1.0.165 → 1.0.168

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/.vitepress/config.js +166 -0
  2. package/CHANGELOG.md +153 -0
  3. package/components.d.ts +2 -0
  4. package/components.js +2 -1
  5. package/devtools/widget.js +1 -1
  6. package/dist/native-document.components.min.js +11589 -2983
  7. package/dist/native-document.dev.js +2280 -396
  8. package/dist/native-document.dev.js.map +1 -1
  9. package/dist/native-document.min.js +1 -1
  10. package/docs/advanced-components.md +213 -608
  11. package/docs/anchor.md +173 -312
  12. package/docs/cache.md +95 -803
  13. package/docs/cli.md +179 -0
  14. package/docs/components/accordion.md +172 -0
  15. package/docs/components/alert.md +99 -0
  16. package/docs/components/avatar.md +160 -0
  17. package/docs/components/badge.md +102 -0
  18. package/docs/components/breadcrumb.md +89 -0
  19. package/docs/components/button.md +183 -0
  20. package/docs/components/card.md +69 -0
  21. package/docs/components/context-menu.md +118 -0
  22. package/docs/components/data-table.md +345 -0
  23. package/docs/components/dropdown.md +214 -0
  24. package/docs/components/form/autocomplete-field.md +81 -0
  25. package/docs/components/form/checkbox-field.md +41 -0
  26. package/docs/components/form/checkbox-group-field.md +54 -0
  27. package/docs/components/form/color-field.md +64 -0
  28. package/docs/components/form/date-field.md +92 -0
  29. package/docs/components/form/field-collection.md +63 -0
  30. package/docs/components/form/file-field.md +203 -0
  31. package/docs/components/form/form-control.md +87 -0
  32. package/docs/components/form/image-field.md +90 -0
  33. package/docs/components/form/index.md +115 -0
  34. package/docs/components/form/number-field.md +65 -0
  35. package/docs/components/form/radio-field.md +51 -0
  36. package/docs/components/form/select-field.md +123 -0
  37. package/docs/components/form/slider.md +136 -0
  38. package/docs/components/form/string-field.md +134 -0
  39. package/docs/components/form/textarea-field.md +65 -0
  40. package/docs/components/form-fields.md +372 -0
  41. package/docs/components/getting-started.md +264 -0
  42. package/docs/components/index.md +337 -0
  43. package/docs/components/layout.md +279 -0
  44. package/docs/components/list.md +73 -0
  45. package/docs/components/menu.md +215 -0
  46. package/docs/components/modal.md +156 -0
  47. package/docs/components/pagination.md +95 -0
  48. package/docs/components/popover.md +131 -0
  49. package/docs/components/progress.md +111 -0
  50. package/docs/components/shortcut-manager.md +221 -0
  51. package/docs/components/simple-table.md +107 -0
  52. package/docs/components/skeleton.md +155 -0
  53. package/docs/components/spinner.md +100 -0
  54. package/docs/components/splitter.md +133 -0
  55. package/docs/components/stepper.md +163 -0
  56. package/docs/components/switch.md +113 -0
  57. package/docs/components/tabs.md +153 -0
  58. package/docs/components/toast.md +119 -0
  59. package/docs/components/tooltip.md +151 -0
  60. package/docs/components/traits.md +261 -0
  61. package/docs/conditional-rendering.md +170 -588
  62. package/docs/contributing.md +300 -25
  63. package/docs/core-concepts.md +205 -374
  64. package/docs/elements.md +251 -367
  65. package/docs/extending-native-document-element.md +192 -207
  66. package/docs/filters.md +153 -1122
  67. package/docs/getting-started.md +193 -267
  68. package/docs/i18n.md +241 -0
  69. package/docs/index.md +76 -0
  70. package/docs/lifecycle-events.md +143 -75
  71. package/docs/list-rendering.md +227 -852
  72. package/docs/memory-management.md +134 -47
  73. package/docs/native-document-element.md +337 -186
  74. package/docs/native-fetch.md +99 -630
  75. package/docs/observable-resource.md +364 -0
  76. package/docs/observables.md +592 -526
  77. package/docs/routing.md +244 -653
  78. package/docs/state-management.md +134 -241
  79. package/docs/svg-elements.md +231 -0
  80. package/docs/theming.md +409 -0
  81. package/docs/validation.md +95 -97
  82. package/docs/vitepress-conventions.md +219 -0
  83. package/eslint.config.js +28 -33
  84. package/i18n.js +1 -1
  85. package/i18n.ts +2 -0
  86. package/index.js +3 -0
  87. package/package.json +36 -14
  88. package/readme.md +269 -89
  89. package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
  90. package/src/components/$traits/has-draggable/HasDraggable.js +13 -0
  91. package/src/components/$traits/has-items/HasItems.d.ts +9 -0
  92. package/src/components/$traits/has-items/HasItems.js +6 -6
  93. package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
  94. package/src/components/$traits/has-position/HasFullPosition.js +44 -0
  95. package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
  96. package/src/components/$traits/has-position/HasPosition.js +23 -1
  97. package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
  98. package/src/components/$traits/has-resizable/HasResizable.js +9 -0
  99. package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
  100. package/src/components/$traits/has-validation/HasValidation.js +54 -7
  101. package/src/components/BaseComponent.d.ts +32 -0
  102. package/src/components/BaseComponent.js +65 -9
  103. package/src/components/accordion/Accordion.js +39 -14
  104. package/src/components/accordion/AccordionItem.js +45 -14
  105. package/src/components/accordion/index.js +2 -2
  106. package/src/components/accordion/types/Accordion.d.ts +47 -0
  107. package/src/components/accordion/types/AccordionItem.d.ts +48 -0
  108. package/src/components/alert/Alert.js +70 -38
  109. package/src/components/alert/index.js +2 -2
  110. package/src/components/alert/types/Alert.d.ts +62 -0
  111. package/src/components/avatar/Avatar.js +49 -12
  112. package/src/components/avatar/AvatarGroup.js +50 -2
  113. package/src/components/avatar/index.js +2 -2
  114. package/src/components/avatar/types/Avatar.d.ts +74 -0
  115. package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
  116. package/src/components/badge/Badge.js +125 -5
  117. package/src/components/badge/index.js +2 -2
  118. package/src/components/badge/types/Badge.d.ts +51 -0
  119. package/src/components/breadcrumb/BreadCrumb.js +61 -5
  120. package/src/components/breadcrumb/index.js +2 -2
  121. package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
  122. package/src/components/button/Button.js +164 -9
  123. package/src/components/button/index.js +1 -1
  124. package/src/components/button/types/Button.d.ts +62 -0
  125. package/src/components/card/Card.js +204 -32
  126. package/src/components/card/index.js +4 -4
  127. package/src/components/card/types/Card.d.ts +42 -0
  128. package/src/components/context-menu/ContextMenu.js +49 -5
  129. package/src/components/context-menu/ContextMenuGroup.js +15 -2
  130. package/src/components/context-menu/ContextMenuItem.js +14 -2
  131. package/src/components/context-menu/index.js +5 -5
  132. package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
  133. package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
  134. package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
  135. package/src/components/divider/Divider.js +120 -4
  136. package/src/components/divider/index.js +3 -3
  137. package/src/components/divider/types/Divider.d.ts +55 -0
  138. package/src/components/dropdown/Dropdown.js +239 -16
  139. package/src/components/dropdown/DropdownDivider.js +22 -2
  140. package/src/components/dropdown/DropdownGroup.js +44 -5
  141. package/src/components/dropdown/DropdownItem.js +76 -3
  142. package/src/components/dropdown/DropdownTrigger.js +49 -20
  143. package/src/components/dropdown/helpers.js +1 -1
  144. package/src/components/dropdown/index.js +6 -6
  145. package/src/components/dropdown/types/Dropdown.d.ts +88 -0
  146. package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
  147. package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
  148. package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
  149. package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
  150. package/src/components/form/FormControl.js +156 -13
  151. package/src/components/form/field/Field.js +172 -9
  152. package/src/components/form/field/FieldCollection.js +116 -12
  153. package/src/components/form/field/types/AutocompleteField.js +92 -2
  154. package/src/components/form/field/types/CheckboxField.js +43 -2
  155. package/src/components/form/field/types/CheckboxGroupField.js +83 -6
  156. package/src/components/form/field/types/ColorField.js +56 -3
  157. package/src/components/form/field/types/DateField.js +155 -4
  158. package/src/components/form/field/types/EmailField.js +54 -4
  159. package/src/components/form/field/types/FileField.js +140 -6
  160. package/src/components/form/field/types/HiddenField.js +27 -1
  161. package/src/components/form/field/types/ImageField.js +82 -3
  162. package/src/components/form/field/types/NumberField.js +97 -4
  163. package/src/components/form/field/types/PasswordField.js +103 -7
  164. package/src/components/form/field/types/RadioField.js +75 -4
  165. package/src/components/form/field/types/RangeField.js +67 -1
  166. package/src/components/form/field/types/SearchField.js +41 -2
  167. package/src/components/form/field/types/SelectField.js +133 -4
  168. package/src/components/form/field/types/StringField.js +91 -2
  169. package/src/components/form/field/types/TelField.js +55 -4
  170. package/src/components/form/field/types/TextAreaField.js +76 -2
  171. package/src/components/form/field/types/TimeField.js +120 -5
  172. package/src/components/form/field/types/UrlField.js +59 -4
  173. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +83 -4
  174. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +61 -3
  175. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +79 -3
  176. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +24 -2
  177. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +64 -3
  178. package/src/components/form/field/types/file-field-mode/FileWallMode.js +56 -3
  179. package/src/components/form/index.js +28 -28
  180. package/src/components/form/types/Field.d.ts +73 -0
  181. package/src/components/form/types/FieldCollection.d.ts +53 -0
  182. package/src/components/form/types/FormControl.d.ts +64 -0
  183. package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
  184. package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
  185. package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
  186. package/src/components/form/types/fields/ColorField.d.ts +37 -0
  187. package/src/components/form/types/fields/DateField.d.ts +70 -0
  188. package/src/components/form/types/fields/EmailField.d.ts +35 -0
  189. package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
  190. package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
  191. package/src/components/form/types/fields/FileField.d.ts +56 -0
  192. package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
  193. package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
  194. package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
  195. package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
  196. package/src/components/form/types/fields/HiddenField.d.ts +26 -0
  197. package/src/components/form/types/fields/ImageField.d.ts +45 -0
  198. package/src/components/form/types/fields/NumberField.d.ts +48 -0
  199. package/src/components/form/types/fields/PasswordField.d.ts +46 -0
  200. package/src/components/form/types/fields/RadioField.d.ts +48 -0
  201. package/src/components/form/types/fields/RangeField.d.ts +44 -0
  202. package/src/components/form/types/fields/SearchField.d.ts +34 -0
  203. package/src/components/form/types/fields/SelectField.d.ts +71 -0
  204. package/src/components/form/types/fields/StringField.d.ts +48 -0
  205. package/src/components/form/types/fields/TelField.d.ts +37 -0
  206. package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
  207. package/src/components/form/types/fields/TimeField.d.ts +51 -0
  208. package/src/components/form/types/fields/UrlField.d.ts +35 -0
  209. package/src/components/form/validation/Validation.js +54 -54
  210. package/src/components/index.d.ts +160 -0
  211. package/src/components/list/HasListItem.js +171 -0
  212. package/src/components/list/List.js +85 -67
  213. package/src/components/list/ListDivider.js +39 -0
  214. package/src/components/list/ListGroup.js +105 -38
  215. package/src/components/list/ListItem.js +158 -49
  216. package/src/components/list/index.js +8 -6
  217. package/src/components/list/types/List.d.ts +43 -0
  218. package/src/components/list/types/ListGroup.d.ts +37 -0
  219. package/src/components/list/types/ListItem.d.ts +53 -0
  220. package/src/components/menu/HasMenuItem.js +55 -6
  221. package/src/components/menu/Menu.js +113 -22
  222. package/src/components/menu/MenuDivider.js +18 -2
  223. package/src/components/menu/MenuGroup.js +61 -6
  224. package/src/components/menu/MenuItem.js +95 -11
  225. package/src/components/menu/MenuLink.js +27 -2
  226. package/src/components/menu/index.js +6 -6
  227. package/src/components/menu/types/Menu.d.ts +60 -0
  228. package/src/components/menu/types/MenuDivider.d.ts +19 -0
  229. package/src/components/menu/types/MenuGroup.d.ts +44 -0
  230. package/src/components/menu/types/MenuItem.d.ts +46 -0
  231. package/src/components/menu/types/MenuLink.d.ts +16 -0
  232. package/src/components/modal/Modal.js +258 -17
  233. package/src/components/modal/index.js +3 -3
  234. package/src/components/modal/types/Modal.d.ts +94 -0
  235. package/src/components/pagination/Pagination.js +155 -7
  236. package/src/components/pagination/index.js +3 -3
  237. package/src/components/pagination/types/Pagination.d.ts +68 -0
  238. package/src/components/popover/Popover.js +198 -11
  239. package/src/components/popover/PopoverFooter.js +33 -9
  240. package/src/components/popover/PopoverHeader.js +33 -8
  241. package/src/components/popover/index.js +4 -4
  242. package/src/components/popover/types/Popover.d.ts +83 -0
  243. package/src/components/popover/types/PopoverFooter.d.ts +24 -0
  244. package/src/components/popover/types/PopoverHeader.d.ts +26 -0
  245. package/src/components/progress/Progress.js +182 -13
  246. package/src/components/progress/index.js +3 -3
  247. package/src/components/progress/types/Progress.d.ts +77 -0
  248. package/src/components/skeleton/Skeleton.js +117 -49
  249. package/src/components/skeleton/index.js +3 -3
  250. package/src/components/skeleton/types/Skeleton.d.ts +55 -0
  251. package/src/components/slider/Slider.js +207 -10
  252. package/src/components/slider/index.js +2 -2
  253. package/src/components/slider/types/Slider.d.ts +82 -0
  254. package/src/components/spacer/Spacer.js +12 -3
  255. package/src/components/spacer/index.js +2 -2
  256. package/src/components/spacer/types/Spacer.d.ts +19 -0
  257. package/src/components/spinner/Spinner.js +180 -9
  258. package/src/components/spinner/index.js +3 -3
  259. package/src/components/spinner/types/Spinner.d.ts +71 -0
  260. package/src/components/splitter/Splitter.js +76 -13
  261. package/src/components/splitter/SplitterGutter.js +67 -5
  262. package/src/components/splitter/SplitterPanel.js +69 -2
  263. package/src/components/splitter/index.js +5 -5
  264. package/src/components/splitter/types/Splitter.d.ts +38 -0
  265. package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
  266. package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
  267. package/src/components/stacks/AbsoluteStack.js +23 -3
  268. package/src/components/stacks/FixedStack.js +23 -3
  269. package/src/components/stacks/HStack.js +24 -3
  270. package/src/components/stacks/PositionStack.js +111 -3
  271. package/src/components/stacks/RelativeStack.js +23 -3
  272. package/src/components/stacks/Stack.js +73 -2
  273. package/src/components/stacks/VStack.js +24 -4
  274. package/src/components/stacks/index.js +7 -7
  275. package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
  276. package/src/components/stacks/types/FixedStack.d.ts +16 -0
  277. package/src/components/stacks/types/HStack.d.ts +16 -0
  278. package/src/components/stacks/types/PositionStack.d.ts +54 -0
  279. package/src/components/stacks/types/RelativeStack.d.ts +17 -0
  280. package/src/components/stacks/types/Stack.d.ts +39 -0
  281. package/src/components/stacks/types/VStack.d.ts +16 -0
  282. package/src/components/stepper/Stepper.js +152 -12
  283. package/src/components/stepper/StepperStep.js +104 -3
  284. package/src/components/stepper/index.js +4 -4
  285. package/src/components/stepper/types/Stepper.d.ts +68 -0
  286. package/src/components/stepper/types/StepperStep.d.ts +54 -0
  287. package/src/components/switch/Switch.js +143 -6
  288. package/src/components/switch/index.js +1 -1
  289. package/src/components/switch/types/Switch.d.ts +55 -0
  290. package/src/components/table/Column.js +105 -6
  291. package/src/components/table/ColumnGroup.js +48 -3
  292. package/src/components/table/DataTable.js +256 -19
  293. package/src/components/table/SimpleTable.js +58 -4
  294. package/src/components/table/index.js +2 -2
  295. package/src/components/table/types/Column.d.ts +49 -0
  296. package/src/components/table/types/ColumnGroup.d.ts +28 -0
  297. package/src/components/table/types/DataTable.d.ts +97 -0
  298. package/src/components/table/types/SimpleTable.d.ts +40 -0
  299. package/src/components/tabs/Tabs.js +192 -5
  300. package/src/components/tabs/index.js +3 -3
  301. package/src/components/tabs/types/Tabs.d.ts +78 -0
  302. package/src/components/toast/Toast.js +133 -5
  303. package/src/components/toast/index.js +3 -3
  304. package/src/components/toast/types/Toast.d.ts +57 -0
  305. package/src/components/toast/types/ToastError.d.ts +7 -0
  306. package/src/components/toast/types/ToastInfo.d.ts +7 -0
  307. package/src/components/toast/types/ToastSuccess.d.ts +7 -0
  308. package/src/components/toast/types/ToastWarning.d.ts +7 -0
  309. package/src/components/tooltip/Tooltip.js +157 -13
  310. package/src/components/tooltip/index.js +2 -2
  311. package/src/components/tooltip/prototypes.js +1 -1
  312. package/src/components/tooltip/types/Tooltip.d.ts +65 -0
  313. package/src/core/data/MemoryManager.js +2 -2
  314. package/src/core/data/Observable.js +15 -18
  315. package/src/core/data/ObservableArray.js +118 -46
  316. package/src/core/data/ObservableChecker.js +2 -2
  317. package/src/core/data/ObservableItem.js +135 -21
  318. package/src/core/data/ObservableObject.js +126 -35
  319. package/src/core/data/ObservableResource.js +118 -3
  320. package/src/core/data/Store.js +142 -26
  321. package/src/core/data/observable-helpers/observable.is-to.js +196 -1
  322. package/src/core/data/observable-helpers/observable.prototypes.js +35 -8
  323. package/src/core/elements/anchor/anchor-with-sentinel.js +23 -2
  324. package/src/core/elements/anchor/anchor.js +16 -7
  325. package/src/core/elements/anchor/one-child-anchor-overwriting.js +2 -2
  326. package/src/core/elements/content-formatter.js +1 -1
  327. package/src/core/elements/control/for-each-array.js +9 -9
  328. package/src/core/elements/control/for-each.js +14 -14
  329. package/src/core/elements/control/show-if.js +11 -11
  330. package/src/core/elements/control/show-when.js +5 -5
  331. package/src/core/elements/control/switch.js +14 -14
  332. package/src/core/elements/description-list.js +1 -1
  333. package/src/core/elements/form.js +2 -2
  334. package/src/core/elements/fragment.js +1 -1
  335. package/src/core/elements/html5-semantics.js +1 -1
  336. package/src/core/elements/img.js +3 -3
  337. package/src/core/elements/interactive.js +1 -1
  338. package/src/core/elements/list.js +1 -1
  339. package/src/core/elements/medias.js +1 -1
  340. package/src/core/elements/meta-data.js +1 -1
  341. package/src/core/elements/svg.js +1 -1
  342. package/src/core/elements/table.js +1 -1
  343. package/src/core/errors/ArgTypesError.js +1 -1
  344. package/src/core/utils/HasEventEmitter.js +36 -2
  345. package/src/core/utils/args-types.js +9 -9
  346. package/src/core/utils/cache.js +1 -1
  347. package/src/core/utils/callback-handler.js +29 -0
  348. package/src/core/utils/debug-manager.js +6 -6
  349. package/src/core/utils/events.js +139 -139
  350. package/src/core/utils/filters/date.js +84 -3
  351. package/src/core/utils/filters/standard.js +136 -11
  352. package/src/core/utils/filters/strings.js +34 -2
  353. package/src/core/utils/filters/utils.js +40 -4
  354. package/src/core/utils/formatters.js +4 -4
  355. package/src/core/utils/helpers.js +39 -7
  356. package/src/core/utils/localstorage.js +11 -11
  357. package/src/core/utils/memoize.js +56 -3
  358. package/src/core/utils/plugins-manager.js +3 -3
  359. package/src/core/utils/property-accumulator.js +6 -6
  360. package/src/core/utils/prototypes.js +26 -1
  361. package/src/core/utils/shortcut-manager.js +2 -2
  362. package/src/core/utils/validator.js +8 -8
  363. package/src/core/wrappers/AttributesWrapper.js +32 -22
  364. package/src/core/wrappers/DocumentObserver.js +3 -3
  365. package/src/core/wrappers/ElementCreator.js +5 -5
  366. package/src/core/wrappers/HtmlElementWrapper.js +38 -12
  367. package/src/core/wrappers/NDElement.js +328 -22
  368. package/src/core/wrappers/NdPrototype.js +60 -16
  369. package/src/core/wrappers/SingletonView.js +50 -2
  370. package/src/core/wrappers/SvgElementWrapper.js +1 -1
  371. package/src/core/wrappers/constants.js +35 -2
  372. package/src/core/wrappers/prototypes/attributes-extensions.js +7 -7
  373. package/src/core/wrappers/prototypes/nd-element-extensions.js +72 -6
  374. package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +42 -2
  375. package/src/core/wrappers/template-cloner/NodeCloner.js +53 -8
  376. package/src/core/wrappers/template-cloner/TemplateCloner.js +75 -6
  377. package/src/core/wrappers/template-cloner/attributes-hydrator.js +58 -2
  378. package/src/core/wrappers/template-cloner/utils.js +42 -6
  379. package/src/fetch/NativeFetch.js +3 -3
  380. package/src/i18n/bin/scan.js +6 -6
  381. package/src/i18n/index.d.ts +2 -0
  382. package/src/i18n/service/I18nService.d.ts +27 -0
  383. package/src/i18n/service/I18nService.js +5 -5
  384. package/src/i18n/service/functions.d.ts +22 -0
  385. package/src/i18n/service/functions.js +2 -2
  386. package/src/router/Route.js +3 -3
  387. package/src/router/RouteGroupHelper.js +2 -2
  388. package/src/router/Router.js +15 -15
  389. package/src/router/RouterComponent.js +33 -7
  390. package/src/router/link.js +4 -4
  391. package/src/router/modes/HashRouter.js +2 -2
  392. package/src/router/modes/HistoryRouter.js +2 -2
  393. package/src/router/modes/MemoryRouter.js +1 -1
  394. package/src/ui/components/accordion/AccordionItemRender.js +3 -3
  395. package/src/ui/components/accordion/AccordionRender.js +1 -1
  396. package/src/ui/components/alert/AlertRender.js +10 -10
  397. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +1 -1
  398. package/src/ui/components/avatar/avatar/AvatarRender.js +1 -1
  399. package/src/ui/components/breadcrumb/BreadcrumbRender.js +2 -2
  400. package/src/ui/components/button/ButtonRender.js +1 -1
  401. package/src/ui/components/card/CardRender.js +133 -0
  402. package/src/ui/components/card/card.css +169 -0
  403. package/src/ui/components/contextmenu/ContextmenuRender.js +6 -6
  404. package/src/ui/components/dropdown/DropdownRender.js +8 -8
  405. package/src/ui/components/dropdown/group/DropdownGroupRender.js +2 -2
  406. package/src/ui/components/dropdown/item/DropdownItemRender.js +1 -1
  407. package/src/ui/components/form/FieldCollectionRender.js +2 -2
  408. package/src/ui/components/form/FormControlRender.js +5 -5
  409. package/src/ui/components/form/fields/AutocompleteFieldRender.js +3 -3
  410. package/src/ui/components/form/fields/CheckboxFieldRender.js +1 -1
  411. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +1 -1
  412. package/src/ui/components/form/fields/DateFieldRender.js +7 -7
  413. package/src/ui/components/form/fields/EmailFieldRender.js +1 -1
  414. package/src/ui/components/form/fields/FieldRender.js +4 -4
  415. package/src/ui/components/form/fields/FileFieldRender.js +1 -1
  416. package/src/ui/components/form/fields/PasswordFieldRender.js +2 -2
  417. package/src/ui/components/form/fields/RadioFieldRender.js +1 -1
  418. package/src/ui/components/form/fields/RangeFieldRender.js +1 -1
  419. package/src/ui/components/form/fields/SelectFieldRender.js +2 -2
  420. package/src/ui/components/form/fields/SliderFieldRender.js +6 -6
  421. package/src/ui/components/form/fields/StringFieldRender.js +1 -1
  422. package/src/ui/components/form/fields/TelFieldRender.js +1 -1
  423. package/src/ui/components/form/fields/TextAreaFieldRender.js +1 -1
  424. package/src/ui/components/form/fields/TimeFieldRender.js +3 -3
  425. package/src/ui/components/form/fields/UrlFieldRender.js +1 -1
  426. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +1 -1
  427. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +2 -2
  428. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +2 -2
  429. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +1 -1
  430. package/src/ui/components/form/helpers.js +8 -8
  431. package/src/ui/components/form/index.js +27 -27
  432. package/src/ui/components/list/ListRender.js +18 -0
  433. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  434. package/src/ui/components/list/divider/list-divider.css +12 -0
  435. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  436. package/src/ui/components/list/group/list-group.css +62 -0
  437. package/src/ui/components/list/item/ListItemRender.js +238 -0
  438. package/src/ui/components/list/item/list-item.css +191 -0
  439. package/src/ui/components/list/list.css +24 -0
  440. package/src/ui/components/menu/MenuDividerRender.js +1 -1
  441. package/src/ui/components/menu/MenuGroupRender.js +3 -3
  442. package/src/ui/components/menu/MenuItemRender.js +2 -2
  443. package/src/ui/components/menu/MenuLinkRender.js +3 -3
  444. package/src/ui/components/menu/helpers.js +4 -4
  445. package/src/ui/components/modal/ModalRender.js +4 -4
  446. package/src/ui/components/pagination/PaginationRender.js +9 -9
  447. package/src/ui/components/popover/PopoverRender.js +7 -7
  448. package/src/ui/components/progress/ProgressRender.js +12 -12
  449. package/src/ui/components/skeleton/SkeletonRender.js +56 -0
  450. package/src/ui/components/spacer/SpacerRender.js +10 -0
  451. package/src/ui/components/splitter/SplitterGutterRender.js +1 -1
  452. package/src/ui/components/splitter/SplitterPanelRender.js +2 -2
  453. package/src/ui/components/stacks/PositionStackRender.js +1 -1
  454. package/src/ui/components/stacks/StackRender.js +1 -1
  455. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +1 -1
  456. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +1 -1
  457. package/src/ui/components/stacks/h-stack/HStackRender.js +1 -1
  458. package/src/ui/components/stacks/index.js +5 -5
  459. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +1 -1
  460. package/src/ui/components/stacks/v-stack/VStackRender.js +1 -1
  461. package/src/ui/components/stepper/StepperRender.js +2 -2
  462. package/src/ui/components/stepper/StepperStepRender.js +4 -4
  463. package/src/ui/components/switch/SwitchRender.js +4 -4
  464. package/src/ui/components/table/data-table/DataTableRender.js +5 -5
  465. package/src/ui/components/table/data-table/bulk-actions.js +7 -7
  466. package/src/ui/components/table/data-table/pagination.js +6 -6
  467. package/src/ui/components/table/data-table/tables.js +25 -25
  468. package/src/ui/components/table/data-table/toolbar.js +3 -3
  469. package/src/ui/components/table/simple-table/SimpleTableRender.js +8 -8
  470. package/src/ui/components/tabs/TabsRender.js +11 -11
  471. package/src/ui/components/toast/ToastRender.js +3 -3
  472. package/src/ui/components/tooltip/TooltipRender.js +1 -1
  473. package/src/ui/index.js +44 -36
  474. package/types/elements.d.ts +163 -1037
  475. package/types/forms.d.ts +16 -20
  476. package/types/globals.d.ts +543 -0
  477. package/types/images.d.ts +2 -2
  478. package/types/observable-resource.d.ts +3 -0
  479. package/types/property-accumulator.d.ts +4 -4
  480. package/types/store.d.ts +26 -2
  481. package/types/validator.ts +3 -3
  482. package/ui.js +1 -0
  483. package/src/components/form/field/DefaultRender.js +0 -77
  484. package/src/components/form/field/FieldFactory.js +0 -107
  485. package/src/components/skeleton/SkeletonList.js +0 -0
  486. package/src/components/skeleton/SkeletonParagraph.js +0 -0
  487. package/src/components/skeleton/SkeletonTable.js +0 -0
  488. /package/{src/components/skeleton/SkeletonCard.js → docs/tutorials/.gitkeep} +0 -0
@@ -1,274 +1,259 @@
1
- # Extending NDElement - Custom Methods Guide
1
+ ---
2
+ title: Extending NDElement
3
+ description: Add custom methods to NDElement to create reusable, domain-specific APIs across your application
4
+ ---
2
5
 
3
- NDElement is designed to be extensible, allowing developers to add custom methods that make their code more readable and maintainable. This guide shows how to create custom NDElement extensions for common patterns.
6
+ # Extending NDElement
4
7
 
5
- ## Why Extend NDElement?
8
+ NDElement is designed to be extensible. You can add custom methods to make your code more expressive, reduce boilerplate, and create a consistent API across your application.
6
9
 
7
- Extending NDElement allows you to:
8
- - **Encapsulate common patterns** into reusable methods
9
- - **Improve code readability** with domain-specific method names
10
- - **Reduce boilerplate** by abstracting complex event handling
11
- - **Create a consistent API** across your application
10
+ ## Two Ways to Extend
12
11
 
13
- ## Basic Extension Pattern
12
+ ### `NDElement.extend()` - App-wide methods
14
13
 
15
- The simplest way to extend NDElement is by adding methods to its prototype:
14
+ Use `NDElement.extend()` to add methods to **all NDElement instances**. This is the recommended public API:
16
15
 
17
16
  ```javascript
18
- // Basic extension
19
- NDElement.prototype.customMethod = function(/* parameters */) {
20
- // Your logic here
21
- return this; // Return 'this' for method chaining
22
- };
23
- ```
17
+ import { NDElement } from 'native-document';
18
+
19
+ NDElement.extend({
20
+ onEnter(callback) {
21
+ this.$element.addEventListener('keyup', e => {
22
+ if (e.key === 'Enter') callback(e);
23
+ });
24
+ return this;
25
+ }
26
+ });
24
27
 
25
- ## Common Extension Examples
28
+ // Now available on every element
29
+ Input({ type: 'text' }).nd.onEnter(e => console.log('Enter pressed'));
30
+ ```
26
31
 
27
- ### 1. Keyboard Event Shortcuts
32
+ ### `.nd.with()` - Instance-level methods
28
33
 
29
- Instead of writing complex keyboard event handlers, create semantic shortcuts:
34
+ Use `.nd.with()` to add methods to a **single element instance** only. See [NDElement](./native-document-element.md) for the full explanation and the `Counter` use case.
30
35
 
31
36
  ```javascript
32
- // Enter key handler
33
- NDElement.prototype.onEnter = function(callback) {
34
- this.$element.addEventListener('keyup', e => {
35
- if (e.key === 'Enter') {
36
- callback(e);
37
+ const card = Div({ class: 'card' })
38
+ .nd.with({
39
+ highlight() {
40
+ this.$element.style.outline = '2px solid blue';
41
+ return this;
37
42
  }
38
- });
39
- return this;
40
- };
41
-
42
- // Escape key handler
43
- NDElement.prototype.onEscape = function(callback) {
44
- this.$element.addEventListener('keyup', e => {
45
- if (e.key === 'Escape') {
46
- callback(e);
47
- }
48
- });
49
- return this;
50
- };
51
-
52
- // Arrow keys handler
53
- NDElement.prototype.onArrowKey = function(callback) {
54
- this.$element.addEventListener('keydown', e => {
55
- if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {
56
- callback(e, e.key);
57
- }
58
- });
59
- return this;
60
- };
43
+ })
44
+ .highlight();
45
+ ```
46
+
47
+ > Always `return this` at the end of every method to enable chaining.
48
+
49
+ ---
50
+
51
+ ## Common Extension Examples
52
+
53
+ ### Keyboard shortcuts
54
+
55
+ ```javascript
56
+ NDElement.extend({
57
+ onEnter(callback) {
58
+ this.$element.addEventListener('keyup', e => {
59
+ if (e.key === 'Enter') callback(e);
60
+ });
61
+ return this;
62
+ },
63
+ onEscape(callback) {
64
+ this.$element.addEventListener('keyup', e => {
65
+ if (e.key === 'Escape') callback(e);
66
+ });
67
+ return this;
68
+ },
69
+ onArrowKey(callback) {
70
+ this.$element.addEventListener('keydown', e => {
71
+ if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {
72
+ callback(e, e.key);
73
+ }
74
+ });
75
+ return this;
76
+ }
77
+ });
61
78
 
62
79
  // Usage
63
80
  Input({ type: 'text' })
64
- .nd.onEnter(e => console.log('Form submitted'))
81
+ .nd
82
+ .onEnter(e => console.log('Submitted'))
65
83
  .onEscape(e => e.target.blur())
66
- .onArrowKey((e, direction) => console.log('Arrow pressed:', direction));
84
+ .onArrowKey((e, direction) => console.log('Arrow:', direction));
67
85
  ```
68
86
 
69
- ### 2. Form Validation Extensions
70
-
71
- Create semantic validation methods:
87
+ ### Form validation
72
88
 
73
89
  ```javascript
74
- // Required field validation
75
- NDElement.prototype.required = function(message = 'This field is required') {
76
- this.$element.addEventListener('blur', e => {
77
- const value = e.target.value.trim();
78
- if (!value) {
79
- this.showError(message);
80
- } else {
81
- this.clearError();
82
- }
83
- });
84
- return this;
85
- };
86
-
87
- // Email validation
88
- NDElement.prototype.email = function(message = 'Please enter a valid email') {
89
- this.$element.addEventListener('blur', e => {
90
- const email = e.target.value.trim();
91
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
92
- if (email && !emailRegex.test(email)) {
93
- this.showError(message);
94
- } else {
95
- this.clearError();
96
- }
97
- });
98
- return this;
99
- };
100
-
101
- // Min length validation
102
- NDElement.prototype.minLength = function(length, message) {
103
- message = message || `Minimum ${length} characters required`;
104
- this.$element.addEventListener('input', e => {
105
- if (e.target.value.length < length && e.target.value.length > 0) {
106
- this.showError(message);
107
- } else {
108
- this.clearError();
109
- }
110
- });
111
- return this;
112
- };
113
-
114
- // Error display helpers
115
- NDElement.prototype.showError = function(message) {
116
- this.clearError();
117
- const errorElement = Span({
118
- class: 'error-message',
119
- style: 'color: red; font-size: 0.8rem'
120
- }, message);
121
-
122
- this.$element.parentNode.appendChild(errorElement);
123
- this.$element.classList.add('error');
124
- return this;
125
- };
126
-
127
- NDElement.prototype.clearError = function() {
128
- const parent = this.$element.parentNode;
129
- const existingError = parent.querySelector('.error-message');
130
- if (existingError) {
131
- existingError.remove();
90
+ NDElement.extend({
91
+ required(message = 'This field is required') {
92
+ this.$element.addEventListener('blur', e => {
93
+ e.target.value.trim() ? this.clearError() : this.showError(message);
94
+ });
95
+ return this;
96
+ },
97
+ email(message = 'Please enter a valid email') {
98
+ this.$element.addEventListener('blur', e => {
99
+ const value = e.target.value.trim();
100
+ const valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
101
+ value && !valid ? this.showError(message) : this.clearError();
102
+ });
103
+ return this;
104
+ },
105
+ minLength(length, message) {
106
+ message = message || `Minimum ${length} characters required`;
107
+ this.$element.addEventListener('input', e => {
108
+ const len = e.target.value.length;
109
+ len > 0 && len < length ? this.showError(message) : this.clearError();
110
+ });
111
+ return this;
112
+ },
113
+ showError(message) {
114
+ this.clearError();
115
+ this.$element.parentNode.appendChild(
116
+ Span({ class: 'error-message', style: 'color: red; font-size: 0.8rem' }, message)
117
+ );
118
+ this.$element.classList.add('error');
119
+ return this;
120
+ },
121
+ clearError() {
122
+ this.$element.parentNode.querySelector('.error-message')?.remove();
123
+ this.$element.classList.remove('error');
124
+ return this;
132
125
  }
133
- this.$element.classList.remove('error');
134
- return this;
135
- };
126
+ });
136
127
 
137
128
  // Usage
138
129
  Input({ type: 'email', placeholder: 'Email' })
139
- .nd.required()
130
+ .nd
131
+ .required()
140
132
  .email();
141
133
 
142
134
  Input({ type: 'password', placeholder: 'Password' })
143
- .nd.required()
135
+ .nd
136
+ .required()
144
137
  .minLength(8, 'Password must be at least 8 characters');
145
138
  ```
146
139
 
147
- ### 3. Animation Extensions
148
-
149
- Create smooth animation helpers:
140
+ ### Animations
150
141
 
151
142
  ```javascript
152
- // Fade in animation
153
- NDElement.prototype.fadeIn = function(duration = 300) {
154
- this.$element.style.opacity = '0';
155
- this.$element.style.transition = `opacity ${duration}ms ease-in-out`;
156
-
157
- requestAnimationFrame(() => {
158
- this.$element.style.opacity = '1';
159
- });
160
-
161
- return this;
162
- };
163
-
164
- // Fade out animation
165
- NDElement.prototype.fadeOut = function(duration = 300, callback) {
166
- this.$element.style.transition = `opacity ${duration}ms ease-in-out`;
167
- this.$element.style.opacity = '0';
168
-
169
- setTimeout(() => {
170
- if (callback) callback();
171
- }, duration);
172
-
173
- return this;
174
- };
175
-
176
- // Slide down animation
177
- NDElement.prototype.slideDown = function(duration = 300) {
178
- const element = this.$element;
179
- element.style.maxHeight = '0';
180
- element.style.overflow = 'hidden';
181
- element.style.transition = `max-height ${duration}ms ease-in-out`;
182
-
183
- requestAnimationFrame(() => {
184
- element.style.maxHeight = element.scrollHeight + 'px';
185
- });
186
-
187
- return this;
188
- };
143
+ NDElement.extend({
144
+ fadeIn(duration = 300) {
145
+ duration = Math.max(0, parseInt(duration) || 300);
146
+ this.$element.style.opacity = '0';
147
+ this.$element.style.transition = `opacity ${duration}ms ease-in-out`;
148
+ requestAnimationFrame(() => {
149
+ this.$element.style.opacity = '1';
150
+ });
151
+ return this;
152
+ },
153
+ fadeOut(duration = 300, callback) {
154
+ duration = Math.max(0, parseInt(duration) || 300);
155
+ this.$element.style.transition = `opacity ${duration}ms ease-in-out`;
156
+ this.$element.style.opacity = '0';
157
+ setTimeout(() => { if (callback) callback(); }, duration);
158
+ return this;
159
+ },
160
+ slideDown(duration = 300) {
161
+ const el = this.$element;
162
+ el.style.maxHeight = '0';
163
+ el.style.overflow = 'hidden';
164
+ el.style.transition = `max-height ${duration}ms ease-in-out`;
165
+ requestAnimationFrame(() => {
166
+ el.style.maxHeight = el.scrollHeight + 'px';
167
+ });
168
+ return this;
169
+ }
170
+ });
189
171
 
190
172
  // Usage
191
- Div("Animated content")
192
- .nd.onClick(function() {
193
- this.nd.fadeOut(300, () => this.remove());
194
- });
173
+ Div('Animated content').nd.onClick(function() {
174
+ this.nd.fadeOut(300, () => this.nd.remove());
175
+ });
195
176
  ```
196
177
 
178
+ ---
179
+
197
180
  ## Best Practices
198
181
 
199
- ### 1. Always Return `this`
200
- Enable method chaining by returning the NDElement instance:
182
+ ### Always return `this`
183
+
184
+ Every method must return `this` to keep the chain alive:
201
185
 
202
186
  ```javascript
203
- NDElement.prototype.myMethod = function() {
204
- // Your logic here
205
- return this; // Enable chaining
206
- };
187
+ NDElement.extend({
188
+ myMethod() {
189
+ // your logic
190
+ return this; // required
191
+ }
192
+ });
207
193
  ```
208
194
 
209
- ### 2. Use Descriptive Method Names
210
- Choose names that clearly describe what the method does:
195
+ ### Use descriptive names
211
196
 
212
197
  ```javascript
213
198
  // Good
214
- NDElement.prototype.onEnter = function(callback) { /* ... */ };
215
- NDElement.prototype.fadeIn = function(duration) { /* ... */ };
199
+ NDElement.extend({ onEnter(cb) { ... } });
200
+ NDElement.extend({ fadeIn(duration) { ... } });
216
201
 
217
202
  // Avoid
218
- NDElement.prototype.ke = function(callback) { /* ... */ }; // Unclear
219
- NDElement.prototype.doStuff = function() { /* ... */ }; // Too vague
203
+ NDElement.extend({ ke(cb) { ... } }); // unclear
204
+ NDElement.extend({ doStuff() { ... } }); // too vague
220
205
  ```
221
206
 
222
- ### 3. Handle Edge Cases
223
- Always consider edge cases and provide sensible defaults:
207
+ ### Guard against edge cases
224
208
 
225
209
  ```javascript
226
- NDElement.prototype.fadeIn = function(duration = 300) {
227
- // Ensure duration is valid
228
- duration = Math.max(0, parseInt(duration) || 300);
229
-
230
- // Check if element exists
231
- if (!this.$element) return this;
232
-
233
- // Your animation logic
234
- return this;
235
- };
210
+ NDElement.extend({
211
+ fadeIn(duration = 300) {
212
+ if (!this.$element) return this;
213
+ duration = Math.max(0, parseInt(duration) || 300);
214
+ // animation logic
215
+ return this;
216
+ }
217
+ });
236
218
  ```
237
219
 
238
- ### 4. Document Your Extensions
239
-
240
- Always document your custom methods:
220
+ ### Document your extensions
241
221
 
242
222
  ```javascript
243
223
  /**
244
- * Handles Enter key press events
245
- * @param {Function} callback - Function to call when Enter is pressed
246
- * @returns {NDElement} Returns this for method chaining
224
+ * Fires callback when the Enter key is pressed
225
+ * @param {Function} callback - receives the KeyboardEvent
226
+ * @returns {NDElement} this - for chaining
247
227
  * @example
248
- * Input().nd.onEnter(e => console.log('Enter pressed'));
228
+ * Input().nd.onEnter(e => submitForm());
249
229
  */
250
- NDElement.prototype.onEnter = function(callback) {
251
- this.$element.addEventListener('keyup', e => {
252
- if (e.key === 'Enter') {
253
- callback(e);
254
- }
255
- });
256
- return this;
257
- };
230
+ NDElement.extend({
231
+ onEnter(callback) {
232
+ this.$element.addEventListener('keyup', e => {
233
+ if (e.key === 'Enter') callback(e);
234
+ });
235
+ return this;
236
+ }
237
+ });
258
238
  ```
259
239
 
260
- By extending NDElement thoughtfully, you can create a powerful, domain-specific API that makes your code more readable, maintainable, and enjoyable to work with.
240
+ ### Respect protected methods
261
241
 
262
- ## Next Steps
242
+ The following names cannot be used - attempting to extend with them throws a `NativeDocumentError`:
243
+
244
+ `constructor`, `valueOf`, `$element`, `$observer`, `ref`, `remove`, `cleanup`, `with`, `extend`, `attach`, `lifecycle`, `mounted`, `unmounted`, `unmountChildren`
263
245
 
264
- Explore these related topics to build complete applications:
246
+ ---
247
+
248
+ ## Next Steps
265
249
 
266
- - **[Args Validation](validation.md)** - Function Argument Validation
267
- - **[Memory Management](memory-management.md)** - Memory management
268
- - **[Anchor](anchor.md)** - Anchor
250
+ - **[NDElement](./native-document-element.md)** - Full NDElement API reference
251
+ - **[Lifecycle Events](./lifecycle-events.md)** - Lifecycle in depth
252
+ - **[Args Validation](./validation.md)** - Function argument validation
253
+ - **[Memory Management](./memory-management.md)** - Memory management
269
254
 
270
255
  ## Utilities
271
256
 
272
- - **[Cache](docs/utils/cache.md)** - Lazy initialization and singleton patterns
273
- - **[NativeFetch](docs/utils/native-fetch.md)** - HTTP client with interceptors
274
- - **[Filters](docs/utils/filters.md)** - Data filtering helpers
257
+ - **[Cache](./cache.md)** - Lazy initialization and singleton patterns
258
+ - **[NativeFetch](./native-fetch.md)** - HTTP client with interceptors
259
+ - **[Filters](./filters.md)** - Data filtering helpers