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
@@ -0,0 +1,337 @@
1
+ ---
2
+ title: Components
3
+ description: NativeDocument's headless UI component system - describe your interface without choosing a theme, build fast, change the look anytime
4
+ ---
5
+
6
+ # Components
7
+
8
+ NativeDocument ships a separate `@native-document/components` package with 50+ UI components.
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install @native-document/components
14
+ ```
15
+
16
+ ```javascript
17
+ import { Button, Modal, Tabs } from '@native-document/components';
18
+ ```
19
+
20
+ ---
21
+
22
+ ## The Philosophy
23
+
24
+ ### Describe your interface. Worry about the look later.
25
+
26
+ The goal of the component system is simple: let you **build fast without making visual decisions upfront**.
27
+
28
+ When you write `Button('Save').variant('primary').size('large').rounded().loading(isSubmitting)`, you are describing **what the component should look like and what state it is in** - primary, large, rounded, loading. You are not deciding *how* those descriptions translate to pixels. That is the renderer's job.
29
+
30
+ `rounded()` says "this should be rounded". The renderer decides whether that means `border-radius: 4px`, `border-radius: 9999px`, a CSS class, or a Tailwind utility. You can change that decision at any time without touching the component.
31
+
32
+ This means:
33
+
34
+ - **Start immediately** - no design system required, no theme to configure first
35
+ - **Change the look anytime** - edit one renderer file and every component updates automatically, without touching a single line of business logic
36
+ - **No CSS wars** - no specificity conflicts, no `!important`, no framework overrides
37
+ - **One component, any visual system** - Tailwind, Bootstrap, your own CSS, or bare styles
38
+
39
+ ### Describe intent. The renderer decides implementation.
40
+
41
+ Every component lets you express visual intent through a fluent API. A `Button` knows it can be `primary`, `large`, `rounded`, `loading`, or `disabled`. It does not know what CSS rules those words translate to - that is the renderer's responsibility.
42
+
43
+ When you need to change the UI from Bootstrap to Tailwind, or from flat to material design - you edit the renderer. Nothing else changes.
44
+
45
+ ### The `$description` Contract
46
+
47
+ Every component builds a `$description` object - a plain object that describes the current state of the component. The renderer receives this object and returns a DOM element.
48
+
49
+ ```javascript
50
+ // What Button.$description looks like:
51
+ {
52
+ label: 'Submit',
53
+ type: 'submit',
54
+ variant: 'primary',
55
+ size: 'large',
56
+ icon: null,
57
+ iconPosition: 'leading',
58
+ loading: Observable(false),
59
+ disabled: Observable(false),
60
+ outline: false,
61
+ block: false,
62
+ borderRadiusType: 'rounded',
63
+ props: { class: 'my-btn' },
64
+ render: null // custom per-instance renderer
65
+ }
66
+ ```
67
+
68
+ The renderer is a function that receives `$description` and returns a DOM element:
69
+
70
+ ```javascript
71
+ Button.use(($description, component) => {
72
+ return NativeButton({
73
+ type: $description.type || 'button',
74
+ class: buildClasses($description),
75
+ disabled: $description.disabled
76
+ }, [
77
+ ShowIf($description.loading, () => Spinner()),
78
+ $description.icon && $description.iconPosition === 'leading'
79
+ ? $description.icon
80
+ : null,
81
+ $description.label,
82
+ $description.icon && $description.iconPosition === 'trailing'
83
+ ? $description.icon
84
+ : null,
85
+ ]);
86
+ });
87
+ ```
88
+
89
+ ### Fluent API
90
+
91
+ Every component uses a fluent builder API. Methods configure the `$description` and return `this` for chaining. The component is only rendered when you access `.nd` or append it to the DOM:
92
+
93
+ ```javascript
94
+ Button('Submit')
95
+ .variant('primary')
96
+ .size('large')
97
+ .loading(isSubmitting)
98
+ .disabled(isDisabled)
99
+ .rounded()
100
+ .nd.onClick(() => submitForm())
101
+ ```
102
+
103
+ ### Rendering is Lazy
104
+
105
+ The component function runs immediately, but the DOM is not built until:
106
+
107
+ - You access `.nd` (triggers `.toNdElement()`)
108
+ - You append the component to the DOM directly
109
+
110
+ This means you can fully configure a component before it renders.
111
+
112
+ ---
113
+
114
+ ## Registering a Renderer
115
+
116
+ ### Global renderer
117
+
118
+ ```javascript
119
+ import { Button } from '@native-document/components';
120
+
121
+ // Called once at app startup - applies to all Button instances
122
+ Button.use(($description) => {
123
+ const classes = ['btn'];
124
+
125
+ if ($description.variant) { classes.push(`btn-${$description.variant}`); }
126
+ if ($description.size) { classes.push(`btn-${$description.size}`); }
127
+ if ($description.block) { classes.push('btn-block'); }
128
+ if ($description.outline) { classes.push('btn-outline'); }
129
+
130
+ return NativeButton({
131
+ type: $description.type || 'button',
132
+ class: classes.join(' '),
133
+ disabled: $description.disabled,
134
+ ...$description.props
135
+ }, $description.label);
136
+ });
137
+ ```
138
+
139
+ ### Per-instance renderer
140
+
141
+ Override the global renderer for a specific instance:
142
+
143
+ ```javascript
144
+ Button('Special')
145
+ .render(($description) => {
146
+ return NativeButton({ class: 'special-btn' }, $description.label);
147
+ })
148
+ .nd.onClick(() => console.log('Special!'))
149
+ ```
150
+
151
+ ---
152
+
153
+ ## `setDescription()` - Reactive Updates
154
+
155
+ `setDescription()` updates the `$description` object. If a key already holds an observable, it calls `.set()` on it instead of replacing it - keeping reactive bindings intact:
156
+
157
+ ```javascript
158
+ const btn = Button('Save').loading(Observable(false));
159
+
160
+ // Later - updates the observable, DOM reacts automatically
161
+ btn.setDescription({ loading: true });
162
+ ```
163
+
164
+ ---
165
+
166
+ ## `showIf()` / `visibility()`
167
+
168
+ Conditionally render the entire component:
169
+
170
+ ```javascript
171
+ Button('Admin Only')
172
+ .showIf(user.is(u => u.isAdmin))
173
+ .variant('danger')
174
+ ```
175
+
176
+ ---
177
+
178
+ ## `props()` - Pass HTML Attributes
179
+
180
+ Pass arbitrary HTML attributes to the root element:
181
+
182
+ ```javascript
183
+ Button('Submit')
184
+ .props({ id: 'submit-btn', 'data-testid': 'submit' })
185
+ .variant('primary')
186
+ ```
187
+
188
+ ---
189
+
190
+ ## `refSelf()` - Component Reference
191
+
192
+ Store a reference to the component instance (not the DOM element):
193
+
194
+ ```javascript
195
+ const refs = {};
196
+
197
+ Button('Save')
198
+ .variant('primary')
199
+ .nd.refSelf(refs, 'saveBtn');
200
+
201
+ // Later - call component methods
202
+ refs.saveBtn.loading(true);
203
+ refs.saveBtn.disabled(true);
204
+ ```
205
+
206
+ ---
207
+
208
+ ## `ghostDom()` - Companion Elements
209
+
210
+ Attach companion elements that are injected into the DOM alongside the component but not exposed to the parent. See [NDElement - ghostDom](../native-document-element.md) for the full explanation.
211
+
212
+ ---
213
+
214
+ ## `postBuild(callback)`
215
+
216
+ Register a callback that runs after the component renders:
217
+
218
+ ```javascript
219
+ Button('Submit')
220
+ .postBuild((element, component) => {
221
+ console.log('Button rendered:', element);
222
+ })
223
+ ```
224
+
225
+ ---
226
+
227
+ ## `BaseComponent.extends()` and `BaseComponent.use()`
228
+
229
+ These are the tools for building custom components:
230
+
231
+ ```javascript
232
+ import { BaseComponent } from '@native-document/components';
233
+
234
+ // Create a new component that inherits from BaseComponent
235
+ function MyCard(title, props = {}) {
236
+ if (!(this instanceof MyCard)) {
237
+ return new MyCard(title, props);
238
+ }
239
+ BaseComponent.call(this);
240
+ this.$description = { title, props };
241
+ }
242
+
243
+ MyCard.defaultTemplate = null;
244
+
245
+ MyCard.use = function(template) {
246
+ MyCard.defaultTemplate = template;
247
+ };
248
+
249
+ // Set up prototype chain
250
+ BaseComponent.extends(MyCard);
251
+
252
+ // Add methods
253
+ MyCard.prototype.subtitle = function(subtitle) {
254
+ this.$description.subtitle = subtitle;
255
+ return this;
256
+ };
257
+
258
+ // Register renderer
259
+ MyCard.use(($description) => {
260
+ return Div({ class: 'card', ...$description.props }, [
261
+ H2($description.title),
262
+ $description.subtitle ? P($description.subtitle) : null,
263
+ ]);
264
+ });
265
+
266
+ // Usage
267
+ MyCard('Hello').subtitle('World').nd
268
+ ```
269
+
270
+ ### `BaseComponent.use()` - Apply Traits
271
+
272
+ Mix behavior traits into a component:
273
+
274
+ ```javascript
275
+ import { BaseComponent, HasEventEmitter, HasDraggable } from '@native-document/components';
276
+
277
+ BaseComponent.use(MyCard, HasEventEmitter, HasDraggable);
278
+ // MyCard now has .on(), .emit(), .makeDraggable() etc.
279
+ ```
280
+
281
+ ---
282
+
283
+ ## Default Renderers
284
+
285
+ The package ships with a default renderer for every component, imported from `'native-document/src/ui'`. You can use them as a starting point or ignore them entirely and write your own from scratch.
286
+
287
+ Create a `src/core/renderers.js` file and import it once at app startup:
288
+
289
+ ```javascript
290
+ import {
291
+ Button, Alert, Badge, Modal, Tabs, Dropdown, DropdownItem
292
+ // ... all components you use
293
+ } from 'native-document/components';
294
+
295
+ import {
296
+ ButtonRender, AlertRender, BadgeRender, ModalRender, TabsRender,
297
+ DropdownRender, DropdownItemRender
298
+ // ... matching renders
299
+ } from 'native-document/src/ui';
300
+
301
+ Button.use(ButtonRender);
302
+ Alert.use(AlertRender);
303
+ Badge.use(BadgeRender);
304
+ Modal.use(ModalRender);
305
+ Tabs.use(TabsRender);
306
+ Dropdown.use(DropdownRender);
307
+ DropdownItem.use(DropdownItemRender);
308
+ // ...
309
+ ```
310
+
311
+ > `ContextMenu` is the only exception - its `.use()` takes both a renderer and a handler:
312
+ > ```javascript
313
+ > import { ContextMenuRender, contextMenuHandler } from 'native-document/src/ui';
314
+ > ContextMenu.use(ContextMenuRender, contextMenuHandler);
315
+ > ```
316
+
317
+ When you want to customize, call `Component.use()` with your own renderer - it replaces the default globally:
318
+
319
+ ```javascript
320
+ Button.use(($d) => {
321
+ return NativeButton({
322
+ class: buildMyClasses($d),
323
+ ...$d.props
324
+ }, $d.label);
325
+ });
326
+ ```
327
+
328
+ You can also mix - use the defaults for most components and override only the ones you want to customize.
329
+
330
+ ---
331
+
332
+ ## Next Steps
333
+
334
+ - **[Getting Started](./getting-started.md)** - Build your first component with a renderer
335
+ - **[Traits](./traits.md)** - HasEventEmitter, HasDraggable, HasResizable
336
+ - **[Button](./button.md)** - Button component API
337
+ - **[Layout](./layout.md)** - Stack, Row, Col, Divider
@@ -0,0 +1,279 @@
1
+ ---
2
+ title: Layout Components
3
+ description: Stack, HStack, VStack, AbsoluteStack, FixedStack, RelativeStack - flexible layout building blocks
4
+ ---
5
+
6
+ # Layout Components
7
+
8
+ Layout components provide flexible, semantic containers for building UI structure.
9
+
10
+ ```javascript
11
+ import { HStack, VStack, Row, Col, AbsoluteStack, FixedStack, RelativeStack, Divider } from 'native-document/components';
12
+ import { Stack } from 'native-document/components'; // only needed to register the renderer
13
+ ```
14
+
15
+ ---
16
+
17
+ ## `Stack` - Abstract Base
18
+
19
+ `Stack` is the abstract base class for all layout components. Do not use it directly - use `HStack`, `VStack`, `Row`, or `Col` instead.
20
+
21
+ All stack variants share the same `$description` structure and methods:
22
+
23
+ ### `$description`
24
+
25
+ ```javascript
26
+ {
27
+ orientation: 'horizontal', // 'horizontal' | 'vertical'
28
+ content: [],
29
+ spacing: null, // string | number
30
+ alignment: 'center', // 'leading' | 'center' | 'trailing' | 'stretch'
31
+ justifyContent: 'between', // 'start' | 'center' | 'end' | 'between' | 'around'
32
+ wrap: false,
33
+ grow: false,
34
+ shrink: false,
35
+ reverse: false,
36
+ props: {}
37
+ }
38
+ ```
39
+
40
+ ### Methods
41
+
42
+ ```javascript
43
+ // Spacing
44
+ .spacing(8)
45
+
46
+ // Alignment
47
+ .alignLeading() // alignment: 'leading'
48
+ .alignCenter() // alignment: 'center'
49
+ .alignTrailing() // alignment: 'trailing'
50
+ .alignStretch() // alignment: 'stretch'
51
+
52
+ // Justify
53
+ .justifyStart()
54
+ .justifyCenter()
55
+ .justifyEnd()
56
+ .justifyBetween()
57
+ .justifyAround()
58
+
59
+ // Combined
60
+ .center() // alignCenter() + justifyCenter()
61
+
62
+ // Other
63
+ .wrap()
64
+ .grow()
65
+ .shrink()
66
+ .reverse()
67
+ ```
68
+
69
+ ### Renderer
70
+
71
+ Each variant needs its own renderer registered separately:
72
+
73
+ ```javascript
74
+ import { HStack, VStack } from 'native-document/components';
75
+ import { HStackRender, VStackRender } from 'native-document/ui';
76
+
77
+ HStack.use(HStackRender);
78
+ VStack.use(VStackRender);
79
+ // Row and Col share HStack and VStack renderers automatically
80
+ ```
81
+
82
+ Or write your own:
83
+
84
+ ```javascript
85
+ HStack.use(($description) => {
86
+ return Div({
87
+ class: buildStackClasses($description),
88
+ style: $description.spacing ? { gap: $description.spacing + 'px' } : {},
89
+ ...$description.props
90
+ }, $description.content);
91
+ });
92
+ ```
93
+
94
+ ---
95
+
96
+ ## `HStack` - Horizontal Stack
97
+
98
+ Alias for `Stack` with `orientation: 'horizontal'`. Also available as `Row`.
99
+
100
+ ```javascript
101
+ HStack([
102
+ Avatar(user.avatar),
103
+ Div(user.name)
104
+ ]).alignCenter().spacing(12)
105
+
106
+ // Row is an alias for HStack
107
+ Row([
108
+ Button('Cancel').ghost(),
109
+ Button('Save').primary()
110
+ ]).justifyEnd().spacing(8)
111
+ ```
112
+
113
+ ---
114
+
115
+ ## `VStack` - Vertical Stack
116
+
117
+ `Stack` with `orientation: 'vertical'` and `alignment: 'leading'` by default. Also available as `Col`.
118
+
119
+ ```javascript
120
+ VStack([
121
+ H2('Title'),
122
+ P('Description'),
123
+ Button('Action').primary()
124
+ ]).spacing(16).alignStretch()
125
+
126
+ // Col is an alias for VStack
127
+ Col([Label('Name'), Input({ value: name })]).spacing(4)
128
+ ```
129
+
130
+ ---
131
+
132
+ ## `AbsoluteStack` / `FixedStack` / `RelativeStack` - Positioned Containers
133
+
134
+ All three extend `PositionStack` and share the same API. They differ only in CSS `position`:
135
+
136
+ | Component | CSS position |
137
+ |---|---|
138
+ | `AbsoluteStack` | `absolute` |
139
+ | `FixedStack` | `fixed` |
140
+ | `RelativeStack` | `relative` |
141
+
142
+ ### `$description`
143
+
144
+ ```javascript
145
+ {
146
+ position: 'absolute', // 'absolute' | 'fixed' | 'relative'
147
+ content: [],
148
+ top: null, // string | number
149
+ right: null,
150
+ bottom: null,
151
+ left: null,
152
+ width: null,
153
+ height: null,
154
+ zIndex: null,
155
+ anchor: null, // preset anchor shorthand
156
+ props: {}
157
+ }
158
+ ```
159
+
160
+ ### Methods
161
+
162
+ ```javascript
163
+ AbsoluteStack(Div('Tooltip'))
164
+ .top(0)
165
+ .right(0)
166
+ .width(200)
167
+ .height(100)
168
+ .zIndex(50)
169
+
170
+ // Size helpers
171
+ .fullWidth() // width: '100%'
172
+ .fullHeight() // height: '100%'
173
+ .fullSize() // width + height: '100%'
174
+ .size(200, 100) // width: 200, height: 100
175
+ .size(200) // width: 200, height: 200
176
+
177
+ // Z-index helpers
178
+ .above(100) // zIndex: 100
179
+ .below() // zIndex: -1
180
+
181
+ // Anchor presets (position combinations)
182
+ .fill() // anchor: 'fill'
183
+ .topLeading() // anchor: 'top-leading'
184
+ .atTopCenter() // anchor: 'top-center'
185
+ .atTopTrailing() // anchor: 'top-trailing'
186
+ .atCenterLeading() // anchor: 'center-leading'
187
+ .atCenter() // anchor: 'center'
188
+ .atCenterTrailing() // anchor: 'center-trailing'
189
+ .atBottomLeading() // anchor: 'bottom-leading'
190
+ .atBottomCenter() // anchor: 'bottom-center'
191
+ .atBottomTrailing() // anchor: 'bottom-trailing'
192
+ ```
193
+
194
+ ### Example
195
+
196
+ ```javascript
197
+ // Floating action button
198
+ const fab = FixedStack(
199
+ Button(PlusIcon).circle().primary()
200
+ )
201
+ .atBottomTrailing()
202
+ .right(24)
203
+ .bottom(24)
204
+ .above(100)
205
+
206
+ // Overlay badge
207
+ const badge = AbsoluteStack(Span('3'))
208
+ .atTopTrailing()
209
+ .top(-8)
210
+ .right(-8)
211
+ ```
212
+
213
+ ---
214
+
215
+ ## `Divider`
216
+
217
+ A horizontal or vertical separator, optionally with a label.
218
+
219
+ ```javascript
220
+ Divider(label?, props?)
221
+ ```
222
+
223
+ ### `$description`
224
+
225
+ ```javascript
226
+ {
227
+ label: null, // string | null
228
+ orientation: 'horizontal', // 'horizontal' | 'vertical'
229
+ props: {}
230
+ }
231
+ ```
232
+
233
+ ### Methods
234
+
235
+ ```javascript
236
+ Divider() // horizontal, no label
237
+ Divider('OR') // with label
238
+ Divider().vertical() // vertical
239
+
240
+ .orientation('vertical')
241
+ .vertical()
242
+ .horizontal()
243
+ ```
244
+
245
+ ### Example
246
+
247
+ ```javascript
248
+ VStack([
249
+ Input({ placeholder: 'Email', value: email }),
250
+ Input({ placeholder: 'Password', type: 'password', value: password }),
251
+ Button('Sign in').primary().block(),
252
+ Divider('OR'),
253
+ Button('Continue with Google').ghost().block()
254
+ ]).spacing(16)
255
+ ```
256
+
257
+
258
+ ---
259
+
260
+ ## Theming
261
+
262
+ ```css
263
+ :root {
264
+ --divider-color: var(--gray-lite-3);
265
+ --divider-label-color: var(--gray);
266
+ --divider-label-size: var(--note-size);
267
+ --divider-label-gap: var(--space-comfortable);
268
+ --divider-thickness: 1px;
269
+ --divider-spacing: 16px;
270
+ }
271
+ ```
272
+
273
+ ---
274
+
275
+ ## Next Steps
276
+
277
+ - **[Getting Started](./getting-started.md)** - Register renderers
278
+ - **[Button](./button.md)** - Button component
279
+ - **[Modal](./modal.md)** - Modal with draggable and resizable
@@ -0,0 +1,73 @@
1
+ ---
2
+ title: List
3
+ description: Flexible list component with single/multi selection, checkbox or click-to-select modes, dividers, and keyboard navigation
4
+ ---
5
+
6
+ # List
7
+
8
+ > **Status: coming soon.** The `List` API is fully defined but the default renderer is not yet implemented. You can use `List` today by providing your own renderer via `List.use()`.
9
+
10
+ ```javascript
11
+ import { List } from 'native-document/components';
12
+
13
+ List(props?)
14
+ ```
15
+
16
+ ## Custom Renderer
17
+
18
+ Until the default renderer ships, register your own:
19
+
20
+ ```javascript
21
+ import { Ul, Li } from 'native-document/elements';
22
+
23
+ List.use({
24
+ list: ($d, instance) => {
25
+ return Ul({ class: `list ${$d.inset ? 'list-inset' : ''}` });
26
+ }
27
+ });
28
+ ```
29
+
30
+ > `List.use()` expects an object with a `list` key, not a function directly.
31
+
32
+ ## Methods
33
+
34
+ ### Data
35
+
36
+ | Method | Parameters | Description |
37
+ |---|---|---|
38
+ | `.items(items)` | `items: *[]` | Static item list |
39
+ | `.dynamic(obs?)` | `obs?: ObservableArray` | Bind to a reactive array |
40
+ | `.data(data)` | `data: *` | Data passed to the renderer |
41
+
42
+ ### Selection
43
+
44
+ | Method | Parameters | Description |
45
+ |---|---|---|
46
+ | `.selectable(enabled?)` | `enabled?: boolean` | Enable item selection |
47
+ | `.multiSelect(enabled?)` | `enabled?: boolean` | Allow multiple selections. Enables `.selectable()` automatically |
48
+ | `.selectByClick()` | - | Select items on click (mutually exclusive with `selectByCheckbox`) |
49
+ | `.selectByCheckbox()` | - | Select items via a checkbox (mutually exclusive with `selectByClick`) |
50
+ | `.selectedValuesModel(obs)` | `obs: Observable<*[]>` | Bind selected values to an external observable |
51
+
52
+ ### Layout
53
+
54
+ | Method | Parameters | Description |
55
+ |---|---|---|
56
+ | `.withDivider(enabled?)` | `enabled?: boolean` | Show a divider between items |
57
+ | `.inset(enabled?)` | `enabled?: boolean` | Add inset padding |
58
+ | `.loopOnKeyboard(enabled)` | `enabled: boolean` | Loop keyboard navigation at list boundaries. Default `true` |
59
+
60
+ ### Events
61
+
62
+ | Method | Parameters | Description |
63
+ |---|---|---|
64
+ | `.onItemClick(handler)` | `handler: (item, event) => void` | Fires when an item is clicked |
65
+ | `.onItemSelect(handler)` | `handler: (item) => void` | Fires when an item is selected |
66
+
67
+ ---
68
+
69
+ ## Next Steps
70
+
71
+ - **[Components Overview](./index.md)** - BaseComponent and renderer pattern
72
+ - **[Getting Started](./getting-started.md)** - Register default renderers
73
+ - **[Traits](./traits.md)** - `HasItems` trait used by this component