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.
- package/.npmrc.example +1 -0
- package/.vitepress/config.js +166 -0
- package/CHANGELOG.md +153 -0
- package/cdn.js +19 -0
- package/components.d.ts +2 -0
- package/components.js +30 -0
- package/devtools/ComponentRegistry.js +113 -0
- package/devtools/index.js +8 -0
- package/devtools/plugin/dev-tools-plugin.js +15 -0
- package/devtools/transformers/nd-vite-devtools.js +55 -0
- package/devtools/transformers/src/transformComponentForHrm.js +73 -0
- package/devtools/transformers/src/transformJsFile.js +9 -0
- package/devtools/transformers/src/utils.js +79 -0
- package/devtools/transformers/templates/hrm.hook.template.js +46 -0
- package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
- package/devtools/widget/Widget.js +49 -0
- package/devtools/widget/widget.css +81 -0
- package/devtools/widget.js +23 -0
- package/dist/native-document.components.min.css +1 -0
- package/dist/native-document.components.min.js +23847 -0
- package/dist/native-document.dev.js +8421 -1492
- package/dist/native-document.dev.js.map +1 -0
- package/dist/native-document.devtools.min.js +1 -0
- package/dist/native-document.min.js +1 -1
- package/docs/advanced-components.md +419 -0
- package/docs/anchor.md +181 -257
- package/docs/cache.md +180 -0
- package/docs/cli.md +179 -0
- package/docs/components/accordion.md +172 -0
- package/docs/components/alert.md +99 -0
- package/docs/components/avatar.md +160 -0
- package/docs/components/badge.md +102 -0
- package/docs/components/breadcrumb.md +89 -0
- package/docs/components/button.md +183 -0
- package/docs/components/card.md +69 -0
- package/docs/components/context-menu.md +118 -0
- package/docs/components/data-table.md +345 -0
- package/docs/components/dropdown.md +214 -0
- package/docs/components/form/autocomplete-field.md +81 -0
- package/docs/components/form/checkbox-field.md +41 -0
- package/docs/components/form/checkbox-group-field.md +54 -0
- package/docs/components/form/color-field.md +64 -0
- package/docs/components/form/date-field.md +92 -0
- package/docs/components/form/field-collection.md +63 -0
- package/docs/components/form/file-field.md +203 -0
- package/docs/components/form/form-control.md +87 -0
- package/docs/components/form/image-field.md +90 -0
- package/docs/components/form/index.md +115 -0
- package/docs/components/form/number-field.md +65 -0
- package/docs/components/form/radio-field.md +51 -0
- package/docs/components/form/select-field.md +123 -0
- package/docs/components/form/slider.md +136 -0
- package/docs/components/form/string-field.md +134 -0
- package/docs/components/form/textarea-field.md +65 -0
- package/docs/components/form-fields.md +372 -0
- package/docs/components/getting-started.md +264 -0
- package/docs/components/index.md +337 -0
- package/docs/components/layout.md +279 -0
- package/docs/components/list.md +73 -0
- package/docs/components/menu.md +215 -0
- package/docs/components/modal.md +156 -0
- package/docs/components/pagination.md +95 -0
- package/docs/components/popover.md +131 -0
- package/docs/components/progress.md +111 -0
- package/docs/components/shortcut-manager.md +221 -0
- package/docs/components/simple-table.md +107 -0
- package/docs/components/skeleton.md +155 -0
- package/docs/components/spinner.md +100 -0
- package/docs/components/splitter.md +133 -0
- package/docs/components/stepper.md +163 -0
- package/docs/components/switch.md +113 -0
- package/docs/components/tabs.md +153 -0
- package/docs/components/toast.md +119 -0
- package/docs/components/tooltip.md +151 -0
- package/docs/components/traits.md +261 -0
- package/docs/conditional-rendering.md +177 -502
- package/docs/contributing.md +300 -25
- package/docs/core-concepts.md +207 -366
- package/docs/elements.md +266 -254
- package/docs/extending-native-document-element.md +259 -0
- package/docs/filters.md +247 -0
- package/docs/getting-started.md +195 -257
- package/docs/i18n.md +241 -0
- package/docs/index.md +76 -0
- package/docs/lifecycle-events.md +146 -67
- package/docs/list-rendering.md +240 -460
- package/docs/memory-management.md +135 -46
- package/docs/native-document-element.md +487 -0
- package/docs/native-fetch.md +213 -0
- package/docs/observable-resource.md +364 -0
- package/docs/observables.md +690 -357
- package/docs/routing.md +246 -646
- package/docs/state-management.md +213 -306
- package/docs/svg-elements.md +231 -0
- package/docs/theming.md +409 -0
- package/docs/tutorials/.gitkeep +0 -0
- package/docs/validation.md +98 -91
- package/docs/vitepress-conventions.md +219 -0
- package/elements.d.ts +7 -0
- package/elements.js +3 -4
- package/eslint.config.js +35 -0
- package/i18n.js +1 -0
- package/i18n.ts +2 -0
- package/index.d.ts +21 -0
- package/index.def.js +1086 -0
- package/index.js +19 -13
- package/package.json +59 -9
- package/readme.md +296 -93
- package/rollup.config.js +52 -3
- package/router.d.ts +7 -0
- package/router.js +0 -0
- package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
- package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
- package/src/components/$traits/has-draggable/has-draggable.css +8 -0
- package/src/components/$traits/has-items/HasItems.d.ts +9 -0
- package/src/components/$traits/has-items/HasItems.js +64 -0
- package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
- package/src/components/$traits/has-position/HasFullPosition.js +95 -0
- package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
- package/src/components/$traits/has-position/HasPosition.js +45 -0
- package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
- package/src/components/$traits/has-resizable/HasResizable.js +122 -0
- package/src/components/$traits/has-resizable/has-resizable.css +121 -0
- package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
- package/src/components/$traits/has-validation/HasValidation.js +133 -0
- package/src/components/BaseComponent.d.ts +32 -0
- package/src/components/BaseComponent.js +247 -0
- package/src/components/accordion/Accordion.js +268 -0
- package/src/components/accordion/AccordionItem.js +233 -0
- package/src/components/accordion/index.js +7 -0
- package/src/components/accordion/types/Accordion.d.ts +47 -0
- package/src/components/accordion/types/AccordionItem.d.ts +48 -0
- package/src/components/alert/Alert.js +350 -0
- package/src/components/alert/index.js +6 -0
- package/src/components/alert/types/Alert.d.ts +62 -0
- package/src/components/avatar/Avatar.js +430 -0
- package/src/components/avatar/AvatarGroup.js +97 -0
- package/src/components/avatar/index.js +7 -0
- package/src/components/avatar/types/Avatar.d.ts +74 -0
- package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
- package/src/components/badge/Badge.js +245 -0
- package/src/components/badge/index.js +6 -0
- package/src/components/badge/types/Badge.d.ts +51 -0
- package/src/components/base-component.css +0 -0
- package/src/components/breadcrumb/BreadCrumb.js +138 -0
- package/src/components/breadcrumb/index.js +5 -0
- package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
- package/src/components/button/Button.js +320 -0
- package/src/components/button/index.js +5 -0
- package/src/components/button/types/Button.d.ts +62 -0
- package/src/components/card/Card.js +282 -0
- package/src/components/card/index.js +5 -0
- package/src/components/card/types/Card.d.ts +42 -0
- package/src/components/context-menu/ContextMenu.js +127 -0
- package/src/components/context-menu/ContextMenuGroup.js +29 -0
- package/src/components/context-menu/ContextMenuItem.js +28 -0
- package/src/components/context-menu/index.js +10 -0
- package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
- package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
- package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
- package/src/components/divider/Divider.js +256 -0
- package/src/components/divider/index.js +6 -0
- package/src/components/divider/types/Divider.d.ts +55 -0
- package/src/components/dropdown/Dropdown.js +531 -0
- package/src/components/dropdown/DropdownDivider.js +45 -0
- package/src/components/dropdown/DropdownGroup.js +83 -0
- package/src/components/dropdown/DropdownItem.js +150 -0
- package/src/components/dropdown/DropdownTrigger.js +93 -0
- package/src/components/dropdown/helpers.js +53 -0
- package/src/components/dropdown/index.js +13 -0
- package/src/components/dropdown/types/Dropdown.d.ts +88 -0
- package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
- package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
- package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
- package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
- package/src/components/form/FormControl.js +498 -0
- package/src/components/form/field/Field.js +419 -0
- package/src/components/form/field/FieldCollection.js +292 -0
- package/src/components/form/field/types/AutocompleteField.js +168 -0
- package/src/components/form/field/types/CheckboxField.js +77 -0
- package/src/components/form/field/types/CheckboxGroupField.js +171 -0
- package/src/components/form/field/types/ColorField.js +102 -0
- package/src/components/form/field/types/DateField.js +315 -0
- package/src/components/form/field/types/EmailField.js +104 -0
- package/src/components/form/field/types/FileField.js +276 -0
- package/src/components/form/field/types/HiddenField.js +44 -0
- package/src/components/form/field/types/ImageField.js +138 -0
- package/src/components/form/field/types/NumberField.js +177 -0
- package/src/components/form/field/types/PasswordField.js +200 -0
- package/src/components/form/field/types/RadioField.js +145 -0
- package/src/components/form/field/types/RangeField.js +117 -0
- package/src/components/form/field/types/SearchField.js +66 -0
- package/src/components/form/field/types/SelectField.js +247 -0
- package/src/components/form/field/types/StringField.js +148 -0
- package/src/components/form/field/types/TelField.js +98 -0
- package/src/components/form/field/types/TextAreaField.js +142 -0
- package/src/components/form/field/types/TimeField.js +215 -0
- package/src/components/form/field/types/UrlField.js +115 -0
- package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
- package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
- package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
- package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
- package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
- package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
- package/src/components/form/index.js +61 -0
- package/src/components/form/merge +0 -0
- package/src/components/form/types/Field.d.ts +73 -0
- package/src/components/form/types/FieldCollection.d.ts +53 -0
- package/src/components/form/types/FormControl.d.ts +64 -0
- package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
- package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
- package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
- package/src/components/form/types/fields/ColorField.d.ts +37 -0
- package/src/components/form/types/fields/DateField.d.ts +70 -0
- package/src/components/form/types/fields/EmailField.d.ts +35 -0
- package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
- package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
- package/src/components/form/types/fields/FileField.d.ts +56 -0
- package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
- package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
- package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
- package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
- package/src/components/form/types/fields/HiddenField.d.ts +26 -0
- package/src/components/form/types/fields/ImageField.d.ts +45 -0
- package/src/components/form/types/fields/NumberField.d.ts +48 -0
- package/src/components/form/types/fields/PasswordField.d.ts +46 -0
- package/src/components/form/types/fields/RadioField.d.ts +48 -0
- package/src/components/form/types/fields/RangeField.d.ts +44 -0
- package/src/components/form/types/fields/SearchField.d.ts +34 -0
- package/src/components/form/types/fields/SelectField.d.ts +71 -0
- package/src/components/form/types/fields/StringField.d.ts +48 -0
- package/src/components/form/types/fields/TelField.d.ts +37 -0
- package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
- package/src/components/form/types/fields/TimeField.d.ts +51 -0
- package/src/components/form/types/fields/UrlField.d.ts +35 -0
- package/src/components/form/utils.js +17 -0
- package/src/components/form/validation/Validation.js +565 -0
- package/src/components/index.d.ts +160 -0
- package/src/components/list/HasListItem.js +171 -0
- package/src/components/list/List.js +125 -0
- package/src/components/list/ListDivider.js +39 -0
- package/src/components/list/ListGroup.js +135 -0
- package/src/components/list/ListItem.js +212 -0
- package/src/components/list/index.js +12 -0
- package/src/components/list/types/List.d.ts +43 -0
- package/src/components/list/types/ListGroup.d.ts +37 -0
- package/src/components/list/types/ListItem.d.ts +53 -0
- package/src/components/menu/HasMenuItem.js +182 -0
- package/src/components/menu/Menu.js +227 -0
- package/src/components/menu/MenuDivider.js +37 -0
- package/src/components/menu/MenuGroup.js +126 -0
- package/src/components/menu/MenuItem.js +190 -0
- package/src/components/menu/MenuLink.js +51 -0
- package/src/components/menu/index.js +14 -0
- package/src/components/menu/types/Menu.d.ts +60 -0
- package/src/components/menu/types/MenuDivider.d.ts +19 -0
- package/src/components/menu/types/MenuGroup.d.ts +44 -0
- package/src/components/menu/types/MenuItem.d.ts +46 -0
- package/src/components/menu/types/MenuLink.d.ts +16 -0
- package/src/components/modal/Modal.js +524 -0
- package/src/components/modal/index.js +5 -0
- package/src/components/modal/types/Modal.d.ts +94 -0
- package/src/components/pagination/Pagination.js +411 -0
- package/src/components/pagination/index.js +5 -0
- package/src/components/pagination/types/Pagination.d.ts +68 -0
- package/src/components/popover/Popover.js +459 -0
- package/src/components/popover/PopoverFooter.js +61 -0
- package/src/components/popover/PopoverHeader.js +68 -0
- package/src/components/popover/index.js +10 -0
- package/src/components/popover/types/Popover.d.ts +83 -0
- package/src/components/popover/types/PopoverFooter.d.ts +24 -0
- package/src/components/popover/types/PopoverHeader.d.ts +26 -0
- package/src/components/progress/Progress.js +401 -0
- package/src/components/progress/index.js +6 -0
- package/src/components/progress/types/Progress.d.ts +77 -0
- package/src/components/skeleton/Skeleton.js +228 -0
- package/src/components/skeleton/index.js +6 -0
- package/src/components/skeleton/types/Skeleton.d.ts +55 -0
- package/src/components/slider/Slider.js +406 -0
- package/src/components/slider/index.js +5 -0
- package/src/components/slider/types/Slider.d.ts +82 -0
- package/src/components/spacer/Spacer.js +27 -0
- package/src/components/spacer/index.js +5 -0
- package/src/components/spacer/types/Spacer.d.ts +19 -0
- package/src/components/spinner/Spinner.js +350 -0
- package/src/components/spinner/index.js +5 -0
- package/src/components/spinner/types/Spinner.d.ts +71 -0
- package/src/components/splitter/Splitter.js +164 -0
- package/src/components/splitter/SplitterGutter.js +140 -0
- package/src/components/splitter/SplitterPanel.js +143 -0
- package/src/components/splitter/index.js +10 -0
- package/src/components/splitter/types/Splitter.d.ts +38 -0
- package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
- package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
- package/src/components/stacks/AbsoluteStack.js +53 -0
- package/src/components/stacks/FixedStack.js +53 -0
- package/src/components/stacks/HStack.js +54 -0
- package/src/components/stacks/PositionStack.js +254 -0
- package/src/components/stacks/RelativeStack.js +53 -0
- package/src/components/stacks/Stack.js +166 -0
- package/src/components/stacks/VStack.js +55 -0
- package/src/components/stacks/index.js +21 -0
- package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
- package/src/components/stacks/types/FixedStack.d.ts +16 -0
- package/src/components/stacks/types/HStack.d.ts +16 -0
- package/src/components/stacks/types/PositionStack.d.ts +54 -0
- package/src/components/stacks/types/RelativeStack.d.ts +17 -0
- package/src/components/stacks/types/Stack.d.ts +39 -0
- package/src/components/stacks/types/VStack.d.ts +16 -0
- package/src/components/stepper/Stepper.js +461 -0
- package/src/components/stepper/StepperStep.js +241 -0
- package/src/components/stepper/index.js +8 -0
- package/src/components/stepper/types/Stepper.d.ts +68 -0
- package/src/components/stepper/types/StepperStep.d.ts +54 -0
- package/src/components/switch/Switch.js +266 -0
- package/src/components/switch/index.js +6 -0
- package/src/components/switch/types/Switch.d.ts +55 -0
- package/src/components/table/Column.js +212 -0
- package/src/components/table/ColumnGroup.js +90 -0
- package/src/components/table/DataTable.js +720 -0
- package/src/components/table/SimpleTable.js +139 -0
- package/src/components/table/index.js +7 -0
- package/src/components/table/types/Column.d.ts +49 -0
- package/src/components/table/types/ColumnGroup.d.ts +28 -0
- package/src/components/table/types/DataTable.d.ts +97 -0
- package/src/components/table/types/SimpleTable.d.ts +40 -0
- package/src/components/tabs/Tabs.js +395 -0
- package/src/components/tabs/index.js +6 -0
- package/src/components/tabs/types/Tabs.d.ts +78 -0
- package/src/components/toast/Toast.js +262 -0
- package/src/components/toast/ToastError.js +0 -0
- package/src/components/toast/ToastInfo.js +0 -0
- package/src/components/toast/ToastSuccess.js +0 -0
- package/src/components/toast/ToastWarning.js +0 -0
- package/src/components/toast/index.js +5 -0
- package/src/components/toast/types/Toast.d.ts +57 -0
- package/src/components/toast/types/ToastError.d.ts +7 -0
- package/src/components/toast/types/ToastInfo.d.ts +7 -0
- package/src/components/toast/types/ToastSuccess.d.ts +7 -0
- package/src/components/toast/types/ToastWarning.d.ts +7 -0
- package/src/components/tooltip/Tooltip.js +359 -0
- package/src/components/tooltip/index.js +5 -0
- package/src/components/tooltip/prototypes.js +6 -0
- package/src/components/tooltip/types/Tooltip.d.ts +65 -0
- package/src/{data → core/data}/MemoryManager.js +2 -3
- package/src/core/data/Observable.js +227 -0
- package/src/core/data/ObservableArray.js +522 -0
- package/src/core/data/ObservableChecker.js +39 -0
- package/src/core/data/ObservableItem.js +611 -0
- package/src/core/data/ObservableObject.js +274 -0
- package/src/core/data/ObservableResource.js +315 -0
- package/src/core/data/ObservableWhen.js +54 -0
- package/src/core/data/Store.js +520 -0
- package/src/core/data/observable-helpers/observable.is-to.js +390 -0
- package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
- package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
- package/src/core/elements/anchor/anchor.js +210 -0
- package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
- package/src/core/elements/content-formatter.js +169 -0
- package/src/core/elements/control/for-each-array.js +292 -0
- package/src/{elements → core/elements}/control/for-each.js +42 -23
- package/src/core/elements/control/show-if.js +94 -0
- package/src/core/elements/control/show-when.js +54 -0
- package/src/core/elements/control/switch.js +141 -0
- package/src/core/elements/description-list.js +19 -0
- package/src/core/elements/form.js +255 -0
- package/src/core/elements/fragment.js +8 -0
- package/src/core/elements/html5-semantics.js +55 -0
- package/src/core/elements/img.js +59 -0
- package/src/{elements → core/elements}/index.js +4 -4
- package/src/core/elements/interactive.js +25 -0
- package/src/core/elements/list.js +37 -0
- package/src/core/elements/medias.js +37 -0
- package/src/core/elements/meta-data.js +43 -0
- package/src/core/elements/svg.js +61 -0
- package/src/core/elements/table.js +73 -0
- package/src/{errors → core/errors}/ArgTypesError.js +1 -1
- package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
- package/src/core/utils/HasEventEmitter.js +85 -0
- package/src/core/utils/args-types.js +140 -0
- package/src/core/utils/cache.js +5 -0
- package/src/core/utils/callback-handler.js +50 -0
- package/src/core/utils/debug-manager.js +40 -0
- package/src/core/utils/events.js +148 -0
- package/src/core/utils/filters/date.js +178 -0
- package/src/core/utils/filters/index.js +4 -0
- package/src/core/utils/filters/standard.js +263 -0
- package/src/core/utils/filters/strings.js +67 -0
- package/src/core/utils/filters/utils.js +77 -0
- package/src/core/utils/formatters.js +90 -0
- package/src/core/utils/helpers.js +144 -0
- package/src/core/utils/localstorage.js +57 -0
- package/src/core/utils/memoize.js +115 -0
- package/src/core/utils/plugins-manager.js +81 -0
- package/src/core/utils/property-accumulator.js +72 -0
- package/src/core/utils/prototypes.js +44 -0
- package/src/core/utils/shortcut-manager.js +242 -0
- package/src/{utils → core/utils}/validator.js +58 -22
- package/src/core/wrappers/AttributesWrapper.js +181 -0
- package/src/core/wrappers/DocumentObserver.js +182 -0
- package/src/core/wrappers/ElementCreator.js +110 -0
- package/src/core/wrappers/HtmlElementWrapper.js +98 -0
- package/src/core/wrappers/NDElement.js +613 -0
- package/src/core/wrappers/NdPrototype.js +233 -0
- package/src/core/wrappers/SingletonView.js +99 -0
- package/src/core/wrappers/SvgElementWrapper.js +15 -0
- package/src/core/wrappers/TemplateBinding.js +7 -0
- package/src/core/wrappers/constants.js +66 -0
- package/src/core/wrappers/prototypes/attributes-extensions.js +24 -0
- package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
- package/src/core/wrappers/prototypes/nd-element-extensions.js +149 -0
- package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
- package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
- package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
- package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
- package/src/core/wrappers/template-cloner/utils.js +173 -0
- package/src/fetch/NativeFetch.js +89 -0
- package/src/i18n/bin/scan.js +132 -0
- package/src/i18n/index.d.ts +2 -0
- package/src/i18n/service/I18nService.d.ts +27 -0
- package/src/i18n/service/I18nService.js +46 -0
- package/src/i18n/service/functions.d.ts +22 -0
- package/src/i18n/service/functions.js +29 -0
- package/src/router/Route.js +33 -8
- package/src/router/RouteGroupHelper.js +10 -2
- package/src/router/Router.js +63 -22
- package/src/router/RouterComponent.js +114 -6
- package/src/{errors → router/errors}/RouterError.js +0 -1
- package/src/router/link.js +9 -10
- package/src/router/modes/HashRouter.js +2 -2
- package/src/router/modes/HistoryRouter.js +2 -3
- package/src/router/modes/MemoryRouter.js +1 -1
- package/src/ui/components/accordion/AccordionItemRender.js +63 -0
- package/src/ui/components/accordion/AccordionRender.js +35 -0
- package/src/ui/components/accordion/accordion.css +121 -0
- package/src/ui/components/alert/AlertRender.js +81 -0
- package/src/ui/components/alert/alert.css +163 -0
- package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
- package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
- package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
- package/src/ui/components/avatar/avatar/avatar.css +189 -0
- package/src/ui/components/badge/BadgeRender.js +25 -0
- package/src/ui/components/badge/badge.css +168 -0
- package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
- package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
- package/src/ui/components/button/ButtonRender.js +65 -0
- package/src/ui/components/button/button.css +296 -0
- package/src/ui/components/card/CardRender.js +133 -0
- package/src/ui/components/card/card.css +169 -0
- package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
- package/src/ui/components/contextmenu/contextmenu.css +36 -0
- package/src/ui/components/divider/DividerRender.js +70 -0
- package/src/ui/components/divider/divider.css +70 -0
- package/src/ui/components/dropdown/DropdownRender.js +92 -0
- package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
- package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
- package/src/ui/components/dropdown/dropdown.css +179 -0
- package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
- package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
- package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
- package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
- package/src/ui/components/form/FieldCollectionRender.js +110 -0
- package/src/ui/components/form/FormControlRender.js +85 -0
- package/src/ui/components/form/field-collection.css +55 -0
- package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
- package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
- package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
- package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
- package/src/ui/components/form/fields/DateFieldRender.js +155 -0
- package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
- package/src/ui/components/form/fields/FieldRender.js +118 -0
- package/src/ui/components/form/fields/FileFieldRender.js +41 -0
- package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
- package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
- package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
- package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
- package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
- package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
- package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
- package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
- package/src/ui/components/form/fields/StringFieldRender.js +6 -0
- package/src/ui/components/form/fields/TelFieldRender.js +6 -0
- package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
- package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
- package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
- package/src/ui/components/form/fields/date-field.css +32 -0
- package/src/ui/components/form/fields/field.css +402 -0
- package/src/ui/components/form/fields/file-field.css +79 -0
- package/src/ui/components/form/fields/password-field.css +50 -0
- package/src/ui/components/form/fields/range-field.css +120 -0
- package/src/ui/components/form/fields/slider.css +195 -0
- package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
- package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
- package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
- package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
- package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
- package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
- package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
- package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
- package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
- package/src/ui/components/form/form-control.css +40 -0
- package/src/ui/components/form/helpers.js +111 -0
- package/src/ui/components/form/index.js +27 -0
- package/src/ui/components/list/ListRender.js +18 -0
- package/src/ui/components/list/divider/ListDividerRender.js +10 -0
- package/src/ui/components/list/divider/list-divider.css +12 -0
- package/src/ui/components/list/group/ListGroupRender.js +61 -0
- package/src/ui/components/list/group/list-group.css +62 -0
- package/src/ui/components/list/item/ListItemRender.js +238 -0
- package/src/ui/components/list/item/list-item.css +191 -0
- package/src/ui/components/list/list.css +24 -0
- package/src/ui/components/menu/MenuDividerRender.js +12 -0
- package/src/ui/components/menu/MenuGroupRender.js +59 -0
- package/src/ui/components/menu/MenuItemRender.js +57 -0
- package/src/ui/components/menu/MenuLinkRender.js +55 -0
- package/src/ui/components/menu/MenuRender.js +22 -0
- package/src/ui/components/menu/helpers.js +121 -0
- package/src/ui/components/menu/menu.css +308 -0
- package/src/ui/components/modal/ModalRender.js +118 -0
- package/src/ui/components/modal/modal.css +156 -0
- package/src/ui/components/pagination/PaginationRender.js +112 -0
- package/src/ui/components/pagination/pagination.css +63 -0
- package/src/ui/components/popover/PopoverRender.js +233 -0
- package/src/ui/components/popover/popover.css +139 -0
- package/src/ui/components/progress/ProgressRender.js +168 -0
- package/src/ui/components/progress/progress.css +197 -0
- package/src/ui/components/skeleton/SkeletonRender.js +136 -0
- package/src/ui/components/skeleton/skeleton.css +154 -0
- package/src/ui/components/spacer/SpacerRender.js +10 -0
- package/src/ui/components/spinner/SpinnerRender.js +47 -0
- package/src/ui/components/spinner/spinner.css +152 -0
- package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
- package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
- package/src/ui/components/splitter/SplitterRender.js +75 -0
- package/src/ui/components/splitter/splitter.css +128 -0
- package/src/ui/components/stacks/PositionStackRender.js +39 -0
- package/src/ui/components/stacks/StackRender.js +41 -0
- package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
- package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
- package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
- package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
- package/src/ui/components/stacks/index.js +5 -0
- package/src/ui/components/stacks/position-stack.css +62 -0
- package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
- package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
- package/src/ui/components/stacks/stack.css +78 -0
- package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
- package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
- package/src/ui/components/stepper/StepperRender.js +71 -0
- package/src/ui/components/stepper/StepperStepRender.js +67 -0
- package/src/ui/components/stepper/stepper.css +359 -0
- package/src/ui/components/switch/SwitchRender.js +83 -0
- package/src/ui/components/switch/switch.css +143 -0
- package/src/ui/components/table/data-table/DataTableRender.js +50 -0
- package/src/ui/components/table/data-table/bulk-actions.js +34 -0
- package/src/ui/components/table/data-table/data-table.css +246 -0
- package/src/ui/components/table/data-table/pagination.js +56 -0
- package/src/ui/components/table/data-table/tables.js +368 -0
- package/src/ui/components/table/data-table/toolbar.js +67 -0
- package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
- package/src/ui/components/table/simple-table/simple-table.css +50 -0
- package/src/ui/components/tabs/TabsRender.js +226 -0
- package/src/ui/components/tabs/tabs.css +253 -0
- package/src/ui/components/toast/ToastRender.js +99 -0
- package/src/ui/components/toast/toast.css +201 -0
- package/src/ui/components/tooltip/TooltipRender.js +8 -0
- package/src/ui/components/tooltip/tooltip.css +113 -0
- package/src/ui/index.js +47 -0
- package/src/ui/theme.js +0 -0
- package/src/ui/theme.scss +1 -0
- package/src/ui/tokens/animation.scss +36 -0
- package/src/ui/tokens/colors-dark.scss +58 -0
- package/src/ui/tokens/colors.scss +54 -0
- package/src/ui/tokens/components.scss +32 -0
- package/src/ui/tokens/fonts.scss +57 -0
- package/src/ui/tokens/glass.scss +10 -0
- package/src/ui/tokens/index.scss +38 -0
- package/src/ui/tokens/layouts.scss +228 -0
- package/src/ui/tokens/opacity.scss +21 -0
- package/src/ui/tokens/others.scss +11 -0
- package/src/ui/tokens/radius.scss +6 -0
- package/src/ui/tokens/reset.scss +51 -0
- package/src/ui/tokens/shadows.scss +29 -0
- package/src/ui/tokens/spacings.scss +13 -0
- package/src/ui/tokens/vars.scss +35 -0
- package/src/ui/tokens/viewports.scss +30 -0
- package/types/args-types.d.ts +58 -0
- package/types/control-flow.d.ts +62 -0
- package/types/elements.d.ts +231 -0
- package/types/filters/dates.d.ts +43 -0
- package/types/filters/index.d.ts +4 -0
- package/types/filters/standard.d.ts +70 -0
- package/types/filters/strings.d.ts +21 -0
- package/types/filters/types.d.ts +20 -0
- package/types/forms.d.ts +84 -0
- package/types/globals.d.ts +543 -0
- package/types/images.d.ts +23 -0
- package/types/localStorage.ts +102 -0
- package/types/memoize.d.ts +26 -0
- package/types/native-fetch.d.ts +72 -0
- package/types/nd-element.d.ts +407 -0
- package/types/observable-resource.d.ts +3 -0
- package/types/observable.d.ts +227 -0
- package/types/plugins-manager.d.ts +65 -0
- package/types/polyfill.d.ts +18 -0
- package/types/property-accumulator.d.ts +33 -0
- package/types/router.d.ts +85 -0
- package/types/service.d.ts +23 -0
- package/types/singleton.d.ts +19 -0
- package/types/store.d.ts +63 -0
- package/types/template-cloner.ts +43 -0
- package/types/validator.ts +66 -0
- package/ui.js +1 -0
- package/utils.d.ts +4 -0
- package/utils.js +12 -0
- package/src/data/Observable.js +0 -55
- package/src/data/ObservableChecker.js +0 -39
- package/src/data/ObservableItem.js +0 -195
- package/src/data/Store.js +0 -74
- package/src/data/observable-helpers/array.js +0 -74
- package/src/data/observable-helpers/batch.js +0 -22
- package/src/data/observable-helpers/computed.js +0 -28
- package/src/data/observable-helpers/object.js +0 -111
- package/src/elements/anchor.js +0 -129
- package/src/elements/content-formatter.js +0 -32
- package/src/elements/control/for-each-array.js +0 -280
- package/src/elements/control/show-if.js +0 -79
- package/src/elements/control/switch.js +0 -98
- package/src/elements/description-list.js +0 -5
- package/src/elements/form.js +0 -71
- package/src/elements/html5-semantics.js +0 -12
- package/src/elements/img.js +0 -45
- package/src/elements/interactive.js +0 -7
- package/src/elements/list.js +0 -10
- package/src/elements/medias.js +0 -8
- package/src/elements/meta-data.js +0 -9
- package/src/elements/table.js +0 -14
- package/src/utils/args-types.js +0 -100
- package/src/utils/debug-manager.js +0 -31
- package/src/utils/helpers.js +0 -60
- package/src/utils/plugins-manager.js +0 -12
- package/src/utils/prototypes.js +0 -45
- package/src/wrappers/AttributesWrapper.js +0 -144
- package/src/wrappers/DocumentObserver.js +0 -80
- package/src/wrappers/ElementCreator.js +0 -114
- package/src/wrappers/HtmlElementEventsWrapper.js +0 -64
- package/src/wrappers/HtmlElementWrapper.js +0 -50
- package/src/wrappers/NdPrototype.js +0 -109
- package/src/wrappers/constants.js +0 -2
package/index.js
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
export { default as HtmlElementWrapper } from './src/wrappers/HtmlElementWrapper'
|
|
2
|
-
export { ElementCreator } from './src/wrappers/ElementCreator'
|
|
3
1
|
|
|
4
|
-
import './src/utils/prototypes.js';
|
|
5
2
|
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
export
|
|
3
|
+
export { default as HtmlElementWrapper, createTextNode } from './src/core/wrappers/HtmlElementWrapper'
|
|
4
|
+
export { ElementCreator } from './src/core/wrappers/ElementCreator';
|
|
5
|
+
export { NDElement } from './src/core/wrappers/NDElement';
|
|
6
|
+
export { TemplateCloner, useCache } from './src/core/wrappers/template-cloner/TemplateCloner';
|
|
7
|
+
export { SingletonView, useSingleton } from './src/core/wrappers/SingletonView';
|
|
8
|
+
export { default as PluginsManager } from './src/core/utils/plugins-manager';
|
|
9
|
+
export { default as Validator } from './src/core/utils/validator';
|
|
10
|
+
|
|
11
|
+
export { Formatters } from "./src/core/utils/formatters";
|
|
12
|
+
export {default as ShortcutManager} from "./src/core/utils/shortcut-manager";
|
|
13
|
+
|
|
14
|
+
export * from './src/core/utils/property-accumulator';
|
|
15
|
+
export * from './src/core/utils/args-types';
|
|
16
|
+
export * from './src/core/utils/memoize';
|
|
17
|
+
export * from './src/core/data/Observable';
|
|
18
|
+
export * from './src/core/data/Store';
|
|
19
|
+
|
|
15
20
|
import * as elements from './elements';
|
|
16
21
|
import * as router from './router';
|
|
22
|
+
import * as utils from './utils';
|
|
17
23
|
|
|
18
|
-
export { elements, router};
|
|
24
|
+
export { elements, router, utils };
|
package/package.json
CHANGED
|
@@ -1,16 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "native-document",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"
|
|
3
|
+
"version": "1.0.168.01",
|
|
4
|
+
"description": "A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features",
|
|
5
|
+
"author": "AfroCodeur <https://github.com/afrocodeur>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/afrocodeur/native-document#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/afrocodeur/native-document.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/afrocodeur/native-document/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"reactive",
|
|
17
|
+
"framework",
|
|
18
|
+
"dom",
|
|
19
|
+
"vanilla",
|
|
20
|
+
"javascript",
|
|
21
|
+
"observable",
|
|
22
|
+
"no-virtual-dom",
|
|
23
|
+
"ui"
|
|
24
|
+
],
|
|
5
25
|
"type": "module",
|
|
26
|
+
"main": "index.js",
|
|
27
|
+
"sideEffects": [
|
|
28
|
+
"index.js",
|
|
29
|
+
"elements.js",
|
|
30
|
+
"**/*.css",
|
|
31
|
+
"**/prototypes",
|
|
32
|
+
"**/NdPrototype.js",
|
|
33
|
+
"**/nd-element-extensions.js",
|
|
34
|
+
"**/nd-element.transition.extensions.js",
|
|
35
|
+
"**/attributes-extensions.js",
|
|
36
|
+
"**/bind-class-extensions.js",
|
|
37
|
+
"**/observable.prototypes.js",
|
|
38
|
+
"**/observable.is-to.js"
|
|
39
|
+
],
|
|
6
40
|
"scripts": {
|
|
7
|
-
"build": "rollup --config rollup.config.js
|
|
41
|
+
"build": "rollup --config rollup.config.js",
|
|
42
|
+
"build:watch": "rollup --config rollup.config.js --watch",
|
|
43
|
+
"lint": "eslint ./src",
|
|
44
|
+
"lint:fix": "eslint ./src --fix"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@floating-ui/dom": "^1.7.6",
|
|
48
|
+
"i18next": "^25.8.0"
|
|
8
49
|
},
|
|
9
|
-
"keywords": [],
|
|
10
|
-
"author": "",
|
|
11
|
-
"license": "ISC",
|
|
12
|
-
"description": "",
|
|
13
50
|
"devDependencies": {
|
|
14
|
-
"@
|
|
51
|
+
"@babel/parser": "^7.28.5",
|
|
52
|
+
"@babel/traverse": "^7.28.5",
|
|
53
|
+
"@rollup/plugin-alias": "^5.1.1",
|
|
54
|
+
"@rollup/plugin-replace": "^6.0.2",
|
|
55
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
56
|
+
"eslint": "^9.33.0",
|
|
57
|
+
"eslint-plugin-jsdoc": "^62.5.4",
|
|
58
|
+
"magic-string": "^0.30.21",
|
|
59
|
+
"postcss": "^8.5.12",
|
|
60
|
+
"rollup": "^4.53.3",
|
|
61
|
+
"rollup-plugin-postcss": "^4.0.2"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=18.0.0"
|
|
15
65
|
}
|
|
16
|
-
}
|
|
66
|
+
}
|
package/readme.md
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: NativeDocument
|
|
3
|
+
description: A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# NativeDocument
|
|
2
7
|
|
|
3
8
|
[](https://opensource.org/licenses/MIT)
|
|
4
9
|
[](#)
|
|
5
|
-
[](#)
|
|
6
11
|
[](#)
|
|
7
12
|
|
|
8
13
|
> **A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features**
|
|
@@ -11,14 +16,16 @@ NativeDocument combines the familiarity of vanilla JavaScript with the power of
|
|
|
11
16
|
|
|
12
17
|
## Why NativeDocument?
|
|
13
18
|
|
|
19
|
+
> **Note**: NativeDocument works best with a bundler (Vite, Webpack, Rollup) for tree-shaking and optimal bundle size. The CDN version includes all features.
|
|
20
|
+
|
|
14
21
|
### **Instant Start**
|
|
15
22
|
```html
|
|
16
|
-
<script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document
|
|
23
|
+
<script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document/dist/native-document.min.js"></script>
|
|
17
24
|
```
|
|
18
25
|
|
|
19
26
|
### **Familiar API**
|
|
20
27
|
```javascript
|
|
21
|
-
import { Div, Button
|
|
28
|
+
import { Div, Button } from 'native-document/elements';
|
|
22
29
|
import { Observable } from 'native-document';
|
|
23
30
|
|
|
24
31
|
// CDN
|
|
@@ -28,41 +35,58 @@ import { Observable } from 'native-document';
|
|
|
28
35
|
const count = Observable(0);
|
|
29
36
|
|
|
30
37
|
const App = Div({ class: 'app' }, [
|
|
31
|
-
Div([
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
Div(['Count ', count]),
|
|
39
|
+
Button('Increment').nd
|
|
40
|
+
.onClick(() => count.$value++)
|
|
34
41
|
]);
|
|
35
42
|
|
|
36
43
|
document.body.appendChild(App);
|
|
37
44
|
```
|
|
38
45
|
|
|
39
46
|
### **Complete Features**
|
|
40
|
-
- **Native reactivity** with observables
|
|
41
|
-
- **Global store** for state management
|
|
42
|
-
- **Built-in conditional rendering**
|
|
43
|
-
- **Full-featured router** (hash, history, memory modes)
|
|
47
|
+
- **Native reactivity** with observables, computed values, and batched updates
|
|
48
|
+
- **Global store** for state management with groups, persistence, and computed stores
|
|
49
|
+
- **Built-in conditional rendering** (`ShowIf`, `Match`, `Switch`, `When`)
|
|
50
|
+
- **Full-featured router** (hash, history, memory modes) with layouts and middlewares
|
|
51
|
+
- **Headless UI components** with an optional rendering system (50+ components)
|
|
52
|
+
- **Built-in i18n** via `tr()`, locale-aware `Observable.format()`, and `Formatters`
|
|
53
|
+
- **Advanced data filtering** with composable filter helpers
|
|
54
|
+
- **Official CLI** for scaffolding projects, pages, components, and services
|
|
44
55
|
- **Advanced debugging system**
|
|
45
|
-
- **Automatic memory management** via FinalizationRegistry
|
|
56
|
+
- **Automatic memory management** via `FinalizationRegistry`
|
|
57
|
+
- **Tree-shaking** support — only bundle what you use
|
|
46
58
|
|
|
47
59
|
## Quick Installation
|
|
48
60
|
|
|
49
|
-
### Option 1:
|
|
61
|
+
### Option 1: CLI (Recommended)
|
|
62
|
+
|
|
63
|
+
The fastest way to start a complete project:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npm install -g @native-document/cli
|
|
67
|
+
|
|
68
|
+
nd create MyApp # default structure
|
|
69
|
+
nd create MyApp --feature # feature-based architecture
|
|
70
|
+
|
|
71
|
+
cd MyApp
|
|
72
|
+
npm install
|
|
73
|
+
npm start
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
> The CLI source is available at [github.com/afrocodeur/native-document-cli](https://github.com/afrocodeur/native-document-cli).
|
|
77
|
+
|
|
78
|
+
See the **[CLI guide](./cli.md)** for all available commands (`nd create:page`, `nd create:component`, `nd create:service` and more).
|
|
79
|
+
|
|
80
|
+
### Option 2: CDN (No build step)
|
|
50
81
|
```html
|
|
51
82
|
<script src="https://cdn.jsdelivr.net/gh/afrocodeur/native-document@latest/dist/native-document.min.js"></script>
|
|
52
83
|
<script>
|
|
53
|
-
const { Div
|
|
84
|
+
const { Div } = NativeDocument.elements;
|
|
85
|
+
const { Observable } = NativeDocument;
|
|
54
86
|
// Your code here
|
|
55
87
|
</script>
|
|
56
88
|
```
|
|
57
89
|
|
|
58
|
-
### Option 2: Vite Template (Complete Project)
|
|
59
|
-
```bash
|
|
60
|
-
npx degit afrocodeur/native-document-vite my-app
|
|
61
|
-
cd my-app
|
|
62
|
-
npm install
|
|
63
|
-
npm run dev
|
|
64
|
-
```
|
|
65
|
-
|
|
66
90
|
### Option 3: NPM/Yarn
|
|
67
91
|
```bash
|
|
68
92
|
npm install native-document
|
|
@@ -73,16 +97,16 @@ yarn add native-document
|
|
|
73
97
|
## Quick Example
|
|
74
98
|
|
|
75
99
|
```javascript
|
|
76
|
-
import { Div, Input, Button, ShowIf, ForEach } from 'native-document/
|
|
77
|
-
import { Observable } from 'native-document'
|
|
100
|
+
import { Div, Input, Button, ShowIf, ForEach } from 'native-document/elements';
|
|
101
|
+
import { Observable } from 'native-document';
|
|
78
102
|
|
|
79
103
|
// CDN
|
|
80
104
|
// const { Div, Input, Button, ShowIf, ForEach } = NativeDocument.elements;
|
|
81
105
|
// const { Observable } = NativeDocument;
|
|
82
106
|
|
|
83
107
|
// Reactive state
|
|
84
|
-
const todos = Observable.array([])
|
|
85
|
-
const newTodo = Observable('')
|
|
108
|
+
const todos = Observable.array([]);
|
|
109
|
+
const newTodo = Observable('');
|
|
86
110
|
|
|
87
111
|
// Todo Component
|
|
88
112
|
const TodoApp = Div({ class: 'todo-app' }, [
|
|
@@ -91,10 +115,11 @@ const TodoApp = Div({ class: 'todo-app' }, [
|
|
|
91
115
|
Input({ placeholder: 'Add new task...', value: newTodo }),
|
|
92
116
|
|
|
93
117
|
// Add button
|
|
94
|
-
Button('Add Todo').nd
|
|
118
|
+
Button('Add Todo').nd
|
|
119
|
+
.onClick(() => {
|
|
95
120
|
if (newTodo.val().trim()) {
|
|
96
|
-
todos.push({ id: Date.now(), text: newTodo.val(), done: false })
|
|
97
|
-
newTodo.set('')
|
|
121
|
+
todos.push({ id: Date.now(), text: newTodo.val(), done: false });
|
|
122
|
+
newTodo.set('');
|
|
98
123
|
}
|
|
99
124
|
}),
|
|
100
125
|
|
|
@@ -103,17 +128,19 @@ const TodoApp = Div({ class: 'todo-app' }, [
|
|
|
103
128
|
Div({ class: 'todo-item' }, [
|
|
104
129
|
Input({ type: 'checkbox', checked: todo.done }),
|
|
105
130
|
`${todo.text}`,
|
|
106
|
-
Button('Delete').nd
|
|
107
|
-
|
|
131
|
+
Button('Delete').nd
|
|
132
|
+
.onClick(() => todos.splice(index.val(), 1))
|
|
133
|
+
]),
|
|
134
|
+
(item) => item.id // Key function — use unique identifier
|
|
135
|
+
),
|
|
108
136
|
|
|
109
137
|
// Empty state
|
|
110
|
-
ShowIf(
|
|
111
|
-
todos.check(list => list.length === 0),
|
|
138
|
+
ShowIf(todos.isEmpty(),
|
|
112
139
|
Div({ class: 'empty' }, 'No todos yet!')
|
|
113
140
|
)
|
|
114
141
|
]);
|
|
115
142
|
|
|
116
|
-
document.body.appendChild(TodoApp)
|
|
143
|
+
document.body.appendChild(TodoApp);
|
|
117
144
|
```
|
|
118
145
|
|
|
119
146
|
## Core Concepts
|
|
@@ -121,44 +148,77 @@ document.body.appendChild(TodoApp)
|
|
|
121
148
|
### Observables
|
|
122
149
|
Reactive data that automatically updates the DOM:
|
|
123
150
|
```javascript
|
|
124
|
-
import { Div } from 'native-document/
|
|
125
|
-
import { Observable } from 'native-document'
|
|
151
|
+
import { Div } from 'native-document/elements';
|
|
152
|
+
import { Observable } from 'native-document';
|
|
126
153
|
|
|
127
154
|
// CDN
|
|
128
|
-
// const { Div
|
|
155
|
+
// const { Div } = NativeDocument.elements;
|
|
129
156
|
// const { Observable } = NativeDocument;
|
|
130
157
|
|
|
131
158
|
const user = Observable({ name: 'John', age: 25 });
|
|
132
|
-
const greeting = Observable.computed(() => `Hello ${user
|
|
133
|
-
// Or const greeting = Observable.computed(() => `Hello ${user.val().name}!`, [user])
|
|
159
|
+
const greeting = Observable.computed(() => `Hello ${user.val().name}!`, [user]);
|
|
134
160
|
|
|
135
161
|
document.body.appendChild(Div(greeting));
|
|
136
162
|
|
|
137
|
-
//
|
|
138
|
-
// user
|
|
139
|
-
|
|
163
|
+
// Direct mutation won't trigger updates
|
|
164
|
+
// user.name = 'Fausty'; // Wrong!
|
|
165
|
+
|
|
166
|
+
// These will trigger updates:
|
|
167
|
+
user.$value = { ...user.$value, name: 'Hermes!' };
|
|
168
|
+
user.set(data => ({ ...data, name: 'Hermes!' }));
|
|
140
169
|
user.set({ ...user.val(), name: 'Hermes!' });
|
|
141
170
|
```
|
|
142
171
|
|
|
172
|
+
### Formatting & i18n
|
|
173
|
+
Format observable values reactively with built-in locale awareness.
|
|
174
|
+
You must set a locale observable before using `Observable.format()`:
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
import { Observable } from 'native-document';
|
|
178
|
+
import { tr } from 'native-document/i18n';
|
|
179
|
+
|
|
180
|
+
// Set the locale first — formats react to it automatically
|
|
181
|
+
const $locale = Observable('fr');
|
|
182
|
+
Observable.setLocale($locale);
|
|
183
|
+
|
|
184
|
+
const price = Observable(4999);
|
|
185
|
+
const date = Observable(Date.now());
|
|
186
|
+
|
|
187
|
+
export function PriceDisplay() {
|
|
188
|
+
return Div([
|
|
189
|
+
Div(price.format('currency', { currency: 'USD' })),
|
|
190
|
+
Div(date.format('date', { dateStyle: 'long' })),
|
|
191
|
+
Button('Switch to English').nd
|
|
192
|
+
.onClick(() => $locale.set('en'))
|
|
193
|
+
]);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Built-in format types: currency, number, percent, date, time, datetime, relative, plural
|
|
197
|
+
|
|
198
|
+
// Translation helper
|
|
199
|
+
P(tr('welcome_message'))
|
|
200
|
+
```
|
|
201
|
+
|
|
143
202
|
### Elements
|
|
144
203
|
Familiar HTML element creation with reactive bindings:
|
|
145
204
|
```javascript
|
|
146
|
-
import { Div, Button } from 'native-document/
|
|
147
|
-
import { Observable } from 'native-document'
|
|
205
|
+
import { Div, Button } from 'native-document/elements';
|
|
206
|
+
import { Observable } from 'native-document';
|
|
148
207
|
|
|
149
208
|
// CDN
|
|
150
|
-
// const { Div, Button
|
|
209
|
+
// const { Div, Button } = NativeDocument.elements;
|
|
151
210
|
// const { Observable } = NativeDocument;
|
|
152
211
|
|
|
153
|
-
const App
|
|
154
|
-
const isVisible = Observable(true)
|
|
155
|
-
|
|
212
|
+
const App = function() {
|
|
213
|
+
const isVisible = Observable(true);
|
|
214
|
+
|
|
156
215
|
return Div([
|
|
157
216
|
Div({
|
|
158
|
-
class: { 'hidden': isVisible.
|
|
159
|
-
style: { opacity: isVisible.
|
|
217
|
+
class: { 'hidden': isVisible.isFalsy() },
|
|
218
|
+
style: { opacity: isVisible.format(v => v ? 1 : 0.2) }
|
|
160
219
|
}, 'Content'),
|
|
161
|
-
Button('Toggle').nd
|
|
220
|
+
Button('Toggle').nd
|
|
221
|
+
.onClick(() => isVisible.toggle()),
|
|
162
222
|
]);
|
|
163
223
|
};
|
|
164
224
|
|
|
@@ -168,13 +228,15 @@ document.body.appendChild(App());
|
|
|
168
228
|
### Conditional Rendering
|
|
169
229
|
Built-in components for dynamic content:
|
|
170
230
|
```javascript
|
|
171
|
-
ShowIf
|
|
172
|
-
|
|
231
|
+
import { ShowIf, Match, Switch, When } from 'native-document/elements';
|
|
232
|
+
|
|
233
|
+
ShowIf(user.is(u => u.isLoggedIn),
|
|
234
|
+
Div('Welcome back!')
|
|
173
235
|
)
|
|
174
236
|
|
|
175
237
|
Match(theme, {
|
|
176
|
-
|
|
177
|
-
|
|
238
|
+
'dark': Div({ class: 'dark-mode' }),
|
|
239
|
+
'light': Div({ class: 'light-mode' })
|
|
178
240
|
})
|
|
179
241
|
|
|
180
242
|
Switch(condition, onTrue, onFalse)
|
|
@@ -184,41 +246,177 @@ When(condition)
|
|
|
184
246
|
.otherwise(onFalse)
|
|
185
247
|
```
|
|
186
248
|
|
|
187
|
-
|
|
249
|
+
### List Rendering
|
|
250
|
+
Efficient rendering of lists with automatic updates:
|
|
251
|
+
```javascript
|
|
252
|
+
import { ForEach, Div } from 'native-document/elements';
|
|
253
|
+
import { Observable } from 'native-document';
|
|
188
254
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
# Complete todo application with local storage
|
|
206
|
-
git clone https://github.com/afrocodeur/native-document-examples
|
|
207
|
-
cd examples/todo-app
|
|
255
|
+
const items = Observable.array(['Apple', 'Banana', 'Cherry']);
|
|
256
|
+
|
|
257
|
+
ForEach(items, (item, index) =>
|
|
258
|
+
Div([index, '. ', item])
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
// With object arrays — use a key function for efficient updates
|
|
262
|
+
const users = Observable.array([
|
|
263
|
+
{ id: 1, name: 'Alice' },
|
|
264
|
+
{ id: 2, name: 'Bob' }
|
|
265
|
+
]);
|
|
266
|
+
|
|
267
|
+
ForEach(users, (user) =>
|
|
268
|
+
Div(user.name),
|
|
269
|
+
(user) => user.id // Key for efficient updates
|
|
270
|
+
)
|
|
208
271
|
```
|
|
209
272
|
|
|
210
|
-
###
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
273
|
+
### Routing
|
|
274
|
+
Full-featured router with hash, history, and memory modes.
|
|
275
|
+
Use `to` with a route name (string) or `{ name, params }` object. Use `href` for direct path links:
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
import { Router, Link } from 'native-document/router';
|
|
279
|
+
|
|
280
|
+
Router.create({ name: 'default', mode: 'history' }, (router) => {
|
|
281
|
+
router.group('', { layout: DefaultLayout }, () => {
|
|
282
|
+
router.add('/', HomePage);
|
|
283
|
+
router.add('/user/{id}', UserPage);
|
|
284
|
+
router.add('{*}', NotFoundPage);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// Named route link
|
|
289
|
+
Link({ to: 'home' }, 'Home')
|
|
290
|
+
|
|
291
|
+
// Named route with params
|
|
292
|
+
Link({ to: { name: 'user', params: { id: 42 } } }, 'User Profile')
|
|
293
|
+
|
|
294
|
+
// Direct path link
|
|
295
|
+
Link({ href: '/about' }, 'About')
|
|
214
296
|
```
|
|
215
297
|
|
|
216
|
-
###
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
298
|
+
### State Management
|
|
299
|
+
Global state with groups, persistence, and computed stores:
|
|
300
|
+
```javascript
|
|
301
|
+
import { Store } from 'native-document';
|
|
302
|
+
|
|
303
|
+
// Simple store
|
|
304
|
+
Store.create('theme', 'light');
|
|
305
|
+
|
|
306
|
+
// Persistent store — survives page reloads
|
|
307
|
+
Store.createPersistent('settings', { lang: 'en', darkMode: false });
|
|
308
|
+
|
|
309
|
+
// Grouped stores — isolated namespaces
|
|
310
|
+
const CartStore = Store.group('cart', (group) => {
|
|
311
|
+
group.create('items', []);
|
|
312
|
+
group.createComposed('total', () => {
|
|
313
|
+
return CartStore.get('items').val()
|
|
314
|
+
.reduce((sum, item) => sum + item.price * item.qty, 0);
|
|
315
|
+
}, ['items']);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// Access in components
|
|
319
|
+
const items = CartStore.use('items'); // two-way reactive
|
|
320
|
+
const total = CartStore.follow('total'); // read-only reactive
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Data Filters
|
|
324
|
+
Composable filter helpers for `ObservableArray` only:
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
import { Observable } from 'native-document';
|
|
328
|
+
import { equals, greaterThan, lessThan, and, or, not } from 'native-document/filters';
|
|
329
|
+
|
|
330
|
+
const users = Observable.array([
|
|
331
|
+
{ name: 'Alice', age: 17, role: 'user' },
|
|
332
|
+
{ name: 'Bob', age: 25, role: 'admin' },
|
|
333
|
+
{ name: 'Carol', age: 32, role: 'user' },
|
|
334
|
+
]);
|
|
335
|
+
|
|
336
|
+
// and — field must pass ALL conditions
|
|
337
|
+
const youngAdults = users.where({
|
|
338
|
+
age: and(greaterThan(18), lessThan(30))
|
|
339
|
+
});
|
|
340
|
+
// → Bob (25)
|
|
341
|
+
|
|
342
|
+
// or — field must pass AT LEAST ONE condition
|
|
343
|
+
const adminOrEditor = users.where({
|
|
344
|
+
role: or(equals('admin'), equals('editor'))
|
|
345
|
+
});
|
|
346
|
+
// → Bob
|
|
347
|
+
|
|
348
|
+
// not — inverts a filter
|
|
349
|
+
const nonAdmins = users.where({
|
|
350
|
+
role: not(equals('admin'))
|
|
351
|
+
});
|
|
352
|
+
// → Alice, Carol
|
|
353
|
+
|
|
354
|
+
// Cross-field logic — use the _ key with a plain function
|
|
355
|
+
const adminsOrMinors = users.where({
|
|
356
|
+
_: (item) => item.role === 'admin' || item.age < 18
|
|
357
|
+
});
|
|
358
|
+
// → Alice (minor), Bob (admin)
|
|
220
359
|
```
|
|
221
360
|
|
|
361
|
+
> `and`, `or`, and `not` work on **filter result objects** — they operate on a single field.
|
|
362
|
+
> For cross-field logic use the `_` key with a plain function.
|
|
363
|
+
> `.where()` returns a new live `ObservableArray` that re-filters automatically when the source changes.
|
|
364
|
+
|
|
365
|
+
## Documentation
|
|
366
|
+
|
|
367
|
+
- **[Getting Started](./getting-started.md)** — Installation and first steps
|
|
368
|
+
- **[CLI](./cli.md)** — Scaffolding projects, pages, and components
|
|
369
|
+
- **[Core Concepts](./core-concepts.md)** — Understanding the fundamentals
|
|
370
|
+
- **[Observables](./observables.md)** — Reactive state management
|
|
371
|
+
- **[Observable Resource](./observable-resource.md)** — Async data fetching
|
|
372
|
+
- **[Elements](./elements.md)** — Creating and composing UI
|
|
373
|
+
- **[Conditional Rendering](./conditional-rendering.md)** — Dynamic content
|
|
374
|
+
- **[List Rendering](./list-rendering.md)** — ForEach and dynamic lists
|
|
375
|
+
- **[Routing](./routing.md)** — Navigation and URL management
|
|
376
|
+
- **[State Management](./state-management.md)** — Global state patterns
|
|
377
|
+
- **[Lifecycle Events](./lifecycle-events.md)** — Lifecycle events
|
|
378
|
+
- **[NDElement](./native-document-element.md)** — Native Document Element
|
|
379
|
+
- **[Extending NDElement](./extending-native-document-element.md)** — Custom Methods Guide
|
|
380
|
+
- **[Advanced Components](./advanced-components.md)** — Template caching and singleton views
|
|
381
|
+
- **[Args Validation](./validation.md)** — Function Argument Validation
|
|
382
|
+
- **[Memory Management](./memory-management.md)** — Memory management
|
|
383
|
+
- **[Anchor](./anchor.md)** — Anchor
|
|
384
|
+
- **[SVG Elements](./svg-elements.md)** — SVG wrapper functions
|
|
385
|
+
- **[i18n & Formatting](./i18n.md)** — Locale-aware formatting and translations
|
|
386
|
+
|
|
387
|
+
### Components
|
|
388
|
+
|
|
389
|
+
- **[Components Overview](./components/index.md)** — Headless UI component system
|
|
390
|
+
- **[Getting Started](./components/getting-started.md)** — First component and renderer setup
|
|
391
|
+
- **[Traits](./components/traits.md)** — Draggable, Resizable, EventEmitter
|
|
392
|
+
- **[Layout](./components/layout.md)** — Stack, Row, Col, Divider
|
|
393
|
+
- **[Accordion](./components/accordion.md)**
|
|
394
|
+
- **[Alert, Badge, Spinner, Skeleton, Progress](./components/alert.md)**
|
|
395
|
+
- **[Avatar](./components/avatar.md)**
|
|
396
|
+
- **[Breadcrumb](./components/breadcrumb.md)**
|
|
397
|
+
- **[Button](./components/button.md)**
|
|
398
|
+
- **[Context Menu](./components/context-menu.md)**
|
|
399
|
+
- **[Data Table](./components/data-table.md)**
|
|
400
|
+
- **[Dropdown](./components/dropdown.md)**
|
|
401
|
+
- **[File Upload](./components/file.md)**
|
|
402
|
+
- **[Form Fields](./components/form-fields.md)**
|
|
403
|
+
- **[Checkbox & Radio](./components/checkbox-radio.md)**
|
|
404
|
+
- **[Select](./components/select.md)**
|
|
405
|
+
- **[Menu](./components/menu.md)**
|
|
406
|
+
- **[Modal & Popover](./components/modal.md)**
|
|
407
|
+
- **[Slider & Stepper](./components/slider-stepper.md)**
|
|
408
|
+
- **[Splitter](./components/splitter.md)**
|
|
409
|
+
- **[Switch](./components/switch.md)**
|
|
410
|
+
- **[Tabs](./components/tabs.md)**
|
|
411
|
+
- **[Toast](./components/toast.md)**
|
|
412
|
+
- **[Tooltip](./components/tooltip.md)**
|
|
413
|
+
|
|
414
|
+
### Utilities
|
|
415
|
+
|
|
416
|
+
- **[Cache](./utils/cache.md)** — Lazy initialization and singleton patterns
|
|
417
|
+
- **[NativeFetch](./utils/native-fetch.md)** — HTTP client with interceptors
|
|
418
|
+
- **[Filters](./utils/filters.md)** — Data filtering helpers
|
|
419
|
+
|
|
222
420
|
## Key Features Deep Dive
|
|
223
421
|
|
|
224
422
|
### Performance Optimized
|
|
@@ -226,28 +424,34 @@ cd examples/components
|
|
|
226
424
|
- Automatic batching of updates
|
|
227
425
|
- Lazy evaluation of computed values
|
|
228
426
|
- Efficient list rendering with keyed updates
|
|
427
|
+
- Tree-shaking — only bundle what you use
|
|
229
428
|
|
|
230
429
|
### Developer Experience
|
|
231
430
|
```javascript
|
|
431
|
+
import { ArgTypes } from 'native-document';
|
|
432
|
+
|
|
232
433
|
// Built-in debugging
|
|
233
|
-
Observable.debug.enable()
|
|
434
|
+
Observable.debug.enable();
|
|
234
435
|
|
|
235
436
|
// Argument validation
|
|
236
|
-
const createUser = (function
|
|
237
|
-
|
|
238
|
-
}).args(ArgTypes.string('name'), ArgTypes.number('age'))
|
|
437
|
+
const createUser = (function(name, age) {
|
|
438
|
+
// Auto-validates argument types in development
|
|
439
|
+
}).args(ArgTypes.string('name'), ArgTypes.number('age'));
|
|
239
440
|
|
|
240
441
|
// Error boundaries
|
|
241
|
-
const
|
|
242
|
-
return Div(
|
|
243
|
-
|
|
442
|
+
const SafeApp = App.errorBoundary((error, { caller, args }) => {
|
|
443
|
+
return Div({ class: 'error' }, [
|
|
444
|
+
'An error occurred: ',
|
|
445
|
+
error.message
|
|
446
|
+
]);
|
|
447
|
+
});
|
|
244
448
|
|
|
245
|
-
document.body.appendChild(
|
|
449
|
+
document.body.appendChild(SafeApp());
|
|
246
450
|
```
|
|
247
451
|
|
|
248
452
|
## Contributing
|
|
249
453
|
|
|
250
|
-
We welcome contributions! Please see our [Contributing Guide](
|
|
454
|
+
We welcome contributions! Please see our [Contributing Guide](./contributing.md) for details.
|
|
251
455
|
|
|
252
456
|
### Development Setup
|
|
253
457
|
```bash
|
|
@@ -287,11 +491,10 @@ Your support helps me:
|
|
|
287
491
|
|
|
288
492
|
Thanks for your support! 🙏
|
|
289
493
|
|
|
290
|
-
|
|
291
494
|
## Acknowledgments
|
|
292
495
|
|
|
293
496
|
Thanks to all contributors and the JavaScript community for inspiration.
|
|
294
497
|
|
|
295
498
|
---
|
|
296
499
|
|
|
297
|
-
**Ready to build with native simplicity?** [Get Started
|
|
500
|
+
**Ready to build with native simplicity?** [Get Started ->](./getting-started.md)
|