native-document 1.0.15 → 1.0.16-8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (649) hide show
  1. package/.npmrc.example +1 -0
  2. package/.vitepress/config.js +166 -0
  3. package/CHANGELOG.md +153 -0
  4. package/cdn.js +19 -0
  5. package/components.d.ts +2 -0
  6. package/components.js +30 -0
  7. package/devtools/ComponentRegistry.js +113 -0
  8. package/devtools/index.js +8 -0
  9. package/devtools/plugin/dev-tools-plugin.js +15 -0
  10. package/devtools/transformers/nd-vite-devtools.js +55 -0
  11. package/devtools/transformers/src/transformComponentForHrm.js +73 -0
  12. package/devtools/transformers/src/transformJsFile.js +9 -0
  13. package/devtools/transformers/src/utils.js +79 -0
  14. package/devtools/transformers/templates/hrm.hook.template.js +46 -0
  15. package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
  16. package/devtools/widget/Widget.js +49 -0
  17. package/devtools/widget/widget.css +81 -0
  18. package/devtools/widget.js +23 -0
  19. package/dist/native-document.components.min.css +1 -0
  20. package/dist/native-document.components.min.js +23847 -0
  21. package/dist/native-document.dev.js +8421 -1492
  22. package/dist/native-document.dev.js.map +1 -0
  23. package/dist/native-document.devtools.min.js +1 -0
  24. package/dist/native-document.min.js +1 -1
  25. package/docs/advanced-components.md +419 -0
  26. package/docs/anchor.md +181 -257
  27. package/docs/cache.md +180 -0
  28. package/docs/cli.md +179 -0
  29. package/docs/components/accordion.md +172 -0
  30. package/docs/components/alert.md +99 -0
  31. package/docs/components/avatar.md +160 -0
  32. package/docs/components/badge.md +102 -0
  33. package/docs/components/breadcrumb.md +89 -0
  34. package/docs/components/button.md +183 -0
  35. package/docs/components/card.md +69 -0
  36. package/docs/components/context-menu.md +118 -0
  37. package/docs/components/data-table.md +345 -0
  38. package/docs/components/dropdown.md +214 -0
  39. package/docs/components/form/autocomplete-field.md +81 -0
  40. package/docs/components/form/checkbox-field.md +41 -0
  41. package/docs/components/form/checkbox-group-field.md +54 -0
  42. package/docs/components/form/color-field.md +64 -0
  43. package/docs/components/form/date-field.md +92 -0
  44. package/docs/components/form/field-collection.md +63 -0
  45. package/docs/components/form/file-field.md +203 -0
  46. package/docs/components/form/form-control.md +87 -0
  47. package/docs/components/form/image-field.md +90 -0
  48. package/docs/components/form/index.md +115 -0
  49. package/docs/components/form/number-field.md +65 -0
  50. package/docs/components/form/radio-field.md +51 -0
  51. package/docs/components/form/select-field.md +123 -0
  52. package/docs/components/form/slider.md +136 -0
  53. package/docs/components/form/string-field.md +134 -0
  54. package/docs/components/form/textarea-field.md +65 -0
  55. package/docs/components/form-fields.md +372 -0
  56. package/docs/components/getting-started.md +264 -0
  57. package/docs/components/index.md +337 -0
  58. package/docs/components/layout.md +279 -0
  59. package/docs/components/list.md +73 -0
  60. package/docs/components/menu.md +215 -0
  61. package/docs/components/modal.md +156 -0
  62. package/docs/components/pagination.md +95 -0
  63. package/docs/components/popover.md +131 -0
  64. package/docs/components/progress.md +111 -0
  65. package/docs/components/shortcut-manager.md +221 -0
  66. package/docs/components/simple-table.md +107 -0
  67. package/docs/components/skeleton.md +155 -0
  68. package/docs/components/spinner.md +100 -0
  69. package/docs/components/splitter.md +133 -0
  70. package/docs/components/stepper.md +163 -0
  71. package/docs/components/switch.md +113 -0
  72. package/docs/components/tabs.md +153 -0
  73. package/docs/components/toast.md +119 -0
  74. package/docs/components/tooltip.md +151 -0
  75. package/docs/components/traits.md +261 -0
  76. package/docs/conditional-rendering.md +177 -502
  77. package/docs/contributing.md +300 -25
  78. package/docs/core-concepts.md +207 -366
  79. package/docs/elements.md +266 -254
  80. package/docs/extending-native-document-element.md +259 -0
  81. package/docs/filters.md +247 -0
  82. package/docs/getting-started.md +195 -257
  83. package/docs/i18n.md +241 -0
  84. package/docs/index.md +76 -0
  85. package/docs/lifecycle-events.md +146 -67
  86. package/docs/list-rendering.md +240 -460
  87. package/docs/memory-management.md +135 -46
  88. package/docs/native-document-element.md +487 -0
  89. package/docs/native-fetch.md +213 -0
  90. package/docs/observable-resource.md +364 -0
  91. package/docs/observables.md +690 -357
  92. package/docs/routing.md +246 -646
  93. package/docs/state-management.md +213 -306
  94. package/docs/svg-elements.md +231 -0
  95. package/docs/theming.md +409 -0
  96. package/docs/tutorials/.gitkeep +0 -0
  97. package/docs/validation.md +98 -91
  98. package/docs/vitepress-conventions.md +219 -0
  99. package/elements.d.ts +7 -0
  100. package/elements.js +3 -4
  101. package/eslint.config.js +35 -0
  102. package/i18n.js +1 -0
  103. package/i18n.ts +2 -0
  104. package/index.d.ts +21 -0
  105. package/index.def.js +1086 -0
  106. package/index.js +19 -13
  107. package/package.json +59 -9
  108. package/readme.md +296 -93
  109. package/rollup.config.js +52 -3
  110. package/router.d.ts +7 -0
  111. package/router.js +0 -0
  112. package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
  113. package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
  114. package/src/components/$traits/has-draggable/has-draggable.css +8 -0
  115. package/src/components/$traits/has-items/HasItems.d.ts +9 -0
  116. package/src/components/$traits/has-items/HasItems.js +64 -0
  117. package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
  118. package/src/components/$traits/has-position/HasFullPosition.js +95 -0
  119. package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
  120. package/src/components/$traits/has-position/HasPosition.js +45 -0
  121. package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
  122. package/src/components/$traits/has-resizable/HasResizable.js +122 -0
  123. package/src/components/$traits/has-resizable/has-resizable.css +121 -0
  124. package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
  125. package/src/components/$traits/has-validation/HasValidation.js +133 -0
  126. package/src/components/BaseComponent.d.ts +32 -0
  127. package/src/components/BaseComponent.js +247 -0
  128. package/src/components/accordion/Accordion.js +268 -0
  129. package/src/components/accordion/AccordionItem.js +233 -0
  130. package/src/components/accordion/index.js +7 -0
  131. package/src/components/accordion/types/Accordion.d.ts +47 -0
  132. package/src/components/accordion/types/AccordionItem.d.ts +48 -0
  133. package/src/components/alert/Alert.js +350 -0
  134. package/src/components/alert/index.js +6 -0
  135. package/src/components/alert/types/Alert.d.ts +62 -0
  136. package/src/components/avatar/Avatar.js +430 -0
  137. package/src/components/avatar/AvatarGroup.js +97 -0
  138. package/src/components/avatar/index.js +7 -0
  139. package/src/components/avatar/types/Avatar.d.ts +74 -0
  140. package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
  141. package/src/components/badge/Badge.js +245 -0
  142. package/src/components/badge/index.js +6 -0
  143. package/src/components/badge/types/Badge.d.ts +51 -0
  144. package/src/components/base-component.css +0 -0
  145. package/src/components/breadcrumb/BreadCrumb.js +138 -0
  146. package/src/components/breadcrumb/index.js +5 -0
  147. package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
  148. package/src/components/button/Button.js +320 -0
  149. package/src/components/button/index.js +5 -0
  150. package/src/components/button/types/Button.d.ts +62 -0
  151. package/src/components/card/Card.js +282 -0
  152. package/src/components/card/index.js +5 -0
  153. package/src/components/card/types/Card.d.ts +42 -0
  154. package/src/components/context-menu/ContextMenu.js +127 -0
  155. package/src/components/context-menu/ContextMenuGroup.js +29 -0
  156. package/src/components/context-menu/ContextMenuItem.js +28 -0
  157. package/src/components/context-menu/index.js +10 -0
  158. package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
  159. package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
  160. package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
  161. package/src/components/divider/Divider.js +256 -0
  162. package/src/components/divider/index.js +6 -0
  163. package/src/components/divider/types/Divider.d.ts +55 -0
  164. package/src/components/dropdown/Dropdown.js +531 -0
  165. package/src/components/dropdown/DropdownDivider.js +45 -0
  166. package/src/components/dropdown/DropdownGroup.js +83 -0
  167. package/src/components/dropdown/DropdownItem.js +150 -0
  168. package/src/components/dropdown/DropdownTrigger.js +93 -0
  169. package/src/components/dropdown/helpers.js +53 -0
  170. package/src/components/dropdown/index.js +13 -0
  171. package/src/components/dropdown/types/Dropdown.d.ts +88 -0
  172. package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
  173. package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
  174. package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
  175. package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
  176. package/src/components/form/FormControl.js +498 -0
  177. package/src/components/form/field/Field.js +419 -0
  178. package/src/components/form/field/FieldCollection.js +292 -0
  179. package/src/components/form/field/types/AutocompleteField.js +168 -0
  180. package/src/components/form/field/types/CheckboxField.js +77 -0
  181. package/src/components/form/field/types/CheckboxGroupField.js +171 -0
  182. package/src/components/form/field/types/ColorField.js +102 -0
  183. package/src/components/form/field/types/DateField.js +315 -0
  184. package/src/components/form/field/types/EmailField.js +104 -0
  185. package/src/components/form/field/types/FileField.js +276 -0
  186. package/src/components/form/field/types/HiddenField.js +44 -0
  187. package/src/components/form/field/types/ImageField.js +138 -0
  188. package/src/components/form/field/types/NumberField.js +177 -0
  189. package/src/components/form/field/types/PasswordField.js +200 -0
  190. package/src/components/form/field/types/RadioField.js +145 -0
  191. package/src/components/form/field/types/RangeField.js +117 -0
  192. package/src/components/form/field/types/SearchField.js +66 -0
  193. package/src/components/form/field/types/SelectField.js +247 -0
  194. package/src/components/form/field/types/StringField.js +148 -0
  195. package/src/components/form/field/types/TelField.js +98 -0
  196. package/src/components/form/field/types/TextAreaField.js +142 -0
  197. package/src/components/form/field/types/TimeField.js +215 -0
  198. package/src/components/form/field/types/UrlField.js +115 -0
  199. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
  200. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
  201. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
  202. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
  203. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
  204. package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
  205. package/src/components/form/index.js +61 -0
  206. package/src/components/form/merge +0 -0
  207. package/src/components/form/types/Field.d.ts +73 -0
  208. package/src/components/form/types/FieldCollection.d.ts +53 -0
  209. package/src/components/form/types/FormControl.d.ts +64 -0
  210. package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
  211. package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
  212. package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
  213. package/src/components/form/types/fields/ColorField.d.ts +37 -0
  214. package/src/components/form/types/fields/DateField.d.ts +70 -0
  215. package/src/components/form/types/fields/EmailField.d.ts +35 -0
  216. package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
  217. package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
  218. package/src/components/form/types/fields/FileField.d.ts +56 -0
  219. package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
  220. package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
  221. package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
  222. package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
  223. package/src/components/form/types/fields/HiddenField.d.ts +26 -0
  224. package/src/components/form/types/fields/ImageField.d.ts +45 -0
  225. package/src/components/form/types/fields/NumberField.d.ts +48 -0
  226. package/src/components/form/types/fields/PasswordField.d.ts +46 -0
  227. package/src/components/form/types/fields/RadioField.d.ts +48 -0
  228. package/src/components/form/types/fields/RangeField.d.ts +44 -0
  229. package/src/components/form/types/fields/SearchField.d.ts +34 -0
  230. package/src/components/form/types/fields/SelectField.d.ts +71 -0
  231. package/src/components/form/types/fields/StringField.d.ts +48 -0
  232. package/src/components/form/types/fields/TelField.d.ts +37 -0
  233. package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
  234. package/src/components/form/types/fields/TimeField.d.ts +51 -0
  235. package/src/components/form/types/fields/UrlField.d.ts +35 -0
  236. package/src/components/form/utils.js +17 -0
  237. package/src/components/form/validation/Validation.js +565 -0
  238. package/src/components/index.d.ts +160 -0
  239. package/src/components/list/HasListItem.js +171 -0
  240. package/src/components/list/List.js +125 -0
  241. package/src/components/list/ListDivider.js +39 -0
  242. package/src/components/list/ListGroup.js +135 -0
  243. package/src/components/list/ListItem.js +212 -0
  244. package/src/components/list/index.js +12 -0
  245. package/src/components/list/types/List.d.ts +43 -0
  246. package/src/components/list/types/ListGroup.d.ts +37 -0
  247. package/src/components/list/types/ListItem.d.ts +53 -0
  248. package/src/components/menu/HasMenuItem.js +182 -0
  249. package/src/components/menu/Menu.js +227 -0
  250. package/src/components/menu/MenuDivider.js +37 -0
  251. package/src/components/menu/MenuGroup.js +126 -0
  252. package/src/components/menu/MenuItem.js +190 -0
  253. package/src/components/menu/MenuLink.js +51 -0
  254. package/src/components/menu/index.js +14 -0
  255. package/src/components/menu/types/Menu.d.ts +60 -0
  256. package/src/components/menu/types/MenuDivider.d.ts +19 -0
  257. package/src/components/menu/types/MenuGroup.d.ts +44 -0
  258. package/src/components/menu/types/MenuItem.d.ts +46 -0
  259. package/src/components/menu/types/MenuLink.d.ts +16 -0
  260. package/src/components/modal/Modal.js +524 -0
  261. package/src/components/modal/index.js +5 -0
  262. package/src/components/modal/types/Modal.d.ts +94 -0
  263. package/src/components/pagination/Pagination.js +411 -0
  264. package/src/components/pagination/index.js +5 -0
  265. package/src/components/pagination/types/Pagination.d.ts +68 -0
  266. package/src/components/popover/Popover.js +459 -0
  267. package/src/components/popover/PopoverFooter.js +61 -0
  268. package/src/components/popover/PopoverHeader.js +68 -0
  269. package/src/components/popover/index.js +10 -0
  270. package/src/components/popover/types/Popover.d.ts +83 -0
  271. package/src/components/popover/types/PopoverFooter.d.ts +24 -0
  272. package/src/components/popover/types/PopoverHeader.d.ts +26 -0
  273. package/src/components/progress/Progress.js +401 -0
  274. package/src/components/progress/index.js +6 -0
  275. package/src/components/progress/types/Progress.d.ts +77 -0
  276. package/src/components/skeleton/Skeleton.js +228 -0
  277. package/src/components/skeleton/index.js +6 -0
  278. package/src/components/skeleton/types/Skeleton.d.ts +55 -0
  279. package/src/components/slider/Slider.js +406 -0
  280. package/src/components/slider/index.js +5 -0
  281. package/src/components/slider/types/Slider.d.ts +82 -0
  282. package/src/components/spacer/Spacer.js +27 -0
  283. package/src/components/spacer/index.js +5 -0
  284. package/src/components/spacer/types/Spacer.d.ts +19 -0
  285. package/src/components/spinner/Spinner.js +350 -0
  286. package/src/components/spinner/index.js +5 -0
  287. package/src/components/spinner/types/Spinner.d.ts +71 -0
  288. package/src/components/splitter/Splitter.js +164 -0
  289. package/src/components/splitter/SplitterGutter.js +140 -0
  290. package/src/components/splitter/SplitterPanel.js +143 -0
  291. package/src/components/splitter/index.js +10 -0
  292. package/src/components/splitter/types/Splitter.d.ts +38 -0
  293. package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
  294. package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
  295. package/src/components/stacks/AbsoluteStack.js +53 -0
  296. package/src/components/stacks/FixedStack.js +53 -0
  297. package/src/components/stacks/HStack.js +54 -0
  298. package/src/components/stacks/PositionStack.js +254 -0
  299. package/src/components/stacks/RelativeStack.js +53 -0
  300. package/src/components/stacks/Stack.js +166 -0
  301. package/src/components/stacks/VStack.js +55 -0
  302. package/src/components/stacks/index.js +21 -0
  303. package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
  304. package/src/components/stacks/types/FixedStack.d.ts +16 -0
  305. package/src/components/stacks/types/HStack.d.ts +16 -0
  306. package/src/components/stacks/types/PositionStack.d.ts +54 -0
  307. package/src/components/stacks/types/RelativeStack.d.ts +17 -0
  308. package/src/components/stacks/types/Stack.d.ts +39 -0
  309. package/src/components/stacks/types/VStack.d.ts +16 -0
  310. package/src/components/stepper/Stepper.js +461 -0
  311. package/src/components/stepper/StepperStep.js +241 -0
  312. package/src/components/stepper/index.js +8 -0
  313. package/src/components/stepper/types/Stepper.d.ts +68 -0
  314. package/src/components/stepper/types/StepperStep.d.ts +54 -0
  315. package/src/components/switch/Switch.js +266 -0
  316. package/src/components/switch/index.js +6 -0
  317. package/src/components/switch/types/Switch.d.ts +55 -0
  318. package/src/components/table/Column.js +212 -0
  319. package/src/components/table/ColumnGroup.js +90 -0
  320. package/src/components/table/DataTable.js +720 -0
  321. package/src/components/table/SimpleTable.js +139 -0
  322. package/src/components/table/index.js +7 -0
  323. package/src/components/table/types/Column.d.ts +49 -0
  324. package/src/components/table/types/ColumnGroup.d.ts +28 -0
  325. package/src/components/table/types/DataTable.d.ts +97 -0
  326. package/src/components/table/types/SimpleTable.d.ts +40 -0
  327. package/src/components/tabs/Tabs.js +395 -0
  328. package/src/components/tabs/index.js +6 -0
  329. package/src/components/tabs/types/Tabs.d.ts +78 -0
  330. package/src/components/toast/Toast.js +262 -0
  331. package/src/components/toast/ToastError.js +0 -0
  332. package/src/components/toast/ToastInfo.js +0 -0
  333. package/src/components/toast/ToastSuccess.js +0 -0
  334. package/src/components/toast/ToastWarning.js +0 -0
  335. package/src/components/toast/index.js +5 -0
  336. package/src/components/toast/types/Toast.d.ts +57 -0
  337. package/src/components/toast/types/ToastError.d.ts +7 -0
  338. package/src/components/toast/types/ToastInfo.d.ts +7 -0
  339. package/src/components/toast/types/ToastSuccess.d.ts +7 -0
  340. package/src/components/toast/types/ToastWarning.d.ts +7 -0
  341. package/src/components/tooltip/Tooltip.js +359 -0
  342. package/src/components/tooltip/index.js +5 -0
  343. package/src/components/tooltip/prototypes.js +6 -0
  344. package/src/components/tooltip/types/Tooltip.d.ts +65 -0
  345. package/src/{data → core/data}/MemoryManager.js +2 -3
  346. package/src/core/data/Observable.js +227 -0
  347. package/src/core/data/ObservableArray.js +522 -0
  348. package/src/core/data/ObservableChecker.js +39 -0
  349. package/src/core/data/ObservableItem.js +611 -0
  350. package/src/core/data/ObservableObject.js +274 -0
  351. package/src/core/data/ObservableResource.js +315 -0
  352. package/src/core/data/ObservableWhen.js +54 -0
  353. package/src/core/data/Store.js +520 -0
  354. package/src/core/data/observable-helpers/observable.is-to.js +390 -0
  355. package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
  356. package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
  357. package/src/core/elements/anchor/anchor.js +210 -0
  358. package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
  359. package/src/core/elements/content-formatter.js +169 -0
  360. package/src/core/elements/control/for-each-array.js +292 -0
  361. package/src/{elements → core/elements}/control/for-each.js +42 -23
  362. package/src/core/elements/control/show-if.js +94 -0
  363. package/src/core/elements/control/show-when.js +54 -0
  364. package/src/core/elements/control/switch.js +141 -0
  365. package/src/core/elements/description-list.js +19 -0
  366. package/src/core/elements/form.js +255 -0
  367. package/src/core/elements/fragment.js +8 -0
  368. package/src/core/elements/html5-semantics.js +55 -0
  369. package/src/core/elements/img.js +59 -0
  370. package/src/{elements → core/elements}/index.js +4 -4
  371. package/src/core/elements/interactive.js +25 -0
  372. package/src/core/elements/list.js +37 -0
  373. package/src/core/elements/medias.js +37 -0
  374. package/src/core/elements/meta-data.js +43 -0
  375. package/src/core/elements/svg.js +61 -0
  376. package/src/core/elements/table.js +73 -0
  377. package/src/{errors → core/errors}/ArgTypesError.js +1 -1
  378. package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
  379. package/src/core/utils/HasEventEmitter.js +85 -0
  380. package/src/core/utils/args-types.js +140 -0
  381. package/src/core/utils/cache.js +5 -0
  382. package/src/core/utils/callback-handler.js +50 -0
  383. package/src/core/utils/debug-manager.js +40 -0
  384. package/src/core/utils/events.js +148 -0
  385. package/src/core/utils/filters/date.js +178 -0
  386. package/src/core/utils/filters/index.js +4 -0
  387. package/src/core/utils/filters/standard.js +263 -0
  388. package/src/core/utils/filters/strings.js +67 -0
  389. package/src/core/utils/filters/utils.js +77 -0
  390. package/src/core/utils/formatters.js +90 -0
  391. package/src/core/utils/helpers.js +144 -0
  392. package/src/core/utils/localstorage.js +57 -0
  393. package/src/core/utils/memoize.js +115 -0
  394. package/src/core/utils/plugins-manager.js +81 -0
  395. package/src/core/utils/property-accumulator.js +72 -0
  396. package/src/core/utils/prototypes.js +44 -0
  397. package/src/core/utils/shortcut-manager.js +242 -0
  398. package/src/{utils → core/utils}/validator.js +58 -22
  399. package/src/core/wrappers/AttributesWrapper.js +181 -0
  400. package/src/core/wrappers/DocumentObserver.js +182 -0
  401. package/src/core/wrappers/ElementCreator.js +110 -0
  402. package/src/core/wrappers/HtmlElementWrapper.js +98 -0
  403. package/src/core/wrappers/NDElement.js +613 -0
  404. package/src/core/wrappers/NdPrototype.js +233 -0
  405. package/src/core/wrappers/SingletonView.js +99 -0
  406. package/src/core/wrappers/SvgElementWrapper.js +15 -0
  407. package/src/core/wrappers/TemplateBinding.js +7 -0
  408. package/src/core/wrappers/constants.js +66 -0
  409. package/src/core/wrappers/prototypes/attributes-extensions.js +24 -0
  410. package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
  411. package/src/core/wrappers/prototypes/nd-element-extensions.js +149 -0
  412. package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
  413. package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
  414. package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
  415. package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
  416. package/src/core/wrappers/template-cloner/utils.js +173 -0
  417. package/src/fetch/NativeFetch.js +89 -0
  418. package/src/i18n/bin/scan.js +132 -0
  419. package/src/i18n/index.d.ts +2 -0
  420. package/src/i18n/service/I18nService.d.ts +27 -0
  421. package/src/i18n/service/I18nService.js +46 -0
  422. package/src/i18n/service/functions.d.ts +22 -0
  423. package/src/i18n/service/functions.js +29 -0
  424. package/src/router/Route.js +33 -8
  425. package/src/router/RouteGroupHelper.js +10 -2
  426. package/src/router/Router.js +63 -22
  427. package/src/router/RouterComponent.js +114 -6
  428. package/src/{errors → router/errors}/RouterError.js +0 -1
  429. package/src/router/link.js +9 -10
  430. package/src/router/modes/HashRouter.js +2 -2
  431. package/src/router/modes/HistoryRouter.js +2 -3
  432. package/src/router/modes/MemoryRouter.js +1 -1
  433. package/src/ui/components/accordion/AccordionItemRender.js +63 -0
  434. package/src/ui/components/accordion/AccordionRender.js +35 -0
  435. package/src/ui/components/accordion/accordion.css +121 -0
  436. package/src/ui/components/alert/AlertRender.js +81 -0
  437. package/src/ui/components/alert/alert.css +163 -0
  438. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
  439. package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
  440. package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
  441. package/src/ui/components/avatar/avatar/avatar.css +189 -0
  442. package/src/ui/components/badge/BadgeRender.js +25 -0
  443. package/src/ui/components/badge/badge.css +168 -0
  444. package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
  445. package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
  446. package/src/ui/components/button/ButtonRender.js +65 -0
  447. package/src/ui/components/button/button.css +296 -0
  448. package/src/ui/components/card/CardRender.js +133 -0
  449. package/src/ui/components/card/card.css +169 -0
  450. package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
  451. package/src/ui/components/contextmenu/contextmenu.css +36 -0
  452. package/src/ui/components/divider/DividerRender.js +70 -0
  453. package/src/ui/components/divider/divider.css +70 -0
  454. package/src/ui/components/dropdown/DropdownRender.js +92 -0
  455. package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
  456. package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
  457. package/src/ui/components/dropdown/dropdown.css +179 -0
  458. package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
  459. package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
  460. package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
  461. package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
  462. package/src/ui/components/form/FieldCollectionRender.js +110 -0
  463. package/src/ui/components/form/FormControlRender.js +85 -0
  464. package/src/ui/components/form/field-collection.css +55 -0
  465. package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
  466. package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
  467. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
  468. package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
  469. package/src/ui/components/form/fields/DateFieldRender.js +155 -0
  470. package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
  471. package/src/ui/components/form/fields/FieldRender.js +118 -0
  472. package/src/ui/components/form/fields/FileFieldRender.js +41 -0
  473. package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
  474. package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
  475. package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
  476. package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
  477. package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
  478. package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
  479. package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
  480. package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
  481. package/src/ui/components/form/fields/StringFieldRender.js +6 -0
  482. package/src/ui/components/form/fields/TelFieldRender.js +6 -0
  483. package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
  484. package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
  485. package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
  486. package/src/ui/components/form/fields/date-field.css +32 -0
  487. package/src/ui/components/form/fields/field.css +402 -0
  488. package/src/ui/components/form/fields/file-field.css +79 -0
  489. package/src/ui/components/form/fields/password-field.css +50 -0
  490. package/src/ui/components/form/fields/range-field.css +120 -0
  491. package/src/ui/components/form/fields/slider.css +195 -0
  492. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
  493. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
  494. package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
  495. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
  496. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
  497. package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
  498. package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
  499. package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
  500. package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
  501. package/src/ui/components/form/form-control.css +40 -0
  502. package/src/ui/components/form/helpers.js +111 -0
  503. package/src/ui/components/form/index.js +27 -0
  504. package/src/ui/components/list/ListRender.js +18 -0
  505. package/src/ui/components/list/divider/ListDividerRender.js +10 -0
  506. package/src/ui/components/list/divider/list-divider.css +12 -0
  507. package/src/ui/components/list/group/ListGroupRender.js +61 -0
  508. package/src/ui/components/list/group/list-group.css +62 -0
  509. package/src/ui/components/list/item/ListItemRender.js +238 -0
  510. package/src/ui/components/list/item/list-item.css +191 -0
  511. package/src/ui/components/list/list.css +24 -0
  512. package/src/ui/components/menu/MenuDividerRender.js +12 -0
  513. package/src/ui/components/menu/MenuGroupRender.js +59 -0
  514. package/src/ui/components/menu/MenuItemRender.js +57 -0
  515. package/src/ui/components/menu/MenuLinkRender.js +55 -0
  516. package/src/ui/components/menu/MenuRender.js +22 -0
  517. package/src/ui/components/menu/helpers.js +121 -0
  518. package/src/ui/components/menu/menu.css +308 -0
  519. package/src/ui/components/modal/ModalRender.js +118 -0
  520. package/src/ui/components/modal/modal.css +156 -0
  521. package/src/ui/components/pagination/PaginationRender.js +112 -0
  522. package/src/ui/components/pagination/pagination.css +63 -0
  523. package/src/ui/components/popover/PopoverRender.js +233 -0
  524. package/src/ui/components/popover/popover.css +139 -0
  525. package/src/ui/components/progress/ProgressRender.js +168 -0
  526. package/src/ui/components/progress/progress.css +197 -0
  527. package/src/ui/components/skeleton/SkeletonRender.js +136 -0
  528. package/src/ui/components/skeleton/skeleton.css +154 -0
  529. package/src/ui/components/spacer/SpacerRender.js +10 -0
  530. package/src/ui/components/spinner/SpinnerRender.js +47 -0
  531. package/src/ui/components/spinner/spinner.css +152 -0
  532. package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
  533. package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
  534. package/src/ui/components/splitter/SplitterRender.js +75 -0
  535. package/src/ui/components/splitter/splitter.css +128 -0
  536. package/src/ui/components/stacks/PositionStackRender.js +39 -0
  537. package/src/ui/components/stacks/StackRender.js +41 -0
  538. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
  539. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
  540. package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
  541. package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
  542. package/src/ui/components/stacks/index.js +5 -0
  543. package/src/ui/components/stacks/position-stack.css +62 -0
  544. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
  545. package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
  546. package/src/ui/components/stacks/stack.css +78 -0
  547. package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
  548. package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
  549. package/src/ui/components/stepper/StepperRender.js +71 -0
  550. package/src/ui/components/stepper/StepperStepRender.js +67 -0
  551. package/src/ui/components/stepper/stepper.css +359 -0
  552. package/src/ui/components/switch/SwitchRender.js +83 -0
  553. package/src/ui/components/switch/switch.css +143 -0
  554. package/src/ui/components/table/data-table/DataTableRender.js +50 -0
  555. package/src/ui/components/table/data-table/bulk-actions.js +34 -0
  556. package/src/ui/components/table/data-table/data-table.css +246 -0
  557. package/src/ui/components/table/data-table/pagination.js +56 -0
  558. package/src/ui/components/table/data-table/tables.js +368 -0
  559. package/src/ui/components/table/data-table/toolbar.js +67 -0
  560. package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
  561. package/src/ui/components/table/simple-table/simple-table.css +50 -0
  562. package/src/ui/components/tabs/TabsRender.js +226 -0
  563. package/src/ui/components/tabs/tabs.css +253 -0
  564. package/src/ui/components/toast/ToastRender.js +99 -0
  565. package/src/ui/components/toast/toast.css +201 -0
  566. package/src/ui/components/tooltip/TooltipRender.js +8 -0
  567. package/src/ui/components/tooltip/tooltip.css +113 -0
  568. package/src/ui/index.js +47 -0
  569. package/src/ui/theme.js +0 -0
  570. package/src/ui/theme.scss +1 -0
  571. package/src/ui/tokens/animation.scss +36 -0
  572. package/src/ui/tokens/colors-dark.scss +58 -0
  573. package/src/ui/tokens/colors.scss +54 -0
  574. package/src/ui/tokens/components.scss +32 -0
  575. package/src/ui/tokens/fonts.scss +57 -0
  576. package/src/ui/tokens/glass.scss +10 -0
  577. package/src/ui/tokens/index.scss +38 -0
  578. package/src/ui/tokens/layouts.scss +228 -0
  579. package/src/ui/tokens/opacity.scss +21 -0
  580. package/src/ui/tokens/others.scss +11 -0
  581. package/src/ui/tokens/radius.scss +6 -0
  582. package/src/ui/tokens/reset.scss +51 -0
  583. package/src/ui/tokens/shadows.scss +29 -0
  584. package/src/ui/tokens/spacings.scss +13 -0
  585. package/src/ui/tokens/vars.scss +35 -0
  586. package/src/ui/tokens/viewports.scss +30 -0
  587. package/types/args-types.d.ts +58 -0
  588. package/types/control-flow.d.ts +62 -0
  589. package/types/elements.d.ts +231 -0
  590. package/types/filters/dates.d.ts +43 -0
  591. package/types/filters/index.d.ts +4 -0
  592. package/types/filters/standard.d.ts +70 -0
  593. package/types/filters/strings.d.ts +21 -0
  594. package/types/filters/types.d.ts +20 -0
  595. package/types/forms.d.ts +84 -0
  596. package/types/globals.d.ts +543 -0
  597. package/types/images.d.ts +23 -0
  598. package/types/localStorage.ts +102 -0
  599. package/types/memoize.d.ts +26 -0
  600. package/types/native-fetch.d.ts +72 -0
  601. package/types/nd-element.d.ts +407 -0
  602. package/types/observable-resource.d.ts +3 -0
  603. package/types/observable.d.ts +227 -0
  604. package/types/plugins-manager.d.ts +65 -0
  605. package/types/polyfill.d.ts +18 -0
  606. package/types/property-accumulator.d.ts +33 -0
  607. package/types/router.d.ts +85 -0
  608. package/types/service.d.ts +23 -0
  609. package/types/singleton.d.ts +19 -0
  610. package/types/store.d.ts +63 -0
  611. package/types/template-cloner.ts +43 -0
  612. package/types/validator.ts +66 -0
  613. package/ui.js +1 -0
  614. package/utils.d.ts +4 -0
  615. package/utils.js +12 -0
  616. package/src/data/Observable.js +0 -55
  617. package/src/data/ObservableChecker.js +0 -39
  618. package/src/data/ObservableItem.js +0 -195
  619. package/src/data/Store.js +0 -74
  620. package/src/data/observable-helpers/array.js +0 -74
  621. package/src/data/observable-helpers/batch.js +0 -22
  622. package/src/data/observable-helpers/computed.js +0 -28
  623. package/src/data/observable-helpers/object.js +0 -111
  624. package/src/elements/anchor.js +0 -129
  625. package/src/elements/content-formatter.js +0 -32
  626. package/src/elements/control/for-each-array.js +0 -280
  627. package/src/elements/control/show-if.js +0 -79
  628. package/src/elements/control/switch.js +0 -98
  629. package/src/elements/description-list.js +0 -5
  630. package/src/elements/form.js +0 -71
  631. package/src/elements/html5-semantics.js +0 -12
  632. package/src/elements/img.js +0 -45
  633. package/src/elements/interactive.js +0 -7
  634. package/src/elements/list.js +0 -10
  635. package/src/elements/medias.js +0 -8
  636. package/src/elements/meta-data.js +0 -9
  637. package/src/elements/table.js +0 -14
  638. package/src/utils/args-types.js +0 -100
  639. package/src/utils/debug-manager.js +0 -31
  640. package/src/utils/helpers.js +0 -60
  641. package/src/utils/plugins-manager.js +0 -12
  642. package/src/utils/prototypes.js +0 -45
  643. package/src/wrappers/AttributesWrapper.js +0 -144
  644. package/src/wrappers/DocumentObserver.js +0 -80
  645. package/src/wrappers/ElementCreator.js +0 -114
  646. package/src/wrappers/HtmlElementEventsWrapper.js +0 -64
  647. package/src/wrappers/HtmlElementWrapper.js +0 -50
  648. package/src/wrappers/NdPrototype.js +0 -109
  649. package/src/wrappers/constants.js +0 -2
@@ -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,407 +17,314 @@ 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
- ### Store with Computed Values
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
48
  ```javascript
59
- const cartStore = Store.create('cart', {
60
- items: [],
61
- taxRate: 0.08
49
+ const userStore = Store.createResettable('user', {
50
+ id: null,
51
+ name: '',
52
+ email: '',
53
+ isLoggedIn: false
62
54
  });
63
55
 
64
- // Computed total that updates automatically
65
- const cartTotal = Observable.computed(() => {
66
- const cart = cartStore.$value;
67
- const subtotal = cart.items.reduce((sum, item) => sum + (item.price * item.quantity), 0);
68
- const tax = subtotal * cart.taxRate;
69
- return subtotal + tax;
70
- }, [cartStore]);
71
- ```
56
+ Store.reset('user');
57
+ // -> { id: null, name: '', email: '', isLoggedIn: false }
58
+ // -> all subscribers are notified automatically
72
59
 
73
- ## Using Stores
60
+ // Standard create() does not support reset
61
+ Store.reset('theme'); // throws - this store is not resettable
62
+ ```
74
63
 
75
- Access and react to store changes using Store.use() or Store.follow():
64
+ ### `Store.createComposed(name, fn, deps)`
76
65
 
77
- ### Store.use() - Primary Access Method
66
+ For a computed value accessible globally via the Store registry:
78
67
 
79
68
  ```javascript
80
- const UserProfile = () => {
81
- // Get reactive reference to store
82
- const user = Store.use('user');
83
-
84
- return Div([
85
- H1(['User Profile: ', user.check(u => u.name)]),
86
- P(['Email: ', user.check(u => u.email)]),
87
- P(['Status: ', user.check(u => u.isLoggedIn ? 'Online' : 'Offline')])
88
- ]);
89
- };
90
-
91
- // Multiple components can use the same store
92
- const UserMenu = () => {
93
- const user = Store.use('user');
94
-
95
- return Nav([
96
- ShowIf(user.check(u => u.isLoggedIn), [
97
- Link({ to: '/profile' }, 'My Profile'),
98
- Button('Logout').nd.onClick(() => {
99
- user.set({ ...user.$value, isLoggedIn: false });
100
- })
101
- ])
102
- ]);
103
- };
69
+ Store.create('products', [{ id: 1, price: 10 }]);
70
+ Store.create('cart', [{ productId: 1, quantity: 2 }]);
71
+
72
+ Store.createComposed('total', () => {
73
+ const products = Store.get('products').val();
74
+ const cart = Store.get('cart').val();
75
+ return cart.reduce((sum, item) => {
76
+ const product = products.find(p => p.id === item.productId);
77
+ return sum + (product.price * item.quantity);
78
+ }, 0);
79
+ }, ['products', 'cart']);
80
+
81
+ const total = Store.follow('total');
82
+ total.val(); // 20
83
+
84
+ // Store.use('total') -> throws - composed stores are read-only
85
+ // Store.reset('total') -> throws - composed stores cannot be reset
104
86
  ```
105
87
 
106
- ### Store.follow() - Alternative Access
88
+ For a computed value that stays local to a component, use `Observable.computed()` instead - see [Observables](./observables.md).
107
89
 
108
- ```javascript
109
- const NotificationBadge = () => {
110
- // Follow is alias for use
111
- const notifications = Store.follow('notifications');
112
-
113
- return ShowIf(notifications.check(list => list.length > 0),
114
- () => Span({ class: 'badge' }, notifications.$value.length)
115
- );
116
- };
117
- ```
90
+ ### `Store.createPersistent(name, initialValue, storageKey?)`
118
91
 
119
- ## Updating Store State
92
+ Automatically saved to localStorage on every change and restored on page load:
120
93
 
121
- Modify store state using the returned observable's methods:
94
+ ```javascript
95
+ Store.createPersistent('theme', 'light');
96
+ Store.get('theme').set('dark'); // saved automatically
122
97
 
123
- ### Direct Updates
98
+ // On next page load
99
+ Store.get('theme').val(); // "dark" - restored
124
100
 
125
- ```javascript
126
- const ThemeToggle = () => {
127
- const theme = Store.use('theme');
128
-
129
- return Button('Toggle Theme').nd.onClick(() => {
130
- const current = theme.$value;
131
- theme.set(current === 'light' ? 'dark' : 'light');
132
- });
133
- };
101
+ // Optional custom localStorage key
102
+ Store.createPersistent('theme', 'light', 'app:theme');
134
103
  ```
135
104
 
136
- ### Object Store Updates
105
+ ### `Store.createPersistentResettable(name, initialValue, storageKey?)`
106
+
107
+ Both persistent and resettable. Reset clears localStorage and restores the default:
137
108
 
138
109
  ```javascript
139
- const LoginForm = () => {
140
- const user = Store.use('user');
141
- const email = Observable('');
142
- const password = Observable('');
143
-
144
- const handleLogin = () => {
145
- // Update multiple properties
146
- user.set({
147
- ...user.$value,
148
- email: email.$value,
149
- isLoggedIn: true,
150
- name: 'User Name' // This would come from API
151
- });
152
- };
153
-
154
- return Form([
155
- Input({ type: 'email', value: email, placeholder: 'Email' }),
156
- Input({ type: 'password', value: password, placeholder: 'Password' }),
157
- Button('Login').nd.onClick(handleLogin)
158
- ]);
159
- };
110
+ const session = Store.createPersistentResettable('session', { id: null, name: '' });
111
+ session.set({ id: 1, name: 'John' }); // saved
112
+
113
+ Store.reset('session');
114
+ // -> { id: null, name: '' }
115
+ // -> localStorage entry removed
160
116
  ```
161
117
 
162
- ### Partial Updates
118
+ ---
119
+
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:
163
123
 
164
124
  ```javascript
165
- const UserSettings = () => {
166
- const user = Store.use('user');
167
-
168
- const updateName = (newName) => {
169
- // Only update specific fields
170
- user.set({
171
- ...user.$value,
172
- name: newName
173
- });
174
- };
175
-
176
- const updatePreferences = (prefs) => {
177
- user.set({
178
- ...user.$value,
179
- preferences: {
180
- ...user.$value.preferences,
181
- ...prefs
182
- }
125
+ const EventStore = Store.group('events', (group) => {
126
+ group.create('catalog', []);
127
+ group.create('filters', { category: null, date: null, city: null });
128
+ group.createResettable('selected', null);
129
+
130
+ group.createComposed('filtered', () => {
131
+ const catalog = EventStore.get('catalog').val();
132
+ const filters = EventStore.get('filters').val();
133
+ return catalog.filter(event => {
134
+ if (filters.category && event.category !== filters.category) return false;
135
+ if (filters.city && event.city !== filters.city) return false;
136
+ return true;
183
137
  });
184
- };
185
-
186
- return Div([
187
- Input({
188
- value: user.check(u => u.name),
189
- placeholder: 'Name'
190
- }).nd.onInput(e => updateName(e.target.value)),
191
-
192
- Button('Dark Mode').nd.onClick(() =>
193
- updatePreferences({ theme: 'dark' })
194
- )
195
- ]);
196
- };
197
- ```
138
+ }, ['catalog', 'filters']);
139
+ });
198
140
 
199
- ## Store Access Patterns
141
+ // Same API as Store
142
+ EventStore.use('catalog'); // two-way follower
143
+ EventStore.follow('filtered'); // read-only follower
144
+ EventStore.get('filters'); // raw observable
200
145
 
201
- ### Direct Store Access
146
+ // Direct property access - raw observable, always read-only
147
+ EventStore.catalog;
148
+ EventStore.filters;
149
+ ```
202
150
 
203
- ```javascript
204
- // Get store reference without reactivity
205
- const userStore = Store.get('user');
151
+ Groups can reference each other in `createComposed()`:
206
152
 
207
- // Check current value
208
- if (userStore.$value.isLoggedIn) {
209
- console.log('User is logged in');
210
- }
153
+ ```javascript
154
+ const CartStore = Store.group('cart', (group) => {
155
+ group.create('items', []);
156
+ group.createComposed('total', () => {
157
+ return CartStore.get('items').val()
158
+ .reduce((sum, item) => sum + item.price * item.qty, 0);
159
+ }, ['items']);
160
+ });
211
161
 
212
- // Subscribe to changes manually
213
- userStore.subscribe(newUser => {
214
- console.log('User changed:', newUser);
162
+ const OrderStore = Store.group('orders', (group) => {
163
+ group.createComposed('summary', () => ({
164
+ items: CartStore.get('items').val(),
165
+ events: EventStore.get('catalog').val()
166
+ }), [CartStore.get('items'), EventStore.get('catalog')]);
215
167
  });
216
168
  ```
217
169
 
218
- ## Real-World Examples
219
-
220
- ## Store Cleanup
170
+ Groups can be created without a name:
221
171
 
222
- Properly clean up stores when they're no longer needed:
172
+ ```javascript
173
+ const CartStore = Store.group((group) => {
174
+ group.create('items', []);
175
+ });
176
+ ```
223
177
 
224
- ### Manual Cleanup
178
+ Use groups to organize state by domain:
225
179
 
226
180
  ```javascript
227
- // Remove store and all its subscribers
228
- Store.delete('temporaryStore');
229
-
230
- // Clean up specific subscriber
231
- const userStore = Store.use('user');
232
- userStore.destroy(); // Clean up this subscriber instance
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', []);
233
190
  ```
234
191
 
235
- ## Performance Considerations
192
+ ---
193
+
194
+ ## Accessing Stores
236
195
 
237
- ### Efficient Store Updates
196
+ ### `Store.use(name)` - Two-way reactive
197
+
198
+ Returns a reactive reference. The observable's `.set()` method is inherited from `Observable` - any change notifies all subscribers:
238
199
 
239
200
  ```javascript
240
- // Good: Batch related updates
241
- const updateUserProfile = (name, email, preferences) => {
201
+ const UserProfile = () => {
242
202
  const user = Store.use('user');
243
- user.set({
244
- ...user.$value,
245
- name,
246
- email,
247
- preferences: {
248
- ...user.$value.preferences,
249
- ...preferences
250
- }
251
- });
252
- };
253
203
 
254
- // Less efficient: Multiple separate updates
255
- const updateUserProfileSlow = (name, email, preferences) => {
256
- const user = Store.use('user');
257
- user.set({ ...user.$value, name }); // Triggers update
258
- user.set({ ...user.$value, email }); // Triggers update
259
- user.set({ ...user.$value, preferences }); // Triggers update
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')])
208
+ ]);
260
209
  };
261
210
  ```
262
211
 
263
- ### Selective Subscriptions
212
+ ### `Store.follow(name)` - Read-only reactive
213
+
214
+ Any attempt to call `.set()`, `.toggle()`, or `.reset()` throws a `NativeDocumentError`:
264
215
 
265
216
  ```javascript
266
- // Subscribe to specific parts of store
267
- const UserName = () => {
268
- const user = Store.use('user');
269
-
270
- // Only re-render when name changes
271
- const userName = user.check(u => u.name);
272
-
273
- return Span(userName);
274
- };
217
+ const NotificationBadge = () => {
218
+ const notifications = Store.follow('notifications');
219
+ // notifications.set(...) -> throws NativeDocumentError
275
220
 
276
- // More efficient than re-rendering entire user profile
277
- // when only name is needed
221
+ return ShowIf(notifications.isNotEmpty(),
222
+ () => Span({ class: 'badge' }, notifications.toLength())
223
+ );
224
+ };
278
225
  ```
279
226
 
280
- ## Best Practices
227
+ ### `Store.get(name)` - Raw observable
281
228
 
282
- ### 1. Use Descriptive Store Names
229
+ Returns the raw store observable directly - no follower, no cleanup contract:
283
230
 
284
231
  ```javascript
285
- // Good: Clear, descriptive names
286
- const userAuthStore = Store.create('userAuth', defaultUser);
287
- const shoppingCartStore = Store.create('shoppingCart', defaultCart);
288
- const appSettingsStore = Store.create('appSettings', defaultSettings);
289
-
290
- // Less clear: Generic names
291
- const store1 = Store.create('data', {});
292
- const state = Store.create('state', {});
293
- ```
232
+ const userStore = Store.get('user');
294
233
 
295
- ### 2. Initialize with Complete Data Structures
234
+ if (userStore.$value.isLoggedIn) {
235
+ console.log('User is logged in');
236
+ }
296
237
 
297
- ```javascript
298
- // Good: Complete initial structure
299
- const userStore = Store.create('user', {
300
- id: null,
301
- name: '',
302
- email: '',
303
- preferences: {
304
- theme: 'light',
305
- notifications: true
306
- },
307
- isLoggedIn: false
238
+ userStore.subscribe(newUser => {
239
+ console.log('User changed:', newUser);
308
240
  });
309
-
310
- // Problematic: Incomplete structure
311
- const userStore = Store.create('user', {});
312
- // Later code might fail when accessing user.preferences.theme
313
241
  ```
314
242
 
315
- ### 3. Create Service Objects for Complex Operations
243
+ > Mutations on a raw observable from `Store.get()` impact all subscribers immediately.
316
244
 
317
- ```javascript
318
- // Good: Organized actions
319
- const AuthService= (function() {
320
- const authUser = Store.create('user', {});
321
-
322
- return {
323
- login: (credentials) => { /* ... */ },
324
- logout: () => { /* ... */ },
325
- updateProfile: (data) => { /* ... */ },
326
- updatePreferences: (prefs) => { /* ... */ }
327
- };
328
- }());
329
-
330
- // Instead of scattered update logic throughout components
331
- ```
245
+ ### Direct property access
332
246
 
333
- ### 4. Use Store for Cross-Component State Only
247
+ Stores and groups expose their observables as direct properties via a Proxy - equivalent to `Store.get()`:
334
248
 
335
249
  ```javascript
336
- // Good: Local state for component-specific data
337
- const ContactForm = () => {
338
- const name = Observable(''); // Local state
339
- const email = Observable(''); // Local state
340
- const user = Store.use('user'); // Global state
341
-
342
- return Form([/* ... */]);
343
- };
250
+ EventStore.catalog; // same as EventStore.get('catalog')
344
251
 
345
- // Avoid: Putting everything in stores
346
- // Don't store form input state globally unless shared
252
+ // Assignment and deletion are forbidden
253
+ EventStore.catalog = []; // throws - Store structure is immutable
254
+ delete EventStore.catalog; // throws - Store keys cannot be deleted
347
255
  ```
348
256
 
349
- ## Debugging Stores
257
+ ---
258
+
259
+ ## Updating Store State
350
260
 
351
- ### Store State Inspection
261
+ `.set()` is inherited from `Observable` and works the same way:
352
262
 
353
263
  ```javascript
354
- // Log current store state
355
- console.log('Current user:', Store.get('user').$value);
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 });
276
+ ```
356
277
 
357
- // Monitor store changes
358
- Store.get('user').subscribe(newUser => {
359
- console.log('User changed:', newUser);
360
- });
278
+ ---
361
279
 
362
- // Check all followers of a store
363
- const userData = Store.getWithSubscribers('user');
364
- console.log('Store value:', userData.observer.$value);
365
- console.log('Followers count:', userData.subscribers.size);
366
- ```
280
+ ## Other Store Methods
367
281
 
368
- ## Common Patterns
282
+ ### `Store.has(name)`
369
283
 
370
- ### Persistent Store
284
+ Check if a store exists before accessing it:
371
285
 
372
286
  ```javascript
373
- const createPersistentStore = (name, defaultValue, storageKey) => {
374
- // Load from localStorage
375
- const saved = localStorage.getItem(storageKey);
376
- const initialValue = saved ? JSON.parse(saved) : defaultValue;
377
-
378
- const store = Store.create(name, initialValue);
379
-
380
- // Save changes to localStorage
381
- store.subscribe(newValue => {
382
- localStorage.setItem(storageKey, JSON.stringify(newValue));
383
- });
384
-
385
- return store;
386
- };
287
+ if (Store.has('cart')) {
288
+ const cart = Store.use('cart');
289
+ }
387
290
 
388
- // Usage
389
- createPersistentStore('userPreferences', {
390
- theme: 'light',
391
- language: 'en'
392
- }, 'app_preferences');
291
+ // Typical use: dynamic module initialization
292
+ if (!Store.has('cart')) {
293
+ Store.create('cart', { items: [], total: 0 });
294
+ }
393
295
  ```
394
296
 
395
- ### Store Composition
297
+ ### `Store.delete(name)`
298
+
299
+ Destroys a store - cleans up all followers and the observable, then removes it from the registry:
396
300
 
397
301
  ```javascript
398
- // Combine multiple stores for complex state
399
- const createAppState = () => {
400
- const auth = Store.create('auth', defaultAuth);
401
- const cart = Store.create('cart', defaultCart);
402
- const settings = Store.create('settings', defaultSettings);
403
-
404
- // Computed store that combines others
405
- const appStatus = Observable.computed(() => {
406
- return {
407
- isLoggedIn: auth.$value.user !== null,
408
- cartItems: cart.$value.items.length,
409
- theme: settings.$value.theme
410
- };
411
- }, [auth, cart, settings]);
412
-
413
- return { auth, cart, settings, appStatus };
414
- };
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:
310
+
311
+ ```javascript
312
+ Store.reset('user'); // works - created with createResettable()
313
+ Store.reset('theme'); // throws - created with create()
415
314
  ```
416
315
 
316
+ ---
317
+
417
318
  ## Next Steps
418
319
 
419
- Now that you understand state management, explore these related topics:
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
325
+
326
+ ## Utilities
420
327
 
421
- - **[Lifecycle Events](lifecycle-events.md)** - Lifecycle events
422
- - **[Memory Management](memory-management.md)** - Memory management
423
- - **[Anchor](anchor.md)** - Anchor
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