native-document 1.0.15 → 1.0.16-8.2
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 +98 -0
- package/src/core/wrappers/DocumentObserver.js +182 -0
- package/src/core/wrappers/ElementCreator.js +120 -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 +179 -0
- package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
- package/src/core/wrappers/prototypes/nd-element-extensions.js +157 -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/docs/elements.md
CHANGED
|
@@ -1,384 +1,396 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Elements
|
|
3
|
+
description: Create reactive HTML elements with a declarative syntax - every HTML element has a corresponding function in NativeDocument
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Elements
|
|
2
7
|
|
|
3
|
-
NativeDocument provides a simple and intuitive way to create HTML elements with a declarative syntax. Every HTML element has a corresponding function that creates reactive DOM
|
|
8
|
+
NativeDocument provides a simple and intuitive way to create HTML elements with a declarative syntax. Every HTML element has a corresponding function that creates a reactive DOM element.
|
|
4
9
|
|
|
5
10
|
## Basic Element Creation
|
|
6
11
|
|
|
7
12
|
```javascript
|
|
8
|
-
//
|
|
9
|
-
const title
|
|
10
|
-
const description = P({ class:
|
|
13
|
+
// With attributes
|
|
14
|
+
const title = H1({ class: 'main-title' }, 'Welcome to my app');
|
|
15
|
+
const description = P({ class: 'description' }, 'This is a paragraph');
|
|
11
16
|
|
|
12
|
-
//
|
|
13
|
-
const simpleTitle = H1(
|
|
14
|
-
const simplePara
|
|
15
|
-
const container
|
|
17
|
+
// Without attributes
|
|
18
|
+
const simpleTitle = H1('Welcome to my app');
|
|
19
|
+
const simplePara = P('This is a paragraph');
|
|
20
|
+
const container = Div('Content here');
|
|
16
21
|
|
|
17
|
-
//
|
|
22
|
+
// Self-closing elements
|
|
18
23
|
const separator = Hr();
|
|
19
|
-
const lineBreak
|
|
24
|
+
const lineBreak = Br();
|
|
20
25
|
```
|
|
21
26
|
|
|
22
27
|
## Element Structure
|
|
23
28
|
|
|
24
29
|
All element functions follow the same pattern:
|
|
30
|
+
|
|
25
31
|
```javascript
|
|
26
32
|
ElementName(attributes, children)
|
|
27
33
|
// or
|
|
28
34
|
ElementName(children) // attributes are optional
|
|
29
35
|
```
|
|
30
36
|
|
|
31
|
-
- **attributes
|
|
32
|
-
- **children
|
|
37
|
+
- **attributes** - object with HTML attributes (optional, can be `null` or omitted)
|
|
38
|
+
- **children** - text, number, observable, other elements, closures (no-param functions), or an array of any of these. Closures are accepted as-is - no need to call them if they take no parameters.
|
|
33
39
|
|
|
34
40
|
## Working with Attributes
|
|
35
41
|
|
|
36
42
|
```javascript
|
|
37
43
|
// Static attributes
|
|
38
|
-
const link = Link({
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
},
|
|
44
|
+
const link = Link({
|
|
45
|
+
href: '/about',
|
|
46
|
+
class: 'nav-link',
|
|
47
|
+
id: 'about-link'
|
|
48
|
+
}, 'About Us');
|
|
43
49
|
|
|
44
50
|
// Boolean attributes
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
const checkbox = Input({
|
|
52
|
+
type: 'checkbox',
|
|
53
|
+
checked: true,
|
|
54
|
+
disabled: false
|
|
49
55
|
});
|
|
50
56
|
|
|
51
57
|
// Data attributes
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
},
|
|
58
|
+
const card = Div({
|
|
59
|
+
'data-id': '123',
|
|
60
|
+
'data-category': 'important'
|
|
61
|
+
}, 'Content');
|
|
56
62
|
```
|
|
57
63
|
|
|
58
|
-
## Reactive Attributes
|
|
64
|
+
## Reactive Attributes
|
|
65
|
+
|
|
66
|
+
Pass an observable directly as an attribute value - it updates automatically when the observable changes:
|
|
59
67
|
|
|
60
68
|
```javascript
|
|
61
69
|
const isVisible = Observable(true);
|
|
62
|
-
const userName
|
|
63
|
-
const theme
|
|
70
|
+
const userName = Observable('Guest');
|
|
71
|
+
const theme = Observable('dark');
|
|
64
72
|
|
|
65
|
-
// Reactive attributes
|
|
66
73
|
const greeting = Div({
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
},
|
|
74
|
+
class: theme,
|
|
75
|
+
hidden: isVisible.isFalsy()
|
|
76
|
+
}, ['Hello ', userName, '!']);
|
|
70
77
|
|
|
71
78
|
// Reactive styles
|
|
72
79
|
const box = Div({
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
},
|
|
80
|
+
style: {
|
|
81
|
+
backgroundColor: theme.is('dark').check(v => v ? '#333' : '#fff'),
|
|
82
|
+
color: theme.is('dark').check(v => v ? '#fff' : '#333')
|
|
83
|
+
}
|
|
84
|
+
}, 'Themed content');
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Conditional Classes
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
const isActive = Observable(false);
|
|
91
|
+
const count = Observable(0);
|
|
92
|
+
|
|
93
|
+
const item = Div({
|
|
94
|
+
class: {
|
|
95
|
+
'item': true, // always present
|
|
96
|
+
'active': isActive, // present when isActive is true
|
|
97
|
+
'highlighted': count.check(c => c > 5) // present when count > 5
|
|
98
|
+
}
|
|
99
|
+
}, 'List item');
|
|
78
100
|
```
|
|
79
101
|
|
|
80
102
|
## Children and Content
|
|
81
103
|
|
|
82
104
|
```javascript
|
|
83
|
-
//
|
|
84
|
-
const simple = P(
|
|
105
|
+
// Single text child
|
|
106
|
+
const simple = P('Simple text');
|
|
85
107
|
|
|
86
|
-
// Single child
|
|
87
|
-
const wrapper = Div({ class:
|
|
88
|
-
P("Wrapped paragraph")
|
|
89
|
-
);
|
|
108
|
+
// Single element child
|
|
109
|
+
const wrapper = Div({ class: 'wrapper' }, P('Wrapped paragraph'));
|
|
90
110
|
|
|
91
111
|
// Multiple children as array
|
|
92
|
-
const list = Div({ class:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
112
|
+
const list = Div({ class: 'item-list' }, [
|
|
113
|
+
P('First item'),
|
|
114
|
+
P('Second item'),
|
|
115
|
+
P('Third item')
|
|
96
116
|
]);
|
|
97
117
|
|
|
98
118
|
// Mixed content
|
|
99
119
|
const mixed = Div([
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
120
|
+
H2('Title'),
|
|
121
|
+
'Some text between elements',
|
|
122
|
+
P('A paragraph'),
|
|
123
|
+
Button('Click me')
|
|
104
124
|
]);
|
|
105
125
|
```
|
|
106
126
|
|
|
107
|
-
## Event Handling with
|
|
127
|
+
## Event Handling with the `.nd` API
|
|
108
128
|
|
|
109
|
-
The `.nd`
|
|
129
|
+
The `.nd` API provides a fluent interface for events, lifecycle, and DOM utilities:
|
|
110
130
|
|
|
111
131
|
```javascript
|
|
112
|
-
const button = Button(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
blur: () => console.log("Input blurred"),
|
|
134
|
-
input: event => console.log("Input value:", event.target.value)
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
// Prevent default behavior
|
|
132
|
+
const button = Button('Click me')
|
|
133
|
+
.nd.onClick(() => console.log('Clicked!'));
|
|
134
|
+
|
|
135
|
+
// With attributes
|
|
136
|
+
const styledButton = Button({ class: 'btn' }, 'Click me')
|
|
137
|
+
.nd.onClick(() => console.log('Clicked!'));
|
|
138
|
+
|
|
139
|
+
// Multiple events - chained
|
|
140
|
+
const input = Input({ type: 'text', placeholder: 'Type here...' })
|
|
141
|
+
.nd
|
|
142
|
+
.onFocus(() => console.log('Focused'))
|
|
143
|
+
.onBlur(() => console.log('Blurred'))
|
|
144
|
+
.onInput(e => console.log('Value:', e.target.value));
|
|
145
|
+
|
|
146
|
+
// Single event via .on() - name, callback, options (standard addEventListener signature)
|
|
147
|
+
const input2 = Input({ type: 'text' })
|
|
148
|
+
.nd
|
|
149
|
+
.on('input', e => console.log('Value:', e.target.value))
|
|
150
|
+
.on('focus', () => console.log('Focused'), { once: true });
|
|
151
|
+
|
|
152
|
+
// Prevent default
|
|
138
153
|
const form = Form()
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
});
|
|
154
|
+
.nd.onPreventSubmit(e => {
|
|
155
|
+
console.log('Submitted without page reload');
|
|
156
|
+
});
|
|
143
157
|
```
|
|
144
158
|
|
|
145
159
|
## Form Elements and Two-Way Binding
|
|
146
160
|
|
|
147
|
-
|
|
148
|
-
const name = Observable("");
|
|
149
|
-
const email = Observable("");
|
|
150
|
-
const isChecked = Observable(false);
|
|
151
|
-
|
|
152
|
-
// Text input with two-way binding
|
|
153
|
-
const nameInput = Input({
|
|
154
|
-
type: "text",
|
|
155
|
-
value: name, // Automatic two-way binding
|
|
156
|
-
placeholder: "Enter your name"
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
// Email input
|
|
160
|
-
const emailInput = Input({
|
|
161
|
-
type: "email",
|
|
162
|
-
value: email,
|
|
163
|
-
placeholder: "Enter your email"
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
// Checkbox with binding
|
|
167
|
-
const checkbox = Input({
|
|
168
|
-
type: "checkbox",
|
|
169
|
-
checked: isChecked // Automatic two-way binding
|
|
170
|
-
});
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
## Conditional Classes and Styles
|
|
161
|
+
Passing an observable to `value` or `checked` creates automatic two-way binding:
|
|
174
162
|
|
|
175
163
|
```javascript
|
|
176
|
-
const
|
|
177
|
-
const
|
|
164
|
+
const name = Observable('');
|
|
165
|
+
const email = Observable('');
|
|
166
|
+
const isChecked = Observable(false);
|
|
178
167
|
|
|
179
|
-
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
"item": true, // Always present
|
|
183
|
-
"active": isActive, // Present when isActive is true
|
|
184
|
-
"highlighted": count.check(c => c > 5) // Present when count > 5
|
|
185
|
-
}
|
|
186
|
-
}, "List item");
|
|
187
|
-
|
|
188
|
-
// Dynamic styles
|
|
189
|
-
const progress = Div({
|
|
190
|
-
style: {
|
|
191
|
-
width: count.check(c => `${c}%`),
|
|
192
|
-
backgroundColor: count.check(c => c > 50 ? "green" : "red")
|
|
193
|
-
}
|
|
194
|
-
}, "Progress bar");
|
|
168
|
+
const nameInput = Input({ type: 'text', value: name, placeholder: 'Your name' });
|
|
169
|
+
const emailInput = Input({ type: 'email', value: email, placeholder: 'Your email' });
|
|
170
|
+
const checkbox = Input({ type: 'checkbox', checked: isChecked });
|
|
195
171
|
```
|
|
196
172
|
|
|
197
173
|
## Lifecycle Management
|
|
198
174
|
|
|
199
175
|
```javascript
|
|
200
|
-
const component = Div(
|
|
176
|
+
const component = Div('Component content')
|
|
201
177
|
.nd.mounted(element => {
|
|
202
|
-
console.log(
|
|
203
|
-
// Initialize component
|
|
178
|
+
console.log('Mounted to DOM');
|
|
204
179
|
})
|
|
205
180
|
.nd.unmounted(element => {
|
|
206
|
-
console.log(
|
|
207
|
-
// Cleanup resources
|
|
181
|
+
console.log('Removed from DOM');
|
|
208
182
|
});
|
|
209
183
|
|
|
210
|
-
// Combined
|
|
211
|
-
const widget = Div(
|
|
184
|
+
// Combined
|
|
185
|
+
const widget = Div('Widget')
|
|
212
186
|
.nd.lifecycle({
|
|
213
|
-
mounted:
|
|
214
|
-
unmounted: element => console.log(
|
|
187
|
+
mounted: element => console.log('Mounted'),
|
|
188
|
+
unmounted: element => console.log('Unmounted')
|
|
215
189
|
});
|
|
216
190
|
```
|
|
217
191
|
|
|
192
|
+
## Manual DOM Manipulation
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
// Remove all children
|
|
196
|
+
const container = Div([P('Child 1'), P('Child 2')]);
|
|
197
|
+
container.nd.unmountChildren();
|
|
198
|
+
|
|
199
|
+
// Remove element from DOM
|
|
200
|
+
const element = Div('Content');
|
|
201
|
+
element.nd.remove();
|
|
202
|
+
```
|
|
203
|
+
|
|
218
204
|
## Element References
|
|
219
205
|
|
|
206
|
+
`.ref()` and `.refSelf()` both store a reference on a target object, but they store different things:
|
|
207
|
+
|
|
208
|
+
- **`.ref(target, name)`** - stores the **native HTML element** (`this.$element`) → use when you need direct DOM access
|
|
209
|
+
- **`.refSelf(target, name)`** - stores the **`NDElement` instance** (`this`) → use when you need to keep calling `.nd` methods
|
|
210
|
+
|
|
220
211
|
```javascript
|
|
221
212
|
const refs = {};
|
|
222
213
|
|
|
223
214
|
const app = Div([
|
|
224
|
-
Input({ type:
|
|
225
|
-
.nd.ref(refs,
|
|
215
|
+
Input({ type: 'text' })
|
|
216
|
+
.nd.ref(refs, 'nameInput'), // refs.nameInput → HTMLInputElement
|
|
217
|
+
|
|
218
|
+
Input({ type: 'text' })
|
|
219
|
+
.nd.refSelf(refs, 'emailInput'), // refs.emailInput → NDElement instance
|
|
226
220
|
|
|
227
|
-
Button(
|
|
221
|
+
Button('Actions')
|
|
228
222
|
.nd.onClick(() => {
|
|
229
|
-
refs.nameInput.focus();
|
|
223
|
+
refs.nameInput.focus(); // native DOM method
|
|
224
|
+
refs.emailInput.onInput(e => console.log(e.target.value)); // nd method
|
|
230
225
|
})
|
|
231
226
|
]);
|
|
232
227
|
```
|
|
233
228
|
|
|
234
|
-
##
|
|
229
|
+
## `.nd.with()` - Instance-level Custom Methods
|
|
230
|
+
|
|
231
|
+
Add custom methods to a single element instance without affecting other elements:
|
|
235
232
|
|
|
236
233
|
```javascript
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
234
|
+
const customButton = Button('Click me')
|
|
235
|
+
.nd.with({
|
|
236
|
+
highlight() {
|
|
237
|
+
this.$element.style.backgroundColor = 'yellow';
|
|
238
|
+
return this;
|
|
239
|
+
},
|
|
240
|
+
resetStyle() {
|
|
241
|
+
this.$element.style.backgroundColor = '';
|
|
242
|
+
return this;
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
.highlight();
|
|
246
246
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
Strong(count) // Reactive display
|
|
250
|
-
]);
|
|
247
|
+
customButton.resetStyle().highlight();
|
|
248
|
+
```
|
|
251
249
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
250
|
+
> `.nd.with()` only affects the current instance. To add methods to **all** elements, extend `NDElement.prototype` - see [Extending NDElement](./extending-native-document-element.md).
|
|
251
|
+
|
|
252
|
+
## `.nd.attach()` - Template Binding
|
|
253
|
+
|
|
254
|
+
Attaches a template binding hydrator to the element. Used internally by the `useCache` and `useSingleton` rendering systems:
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
// methodName - the event/method name to hydrate
|
|
258
|
+
// bindingHydrator - a binding with a $hydrate method, or a plain function
|
|
259
|
+
element.nd.attach('onClick', bindingHydrator);
|
|
256
260
|
```
|
|
257
261
|
|
|
258
|
-
|
|
262
|
+
See [Advanced Components](./advanced-components.md) for practical usage with `useCache`.
|
|
263
|
+
|
|
264
|
+
## Class and Style Accumulators
|
|
265
|
+
|
|
266
|
+
Build classes and styles programmatically before passing them to an element:
|
|
259
267
|
|
|
260
268
|
```javascript
|
|
261
|
-
|
|
262
|
-
name: "",
|
|
263
|
-
email: "",
|
|
264
|
-
age: ""
|
|
265
|
-
});
|
|
269
|
+
import { classPropertyAccumulator, cssPropertyAccumulator } from 'native-document';
|
|
266
270
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
271
|
+
// Class accumulator
|
|
272
|
+
const classes = classPropertyAccumulator(['btn']);
|
|
273
|
+
classes.add('primary');
|
|
274
|
+
classes.add('large');
|
|
275
|
+
|
|
276
|
+
const button = Button({ class: classes.value() }, 'Submit');
|
|
277
|
+
// class="btn primary large"
|
|
278
|
+
|
|
279
|
+
// Object form
|
|
280
|
+
const classObj = classPropertyAccumulator({ btn: true });
|
|
281
|
+
classObj.add('primary', true);
|
|
282
|
+
classObj.add('disabled', false);
|
|
283
|
+
classObj.value(); // { btn: true, primary: true, disabled: false }
|
|
284
|
+
|
|
285
|
+
// CSS accumulator
|
|
286
|
+
const styles = cssPropertyAccumulator({ color: 'red' });
|
|
287
|
+
styles.add('font-size', '16px');
|
|
288
|
+
styles.add('margin', '10px');
|
|
289
|
+
|
|
290
|
+
const element = Div({ style: styles.value() }, 'Styled content');
|
|
291
|
+
// style="color: red; font-size: 16px; margin: 10px"
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Shadow DOM
|
|
295
|
+
|
|
296
|
+
```javascript
|
|
297
|
+
// Open shadow DOM (inspectable in DevTools)
|
|
298
|
+
const widget = Div('Widget content')
|
|
299
|
+
.nd.openShadow(`
|
|
300
|
+
:host { display: block; padding: 20px; }
|
|
301
|
+
p { color: blue; }
|
|
302
|
+
`);
|
|
303
|
+
|
|
304
|
+
// Closed shadow DOM (private)
|
|
305
|
+
const privateWidget = Div('Private content')
|
|
306
|
+
.nd.closedShadow(`p { color: red; }`);
|
|
307
|
+
|
|
308
|
+
// Manual mode
|
|
309
|
+
const customWidget = Div('Custom')
|
|
310
|
+
.nd.shadow('open', `/* scoped styles */`);
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Practical Example: Form with Validation
|
|
314
|
+
|
|
315
|
+
```javascript
|
|
316
|
+
const formData = Observable.object({ name: '', email: '', age: '' });
|
|
317
|
+
const errors = Observable.object({ name: '', email: '', age: '' });
|
|
272
318
|
|
|
273
|
-
// Validation function
|
|
274
319
|
const validateForm = () => {
|
|
275
320
|
const data = formData.$value;
|
|
276
|
-
const newErrors = {};
|
|
277
|
-
|
|
278
|
-
newErrors.name = data.name.length < 2 ? "Name must be at least 2 characters" : "";
|
|
279
|
-
newErrors.email = !data.email.includes("@") ? "Invalid email address" : "";
|
|
280
|
-
newErrors.age = isNaN(data.age) || data.age < 1 ? "Age must be a valid number" : "";
|
|
281
321
|
|
|
282
|
-
|
|
322
|
+
errors.name.set(data.name.length < 2 ? 'Name must be at least 2 characters' : '');
|
|
323
|
+
errors.email.set(!data.email.includes('@') ? 'Invalid email address' : '');
|
|
324
|
+
errors.age.set(isNaN(data.age) || data.age < 1 ? 'Age must be a valid number' : '');
|
|
283
325
|
|
|
284
|
-
return
|
|
326
|
+
return [errors.name, errors.email, errors.age].every(e => e.val() === '');
|
|
285
327
|
};
|
|
286
328
|
|
|
287
|
-
const contactForm = Form({ class:
|
|
288
|
-
|
|
289
|
-
Div({ class:
|
|
290
|
-
Label(
|
|
291
|
-
Input({
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
placeholder: "Enter your name"
|
|
295
|
-
}).nd.onBlur(validateForm),
|
|
296
|
-
|
|
297
|
-
ShowIf(errors.name.check(err => err !== ""),
|
|
298
|
-
Span({ class: "error" }, errors.name)
|
|
299
|
-
)
|
|
329
|
+
const contactForm = Form({ class: 'contact-form' }, [
|
|
330
|
+
|
|
331
|
+
Div({ class: 'field' }, [
|
|
332
|
+
Label('Name:'),
|
|
333
|
+
Input({ type: 'text', value: formData.name, placeholder: 'Enter your name' })
|
|
334
|
+
.nd.onBlur(validateForm),
|
|
335
|
+
ShowIf(errors.name.isTruthy(), Span({ class: 'error' }, errors.name))
|
|
300
336
|
]),
|
|
301
337
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
value: formData.email,
|
|
308
|
-
placeholder: "Enter your email"
|
|
309
|
-
}).nd.onBlur(validateForm),
|
|
310
|
-
|
|
311
|
-
ShowIf(errors.email.check(err => err !== ""),
|
|
312
|
-
Span({ class: "error" }, errors.email)
|
|
313
|
-
)
|
|
338
|
+
Div({ class: 'field' }, [
|
|
339
|
+
Label('Email:'),
|
|
340
|
+
Input({ type: 'email', value: formData.email, placeholder: 'Enter your email' })
|
|
341
|
+
.nd.onBlur(validateForm),
|
|
342
|
+
ShowIf(errors.email.isTruthy(), Span({ class: 'error' }, errors.email))
|
|
314
343
|
]),
|
|
315
344
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
value: formData.age,
|
|
322
|
-
placeholder: "Enter your age"
|
|
323
|
-
}).nd.onBlur(validateForm),
|
|
324
|
-
|
|
325
|
-
ShowIf(errors.age.check(err => err !== ""),
|
|
326
|
-
Span({ class: "error" }, errors.age)
|
|
327
|
-
)
|
|
345
|
+
Div({ class: 'field' }, [
|
|
346
|
+
Label('Age:'),
|
|
347
|
+
Input({ type: 'number', value: formData.age, placeholder: 'Enter your age' })
|
|
348
|
+
.nd.onBlur(validateForm),
|
|
349
|
+
ShowIf(errors.age.isTruthy(), Span({ class: 'error' }, errors.age))
|
|
328
350
|
]),
|
|
329
351
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
if (validateForm()) {
|
|
338
|
-
console.log("Form is valid!", formData.$value);
|
|
339
|
-
// Handle successful submission
|
|
340
|
-
} else {
|
|
341
|
-
console.log("Form has errors");
|
|
342
|
-
}
|
|
343
|
-
});
|
|
352
|
+
Button({ type: 'submit', class: 'btn btn-primary' }, 'Submit')
|
|
353
|
+
|
|
354
|
+
]).nd.onPreventSubmit(() => {
|
|
355
|
+
if (validateForm()) {
|
|
356
|
+
console.log('Form is valid!', formData.$value);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
344
359
|
```
|
|
345
360
|
|
|
346
|
-
## Available Elements
|
|
361
|
+
## Available HTML Elements
|
|
347
362
|
|
|
348
|
-
|
|
363
|
+
**Text:** `H1`, `H2`, `H3`, `H4`, `H5`, `H6`, `P`, `Span`, `Strong`, `Em`, `Small`, `Mark`, `BlockQuote`, `Pre`, `Code`
|
|
349
364
|
|
|
350
|
-
**
|
|
365
|
+
**Layout:** `Div`, `Section`, `Article`, `Aside`, `Header`, `Footer`, `Nav`, `Main`
|
|
351
366
|
|
|
352
|
-
**
|
|
367
|
+
**Form:** `Form`, `Input`, `TextArea`, `Select`, `Option`, `Button`, `Label`, `FieldSet`, `Legend`
|
|
353
368
|
|
|
354
|
-
**
|
|
369
|
+
**List:** `Ul`, `Ol`, `Li`, `Dl`, `Dt`, `Dd`
|
|
355
370
|
|
|
356
|
-
**
|
|
371
|
+
**Media:** `Img`, `Audio`, `Video`, `Canvas`
|
|
357
372
|
|
|
358
|
-
**
|
|
373
|
+
**Interactive:** `Link`, `Details`, `Summary`, `Dialog`
|
|
359
374
|
|
|
360
|
-
**
|
|
375
|
+
**SVG:** `Svg`, `SvgSvg`, `SvgCircle`, `SvgRect`, `SvgEllipse`, `SvgLine`, `SvgPolyline`, `SvgPolygon`, `SvgPath`, `SvgText`, `SvgTSpan`, `SvgG`, `SvgDefs`, `SvgUse`, `SvgSymbol`, `SvgClipPath`, `SvgMask`, `SvgMarker`, `SvgPattern`, `SvgImage`, `SvgLinearGradient`, `SvgRadialGradient`, `SvgStop`, `SvgFilter`, and more.
|
|
361
376
|
|
|
362
|
-
|
|
377
|
+
> For detailed SVG usage and examples, see [SVG Elements](./svg-elements.md).
|
|
363
378
|
|
|
364
379
|
## Best Practices
|
|
365
380
|
|
|
366
|
-
1.
|
|
367
|
-
2.
|
|
368
|
-
3.
|
|
369
|
-
4.
|
|
370
|
-
5.
|
|
371
|
-
6.
|
|
372
|
-
7. **Use conditional rendering** with `ShowIf` for dynamic content
|
|
381
|
+
1. Use semantic HTML elements for better accessibility
|
|
382
|
+
2. Leverage reactive attributes with observables for dynamic UIs
|
|
383
|
+
3. Use `.nd.with()` for instance-level customization, `NDElement.prototype` for app-wide methods
|
|
384
|
+
4. Store element references with `.nd.ref()` when you need direct DOM access
|
|
385
|
+
5. Use `ShowIf` with `.isTruthy()` / `.isFalsy()` for clean conditional rendering
|
|
386
|
+
6. Group related elements in logical containers
|
|
373
387
|
|
|
374
388
|
## Next Steps
|
|
375
389
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
- **[
|
|
379
|
-
- **[
|
|
380
|
-
- **[
|
|
381
|
-
- **[
|
|
382
|
-
- **[Lifecycle Events](lifecycle-events.md)** -
|
|
383
|
-
- **[Memory Management](memory-management.md)** - Memory management
|
|
384
|
-
- **[Anchor](anchor.md)** - Anchor
|
|
390
|
+
- **[Conditional Rendering](./conditional-rendering.md)** - Dynamic content
|
|
391
|
+
- **[List Rendering](./list-rendering.md)** - ForEach and dynamic lists
|
|
392
|
+
- **[NDElement](./native-document-element.md)** - Full `.nd` API reference
|
|
393
|
+
- **[Extending NDElement](./extending-native-document-element.md)** - Custom methods guide
|
|
394
|
+
- **[SVG Elements](./svg-elements.md)** - SVG wrapper functions
|
|
395
|
+
- **[Advanced Components](./advanced-components.md)** - Template caching and singleton views
|
|
396
|
+
- **[Lifecycle Events](./lifecycle-events.md)** - Mounted, unmounted, beforeUnmount
|