native-document 1.0.14 → 1.0.16-8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/.npmrc.example +1 -0
  2. package/.vitepress/config.js +166 -0
  3. package/CHANGELOG.md +153 -0
  4. package/cdn.js +19 -0
  5. package/components.d.ts +2 -0
  6. package/components.js +30 -0
  7. package/devtools/ComponentRegistry.js +113 -0
  8. package/devtools/index.js +8 -0
  9. package/devtools/plugin/dev-tools-plugin.js +15 -0
  10. package/devtools/transformers/nd-vite-devtools.js +55 -0
  11. package/devtools/transformers/src/transformComponentForHrm.js +73 -0
  12. package/devtools/transformers/src/transformJsFile.js +9 -0
  13. package/devtools/transformers/src/utils.js +79 -0
  14. package/devtools/transformers/templates/hrm.hook.template.js +46 -0
  15. package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
  16. package/devtools/widget/Widget.js +49 -0
  17. package/devtools/widget/widget.css +81 -0
  18. package/devtools/widget.js +23 -0
  19. package/dist/native-document.components.min.css +1 -0
  20. package/dist/native-document.components.min.js +23847 -0
  21. package/dist/native-document.dev.js +8665 -1313
  22. package/dist/native-document.dev.js.map +1 -0
  23. package/dist/native-document.devtools.min.js +1 -0
  24. package/dist/native-document.min.js +1 -1
  25. package/docs/advanced-components.md +419 -0
  26. package/docs/anchor.md +218 -131
  27. package/docs/cache.md +180 -0
  28. package/docs/cli.md +179 -0
  29. package/docs/components/accordion.md +172 -0
  30. package/docs/components/alert.md +99 -0
  31. package/docs/components/avatar.md +160 -0
  32. package/docs/components/badge.md +102 -0
  33. package/docs/components/breadcrumb.md +89 -0
  34. package/docs/components/button.md +183 -0
  35. package/docs/components/card.md +69 -0
  36. package/docs/components/context-menu.md +118 -0
  37. package/docs/components/data-table.md +345 -0
  38. package/docs/components/dropdown.md +214 -0
  39. package/docs/components/form/autocomplete-field.md +81 -0
  40. package/docs/components/form/checkbox-field.md +41 -0
  41. package/docs/components/form/checkbox-group-field.md +54 -0
  42. package/docs/components/form/color-field.md +64 -0
  43. package/docs/components/form/date-field.md +92 -0
  44. package/docs/components/form/field-collection.md +63 -0
  45. package/docs/components/form/file-field.md +203 -0
  46. package/docs/components/form/form-control.md +87 -0
  47. package/docs/components/form/image-field.md +90 -0
  48. package/docs/components/form/index.md +115 -0
  49. package/docs/components/form/number-field.md +65 -0
  50. package/docs/components/form/radio-field.md +51 -0
  51. package/docs/components/form/select-field.md +123 -0
  52. package/docs/components/form/slider.md +136 -0
  53. package/docs/components/form/string-field.md +134 -0
  54. package/docs/components/form/textarea-field.md +65 -0
  55. package/docs/components/form-fields.md +372 -0
  56. package/docs/components/getting-started.md +264 -0
  57. package/docs/components/index.md +337 -0
  58. package/docs/components/layout.md +279 -0
  59. package/docs/components/list.md +73 -0
  60. package/docs/components/menu.md +215 -0
  61. package/docs/components/modal.md +156 -0
  62. package/docs/components/pagination.md +95 -0
  63. package/docs/components/popover.md +131 -0
  64. package/docs/components/progress.md +111 -0
  65. package/docs/components/shortcut-manager.md +221 -0
  66. package/docs/components/simple-table.md +107 -0
  67. package/docs/components/skeleton.md +155 -0
  68. package/docs/components/spinner.md +100 -0
  69. package/docs/components/splitter.md +133 -0
  70. package/docs/components/stepper.md +163 -0
  71. package/docs/components/switch.md +113 -0
  72. package/docs/components/tabs.md +153 -0
  73. package/docs/components/toast.md +119 -0
  74. package/docs/components/tooltip.md +151 -0
  75. package/docs/components/traits.md +261 -0
  76. package/docs/conditional-rendering.md +177 -501
  77. package/docs/contributing.md +300 -25
  78. package/docs/core-concepts.md +209 -367
  79. package/docs/elements.md +268 -255
  80. package/docs/extending-native-document-element.md +259 -0
  81. package/docs/filters.md +247 -0
  82. package/docs/getting-started.md +199 -260
  83. package/docs/i18n.md +241 -0
  84. package/docs/index.md +76 -0
  85. package/docs/lifecycle-events.md +146 -67
  86. package/docs/list-rendering.md +387 -0
  87. package/docs/memory-management.md +135 -46
  88. package/docs/native-document-element.md +487 -0
  89. package/docs/native-fetch.md +213 -0
  90. package/docs/observable-resource.md +364 -0
  91. package/docs/observables.md +690 -356
  92. package/docs/routing.md +246 -646
  93. package/docs/state-management.md +213 -306
  94. package/docs/svg-elements.md +231 -0
  95. package/docs/theming.md +409 -0
  96. package/docs/tutorials/.gitkeep +0 -0
  97. package/docs/validation.md +98 -93
  98. package/docs/vitepress-conventions.md +219 -0
  99. package/elements.d.ts +7 -0
  100. package/elements.js +3 -4
  101. package/eslint.config.js +35 -0
  102. package/i18n.js +1 -0
  103. package/i18n.ts +2 -0
  104. package/index.d.ts +21 -0
  105. package/index.def.js +1086 -0
  106. package/index.js +19 -8
  107. package/package.json +59 -9
  108. package/readme.md +294 -90
  109. package/rollup.config.js +52 -3
  110. package/router.d.ts +7 -0
  111. package/router.js +0 -0
  112. package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
  113. package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
  114. package/src/components/$traits/has-draggable/has-draggable.css +8 -0
  115. package/src/components/$traits/has-items/HasItems.d.ts +9 -0
  116. package/src/components/$traits/has-items/HasItems.js +64 -0
  117. package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
  118. package/src/components/$traits/has-position/HasFullPosition.js +95 -0
  119. package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
  120. package/src/components/$traits/has-position/HasPosition.js +45 -0
  121. package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
  122. package/src/components/$traits/has-resizable/HasResizable.js +122 -0
  123. package/src/components/$traits/has-resizable/has-resizable.css +121 -0
  124. package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
  125. package/src/components/$traits/has-validation/HasValidation.js +133 -0
  126. package/src/components/BaseComponent.d.ts +32 -0
  127. package/src/components/BaseComponent.js +247 -0
  128. package/src/components/accordion/Accordion.js +268 -0
  129. package/src/components/accordion/AccordionItem.js +233 -0
  130. package/src/components/accordion/index.js +7 -0
  131. package/src/components/accordion/types/Accordion.d.ts +47 -0
  132. package/src/components/accordion/types/AccordionItem.d.ts +48 -0
  133. package/src/components/alert/Alert.js +350 -0
  134. package/src/components/alert/index.js +6 -0
  135. package/src/components/alert/types/Alert.d.ts +62 -0
  136. package/src/components/avatar/Avatar.js +430 -0
  137. package/src/components/avatar/AvatarGroup.js +97 -0
  138. package/src/components/avatar/index.js +7 -0
  139. package/src/components/avatar/types/Avatar.d.ts +74 -0
  140. package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
  141. package/src/components/badge/Badge.js +245 -0
  142. package/src/components/badge/index.js +6 -0
  143. package/src/components/badge/types/Badge.d.ts +51 -0
  144. package/src/components/base-component.css +0 -0
  145. package/src/components/breadcrumb/BreadCrumb.js +138 -0
  146. package/src/components/breadcrumb/index.js +5 -0
  147. package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
  148. package/src/components/button/Button.js +320 -0
  149. package/src/components/button/index.js +5 -0
  150. package/src/components/button/types/Button.d.ts +62 -0
  151. package/src/components/card/Card.js +282 -0
  152. package/src/components/card/index.js +5 -0
  153. package/src/components/card/types/Card.d.ts +42 -0
  154. package/src/components/context-menu/ContextMenu.js +127 -0
  155. package/src/components/context-menu/ContextMenuGroup.js +29 -0
  156. package/src/components/context-menu/ContextMenuItem.js +28 -0
  157. package/src/components/context-menu/index.js +10 -0
  158. package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
  159. package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
  160. package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
  161. package/src/components/divider/Divider.js +256 -0
  162. package/src/components/divider/index.js +6 -0
  163. package/src/components/divider/types/Divider.d.ts +55 -0
  164. package/src/components/dropdown/Dropdown.js +531 -0
  165. package/src/components/dropdown/DropdownDivider.js +45 -0
  166. package/src/components/dropdown/DropdownGroup.js +83 -0
  167. package/src/components/dropdown/DropdownItem.js +150 -0
  168. package/src/components/dropdown/DropdownTrigger.js +93 -0
  169. package/src/components/dropdown/helpers.js +53 -0
  170. package/src/components/dropdown/index.js +13 -0
  171. package/src/components/dropdown/types/Dropdown.d.ts +88 -0
  172. package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
  173. package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
  174. package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
  175. package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
  176. package/src/components/form/FormControl.js +498 -0
  177. package/src/components/form/field/Field.js +419 -0
  178. package/src/components/form/field/FieldCollection.js +292 -0
  179. package/src/components/form/field/types/AutocompleteField.js +168 -0
  180. package/src/components/form/field/types/CheckboxField.js +77 -0
  181. package/src/components/form/field/types/CheckboxGroupField.js +171 -0
  182. package/src/components/form/field/types/ColorField.js +102 -0
  183. package/src/components/form/field/types/DateField.js +315 -0
  184. package/src/components/form/field/types/EmailField.js +104 -0
  185. package/src/components/form/field/types/FileField.js +276 -0
  186. package/src/components/form/field/types/HiddenField.js +44 -0
  187. package/src/components/form/field/types/ImageField.js +138 -0
  188. package/src/components/form/field/types/NumberField.js +177 -0
  189. package/src/components/form/field/types/PasswordField.js +200 -0
  190. package/src/components/form/field/types/RadioField.js +145 -0
  191. package/src/components/form/field/types/RangeField.js +117 -0
  192. package/src/components/form/field/types/SearchField.js +66 -0
  193. package/src/components/form/field/types/SelectField.js +247 -0
  194. package/src/components/form/field/types/StringField.js +148 -0
  195. package/src/components/form/field/types/TelField.js +98 -0
  196. package/src/components/form/field/types/TextAreaField.js +142 -0
  197. package/src/components/form/field/types/TimeField.js +215 -0
  198. package/src/components/form/field/types/UrlField.js +115 -0
  199. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
  200. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
  201. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
  202. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
  203. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
  204. package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
  205. package/src/components/form/index.js +61 -0
  206. package/src/components/form/merge +0 -0
  207. package/src/components/form/types/Field.d.ts +73 -0
  208. package/src/components/form/types/FieldCollection.d.ts +53 -0
  209. package/src/components/form/types/FormControl.d.ts +64 -0
  210. package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
  211. package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
  212. package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
  213. package/src/components/form/types/fields/ColorField.d.ts +37 -0
  214. package/src/components/form/types/fields/DateField.d.ts +70 -0
  215. package/src/components/form/types/fields/EmailField.d.ts +35 -0
  216. package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
  217. package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
  218. package/src/components/form/types/fields/FileField.d.ts +56 -0
  219. package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
  220. package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
  221. package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
  222. package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
  223. package/src/components/form/types/fields/HiddenField.d.ts +26 -0
  224. package/src/components/form/types/fields/ImageField.d.ts +45 -0
  225. package/src/components/form/types/fields/NumberField.d.ts +48 -0
  226. package/src/components/form/types/fields/PasswordField.d.ts +46 -0
  227. package/src/components/form/types/fields/RadioField.d.ts +48 -0
  228. package/src/components/form/types/fields/RangeField.d.ts +44 -0
  229. package/src/components/form/types/fields/SearchField.d.ts +34 -0
  230. package/src/components/form/types/fields/SelectField.d.ts +71 -0
  231. package/src/components/form/types/fields/StringField.d.ts +48 -0
  232. package/src/components/form/types/fields/TelField.d.ts +37 -0
  233. package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
  234. package/src/components/form/types/fields/TimeField.d.ts +51 -0
  235. package/src/components/form/types/fields/UrlField.d.ts +35 -0
  236. package/src/components/form/utils.js +17 -0
  237. package/src/components/form/validation/Validation.js +565 -0
  238. package/src/components/index.d.ts +160 -0
  239. package/src/components/list/HasListItem.js +171 -0
  240. package/src/components/list/List.js +125 -0
  241. package/src/components/list/ListDivider.js +39 -0
  242. package/src/components/list/ListGroup.js +135 -0
  243. package/src/components/list/ListItem.js +212 -0
  244. package/src/components/list/index.js +12 -0
  245. package/src/components/list/types/List.d.ts +43 -0
  246. package/src/components/list/types/ListGroup.d.ts +37 -0
  247. package/src/components/list/types/ListItem.d.ts +53 -0
  248. package/src/components/menu/HasMenuItem.js +182 -0
  249. package/src/components/menu/Menu.js +227 -0
  250. package/src/components/menu/MenuDivider.js +37 -0
  251. package/src/components/menu/MenuGroup.js +126 -0
  252. package/src/components/menu/MenuItem.js +190 -0
  253. package/src/components/menu/MenuLink.js +51 -0
  254. package/src/components/menu/index.js +14 -0
  255. package/src/components/menu/types/Menu.d.ts +60 -0
  256. package/src/components/menu/types/MenuDivider.d.ts +19 -0
  257. package/src/components/menu/types/MenuGroup.d.ts +44 -0
  258. package/src/components/menu/types/MenuItem.d.ts +46 -0
  259. package/src/components/menu/types/MenuLink.d.ts +16 -0
  260. package/src/components/modal/Modal.js +524 -0
  261. package/src/components/modal/index.js +5 -0
  262. package/src/components/modal/types/Modal.d.ts +94 -0
  263. package/src/components/pagination/Pagination.js +411 -0
  264. package/src/components/pagination/index.js +5 -0
  265. package/src/components/pagination/types/Pagination.d.ts +68 -0
  266. package/src/components/popover/Popover.js +459 -0
  267. package/src/components/popover/PopoverFooter.js +61 -0
  268. package/src/components/popover/PopoverHeader.js +68 -0
  269. package/src/components/popover/index.js +10 -0
  270. package/src/components/popover/types/Popover.d.ts +83 -0
  271. package/src/components/popover/types/PopoverFooter.d.ts +24 -0
  272. package/src/components/popover/types/PopoverHeader.d.ts +26 -0
  273. package/src/components/progress/Progress.js +401 -0
  274. package/src/components/progress/index.js +6 -0
  275. package/src/components/progress/types/Progress.d.ts +77 -0
  276. package/src/components/skeleton/Skeleton.js +228 -0
  277. package/src/components/skeleton/index.js +6 -0
  278. package/src/components/skeleton/types/Skeleton.d.ts +55 -0
  279. package/src/components/slider/Slider.js +406 -0
  280. package/src/components/slider/index.js +5 -0
  281. package/src/components/slider/types/Slider.d.ts +82 -0
  282. package/src/components/spacer/Spacer.js +27 -0
  283. package/src/components/spacer/index.js +5 -0
  284. package/src/components/spacer/types/Spacer.d.ts +19 -0
  285. package/src/components/spinner/Spinner.js +350 -0
  286. package/src/components/spinner/index.js +5 -0
  287. package/src/components/spinner/types/Spinner.d.ts +71 -0
  288. package/src/components/splitter/Splitter.js +164 -0
  289. package/src/components/splitter/SplitterGutter.js +140 -0
  290. package/src/components/splitter/SplitterPanel.js +143 -0
  291. package/src/components/splitter/index.js +10 -0
  292. package/src/components/splitter/types/Splitter.d.ts +38 -0
  293. package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
  294. package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
  295. package/src/components/stacks/AbsoluteStack.js +53 -0
  296. package/src/components/stacks/FixedStack.js +53 -0
  297. package/src/components/stacks/HStack.js +54 -0
  298. package/src/components/stacks/PositionStack.js +254 -0
  299. package/src/components/stacks/RelativeStack.js +53 -0
  300. package/src/components/stacks/Stack.js +166 -0
  301. package/src/components/stacks/VStack.js +55 -0
  302. package/src/components/stacks/index.js +21 -0
  303. package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
  304. package/src/components/stacks/types/FixedStack.d.ts +16 -0
  305. package/src/components/stacks/types/HStack.d.ts +16 -0
  306. package/src/components/stacks/types/PositionStack.d.ts +54 -0
  307. package/src/components/stacks/types/RelativeStack.d.ts +17 -0
  308. package/src/components/stacks/types/Stack.d.ts +39 -0
  309. package/src/components/stacks/types/VStack.d.ts +16 -0
  310. package/src/components/stepper/Stepper.js +461 -0
  311. package/src/components/stepper/StepperStep.js +241 -0
  312. package/src/components/stepper/index.js +8 -0
  313. package/src/components/stepper/types/Stepper.d.ts +68 -0
  314. package/src/components/stepper/types/StepperStep.d.ts +54 -0
  315. package/src/components/switch/Switch.js +266 -0
  316. package/src/components/switch/index.js +6 -0
  317. package/src/components/switch/types/Switch.d.ts +55 -0
  318. package/src/components/table/Column.js +212 -0
  319. package/src/components/table/ColumnGroup.js +90 -0
  320. package/src/components/table/DataTable.js +720 -0
  321. package/src/components/table/SimpleTable.js +139 -0
  322. package/src/components/table/index.js +7 -0
  323. package/src/components/table/types/Column.d.ts +49 -0
  324. package/src/components/table/types/ColumnGroup.d.ts +28 -0
  325. package/src/components/table/types/DataTable.d.ts +97 -0
  326. package/src/components/table/types/SimpleTable.d.ts +40 -0
  327. package/src/components/tabs/Tabs.js +395 -0
  328. package/src/components/tabs/index.js +6 -0
  329. package/src/components/tabs/types/Tabs.d.ts +78 -0
  330. package/src/components/toast/Toast.js +262 -0
  331. package/src/components/toast/ToastError.js +0 -0
  332. package/src/components/toast/ToastInfo.js +0 -0
  333. package/src/components/toast/ToastSuccess.js +0 -0
  334. package/src/components/toast/ToastWarning.js +0 -0
  335. package/src/components/toast/index.js +5 -0
  336. package/src/components/toast/types/Toast.d.ts +57 -0
  337. package/src/components/toast/types/ToastError.d.ts +7 -0
  338. package/src/components/toast/types/ToastInfo.d.ts +7 -0
  339. package/src/components/toast/types/ToastSuccess.d.ts +7 -0
  340. package/src/components/toast/types/ToastWarning.d.ts +7 -0
  341. package/src/components/tooltip/Tooltip.js +359 -0
  342. package/src/components/tooltip/index.js +5 -0
  343. package/src/components/tooltip/prototypes.js +6 -0
  344. package/src/components/tooltip/types/Tooltip.d.ts +65 -0
  345. package/src/{data → core/data}/MemoryManager.js +9 -22
  346. package/src/core/data/Observable.js +227 -0
  347. package/src/core/data/ObservableArray.js +522 -0
  348. package/src/core/data/ObservableChecker.js +39 -0
  349. package/src/core/data/ObservableItem.js +611 -0
  350. package/src/core/data/ObservableObject.js +274 -0
  351. package/src/core/data/ObservableResource.js +315 -0
  352. package/src/core/data/ObservableWhen.js +54 -0
  353. package/src/core/data/Store.js +520 -0
  354. package/src/core/data/observable-helpers/observable.is-to.js +390 -0
  355. package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
  356. package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
  357. package/src/core/elements/anchor/anchor.js +210 -0
  358. package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
  359. package/src/core/elements/content-formatter.js +169 -0
  360. package/src/core/elements/control/for-each-array.js +292 -0
  361. package/src/core/elements/control/for-each.js +170 -0
  362. package/src/core/elements/control/show-if.js +94 -0
  363. package/src/core/elements/control/show-when.js +54 -0
  364. package/src/core/elements/control/switch.js +141 -0
  365. package/src/core/elements/description-list.js +19 -0
  366. package/src/core/elements/form.js +255 -0
  367. package/src/core/elements/fragment.js +8 -0
  368. package/src/core/elements/html5-semantics.js +55 -0
  369. package/src/core/elements/img.js +59 -0
  370. package/src/{elements → core/elements}/index.js +5 -4
  371. package/src/core/elements/interactive.js +25 -0
  372. package/src/core/elements/list.js +37 -0
  373. package/src/core/elements/medias.js +37 -0
  374. package/src/core/elements/meta-data.js +43 -0
  375. package/src/core/elements/svg.js +61 -0
  376. package/src/core/elements/table.js +73 -0
  377. package/src/{errors → core/errors}/ArgTypesError.js +1 -1
  378. package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
  379. package/src/core/utils/HasEventEmitter.js +85 -0
  380. package/src/core/utils/args-types.js +140 -0
  381. package/src/core/utils/cache.js +5 -0
  382. package/src/core/utils/callback-handler.js +50 -0
  383. package/src/core/utils/debug-manager.js +40 -0
  384. package/src/core/utils/events.js +148 -0
  385. package/src/core/utils/filters/date.js +178 -0
  386. package/src/core/utils/filters/index.js +4 -0
  387. package/src/core/utils/filters/standard.js +263 -0
  388. package/src/core/utils/filters/strings.js +67 -0
  389. package/src/core/utils/filters/utils.js +77 -0
  390. package/src/core/utils/formatters.js +90 -0
  391. package/src/core/utils/helpers.js +144 -0
  392. package/src/core/utils/localstorage.js +57 -0
  393. package/src/core/utils/memoize.js +115 -0
  394. package/src/core/utils/plugins-manager.js +81 -0
  395. package/src/core/utils/property-accumulator.js +72 -0
  396. package/src/core/utils/prototypes.js +44 -0
  397. package/src/core/utils/shortcut-manager.js +242 -0
  398. package/src/{utils → core/utils}/validator.js +58 -22
  399. package/src/core/wrappers/AttributesWrapper.js +181 -0
  400. package/src/core/wrappers/DocumentObserver.js +182 -0
  401. package/src/core/wrappers/ElementCreator.js +110 -0
  402. package/src/core/wrappers/HtmlElementWrapper.js +98 -0
  403. package/src/core/wrappers/NDElement.js +613 -0
  404. package/src/core/wrappers/NdPrototype.js +233 -0
  405. package/src/core/wrappers/SingletonView.js +99 -0
  406. package/src/core/wrappers/SvgElementWrapper.js +15 -0
  407. package/src/core/wrappers/TemplateBinding.js +7 -0
  408. package/src/core/wrappers/constants.js +66 -0
  409. package/src/core/wrappers/prototypes/attributes-extensions.js +24 -0
  410. package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
  411. package/src/core/wrappers/prototypes/nd-element-extensions.js +149 -0
  412. package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
  413. package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
  414. package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
  415. package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
  416. package/src/core/wrappers/template-cloner/utils.js +173 -0
  417. package/src/fetch/NativeFetch.js +89 -0
  418. package/src/i18n/bin/scan.js +132 -0
  419. package/src/i18n/index.d.ts +2 -0
  420. package/src/i18n/service/I18nService.d.ts +27 -0
  421. package/src/i18n/service/I18nService.js +46 -0
  422. package/src/i18n/service/functions.d.ts +22 -0
  423. package/src/i18n/service/functions.js +29 -0
  424. package/src/router/Route.js +33 -8
  425. package/src/router/RouteGroupHelper.js +10 -2
  426. package/src/router/Router.js +63 -22
  427. package/src/router/RouterComponent.js +114 -6
  428. package/src/{errors → router/errors}/RouterError.js +0 -1
  429. package/src/router/link.js +9 -10
  430. package/src/router/modes/HashRouter.js +2 -2
  431. package/src/router/modes/HistoryRouter.js +2 -3
  432. package/src/router/modes/MemoryRouter.js +1 -1
  433. package/src/ui/components/accordion/AccordionItemRender.js +63 -0
  434. package/src/ui/components/accordion/AccordionRender.js +35 -0
  435. package/src/ui/components/accordion/accordion.css +121 -0
  436. package/src/ui/components/alert/AlertRender.js +81 -0
  437. package/src/ui/components/alert/alert.css +163 -0
  438. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
  439. package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
  440. package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
  441. package/src/ui/components/avatar/avatar/avatar.css +189 -0
  442. package/src/ui/components/badge/BadgeRender.js +25 -0
  443. package/src/ui/components/badge/badge.css +168 -0
  444. package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
  445. package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
  446. package/src/ui/components/button/ButtonRender.js +65 -0
  447. package/src/ui/components/button/button.css +296 -0
  448. package/src/ui/components/card/CardRender.js +133 -0
  449. package/src/ui/components/card/card.css +169 -0
  450. package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
  451. package/src/ui/components/contextmenu/contextmenu.css +36 -0
  452. package/src/ui/components/divider/DividerRender.js +70 -0
  453. package/src/ui/components/divider/divider.css +70 -0
  454. package/src/ui/components/dropdown/DropdownRender.js +92 -0
  455. package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
  456. package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
  457. package/src/ui/components/dropdown/dropdown.css +179 -0
  458. package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
  459. package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
  460. package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
  461. package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
  462. package/src/ui/components/form/FieldCollectionRender.js +110 -0
  463. package/src/ui/components/form/FormControlRender.js +85 -0
  464. package/src/ui/components/form/field-collection.css +55 -0
  465. package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
  466. package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
  467. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
  468. package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
  469. package/src/ui/components/form/fields/DateFieldRender.js +155 -0
  470. package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
  471. package/src/ui/components/form/fields/FieldRender.js +118 -0
  472. package/src/ui/components/form/fields/FileFieldRender.js +41 -0
  473. package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
  474. package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
  475. package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
  476. package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
  477. package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
  478. package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
  479. package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
  480. package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
  481. package/src/ui/components/form/fields/StringFieldRender.js +6 -0
  482. package/src/ui/components/form/fields/TelFieldRender.js +6 -0
  483. package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
  484. package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
  485. package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
  486. package/src/ui/components/form/fields/date-field.css +32 -0
  487. package/src/ui/components/form/fields/field.css +402 -0
  488. package/src/ui/components/form/fields/file-field.css +79 -0
  489. package/src/ui/components/form/fields/password-field.css +50 -0
  490. package/src/ui/components/form/fields/range-field.css +120 -0
  491. package/src/ui/components/form/fields/slider.css +195 -0
  492. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
  493. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
  494. package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
  495. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
  496. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
  497. package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
  498. package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
  499. package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
  500. package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
  501. package/src/ui/components/form/form-control.css +40 -0
  502. package/src/ui/components/form/helpers.js +111 -0
  503. package/src/ui/components/form/index.js +27 -0
  504. package/src/ui/components/list/ListRender.js +18 -0
  505. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  506. package/src/ui/components/list/divider/list-divider.css +12 -0
  507. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  508. package/src/ui/components/list/group/list-group.css +62 -0
  509. package/src/ui/components/list/item/ListItemRender.js +238 -0
  510. package/src/ui/components/list/item/list-item.css +191 -0
  511. package/src/ui/components/list/list.css +24 -0
  512. package/src/ui/components/menu/MenuDividerRender.js +12 -0
  513. package/src/ui/components/menu/MenuGroupRender.js +59 -0
  514. package/src/ui/components/menu/MenuItemRender.js +57 -0
  515. package/src/ui/components/menu/MenuLinkRender.js +55 -0
  516. package/src/ui/components/menu/MenuRender.js +22 -0
  517. package/src/ui/components/menu/helpers.js +121 -0
  518. package/src/ui/components/menu/menu.css +308 -0
  519. package/src/ui/components/modal/ModalRender.js +118 -0
  520. package/src/ui/components/modal/modal.css +156 -0
  521. package/src/ui/components/pagination/PaginationRender.js +112 -0
  522. package/src/ui/components/pagination/pagination.css +63 -0
  523. package/src/ui/components/popover/PopoverRender.js +233 -0
  524. package/src/ui/components/popover/popover.css +139 -0
  525. package/src/ui/components/progress/ProgressRender.js +168 -0
  526. package/src/ui/components/progress/progress.css +197 -0
  527. package/src/ui/components/skeleton/SkeletonRender.js +136 -0
  528. package/src/ui/components/skeleton/skeleton.css +154 -0
  529. package/src/ui/components/spacer/SpacerRender.js +10 -0
  530. package/src/ui/components/spinner/SpinnerRender.js +47 -0
  531. package/src/ui/components/spinner/spinner.css +152 -0
  532. package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
  533. package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
  534. package/src/ui/components/splitter/SplitterRender.js +75 -0
  535. package/src/ui/components/splitter/splitter.css +128 -0
  536. package/src/ui/components/stacks/PositionStackRender.js +39 -0
  537. package/src/ui/components/stacks/StackRender.js +41 -0
  538. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
  539. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
  540. package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
  541. package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
  542. package/src/ui/components/stacks/index.js +5 -0
  543. package/src/ui/components/stacks/position-stack.css +62 -0
  544. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
  545. package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
  546. package/src/ui/components/stacks/stack.css +78 -0
  547. package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
  548. package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
  549. package/src/ui/components/stepper/StepperRender.js +71 -0
  550. package/src/ui/components/stepper/StepperStepRender.js +67 -0
  551. package/src/ui/components/stepper/stepper.css +359 -0
  552. package/src/ui/components/switch/SwitchRender.js +83 -0
  553. package/src/ui/components/switch/switch.css +143 -0
  554. package/src/ui/components/table/data-table/DataTableRender.js +50 -0
  555. package/src/ui/components/table/data-table/bulk-actions.js +34 -0
  556. package/src/ui/components/table/data-table/data-table.css +246 -0
  557. package/src/ui/components/table/data-table/pagination.js +56 -0
  558. package/src/ui/components/table/data-table/tables.js +368 -0
  559. package/src/ui/components/table/data-table/toolbar.js +67 -0
  560. package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
  561. package/src/ui/components/table/simple-table/simple-table.css +50 -0
  562. package/src/ui/components/tabs/TabsRender.js +226 -0
  563. package/src/ui/components/tabs/tabs.css +253 -0
  564. package/src/ui/components/toast/ToastRender.js +99 -0
  565. package/src/ui/components/toast/toast.css +201 -0
  566. package/src/ui/components/tooltip/TooltipRender.js +8 -0
  567. package/src/ui/components/tooltip/tooltip.css +113 -0
  568. package/src/ui/index.js +47 -0
  569. package/src/ui/theme.js +0 -0
  570. package/src/ui/theme.scss +1 -0
  571. package/src/ui/tokens/animation.scss +36 -0
  572. package/src/ui/tokens/colors-dark.scss +58 -0
  573. package/src/ui/tokens/colors.scss +54 -0
  574. package/src/ui/tokens/components.scss +32 -0
  575. package/src/ui/tokens/fonts.scss +57 -0
  576. package/src/ui/tokens/glass.scss +10 -0
  577. package/src/ui/tokens/index.scss +38 -0
  578. package/src/ui/tokens/layouts.scss +228 -0
  579. package/src/ui/tokens/opacity.scss +21 -0
  580. package/src/ui/tokens/others.scss +11 -0
  581. package/src/ui/tokens/radius.scss +6 -0
  582. package/src/ui/tokens/reset.scss +51 -0
  583. package/src/ui/tokens/shadows.scss +29 -0
  584. package/src/ui/tokens/spacings.scss +13 -0
  585. package/src/ui/tokens/vars.scss +35 -0
  586. package/src/ui/tokens/viewports.scss +30 -0
  587. package/types/args-types.d.ts +58 -0
  588. package/types/control-flow.d.ts +62 -0
  589. package/types/elements.d.ts +231 -0
  590. package/types/filters/dates.d.ts +43 -0
  591. package/types/filters/index.d.ts +4 -0
  592. package/types/filters/standard.d.ts +70 -0
  593. package/types/filters/strings.d.ts +21 -0
  594. package/types/filters/types.d.ts +20 -0
  595. package/types/forms.d.ts +84 -0
  596. package/types/globals.d.ts +543 -0
  597. package/types/images.d.ts +23 -0
  598. package/types/localStorage.ts +102 -0
  599. package/types/memoize.d.ts +26 -0
  600. package/types/native-fetch.d.ts +72 -0
  601. package/types/nd-element.d.ts +407 -0
  602. package/types/observable-resource.d.ts +3 -0
  603. package/types/observable.d.ts +227 -0
  604. package/types/plugins-manager.d.ts +65 -0
  605. package/types/polyfill.d.ts +18 -0
  606. package/types/property-accumulator.d.ts +33 -0
  607. package/types/router.d.ts +85 -0
  608. package/types/service.d.ts +23 -0
  609. package/types/singleton.d.ts +19 -0
  610. package/types/store.d.ts +63 -0
  611. package/types/template-cloner.ts +43 -0
  612. package/types/validator.ts +66 -0
  613. package/ui.js +1 -0
  614. package/utils.d.ts +4 -0
  615. package/utils.js +12 -0
  616. package/src/data/Observable.js +0 -233
  617. package/src/data/ObservableChecker.js +0 -38
  618. package/src/data/ObservableItem.js +0 -116
  619. package/src/data/Store.js +0 -74
  620. package/src/elements/anchor.js +0 -84
  621. package/src/elements/content-formatter.js +0 -32
  622. package/src/elements/control/for-each.js +0 -174
  623. package/src/elements/control/show-if.js +0 -79
  624. package/src/elements/control/switch.js +0 -98
  625. package/src/elements/description-list.js +0 -5
  626. package/src/elements/form.js +0 -71
  627. package/src/elements/html5-semantics.js +0 -12
  628. package/src/elements/img.js +0 -45
  629. package/src/elements/interactive.js +0 -7
  630. package/src/elements/list.js +0 -6
  631. package/src/elements/medias.js +0 -8
  632. package/src/elements/meta-data.js +0 -9
  633. package/src/elements/table.js +0 -14
  634. package/src/utils/args-types.js +0 -100
  635. package/src/utils/debug-manager.js +0 -31
  636. package/src/utils/helpers.js +0 -37
  637. package/src/utils/plugins-manager.js +0 -12
  638. package/src/utils/prototypes.js +0 -45
  639. package/src/wrappers/AttributesWrapper.js +0 -157
  640. package/src/wrappers/DocumentObserver.js +0 -51
  641. package/src/wrappers/HtmlElementEventsWrapper.js +0 -77
  642. package/src/wrappers/HtmlElementWrapper.js +0 -206
  643. package/src/wrappers/constants.js +0 -2
package/docs/anchor.md CHANGED
@@ -1,212 +1,299 @@
1
+ ---
2
+ title: Anchor
3
+ description: Anchors enable dynamic DOM manipulation without wrapper elements using invisible comment node boundaries
4
+ ---
5
+
1
6
  # Anchor
2
7
 
3
- Anchors are a NativeDocument class that enables dynamic DOM manipulation without wrapper elements. They create two invisible comment nodes that act as boundaries, allowing you to insert, remove, and replace content between them.
8
+ Anchors enable dynamic DOM manipulation without wrapper elements. They use two invisible comment nodes as boundaries, allowing you to insert, remove, and replace content between them while keeping your DOM clean.
4
9
 
5
- ## What are Anchors?
10
+ All conditional rendering and list rendering utilities in NativeDocument (`ShowIf`, `ForEach`, `Match`, etc.) are built on top of `Anchor`.
6
11
 
7
- Anchors are instances of the Anchor class that use two comment nodes as invisible markers:
12
+ ## What is an Anchor?
8
13
 
9
- `NativeDocumentFragment is Anchor alias`
14
+ An `Anchor` creates two invisible comment nodes as markers in the DOM:
10
15
 
11
16
  ```javascript
12
- // Create an anchor instance
13
- const anchor = new Anchor("My Content");
14
- // Or
15
- // const anchor = new NativeDocumentFragment("My Content");
17
+ import { Anchor } from 'native-document/elements';
18
+
19
+ const anchor = Anchor('My Section');
16
20
 
17
- // In the DOM, this creates:
18
- // <!-- Anchor Start : My Content -->
19
- // <!-- / Anchor End My Content -->
21
+ // Once in the DOM, creates:
22
+ // <!-- Anchor Start : My Section -->
23
+ // <!-- / Anchor End My Section -->
20
24
 
21
- // Content can be inserted between these markers
22
- anchor.appendChild(Div("Dynamic content"));
23
- // <!-- Anchor Start : My Content -->
25
+ anchor.appendChild(Div('Dynamic content'));
26
+ // <!-- Anchor Start : My Section -->
24
27
  // <div>Dynamic content</div>
25
- // <!-- / Anchor End My Content -->
28
+ // <!-- / Anchor End My Section -->
26
29
  ```
27
30
 
31
+ > `NativeDocumentFragment` is a valid alias for `Anchor` - both create the same system.
32
+
33
+ > Anchors must be appended to a parent element before their methods work. The comment markers only exist once the anchor is in the DOM.
34
+
35
+ ---
36
+
28
37
  ## Fragment vs Anchor
29
38
 
30
- **Fragment** is a wrapper around `document.createDocumentFragment()`:
39
+ **`Fragment`** wraps `document.createDocumentFragment()` - for one-time static content grouping:
31
40
 
32
41
  ```javascript
33
- // Fragment is standard DOM DocumentFragment
34
- const fragment = Fragment(); // Wraps document.createDocumentFragment()
35
- fragment.appendChild(Div("Standard fragment content"));
42
+ const fragment = Fragment(
43
+ H1('Static Title'),
44
+ P('Static content')
45
+ );
46
+ // Replaced entirely when appended to parent
36
47
  ```
37
48
 
38
- **Anchor** is a NativeDocument class for dynamic content management:
49
+ **`Anchor`** is for dynamic content that updates over time:
39
50
 
40
51
  ```javascript
41
- // Anchor is a NativeDocument class
42
- const anchor = new Anchor("Dynamic Area");
43
- anchor.appendChild(Div("Dynamic content")); // Uses comment markers system
52
+ const anchor = Anchor('Dynamic Area');
53
+ anchor.appendChild(Div('Initial content'));
54
+ anchor.replaceContent(Div('Updated content')); // markers stay, content swaps
44
55
  ```
45
56
 
46
- ## Dynamic Content Insertion
57
+ ---
47
58
 
48
- ### Creating Anchors
59
+ ## Why Use Anchors?
49
60
 
50
- ```javascript
51
- // Create anchor with custom identifier
52
- const contentAnchor = new Anchor("Content Area");
53
- const listAnchor = new Anchor("Todo List");
61
+ Without an anchor you need a wrapper element:
54
62
 
55
- // Anchor needs to be added to parent container
56
- const container = Div();
57
- container.appendChild(contentAnchor);
63
+ ```javascript
64
+ // Extra div in the DOM
65
+ const wrapper = Div({ class: 'wrapper' });
66
+ wrapper.appendChild(Div('Content'));
58
67
  ```
59
68
 
60
- ### appendChild() - Add Content Between Markers
69
+ With an anchor, no wrapper is needed:
61
70
 
62
71
  ```javascript
63
- const anchor = new Anchor("Dynamic Section");
64
- const container = Div();
65
- container.appendChild(anchor);
72
+ const anchor = Anchor('Content');
73
+ anchor.appendChild(Div('Content'));
74
+ // DOM: just the div between two comment nodes
75
+ ```
66
76
 
67
- // Add content between the markers
68
- anchor.appendChild(Div("Dynamic content 1"));
69
- anchor.appendChild(Div("Dynamic content 2"));
77
+ Benefits: no extra DOM nodes, cleaner HTML, no CSS interference from wrapper elements.
70
78
 
71
- // DOM structure:
72
- // <div>
73
- // <!-- Anchor Start : Dynamic Section -->
74
- // <div>Dynamic content 1</div>
75
- // <div>Dynamic content 2</div>
76
- // <!-- / Anchor End Dynamic Section -->
77
- // </div>
78
- ```
79
+ ---
79
80
 
80
- ### remove() - Clear Content Between Markers
81
+ ## API Reference
81
82
 
82
- ```javascript
83
- // Remove all content between markers (markers remain)
84
- anchor.remove(); // Content cleared, anchor can be reused
83
+ ### `appendChild(child)` / `append(child)`
84
+
85
+ Inserts content before the end marker. Accepts an element, array, or any valid child:
85
86
 
86
- // Remove markers and all content permanently
87
- anchor.remove(true); // Destroys the entire anchor system
87
+ ```javascript
88
+ anchor.appendChild(Div('Content'));
89
+ anchor.appendChild([H1('Title'), P('Body'), Button('Action')]);
90
+ anchor.append(Div('Same as appendChild'));
88
91
  ```
89
92
 
90
- ### clear() - Empty Content
93
+ ### `insertAtStart(child)`
94
+
95
+ Inserts content inside the anchor, immediately after the start marker - the opposite of `appendChild` which inserts before the end marker:
91
96
 
92
97
  ```javascript
93
- // Alias for remove() - clears content but keeps anchor
94
- anchor.clear();
98
+ anchor.insertAtStart(Div('Just before the anchor start'));
99
+ // DOM:
100
+ // <!-- Anchor Start : My Section -->
101
+ // <div>Just before the anchor start</div> <- inserted here
102
+ // ... anchor content ...
103
+ // <!-- / Anchor End My Section -->
95
104
  ```
96
105
 
97
- ## Anchor Methods
106
+ ### `replaceContent(child)` / `setContent(child)`
98
107
 
99
- ### insertBefore() - Positioned Insertion
108
+ Removes all current content and inserts new content in one operation:
100
109
 
101
110
  ```javascript
102
- const anchor = Fragment();
103
- const element1 = Div("First");
104
- const element2 = Div("Second");
105
-
106
- anchor.appendChild(element1);
107
- anchor.insertBefore(element2, element1); // Inserts before element1
108
- // Result: element2, element1
111
+ anchor.replaceContent(Div('New content'));
112
+ anchor.setContent(Div('Same as replaceContent'));
109
113
  ```
110
114
 
111
- ### Access Markers
115
+ Prefer `replaceContent()` over `remove()` + `appendChild()` - it's a single DOM operation.
112
116
 
113
- ```javascript
114
- const anchor = Fragment();
117
+ ### `removeChildren()`
115
118
 
116
- // Get the start and end comment nodes
117
- const start = anchor.startElement();
118
- const end = anchor.endElement();
119
+ Removes all content between the markers. The markers stay in place and the anchor can be reused. Children are **destroyed**:
119
120
 
120
- console.log(start.textContent); // "Anchor Start : Fragment"
121
- console.log(end.textContent); // "/ Anchor End Fragment"
121
+ ```javascript
122
+ anchor.removeChildren(); // content gone, markers remain
123
+ anchor.appendChild(Div('Fresh content')); // reuse the anchor
122
124
  ```
123
125
 
124
- ## Practical Usage with Conditionals
126
+ ### `remove()`
125
127
 
126
- ### ShowIf with Anchors
128
+ Moves all content out of the DOM back into the internal fragment - content is **preserved** but detached. The markers stay in place:
127
129
 
128
130
  ```javascript
129
- const isVisible = Observable(false);
131
+ anchor.remove(); // content detached but kept internally
132
+ anchor.appendChild(previousContent); // can be re-attached
133
+ ```
130
134
 
131
- // ShowIf returns an anchor, not a wrapper element
132
- const content = ShowIf(isVisible, () =>
133
- Div("This content appears/disappears dynamically")
134
- );
135
+ > **Difference:** `removeChildren()` destroys children. `remove()` moves them back into the fragment, preserving them for potential re-use.
135
136
 
136
- // No wrapper div created - content inserted directly between markers
137
- isVisible.set(true); // Content appears between comment nodes
138
- isVisible.set(false); // Content disappears, markers remain for reuse
139
- ```
137
+ ### `removeWithAnchors()` / `delete()`
140
138
 
141
- ### ForEach with Anchors
139
+ Destroys the content **and** removes the comment markers from the DOM. The anchor becomes unusable:
142
140
 
143
141
  ```javascript
144
- const items = Observable.array(["Item 1", "Item 2"]);
142
+ anchor.removeWithAnchors(); // or anchor.delete()
143
+ // anchor is now permanently gone
144
+ ```
145
145
 
146
- // ForEach returns an anchor managing multiple elements
147
- const list = ForEach(items, (item) =>
148
- Div(item)
149
- );
146
+ ### `getParent()`
150
147
 
151
- // Multiple divs managed between the same anchor markers
152
- items.push("Item 3"); // New div inserted at anchor position
153
- items.splice(0, 1); // First div removed, others shift within markers
148
+ Returns the current parent node:
149
+
150
+ ```javascript
151
+ const parent = anchor.getParent();
154
152
  ```
155
- :m
156
- ### Multiple Elements Without Wrapper
153
+
154
+ ### `startElement()` / `endElement()`
155
+
156
+ Returns the start or end comment node:
157
157
 
158
158
  ```javascript
159
- const anchor = new Anchor("Multi Content");
160
- const container = Div();
161
- container.appendChild(anchor);
159
+ const start = anchor.startElement();
160
+ const end = anchor.endElement();
161
+
162
+ console.log(start.textContent); // "Anchor Start : My Section"
163
+ console.log(end.textContent); // "/ Anchor End My Section"
164
+ ```
165
+
166
+ ---
167
+
168
+ ## Method Aliases
169
+
170
+ | Primary | Aliases |
171
+ |---|---|
172
+ | `appendChild(child)` | `append(child)` |
173
+ | `replaceContent(child)` | `setContent(child)` |
174
+ | `removeWithAnchors()` | `delete()` |
175
+
176
+ ---
162
177
 
163
- // Insert multiple elements without a containing wrapper
164
- anchor.appendChild([
165
- H1("Title"),
166
- P("Paragraph"),
167
- Button("Action")
168
- ]);
178
+ ## Practical Examples
169
179
 
170
- // DOM: No wrapper element, just the three elements between markers
180
+ ### Dynamic content updates
181
+
182
+ ```javascript
183
+ const anchor = Anchor('Status');
184
+ const isLoading = Observable(true);
185
+ const data = Observable(null);
186
+
187
+ anchor.appendChild(Div('Loading...'));
188
+
189
+ isLoading.subscribe(loading => {
190
+ if (loading) {
191
+ anchor.replaceContent(Div('Loading...'));
192
+ } else {
193
+ anchor.replaceContent(
194
+ data.val()
195
+ ? Div(['Data: ', data.select(d => d.name)])
196
+ : Div('No data')
197
+ );
198
+ }
199
+ });
171
200
  ```
172
201
 
173
- ## Why Use Anchors vs Fragment?
202
+ ### Custom anchor-based component
203
+
204
+ ```javascript
205
+ function ConditionalList(condition, items) {
206
+ const anchor = Anchor('ConditionalList');
207
+
208
+ const update = () => {
209
+ if (condition.val() && items.val().length) {
210
+ anchor.replaceContent(
211
+ Ul(items.val().map(item => Li(item)))
212
+ );
213
+ } else {
214
+ anchor.removeChildren();
215
+ }
216
+ };
217
+
218
+ condition.subscribe(update);
219
+ items.subscribe(update);
220
+ update();
221
+
222
+ return anchor;
223
+ }
224
+
225
+ const condition = Observable(true);
226
+ const items = Observable.array([]);
227
+ let id = 0;
228
+
229
+ document.body.appendChild(Div([
230
+ ConditionalList(condition, items),
231
+ Button('Toggle').nd.onClick(() => condition.toggle()),
232
+ Button('Add').nd.onClick(() => items.push('Item ' + (++id)))
233
+ ]));
234
+ ```
174
235
 
175
- **Use Fragment** for standard DOM operations:
236
+ ### Layout manager
176
237
 
177
238
  ```javascript
178
- // Standard DocumentFragment behavior
179
- const fragment = Fragment();
180
- fragment.appendChild(Div("Content"));
181
- // Gets replaced entirely when appended to parent
239
+ function LayoutManager() {
240
+ const header = Anchor('Header');
241
+ const content = Anchor('Content');
242
+ const footer = Anchor('Footer');
243
+
244
+ return {
245
+ setHeader: component => header.replaceContent(component),
246
+ setContent: component => content.replaceContent(component),
247
+ setFooter: component => footer.replaceContent(component),
248
+ render: () => Div([header, content, footer])
249
+ };
250
+ }
182
251
  ```
183
252
 
184
- **Use Anchor (NativeDocumentFragment)** for dynamic content management:
253
+ ---
254
+
255
+ ## How Conditional Rendering Uses Anchors
256
+
257
+ Every conditional and list rendering utility returns an anchor:
185
258
 
186
259
  ```javascript
187
- // Dynamic content area that can be updated multiple times
188
- const anchor = new Anchor("Updates");
189
- anchor.appendChild(Div("Initial content"));
190
- anchor.remove(); // Clear content
191
- anchor.appendChild(Div("New content")); // Add different content - markers remain
260
+ // ShowIf returns an anchor
261
+ const content = ShowIf(isVisible, () => Div('Hello'));
262
+ isVisible.toggle(); // anchor replaces content between its markers
263
+
264
+ // ForEach returns an anchor
265
+ const list = ForEach(items, item => Div(item));
266
+ items.push('New'); // anchor inserts new div before end marker
267
+
268
+ // Match returns an anchor
269
+ const view = Match(status, {
270
+ loading: Div('Loading...'),
271
+ success: Div('Done!')
272
+ });
273
+ status.set('success'); // anchor swaps content
192
274
  ```
193
275
 
276
+ ---
277
+
194
278
  ## Best Practices
195
279
 
196
- 1. **Use anchors for custom rendering systems** - Build optimized conditional logic
197
- 2. **Anchors are reusable** - Content can be added/removed multiple times
198
- 3. **Use remove(true)** only when permanently destroying the anchor
199
- 4. **Anchors are invisible** - They don't affect layout or styling
200
- 5. **Create your own patterns** - Anchors enable custom rendering solutions that can outperform built-in functions
280
+ 1. Use descriptive names - they appear in DOM comments and help debugging
281
+ 2. Prefer `replaceContent()` over `remove()` + `appendChild()` - it's one DOM operation
282
+ 3. Use `removeChildren()` when you want to clear and reuse the anchor
283
+ 4. Use `removeWithAnchors()` / `delete()` only when permanently destroying the anchor
284
+ 5. Anchors must be in the DOM before their methods work - always append to a parent first
285
+
286
+ ---
201
287
 
202
288
  ## Next Steps
203
289
 
204
- - **[Getting Started](docs/getting-started.md)** - Installation and first steps
205
- - **[Core Concepts](docs/core-concepts.md)** - Understanding the fundamentals
206
- - **[Observables](docs/observables.md)** - Reactive state management
207
- - **[Elements](docs/elements.md)** - Creating and composing UI
208
- - **[Conditional Rendering](docs/conditional-rendering.md)** - Dynamic content
209
- - **[Routing](docs/routing.md)** - Navigation and URL management
210
- - **[State Management](docs/state-management.md)** - Global state patterns
211
- - **[Lifecycle Events](docs/lifecycle-events.md)** - Lifecycle events
212
- - **[Memory Management](docs/memory-management.md)** - Memory management
290
+ - **[Conditional Rendering](./conditional-rendering.md)** - ShowIf, Match, Switch built on Anchor
291
+ - **[List Rendering](./list-rendering.md)** - ForEach and ForEachArray built on Anchor
292
+ - **[Elements](./elements.md)** - Creating and composing UI
293
+ - **[Memory Management](./memory-management.md)** - Cleanup and memory management
294
+
295
+ ## Utilities
296
+
297
+ - **[Cache](./cache.md)** - Lazy initialization and singleton patterns
298
+ - **[NativeFetch](./native-fetch.md)** - HTTP client with interceptors
299
+ - **[Filters](./filters.md)** - Data filtering helpers
package/docs/cache.md ADDED
@@ -0,0 +1,180 @@
1
+ ---
2
+ title: Cache
3
+ description: Lazy initialization, singleton patterns, and key-based memoization utilities
4
+ ---
5
+
6
+ # Cache
7
+
8
+ NativeDocument provides three caching utilities for optimizing function execution: lazy initialization, eager singletons, and key-based memoization.
9
+
10
+ ```javascript
11
+ import { utils } from 'native-document';
12
+ const { Cache } = utils;
13
+
14
+ // Or
15
+ import { Cache } from 'native-document/utils';
16
+ ```
17
+
18
+ ---
19
+
20
+ ## `Cache.once(fn)` - Lazy Initialization
21
+
22
+ The function is **not executed immediately**. It runs only when you access a property on the returned Proxy object. The result is cached after the first access.
23
+
24
+ ```javascript
25
+ const Config = Cache.once(() => {
26
+ console.log('Loading config...');
27
+ return {
28
+ apiUrl: 'https://api.example.com',
29
+ timeout: 5000,
30
+ maxRetries: 3
31
+ };
32
+ });
33
+
34
+ // Function not executed yet
35
+ Config.apiUrl; // "Loading config..." -> "https://api.example.com"
36
+ Config.timeout; // no log -> 5000 (cached)
37
+ ```
38
+
39
+ Use for optional features or heavy modules that may not always be needed:
40
+
41
+ ```javascript
42
+ const API = Cache.once(() => {
43
+ const client = new NativeFetch('https://api.example.com');
44
+ client.interceptors.request(config => {
45
+ config.headers['Authorization'] = `Bearer ${getToken()}`;
46
+ return config;
47
+ });
48
+ return {
49
+ users: {
50
+ list: () => client.get('/users'),
51
+ get: (id) => client.get(`/users/${id}`)
52
+ }
53
+ };
54
+ });
55
+
56
+ // Client created only on first use
57
+ const users = await API.users.list();
58
+ ```
59
+
60
+ ---
61
+
62
+ ## `Cache.singleton(fn)` - Eager Singleton
63
+
64
+ The function executes on the **first call** and caches the result. All subsequent calls return the same instance.
65
+
66
+ ```javascript
67
+ const getLogger = Cache.singleton(() => {
68
+ console.log('Creating logger...');
69
+ return {
70
+ log: msg => console.log(`[LOG] ${msg}`),
71
+ error: msg => console.error(`[ERROR] ${msg}`)
72
+ };
73
+ });
74
+
75
+ const logger = getLogger(); // "Creating logger..."
76
+ const logger2 = getLogger(); // no log
77
+ console.log(logger === logger2); // true
78
+ ```
79
+
80
+ Use for core services that must exist exactly once:
81
+
82
+ ```javascript
83
+ const getConfig = Cache.singleton(() => ({
84
+ apiUrl: import.meta.env.VITE_API_URL,
85
+ debug: import.meta.env.DEV,
86
+ version: '1.0.0'
87
+ }));
88
+
89
+ const getAPI = Cache.singleton(() => {
90
+ const config = getConfig();
91
+ const client = new NativeFetch(config.apiUrl);
92
+ client.interceptors.request(req => {
93
+ const token = localStorage.getItem('token');
94
+ if (token) {
95
+ req.headers['Authorization'] = `Bearer ${token}`;
96
+ }
97
+ return req;
98
+ });
99
+ return client;
100
+ });
101
+ ```
102
+
103
+ ---
104
+
105
+ ## `Cache.memoize(fn)` - Key-Based Memoization
106
+
107
+ Each property access creates and caches a **separate instance** using the property name as the key argument.
108
+
109
+ ```javascript
110
+ const Endpoints = Cache.memoize((resource) => {
111
+ console.log(`Creating endpoint: ${resource}`);
112
+ const api = getAPI();
113
+ return {
114
+ list: (params = {}) => api.get(`/${resource}`, params),
115
+ get: (id) => api.get(`/${resource}/${id}`),
116
+ create: (data) => api.post(`/${resource}`, data),
117
+ update: (id, data) => api.put(`/${resource}/${id}`, data),
118
+ delete: (id) => api.delete(`/${resource}/${id}`)
119
+ };
120
+ });
121
+
122
+ await Endpoints.users.list(); // "Creating endpoint: users"
123
+ await Endpoints.users.get('1'); // no log - cached
124
+ await Endpoints.posts.list(); // "Creating endpoint: posts"
125
+ ```
126
+
127
+ Use for resources that share the same structure but need separate instances per key:
128
+
129
+ ```javascript
130
+ // Namespaced localStorage
131
+ const Storage = Cache.memoize((namespace) => ({
132
+ get: (key) => JSON.parse(localStorage.getItem(`${namespace}:${key}`)),
133
+
134
+ set: (key, val) => localStorage.setItem(`${namespace}:${key}`, JSON.stringify(val)),
135
+
136
+ remove: (key) => localStorage.removeItem(`${namespace}:${key}`)
137
+ }));
138
+
139
+ Storage.user.set('theme', 'dark');
140
+ Storage.app.set('version', '1.0.0');
141
+
142
+ // Form fields with observables
143
+ const Fields = Cache.memoize(name => ({
144
+ value: Observable(''),
145
+ error: Observable(null),
146
+ reset: () => { Fields[name].value.set(''); Fields[name].error.set(null); }
147
+ }));
148
+
149
+ Fields.email.value.set('alice@example.com');
150
+ Fields.password.value.set('secret');
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Comparison
156
+
157
+ | | `Cache.once()` | `Cache.singleton()` | `Cache.memoize()` |
158
+ |---|---|---|---|
159
+ | **Execution** | Lazy - on property access | Eager - on first call | Lazy - per key on property access |
160
+ | **Access** | `obj.property` | `fn()` | `obj.key.method()` |
161
+ | **Instances** | 1 | 1 | 1 per key |
162
+ | **Best for** | Optional modules | Core services | Resources by type |
163
+
164
+ ---
165
+
166
+ ## Best Practices
167
+
168
+ 1. Use `Cache.singleton()` for core services (API client, config, logger)
169
+ 2. Use `Cache.once()` for optional or heavy modules that may not be needed
170
+ 3. Use `Cache.memoize()` for resources that share structure but need separate instances
171
+ 4. Keep memoize keys simple and predictable - avoid dynamic or timestamp-based keys
172
+ 5. Be aware that `Cache.memoize()` instances stay in memory - use only for a finite set of keys
173
+
174
+ ---
175
+
176
+ ## Next Steps
177
+
178
+ - **[NativeFetch](./native-fetch.md)** - HTTP client with interceptors
179
+ - **[State Management](./state-management.md)** - Global state with Store
180
+ - **[Observables](./observables.md)** - Reactive state management