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,15 +1,15 @@
1
- # State Management
2
-
3
- NativeDocument's state management system provides tools for managing application-wide state that persists across components and route changes. The Store system enables shared state with reactive updates, while Observables handle local component state.
1
+ ---
2
+ title: State Management
3
+ description: Manage application-wide state with NativeDocument's Store system - groups, persistence, computed stores, and reactive updates
4
+ ---
4
5
 
5
- ## Understanding State Management
6
+ # State Management
6
7
 
7
- State management in NativeDocument operates on two levels: local component state using Observables, and global application state using the Store system. The Store allows multiple components to share and react to the same state changes.
8
+ NativeDocument's state management operates on two levels: local component state using Observables, and global application state using the Store system. The Store allows multiple components to share and react to the same state changes.
8
9
 
9
10
  ```javascript
10
11
  import { Store, Observable } from 'native-document';
11
12
 
12
- // Create global state
13
13
  const userStore = Store.create('user', {
14
14
  id: null,
15
15
  name: '',
@@ -17,45 +17,34 @@ const userStore = Store.create('user', {
17
17
  isLoggedIn: false
18
18
  });
19
19
 
20
- // Components automatically update when store changes
21
20
  const UserGreeting = () => {
22
21
  const user = Store.use('user');
23
-
24
- return ShowIf(user.check(u => u.isLoggedIn),
22
+ return ShowIf(user.is(u => u.isLoggedIn),
25
23
  () => Div(['Welcome back, ', user.$value.name, '!'])
26
24
  );
27
25
  };
28
26
  ```
29
27
 
30
- ## Store Creation
28
+ ---
31
29
 
32
- Create named stores that can be accessed from anywhere in your application:
30
+ ## Store Creation
33
31
 
34
- ### Basic Store Creation
32
+ ### `Store.create(name, initialValue)`
35
33
 
36
34
  ```javascript
37
- // Create a simple store
38
- const themeStore = Store.create('theme', 'light');
35
+ Store.create('theme', 'light');
39
36
 
40
- // Create an object store
41
- const appStore = Store.create('app', {
37
+ Store.create('app', {
42
38
  currentPage: 'home',
43
39
  sidebarOpen: false,
44
40
  notifications: []
45
41
  });
46
-
47
- // Create with initial complex data
48
- const cartStore = Store.create('cart', {
49
- items: [],
50
- total: 0,
51
- currency: 'USD',
52
- discountCode: null
53
- });
54
42
  ```
55
43
 
56
- ### Resettable Store
44
+ ### `Store.createResettable(name, initialValue)`
45
+
46
+ Use when the store needs to return to its initial value - for example on logout or route change:
57
47
 
58
- Use `createResettable()` when the store needs to return to its initial value — for example on logout or route change.
59
48
  ```javascript
60
49
  const userStore = Store.createResettable('user', {
61
50
  id: null,
@@ -64,30 +53,21 @@ const userStore = Store.createResettable('user', {
64
53
  isLoggedIn: false
65
54
  });
66
55
 
67
- // Reset to initial value at any time
68
56
  Store.reset('user');
69
57
  // -> { id: null, name: '', email: '', isLoggedIn: false }
70
58
  // -> all subscribers are notified automatically
71
59
 
72
60
  // Standard create() does not support reset
73
- Store.reset('theme'); // throws : this store is not resettable
61
+ Store.reset('theme'); // throws - this store is not resettable
74
62
  ```
75
63
 
76
- ### Store with Computed Values
64
+ ### `Store.createComposed(name, fn, deps)`
77
65
 
78
- For a computed value that stays local, use `Observable.computed()` :
79
- ```javascript
80
- const cartTotal = Observable.computed(() => {
81
- const cart = cartStore.val();
82
- const subtotal = cart.items.reduce((sum, item) => sum + (item.price * item.quantity), 0);
83
- return subtotal + (subtotal * cart.taxRate);
84
- }, [cartStore]);
85
- ```
66
+ For a computed value accessible globally via the Store registry:
86
67
 
87
- For a computed value that must be accessible globally via the Store registry, use `createComposed()` :
88
68
  ```javascript
89
69
  Store.create('products', [{ id: 1, price: 10 }]);
90
- Store.create('cart', [{ productId: 1, quantity: 2 }]);
70
+ Store.create('cart', [{ productId: 1, quantity: 2 }]);
91
71
 
92
72
  Store.createComposed('total', () => {
93
73
  const products = Store.get('products').val();
@@ -98,26 +78,34 @@ Store.createComposed('total', () => {
98
78
  }, 0);
99
79
  }, ['products', 'cart']);
100
80
 
101
- // Access like any other store — read-only
102
81
  const total = Store.follow('total');
103
- total.val(); // -> 20
82
+ total.val(); // 20
104
83
 
105
- // Store.use('total') -> throws : composed stores are read-only
106
- // Store.reset('total') -> throws : composed stores cannot be reset
84
+ // Store.use('total') -> throws - composed stores are read-only
85
+ // Store.reset('total') -> throws - composed stores cannot be reset
107
86
  ```
108
87
 
109
- ### Persistent Store
88
+ For a computed value that stays local to a component, use `Observable.computed()` instead - see [Observables](./observables.md).
89
+
90
+ ### `Store.createPersistent(name, initialValue, storageKey?)`
91
+
92
+ Automatically saved to localStorage on every change and restored on page load:
110
93
 
111
- Use `createPersistent()` when the store needs to survive page reloads. The value is automatically restored from localStorage on load and saved on every change.
112
94
  ```javascript
113
- const theme = Store.createPersistent('theme', 'light');
114
- theme.set('dark'); // saved to localStorage automatically
95
+ Store.createPersistent('theme', 'light');
96
+ Store.get('theme').set('dark'); // saved automatically
97
+
98
+ // On next page load
99
+ Store.get('theme').val(); // "dark" - restored
115
100
 
116
- // On next page load — restored automatically
117
- Store.get('theme').val(); // "dark"
101
+ // Optional custom localStorage key
102
+ Store.createPersistent('theme', 'light', 'app:theme');
118
103
  ```
119
104
 
120
- Use `createPersistentResettable()` when you need both persistence and reset capability. Reset clears the localStorage entry and restores the default value.
105
+ ### `Store.createPersistentResettable(name, initialValue, storageKey?)`
106
+
107
+ Both persistent and resettable. Reset clears localStorage and restores the default:
108
+
121
109
  ```javascript
122
110
  const session = Store.createPersistentResettable('session', { id: null, name: '' });
123
111
  session.set({ id: 1, name: 'John' }); // saved
@@ -127,22 +115,18 @@ Store.reset('session');
127
115
  // -> localStorage entry removed
128
116
  ```
129
117
 
130
- Both methods accept an optional custom localStorage key — useful when the store name conflicts with existing keys:
131
- ```javascript
132
- Store.createPersistent('theme', 'light', 'app:theme');
133
- Store.createPersistentResettable('session', null, 'app:session');
134
- ```
118
+ ---
135
119
 
136
- ### Store Groups
120
+ ## Store Groups
121
+
122
+ `Store.group()` creates an isolated namespace. Each group is a fully independent `StoreFactory` instance - no key conflicts, no shared state with the parent store:
137
123
 
138
- Use `Store.group()` to create an isolated store namespace. Each group is a fully independent `StoreFactory` instance — no key conflicts, no shared state with the parent store.
139
124
  ```javascript
140
125
  const EventStore = Store.group('events', (group) => {
141
126
  group.create('catalog', []);
142
127
  group.create('filters', { category: null, date: null, city: null });
143
-
144
128
  group.createResettable('selected', null);
145
-
129
+
146
130
  group.createComposed('filtered', () => {
147
131
  const catalog = EventStore.get('catalog').val();
148
132
  const filters = EventStore.get('filters').val();
@@ -154,21 +138,21 @@ const EventStore = Store.group('events', (group) => {
154
138
  }, ['catalog', 'filters']);
155
139
  });
156
140
 
157
- // Usage — same API as Store
141
+ // Same API as Store
158
142
  EventStore.use('catalog'); // two-way follower
159
143
  EventStore.follow('filtered'); // read-only follower
160
144
  EventStore.get('filters'); // raw observable
161
145
 
162
- // Direct property access raw observable, always read-only
146
+ // Direct property access - raw observable, always read-only
163
147
  EventStore.catalog;
164
148
  EventStore.filters;
165
149
  ```
166
150
 
167
- Groups can reference each other in `createComposed()` for cross-group derived state:
151
+ Groups can reference each other in `createComposed()`:
152
+
168
153
  ```javascript
169
154
  const CartStore = Store.group('cart', (group) => {
170
155
  group.create('items', []);
171
-
172
156
  group.createComposed('total', () => {
173
157
  return CartStore.get('items').val()
174
158
  .reduce((sum, item) => sum + item.price * item.qty, 0);
@@ -176,89 +160,74 @@ const CartStore = Store.group('cart', (group) => {
176
160
  });
177
161
 
178
162
  const OrderStore = Store.group('orders', (group) => {
179
- group.createComposed('summary', () => {
180
- const items = CartStore.get('items').val();
181
- const events = EventStore.get('catalog').val();
182
- return { items, events };
183
- }, [CartStore.get('items'), EventStore.get('catalog')]);
163
+ group.createComposed('summary', () => ({
164
+ items: CartStore.get('items').val(),
165
+ events: EventStore.get('catalog').val()
166
+ }), [CartStore.get('items'), EventStore.get('catalog')]);
184
167
  });
185
168
  ```
186
169
 
187
- Groups can also be created without a name:
170
+ Groups can be created without a name:
171
+
188
172
  ```javascript
189
173
  const CartStore = Store.group((group) => {
190
174
  group.create('items', []);
191
175
  });
192
176
  ```
193
177
 
194
- ### Use Groups to Organize Domain State
178
+ Use groups to organize state by domain:
179
+
195
180
  ```javascript
196
- // Good: domain-driven grouping
197
- const UserStore = Store.group('user', (g) => { g.create('session', null); });
198
- const EventStore = Store.group('events', (g) => { g.create('catalog', []); });
199
- const CartStore = Store.group('cart', (g) => { g.create('items', []); });
200
-
201
- // Avoid: flat global stores for everything
202
- Store.create('userSession', null);
203
- Store.create('eventCatalog', []);
204
- Store.create('cartItems', []);
181
+ // Good - domain-driven grouping
182
+ const UserStore = Store.group('user', g => g.create('session', null));
183
+ const EventStore = Store.group('events', g => g.create('catalog', []));
184
+ const CartStore = Store.group('cart', g => g.create('items', []));
185
+
186
+ // Avoid - flat global stores for everything
187
+ Store.create('userSession', null);
188
+ Store.create('eventCatalog', []);
189
+ Store.create('cartItems', []);
205
190
  ```
206
191
 
192
+ ---
207
193
 
208
- ## Using Stores
194
+ ## Accessing Stores
209
195
 
210
- Access and react to store changes using Store.use() or Store.follow():
196
+ ### `Store.use(name)` - Two-way reactive
211
197
 
212
- ### Store.use() - Primary Access Method
198
+ Returns a reactive reference. The observable's `.set()` method is inherited from `Observable` - any change notifies all subscribers:
213
199
 
214
200
  ```javascript
215
201
  const UserProfile = () => {
216
- // Get reactive reference to store
217
202
  const user = Store.use('user');
218
-
219
- return Div([
220
- H1(['User Profile: ', user.name]),
221
- P(['Email: ', user.email]),
222
- P(['Status: ', user.check(u => u.isLoggedIn ? 'Online' : 'Offline')])
223
- ]);
224
- };
225
203
 
226
- // Multiple components can use the same store
227
- const UserMenu = () => {
228
- const user = Store.use('user');
229
-
230
- return Nav([
231
- ShowIf(user.check(u => u.isLoggedIn), [
232
- Link({ to: '/profile' }, 'My Profile'),
233
- Button('Logout').nd.onClick(() => {
234
- user.set({ ...user.$value, isLoggedIn: false });
235
- })
236
- ])
204
+ return Div([
205
+ H1(['User Profile: ', user.select(u => u.name)]),
206
+ P(['Email: ', user.select(u => u.email)]),
207
+ P(['Status: ', user.format(u => u.isLoggedIn ? 'Online' : 'Offline')])
237
208
  ]);
238
209
  };
239
210
  ```
240
211
 
241
- ### Store.follow() - Read-only Access
212
+ ### `Store.follow(name)` - Read-only reactive
213
+
214
+ Any attempt to call `.set()`, `.toggle()`, or `.reset()` throws a `NativeDocumentError`:
242
215
 
243
216
  ```javascript
244
217
  const NotificationBadge = () => {
245
- // Follow returns a read-only reference — any attempt to call
246
- // .set(), .toggle() or .reset() will throw a NativeDocumentError.
247
- // Use this when a component should only read from the store.
248
218
  const notifications = Store.follow('notifications');
249
- // notifications.set(...) -> throws NativeDocumentError
250
-
251
- return ShowIf(notifications.check(list => list.length > 0),
252
- () => Span({ class: 'badge' }, notifications.$value.length)
219
+ // notifications.set(...) -> throws NativeDocumentError
220
+
221
+ return ShowIf(notifications.isNotEmpty(),
222
+ () => Span({ class: 'badge' }, notifications.toLength())
253
223
  );
254
224
  };
255
225
  ```
256
226
 
257
- ### Store.get() - Raw Access
227
+ ### `Store.get(name)` - Raw observable
258
228
 
259
- Returns the raw store observable directly no follower, no cleanup contract. Use this for direct read access when you don't need to unsubscribe.
229
+ Returns the raw store observable directly - no follower, no cleanup contract:
260
230
 
261
- > **Warning:** mutations on this observer impact all subscribers immediately.
262
231
  ```javascript
263
232
  const userStore = Store.get('user');
264
233
 
@@ -271,167 +240,91 @@ userStore.subscribe(newUser => {
271
240
  });
272
241
  ```
273
242
 
274
- ### Direct Property Access
275
-
276
- Stores and groups expose their observables as direct properties via a Proxy. Property access returns the raw observable — equivalent to calling `Store.get()`. Any attempt to assign or delete a property will throw.
277
- ```javascript
278
- // Equivalent to Store.get('catalog')
279
- EventStore.catalog;
280
-
281
- // For a read-only follower, use follow() explicitly
282
- EventStore.follow('catalog');
283
-
284
- // Direct assignment is forbidden
285
- EventStore.catalog = []; // ❌ throws : Store structure is immutable
286
- delete EventStore.catalog; // ❌ throws : Store keys cannot be deleted
287
- ```
288
-
289
- ## Updating Store State
243
+ > Mutations on a raw observable from `Store.get()` impact all subscribers immediately.
290
244
 
291
- Modify store state using the returned observable's methods:
245
+ ### Direct property access
292
246
 
293
- ### Direct Updates
247
+ Stores and groups expose their observables as direct properties via a Proxy - equivalent to `Store.get()`:
294
248
 
295
249
  ```javascript
296
- const ThemeToggle = () => {
297
- const theme = Store.use('theme');
298
-
299
- return Button('Toggle Theme').nd.onClick(() => {
300
- const current = theme.$value;
301
- theme.set(current === 'light' ? 'dark' : 'light');
302
- });
303
- };
250
+ EventStore.catalog; // same as EventStore.get('catalog')
251
+
252
+ // Assignment and deletion are forbidden
253
+ EventStore.catalog = []; // throws - Store structure is immutable
254
+ delete EventStore.catalog; // throws - Store keys cannot be deleted
304
255
  ```
305
256
 
306
- ### Object Store Updates
257
+ ---
307
258
 
308
- ```javascript
309
- const LoginForm = () => {
310
- const user = Store.use('user');
311
- const email = Observable('');
312
- const password = Observable('');
313
-
314
- const handleLogin = () => {
315
- // Update multiple properties
316
- user.set({
317
- ...user.$value,
318
- email: email.$value,
319
- isLoggedIn: true,
320
- name: 'User Name' // ...
321
- });
322
- };
323
-
324
- return Form([
325
- Input({ type: 'email', value: email, placeholder: 'Email' }),
326
- Input({ type: 'password', value: password, placeholder: 'Password' }),
327
- Button('Login').nd.onClick(handleLogin)
328
- ]);
329
- };
330
- ```
259
+ ## Updating Store State
331
260
 
332
- ### Partial Updates
261
+ `.set()` is inherited from `Observable` and works the same way:
333
262
 
334
263
  ```javascript
335
- const UserSettings = () => {
336
- const user = Store.use('user');
337
-
338
- const updateName = (newName) => {
339
- // Only update specific fields
340
- user.set({
341
- ...user.$value,
342
- name: newName
343
- });
344
- };
345
-
346
- const updatePreferences = (prefs) => {
347
- user.set({
348
- ...user.$value,
349
- preferences: {
350
- ...user.$value.preferences,
351
- ...prefs
352
- }
353
- });
354
- };
355
-
356
- return Div([
357
- Input({
358
- value: user.check(u => u.name),
359
- placeholder: 'Name'
360
- }).nd.onInput(e => updateName(e.target.value)),
361
-
362
- Button('Dark Mode').nd.onClick(() =>
363
- updatePreferences({ theme: 'dark' })
364
- )
365
- ]);
366
- };
264
+ // Direct value
265
+ const theme = Store.use('theme');
266
+ theme.set('dark');
267
+ theme.toggle(); // for boolean stores
268
+
269
+ // Function update
270
+ const counter = Store.use('counter');
271
+ counter.set(current => current + 1);
272
+
273
+ // Object spread
274
+ const user = Store.use('user');
275
+ user.set({ ...user.$value, name: 'Alice', isLoggedIn: true });
367
276
  ```
368
277
 
369
- ## Store Access Patterns
278
+ ---
370
279
 
371
- ### Direct Store Access
280
+ ## Other Store Methods
372
281
 
373
- ```javascript
374
- // Get store reference without reactivity
375
- const userStore = Store.get('user');
282
+ ### `Store.has(name)`
376
283
 
377
- // Check current value
378
- if (userStore.$value.isLoggedIn) {
379
- console.log('User is logged in');
380
- }
284
+ Check if a store exists before accessing it:
381
285
 
382
- // Subscribe to changes manually
383
- userStore.subscribe(newUser => {
384
- console.log('User changed:', newUser);
385
- });
386
- ```
387
-
388
- ### Checking Store Existence
389
286
  ```javascript
390
- // Check if a store exists before accessing it
391
287
  if (Store.has('cart')) {
392
288
  const cart = Store.use('cart');
393
- // ...
394
289
  }
395
290
 
396
- // Typical use case : dynamic module initialization
291
+ // Typical use: dynamic module initialization
397
292
  if (!Store.has('cart')) {
398
293
  Store.create('cart', { items: [], total: 0 });
399
294
  }
400
295
  ```
401
296
 
402
- ### Store Composition
297
+ ### `Store.delete(name)`
298
+
299
+ Destroys a store - cleans up all followers and the observable, then removes it from the registry:
300
+
301
+ ```javascript
302
+ Store.delete('session'); // cleans up all subscribers and removes the store
303
+ ```
304
+
305
+ > After deletion, any existing follower references become stale. Always check with `Store.has()` before accessing a store that may have been deleted.
306
+
307
+ ### `Store.reset(name)`
308
+
309
+ Resets a resettable store to its initial value:
403
310
 
404
311
  ```javascript
405
- // Combine multiple stores for complex state
406
- const createAppState = () => {
407
- const auth = Store.create('auth', defaultAuth);
408
- const cart = Store.create('cart', defaultCart);
409
- const settings = Store.create('settings', defaultSettings);
410
-
411
- // Computed store that combines others
412
- Store.createComposed('appStatus', () => ({
413
- isLoggedIn: Store.get('auth').val().user !== null,
414
- cartItems: Store.get('cart').val().items.length,
415
- theme: Store.get('settings').val().theme
416
- }), ['auth', 'cart', 'settings']);
417
-
418
- return { auth, cart, settings, appStatus };
419
- };
312
+ Store.reset('user'); // works - created with createResettable()
313
+ Store.reset('theme'); // throws - created with create()
420
314
  ```
421
315
 
422
- ## Next Steps
316
+ ---
423
317
 
424
- Now that you understand state management, explore these related topics:
318
+ ## Next Steps
425
319
 
426
- - **[Lifecycle Events](lifecycle-events.md)** - Lifecycle events
427
- - **[NDElement](native-document-element.md)** - Native Document Element
428
- - **[Extending NDElement](extending-native-document-element.md)** - Custom Methods Guide
429
- - **[Args Validation](validation.md)** - Function Argument Validation
430
- - **[Memory Management](memory-management.md)** - Memory management
431
- - **[Anchor](anchor.md)** - Anchor
320
+ - **[Observables](./observables.md)** - Local state and reactive primitives
321
+ - **[Lifecycle Events](./lifecycle-events.md)** - Lifecycle events
322
+ - **[NDElement](./native-document-element.md)** - Native Document Element
323
+ - **[Args Validation](./validation.md)** - Function argument validation
324
+ - **[Memory Management](./memory-management.md)** - Memory management
432
325
 
433
326
  ## Utilities
434
327
 
435
- - **[Cache](docs/utils/cache.md)** - Lazy initialization and singleton patterns
436
- - **[NativeFetch](docs/utils/native-fetch.md)** - HTTP client with interceptors
437
- - **[Filters](docs/utils/filters.md)** - Data filtering helpers
328
+ - **[Cache](./cache.md)** - Lazy initialization and singleton patterns
329
+ - **[NativeFetch](./native-fetch.md)** - HTTP client with interceptors
330
+ - **[Filters](./filters.md)** - Data filtering helpers