native-document 1.0.14 → 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 +8665 -1313
- 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 +218 -131
- 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 -501
- package/docs/contributing.md +300 -25
- package/docs/core-concepts.md +209 -367
- package/docs/elements.md +268 -255
- package/docs/extending-native-document-element.md +259 -0
- package/docs/filters.md +247 -0
- package/docs/getting-started.md +199 -260
- package/docs/i18n.md +241 -0
- package/docs/index.md +76 -0
- package/docs/lifecycle-events.md +146 -67
- package/docs/list-rendering.md +387 -0
- 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 -356
- 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 -93
- 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 -8
- package/package.json +59 -9
- package/readme.md +294 -90
- 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 +9 -22
- 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/core/elements/control/for-each.js +170 -0
- 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 +5 -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 -233
- package/src/data/ObservableChecker.js +0 -38
- package/src/data/ObservableItem.js +0 -116
- package/src/data/Store.js +0 -74
- package/src/elements/anchor.js +0 -84
- package/src/elements/content-formatter.js +0 -32
- package/src/elements/control/for-each.js +0 -174
- 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 -6
- 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 -37
- package/src/utils/plugins-manager.js +0 -12
- package/src/utils/prototypes.js +0 -45
- package/src/wrappers/AttributesWrapper.js +0 -157
- package/src/wrappers/DocumentObserver.js +0 -51
- package/src/wrappers/HtmlElementEventsWrapper.js +0 -77
- package/src/wrappers/HtmlElementWrapper.js +0 -206
- package/src/wrappers/constants.js +0 -2
package/docs/anchor.md
CHANGED
|
@@ -1,212 +1,299 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Anchor
|
|
3
|
+
description: Anchors enable dynamic DOM manipulation without wrapper elements using invisible comment node boundaries
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Anchor
|
|
2
7
|
|
|
3
|
-
Anchors
|
|
8
|
+
Anchors enable dynamic DOM manipulation without wrapper elements. They use two invisible comment nodes as boundaries, allowing you to insert, remove, and replace content between them while keeping your DOM clean.
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
All conditional rendering and list rendering utilities in NativeDocument (`ShowIf`, `ForEach`, `Match`, etc.) are built on top of `Anchor`.
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
## What is an Anchor?
|
|
8
13
|
|
|
9
|
-
`
|
|
14
|
+
An `Anchor` creates two invisible comment nodes as markers in the DOM:
|
|
10
15
|
|
|
11
16
|
```javascript
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// const anchor = new NativeDocumentFragment("My Content");
|
|
17
|
+
import { Anchor } from 'native-document/elements';
|
|
18
|
+
|
|
19
|
+
const anchor = Anchor('My Section');
|
|
16
20
|
|
|
17
|
-
//
|
|
18
|
-
// <!-- Anchor Start : My
|
|
19
|
-
// <!-- / Anchor End My
|
|
21
|
+
// Once in the DOM, creates:
|
|
22
|
+
// <!-- Anchor Start : My Section -->
|
|
23
|
+
// <!-- / Anchor End My Section -->
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
// <!-- Anchor Start : My Content -->
|
|
25
|
+
anchor.appendChild(Div('Dynamic content'));
|
|
26
|
+
// <!-- Anchor Start : My Section -->
|
|
24
27
|
// <div>Dynamic content</div>
|
|
25
|
-
// <!-- / Anchor End My
|
|
28
|
+
// <!-- / Anchor End My Section -->
|
|
26
29
|
```
|
|
27
30
|
|
|
31
|
+
> `NativeDocumentFragment` is a valid alias for `Anchor` - both create the same system.
|
|
32
|
+
|
|
33
|
+
> Anchors must be appended to a parent element before their methods work. The comment markers only exist once the anchor is in the DOM.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
28
37
|
## Fragment vs Anchor
|
|
29
38
|
|
|
30
|
-
|
|
39
|
+
**`Fragment`** wraps `document.createDocumentFragment()` - for one-time static content grouping:
|
|
31
40
|
|
|
32
41
|
```javascript
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
42
|
+
const fragment = Fragment(
|
|
43
|
+
H1('Static Title'),
|
|
44
|
+
P('Static content')
|
|
45
|
+
);
|
|
46
|
+
// Replaced entirely when appended to parent
|
|
36
47
|
```
|
|
37
48
|
|
|
38
|
-
|
|
49
|
+
**`Anchor`** is for dynamic content that updates over time:
|
|
39
50
|
|
|
40
51
|
```javascript
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
anchor.
|
|
52
|
+
const anchor = Anchor('Dynamic Area');
|
|
53
|
+
anchor.appendChild(Div('Initial content'));
|
|
54
|
+
anchor.replaceContent(Div('Updated content')); // markers stay, content swaps
|
|
44
55
|
```
|
|
45
56
|
|
|
46
|
-
|
|
57
|
+
---
|
|
47
58
|
|
|
48
|
-
|
|
59
|
+
## Why Use Anchors?
|
|
49
60
|
|
|
50
|
-
|
|
51
|
-
// Create anchor with custom identifier
|
|
52
|
-
const contentAnchor = new Anchor("Content Area");
|
|
53
|
-
const listAnchor = new Anchor("Todo List");
|
|
61
|
+
Without an anchor you need a wrapper element:
|
|
54
62
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
```javascript
|
|
64
|
+
// Extra div in the DOM
|
|
65
|
+
const wrapper = Div({ class: 'wrapper' });
|
|
66
|
+
wrapper.appendChild(Div('Content'));
|
|
58
67
|
```
|
|
59
68
|
|
|
60
|
-
|
|
69
|
+
With an anchor, no wrapper is needed:
|
|
61
70
|
|
|
62
71
|
```javascript
|
|
63
|
-
const anchor =
|
|
64
|
-
|
|
65
|
-
|
|
72
|
+
const anchor = Anchor('Content');
|
|
73
|
+
anchor.appendChild(Div('Content'));
|
|
74
|
+
// DOM: just the div between two comment nodes
|
|
75
|
+
```
|
|
66
76
|
|
|
67
|
-
|
|
68
|
-
anchor.appendChild(Div("Dynamic content 1"));
|
|
69
|
-
anchor.appendChild(Div("Dynamic content 2"));
|
|
77
|
+
Benefits: no extra DOM nodes, cleaner HTML, no CSS interference from wrapper elements.
|
|
70
78
|
|
|
71
|
-
|
|
72
|
-
// <div>
|
|
73
|
-
// <!-- Anchor Start : Dynamic Section -->
|
|
74
|
-
// <div>Dynamic content 1</div>
|
|
75
|
-
// <div>Dynamic content 2</div>
|
|
76
|
-
// <!-- / Anchor End Dynamic Section -->
|
|
77
|
-
// </div>
|
|
78
|
-
```
|
|
79
|
+
---
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
## API Reference
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
### `appendChild(child)` / `append(child)`
|
|
84
|
+
|
|
85
|
+
Inserts content before the end marker. Accepts an element, array, or any valid child:
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
anchor.
|
|
87
|
+
```javascript
|
|
88
|
+
anchor.appendChild(Div('Content'));
|
|
89
|
+
anchor.appendChild([H1('Title'), P('Body'), Button('Action')]);
|
|
90
|
+
anchor.append(Div('Same as appendChild'));
|
|
88
91
|
```
|
|
89
92
|
|
|
90
|
-
###
|
|
93
|
+
### `insertAtStart(child)`
|
|
94
|
+
|
|
95
|
+
Inserts content inside the anchor, immediately after the start marker - the opposite of `appendChild` which inserts before the end marker:
|
|
91
96
|
|
|
92
97
|
```javascript
|
|
93
|
-
|
|
94
|
-
|
|
98
|
+
anchor.insertAtStart(Div('Just before the anchor start'));
|
|
99
|
+
// DOM:
|
|
100
|
+
// <!-- Anchor Start : My Section -->
|
|
101
|
+
// <div>Just before the anchor start</div> <- inserted here
|
|
102
|
+
// ... anchor content ...
|
|
103
|
+
// <!-- / Anchor End My Section -->
|
|
95
104
|
```
|
|
96
105
|
|
|
97
|
-
|
|
106
|
+
### `replaceContent(child)` / `setContent(child)`
|
|
98
107
|
|
|
99
|
-
|
|
108
|
+
Removes all current content and inserts new content in one operation:
|
|
100
109
|
|
|
101
110
|
```javascript
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const element2 = Div("Second");
|
|
105
|
-
|
|
106
|
-
anchor.appendChild(element1);
|
|
107
|
-
anchor.insertBefore(element2, element1); // Inserts before element1
|
|
108
|
-
// Result: element2, element1
|
|
111
|
+
anchor.replaceContent(Div('New content'));
|
|
112
|
+
anchor.setContent(Div('Same as replaceContent'));
|
|
109
113
|
```
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
Prefer `replaceContent()` over `remove()` + `appendChild()` - it's a single DOM operation.
|
|
112
116
|
|
|
113
|
-
|
|
114
|
-
const anchor = Fragment();
|
|
117
|
+
### `removeChildren()`
|
|
115
118
|
|
|
116
|
-
|
|
117
|
-
const start = anchor.startElement();
|
|
118
|
-
const end = anchor.endElement();
|
|
119
|
+
Removes all content between the markers. The markers stay in place and the anchor can be reused. Children are **destroyed**:
|
|
119
120
|
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
```javascript
|
|
122
|
+
anchor.removeChildren(); // content gone, markers remain
|
|
123
|
+
anchor.appendChild(Div('Fresh content')); // reuse the anchor
|
|
122
124
|
```
|
|
123
125
|
|
|
124
|
-
|
|
126
|
+
### `remove()`
|
|
125
127
|
|
|
126
|
-
|
|
128
|
+
Moves all content out of the DOM back into the internal fragment - content is **preserved** but detached. The markers stay in place:
|
|
127
129
|
|
|
128
130
|
```javascript
|
|
129
|
-
|
|
131
|
+
anchor.remove(); // content detached but kept internally
|
|
132
|
+
anchor.appendChild(previousContent); // can be re-attached
|
|
133
|
+
```
|
|
130
134
|
|
|
131
|
-
|
|
132
|
-
const content = ShowIf(isVisible, () =>
|
|
133
|
-
Div("This content appears/disappears dynamically")
|
|
134
|
-
);
|
|
135
|
+
> **Difference:** `removeChildren()` destroys children. `remove()` moves them back into the fragment, preserving them for potential re-use.
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
isVisible.set(true); // Content appears between comment nodes
|
|
138
|
-
isVisible.set(false); // Content disappears, markers remain for reuse
|
|
139
|
-
```
|
|
137
|
+
### `removeWithAnchors()` / `delete()`
|
|
140
138
|
|
|
141
|
-
|
|
139
|
+
Destroys the content **and** removes the comment markers from the DOM. The anchor becomes unusable:
|
|
142
140
|
|
|
143
141
|
```javascript
|
|
144
|
-
|
|
142
|
+
anchor.removeWithAnchors(); // or anchor.delete()
|
|
143
|
+
// anchor is now permanently gone
|
|
144
|
+
```
|
|
145
145
|
|
|
146
|
-
|
|
147
|
-
const list = ForEach(items, (item) =>
|
|
148
|
-
Div(item)
|
|
149
|
-
);
|
|
146
|
+
### `getParent()`
|
|
150
147
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
148
|
+
Returns the current parent node:
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
const parent = anchor.getParent();
|
|
154
152
|
```
|
|
155
|
-
|
|
156
|
-
###
|
|
153
|
+
|
|
154
|
+
### `startElement()` / `endElement()`
|
|
155
|
+
|
|
156
|
+
Returns the start or end comment node:
|
|
157
157
|
|
|
158
158
|
```javascript
|
|
159
|
-
const
|
|
160
|
-
const
|
|
161
|
-
|
|
159
|
+
const start = anchor.startElement();
|
|
160
|
+
const end = anchor.endElement();
|
|
161
|
+
|
|
162
|
+
console.log(start.textContent); // "Anchor Start : My Section"
|
|
163
|
+
console.log(end.textContent); // "/ Anchor End My Section"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Method Aliases
|
|
169
|
+
|
|
170
|
+
| Primary | Aliases |
|
|
171
|
+
|---|---|
|
|
172
|
+
| `appendChild(child)` | `append(child)` |
|
|
173
|
+
| `replaceContent(child)` | `setContent(child)` |
|
|
174
|
+
| `removeWithAnchors()` | `delete()` |
|
|
175
|
+
|
|
176
|
+
---
|
|
162
177
|
|
|
163
|
-
|
|
164
|
-
anchor.appendChild([
|
|
165
|
-
H1("Title"),
|
|
166
|
-
P("Paragraph"),
|
|
167
|
-
Button("Action")
|
|
168
|
-
]);
|
|
178
|
+
## Practical Examples
|
|
169
179
|
|
|
170
|
-
|
|
180
|
+
### Dynamic content updates
|
|
181
|
+
|
|
182
|
+
```javascript
|
|
183
|
+
const anchor = Anchor('Status');
|
|
184
|
+
const isLoading = Observable(true);
|
|
185
|
+
const data = Observable(null);
|
|
186
|
+
|
|
187
|
+
anchor.appendChild(Div('Loading...'));
|
|
188
|
+
|
|
189
|
+
isLoading.subscribe(loading => {
|
|
190
|
+
if (loading) {
|
|
191
|
+
anchor.replaceContent(Div('Loading...'));
|
|
192
|
+
} else {
|
|
193
|
+
anchor.replaceContent(
|
|
194
|
+
data.val()
|
|
195
|
+
? Div(['Data: ', data.select(d => d.name)])
|
|
196
|
+
: Div('No data')
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
171
200
|
```
|
|
172
201
|
|
|
173
|
-
|
|
202
|
+
### Custom anchor-based component
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
function ConditionalList(condition, items) {
|
|
206
|
+
const anchor = Anchor('ConditionalList');
|
|
207
|
+
|
|
208
|
+
const update = () => {
|
|
209
|
+
if (condition.val() && items.val().length) {
|
|
210
|
+
anchor.replaceContent(
|
|
211
|
+
Ul(items.val().map(item => Li(item)))
|
|
212
|
+
);
|
|
213
|
+
} else {
|
|
214
|
+
anchor.removeChildren();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
condition.subscribe(update);
|
|
219
|
+
items.subscribe(update);
|
|
220
|
+
update();
|
|
221
|
+
|
|
222
|
+
return anchor;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const condition = Observable(true);
|
|
226
|
+
const items = Observable.array([]);
|
|
227
|
+
let id = 0;
|
|
228
|
+
|
|
229
|
+
document.body.appendChild(Div([
|
|
230
|
+
ConditionalList(condition, items),
|
|
231
|
+
Button('Toggle').nd.onClick(() => condition.toggle()),
|
|
232
|
+
Button('Add').nd.onClick(() => items.push('Item ' + (++id)))
|
|
233
|
+
]));
|
|
234
|
+
```
|
|
174
235
|
|
|
175
|
-
|
|
236
|
+
### Layout manager
|
|
176
237
|
|
|
177
238
|
```javascript
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
239
|
+
function LayoutManager() {
|
|
240
|
+
const header = Anchor('Header');
|
|
241
|
+
const content = Anchor('Content');
|
|
242
|
+
const footer = Anchor('Footer');
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
setHeader: component => header.replaceContent(component),
|
|
246
|
+
setContent: component => content.replaceContent(component),
|
|
247
|
+
setFooter: component => footer.replaceContent(component),
|
|
248
|
+
render: () => Div([header, content, footer])
|
|
249
|
+
};
|
|
250
|
+
}
|
|
182
251
|
```
|
|
183
252
|
|
|
184
|
-
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## How Conditional Rendering Uses Anchors
|
|
256
|
+
|
|
257
|
+
Every conditional and list rendering utility returns an anchor:
|
|
185
258
|
|
|
186
259
|
```javascript
|
|
187
|
-
//
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
260
|
+
// ShowIf returns an anchor
|
|
261
|
+
const content = ShowIf(isVisible, () => Div('Hello'));
|
|
262
|
+
isVisible.toggle(); // anchor replaces content between its markers
|
|
263
|
+
|
|
264
|
+
// ForEach returns an anchor
|
|
265
|
+
const list = ForEach(items, item => Div(item));
|
|
266
|
+
items.push('New'); // anchor inserts new div before end marker
|
|
267
|
+
|
|
268
|
+
// Match returns an anchor
|
|
269
|
+
const view = Match(status, {
|
|
270
|
+
loading: Div('Loading...'),
|
|
271
|
+
success: Div('Done!')
|
|
272
|
+
});
|
|
273
|
+
status.set('success'); // anchor swaps content
|
|
192
274
|
```
|
|
193
275
|
|
|
276
|
+
---
|
|
277
|
+
|
|
194
278
|
## Best Practices
|
|
195
279
|
|
|
196
|
-
1.
|
|
197
|
-
2.
|
|
198
|
-
3.
|
|
199
|
-
4.
|
|
200
|
-
5.
|
|
280
|
+
1. Use descriptive names - they appear in DOM comments and help debugging
|
|
281
|
+
2. Prefer `replaceContent()` over `remove()` + `appendChild()` - it's one DOM operation
|
|
282
|
+
3. Use `removeChildren()` when you want to clear and reuse the anchor
|
|
283
|
+
4. Use `removeWithAnchors()` / `delete()` only when permanently destroying the anchor
|
|
284
|
+
5. Anchors must be in the DOM before their methods work - always append to a parent first
|
|
285
|
+
|
|
286
|
+
---
|
|
201
287
|
|
|
202
288
|
## Next Steps
|
|
203
289
|
|
|
204
|
-
- **[
|
|
205
|
-
- **[
|
|
206
|
-
- **[
|
|
207
|
-
- **[
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
- **[
|
|
212
|
-
- **[
|
|
290
|
+
- **[Conditional Rendering](./conditional-rendering.md)** - ShowIf, Match, Switch built on Anchor
|
|
291
|
+
- **[List Rendering](./list-rendering.md)** - ForEach and ForEachArray built on Anchor
|
|
292
|
+
- **[Elements](./elements.md)** - Creating and composing UI
|
|
293
|
+
- **[Memory Management](./memory-management.md)** - Cleanup and memory management
|
|
294
|
+
|
|
295
|
+
## Utilities
|
|
296
|
+
|
|
297
|
+
- **[Cache](./cache.md)** - Lazy initialization and singleton patterns
|
|
298
|
+
- **[NativeFetch](./native-fetch.md)** - HTTP client with interceptors
|
|
299
|
+
- **[Filters](./filters.md)** - Data filtering helpers
|
package/docs/cache.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cache
|
|
3
|
+
description: Lazy initialization, singleton patterns, and key-based memoization utilities
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cache
|
|
7
|
+
|
|
8
|
+
NativeDocument provides three caching utilities for optimizing function execution: lazy initialization, eager singletons, and key-based memoization.
|
|
9
|
+
|
|
10
|
+
```javascript
|
|
11
|
+
import { utils } from 'native-document';
|
|
12
|
+
const { Cache } = utils;
|
|
13
|
+
|
|
14
|
+
// Or
|
|
15
|
+
import { Cache } from 'native-document/utils';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## `Cache.once(fn)` - Lazy Initialization
|
|
21
|
+
|
|
22
|
+
The function is **not executed immediately**. It runs only when you access a property on the returned Proxy object. The result is cached after the first access.
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
const Config = Cache.once(() => {
|
|
26
|
+
console.log('Loading config...');
|
|
27
|
+
return {
|
|
28
|
+
apiUrl: 'https://api.example.com',
|
|
29
|
+
timeout: 5000,
|
|
30
|
+
maxRetries: 3
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Function not executed yet
|
|
35
|
+
Config.apiUrl; // "Loading config..." -> "https://api.example.com"
|
|
36
|
+
Config.timeout; // no log -> 5000 (cached)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Use for optional features or heavy modules that may not always be needed:
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
const API = Cache.once(() => {
|
|
43
|
+
const client = new NativeFetch('https://api.example.com');
|
|
44
|
+
client.interceptors.request(config => {
|
|
45
|
+
config.headers['Authorization'] = `Bearer ${getToken()}`;
|
|
46
|
+
return config;
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
users: {
|
|
50
|
+
list: () => client.get('/users'),
|
|
51
|
+
get: (id) => client.get(`/users/${id}`)
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Client created only on first use
|
|
57
|
+
const users = await API.users.list();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## `Cache.singleton(fn)` - Eager Singleton
|
|
63
|
+
|
|
64
|
+
The function executes on the **first call** and caches the result. All subsequent calls return the same instance.
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
const getLogger = Cache.singleton(() => {
|
|
68
|
+
console.log('Creating logger...');
|
|
69
|
+
return {
|
|
70
|
+
log: msg => console.log(`[LOG] ${msg}`),
|
|
71
|
+
error: msg => console.error(`[ERROR] ${msg}`)
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const logger = getLogger(); // "Creating logger..."
|
|
76
|
+
const logger2 = getLogger(); // no log
|
|
77
|
+
console.log(logger === logger2); // true
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use for core services that must exist exactly once:
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
const getConfig = Cache.singleton(() => ({
|
|
84
|
+
apiUrl: import.meta.env.VITE_API_URL,
|
|
85
|
+
debug: import.meta.env.DEV,
|
|
86
|
+
version: '1.0.0'
|
|
87
|
+
}));
|
|
88
|
+
|
|
89
|
+
const getAPI = Cache.singleton(() => {
|
|
90
|
+
const config = getConfig();
|
|
91
|
+
const client = new NativeFetch(config.apiUrl);
|
|
92
|
+
client.interceptors.request(req => {
|
|
93
|
+
const token = localStorage.getItem('token');
|
|
94
|
+
if (token) {
|
|
95
|
+
req.headers['Authorization'] = `Bearer ${token}`;
|
|
96
|
+
}
|
|
97
|
+
return req;
|
|
98
|
+
});
|
|
99
|
+
return client;
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## `Cache.memoize(fn)` - Key-Based Memoization
|
|
106
|
+
|
|
107
|
+
Each property access creates and caches a **separate instance** using the property name as the key argument.
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
const Endpoints = Cache.memoize((resource) => {
|
|
111
|
+
console.log(`Creating endpoint: ${resource}`);
|
|
112
|
+
const api = getAPI();
|
|
113
|
+
return {
|
|
114
|
+
list: (params = {}) => api.get(`/${resource}`, params),
|
|
115
|
+
get: (id) => api.get(`/${resource}/${id}`),
|
|
116
|
+
create: (data) => api.post(`/${resource}`, data),
|
|
117
|
+
update: (id, data) => api.put(`/${resource}/${id}`, data),
|
|
118
|
+
delete: (id) => api.delete(`/${resource}/${id}`)
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
await Endpoints.users.list(); // "Creating endpoint: users"
|
|
123
|
+
await Endpoints.users.get('1'); // no log - cached
|
|
124
|
+
await Endpoints.posts.list(); // "Creating endpoint: posts"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Use for resources that share the same structure but need separate instances per key:
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
// Namespaced localStorage
|
|
131
|
+
const Storage = Cache.memoize((namespace) => ({
|
|
132
|
+
get: (key) => JSON.parse(localStorage.getItem(`${namespace}:${key}`)),
|
|
133
|
+
|
|
134
|
+
set: (key, val) => localStorage.setItem(`${namespace}:${key}`, JSON.stringify(val)),
|
|
135
|
+
|
|
136
|
+
remove: (key) => localStorage.removeItem(`${namespace}:${key}`)
|
|
137
|
+
}));
|
|
138
|
+
|
|
139
|
+
Storage.user.set('theme', 'dark');
|
|
140
|
+
Storage.app.set('version', '1.0.0');
|
|
141
|
+
|
|
142
|
+
// Form fields with observables
|
|
143
|
+
const Fields = Cache.memoize(name => ({
|
|
144
|
+
value: Observable(''),
|
|
145
|
+
error: Observable(null),
|
|
146
|
+
reset: () => { Fields[name].value.set(''); Fields[name].error.set(null); }
|
|
147
|
+
}));
|
|
148
|
+
|
|
149
|
+
Fields.email.value.set('alice@example.com');
|
|
150
|
+
Fields.password.value.set('secret');
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Comparison
|
|
156
|
+
|
|
157
|
+
| | `Cache.once()` | `Cache.singleton()` | `Cache.memoize()` |
|
|
158
|
+
|---|---|---|---|
|
|
159
|
+
| **Execution** | Lazy - on property access | Eager - on first call | Lazy - per key on property access |
|
|
160
|
+
| **Access** | `obj.property` | `fn()` | `obj.key.method()` |
|
|
161
|
+
| **Instances** | 1 | 1 | 1 per key |
|
|
162
|
+
| **Best for** | Optional modules | Core services | Resources by type |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Best Practices
|
|
167
|
+
|
|
168
|
+
1. Use `Cache.singleton()` for core services (API client, config, logger)
|
|
169
|
+
2. Use `Cache.once()` for optional or heavy modules that may not be needed
|
|
170
|
+
3. Use `Cache.memoize()` for resources that share structure but need separate instances
|
|
171
|
+
4. Keep memoize keys simple and predictable - avoid dynamic or timestamp-based keys
|
|
172
|
+
5. Be aware that `Cache.memoize()` instances stay in memory - use only for a finite set of keys
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Next Steps
|
|
177
|
+
|
|
178
|
+
- **[NativeFetch](./native-fetch.md)** - HTTP client with interceptors
|
|
179
|
+
- **[State Management](./state-management.md)** - Global state with Store
|
|
180
|
+
- **[Observables](./observables.md)** - Reactive state management
|