native-document 1.0.15 → 1.0.16-8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmrc.example +1 -0
- package/.vitepress/config.js +166 -0
- package/CHANGELOG.md +153 -0
- package/cdn.js +19 -0
- package/components.d.ts +2 -0
- package/components.js +30 -0
- package/devtools/ComponentRegistry.js +113 -0
- package/devtools/index.js +8 -0
- package/devtools/plugin/dev-tools-plugin.js +15 -0
- package/devtools/transformers/nd-vite-devtools.js +55 -0
- package/devtools/transformers/src/transformComponentForHrm.js +73 -0
- package/devtools/transformers/src/transformJsFile.js +9 -0
- package/devtools/transformers/src/utils.js +79 -0
- package/devtools/transformers/templates/hrm.hook.template.js +46 -0
- package/devtools/transformers/templates/hrm.orbservable.hook.template.js +76 -0
- package/devtools/widget/Widget.js +49 -0
- package/devtools/widget/widget.css +81 -0
- package/devtools/widget.js +23 -0
- package/dist/native-document.components.min.css +1 -0
- package/dist/native-document.components.min.js +23847 -0
- package/dist/native-document.dev.js +8421 -1492
- package/dist/native-document.dev.js.map +1 -0
- package/dist/native-document.devtools.min.js +1 -0
- package/dist/native-document.min.js +1 -1
- package/docs/advanced-components.md +419 -0
- package/docs/anchor.md +181 -257
- package/docs/cache.md +180 -0
- package/docs/cli.md +179 -0
- package/docs/components/accordion.md +172 -0
- package/docs/components/alert.md +99 -0
- package/docs/components/avatar.md +160 -0
- package/docs/components/badge.md +102 -0
- package/docs/components/breadcrumb.md +89 -0
- package/docs/components/button.md +183 -0
- package/docs/components/card.md +69 -0
- package/docs/components/context-menu.md +118 -0
- package/docs/components/data-table.md +345 -0
- package/docs/components/dropdown.md +214 -0
- package/docs/components/form/autocomplete-field.md +81 -0
- package/docs/components/form/checkbox-field.md +41 -0
- package/docs/components/form/checkbox-group-field.md +54 -0
- package/docs/components/form/color-field.md +64 -0
- package/docs/components/form/date-field.md +92 -0
- package/docs/components/form/field-collection.md +63 -0
- package/docs/components/form/file-field.md +203 -0
- package/docs/components/form/form-control.md +87 -0
- package/docs/components/form/image-field.md +90 -0
- package/docs/components/form/index.md +115 -0
- package/docs/components/form/number-field.md +65 -0
- package/docs/components/form/radio-field.md +51 -0
- package/docs/components/form/select-field.md +123 -0
- package/docs/components/form/slider.md +136 -0
- package/docs/components/form/string-field.md +134 -0
- package/docs/components/form/textarea-field.md +65 -0
- package/docs/components/form-fields.md +372 -0
- package/docs/components/getting-started.md +264 -0
- package/docs/components/index.md +337 -0
- package/docs/components/layout.md +279 -0
- package/docs/components/list.md +73 -0
- package/docs/components/menu.md +215 -0
- package/docs/components/modal.md +156 -0
- package/docs/components/pagination.md +95 -0
- package/docs/components/popover.md +131 -0
- package/docs/components/progress.md +111 -0
- package/docs/components/shortcut-manager.md +221 -0
- package/docs/components/simple-table.md +107 -0
- package/docs/components/skeleton.md +155 -0
- package/docs/components/spinner.md +100 -0
- package/docs/components/splitter.md +133 -0
- package/docs/components/stepper.md +163 -0
- package/docs/components/switch.md +113 -0
- package/docs/components/tabs.md +153 -0
- package/docs/components/toast.md +119 -0
- package/docs/components/tooltip.md +151 -0
- package/docs/components/traits.md +261 -0
- package/docs/conditional-rendering.md +177 -502
- package/docs/contributing.md +300 -25
- package/docs/core-concepts.md +207 -366
- package/docs/elements.md +266 -254
- package/docs/extending-native-document-element.md +259 -0
- package/docs/filters.md +247 -0
- package/docs/getting-started.md +195 -257
- package/docs/i18n.md +241 -0
- package/docs/index.md +76 -0
- package/docs/lifecycle-events.md +146 -67
- package/docs/list-rendering.md +240 -460
- package/docs/memory-management.md +135 -46
- package/docs/native-document-element.md +487 -0
- package/docs/native-fetch.md +213 -0
- package/docs/observable-resource.md +364 -0
- package/docs/observables.md +690 -357
- package/docs/routing.md +246 -646
- package/docs/state-management.md +213 -306
- package/docs/svg-elements.md +231 -0
- package/docs/theming.md +409 -0
- package/docs/tutorials/.gitkeep +0 -0
- package/docs/validation.md +98 -91
- package/docs/vitepress-conventions.md +219 -0
- package/elements.d.ts +7 -0
- package/elements.js +3 -4
- package/eslint.config.js +35 -0
- package/i18n.js +1 -0
- package/i18n.ts +2 -0
- package/index.d.ts +21 -0
- package/index.def.js +1086 -0
- package/index.js +19 -13
- package/package.json +59 -9
- package/readme.md +296 -93
- package/rollup.config.js +52 -3
- package/router.d.ts +7 -0
- package/router.js +0 -0
- package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
- package/src/components/$traits/has-draggable/HasDraggable.js +82 -0
- package/src/components/$traits/has-draggable/has-draggable.css +8 -0
- package/src/components/$traits/has-items/HasItems.d.ts +9 -0
- package/src/components/$traits/has-items/HasItems.js +64 -0
- package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
- package/src/components/$traits/has-position/HasFullPosition.js +95 -0
- package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
- package/src/components/$traits/has-position/HasPosition.js +45 -0
- package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
- package/src/components/$traits/has-resizable/HasResizable.js +122 -0
- package/src/components/$traits/has-resizable/has-resizable.css +121 -0
- package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
- package/src/components/$traits/has-validation/HasValidation.js +133 -0
- package/src/components/BaseComponent.d.ts +32 -0
- package/src/components/BaseComponent.js +247 -0
- package/src/components/accordion/Accordion.js +268 -0
- package/src/components/accordion/AccordionItem.js +233 -0
- package/src/components/accordion/index.js +7 -0
- package/src/components/accordion/types/Accordion.d.ts +47 -0
- package/src/components/accordion/types/AccordionItem.d.ts +48 -0
- package/src/components/alert/Alert.js +350 -0
- package/src/components/alert/index.js +6 -0
- package/src/components/alert/types/Alert.d.ts +62 -0
- package/src/components/avatar/Avatar.js +430 -0
- package/src/components/avatar/AvatarGroup.js +97 -0
- package/src/components/avatar/index.js +7 -0
- package/src/components/avatar/types/Avatar.d.ts +74 -0
- package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
- package/src/components/badge/Badge.js +245 -0
- package/src/components/badge/index.js +6 -0
- package/src/components/badge/types/Badge.d.ts +51 -0
- package/src/components/base-component.css +0 -0
- package/src/components/breadcrumb/BreadCrumb.js +138 -0
- package/src/components/breadcrumb/index.js +5 -0
- package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
- package/src/components/button/Button.js +320 -0
- package/src/components/button/index.js +5 -0
- package/src/components/button/types/Button.d.ts +62 -0
- package/src/components/card/Card.js +282 -0
- package/src/components/card/index.js +5 -0
- package/src/components/card/types/Card.d.ts +42 -0
- package/src/components/context-menu/ContextMenu.js +127 -0
- package/src/components/context-menu/ContextMenuGroup.js +29 -0
- package/src/components/context-menu/ContextMenuItem.js +28 -0
- package/src/components/context-menu/index.js +10 -0
- package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
- package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
- package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
- package/src/components/divider/Divider.js +256 -0
- package/src/components/divider/index.js +6 -0
- package/src/components/divider/types/Divider.d.ts +55 -0
- package/src/components/dropdown/Dropdown.js +531 -0
- package/src/components/dropdown/DropdownDivider.js +45 -0
- package/src/components/dropdown/DropdownGroup.js +83 -0
- package/src/components/dropdown/DropdownItem.js +150 -0
- package/src/components/dropdown/DropdownTrigger.js +93 -0
- package/src/components/dropdown/helpers.js +53 -0
- package/src/components/dropdown/index.js +13 -0
- package/src/components/dropdown/types/Dropdown.d.ts +88 -0
- package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
- package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
- package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
- package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
- package/src/components/form/FormControl.js +498 -0
- package/src/components/form/field/Field.js +419 -0
- package/src/components/form/field/FieldCollection.js +292 -0
- package/src/components/form/field/types/AutocompleteField.js +168 -0
- package/src/components/form/field/types/CheckboxField.js +77 -0
- package/src/components/form/field/types/CheckboxGroupField.js +171 -0
- package/src/components/form/field/types/ColorField.js +102 -0
- package/src/components/form/field/types/DateField.js +315 -0
- package/src/components/form/field/types/EmailField.js +104 -0
- package/src/components/form/field/types/FileField.js +276 -0
- package/src/components/form/field/types/HiddenField.js +44 -0
- package/src/components/form/field/types/ImageField.js +138 -0
- package/src/components/form/field/types/NumberField.js +177 -0
- package/src/components/form/field/types/PasswordField.js +200 -0
- package/src/components/form/field/types/RadioField.js +145 -0
- package/src/components/form/field/types/RangeField.js +117 -0
- package/src/components/form/field/types/SearchField.js +66 -0
- package/src/components/form/field/types/SelectField.js +247 -0
- package/src/components/form/field/types/StringField.js +148 -0
- package/src/components/form/field/types/TelField.js +98 -0
- package/src/components/form/field/types/TextAreaField.js +142 -0
- package/src/components/form/field/types/TimeField.js +215 -0
- package/src/components/form/field/types/UrlField.js +115 -0
- package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +183 -0
- package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +117 -0
- package/src/components/form/field/types/file-field-mode/FileItemPreview.js +150 -0
- package/src/components/form/field/types/file-field-mode/FileNativeMode.js +43 -0
- package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +120 -0
- package/src/components/form/field/types/file-field-mode/FileWallMode.js +106 -0
- package/src/components/form/index.js +61 -0
- package/src/components/form/merge +0 -0
- package/src/components/form/types/Field.d.ts +73 -0
- package/src/components/form/types/FieldCollection.d.ts +53 -0
- package/src/components/form/types/FormControl.d.ts +64 -0
- package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
- package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
- package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
- package/src/components/form/types/fields/ColorField.d.ts +37 -0
- package/src/components/form/types/fields/DateField.d.ts +70 -0
- package/src/components/form/types/fields/EmailField.d.ts +35 -0
- package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
- package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
- package/src/components/form/types/fields/FileField.d.ts +56 -0
- package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
- package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
- package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
- package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
- package/src/components/form/types/fields/HiddenField.d.ts +26 -0
- package/src/components/form/types/fields/ImageField.d.ts +45 -0
- package/src/components/form/types/fields/NumberField.d.ts +48 -0
- package/src/components/form/types/fields/PasswordField.d.ts +46 -0
- package/src/components/form/types/fields/RadioField.d.ts +48 -0
- package/src/components/form/types/fields/RangeField.d.ts +44 -0
- package/src/components/form/types/fields/SearchField.d.ts +34 -0
- package/src/components/form/types/fields/SelectField.d.ts +71 -0
- package/src/components/form/types/fields/StringField.d.ts +48 -0
- package/src/components/form/types/fields/TelField.d.ts +37 -0
- package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
- package/src/components/form/types/fields/TimeField.d.ts +51 -0
- package/src/components/form/types/fields/UrlField.d.ts +35 -0
- package/src/components/form/utils.js +17 -0
- package/src/components/form/validation/Validation.js +565 -0
- package/src/components/index.d.ts +160 -0
- package/src/components/list/HasListItem.js +171 -0
- package/src/components/list/List.js +125 -0
- package/src/components/list/ListDivider.js +39 -0
- package/src/components/list/ListGroup.js +135 -0
- package/src/components/list/ListItem.js +212 -0
- package/src/components/list/index.js +12 -0
- package/src/components/list/types/List.d.ts +43 -0
- package/src/components/list/types/ListGroup.d.ts +37 -0
- package/src/components/list/types/ListItem.d.ts +53 -0
- package/src/components/menu/HasMenuItem.js +182 -0
- package/src/components/menu/Menu.js +227 -0
- package/src/components/menu/MenuDivider.js +37 -0
- package/src/components/menu/MenuGroup.js +126 -0
- package/src/components/menu/MenuItem.js +190 -0
- package/src/components/menu/MenuLink.js +51 -0
- package/src/components/menu/index.js +14 -0
- package/src/components/menu/types/Menu.d.ts +60 -0
- package/src/components/menu/types/MenuDivider.d.ts +19 -0
- package/src/components/menu/types/MenuGroup.d.ts +44 -0
- package/src/components/menu/types/MenuItem.d.ts +46 -0
- package/src/components/menu/types/MenuLink.d.ts +16 -0
- package/src/components/modal/Modal.js +524 -0
- package/src/components/modal/index.js +5 -0
- package/src/components/modal/types/Modal.d.ts +94 -0
- package/src/components/pagination/Pagination.js +411 -0
- package/src/components/pagination/index.js +5 -0
- package/src/components/pagination/types/Pagination.d.ts +68 -0
- package/src/components/popover/Popover.js +459 -0
- package/src/components/popover/PopoverFooter.js +61 -0
- package/src/components/popover/PopoverHeader.js +68 -0
- package/src/components/popover/index.js +10 -0
- package/src/components/popover/types/Popover.d.ts +83 -0
- package/src/components/popover/types/PopoverFooter.d.ts +24 -0
- package/src/components/popover/types/PopoverHeader.d.ts +26 -0
- package/src/components/progress/Progress.js +401 -0
- package/src/components/progress/index.js +6 -0
- package/src/components/progress/types/Progress.d.ts +77 -0
- package/src/components/skeleton/Skeleton.js +228 -0
- package/src/components/skeleton/index.js +6 -0
- package/src/components/skeleton/types/Skeleton.d.ts +55 -0
- package/src/components/slider/Slider.js +406 -0
- package/src/components/slider/index.js +5 -0
- package/src/components/slider/types/Slider.d.ts +82 -0
- package/src/components/spacer/Spacer.js +27 -0
- package/src/components/spacer/index.js +5 -0
- package/src/components/spacer/types/Spacer.d.ts +19 -0
- package/src/components/spinner/Spinner.js +350 -0
- package/src/components/spinner/index.js +5 -0
- package/src/components/spinner/types/Spinner.d.ts +71 -0
- package/src/components/splitter/Splitter.js +164 -0
- package/src/components/splitter/SplitterGutter.js +140 -0
- package/src/components/splitter/SplitterPanel.js +143 -0
- package/src/components/splitter/index.js +10 -0
- package/src/components/splitter/types/Splitter.d.ts +38 -0
- package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
- package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
- package/src/components/stacks/AbsoluteStack.js +53 -0
- package/src/components/stacks/FixedStack.js +53 -0
- package/src/components/stacks/HStack.js +54 -0
- package/src/components/stacks/PositionStack.js +254 -0
- package/src/components/stacks/RelativeStack.js +53 -0
- package/src/components/stacks/Stack.js +166 -0
- package/src/components/stacks/VStack.js +55 -0
- package/src/components/stacks/index.js +21 -0
- package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
- package/src/components/stacks/types/FixedStack.d.ts +16 -0
- package/src/components/stacks/types/HStack.d.ts +16 -0
- package/src/components/stacks/types/PositionStack.d.ts +54 -0
- package/src/components/stacks/types/RelativeStack.d.ts +17 -0
- package/src/components/stacks/types/Stack.d.ts +39 -0
- package/src/components/stacks/types/VStack.d.ts +16 -0
- package/src/components/stepper/Stepper.js +461 -0
- package/src/components/stepper/StepperStep.js +241 -0
- package/src/components/stepper/index.js +8 -0
- package/src/components/stepper/types/Stepper.d.ts +68 -0
- package/src/components/stepper/types/StepperStep.d.ts +54 -0
- package/src/components/switch/Switch.js +266 -0
- package/src/components/switch/index.js +6 -0
- package/src/components/switch/types/Switch.d.ts +55 -0
- package/src/components/table/Column.js +212 -0
- package/src/components/table/ColumnGroup.js +90 -0
- package/src/components/table/DataTable.js +720 -0
- package/src/components/table/SimpleTable.js +139 -0
- package/src/components/table/index.js +7 -0
- package/src/components/table/types/Column.d.ts +49 -0
- package/src/components/table/types/ColumnGroup.d.ts +28 -0
- package/src/components/table/types/DataTable.d.ts +97 -0
- package/src/components/table/types/SimpleTable.d.ts +40 -0
- package/src/components/tabs/Tabs.js +395 -0
- package/src/components/tabs/index.js +6 -0
- package/src/components/tabs/types/Tabs.d.ts +78 -0
- package/src/components/toast/Toast.js +262 -0
- package/src/components/toast/ToastError.js +0 -0
- package/src/components/toast/ToastInfo.js +0 -0
- package/src/components/toast/ToastSuccess.js +0 -0
- package/src/components/toast/ToastWarning.js +0 -0
- package/src/components/toast/index.js +5 -0
- package/src/components/toast/types/Toast.d.ts +57 -0
- package/src/components/toast/types/ToastError.d.ts +7 -0
- package/src/components/toast/types/ToastInfo.d.ts +7 -0
- package/src/components/toast/types/ToastSuccess.d.ts +7 -0
- package/src/components/toast/types/ToastWarning.d.ts +7 -0
- package/src/components/tooltip/Tooltip.js +359 -0
- package/src/components/tooltip/index.js +5 -0
- package/src/components/tooltip/prototypes.js +6 -0
- package/src/components/tooltip/types/Tooltip.d.ts +65 -0
- package/src/{data → core/data}/MemoryManager.js +2 -3
- package/src/core/data/Observable.js +227 -0
- package/src/core/data/ObservableArray.js +522 -0
- package/src/core/data/ObservableChecker.js +39 -0
- package/src/core/data/ObservableItem.js +611 -0
- package/src/core/data/ObservableObject.js +274 -0
- package/src/core/data/ObservableResource.js +315 -0
- package/src/core/data/ObservableWhen.js +54 -0
- package/src/core/data/Store.js +520 -0
- package/src/core/data/observable-helpers/observable.is-to.js +390 -0
- package/src/core/data/observable-helpers/observable.prototypes.js +145 -0
- package/src/core/elements/anchor/anchor-with-sentinel.js +66 -0
- package/src/core/elements/anchor/anchor.js +210 -0
- package/src/core/elements/anchor/one-child-anchor-overwriting.js +66 -0
- package/src/core/elements/content-formatter.js +169 -0
- package/src/core/elements/control/for-each-array.js +292 -0
- package/src/{elements → core/elements}/control/for-each.js +42 -23
- package/src/core/elements/control/show-if.js +94 -0
- package/src/core/elements/control/show-when.js +54 -0
- package/src/core/elements/control/switch.js +141 -0
- package/src/core/elements/description-list.js +19 -0
- package/src/core/elements/form.js +255 -0
- package/src/core/elements/fragment.js +8 -0
- package/src/core/elements/html5-semantics.js +55 -0
- package/src/core/elements/img.js +59 -0
- package/src/{elements → core/elements}/index.js +4 -4
- package/src/core/elements/interactive.js +25 -0
- package/src/core/elements/list.js +37 -0
- package/src/core/elements/medias.js +37 -0
- package/src/core/elements/meta-data.js +43 -0
- package/src/core/elements/svg.js +61 -0
- package/src/core/elements/table.js +73 -0
- package/src/{errors → core/errors}/ArgTypesError.js +1 -1
- package/src/{errors → core/errors}/NativeDocumentError.js +0 -0
- package/src/core/utils/HasEventEmitter.js +85 -0
- package/src/core/utils/args-types.js +140 -0
- package/src/core/utils/cache.js +5 -0
- package/src/core/utils/callback-handler.js +50 -0
- package/src/core/utils/debug-manager.js +40 -0
- package/src/core/utils/events.js +148 -0
- package/src/core/utils/filters/date.js +178 -0
- package/src/core/utils/filters/index.js +4 -0
- package/src/core/utils/filters/standard.js +263 -0
- package/src/core/utils/filters/strings.js +67 -0
- package/src/core/utils/filters/utils.js +77 -0
- package/src/core/utils/formatters.js +90 -0
- package/src/core/utils/helpers.js +144 -0
- package/src/core/utils/localstorage.js +57 -0
- package/src/core/utils/memoize.js +115 -0
- package/src/core/utils/plugins-manager.js +81 -0
- package/src/core/utils/property-accumulator.js +72 -0
- package/src/core/utils/prototypes.js +44 -0
- package/src/core/utils/shortcut-manager.js +242 -0
- package/src/{utils → core/utils}/validator.js +58 -22
- package/src/core/wrappers/AttributesWrapper.js +98 -0
- package/src/core/wrappers/DocumentObserver.js +182 -0
- package/src/core/wrappers/ElementCreator.js +120 -0
- package/src/core/wrappers/HtmlElementWrapper.js +98 -0
- package/src/core/wrappers/NDElement.js +613 -0
- package/src/core/wrappers/NdPrototype.js +233 -0
- package/src/core/wrappers/SingletonView.js +99 -0
- package/src/core/wrappers/SvgElementWrapper.js +15 -0
- package/src/core/wrappers/TemplateBinding.js +7 -0
- package/src/core/wrappers/constants.js +66 -0
- package/src/core/wrappers/prototypes/attributes-extensions.js +179 -0
- package/src/core/wrappers/prototypes/bind-class-extensions.js +0 -0
- package/src/core/wrappers/prototypes/nd-element-extensions.js +157 -0
- package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +127 -0
- package/src/core/wrappers/template-cloner/NodeCloner.js +209 -0
- package/src/core/wrappers/template-cloner/TemplateCloner.js +192 -0
- package/src/core/wrappers/template-cloner/attributes-hydrator.js +142 -0
- package/src/core/wrappers/template-cloner/utils.js +173 -0
- package/src/fetch/NativeFetch.js +89 -0
- package/src/i18n/bin/scan.js +132 -0
- package/src/i18n/index.d.ts +2 -0
- package/src/i18n/service/I18nService.d.ts +27 -0
- package/src/i18n/service/I18nService.js +46 -0
- package/src/i18n/service/functions.d.ts +22 -0
- package/src/i18n/service/functions.js +29 -0
- package/src/router/Route.js +33 -8
- package/src/router/RouteGroupHelper.js +10 -2
- package/src/router/Router.js +63 -22
- package/src/router/RouterComponent.js +114 -6
- package/src/{errors → router/errors}/RouterError.js +0 -1
- package/src/router/link.js +9 -10
- package/src/router/modes/HashRouter.js +2 -2
- package/src/router/modes/HistoryRouter.js +2 -3
- package/src/router/modes/MemoryRouter.js +1 -1
- package/src/ui/components/accordion/AccordionItemRender.js +63 -0
- package/src/ui/components/accordion/AccordionRender.js +35 -0
- package/src/ui/components/accordion/accordion.css +121 -0
- package/src/ui/components/alert/AlertRender.js +81 -0
- package/src/ui/components/alert/alert.css +163 -0
- package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +50 -0
- package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
- package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
- package/src/ui/components/avatar/avatar/avatar.css +189 -0
- package/src/ui/components/badge/BadgeRender.js +25 -0
- package/src/ui/components/badge/badge.css +168 -0
- package/src/ui/components/breadcrumb/BreadcrumbRender.js +44 -0
- package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
- package/src/ui/components/button/ButtonRender.js +65 -0
- package/src/ui/components/button/button.css +296 -0
- package/src/ui/components/card/CardRender.js +133 -0
- package/src/ui/components/card/card.css +169 -0
- package/src/ui/components/contextmenu/ContextmenuRender.js +68 -0
- package/src/ui/components/contextmenu/contextmenu.css +36 -0
- package/src/ui/components/divider/DividerRender.js +70 -0
- package/src/ui/components/divider/divider.css +70 -0
- package/src/ui/components/dropdown/DropdownRender.js +92 -0
- package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
- package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
- package/src/ui/components/dropdown/dropdown.css +179 -0
- package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
- package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
- package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
- package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
- package/src/ui/components/form/FieldCollectionRender.js +110 -0
- package/src/ui/components/form/FormControlRender.js +85 -0
- package/src/ui/components/form/field-collection.css +55 -0
- package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
- package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
- package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
- package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
- package/src/ui/components/form/fields/DateFieldRender.js +155 -0
- package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
- package/src/ui/components/form/fields/FieldRender.js +118 -0
- package/src/ui/components/form/fields/FileFieldRender.js +41 -0
- package/src/ui/components/form/fields/HiddenFieldRender.js +13 -0
- package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
- package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
- package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
- package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
- package/src/ui/components/form/fields/RangeFieldRender.js +122 -0
- package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
- package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
- package/src/ui/components/form/fields/StringFieldRender.js +6 -0
- package/src/ui/components/form/fields/TelFieldRender.js +6 -0
- package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
- package/src/ui/components/form/fields/TimeFieldRender.js +142 -0
- package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
- package/src/ui/components/form/fields/date-field.css +32 -0
- package/src/ui/components/form/fields/field.css +402 -0
- package/src/ui/components/form/fields/file-field.css +79 -0
- package/src/ui/components/form/fields/password-field.css +50 -0
- package/src/ui/components/form/fields/range-field.css +120 -0
- package/src/ui/components/form/fields/slider.css +195 -0
- package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
- package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
- package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
- package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
- package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +90 -0
- package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
- package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
- package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
- package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
- package/src/ui/components/form/form-control.css +40 -0
- package/src/ui/components/form/helpers.js +111 -0
- package/src/ui/components/form/index.js +27 -0
- package/src/ui/components/list/ListRender.js +18 -0
- package/src/ui/components/list/divider/ListDividerRender.js +10 -0
- package/src/ui/components/list/divider/list-divider.css +12 -0
- package/src/ui/components/list/group/ListGroupRender.js +61 -0
- package/src/ui/components/list/group/list-group.css +62 -0
- package/src/ui/components/list/item/ListItemRender.js +238 -0
- package/src/ui/components/list/item/list-item.css +191 -0
- package/src/ui/components/list/list.css +24 -0
- package/src/ui/components/menu/MenuDividerRender.js +12 -0
- package/src/ui/components/menu/MenuGroupRender.js +59 -0
- package/src/ui/components/menu/MenuItemRender.js +57 -0
- package/src/ui/components/menu/MenuLinkRender.js +55 -0
- package/src/ui/components/menu/MenuRender.js +22 -0
- package/src/ui/components/menu/helpers.js +121 -0
- package/src/ui/components/menu/menu.css +308 -0
- package/src/ui/components/modal/ModalRender.js +118 -0
- package/src/ui/components/modal/modal.css +156 -0
- package/src/ui/components/pagination/PaginationRender.js +112 -0
- package/src/ui/components/pagination/pagination.css +63 -0
- package/src/ui/components/popover/PopoverRender.js +233 -0
- package/src/ui/components/popover/popover.css +139 -0
- package/src/ui/components/progress/ProgressRender.js +168 -0
- package/src/ui/components/progress/progress.css +197 -0
- package/src/ui/components/skeleton/SkeletonRender.js +136 -0
- package/src/ui/components/skeleton/skeleton.css +154 -0
- package/src/ui/components/spacer/SpacerRender.js +10 -0
- package/src/ui/components/spinner/SpinnerRender.js +47 -0
- package/src/ui/components/spinner/spinner.css +152 -0
- package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
- package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
- package/src/ui/components/splitter/SplitterRender.js +75 -0
- package/src/ui/components/splitter/splitter.css +128 -0
- package/src/ui/components/stacks/PositionStackRender.js +39 -0
- package/src/ui/components/stacks/StackRender.js +41 -0
- package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
- package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
- package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
- package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
- package/src/ui/components/stacks/index.js +5 -0
- package/src/ui/components/stacks/position-stack.css +62 -0
- package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
- package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
- package/src/ui/components/stacks/stack.css +78 -0
- package/src/ui/components/stacks/v-stack/VStackRender.js +6 -0
- package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
- package/src/ui/components/stepper/StepperRender.js +71 -0
- package/src/ui/components/stepper/StepperStepRender.js +67 -0
- package/src/ui/components/stepper/stepper.css +359 -0
- package/src/ui/components/switch/SwitchRender.js +83 -0
- package/src/ui/components/switch/switch.css +143 -0
- package/src/ui/components/table/data-table/DataTableRender.js +50 -0
- package/src/ui/components/table/data-table/bulk-actions.js +34 -0
- package/src/ui/components/table/data-table/data-table.css +246 -0
- package/src/ui/components/table/data-table/pagination.js +56 -0
- package/src/ui/components/table/data-table/tables.js +368 -0
- package/src/ui/components/table/data-table/toolbar.js +67 -0
- package/src/ui/components/table/simple-table/SimpleTableRender.js +203 -0
- package/src/ui/components/table/simple-table/simple-table.css +50 -0
- package/src/ui/components/tabs/TabsRender.js +226 -0
- package/src/ui/components/tabs/tabs.css +253 -0
- package/src/ui/components/toast/ToastRender.js +99 -0
- package/src/ui/components/toast/toast.css +201 -0
- package/src/ui/components/tooltip/TooltipRender.js +8 -0
- package/src/ui/components/tooltip/tooltip.css +113 -0
- package/src/ui/index.js +47 -0
- package/src/ui/theme.js +0 -0
- package/src/ui/theme.scss +1 -0
- package/src/ui/tokens/animation.scss +36 -0
- package/src/ui/tokens/colors-dark.scss +58 -0
- package/src/ui/tokens/colors.scss +54 -0
- package/src/ui/tokens/components.scss +32 -0
- package/src/ui/tokens/fonts.scss +57 -0
- package/src/ui/tokens/glass.scss +10 -0
- package/src/ui/tokens/index.scss +38 -0
- package/src/ui/tokens/layouts.scss +228 -0
- package/src/ui/tokens/opacity.scss +21 -0
- package/src/ui/tokens/others.scss +11 -0
- package/src/ui/tokens/radius.scss +6 -0
- package/src/ui/tokens/reset.scss +51 -0
- package/src/ui/tokens/shadows.scss +29 -0
- package/src/ui/tokens/spacings.scss +13 -0
- package/src/ui/tokens/vars.scss +35 -0
- package/src/ui/tokens/viewports.scss +30 -0
- package/types/args-types.d.ts +58 -0
- package/types/control-flow.d.ts +62 -0
- package/types/elements.d.ts +231 -0
- package/types/filters/dates.d.ts +43 -0
- package/types/filters/index.d.ts +4 -0
- package/types/filters/standard.d.ts +70 -0
- package/types/filters/strings.d.ts +21 -0
- package/types/filters/types.d.ts +20 -0
- package/types/forms.d.ts +84 -0
- package/types/globals.d.ts +543 -0
- package/types/images.d.ts +23 -0
- package/types/localStorage.ts +102 -0
- package/types/memoize.d.ts +26 -0
- package/types/native-fetch.d.ts +72 -0
- package/types/nd-element.d.ts +407 -0
- package/types/observable-resource.d.ts +3 -0
- package/types/observable.d.ts +227 -0
- package/types/plugins-manager.d.ts +65 -0
- package/types/polyfill.d.ts +18 -0
- package/types/property-accumulator.d.ts +33 -0
- package/types/router.d.ts +85 -0
- package/types/service.d.ts +23 -0
- package/types/singleton.d.ts +19 -0
- package/types/store.d.ts +63 -0
- package/types/template-cloner.ts +43 -0
- package/types/validator.ts +66 -0
- package/ui.js +1 -0
- package/utils.d.ts +4 -0
- package/utils.js +12 -0
- package/src/data/Observable.js +0 -55
- package/src/data/ObservableChecker.js +0 -39
- package/src/data/ObservableItem.js +0 -195
- package/src/data/Store.js +0 -74
- package/src/data/observable-helpers/array.js +0 -74
- package/src/data/observable-helpers/batch.js +0 -22
- package/src/data/observable-helpers/computed.js +0 -28
- package/src/data/observable-helpers/object.js +0 -111
- package/src/elements/anchor.js +0 -129
- package/src/elements/content-formatter.js +0 -32
- package/src/elements/control/for-each-array.js +0 -280
- package/src/elements/control/show-if.js +0 -79
- package/src/elements/control/switch.js +0 -98
- package/src/elements/description-list.js +0 -5
- package/src/elements/form.js +0 -71
- package/src/elements/html5-semantics.js +0 -12
- package/src/elements/img.js +0 -45
- package/src/elements/interactive.js +0 -7
- package/src/elements/list.js +0 -10
- package/src/elements/medias.js +0 -8
- package/src/elements/meta-data.js +0 -9
- package/src/elements/table.js +0 -14
- package/src/utils/args-types.js +0 -100
- package/src/utils/debug-manager.js +0 -31
- package/src/utils/helpers.js +0 -60
- package/src/utils/plugins-manager.js +0 -12
- package/src/utils/prototypes.js +0 -45
- package/src/wrappers/AttributesWrapper.js +0 -144
- package/src/wrappers/DocumentObserver.js +0 -80
- package/src/wrappers/ElementCreator.js +0 -114
- package/src/wrappers/HtmlElementEventsWrapper.js +0 -64
- package/src/wrappers/HtmlElementWrapper.js +0 -50
- package/src/wrappers/NdPrototype.js +0 -109
- package/src/wrappers/constants.js +0 -2
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import {createFilter, createMultiSourceFilter, getSecondsOfDay, isSameDay, toDate} from './utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a filter that passes when the date value is on the same day as the target date.
|
|
5
|
+
* Accepts Date objects, timestamps, or ISO strings.
|
|
6
|
+
*
|
|
7
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target date to compare against
|
|
8
|
+
* @returns {FilterResult}
|
|
9
|
+
* @example
|
|
10
|
+
* const today = new Date();
|
|
11
|
+
* events.where({ date: dateEquals(today) });
|
|
12
|
+
*/
|
|
13
|
+
export const dateEquals = (observableOrValue) => {
|
|
14
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
15
|
+
if (!value || !target) return false;
|
|
16
|
+
return isSameDay(value, target);
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Creates a filter that passes when the date value is strictly before the target date (day comparison).
|
|
22
|
+
*
|
|
23
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target date
|
|
24
|
+
* @returns {FilterResult}
|
|
25
|
+
*/
|
|
26
|
+
export const dateBefore = (observableOrValue) => {
|
|
27
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
28
|
+
if (!value || !target) return false;
|
|
29
|
+
return toDate(value) < toDate(target);
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Creates a filter that passes when the date value is strictly after the target date (day comparison).
|
|
35
|
+
*
|
|
36
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target date
|
|
37
|
+
* @returns {FilterResult}
|
|
38
|
+
*/
|
|
39
|
+
export const dateAfter = (observableOrValue) => {
|
|
40
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
41
|
+
if (!value || !target) return false;
|
|
42
|
+
return toDate(value) > toDate(target);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Creates a filter that passes when the date value falls within the given date range (inclusive, day comparison).
|
|
48
|
+
*
|
|
49
|
+
* @param {Date|number|string|ObservableItem} startObservableOrValue - Start of the range
|
|
50
|
+
* @param {Date|number|string|ObservableItem} endObservableOrValue - End of the range
|
|
51
|
+
* @returns {FilterResult}
|
|
52
|
+
* @example
|
|
53
|
+
* events.where({ date: dateBetween(startDate, endDate) });
|
|
54
|
+
*/
|
|
55
|
+
export const dateBetween = (startObservableOrValue, endObservableOrValue) => {
|
|
56
|
+
return createMultiSourceFilter(
|
|
57
|
+
[startObservableOrValue, endObservableOrValue],
|
|
58
|
+
(value, [start, end]) => {
|
|
59
|
+
if (!value || !start || !end) return false;
|
|
60
|
+
const date = toDate(value);
|
|
61
|
+
return date >= toDate(start) && date <= toDate(end);
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates a filter that passes when the time component (HH:MM:SS) equals the target time.
|
|
68
|
+
*
|
|
69
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target time
|
|
70
|
+
* @returns {FilterResult}
|
|
71
|
+
*/
|
|
72
|
+
export const timeEquals = (observableOrValue) => {
|
|
73
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
74
|
+
if (!value || !target) return false;
|
|
75
|
+
const d1 = toDate(value);
|
|
76
|
+
const d2 = toDate(target);
|
|
77
|
+
return d1.getHours() === d2.getHours() &&
|
|
78
|
+
d1.getMinutes() === d2.getMinutes() &&
|
|
79
|
+
d1.getSeconds() === d2.getSeconds();
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Creates a filter that passes when the time component is strictly after the target time.
|
|
85
|
+
*
|
|
86
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target time
|
|
87
|
+
* @returns {FilterResult}
|
|
88
|
+
*/
|
|
89
|
+
export const timeAfter = (observableOrValue) => {
|
|
90
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
91
|
+
if (!value || !target) return false;
|
|
92
|
+
return getSecondsOfDay(value) > getSecondsOfDay(target);
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Creates a filter that passes when the time component is strictly before the target time.
|
|
98
|
+
*
|
|
99
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target time
|
|
100
|
+
* @returns {FilterResult}
|
|
101
|
+
*/
|
|
102
|
+
export const timeBefore = (observableOrValue) => {
|
|
103
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
104
|
+
if (!value || !target) return false;
|
|
105
|
+
return getSecondsOfDay(value) < getSecondsOfDay(target);
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Creates a filter that passes when the time component falls within the given time range (inclusive).
|
|
111
|
+
*
|
|
112
|
+
* @param {Date|number|string|ObservableItem} startObservableOrValue - Start time
|
|
113
|
+
* @param {Date|number|string|ObservableItem} endObservableOrValue - End time
|
|
114
|
+
* @returns {FilterResult}
|
|
115
|
+
*/
|
|
116
|
+
export const timeBetween = (startObservableOrValue, endObservableOrValue) => {
|
|
117
|
+
return createMultiSourceFilter([startObservableOrValue, endObservableOrValue],
|
|
118
|
+
(value, [start, end]) => {
|
|
119
|
+
if (!value || !start || !end) return false;
|
|
120
|
+
const date = getSecondsOfDay(value);
|
|
121
|
+
return date >= getSecondsOfDay(start) && date <= getSecondsOfDay(end);
|
|
122
|
+
},
|
|
123
|
+
);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Creates a filter that passes when the full datetime (date + time) equals the target exactly.
|
|
128
|
+
*
|
|
129
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target datetime
|
|
130
|
+
* @returns {FilterResult}
|
|
131
|
+
*/
|
|
132
|
+
export const dateTimeEquals = (observableOrValue) => {
|
|
133
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
134
|
+
if (!value || !target) return false;
|
|
135
|
+
return toDate(value).getTime() === toDate(target).getTime();
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Creates a filter that passes when the full datetime is strictly after the target.
|
|
141
|
+
*
|
|
142
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target datetime
|
|
143
|
+
* @returns {FilterResult}
|
|
144
|
+
*/
|
|
145
|
+
export const dateTimeAfter = (observableOrValue) => {
|
|
146
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
147
|
+
if (!value || !target) return false;
|
|
148
|
+
return toDate(value) > toDate(target);
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Creates a filter that passes when the full datetime is strictly before the target.
|
|
154
|
+
*
|
|
155
|
+
* @param {Date|number|string|ObservableItem} observableOrValue - Target datetime
|
|
156
|
+
* @returns {FilterResult}
|
|
157
|
+
*/
|
|
158
|
+
export const dateTimeBefore = (observableOrValue) => {
|
|
159
|
+
return createFilter(observableOrValue, (value, target) => {
|
|
160
|
+
if (!value || !target) return false;
|
|
161
|
+
return toDate(value) < toDate(target);
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Creates a filter that passes when the full datetime falls within the given range (inclusive).
|
|
167
|
+
*
|
|
168
|
+
* @param {Date|number|string|ObservableItem} startObservableOrValue - Start of the range
|
|
169
|
+
* @param {Date|number|string|ObservableItem} endObservableOrValue - End of the range
|
|
170
|
+
* @returns {FilterResult}
|
|
171
|
+
*/
|
|
172
|
+
export const dateTimeBetween = (startObservableOrValue, endObservableOrValue) => {
|
|
173
|
+
return createMultiSourceFilter([startObservableOrValue, endObservableOrValue], (value, [start, end]) => {
|
|
174
|
+
if (!value || !start || !end) return false;
|
|
175
|
+
const date = toDate(value);
|
|
176
|
+
return date >= toDate(start) && date <= toDate(end);
|
|
177
|
+
});
|
|
178
|
+
};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import Validator from '../../utils/validator';
|
|
2
|
+
import { createFilter, createMultiSourceFilter } from './utils';
|
|
3
|
+
import DebugManager from '../debug-manager';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates a filter that passes values strictly equal to the target.
|
|
7
|
+
*
|
|
8
|
+
* @param {*|ObservableItem} observableOrValue - Static value or observable to compare against
|
|
9
|
+
* @returns {FilterResult}
|
|
10
|
+
* @example
|
|
11
|
+
* const statusFilter = equals('active');
|
|
12
|
+
* users.where({ status: statusFilter });
|
|
13
|
+
*/
|
|
14
|
+
export function equals(observableOrValue){
|
|
15
|
+
return createFilter(observableOrValue, (value, target) => value === target);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Creates a filter that passes values not strictly equal to the target.
|
|
20
|
+
*
|
|
21
|
+
* @param {*|ObservableItem} observableOrValue - Static value or observable
|
|
22
|
+
* @returns {FilterResult}
|
|
23
|
+
*/
|
|
24
|
+
export function notEquals(observableOrValue){
|
|
25
|
+
return createFilter(observableOrValue, (value, target) => value !== target);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Creates a filter that passes values greater than the target.
|
|
30
|
+
*
|
|
31
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
32
|
+
* @returns {FilterResult}
|
|
33
|
+
*/
|
|
34
|
+
export function greaterThan(observableOrValue){
|
|
35
|
+
return createFilter(observableOrValue, (value, target) => value > target);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates a filter that passes values greater than or equal to the target.
|
|
40
|
+
*
|
|
41
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
42
|
+
* @returns {FilterResult}
|
|
43
|
+
*/
|
|
44
|
+
export function greaterThanOrEqual(observableOrValue){
|
|
45
|
+
return createFilter(observableOrValue, (value, target) => value >= target);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Creates a filter that passes values less than the target.
|
|
50
|
+
*
|
|
51
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
52
|
+
* @returns {FilterResult}
|
|
53
|
+
*/
|
|
54
|
+
export function lessThan(observableOrValue){
|
|
55
|
+
return createFilter(observableOrValue, (value, target) => value < target);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Creates a filter that passes values less than or equal to the target.
|
|
60
|
+
*
|
|
61
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
62
|
+
* @returns {FilterResult}
|
|
63
|
+
*/
|
|
64
|
+
export function lessThanOrEqual(observableOrValue){
|
|
65
|
+
return createFilter(observableOrValue, (value, target) => value <= target);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Creates a filter that passes values between min and max (inclusive).
|
|
70
|
+
* Both min and max can be static values or observables.
|
|
71
|
+
*
|
|
72
|
+
* @param {number|ObservableItem<number>} minObservableOrValue - Lower bound
|
|
73
|
+
* @param {number|ObservableItem<number>} maxObservableOrValue - Upper bound
|
|
74
|
+
* @returns {FilterResult}
|
|
75
|
+
* @example
|
|
76
|
+
* items.where({ age: between(18, 65) });
|
|
77
|
+
*/
|
|
78
|
+
export function between(minObservableOrValue, maxObservableOrValue){
|
|
79
|
+
return createMultiSourceFilter(
|
|
80
|
+
[minObservableOrValue, maxObservableOrValue],
|
|
81
|
+
(value, [min, max]) => value >= min && value <= max,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Creates a filter that passes values included in the given array.
|
|
87
|
+
*
|
|
88
|
+
* @param {Array|ObservableItem<Array>} observableOrArray - Array to check membership in
|
|
89
|
+
* @returns {FilterResult}
|
|
90
|
+
* @example
|
|
91
|
+
* items.where({ role: inArray(['admin', 'editor']) });
|
|
92
|
+
*/
|
|
93
|
+
export function inArray(observableOrArray){
|
|
94
|
+
return createFilter(observableOrArray, (value, arr) => arr.includes(value));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Creates a filter that passes values not included in the given array.
|
|
99
|
+
*
|
|
100
|
+
* @param {Array|ObservableItem<Array>} observableOrArray - Array to check exclusion from
|
|
101
|
+
* @returns {FilterResult}
|
|
102
|
+
*/
|
|
103
|
+
export function notIn(observableOrArray){
|
|
104
|
+
return createFilter(observableOrArray, (value, arr) => !arr.includes(value));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Creates a filter that passes when the value is empty (null, undefined, empty string, or empty array).
|
|
109
|
+
* Pass false as the argument to filter for non-empty values instead.
|
|
110
|
+
*
|
|
111
|
+
* @param {boolean|ObservableItem<boolean>} [observableOrValue=true] - If true, filters empty values; if false, filters non-empty
|
|
112
|
+
* @returns {FilterResult}
|
|
113
|
+
*/
|
|
114
|
+
export function isEmpty(observableOrValue = true){
|
|
115
|
+
return createFilter(observableOrValue, (value, shouldBeEmpty) => {
|
|
116
|
+
const isActuallyEmpty = !value || value === '' ||
|
|
117
|
+
(Array.isArray(value) && value.length === 0);
|
|
118
|
+
|
|
119
|
+
return shouldBeEmpty ? isActuallyEmpty : !isActuallyEmpty;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Creates a filter that passes when the value is not empty.
|
|
125
|
+
* Pass false as the argument to filter for empty values instead.
|
|
126
|
+
*
|
|
127
|
+
* @param {boolean|ObservableItem<boolean>} [observableOrValue=true] - If true, filters non-empty values
|
|
128
|
+
* @returns {FilterResult}
|
|
129
|
+
*/
|
|
130
|
+
export function isNotEmpty(observableOrValue = true){
|
|
131
|
+
return createFilter(observableOrValue, (value, shouldBeNotEmpty) => {
|
|
132
|
+
const isActuallyNotEmpty = !!value && value !== '' &&
|
|
133
|
+
(!Array.isArray(value) || value.length > 0);
|
|
134
|
+
|
|
135
|
+
return shouldBeNotEmpty ? isActuallyNotEmpty : !isActuallyNotEmpty;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Creates a filter that tests the value against a pattern (string or regex).
|
|
141
|
+
*
|
|
142
|
+
* @param {string|RegExp|ObservableItem} patternObservableOrValue - Pattern to match against
|
|
143
|
+
* @param {boolean|ObservableItem<boolean>} [asRegexObservableOrValue=true] - If true, treat pattern as a regex; if false, use case-insensitive substring match
|
|
144
|
+
* @param {string|ObservableItem<string>} [flagsObservableOrValue=''] - Regex flags (e.g. 'i', 'g')
|
|
145
|
+
* @returns {FilterResult}
|
|
146
|
+
* @example
|
|
147
|
+
* const search = Observable('john');
|
|
148
|
+
* users.where({ name: match(search) }); // regex match, reactive
|
|
149
|
+
* users.where({ name: match('john', false) }); // case-insensitive substring
|
|
150
|
+
*/
|
|
151
|
+
export function match(patternObservableOrValue, asRegexObservableOrValue = true, flagsObservableOrValue = ''){
|
|
152
|
+
return createMultiSourceFilter(
|
|
153
|
+
[patternObservableOrValue, asRegexObservableOrValue, flagsObservableOrValue],
|
|
154
|
+
(value, [pattern, asRegex, flags]) => {
|
|
155
|
+
if (!pattern) return true;
|
|
156
|
+
|
|
157
|
+
if (asRegex){
|
|
158
|
+
try {
|
|
159
|
+
const regex = new RegExp(pattern, flags);
|
|
160
|
+
return regex.test(String(value));
|
|
161
|
+
} catch (error){
|
|
162
|
+
DebugManager.warn('Invalid regex pattern:', pattern, error);
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (!flags || flags === ''){
|
|
168
|
+
return String(value).toLowerCase().includes(String(pattern).toLowerCase());
|
|
169
|
+
}
|
|
170
|
+
return String(value).includes(String(pattern));
|
|
171
|
+
},
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Combines multiple filters with AND logic — all filters must pass.
|
|
177
|
+
* Merges dependencies from all child filters automatically.
|
|
178
|
+
*
|
|
179
|
+
* @param {...FilterResult} filters - Filters to combine
|
|
180
|
+
* @returns {FilterResult}
|
|
181
|
+
* @example
|
|
182
|
+
* items.where({ _: and(greaterThan(18), lessThan(65)) });
|
|
183
|
+
*/
|
|
184
|
+
export function and(...filters){
|
|
185
|
+
const dependencies = filters
|
|
186
|
+
.flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
|
|
187
|
+
.filter(Validator.isObservable);
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
dependencies: dependencies.length > 0 ? dependencies : null,
|
|
191
|
+
callback: (value) => filters.every(f => f.callback(value)),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Combines multiple filters with OR logic — at least one filter must pass.
|
|
197
|
+
* Merges dependencies from all child filters automatically.
|
|
198
|
+
*
|
|
199
|
+
* @param {...FilterResult} filters - Filters to combine
|
|
200
|
+
* @returns {FilterResult}
|
|
201
|
+
* @example
|
|
202
|
+
* items.where({ _: or(equals('admin'), equals('editor')) });
|
|
203
|
+
*/
|
|
204
|
+
export function or(...filters){
|
|
205
|
+
const dependencies = filters
|
|
206
|
+
.flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
|
|
207
|
+
.filter(Validator.isObservable);
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
dependencies: dependencies.length > 0 ? dependencies : null,
|
|
211
|
+
callback: (value) => filters.some(f => f.callback(value)),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Negates a filter — passes when the given filter does not pass.
|
|
217
|
+
*
|
|
218
|
+
* @param {FilterResult} filter - Filter to negate
|
|
219
|
+
* @returns {FilterResult}
|
|
220
|
+
* @example
|
|
221
|
+
* items.where({ status: not(equals('deleted')) });
|
|
222
|
+
*/
|
|
223
|
+
export function not(filter){
|
|
224
|
+
return {
|
|
225
|
+
dependencies: filter.dependencies,
|
|
226
|
+
callback: (value) => !filter.callback(value),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Creates a custom filter from a callback and a list of observable dependencies.
|
|
232
|
+
* The callback receives the item value followed by the current values of all observables.
|
|
233
|
+
*
|
|
234
|
+
* @param {(value: *, ...depValues: any[]) => boolean} callbackFn - Filter function
|
|
235
|
+
* @param {...ObservableItem} observables - Observable dependencies passed as extra arguments to callback
|
|
236
|
+
* @returns {FilterResult}
|
|
237
|
+
* @example
|
|
238
|
+
* const minAge = Observable(18);
|
|
239
|
+
* items.where({ age: custom((age, min) => age >= min, minAge) });
|
|
240
|
+
*/
|
|
241
|
+
export function custom(callbackFn, ...observables){
|
|
242
|
+
const dependencies = observables.filter(Validator.isObservable);
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
dependencies: dependencies.length > 0 ? dependencies : null,
|
|
246
|
+
callback: (value) => {
|
|
247
|
+
const values = observables.map(o =>
|
|
248
|
+
Validator.isObservable(o) ? o.val() : o,
|
|
249
|
+
);
|
|
250
|
+
return callbackFn(value, ...values);
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export const gt = greaterThan;
|
|
256
|
+
export const gte = greaterThanOrEqual;
|
|
257
|
+
export const lt = lessThan;
|
|
258
|
+
export const lte = lessThanOrEqual;
|
|
259
|
+
export const eq = equals;
|
|
260
|
+
export const neq = notEquals;
|
|
261
|
+
export const all = and;
|
|
262
|
+
export const any = or;
|
|
263
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createFilter, createMultiSourceFilter } from './utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a filter that passes when the value includes the given query string.
|
|
5
|
+
* Case-insensitive by default.
|
|
6
|
+
* Alias: contains
|
|
7
|
+
*
|
|
8
|
+
* @param {string|ObservableItem<string>} observableOrValue - Substring to search for
|
|
9
|
+
* @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
|
|
10
|
+
* @returns {FilterResult}
|
|
11
|
+
* @example
|
|
12
|
+
* const search = Observable('john');
|
|
13
|
+
* users.where({ name: includes(search) }); // reactive, case-insensitive
|
|
14
|
+
* users.where({ name: includes('John', true) }); // case-sensitive
|
|
15
|
+
*/
|
|
16
|
+
export function includes(observableOrValue, caseSensitive = false){
|
|
17
|
+
return createFilter(observableOrValue, (value, query) => {
|
|
18
|
+
if (!value) return false;
|
|
19
|
+
if (!query) return true;
|
|
20
|
+
if (!caseSensitive){
|
|
21
|
+
return String(value).toLowerCase().includes(String(query).toLowerCase());
|
|
22
|
+
}
|
|
23
|
+
return String(value).includes(String(query));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const contains = includes;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Creates a filter that passes when the value starts with the given query string.
|
|
31
|
+
* Case-insensitive by default.
|
|
32
|
+
*
|
|
33
|
+
* @param {string|ObservableItem<string>} observableOrValue - Prefix to search for
|
|
34
|
+
* @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
|
|
35
|
+
* @returns {FilterResult}
|
|
36
|
+
* @example
|
|
37
|
+
* users.where({ name: startsWith('Jo') });
|
|
38
|
+
*/
|
|
39
|
+
export function startsWith(observableOrValue, caseSensitive = false){
|
|
40
|
+
return createFilter(observableOrValue, (value, query) => {
|
|
41
|
+
if (!query) return true;
|
|
42
|
+
if (!caseSensitive){
|
|
43
|
+
return String(value).toLowerCase().startsWith(String(query).toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
return String(value).startsWith(String(query));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Creates a filter that passes when the value ends with the given query string.
|
|
51
|
+
* Case-insensitive by default.
|
|
52
|
+
*
|
|
53
|
+
* @param {string|ObservableItem<string>} observableOrValue - Suffix to search for
|
|
54
|
+
* @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
|
|
55
|
+
* @returns {FilterResult}
|
|
56
|
+
* @example
|
|
57
|
+
* files.where({ name: endsWith('.js') });
|
|
58
|
+
*/
|
|
59
|
+
export function endsWith(observableOrValue, caseSensitive = false){
|
|
60
|
+
return createFilter(observableOrValue, (value, query) => {
|
|
61
|
+
if (!query) return true;
|
|
62
|
+
if (!caseSensitive){
|
|
63
|
+
return String(value).toLowerCase().endsWith(String(query).toLowerCase());
|
|
64
|
+
}
|
|
65
|
+
return String(value).endsWith(String(query));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import Validator from '../../utils/validator';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Converts a value to a Date object. Returns the value as-is if it's already a Date.
|
|
5
|
+
*
|
|
6
|
+
* @param {Date|number|string} value - Value to convert
|
|
7
|
+
* @returns {Date}
|
|
8
|
+
*/
|
|
9
|
+
export function toDate(value) {
|
|
10
|
+
if (value instanceof Date) return value;
|
|
11
|
+
return new Date(value);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Returns true if two date values fall on the same calendar day (year, month, day).
|
|
16
|
+
*
|
|
17
|
+
* @param {Date|number|string} date1 - First date
|
|
18
|
+
* @param {Date|number|string} date2 - Second date
|
|
19
|
+
* @returns {boolean}
|
|
20
|
+
*/
|
|
21
|
+
export function isSameDay(date1, date2) {
|
|
22
|
+
const d1 = toDate(date1);
|
|
23
|
+
const d2 = toDate(date2);
|
|
24
|
+
return d1.getFullYear() === d2.getFullYear() &&
|
|
25
|
+
d1.getMonth() === d2.getMonth() &&
|
|
26
|
+
d1.getDate() === d2.getDate();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Returns the total number of seconds elapsed since midnight for the given date's time component.
|
|
31
|
+
* Used internally for time range comparisons.
|
|
32
|
+
*
|
|
33
|
+
* @param {Date|number|string} date - Date value to extract time from
|
|
34
|
+
* @returns {number} Seconds since midnight (0–86399)
|
|
35
|
+
*/
|
|
36
|
+
export function getSecondsOfDay(date) {
|
|
37
|
+
const d = toDate(date);
|
|
38
|
+
return (d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Creates a FilterResult from a single observable or static value and a comparison callback.
|
|
43
|
+
* If the value is an observable, it is registered as a dependency so the filter reacts to changes.
|
|
44
|
+
*
|
|
45
|
+
* @param {*|ObservableItem} observableOrValue - Observable or static value used as the comparison target
|
|
46
|
+
* @param {(value: *, target: *) => boolean} callbackFn - Filter function receiving (item value, target value)
|
|
47
|
+
* @returns {{ dependencies: ObservableItem|null, callback: (value: *) => boolean }} FilterResult
|
|
48
|
+
*/
|
|
49
|
+
export function createFilter(observableOrValue, callbackFn){
|
|
50
|
+
const isObservable = Validator.isObservable(observableOrValue);
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
dependencies: isObservable ? observableOrValue : null,
|
|
54
|
+
callback: (value) => callbackFn(value, isObservable ? observableOrValue.val() : observableOrValue),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Creates a FilterResult from multiple observable or static sources and a multi-value comparison callback.
|
|
60
|
+
* All observable sources are registered as dependencies.
|
|
61
|
+
*
|
|
62
|
+
* @param {Array<*|ObservableItem>} sources - Array of observables or static values
|
|
63
|
+
* @param {(value: *, targets: any[]) => boolean} callbackFn - Filter function receiving (item value, array of resolved source values)
|
|
64
|
+
* @returns {{ dependencies: ObservableItem[]|null, callback: (value: *) => boolean }} FilterResult
|
|
65
|
+
*/
|
|
66
|
+
export function createMultiSourceFilter(sources, callbackFn){
|
|
67
|
+
const observables = sources.filter(Validator.isObservable);
|
|
68
|
+
|
|
69
|
+
const getValues = () => sources.map(src =>
|
|
70
|
+
Validator.isObservable(src) ? src.val() : src,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
dependencies: observables.length > 0 ? observables : null,
|
|
75
|
+
callback: (value) => callbackFn(value, getValues()),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const $parseDateParts = (value, locale) => {
|
|
2
|
+
const d = new Date(value);
|
|
3
|
+
return {
|
|
4
|
+
d,
|
|
5
|
+
parts: new Intl.DateTimeFormat(locale, {
|
|
6
|
+
year: 'numeric',
|
|
7
|
+
month: 'long',
|
|
8
|
+
day: '2-digit',
|
|
9
|
+
hour: '2-digit',
|
|
10
|
+
minute: '2-digit',
|
|
11
|
+
second: '2-digit',
|
|
12
|
+
}).formatToParts(d).reduce((acc, { type, value }) => {
|
|
13
|
+
acc[type] = value;
|
|
14
|
+
return acc;
|
|
15
|
+
}, {}),
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const $applyDatePattern = (pattern, d, parts) => {
|
|
20
|
+
const pad = n => String(n).padStart(2, '0');
|
|
21
|
+
return pattern
|
|
22
|
+
.replace('YYYY', parts.year)
|
|
23
|
+
.replace('YY', parts.year.slice(-2))
|
|
24
|
+
.replace('MMMM', parts.month)
|
|
25
|
+
.replace('MMM', parts.month.slice(0, 3))
|
|
26
|
+
.replace('MM', pad(d.getMonth() + 1))
|
|
27
|
+
.replace('DD', pad(d.getDate()))
|
|
28
|
+
.replace('D', d.getDate())
|
|
29
|
+
.replace('HH', parts.hour)
|
|
30
|
+
.replace('mm', parts.minute)
|
|
31
|
+
.replace('ss', parts.second);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const Formatters = {
|
|
35
|
+
currency: (value, locale, { currency = 'XOF', notation, minimumFractionDigits, maximumFractionDigits } = {}) =>
|
|
36
|
+
new Intl.NumberFormat(locale, {
|
|
37
|
+
style: 'currency',
|
|
38
|
+
currency,
|
|
39
|
+
notation,
|
|
40
|
+
minimumFractionDigits,
|
|
41
|
+
maximumFractionDigits,
|
|
42
|
+
}).format(value),
|
|
43
|
+
|
|
44
|
+
number: (value, locale, { notation, minimumFractionDigits, maximumFractionDigits } = {}) =>
|
|
45
|
+
new Intl.NumberFormat(locale, {
|
|
46
|
+
notation,
|
|
47
|
+
minimumFractionDigits,
|
|
48
|
+
maximumFractionDigits,
|
|
49
|
+
}).format(value),
|
|
50
|
+
|
|
51
|
+
percent: (value, locale, { decimals = 1 } = {}) =>
|
|
52
|
+
new Intl.NumberFormat(locale, {
|
|
53
|
+
style: 'percent',
|
|
54
|
+
maximumFractionDigits: decimals,
|
|
55
|
+
}).format(value),
|
|
56
|
+
|
|
57
|
+
date: (value, locale, { format, dateStyle = 'long' } = {}) => {
|
|
58
|
+
if (format) {
|
|
59
|
+
const { d, parts } = $parseDateParts(value, locale);
|
|
60
|
+
return $applyDatePattern(format, d, parts);
|
|
61
|
+
}
|
|
62
|
+
return new Intl.DateTimeFormat(locale, { dateStyle }).format(new Date(value));
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
time: (value, locale, { format, hour = '2-digit', minute = '2-digit', second } = {}) => {
|
|
66
|
+
if (format) {
|
|
67
|
+
const { d, parts } = $parseDateParts(value, locale);
|
|
68
|
+
return $applyDatePattern(format, d, parts);
|
|
69
|
+
}
|
|
70
|
+
return new Intl.DateTimeFormat(locale, { hour, minute, second }).format(new Date(value));
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
datetime: (value, locale, { format, dateStyle = 'long', hour = '2-digit', minute = '2-digit', second } = {}) => {
|
|
74
|
+
if (format) {
|
|
75
|
+
const { d, parts } = $parseDateParts(value, locale);
|
|
76
|
+
return $applyDatePattern(format, d, parts);
|
|
77
|
+
}
|
|
78
|
+
return new Intl.DateTimeFormat(locale, { dateStyle, hour, minute, second }).format(new Date(value));
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
relative: (value, locale, { unit = 'day', numeric = 'auto' } = {}) => {
|
|
82
|
+
const diff = Math.round((value - Date.now()) / (1000 * 60 * 60 * 24));
|
|
83
|
+
return new Intl.RelativeTimeFormat(locale, { numeric }).format(diff, unit);
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
plural: (value, locale, { singular, plural } = {}) => {
|
|
87
|
+
const rule = new Intl.PluralRules(locale).select(value);
|
|
88
|
+
return `${value} ${rule === 'one' ? singular : plural}`;
|
|
89
|
+
},
|
|
90
|
+
};
|