native-document 1.0.15 → 1.0.16-8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmrc.example +1 -0
- package/.vitepress/config.js +166 -0
- package/CHANGELOG.md +153 -0
- package/cdn.js +19 -0
- package/components.d.ts +2 -0
- package/components.js +30 -0
- package/devtools/ComponentRegistry.js +113 -0
- package/devtools/index.js +8 -0
- package/devtools/plugin/dev-tools-plugin.js +15 -0
- package/devtools/transformers/nd-vite-devtools.js +55 -0
- package/devtools/transformers/src/transformComponentForHrm.js +73 -0
- package/devtools/transformers/src/transformJsFile.js +9 -0
- package/devtools/transformers/src/utils.js +79 -0
- package/devtools/transformers/templates/hrm.hook.template.js +46 -0
- package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
- package/devtools/widget/Widget.js +49 -0
- package/devtools/widget/widget.css +81 -0
- package/devtools/widget.js +23 -0
- package/dist/native-document.components.min.css +1 -0
- package/dist/native-document.components.min.js +23847 -0
- package/dist/native-document.dev.js +8421 -1492
- package/dist/native-document.dev.js.map +1 -0
- package/dist/native-document.devtools.min.js +1 -0
- package/dist/native-document.min.js +1 -1
- package/docs/advanced-components.md +419 -0
- package/docs/anchor.md +181 -257
- package/docs/cache.md +180 -0
- package/docs/cli.md +179 -0
- package/docs/components/accordion.md +172 -0
- package/docs/components/alert.md +99 -0
- package/docs/components/avatar.md +160 -0
- package/docs/components/badge.md +102 -0
- package/docs/components/breadcrumb.md +89 -0
- package/docs/components/button.md +183 -0
- package/docs/components/card.md +69 -0
- package/docs/components/context-menu.md +118 -0
- package/docs/components/data-table.md +345 -0
- package/docs/components/dropdown.md +214 -0
- package/docs/components/form/autocomplete-field.md +81 -0
- package/docs/components/form/checkbox-field.md +41 -0
- package/docs/components/form/checkbox-group-field.md +54 -0
- package/docs/components/form/color-field.md +64 -0
- package/docs/components/form/date-field.md +92 -0
- package/docs/components/form/field-collection.md +63 -0
- package/docs/components/form/file-field.md +203 -0
- package/docs/components/form/form-control.md +87 -0
- package/docs/components/form/image-field.md +90 -0
- package/docs/components/form/index.md +115 -0
- package/docs/components/form/number-field.md +65 -0
- package/docs/components/form/radio-field.md +51 -0
- package/docs/components/form/select-field.md +123 -0
- package/docs/components/form/slider.md +136 -0
- package/docs/components/form/string-field.md +134 -0
- package/docs/components/form/textarea-field.md +65 -0
- package/docs/components/form-fields.md +372 -0
- package/docs/components/getting-started.md +264 -0
- package/docs/components/index.md +337 -0
- package/docs/components/layout.md +279 -0
- package/docs/components/list.md +73 -0
- package/docs/components/menu.md +215 -0
- package/docs/components/modal.md +156 -0
- package/docs/components/pagination.md +95 -0
- package/docs/components/popover.md +131 -0
- package/docs/components/progress.md +111 -0
- package/docs/components/shortcut-manager.md +221 -0
- package/docs/components/simple-table.md +107 -0
- package/docs/components/skeleton.md +155 -0
- package/docs/components/spinner.md +100 -0
- package/docs/components/splitter.md +133 -0
- package/docs/components/stepper.md +163 -0
- package/docs/components/switch.md +113 -0
- package/docs/components/tabs.md +153 -0
- package/docs/components/toast.md +119 -0
- package/docs/components/tooltip.md +151 -0
- package/docs/components/traits.md +261 -0
- package/docs/conditional-rendering.md +177 -502
- package/docs/contributing.md +300 -25
- package/docs/core-concepts.md +207 -366
- package/docs/elements.md +266 -254
- package/docs/extending-native-document-element.md +259 -0
- package/docs/filters.md +247 -0
- package/docs/getting-started.md +195 -257
- package/docs/i18n.md +241 -0
- package/docs/index.md +76 -0
- package/docs/lifecycle-events.md +146 -67
- package/docs/list-rendering.md +240 -460
- package/docs/memory-management.md +135 -46
- package/docs/native-document-element.md +487 -0
- package/docs/native-fetch.md +213 -0
- package/docs/observable-resource.md +364 -0
- package/docs/observables.md +690 -357
- package/docs/routing.md +246 -646
- package/docs/state-management.md +213 -306
- package/docs/svg-elements.md +231 -0
- package/docs/theming.md +409 -0
- package/docs/tutorials/.gitkeep +0 -0
- package/docs/validation.md +98 -91
- package/docs/vitepress-conventions.md +219 -0
- package/elements.d.ts +7 -0
- package/elements.js +3 -4
- package/eslint.config.js +35 -0
- package/i18n.js +1 -0
- package/i18n.ts +2 -0
- package/index.d.ts +21 -0
- package/index.def.js +1086 -0
- package/index.js +19 -13
- package/package.json +59 -9
- package/readme.md +296 -93
- package/rollup.config.js +52 -3
- package/router.d.ts +7 -0
- package/router.js +0 -0
- package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
- package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
- package/src/components/$traits/has-draggable/has-draggable.css +8 -0
- package/src/components/$traits/has-items/HasItems.d.ts +9 -0
- package/src/components/$traits/has-items/HasItems.js +64 -0
- package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
- package/src/components/$traits/has-position/HasFullPosition.js +95 -0
- package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
- package/src/components/$traits/has-position/HasPosition.js +45 -0
- package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
- package/src/components/$traits/has-resizable/HasResizable.js +122 -0
- package/src/components/$traits/has-resizable/has-resizable.css +121 -0
- package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
- package/src/components/$traits/has-validation/HasValidation.js +133 -0
- package/src/components/BaseComponent.d.ts +32 -0
- package/src/components/BaseComponent.js +247 -0
- package/src/components/accordion/Accordion.js +268 -0
- package/src/components/accordion/AccordionItem.js +233 -0
- package/src/components/accordion/index.js +7 -0
- package/src/components/accordion/types/Accordion.d.ts +47 -0
- package/src/components/accordion/types/AccordionItem.d.ts +48 -0
- package/src/components/alert/Alert.js +350 -0
- package/src/components/alert/index.js +6 -0
- package/src/components/alert/types/Alert.d.ts +62 -0
- package/src/components/avatar/Avatar.js +430 -0
- package/src/components/avatar/AvatarGroup.js +97 -0
- package/src/components/avatar/index.js +7 -0
- package/src/components/avatar/types/Avatar.d.ts +74 -0
- package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
- package/src/components/badge/Badge.js +245 -0
- package/src/components/badge/index.js +6 -0
- package/src/components/badge/types/Badge.d.ts +51 -0
- package/src/components/base-component.css +0 -0
- package/src/components/breadcrumb/BreadCrumb.js +138 -0
- package/src/components/breadcrumb/index.js +5 -0
- package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
- package/src/components/button/Button.js +320 -0
- package/src/components/button/index.js +5 -0
- package/src/components/button/types/Button.d.ts +62 -0
- package/src/components/card/Card.js +282 -0
- package/src/components/card/index.js +5 -0
- package/src/components/card/types/Card.d.ts +42 -0
- package/src/components/context-menu/ContextMenu.js +127 -0
- package/src/components/context-menu/ContextMenuGroup.js +29 -0
- package/src/components/context-menu/ContextMenuItem.js +28 -0
- package/src/components/context-menu/index.js +10 -0
- package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
- package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
- package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
- package/src/components/divider/Divider.js +256 -0
- package/src/components/divider/index.js +6 -0
- package/src/components/divider/types/Divider.d.ts +55 -0
- package/src/components/dropdown/Dropdown.js +531 -0
- package/src/components/dropdown/DropdownDivider.js +45 -0
- package/src/components/dropdown/DropdownGroup.js +83 -0
- package/src/components/dropdown/DropdownItem.js +150 -0
- package/src/components/dropdown/DropdownTrigger.js +93 -0
- package/src/components/dropdown/helpers.js +53 -0
- package/src/components/dropdown/index.js +13 -0
- package/src/components/dropdown/types/Dropdown.d.ts +88 -0
- package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
- package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
- package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
- package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
- package/src/components/form/FormControl.js +498 -0
- package/src/components/form/field/Field.js +419 -0
- package/src/components/form/field/FieldCollection.js +292 -0
- package/src/components/form/field/types/AutocompleteField.js +168 -0
- package/src/components/form/field/types/CheckboxField.js +77 -0
- package/src/components/form/field/types/CheckboxGroupField.js +171 -0
- package/src/components/form/field/types/ColorField.js +102 -0
- package/src/components/form/field/types/DateField.js +315 -0
- package/src/components/form/field/types/EmailField.js +104 -0
- package/src/components/form/field/types/FileField.js +276 -0
- package/src/components/form/field/types/HiddenField.js +44 -0
- package/src/components/form/field/types/ImageField.js +138 -0
- package/src/components/form/field/types/NumberField.js +177 -0
- package/src/components/form/field/types/PasswordField.js +200 -0
- package/src/components/form/field/types/RadioField.js +145 -0
- package/src/components/form/field/types/RangeField.js +117 -0
- package/src/components/form/field/types/SearchField.js +66 -0
- package/src/components/form/field/types/SelectField.js +247 -0
- package/src/components/form/field/types/StringField.js +148 -0
- package/src/components/form/field/types/TelField.js +98 -0
- package/src/components/form/field/types/TextAreaField.js +142 -0
- package/src/components/form/field/types/TimeField.js +215 -0
- package/src/components/form/field/types/UrlField.js +115 -0
- package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
- package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
- package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
- package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
- package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
- package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
- package/src/components/form/index.js +61 -0
- package/src/components/form/merge +0 -0
- package/src/components/form/types/Field.d.ts +73 -0
- package/src/components/form/types/FieldCollection.d.ts +53 -0
- package/src/components/form/types/FormControl.d.ts +64 -0
- package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
- package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
- package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
- package/src/components/form/types/fields/ColorField.d.ts +37 -0
- package/src/components/form/types/fields/DateField.d.ts +70 -0
- package/src/components/form/types/fields/EmailField.d.ts +35 -0
- package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
- package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
- package/src/components/form/types/fields/FileField.d.ts +56 -0
- package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
- package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
- package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
- package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
- package/src/components/form/types/fields/HiddenField.d.ts +26 -0
- package/src/components/form/types/fields/ImageField.d.ts +45 -0
- package/src/components/form/types/fields/NumberField.d.ts +48 -0
- package/src/components/form/types/fields/PasswordField.d.ts +46 -0
- package/src/components/form/types/fields/RadioField.d.ts +48 -0
- package/src/components/form/types/fields/RangeField.d.ts +44 -0
- package/src/components/form/types/fields/SearchField.d.ts +34 -0
- package/src/components/form/types/fields/SelectField.d.ts +71 -0
- package/src/components/form/types/fields/StringField.d.ts +48 -0
- package/src/components/form/types/fields/TelField.d.ts +37 -0
- package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
- package/src/components/form/types/fields/TimeField.d.ts +51 -0
- package/src/components/form/types/fields/UrlField.d.ts +35 -0
- package/src/components/form/utils.js +17 -0
- package/src/components/form/validation/Validation.js +565 -0
- package/src/components/index.d.ts +160 -0
- package/src/components/list/HasListItem.js +171 -0
- package/src/components/list/List.js +125 -0
- package/src/components/list/ListDivider.js +39 -0
- package/src/components/list/ListGroup.js +135 -0
- package/src/components/list/ListItem.js +212 -0
- package/src/components/list/index.js +12 -0
- package/src/components/list/types/List.d.ts +43 -0
- package/src/components/list/types/ListGroup.d.ts +37 -0
- package/src/components/list/types/ListItem.d.ts +53 -0
- package/src/components/menu/HasMenuItem.js +182 -0
- package/src/components/menu/Menu.js +227 -0
- package/src/components/menu/MenuDivider.js +37 -0
- package/src/components/menu/MenuGroup.js +126 -0
- package/src/components/menu/MenuItem.js +190 -0
- package/src/components/menu/MenuLink.js +51 -0
- package/src/components/menu/index.js +14 -0
- package/src/components/menu/types/Menu.d.ts +60 -0
- package/src/components/menu/types/MenuDivider.d.ts +19 -0
- package/src/components/menu/types/MenuGroup.d.ts +44 -0
- package/src/components/menu/types/MenuItem.d.ts +46 -0
- package/src/components/menu/types/MenuLink.d.ts +16 -0
- package/src/components/modal/Modal.js +524 -0
- package/src/components/modal/index.js +5 -0
- package/src/components/modal/types/Modal.d.ts +94 -0
- package/src/components/pagination/Pagination.js +411 -0
- package/src/components/pagination/index.js +5 -0
- package/src/components/pagination/types/Pagination.d.ts +68 -0
- package/src/components/popover/Popover.js +459 -0
- package/src/components/popover/PopoverFooter.js +61 -0
- package/src/components/popover/PopoverHeader.js +68 -0
- package/src/components/popover/index.js +10 -0
- package/src/components/popover/types/Popover.d.ts +83 -0
- package/src/components/popover/types/PopoverFooter.d.ts +24 -0
- package/src/components/popover/types/PopoverHeader.d.ts +26 -0
- package/src/components/progress/Progress.js +401 -0
- package/src/components/progress/index.js +6 -0
- package/src/components/progress/types/Progress.d.ts +77 -0
- package/src/components/skeleton/Skeleton.js +228 -0
- package/src/components/skeleton/index.js +6 -0
- package/src/components/skeleton/types/Skeleton.d.ts +55 -0
- package/src/components/slider/Slider.js +406 -0
- package/src/components/slider/index.js +5 -0
- package/src/components/slider/types/Slider.d.ts +82 -0
- package/src/components/spacer/Spacer.js +27 -0
- package/src/components/spacer/index.js +5 -0
- package/src/components/spacer/types/Spacer.d.ts +19 -0
- package/src/components/spinner/Spinner.js +350 -0
- package/src/components/spinner/index.js +5 -0
- package/src/components/spinner/types/Spinner.d.ts +71 -0
- package/src/components/splitter/Splitter.js +164 -0
- package/src/components/splitter/SplitterGutter.js +140 -0
- package/src/components/splitter/SplitterPanel.js +143 -0
- package/src/components/splitter/index.js +10 -0
- package/src/components/splitter/types/Splitter.d.ts +38 -0
- package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
- package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
- package/src/components/stacks/AbsoluteStack.js +53 -0
- package/src/components/stacks/FixedStack.js +53 -0
- package/src/components/stacks/HStack.js +54 -0
- package/src/components/stacks/PositionStack.js +254 -0
- package/src/components/stacks/RelativeStack.js +53 -0
- package/src/components/stacks/Stack.js +166 -0
- package/src/components/stacks/VStack.js +55 -0
- package/src/components/stacks/index.js +21 -0
- package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
- package/src/components/stacks/types/FixedStack.d.ts +16 -0
- package/src/components/stacks/types/HStack.d.ts +16 -0
- package/src/components/stacks/types/PositionStack.d.ts +54 -0
- package/src/components/stacks/types/RelativeStack.d.ts +17 -0
- package/src/components/stacks/types/Stack.d.ts +39 -0
- package/src/components/stacks/types/VStack.d.ts +16 -0
- package/src/components/stepper/Stepper.js +461 -0
- package/src/components/stepper/StepperStep.js +241 -0
- package/src/components/stepper/index.js +8 -0
- package/src/components/stepper/types/Stepper.d.ts +68 -0
- package/src/components/stepper/types/StepperStep.d.ts +54 -0
- package/src/components/switch/Switch.js +266 -0
- package/src/components/switch/index.js +6 -0
- package/src/components/switch/types/Switch.d.ts +55 -0
- package/src/components/table/Column.js +212 -0
- package/src/components/table/ColumnGroup.js +90 -0
- package/src/components/table/DataTable.js +720 -0
- package/src/components/table/SimpleTable.js +139 -0
- package/src/components/table/index.js +7 -0
- package/src/components/table/types/Column.d.ts +49 -0
- package/src/components/table/types/ColumnGroup.d.ts +28 -0
- package/src/components/table/types/DataTable.d.ts +97 -0
- package/src/components/table/types/SimpleTable.d.ts +40 -0
- package/src/components/tabs/Tabs.js +395 -0
- package/src/components/tabs/index.js +6 -0
- package/src/components/tabs/types/Tabs.d.ts +78 -0
- package/src/components/toast/Toast.js +262 -0
- package/src/components/toast/ToastError.js +0 -0
- package/src/components/toast/ToastInfo.js +0 -0
- package/src/components/toast/ToastSuccess.js +0 -0
- package/src/components/toast/ToastWarning.js +0 -0
- package/src/components/toast/index.js +5 -0
- package/src/components/toast/types/Toast.d.ts +57 -0
- package/src/components/toast/types/ToastError.d.ts +7 -0
- package/src/components/toast/types/ToastInfo.d.ts +7 -0
- package/src/components/toast/types/ToastSuccess.d.ts +7 -0
- package/src/components/toast/types/ToastWarning.d.ts +7 -0
- package/src/components/tooltip/Tooltip.js +359 -0
- package/src/components/tooltip/index.js +5 -0
- package/src/components/tooltip/prototypes.js +6 -0
- package/src/components/tooltip/types/Tooltip.d.ts +65 -0
- package/src/{data → core/data}/MemoryManager.js +2 -3
- package/src/core/data/Observable.js +227 -0
- package/src/core/data/ObservableArray.js +522 -0
- package/src/core/data/ObservableChecker.js +39 -0
- package/src/core/data/ObservableItem.js +611 -0
- package/src/core/data/ObservableObject.js +274 -0
- package/src/core/data/ObservableResource.js +315 -0
- package/src/core/data/ObservableWhen.js +54 -0
- package/src/core/data/Store.js +520 -0
- package/src/core/data/observable-helpers/observable.is-to.js +390 -0
- package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
- package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
- package/src/core/elements/anchor/anchor.js +210 -0
- package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
- package/src/core/elements/content-formatter.js +169 -0
- package/src/core/elements/control/for-each-array.js +292 -0
- package/src/{elements → core/elements}/control/for-each.js +42 -23
- package/src/core/elements/control/show-if.js +94 -0
- package/src/core/elements/control/show-when.js +54 -0
- package/src/core/elements/control/switch.js +141 -0
- package/src/core/elements/description-list.js +19 -0
- package/src/core/elements/form.js +255 -0
- package/src/core/elements/fragment.js +8 -0
- package/src/core/elements/html5-semantics.js +55 -0
- package/src/core/elements/img.js +59 -0
- package/src/{elements → core/elements}/index.js +4 -4
- package/src/core/elements/interactive.js +25 -0
- package/src/core/elements/list.js +37 -0
- package/src/core/elements/medias.js +37 -0
- package/src/core/elements/meta-data.js +43 -0
- package/src/core/elements/svg.js +61 -0
- package/src/core/elements/table.js +73 -0
- package/src/{errors → core/errors}/ArgTypesError.js +1 -1
- package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
- package/src/core/utils/HasEventEmitter.js +85 -0
- package/src/core/utils/args-types.js +140 -0
- package/src/core/utils/cache.js +5 -0
- package/src/core/utils/callback-handler.js +50 -0
- package/src/core/utils/debug-manager.js +40 -0
- package/src/core/utils/events.js +148 -0
- package/src/core/utils/filters/date.js +178 -0
- package/src/core/utils/filters/index.js +4 -0
- package/src/core/utils/filters/standard.js +263 -0
- package/src/core/utils/filters/strings.js +67 -0
- package/src/core/utils/filters/utils.js +77 -0
- package/src/core/utils/formatters.js +90 -0
- package/src/core/utils/helpers.js +144 -0
- package/src/core/utils/localstorage.js +57 -0
- package/src/core/utils/memoize.js +115 -0
- package/src/core/utils/plugins-manager.js +81 -0
- package/src/core/utils/property-accumulator.js +72 -0
- package/src/core/utils/prototypes.js +44 -0
- package/src/core/utils/shortcut-manager.js +242 -0
- package/src/{utils → core/utils}/validator.js +58 -22
- package/src/core/wrappers/AttributesWrapper.js +181 -0
- package/src/core/wrappers/DocumentObserver.js +182 -0
- package/src/core/wrappers/ElementCreator.js +110 -0
- package/src/core/wrappers/HtmlElementWrapper.js +98 -0
- package/src/core/wrappers/NDElement.js +613 -0
- package/src/core/wrappers/NdPrototype.js +233 -0
- package/src/core/wrappers/SingletonView.js +99 -0
- package/src/core/wrappers/SvgElementWrapper.js +15 -0
- package/src/core/wrappers/TemplateBinding.js +7 -0
- package/src/core/wrappers/constants.js +66 -0
- package/src/core/wrappers/prototypes/attributes-extensions.js +24 -0
- package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
- package/src/core/wrappers/prototypes/nd-element-extensions.js +149 -0
- package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
- package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
- package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
- package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
- package/src/core/wrappers/template-cloner/utils.js +173 -0
- package/src/fetch/NativeFetch.js +89 -0
- package/src/i18n/bin/scan.js +132 -0
- package/src/i18n/index.d.ts +2 -0
- package/src/i18n/service/I18nService.d.ts +27 -0
- package/src/i18n/service/I18nService.js +46 -0
- package/src/i18n/service/functions.d.ts +22 -0
- package/src/i18n/service/functions.js +29 -0
- package/src/router/Route.js +33 -8
- package/src/router/RouteGroupHelper.js +10 -2
- package/src/router/Router.js +63 -22
- package/src/router/RouterComponent.js +114 -6
- package/src/{errors → router/errors}/RouterError.js +0 -1
- package/src/router/link.js +9 -10
- package/src/router/modes/HashRouter.js +2 -2
- package/src/router/modes/HistoryRouter.js +2 -3
- package/src/router/modes/MemoryRouter.js +1 -1
- package/src/ui/components/accordion/AccordionItemRender.js +63 -0
- package/src/ui/components/accordion/AccordionRender.js +35 -0
- package/src/ui/components/accordion/accordion.css +121 -0
- package/src/ui/components/alert/AlertRender.js +81 -0
- package/src/ui/components/alert/alert.css +163 -0
- package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
- package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
- package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
- package/src/ui/components/avatar/avatar/avatar.css +189 -0
- package/src/ui/components/badge/BadgeRender.js +25 -0
- package/src/ui/components/badge/badge.css +168 -0
- package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
- package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
- package/src/ui/components/button/ButtonRender.js +65 -0
- package/src/ui/components/button/button.css +296 -0
- package/src/ui/components/card/CardRender.js +133 -0
- package/src/ui/components/card/card.css +169 -0
- package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
- package/src/ui/components/contextmenu/contextmenu.css +36 -0
- package/src/ui/components/divider/DividerRender.js +70 -0
- package/src/ui/components/divider/divider.css +70 -0
- package/src/ui/components/dropdown/DropdownRender.js +92 -0
- package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
- package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
- package/src/ui/components/dropdown/dropdown.css +179 -0
- package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
- package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
- package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
- package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
- package/src/ui/components/form/FieldCollectionRender.js +110 -0
- package/src/ui/components/form/FormControlRender.js +85 -0
- package/src/ui/components/form/field-collection.css +55 -0
- package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
- package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
- package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
- package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
- package/src/ui/components/form/fields/DateFieldRender.js +155 -0
- package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
- package/src/ui/components/form/fields/FieldRender.js +118 -0
- package/src/ui/components/form/fields/FileFieldRender.js +41 -0
- package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
- package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
- package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
- package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
- package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
- package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
- package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
- package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
- package/src/ui/components/form/fields/StringFieldRender.js +6 -0
- package/src/ui/components/form/fields/TelFieldRender.js +6 -0
- package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
- package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
- package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
- package/src/ui/components/form/fields/date-field.css +32 -0
- package/src/ui/components/form/fields/field.css +402 -0
- package/src/ui/components/form/fields/file-field.css +79 -0
- package/src/ui/components/form/fields/password-field.css +50 -0
- package/src/ui/components/form/fields/range-field.css +120 -0
- package/src/ui/components/form/fields/slider.css +195 -0
- package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
- package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
- package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
- package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
- package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
- package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
- package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
- package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
- package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
- package/src/ui/components/form/form-control.css +40 -0
- package/src/ui/components/form/helpers.js +111 -0
- package/src/ui/components/form/index.js +27 -0
- package/src/ui/components/list/ListRender.js +18 -0
- package/src/ui/components/list/divider/ListDividerRender.js +10 -0
- package/src/ui/components/list/divider/list-divider.css +12 -0
- package/src/ui/components/list/group/ListGroupRender.js +61 -0
- package/src/ui/components/list/group/list-group.css +62 -0
- package/src/ui/components/list/item/ListItemRender.js +238 -0
- package/src/ui/components/list/item/list-item.css +191 -0
- package/src/ui/components/list/list.css +24 -0
- package/src/ui/components/menu/MenuDividerRender.js +12 -0
- package/src/ui/components/menu/MenuGroupRender.js +59 -0
- package/src/ui/components/menu/MenuItemRender.js +57 -0
- package/src/ui/components/menu/MenuLinkRender.js +55 -0
- package/src/ui/components/menu/MenuRender.js +22 -0
- package/src/ui/components/menu/helpers.js +121 -0
- package/src/ui/components/menu/menu.css +308 -0
- package/src/ui/components/modal/ModalRender.js +118 -0
- package/src/ui/components/modal/modal.css +156 -0
- package/src/ui/components/pagination/PaginationRender.js +112 -0
- package/src/ui/components/pagination/pagination.css +63 -0
- package/src/ui/components/popover/PopoverRender.js +233 -0
- package/src/ui/components/popover/popover.css +139 -0
- package/src/ui/components/progress/ProgressRender.js +168 -0
- package/src/ui/components/progress/progress.css +197 -0
- package/src/ui/components/skeleton/SkeletonRender.js +136 -0
- package/src/ui/components/skeleton/skeleton.css +154 -0
- package/src/ui/components/spacer/SpacerRender.js +10 -0
- package/src/ui/components/spinner/SpinnerRender.js +47 -0
- package/src/ui/components/spinner/spinner.css +152 -0
- package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
- package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
- package/src/ui/components/splitter/SplitterRender.js +75 -0
- package/src/ui/components/splitter/splitter.css +128 -0
- package/src/ui/components/stacks/PositionStackRender.js +39 -0
- package/src/ui/components/stacks/StackRender.js +41 -0
- package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
- package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
- package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
- package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
- package/src/ui/components/stacks/index.js +5 -0
- package/src/ui/components/stacks/position-stack.css +62 -0
- package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
- package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
- package/src/ui/components/stacks/stack.css +78 -0
- package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
- package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
- package/src/ui/components/stepper/StepperRender.js +71 -0
- package/src/ui/components/stepper/StepperStepRender.js +67 -0
- package/src/ui/components/stepper/stepper.css +359 -0
- package/src/ui/components/switch/SwitchRender.js +83 -0
- package/src/ui/components/switch/switch.css +143 -0
- package/src/ui/components/table/data-table/DataTableRender.js +50 -0
- package/src/ui/components/table/data-table/bulk-actions.js +34 -0
- package/src/ui/components/table/data-table/data-table.css +246 -0
- package/src/ui/components/table/data-table/pagination.js +56 -0
- package/src/ui/components/table/data-table/tables.js +368 -0
- package/src/ui/components/table/data-table/toolbar.js +67 -0
- package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
- package/src/ui/components/table/simple-table/simple-table.css +50 -0
- package/src/ui/components/tabs/TabsRender.js +226 -0
- package/src/ui/components/tabs/tabs.css +253 -0
- package/src/ui/components/toast/ToastRender.js +99 -0
- package/src/ui/components/toast/toast.css +201 -0
- package/src/ui/components/tooltip/TooltipRender.js +8 -0
- package/src/ui/components/tooltip/tooltip.css +113 -0
- package/src/ui/index.js +47 -0
- package/src/ui/theme.js +0 -0
- package/src/ui/theme.scss +1 -0
- package/src/ui/tokens/animation.scss +36 -0
- package/src/ui/tokens/colors-dark.scss +58 -0
- package/src/ui/tokens/colors.scss +54 -0
- package/src/ui/tokens/components.scss +32 -0
- package/src/ui/tokens/fonts.scss +57 -0
- package/src/ui/tokens/glass.scss +10 -0
- package/src/ui/tokens/index.scss +38 -0
- package/src/ui/tokens/layouts.scss +228 -0
- package/src/ui/tokens/opacity.scss +21 -0
- package/src/ui/tokens/others.scss +11 -0
- package/src/ui/tokens/radius.scss +6 -0
- package/src/ui/tokens/reset.scss +51 -0
- package/src/ui/tokens/shadows.scss +29 -0
- package/src/ui/tokens/spacings.scss +13 -0
- package/src/ui/tokens/vars.scss +35 -0
- package/src/ui/tokens/viewports.scss +30 -0
- package/types/args-types.d.ts +58 -0
- package/types/control-flow.d.ts +62 -0
- package/types/elements.d.ts +231 -0
- package/types/filters/dates.d.ts +43 -0
- package/types/filters/index.d.ts +4 -0
- package/types/filters/standard.d.ts +70 -0
- package/types/filters/strings.d.ts +21 -0
- package/types/filters/types.d.ts +20 -0
- package/types/forms.d.ts +84 -0
- package/types/globals.d.ts +543 -0
- package/types/images.d.ts +23 -0
- package/types/localStorage.ts +102 -0
- package/types/memoize.d.ts +26 -0
- package/types/native-fetch.d.ts +72 -0
- package/types/nd-element.d.ts +407 -0
- package/types/observable-resource.d.ts +3 -0
- package/types/observable.d.ts +227 -0
- package/types/plugins-manager.d.ts +65 -0
- package/types/polyfill.d.ts +18 -0
- package/types/property-accumulator.d.ts +33 -0
- package/types/router.d.ts +85 -0
- package/types/service.d.ts +23 -0
- package/types/singleton.d.ts +19 -0
- package/types/store.d.ts +63 -0
- package/types/template-cloner.ts +43 -0
- package/types/validator.ts +66 -0
- package/ui.js +1 -0
- package/utils.d.ts +4 -0
- package/utils.js +12 -0
- package/src/data/Observable.js +0 -55
- package/src/data/ObservableChecker.js +0 -39
- package/src/data/ObservableItem.js +0 -195
- package/src/data/Store.js +0 -74
- package/src/data/observable-helpers/array.js +0 -74
- package/src/data/observable-helpers/batch.js +0 -22
- package/src/data/observable-helpers/computed.js +0 -28
- package/src/data/observable-helpers/object.js +0 -111
- package/src/elements/anchor.js +0 -129
- package/src/elements/content-formatter.js +0 -32
- package/src/elements/control/for-each-array.js +0 -280
- package/src/elements/control/show-if.js +0 -79
- package/src/elements/control/switch.js +0 -98
- package/src/elements/description-list.js +0 -5
- package/src/elements/form.js +0 -71
- package/src/elements/html5-semantics.js +0 -12
- package/src/elements/img.js +0 -45
- package/src/elements/interactive.js +0 -7
- package/src/elements/list.js +0 -10
- package/src/elements/medias.js +0 -8
- package/src/elements/meta-data.js +0 -9
- package/src/elements/table.js +0 -14
- package/src/utils/args-types.js +0 -100
- package/src/utils/debug-manager.js +0 -31
- package/src/utils/helpers.js +0 -60
- package/src/utils/plugins-manager.js +0 -12
- package/src/utils/prototypes.js +0 -45
- package/src/wrappers/AttributesWrapper.js +0 -144
- package/src/wrappers/DocumentObserver.js +0 -80
- package/src/wrappers/ElementCreator.js +0 -114
- package/src/wrappers/HtmlElementEventsWrapper.js +0 -64
- package/src/wrappers/HtmlElementWrapper.js +0 -50
- package/src/wrappers/NdPrototype.js +0 -109
- package/src/wrappers/constants.js +0 -2
package/docs/anchor.md
CHANGED
|
@@ -1,375 +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
|
-
const anchor = new Anchor("My Content");
|
|
14
|
-
// Or using the alias
|
|
15
|
-
const anchor = new NativeDocumentFragment("My Content");
|
|
16
|
-
|
|
17
|
-
// In the DOM, this creates:
|
|
18
|
-
// <!-- Anchor Start : My Content -->
|
|
19
|
-
// <!-- / Anchor End My Content -->
|
|
20
|
-
|
|
21
|
-
// Content can be inserted between these markers
|
|
22
|
-
anchor.appendChild(Div("Dynamic content"));
|
|
23
|
-
// <!-- Anchor Start : My Content -->
|
|
24
|
-
// <div>Dynamic content</div>
|
|
25
|
-
// <!-- / Anchor End My Content -->
|
|
26
|
-
```
|
|
17
|
+
import { Anchor } from 'native-document/elements';
|
|
27
18
|
|
|
28
|
-
|
|
19
|
+
const anchor = Anchor('My Section');
|
|
29
20
|
|
|
30
|
-
|
|
21
|
+
// Once in the DOM, creates:
|
|
22
|
+
// <!-- Anchor Start : My Section -->
|
|
23
|
+
// <!-- / Anchor End My Section -->
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
anchor.appendChild(Div('Dynamic content'));
|
|
26
|
+
// <!-- Anchor Start : My Section -->
|
|
27
|
+
// <div>Dynamic content</div>
|
|
28
|
+
// <!-- / Anchor End My Section -->
|
|
36
29
|
```
|
|
37
30
|
|
|
38
|
-
|
|
31
|
+
> `NativeDocumentFragment` is a valid alias for `Anchor` - both create the same system.
|
|
39
32
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
anchor.appendChild(Div("Dynamic content")); // Uses comment markers system
|
|
44
|
-
```
|
|
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
|
+
---
|
|
45
36
|
|
|
46
|
-
##
|
|
37
|
+
## Fragment vs Anchor
|
|
47
38
|
|
|
48
|
-
|
|
39
|
+
**`Fragment`** wraps `document.createDocumentFragment()` - for one-time static content grouping:
|
|
49
40
|
|
|
50
41
|
```javascript
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
const container = Div();
|
|
57
|
-
container.appendChild(contentAnchor);
|
|
42
|
+
const fragment = Fragment(
|
|
43
|
+
H1('Static Title'),
|
|
44
|
+
P('Static content')
|
|
45
|
+
);
|
|
46
|
+
// Replaced entirely when appended to parent
|
|
58
47
|
```
|
|
59
48
|
|
|
60
|
-
|
|
49
|
+
**`Anchor`** is for dynamic content that updates over time:
|
|
61
50
|
|
|
62
51
|
```javascript
|
|
63
|
-
const anchor =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
// Add content between the markers
|
|
68
|
-
anchor.appendChild(Div("Dynamic content 1"));
|
|
69
|
-
anchor.appendChild(Div("Dynamic content 2"));
|
|
70
|
-
|
|
71
|
-
// DOM structure:
|
|
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>
|
|
52
|
+
const anchor = Anchor('Dynamic Area');
|
|
53
|
+
anchor.appendChild(Div('Initial content'));
|
|
54
|
+
anchor.replaceContent(Div('Updated content')); // markers stay, content swaps
|
|
78
55
|
```
|
|
79
56
|
|
|
80
|
-
|
|
57
|
+
---
|
|
81
58
|
|
|
82
|
-
|
|
83
|
-
const anchor = new Anchor("Ordered Content");
|
|
84
|
-
const element1 = Div("First");
|
|
85
|
-
const element2 = Div("Second");
|
|
59
|
+
## Why Use Anchors?
|
|
86
60
|
|
|
87
|
-
anchor
|
|
88
|
-
|
|
89
|
-
|
|
61
|
+
Without an anchor you need a wrapper element:
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
// Extra div in the DOM
|
|
65
|
+
const wrapper = Div({ class: 'wrapper' });
|
|
66
|
+
wrapper.appendChild(Div('Content'));
|
|
90
67
|
```
|
|
91
68
|
|
|
92
|
-
|
|
69
|
+
With an anchor, no wrapper is needed:
|
|
93
70
|
|
|
94
71
|
```javascript
|
|
95
|
-
const anchor =
|
|
96
|
-
anchor.appendChild(Div(
|
|
97
|
-
|
|
98
|
-
// Replace all content between markers with new content
|
|
99
|
-
anchor.replaceContent(Div("New content"));
|
|
72
|
+
const anchor = Anchor('Content');
|
|
73
|
+
anchor.appendChild(Div('Content'));
|
|
74
|
+
// DOM: just the div between two comment nodes
|
|
100
75
|
```
|
|
101
76
|
|
|
102
|
-
|
|
77
|
+
Benefits: no extra DOM nodes, cleaner HTML, no CSS interference from wrapper elements.
|
|
103
78
|
|
|
104
|
-
|
|
79
|
+
---
|
|
105
80
|
|
|
106
|
-
|
|
107
|
-
const anchor = new Anchor("Content Management");
|
|
81
|
+
## API Reference
|
|
108
82
|
|
|
109
|
-
|
|
110
|
-
anchor.remove(); // Content cleared, anchor can be reused
|
|
111
|
-
anchor.removeChildren(); // Same as remove() - more explicit name
|
|
83
|
+
### `appendChild(child)` / `append(child)`
|
|
112
84
|
|
|
113
|
-
|
|
114
|
-
anchor.clear();
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### removeWithAnchors() - Complete Removal
|
|
85
|
+
Inserts content before the end marker. Accepts an element, array, or any valid child:
|
|
118
86
|
|
|
119
87
|
```javascript
|
|
120
|
-
|
|
121
|
-
anchor.
|
|
88
|
+
anchor.appendChild(Div('Content'));
|
|
89
|
+
anchor.appendChild([H1('Title'), P('Body'), Button('Action')]);
|
|
90
|
+
anchor.append(Div('Same as appendChild'));
|
|
122
91
|
```
|
|
123
92
|
|
|
124
|
-
|
|
93
|
+
### `insertAtStart(child)`
|
|
125
94
|
|
|
126
|
-
|
|
95
|
+
Inserts content inside the anchor, immediately after the start marker - the opposite of `appendChild` which inserts before the end marker:
|
|
127
96
|
|
|
128
97
|
```javascript
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
console.log(start.textContent); // "Anchor Start : My Anchor"
|
|
136
|
-
console.log(end.textContent); // "/ Anchor End My Anchor"
|
|
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 -->
|
|
137
104
|
```
|
|
138
105
|
|
|
139
|
-
|
|
106
|
+
### `replaceContent(child)` / `setContent(child)`
|
|
140
107
|
|
|
141
|
-
|
|
108
|
+
Removes all current content and inserts new content in one operation:
|
|
142
109
|
|
|
143
110
|
```javascript
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
container.appendChild(anchor);
|
|
147
|
-
|
|
148
|
-
// Insert multiple elements without a containing wrapper
|
|
149
|
-
anchor.appendChild([
|
|
150
|
-
H1("Title"),
|
|
151
|
-
P("Paragraph"),
|
|
152
|
-
Button("Action")
|
|
153
|
-
]);
|
|
154
|
-
|
|
155
|
-
// DOM: No wrapper element, just the three elements between markers
|
|
111
|
+
anchor.replaceContent(Div('New content'));
|
|
112
|
+
anchor.setContent(Div('Same as replaceContent'));
|
|
156
113
|
```
|
|
157
114
|
|
|
158
|
-
|
|
115
|
+
Prefer `replaceContent()` over `remove()` + `appendChild()` - it's a single DOM operation.
|
|
159
116
|
|
|
160
|
-
|
|
161
|
-
const contentAnchor = new Anchor("Dynamic Updates");
|
|
162
|
-
const isLoading = Observable(true);
|
|
163
|
-
const data = Observable(null);
|
|
117
|
+
### `removeChildren()`
|
|
164
118
|
|
|
165
|
-
|
|
166
|
-
contentAnchor.appendChild(Div("Loading..."));
|
|
119
|
+
Removes all content between the markers. The markers stay in place and the anchor can be reused. Children are **destroyed**:
|
|
167
120
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
contentAnchor.replaceContent(Div("Loading..."));
|
|
172
|
-
} else if (data.val()) {
|
|
173
|
-
contentAnchor.replaceContent(
|
|
174
|
-
Div(`Data: ${data.val()}`)
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
121
|
+
```javascript
|
|
122
|
+
anchor.removeChildren(); // content gone, markers remain
|
|
123
|
+
anchor.appendChild(Div('Fresh content')); // reuse the anchor
|
|
178
124
|
```
|
|
179
125
|
|
|
180
|
-
|
|
126
|
+
### `remove()`
|
|
181
127
|
|
|
182
|
-
|
|
128
|
+
Moves all content out of the DOM back into the internal fragment - content is **preserved** but detached. The markers stay in place:
|
|
183
129
|
|
|
184
130
|
```javascript
|
|
185
|
-
|
|
131
|
+
anchor.remove(); // content detached but kept internally
|
|
132
|
+
anchor.appendChild(previousContent); // can be re-attached
|
|
133
|
+
```
|
|
186
134
|
|
|
187
|
-
|
|
188
|
-
const content = ShowIf(isVisible, () =>
|
|
189
|
-
Div("This content appears/disappears dynamically")
|
|
190
|
-
);
|
|
135
|
+
> **Difference:** `removeChildren()` destroys children. `remove()` moves them back into the fragment, preserving them for potential re-use.
|
|
191
136
|
|
|
192
|
-
|
|
193
|
-
isVisible.set(true); // Content appears between comment nodes
|
|
194
|
-
isVisible.set(false); // Content disappears, markers remain for reuse
|
|
195
|
-
```
|
|
137
|
+
### `removeWithAnchors()` / `delete()`
|
|
196
138
|
|
|
197
|
-
|
|
139
|
+
Destroys the content **and** removes the comment markers from the DOM. The anchor becomes unusable:
|
|
198
140
|
|
|
199
141
|
```javascript
|
|
200
|
-
|
|
142
|
+
anchor.removeWithAnchors(); // or anchor.delete()
|
|
143
|
+
// anchor is now permanently gone
|
|
144
|
+
```
|
|
201
145
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
);
|
|
146
|
+
### `getParent()`
|
|
147
|
+
|
|
148
|
+
Returns the current parent node:
|
|
206
149
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
items.splice(0, 1); // First div removed, others shift within markers
|
|
150
|
+
```javascript
|
|
151
|
+
const parent = anchor.getParent();
|
|
210
152
|
```
|
|
211
153
|
|
|
212
|
-
###
|
|
154
|
+
### `startElement()` / `endElement()`
|
|
213
155
|
|
|
214
|
-
|
|
215
|
-
const currentView = Observable('loading');
|
|
156
|
+
Returns the start or end comment node:
|
|
216
157
|
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
success: () => Div("Data loaded!"),
|
|
221
|
-
error: () => Div("Error occurred")
|
|
222
|
-
});
|
|
158
|
+
```javascript
|
|
159
|
+
const start = anchor.startElement();
|
|
160
|
+
const end = anchor.endElement();
|
|
223
161
|
|
|
224
|
-
|
|
162
|
+
console.log(start.textContent); // "Anchor Start : My Section"
|
|
163
|
+
console.log(end.textContent); // "/ Anchor End My Section"
|
|
225
164
|
```
|
|
226
165
|
|
|
227
|
-
|
|
166
|
+
---
|
|
228
167
|
|
|
229
|
-
|
|
230
|
-
- **One-time content creation** that won't change
|
|
231
|
-
- **Standard DOM operations** following web standards
|
|
232
|
-
- **Static content grouping** before insertion
|
|
168
|
+
## Method Aliases
|
|
233
169
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
);
|
|
240
|
-
// Gets replaced entirely when appended to parent
|
|
241
|
-
```
|
|
170
|
+
| Primary | Aliases |
|
|
171
|
+
|---|---|
|
|
172
|
+
| `appendChild(child)` | `append(child)` |
|
|
173
|
+
| `replaceContent(child)` | `setContent(child)` |
|
|
174
|
+
| `removeWithAnchors()` | `delete()` |
|
|
242
175
|
|
|
243
|
-
|
|
244
|
-
- **Dynamic content management** that updates frequently
|
|
245
|
-
- **Conditional rendering** systems
|
|
246
|
-
- **List management** with add/remove operations
|
|
247
|
-
- **Custom rendering patterns**
|
|
176
|
+
---
|
|
248
177
|
|
|
249
|
-
|
|
250
|
-
// Dynamic content area that can be updated multiple times
|
|
251
|
-
const anchor = new Anchor("Updates");
|
|
252
|
-
anchor.appendChild(Div("Initial content"));
|
|
253
|
-
anchor.remove(); // Clear content
|
|
254
|
-
anchor.appendChild(Div("New content")); // Add different content - markers remain
|
|
255
|
-
```
|
|
178
|
+
## Practical Examples
|
|
256
179
|
|
|
257
|
-
|
|
180
|
+
### Dynamic content updates
|
|
258
181
|
|
|
259
|
-
### Memory Management
|
|
260
182
|
```javascript
|
|
261
|
-
|
|
262
|
-
const
|
|
183
|
+
const anchor = Anchor('Status');
|
|
184
|
+
const isLoading = Observable(true);
|
|
185
|
+
const data = Observable(null);
|
|
263
186
|
|
|
264
|
-
|
|
265
|
-
anchor.removeWithAnchors(); // Fully destroys anchor and frees memory
|
|
266
|
-
```
|
|
187
|
+
anchor.appendChild(Div('Loading...'));
|
|
267
188
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
+
});
|
|
279
200
|
```
|
|
280
201
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
### Creating Custom Anchor-Based Components
|
|
202
|
+
### Custom anchor-based component
|
|
284
203
|
|
|
285
204
|
```javascript
|
|
286
|
-
|
|
287
205
|
function ConditionalList(condition, items) {
|
|
288
|
-
const anchor =
|
|
206
|
+
const anchor = Anchor('ConditionalList');
|
|
289
207
|
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
208
|
+
const update = () => {
|
|
209
|
+
if (condition.val() && items.val().length) {
|
|
210
|
+
anchor.replaceContent(
|
|
211
|
+
Ul(items.val().map(item => Li(item)))
|
|
212
|
+
);
|
|
295
213
|
} else {
|
|
296
|
-
anchor.
|
|
214
|
+
anchor.removeChildren();
|
|
297
215
|
}
|
|
298
216
|
};
|
|
299
217
|
|
|
300
|
-
condition.subscribe(
|
|
301
|
-
items.subscribe(
|
|
302
|
-
|
|
218
|
+
condition.subscribe(update);
|
|
219
|
+
items.subscribe(update);
|
|
220
|
+
update();
|
|
303
221
|
|
|
304
222
|
return anchor;
|
|
305
223
|
}
|
|
306
224
|
|
|
307
|
-
|
|
308
|
-
const
|
|
225
|
+
const condition = Observable(true);
|
|
226
|
+
const items = Observable.array([]);
|
|
309
227
|
let id = 0;
|
|
310
|
-
const items = new Observable.array([]);
|
|
311
228
|
|
|
312
229
|
document.body.appendChild(Div([
|
|
313
230
|
ConditionalList(condition, items),
|
|
314
|
-
Button(
|
|
315
|
-
Button(
|
|
231
|
+
Button('Toggle').nd.onClick(() => condition.toggle()),
|
|
232
|
+
Button('Add').nd.onClick(() => items.push('Item ' + (++id)))
|
|
316
233
|
]));
|
|
317
234
|
```
|
|
318
235
|
|
|
319
|
-
###
|
|
236
|
+
### Layout manager
|
|
320
237
|
|
|
321
238
|
```javascript
|
|
322
239
|
function LayoutManager() {
|
|
323
|
-
const header
|
|
324
|
-
const content =
|
|
325
|
-
const footer
|
|
326
|
-
|
|
240
|
+
const header = Anchor('Header');
|
|
241
|
+
const content = Anchor('Content');
|
|
242
|
+
const footer = Anchor('Footer');
|
|
243
|
+
|
|
327
244
|
return {
|
|
328
|
-
setHeader:
|
|
329
|
-
setContent:
|
|
330
|
-
setFooter:
|
|
331
|
-
render:
|
|
245
|
+
setHeader: component => header.replaceContent(component),
|
|
246
|
+
setContent: component => content.replaceContent(component),
|
|
247
|
+
setFooter: component => footer.replaceContent(component),
|
|
248
|
+
render: () => Div([header, content, footer])
|
|
332
249
|
};
|
|
333
250
|
}
|
|
334
251
|
```
|
|
335
252
|
|
|
336
|
-
|
|
253
|
+
---
|
|
337
254
|
|
|
338
|
-
|
|
339
|
-
2. **Anchors are reusable** - Content can be added/removed multiple times
|
|
340
|
-
3. **Use `removeWithAnchors()` only when permanently destroying** the anchor
|
|
341
|
-
4. **Anchors are invisible** - They don't affect layout or styling
|
|
342
|
-
5. **Prefer `replaceContent()` over `remove()` + `appendChild()`** for better performance
|
|
343
|
-
6. **Create custom patterns** - Anchors enable custom rendering solutions
|
|
344
|
-
7. **Consider memory implications** when creating many anchors
|
|
345
|
-
8. **Use batch operations** for multiple content updates
|
|
255
|
+
## How Conditional Rendering Uses Anchors
|
|
346
256
|
|
|
347
|
-
|
|
257
|
+
Every conditional and list rendering utility returns an anchor:
|
|
348
258
|
|
|
349
|
-
❌ **Don't do this:**
|
|
350
259
|
```javascript
|
|
351
|
-
//
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
anchor
|
|
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
|
|
356
274
|
```
|
|
357
275
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Best Practices
|
|
279
|
+
|
|
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
|
+
---
|
|
364
287
|
|
|
365
288
|
## Next Steps
|
|
366
289
|
|
|
367
|
-
- **[
|
|
368
|
-
- **[
|
|
369
|
-
- **[
|
|
370
|
-
- **[
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
- **[
|
|
375
|
-
- **[
|
|
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
|