@motifx-community/ui 0.0.0-stage → 0.1.0-beta.0
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/CHANGELOG.md +1803 -0
- package/LICENSE +21 -0
- package/README.md +139 -3
- package/dist/components/accordion/Accordion.d.ts +100 -0
- package/dist/components/accordion/AccordionItem.d.ts +66 -0
- package/dist/components/accordion/accordion-chevron.d.ts +2 -0
- package/dist/components/accordion/accordion-expanded-event-args.d.ts +9 -0
- package/dist/components/accordion/accordion-expanding-event-args.d.ts +10 -0
- package/dist/components/accordion/accordion-item-props.d.ts +25 -0
- package/dist/components/accordion/accordion-props.d.ts +38 -0
- package/dist/components/accordion/accordion-variant.d.ts +2 -0
- package/dist/components/accordion/index.d.ts +8 -0
- package/dist/components/actionsheet/ActionSheet.d.ts +61 -0
- package/dist/components/actionsheet/action-sheet-props.d.ts +17 -0
- package/dist/components/actionsheet/index.d.ts +2 -0
- package/dist/components/avatar/Avatar.d.ts +54 -0
- package/dist/components/avatar/AvatarGroup.d.ts +41 -0
- package/dist/components/avatar/avatar-group-layout.d.ts +2 -0
- package/dist/components/avatar/avatar-group-props.d.ts +17 -0
- package/dist/components/avatar/avatar-props.d.ts +25 -0
- package/dist/components/avatar/avatar-shape.d.ts +2 -0
- package/dist/components/avatar/avatar-size.d.ts +2 -0
- package/dist/components/avatar/avatar-status.d.ts +2 -0
- package/dist/components/avatar/avatar-tone.d.ts +2 -0
- package/dist/components/avatar/index.d.ts +11 -0
- package/dist/components/avatar/initials-of.d.ts +6 -0
- package/dist/components/avatar/tone-of-name.d.ts +3 -0
- package/dist/components/badge/Badge.d.ts +53 -0
- package/dist/components/badge/badge-position.d.ts +2 -0
- package/dist/components/badge/badge-props.d.ts +27 -0
- package/dist/components/badge/badge-tone.d.ts +2 -0
- package/dist/components/badge/badge-variant.d.ts +2 -0
- package/dist/components/badge/index.d.ts +5 -0
- package/dist/components/breadcrumb/Breadcrumb.d.ts +56 -0
- package/dist/components/breadcrumb/breadcrumb-item-click-event-args.d.ts +10 -0
- package/dist/components/breadcrumb/breadcrumb-item.d.ts +13 -0
- package/dist/components/breadcrumb/breadcrumb-props.d.ts +21 -0
- package/dist/components/breadcrumb/index.d.ts +4 -0
- package/dist/components/button/Button.d.ts +117 -0
- package/dist/components/button/button-props.d.ts +45 -0
- package/dist/components/button/button-size.d.ts +3 -0
- package/dist/components/button/button-tone.d.ts +2 -0
- package/dist/components/button/button-variant.d.ts +2 -0
- package/dist/components/buttongroup/ButtonGroup.d.ts +79 -0
- package/dist/components/buttongroup/button-group-item-click-event-args.d.ts +8 -0
- package/dist/components/buttongroup/button-group-item.d.ts +15 -0
- package/dist/components/buttongroup/button-group-props.d.ts +36 -0
- package/dist/components/buttongroup/button-group-selection.d.ts +2 -0
- package/dist/components/buttongroup/button-group-value-changed-event-args.d.ts +8 -0
- package/dist/components/buttongroup/index.d.ts +6 -0
- package/dist/components/calendar/Calendar.d.ts +70 -0
- package/dist/components/calendar/calendar-props.d.ts +26 -0
- package/dist/components/calendar/calendar-view.d.ts +2 -0
- package/dist/components/calendar/index.d.ts +3 -0
- package/dist/components/card/Card.d.ts +92 -0
- package/dist/components/card/card-orientation.d.ts +2 -0
- package/dist/components/card/card-props.d.ts +44 -0
- package/dist/components/card/card-selected-changed-event-args.d.ts +7 -0
- package/dist/components/card/card-variant.d.ts +2 -0
- package/dist/components/card/index.d.ts +5 -0
- package/dist/components/checkbox/CheckBox.d.ts +34 -0
- package/dist/components/checkbox/ToggleField.d.ts +26 -0
- package/dist/components/checkbox/check-box-props.d.ts +7 -0
- package/dist/components/checkbox/index.d.ts +5 -0
- package/dist/components/checkbox/label-position.d.ts +2 -0
- package/dist/components/checkbox/toggle-field-props.d.ts +10 -0
- package/dist/components/chip/Chip.d.ts +86 -0
- package/dist/components/chip/ChipGroup.d.ts +45 -0
- package/dist/components/chip/chip-group-props.d.ts +16 -0
- package/dist/components/chip/chip-group-selection.d.ts +2 -0
- package/dist/components/chip/chip-group-value-changed-event-args.d.ts +8 -0
- package/dist/components/chip/chip-props.d.ts +34 -0
- package/dist/components/chip/chip-remove-event-args.d.ts +7 -0
- package/dist/components/chip/chip-selected-changed-event-args.d.ts +7 -0
- package/dist/components/chip/chip-tone.d.ts +2 -0
- package/dist/components/chip/chip-variant.d.ts +2 -0
- package/dist/components/chip/index.d.ts +10 -0
- package/dist/components/colorbox/ColorBox.d.ts +55 -0
- package/dist/components/colorbox/color-box-apply.d.ts +2 -0
- package/dist/components/colorbox/color-box-props.d.ts +15 -0
- package/dist/components/colorbox/index.d.ts +3 -0
- package/dist/components/colorpicker/ColorPicker.d.ts +66 -0
- package/dist/components/colorpicker/color-changed-event-args.d.ts +8 -0
- package/dist/components/colorpicker/color-picker-props.d.ts +17 -0
- package/dist/components/colorpicker/index.d.ts +4 -0
- package/dist/components/combobox/Autocomplete.d.ts +17 -0
- package/dist/components/combobox/ComboBox.d.ts +103 -0
- package/dist/components/combobox/combo-box-props.d.ts +37 -0
- package/dist/components/combobox/index.d.ts +3 -0
- package/dist/components/contextmenu/ContextMenu.d.ts +96 -0
- package/dist/components/contextmenu/attach-context-menu.d.ts +12 -0
- package/dist/components/contextmenu/context-menu-opening-event-args.d.ts +16 -0
- package/dist/components/contextmenu/context-menu-presentation.d.ts +2 -0
- package/dist/components/contextmenu/context-menu-props.d.ts +30 -0
- package/dist/components/contextmenu/context-menu-target.d.ts +3 -0
- package/dist/components/contextmenu/index.d.ts +6 -0
- package/dist/components/datagrid/DataGrid.d.ts +1194 -0
- package/dist/components/datagrid/band-cell-context.d.ts +7 -0
- package/dist/components/datagrid/band-layout.d.ts +7 -0
- package/dist/components/datagrid/built-in-action.d.ts +3 -0
- package/dist/components/datagrid/cell-context.d.ts +14 -0
- package/dist/components/datagrid/column-features.d.ts +68 -0
- package/dist/components/datagrid/column-filter.d.ts +20 -0
- package/dist/components/datagrid/column-layout.d.ts +10 -0
- package/dist/components/datagrid/column-option-name.d.ts +7 -0
- package/dist/components/datagrid/column-resize-mode.d.ts +2 -0
- package/dist/components/datagrid/column-type.d.ts +2 -0
- package/dist/components/datagrid/data-grid-props.d.ts +353 -0
- package/dist/components/datagrid/detail-context.d.ts +13 -0
- package/dist/components/datagrid/editor-context.d.ts +26 -0
- package/dist/components/datagrid/grid-action-item.d.ts +4 -0
- package/dist/components/datagrid/grid-action-location.d.ts +2 -0
- package/dist/components/datagrid/grid-action-ran-event-args.d.ts +17 -0
- package/dist/components/datagrid/grid-action-run.d.ts +10 -0
- package/dist/components/datagrid/grid-action-running-event-args.d.ts +13 -0
- package/dist/components/datagrid/grid-action.d.ts +55 -0
- package/dist/components/datagrid/grid-adaptive-detail-row-preparing-event-args.d.ts +14 -0
- package/dist/components/datagrid/grid-adaptive-detail.d.ts +25 -0
- package/dist/components/datagrid/grid-adaptive-form-options.d.ts +10 -0
- package/dist/components/datagrid/grid-adaptive-row-expanded-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-adaptive-row-expanding-event-args.d.ts +8 -0
- package/dist/components/datagrid/grid-band.d.ts +38 -0
- package/dist/components/datagrid/grid-bar-action.d.ts +14 -0
- package/dist/components/datagrid/grid-built-in-actions.d.ts +14 -0
- package/dist/components/datagrid/grid-cell-click-event-args.d.ts +16 -0
- package/dist/components/datagrid/grid-cell-extend-keys.d.ts +22 -0
- package/dist/components/datagrid/grid-cell-point.d.ts +10 -0
- package/dist/components/datagrid/grid-cell-prepared-event-args.d.ts +13 -0
- package/dist/components/datagrid/grid-cell-range.d.ts +11 -0
- package/dist/components/datagrid/grid-cell-selection-changed-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-cell-selection-changing-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-cell-summary-item.d.ts +2 -0
- package/dist/components/datagrid/grid-cell-summary.d.ts +14 -0
- package/dist/components/datagrid/grid-cell-value.d.ts +9 -0
- package/dist/components/datagrid/grid-changes.d.ts +10 -0
- package/dist/components/datagrid/grid-column-form-item.d.ts +16 -0
- package/dist/components/datagrid/grid-column-item.d.ts +4 -0
- package/dist/components/datagrid/grid-column.d.ts +190 -0
- package/dist/components/datagrid/grid-content-ready-event-args.d.ts +5 -0
- package/dist/components/datagrid/grid-context-menu-preparing-event-args.d.ts +15 -0
- package/dist/components/datagrid/grid-copying-event-args.d.ts +13 -0
- package/dist/components/datagrid/grid-custom-summary-info.d.ts +17 -0
- package/dist/components/datagrid/grid-data-error-event-args.d.ts +8 -0
- package/dist/components/datagrid/grid-date-interval.d.ts +2 -0
- package/dist/components/datagrid/grid-edit-canceled-event-args.d.ts +4 -0
- package/dist/components/datagrid/grid-edit-canceling-event-args.d.ts +8 -0
- package/dist/components/datagrid/grid-edit-form.d.ts +22 -0
- package/dist/components/datagrid/grid-edit-popup.d.ts +22 -0
- package/dist/components/datagrid/grid-editing-cell.d.ts +6 -0
- package/dist/components/datagrid/grid-editing-start-event-args.d.ts +14 -0
- package/dist/components/datagrid/grid-editor-prepared-event-args.d.ts +18 -0
- package/dist/components/datagrid/grid-editor-preparing-event-args.d.ts +19 -0
- package/dist/components/datagrid/grid-export-cell.d.ts +26 -0
- package/dist/components/datagrid/grid-export-options.d.ts +35 -0
- package/dist/components/datagrid/grid-export-settings.d.ts +19 -0
- package/dist/components/datagrid/grid-export-texts.d.ts +11 -0
- package/dist/components/datagrid/grid-exported-event-args.d.ts +8 -0
- package/dist/components/datagrid/grid-exporting-event-args.d.ts +17 -0
- package/dist/components/datagrid/grid-filter-builder-closed-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-filter-builder-closing-event-args.d.ts +10 -0
- package/dist/components/datagrid/grid-filter-builder-opened-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-filter-builder-opening-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-filter-builder-options.d.ts +7 -0
- package/dist/components/datagrid/grid-filter-builder-popup.d.ts +22 -0
- package/dist/components/datagrid/grid-filter-changed-event-args.d.ts +12 -0
- package/dist/components/datagrid/grid-filter-changing-event-args.d.ts +15 -0
- package/dist/components/datagrid/grid-filter-operator.d.ts +2 -0
- package/dist/components/datagrid/grid-filter-panel-text-info.d.ts +6 -0
- package/dist/components/datagrid/grid-filter-value.d.ts +9 -0
- package/dist/components/datagrid/grid-filters.d.ts +3 -0
- package/dist/components/datagrid/grid-focused-cell-changed-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-focused-cell-changing-event-args.d.ts +13 -0
- package/dist/components/datagrid/grid-focused-row-changed-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-focused-row-changing-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-group-dropping-event-args.d.ts +11 -0
- package/dist/components/datagrid/grid-group-summary-item.d.ts +12 -0
- package/dist/components/datagrid/grid-grouping-changed-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-grouping-changing-event-args.d.ts +10 -0
- package/dist/components/datagrid/grid-header-filter-interval.d.ts +7 -0
- package/dist/components/datagrid/grid-header-filter-items-request.d.ts +12 -0
- package/dist/components/datagrid/grid-header-filter-items.d.ts +7 -0
- package/dist/components/datagrid/grid-init-new-row-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-key-handling-event-args.d.ts +11 -0
- package/dist/components/datagrid/grid-layout-changing-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-layout.d.ts +16 -0
- package/dist/components/datagrid/grid-load-panel.d.ts +11 -0
- package/dist/components/datagrid/grid-lookup.d.ts +47 -0
- package/dist/components/datagrid/grid-master-detail.d.ts +38 -0
- package/dist/components/datagrid/grid-mode.d.ts +2 -0
- package/dist/components/datagrid/grid-more-rows-loaded-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-more-rows-loading-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-option-changed-event-args.d.ts +14 -0
- package/dist/components/datagrid/grid-page-changed-event-args.d.ts +5 -0
- package/dist/components/datagrid/grid-page-changing-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-page-size-changed-event-args.d.ts +5 -0
- package/dist/components/datagrid/grid-page-size-changing-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-pasting-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-row-click-event-args.d.ts +13 -0
- package/dist/components/datagrid/grid-row-drag-event-args.d.ts +36 -0
- package/dist/components/datagrid/grid-row-dragging.d.ts +71 -0
- package/dist/components/datagrid/grid-row-drop-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-row-expanded-event-args.d.ts +10 -0
- package/dist/components/datagrid/grid-row-expanding-event-args.d.ts +15 -0
- package/dist/components/datagrid/grid-row-extend-keys.d.ts +7 -0
- package/dist/components/datagrid/grid-row-inserted-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-row-inserting-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-row-prepared-event-args.d.ts +14 -0
- package/dist/components/datagrid/grid-row-removed-event-args.d.ts +5 -0
- package/dist/components/datagrid/grid-row-removing-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-row-type.d.ts +2 -0
- package/dist/components/datagrid/grid-row-updated-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-row-updating-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-row-validating-event-args.d.ts +22 -0
- package/dist/components/datagrid/grid-saved-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-saving-event-args.d.ts +10 -0
- package/dist/components/datagrid/grid-search-text-changed-event-args.d.ts +4 -0
- package/dist/components/datagrid/grid-search-text-changing-event-args.d.ts +6 -0
- package/dist/components/datagrid/grid-selection-changed-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-selection-changing-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-selection.d.ts +16 -0
- package/dist/components/datagrid/grid-settings-props.d.ts +6 -0
- package/dist/components/datagrid/grid-settings.d.ts +354 -0
- package/dist/components/datagrid/grid-sheet-cell.d.ts +9 -0
- package/dist/components/datagrid/grid-sheet-column.d.ts +14 -0
- package/dist/components/datagrid/grid-sheet-merge.d.ts +9 -0
- package/dist/components/datagrid/grid-sheet-options.d.ts +24 -0
- package/dist/components/datagrid/grid-sheet-row.d.ts +8 -0
- package/dist/components/datagrid/grid-sheet.d.ts +24 -0
- package/dist/components/datagrid/grid-sort-changed-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-sort-changing-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-state-value.d.ts +19 -0
- package/dist/components/datagrid/grid-summary-changed-event-args.d.ts +7 -0
- package/dist/components/datagrid/grid-summary-item.d.ts +37 -0
- package/dist/components/datagrid/grid-summary-text-info.d.ts +7 -0
- package/dist/components/datagrid/grid-summary-texts.d.ts +15 -0
- package/dist/components/datagrid/grid-summary-type.d.ts +2 -0
- package/dist/components/datagrid/grid-summary-value.d.ts +10 -0
- package/dist/components/datagrid/grid-summary.d.ts +25 -0
- package/dist/components/datagrid/grid-toolbar-item-click-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-toolbar-item-name.d.ts +6 -0
- package/dist/components/datagrid/grid-toolbar-item.d.ts +34 -0
- package/dist/components/datagrid/grid-toolbar-preparing-event-args.d.ts +9 -0
- package/dist/components/datagrid/grid-toolbar.d.ts +15 -0
- package/dist/components/datagrid/grid-validation-callback-args.d.ts +13 -0
- package/dist/components/datagrid/grid-validation-rule.d.ts +74 -0
- package/dist/components/datagrid/grid-values-request.d.ts +13 -0
- package/dist/components/datagrid/grid-values-result.d.ts +6 -0
- package/dist/components/datagrid/grid-visible-row.d.ts +12 -0
- package/dist/components/datagrid/group-cell-context.d.ts +22 -0
- package/dist/components/datagrid/header-cell-context.d.ts +9 -0
- package/dist/components/datagrid/index.d.ts +161 -0
- package/dist/components/datagrid/layout-storage.d.ts +6 -0
- package/dist/components/datagrid/list-option.d.ts +5 -0
- package/dist/components/datagrid/model/ActionRunner.d.ts +28 -0
- package/dist/components/datagrid/model/ActionSets.d.ts +64 -0
- package/dist/components/datagrid/model/AdaptiveRow.d.ts +24 -0
- package/dist/components/datagrid/model/CellFormatter.d.ts +41 -0
- package/dist/components/datagrid/model/CellRanges.d.ts +88 -0
- package/dist/components/datagrid/model/CellRules.d.ts +34 -0
- package/dist/components/datagrid/model/ColumnModel.d.ts +251 -0
- package/dist/components/datagrid/model/ColumnWindow.d.ts +32 -0
- package/dist/components/datagrid/model/DetailRows.d.ts +42 -0
- package/dist/components/datagrid/model/ExtraHeights.d.ts +33 -0
- package/dist/components/datagrid/model/FilterModel.d.ts +113 -0
- package/dist/components/datagrid/model/FilterValues.d.ts +47 -0
- package/dist/components/datagrid/model/GridClipboard.d.ts +42 -0
- package/dist/components/datagrid/model/GridData.d.ts +193 -0
- package/dist/components/datagrid/model/GridEvents.d.ts +157 -0
- package/dist/components/datagrid/model/GridExport.d.ts +70 -0
- package/dist/components/datagrid/model/GridGroups.d.ts +61 -0
- package/dist/components/datagrid/model/GridModel.d.ts +475 -0
- package/dist/components/datagrid/model/GridNotices.d.ts +22 -0
- package/dist/components/datagrid/model/GridRowsAdapter.d.ts +19 -0
- package/dist/components/datagrid/model/GridSearch.d.ts +68 -0
- package/dist/components/datagrid/model/GridSummaries.d.ts +91 -0
- package/dist/components/datagrid/model/GroupView.d.ts +40 -0
- package/dist/components/datagrid/model/LayoutStore.d.ts +16 -0
- package/dist/components/datagrid/model/LiveOptions.d.ts +15 -0
- package/dist/components/datagrid/model/LookupTexts.d.ts +72 -0
- package/dist/components/datagrid/model/LookupValues.d.ts +23 -0
- package/dist/components/datagrid/model/RowDragOptions.d.ts +28 -0
- package/dist/components/datagrid/model/RowSelection.d.ts +86 -0
- package/dist/components/datagrid/model/ScrollGeometry.d.ts +84 -0
- package/dist/components/datagrid/model/Switches.d.ts +36 -0
- package/dist/components/datagrid/model/ValueIntervals.d.ts +27 -0
- package/dist/components/datagrid/model/ValueListAdapter.d.ts +17 -0
- package/dist/components/datagrid/model/action-entry.d.ts +22 -0
- package/dist/components/datagrid/model/action-target.d.ts +16 -0
- package/dist/components/datagrid/model/adaptive-detail-values.d.ts +11 -0
- package/dist/components/datagrid/model/added-row.d.ts +6 -0
- package/dist/components/datagrid/model/adjustment.d.ts +10 -0
- package/dist/components/datagrid/model/band-node.d.ts +8 -0
- package/dist/components/datagrid/model/builder-fields.d.ts +10 -0
- package/dist/components/datagrid/model/cell-corner.d.ts +8 -0
- package/dist/components/datagrid/model/cell-range-entry.d.ts +7 -0
- package/dist/components/datagrid/model/cell-value.d.ts +3 -0
- package/dist/components/datagrid/model/clipboard-content.d.ts +11 -0
- package/dist/components/datagrid/model/column-feature-names.d.ts +2 -0
- package/dist/components/datagrid/model/column-zone.d.ts +3 -0
- package/dist/components/datagrid/model/data-state.d.ts +11 -0
- package/dist/components/datagrid/model/date-like.d.ts +2 -0
- package/dist/components/datagrid/model/day-condition.d.ts +6 -0
- package/dist/components/datagrid/model/default-settings.d.ts +2 -0
- package/dist/components/datagrid/model/delimited-text.d.ts +4 -0
- package/dist/components/datagrid/model/export-table.d.ts +20 -0
- package/dist/components/datagrid/model/filter-tree-node.d.ts +11 -0
- package/dist/components/datagrid/model/filter-value-state.d.ts +8 -0
- package/dist/components/datagrid/model/formula-guard.d.ts +2 -0
- package/dist/components/datagrid/model/grid-data-options.d.ts +42 -0
- package/dist/components/datagrid/model/grid-state.d.ts +41 -0
- package/dist/components/datagrid/model/group-item-entry.d.ts +11 -0
- package/dist/components/datagrid/model/group-level.d.ts +12 -0
- package/dist/components/datagrid/model/group-node.d.ts +21 -0
- package/dist/components/datagrid/model/group-nodes.d.ts +7 -0
- package/dist/components/datagrid/model/html-table.d.ts +2 -0
- package/dist/components/datagrid/model/list-separator.d.ts +2 -0
- package/dist/components/datagrid/model/lookup-cell.d.ts +7 -0
- package/dist/components/datagrid/model/master-detail-values.d.ts +16 -0
- package/dist/components/datagrid/model/nothing-entered.d.ts +3 -0
- package/dist/components/datagrid/model/option-of.d.ts +6 -0
- package/dist/components/datagrid/model/parse-date-text.d.ts +6 -0
- package/dist/components/datagrid/model/paste-result.d.ts +9 -0
- package/dist/components/datagrid/model/placed-item.d.ts +19 -0
- package/dist/components/datagrid/model/range-box.d.ts +8 -0
- package/dist/components/datagrid/model/range-look.d.ts +18 -0
- package/dist/components/datagrid/model/read-field.d.ts +5 -0
- package/dist/components/datagrid/model/row-dragging-values.d.ts +24 -0
- package/dist/components/datagrid/model/row-run.d.ts +2 -0
- package/dist/components/datagrid/model/row-status.d.ts +2 -0
- package/dist/components/datagrid/model/rows-sorting.d.ts +7 -0
- package/dist/components/datagrid/model/run-panel.d.ts +7 -0
- package/dist/components/datagrid/model/same-value.d.ts +2 -0
- package/dist/components/datagrid/model/sticky-offset.d.ts +8 -0
- package/dist/components/datagrid/model/stored-layout.d.ts +15 -0
- package/dist/components/datagrid/model/summary-part.d.ts +7 -0
- package/dist/components/datagrid/model/text-ranges.d.ts +6 -0
- package/dist/components/datagrid/model/value-list.d.ts +12 -0
- package/dist/components/datagrid/model/value-loader.d.ts +8 -0
- package/dist/components/datagrid/new-row-options.d.ts +8 -0
- package/dist/components/datagrid/row-change.d.ts +7 -0
- package/dist/components/datagrid/row-state.d.ts +17 -0
- package/dist/components/datagrid/selection-mode.d.ts +2 -0
- package/dist/components/datagrid/sticky-side.d.ts +2 -0
- package/dist/components/datagrid/view/ActionWidths.d.ts +23 -0
- package/dist/components/datagrid/view/AdaptiveForm.d.ts +38 -0
- package/dist/components/datagrid/view/BandRows.d.ts +43 -0
- package/dist/components/datagrid/view/BarButtons.d.ts +53 -0
- package/dist/components/datagrid/view/CellEditor.d.ts +83 -0
- package/dist/components/datagrid/view/CellTip.d.ts +24 -0
- package/dist/components/datagrid/view/ColumnMenu.d.ts +59 -0
- package/dist/components/datagrid/view/ColumnStyles.d.ts +31 -0
- package/dist/components/datagrid/view/DetailRow.d.ts +56 -0
- package/dist/components/datagrid/view/DragSelect.d.ts +50 -0
- package/dist/components/datagrid/view/EditForm.d.ts +59 -0
- package/dist/components/datagrid/view/FilterBuilderWindow.d.ts +26 -0
- package/dist/components/datagrid/view/FilterCell.d.ts +42 -0
- package/dist/components/datagrid/view/FilterPanel.d.ts +21 -0
- package/dist/components/datagrid/view/FilterRow.d.ts +29 -0
- package/dist/components/datagrid/view/GridBody.d.ts +216 -0
- package/dist/components/datagrid/view/GridPager.d.ts +69 -0
- package/dist/components/datagrid/view/GridRow.d.ts +95 -0
- package/dist/components/datagrid/view/GridToolbar.d.ts +79 -0
- package/dist/components/datagrid/view/GroupFooterRow.d.ts +32 -0
- package/dist/components/datagrid/view/GroupPanel.d.ts +41 -0
- package/dist/components/datagrid/view/GroupRow.d.ts +62 -0
- package/dist/components/datagrid/view/HeaderFilter.d.ts +55 -0
- package/dist/components/datagrid/view/HeaderRow.d.ts +72 -0
- package/dist/components/datagrid/view/MenuPopup.d.ts +19 -0
- package/dist/components/datagrid/view/RowActions.d.ts +30 -0
- package/dist/components/datagrid/view/RowDrag.d.ts +79 -0
- package/dist/components/datagrid/view/TotalRow.d.ts +28 -0
- package/dist/components/datagrid/view/action-button.d.ts +10 -0
- package/dist/components/datagrid/view/adaptive-form-host.d.ts +8 -0
- package/dist/components/datagrid/view/check-mark.d.ts +4 -0
- package/dist/components/datagrid/view/column-node.d.ts +7 -0
- package/dist/components/datagrid/view/detail-host.d.ts +12 -0
- package/dist/components/datagrid/view/drag-handle.d.ts +2 -0
- package/dist/components/datagrid/view/drag-select-host.d.ts +20 -0
- package/dist/components/datagrid/view/drop-place.d.ts +16 -0
- package/dist/components/datagrid/view/edit-form-host.d.ts +11 -0
- package/dist/components/datagrid/view/editor-host.d.ts +7 -0
- package/dist/components/datagrid/view/editor-kind.d.ts +2 -0
- package/dist/components/datagrid/view/editor-value.d.ts +8 -0
- package/dist/components/datagrid/view/expand-button.d.ts +4 -0
- package/dist/components/datagrid/view/export-command.d.ts +8 -0
- package/dist/components/datagrid/view/export-values.d.ts +7 -0
- package/dist/components/datagrid/view/filter-builder-window-host.d.ts +15 -0
- package/dist/components/datagrid/view/filter-panel-host.d.ts +8 -0
- package/dist/components/datagrid/view/form-values.d.ts +9 -0
- package/dist/components/datagrid/view/ghost-target.d.ts +2 -0
- package/dist/components/datagrid/view/group-panel-host.d.ts +15 -0
- package/dist/components/datagrid/view/header-host.d.ts +24 -0
- package/dist/components/datagrid/view/next-frame.d.ts +4 -0
- package/dist/components/datagrid/view/operator-texts.d.ts +6 -0
- package/dist/components/datagrid/view/pager-host.d.ts +11 -0
- package/dist/components/datagrid/view/place-in-order.d.ts +6 -0
- package/dist/components/datagrid/view/popup-values.d.ts +12 -0
- package/dist/components/datagrid/view/resolved-action.d.ts +16 -0
- package/dist/components/datagrid/view/row-drag-host.d.ts +14 -0
- package/dist/components/datagrid/view/row-drop-place.d.ts +15 -0
- package/dist/components/datagrid/view/row-notices.d.ts +14 -0
- package/dist/components/datagrid/view/summary-cell.d.ts +8 -0
- package/dist/components/datagrid/view/toolbar-host.d.ts +32 -0
- package/dist/components/datagrid/view/toolbar-values.d.ts +7 -0
- package/dist/components/datebox/DateBox.d.ts +77 -0
- package/dist/components/datebox/date-box-props.d.ts +26 -0
- package/dist/components/datebox/index.d.ts +2 -0
- package/dist/components/drawer/Drawer.d.ts +68 -0
- package/dist/components/drawer/drawer-mode.d.ts +2 -0
- package/dist/components/drawer/drawer-props.d.ts +23 -0
- package/dist/components/drawer/drawer-side.d.ts +2 -0
- package/dist/components/drawer/index.d.ts +4 -0
- package/dist/components/dropdown/DropDown.d.ts +96 -0
- package/dist/components/dropdown/drop-down-item.d.ts +10 -0
- package/dist/components/dropdown/drop-down-props.d.ts +36 -0
- package/dist/components/dropdown/index.d.ts +3 -0
- package/dist/components/filterbuilder/FilterBuilder.d.ts +158 -0
- package/dist/components/filterbuilder/FilterBuilderModel.d.ts +79 -0
- package/dist/components/filterbuilder/default-operations.d.ts +4 -0
- package/dist/components/filterbuilder/filter-builder-condition.d.ts +12 -0
- package/dist/components/filterbuilder/filter-builder-custom-operation.d.ts +35 -0
- package/dist/components/filterbuilder/filter-builder-data-type.d.ts +2 -0
- package/dist/components/filterbuilder/filter-builder-editor-context.d.ts +15 -0
- package/dist/components/filterbuilder/filter-builder-editor-prepared-event-args.d.ts +14 -0
- package/dist/components/filterbuilder/filter-builder-editor-preparing-event-args.d.ts +21 -0
- package/dist/components/filterbuilder/filter-builder-field.d.ts +39 -0
- package/dist/components/filterbuilder/filter-builder-group-operation.d.ts +2 -0
- package/dist/components/filterbuilder/filter-builder-group.d.ts +10 -0
- package/dist/components/filterbuilder/filter-builder-item-added-event-args.d.ts +10 -0
- package/dist/components/filterbuilder/filter-builder-item-adding-event-args.d.ts +11 -0
- package/dist/components/filterbuilder/filter-builder-item-change.d.ts +2 -0
- package/dist/components/filterbuilder/filter-builder-item-changed-event-args.d.ts +11 -0
- package/dist/components/filterbuilder/filter-builder-item-changing-event-args.d.ts +13 -0
- package/dist/components/filterbuilder/filter-builder-item-removed-event-args.d.ts +10 -0
- package/dist/components/filterbuilder/filter-builder-item-removing-event-args.d.ts +11 -0
- package/dist/components/filterbuilder/filter-builder-item.d.ts +3 -0
- package/dist/components/filterbuilder/filter-builder-lookup.d.ts +13 -0
- package/dist/components/filterbuilder/filter-builder-model-options.d.ts +14 -0
- package/dist/components/filterbuilder/filter-builder-operation.d.ts +3 -0
- package/dist/components/filterbuilder/filter-builder-props.d.ts +57 -0
- package/dist/components/filterbuilder/filter-builder-value-changed-event-args.d.ts +9 -0
- package/dist/components/filterbuilder/filter-builder-value-info.d.ts +7 -0
- package/dist/components/filterbuilder/filter-text.d.ts +8 -0
- package/dist/components/filterbuilder/index.d.ts +27 -0
- package/dist/components/form/MxForm.d.ts +195 -0
- package/dist/components/form/confirm.d.ts +10 -0
- package/dist/components/form/form-close-reason.d.ts +2 -0
- package/dist/components/form/form-closed-event-args.d.ts +8 -0
- package/dist/components/form/form-closing-event-args.d.ts +10 -0
- package/dist/components/form/form-event-args.d.ts +5 -0
- package/dist/components/form/form-host.d.ts +3 -0
- package/dist/components/form/form-props.d.ts +68 -0
- package/dist/components/form/form-result.d.ts +2 -0
- package/dist/components/form/form-start-position.d.ts +2 -0
- package/dist/components/form/form-window-state.d.ts +1 -0
- package/dist/components/form/index.d.ts +15 -0
- package/dist/components/form/message-box-button.d.ts +10 -0
- package/dist/components/form/message-box-options.d.ts +18 -0
- package/dist/components/form/message-box-tone.d.ts +2 -0
- package/dist/components/form/message-box.d.ts +10 -0
- package/dist/components/formlayout/FormLayout.d.ts +78 -0
- package/dist/components/formlayout/form-editor-factory.d.ts +3 -0
- package/dist/components/formlayout/form-editor-type.d.ts +2 -0
- package/dist/components/formlayout/form-item.d.ts +44 -0
- package/dist/components/formlayout/form-layout-props.d.ts +31 -0
- package/dist/components/formlayout/form-tab.d.ts +9 -0
- package/dist/components/formlayout/form-template-context.d.ts +9 -0
- package/dist/components/formlayout/index.d.ts +7 -0
- package/dist/components/layout/ChildSettings.d.ts +41 -0
- package/dist/components/layout/DockPanel.d.ts +42 -0
- package/dist/components/layout/Grid.d.ts +57 -0
- package/dist/components/layout/GroupBox.d.ts +54 -0
- package/dist/components/layout/Panel.d.ts +28 -0
- package/dist/components/layout/SplitContainer.d.ts +86 -0
- package/dist/components/layout/Stack.d.ts +45 -0
- package/dist/components/layout/dock-child-props.d.ts +16 -0
- package/dist/components/layout/dock-panel-props.d.ts +10 -0
- package/dist/components/layout/dock.d.ts +6 -0
- package/dist/components/layout/grid-cell.d.ts +11 -0
- package/dist/components/layout/grid-flow.d.ts +2 -0
- package/dist/components/layout/grid-justify.d.ts +2 -0
- package/dist/components/layout/grid-props.d.ts +34 -0
- package/dist/components/layout/grid-tracks.d.ts +5 -0
- package/dist/components/layout/group-box-props.d.ts +22 -0
- package/dist/components/layout/group-box-toggled-event-args.d.ts +7 -0
- package/dist/components/layout/group-box-variant.d.ts +2 -0
- package/dist/components/layout/index.d.ts +33 -0
- package/dist/components/layout/layout-align.d.ts +2 -0
- package/dist/components/layout/layout-orientation.d.ts +2 -0
- package/dist/components/layout/layout-space.d.ts +5 -0
- package/dist/components/layout/panel-props.d.ts +17 -0
- package/dist/components/layout/panel-scroll.d.ts +2 -0
- package/dist/components/layout/panel-variant.d.ts +2 -0
- package/dist/components/layout/set-padding.d.ts +6 -0
- package/dist/components/layout/set-space.d.ts +3 -0
- package/dist/components/layout/space-value.d.ts +3 -0
- package/dist/components/layout/split-container-props.d.ts +34 -0
- package/dist/components/layout/split-panel.d.ts +2 -0
- package/dist/components/layout/split-position.d.ts +2 -0
- package/dist/components/layout/splitter-moved-event-args.d.ts +10 -0
- package/dist/components/layout/stack-child-props.d.ts +6 -0
- package/dist/components/layout/stack-justify.d.ts +2 -0
- package/dist/components/layout/stack-props.d.ts +25 -0
- package/dist/components/layout/track-list.d.ts +3 -0
- package/dist/components/listbox/ListBox.d.ts +112 -0
- package/dist/components/listbox/all-values.d.ts +7 -0
- package/dist/components/listbox/index.d.ts +4 -0
- package/dist/components/listbox/item-template.d.ts +2 -0
- package/dist/components/listbox/list-box-props.d.ts +38 -0
- package/dist/components/listbox/list-rows.d.ts +12 -0
- package/dist/components/listbox/list-selection-mode.d.ts +2 -0
- package/dist/components/listbox/select-all-row.d.ts +5 -0
- package/dist/components/listbox/select-all-state.d.ts +3 -0
- package/dist/components/listbox/value-items.d.ts +21 -0
- package/dist/components/lookup/Lookup.d.ts +33 -0
- package/dist/components/lookup/index.d.ts +3 -0
- package/dist/components/lookup/lookup-column.d.ts +11 -0
- package/dist/components/lookup/lookup-props.d.ts +12 -0
- package/dist/components/menubar/MenuBar.d.ts +59 -0
- package/dist/components/menubar/index.d.ts +2 -0
- package/dist/components/menubar/menu-bar-props.d.ts +17 -0
- package/dist/components/numberbox/NumberBox.d.ts +115 -0
- package/dist/components/numberbox/decimal-math.d.ts +7 -0
- package/dist/components/numberbox/index.d.ts +3 -0
- package/dist/components/numberbox/number-box-props.d.ts +44 -0
- package/dist/components/numberbox/number-text.d.ts +12 -0
- package/dist/components/numberbox/spin-layout.d.ts +2 -0
- package/dist/components/pagination/Pagination.d.ts +92 -0
- package/dist/components/pagination/index.d.ts +4 -0
- package/dist/components/pagination/page-changed-event-args.d.ts +10 -0
- package/dist/components/pagination/pagination-mode.d.ts +2 -0
- package/dist/components/pagination/pagination-props.d.ts +32 -0
- package/dist/components/progress/ProgressBar.d.ts +67 -0
- package/dist/components/progress/ProgressWave.d.ts +53 -0
- package/dist/components/progress/Spinner.d.ts +50 -0
- package/dist/components/progress/index.d.ts +8 -0
- package/dist/components/progress/progress-bar-props.d.ts +33 -0
- package/dist/components/progress/progress-label-position.d.ts +2 -0
- package/dist/components/progress/progress-shape.d.ts +2 -0
- package/dist/components/progress/progress-tone.d.ts +2 -0
- package/dist/components/progress/spinner-label-position.d.ts +2 -0
- package/dist/components/progress/spinner-props.d.ts +20 -0
- package/dist/components/progress/wave-geometry.d.ts +19 -0
- package/dist/components/radiogroup/RadioGroup.d.ts +73 -0
- package/dist/components/radiogroup/index.d.ts +4 -0
- package/dist/components/radiogroup/radio-group-orientation.d.ts +2 -0
- package/dist/components/radiogroup/radio-group-props.d.ts +20 -0
- package/dist/components/radiogroup/radio-item.d.ts +15 -0
- package/dist/components/rating/Rating.d.ts +52 -0
- package/dist/components/rating/index.d.ts +3 -0
- package/dist/components/rating/rating-props.d.ts +20 -0
- package/dist/components/rating/rating-tone.d.ts +2 -0
- package/dist/components/scheduler/AppointmentEditor.d.ts +232 -0
- package/dist/components/scheduler/RecurrenceEditor.d.ts +66 -0
- package/dist/components/scheduler/Scheduler.d.ts +515 -0
- package/dist/components/scheduler/agenda-row-context.d.ts +15 -0
- package/dist/components/scheduler/appointment-added-event-args.d.ts +7 -0
- package/dist/components/scheduler/appointment-adding-event-args.d.ts +10 -0
- package/dist/components/scheduler/appointment-click-event-args.d.ts +13 -0
- package/dist/components/scheduler/appointment-deleted-event-args.d.ts +9 -0
- package/dist/components/scheduler/appointment-deleting-event-args.d.ts +13 -0
- package/dist/components/scheduler/appointment-form-context.d.ts +11 -0
- package/dist/components/scheduler/appointment-form-data.d.ts +10 -0
- package/dist/components/scheduler/appointment-template-context.d.ts +15 -0
- package/dist/components/scheduler/appointment-updated-event-args.d.ts +12 -0
- package/dist/components/scheduler/appointment-updating-event-args.d.ts +15 -0
- package/dist/components/scheduler/cell-click-event-args.d.ts +9 -0
- package/dist/components/scheduler/cell-template-context.d.ts +16 -0
- package/dist/components/scheduler/content-ready-event-args.d.ts +9 -0
- package/dist/components/scheduler/data-error-event-args.d.ts +16 -0
- package/dist/components/scheduler/date-changed-event-args.d.ts +10 -0
- package/dist/components/scheduler/date-changing-event-args.d.ts +9 -0
- package/dist/components/scheduler/date-template-context.d.ts +13 -0
- package/dist/components/scheduler/drag-event-args.d.ts +21 -0
- package/dist/components/scheduler/form-bind.d.ts +4 -0
- package/dist/components/scheduler/form-items.d.ts +10 -0
- package/dist/components/scheduler/form-opening-event-args.d.ts +20 -0
- package/dist/components/scheduler/icalendar-export-options.d.ts +10 -0
- package/dist/components/scheduler/icalendar-exported-event-args.d.ts +6 -0
- package/dist/components/scheduler/icalendar-exporting-event-args.d.ts +10 -0
- package/dist/components/scheduler/icalendar-import-result.d.ts +6 -0
- package/dist/components/scheduler/icalendar-imported-event-args.d.ts +5 -0
- package/dist/components/scheduler/icalendar-importing-event-args.d.ts +8 -0
- package/dist/components/scheduler/index.d.ts +73 -0
- package/dist/components/scheduler/model/AppointmentStore.d.ts +27 -0
- package/dist/components/scheduler/model/ICalendarBridge.d.ts +44 -0
- package/dist/components/scheduler/model/Occurrences.d.ts +39 -0
- package/dist/components/scheduler/model/RecurrenceDraft.d.ts +56 -0
- package/dist/components/scheduler/model/ResourceKind.d.ts +35 -0
- package/dist/components/scheduler/model/Resources.d.ts +53 -0
- package/dist/components/scheduler/model/SchedulerModel.d.ts +377 -0
- package/dist/components/scheduler/model/SeriesEdit.d.ts +49 -0
- package/dist/components/scheduler/model/SeriesWriter.d.ts +18 -0
- package/dist/components/scheduler/model/agenda-day.d.ts +14 -0
- package/dist/components/scheduler/model/agenda-piece.d.ts +21 -0
- package/dist/components/scheduler/model/any-piece.d.ts +6 -0
- package/dist/components/scheduler/model/blocked-spans.d.ts +14 -0
- package/dist/components/scheduler/model/cell-place.d.ts +5 -0
- package/dist/components/scheduler/model/column-edge.d.ts +2 -0
- package/dist/components/scheduler/model/day-block.d.ts +6 -0
- package/dist/components/scheduler/model/draft.d.ts +15 -0
- package/dist/components/scheduler/model/group-resource.d.ts +8 -0
- package/dist/components/scheduler/model/header-cell.d.ts +16 -0
- package/dist/components/scheduler/model/header-row.d.ts +8 -0
- package/dist/components/scheduler/model/line-piece.d.ts +29 -0
- package/dist/components/scheduler/model/make-groups.d.ts +14 -0
- package/dist/components/scheduler/model/occurrence-info.d.ts +8 -0
- package/dist/components/scheduler/model/overlap-mode.d.ts +2 -0
- package/dist/components/scheduler/model/place-lanes.d.ts +10 -0
- package/dist/components/scheduler/model/place-stack.d.ts +17 -0
- package/dist/components/scheduler/model/place-timed.d.ts +18 -0
- package/dist/components/scheduler/model/range-filter-options.d.ts +8 -0
- package/dist/components/scheduler/model/range-filter.d.ts +13 -0
- package/dist/components/scheduler/model/resolved-view.d.ts +23 -0
- package/dist/components/scheduler/model/resource-entry.d.ts +5 -0
- package/dist/components/scheduler/model/same-value.d.ts +2 -0
- package/dist/components/scheduler/model/scale-cell.d.ts +14 -0
- package/dist/components/scheduler/model/scheduler-column.d.ts +21 -0
- package/dist/components/scheduler/model/scheduler-day.d.ts +21 -0
- package/dist/components/scheduler/model/scheduler-group.d.ts +14 -0
- package/dist/components/scheduler/model/scrolling-mode.d.ts +5 -0
- package/dist/components/scheduler/model/series-plan.d.ts +9 -0
- package/dist/components/scheduler/model/series-run.d.ts +14 -0
- package/dist/components/scheduler/model/series-scope.d.ts +2 -0
- package/dist/components/scheduler/model/series-write.d.ts +8 -0
- package/dist/components/scheduler/model/strip-piece.d.ts +29 -0
- package/dist/components/scheduler/model/strip-row.d.ts +17 -0
- package/dist/components/scheduler/model/time-slot.d.ts +8 -0
- package/dist/components/scheduler/model/time-tick.d.ts +14 -0
- package/dist/components/scheduler/model/timed-piece.d.ts +31 -0
- package/dist/components/scheduler/model/timeline-row.d.ts +27 -0
- package/dist/components/scheduler/model/to-date.d.ts +2 -0
- package/dist/components/scheduler/model/view-dates.d.ts +7 -0
- package/dist/components/scheduler/model/view-kind.d.ts +6 -0
- package/dist/components/scheduler/more-list-context.d.ts +7 -0
- package/dist/components/scheduler/more-opening-event-args.d.ts +8 -0
- package/dist/components/scheduler/presentation-changed-event-args.d.ts +8 -0
- package/dist/components/scheduler/presentation-changing-event-args.d.ts +11 -0
- package/dist/components/scheduler/printed-event-args.d.ts +5 -0
- package/dist/components/scheduler/printing-event-args.d.ts +6 -0
- package/dist/components/scheduler/recurrence-editor-props.d.ts +30 -0
- package/dist/components/scheduler/resource-header-context.d.ts +17 -0
- package/dist/components/scheduler/scheduler-blocked-time.d.ts +16 -0
- package/dist/components/scheduler/scheduler-cell.d.ts +9 -0
- package/dist/components/scheduler/scheduler-editing.d.ts +24 -0
- package/dist/components/scheduler/scheduler-fields.d.ts +39 -0
- package/dist/components/scheduler/scheduler-form-item.d.ts +27 -0
- package/dist/components/scheduler/scheduler-form-tab.d.ts +9 -0
- package/dist/components/scheduler/scheduler-form.d.ts +26 -0
- package/dist/components/scheduler/scheduler-keys.d.ts +22 -0
- package/dist/components/scheduler/scheduler-presentation-kind.d.ts +2 -0
- package/dist/components/scheduler/scheduler-presentation.d.ts +2 -0
- package/dist/components/scheduler/scheduler-props.d.ts +210 -0
- package/dist/components/scheduler/scheduler-range.d.ts +5 -0
- package/dist/components/scheduler/scheduler-resource.d.ts +33 -0
- package/dist/components/scheduler/scheduler-tablet-when.d.ts +2 -0
- package/dist/components/scheduler/scheduler-templates.d.ts +34 -0
- package/dist/components/scheduler/scheduler-time-check.d.ts +19 -0
- package/dist/components/scheduler/scheduler-view-type.d.ts +6 -0
- package/dist/components/scheduler/scheduler-view.d.ts +33 -0
- package/dist/components/scheduler/selection-changed-event-args.d.ts +7 -0
- package/dist/components/scheduler/series-action.d.ts +2 -0
- package/dist/components/scheduler/series-answered-event-args.d.ts +12 -0
- package/dist/components/scheduler/series-asking-event-args.d.ts +18 -0
- package/dist/components/scheduler/series-edit-mode.d.ts +3 -0
- package/dist/components/scheduler/time-template-context.d.ts +11 -0
- package/dist/components/scheduler/time-zoom-changed-event-args.d.ts +7 -0
- package/dist/components/scheduler/time-zoom-changing-event-args.d.ts +8 -0
- package/dist/components/scheduler/tooltip-template-context.d.ts +14 -0
- package/dist/components/scheduler/view/AgendaView.d.ts +50 -0
- package/dist/components/scheduler/view/AppointmentBox.d.ts +58 -0
- package/dist/components/scheduler/view/AppointmentDrag.d.ts +66 -0
- package/dist/components/scheduler/view/AppointmentTooltip.d.ts +40 -0
- package/dist/components/scheduler/view/CellAttributes.d.ts +8 -0
- package/dist/components/scheduler/view/CellWriter.d.ts +35 -0
- package/dist/components/scheduler/view/GroupHeads.d.ts +32 -0
- package/dist/components/scheduler/view/KeyedParts.d.ts +27 -0
- package/dist/components/scheduler/view/MonthView.d.ts +58 -0
- package/dist/components/scheduler/view/MoreList.d.ts +32 -0
- package/dist/components/scheduler/view/SchedulerFormat.d.ts +43 -0
- package/dist/components/scheduler/view/SchedulerTouch.d.ts +38 -0
- package/dist/components/scheduler/view/TimeView.d.ts +101 -0
- package/dist/components/scheduler/view/TimelineLine.d.ts +77 -0
- package/dist/components/scheduler/view/TimelineScale.d.ts +22 -0
- package/dist/components/scheduler/view/TimelineScaleCell.d.ts +37 -0
- package/dist/components/scheduler/view/TimelineView.d.ts +72 -0
- package/dist/components/scheduler/view/ask-series-scope.d.ts +21 -0
- package/dist/components/scheduler/view/cell-spot.d.ts +8 -0
- package/dist/components/scheduler/view/cell-words.d.ts +7 -0
- package/dist/components/scheduler/view/scheduler-host.d.ts +87 -0
- package/dist/components/scheduler/view/timeline-scroll.d.ts +7 -0
- package/dist/components/scheduler/view/touch-host.d.ts +21 -0
- package/dist/components/scheduler/view-changed-event-args.d.ts +7 -0
- package/dist/components/scheduler/view-changing-event-args.d.ts +9 -0
- package/dist/components/sheet/BottomSheet.d.ts +82 -0
- package/dist/components/sheet/bottom-sheet-detent.d.ts +6 -0
- package/dist/components/sheet/bottom-sheet-props.d.ts +27 -0
- package/dist/components/sheet/detent-changed-event-args.d.ts +8 -0
- package/dist/components/sheet/detent-changing-event-args.d.ts +11 -0
- package/dist/components/sheet/index.d.ts +5 -0
- package/dist/components/skeleton/Skeleton.d.ts +45 -0
- package/dist/components/skeleton/index.d.ts +4 -0
- package/dist/components/skeleton/skeleton-animation.d.ts +2 -0
- package/dist/components/skeleton/skeleton-props.d.ts +21 -0
- package/dist/components/skeleton/skeleton-shape.d.ts +2 -0
- package/dist/components/slider/Slider.d.ts +114 -0
- package/dist/components/slider/index.d.ts +5 -0
- package/dist/components/slider/slider-orientation.d.ts +2 -0
- package/dist/components/slider/slider-props.d.ts +40 -0
- package/dist/components/slider/slider-show-value.d.ts +2 -0
- package/dist/components/slider/slider-value.d.ts +2 -0
- package/dist/components/switch/Switch.d.ts +32 -0
- package/dist/components/switch/index.d.ts +3 -0
- package/dist/components/switch/switch-props.d.ts +12 -0
- package/dist/components/switch/switch-state-text.d.ts +2 -0
- package/dist/components/tabdocs/AutoHideStrip.d.ts +31 -0
- package/dist/components/tabdocs/DockDropTarget.d.ts +34 -0
- package/dist/components/tabdocs/DockGuides.d.ts +35 -0
- package/dist/components/tabdocs/DocumentList.d.ts +76 -0
- package/dist/components/tabdocs/DocumentTab.d.ts +66 -0
- package/dist/components/tabdocs/DropMarks.d.ts +16 -0
- package/dist/components/tabdocs/LayoutDropTarget.d.ts +39 -0
- package/dist/components/tabdocs/MoveByKeys.d.ts +31 -0
- package/dist/components/tabdocs/NewWindowDropTarget.d.ts +19 -0
- package/dist/components/tabdocs/PhoneBar.d.ts +33 -0
- package/dist/components/tabdocs/PhoneList.d.ts +54 -0
- package/dist/components/tabdocs/PhoneTools.d.ts +20 -0
- package/dist/components/tabdocs/SplitSash.d.ts +23 -0
- package/dist/components/tabdocs/TabBarSettings.d.ts +35 -0
- package/dist/components/tabdocs/TabBrowserWindow.d.ts +60 -0
- package/dist/components/tabdocs/TabDockArea.d.ts +91 -0
- package/dist/components/tabdocs/TabDocument.d.ts +129 -0
- package/dist/components/tabdocs/TabDocumentManager.d.ts +1073 -0
- package/dist/components/tabdocs/TabDrag.d.ts +76 -0
- package/dist/components/tabdocs/TabGroup.d.ts +156 -0
- package/dist/components/tabdocs/TabMenus.d.ts +34 -0
- package/dist/components/tabdocs/TabPresenter.d.ts +105 -0
- package/dist/components/tabdocs/TabSplit.d.ts +40 -0
- package/dist/components/tabdocs/TabWindow.d.ts +82 -0
- package/dist/components/tabdocs/WindowByKeys.d.ts +18 -0
- package/dist/components/tabdocs/content-lifetime.d.ts +6 -0
- package/dist/components/tabdocs/dock-guide-hit.d.ts +10 -0
- package/dist/components/tabdocs/document-activated-event-args.d.ts +11 -0
- package/dist/components/tabdocs/document-activating-event-args.d.ts +12 -0
- package/dist/components/tabdocs/document-changed-event-args.d.ts +10 -0
- package/dist/components/tabdocs/document-changing-event-args.d.ts +11 -0
- package/dist/components/tabdocs/document-closed-event-args.d.ts +10 -0
- package/dist/components/tabdocs/document-closing-event-args.d.ts +18 -0
- package/dist/components/tabdocs/document-moved-event-args.d.ts +12 -0
- package/dist/components/tabdocs/document-moving-event-args.d.ts +14 -0
- package/dist/components/tabdocs/document-opened-event-args.d.ts +10 -0
- package/dist/components/tabdocs/document-opening-event-args.d.ts +13 -0
- package/dist/components/tabdocs/document-showing-event-args.d.ts +19 -0
- package/dist/components/tabdocs/document-shown-event-args.d.ts +11 -0
- package/dist/components/tabdocs/group-locked-event-args.d.ts +8 -0
- package/dist/components/tabdocs/group-locking-event-args.d.ts +9 -0
- package/dist/components/tabdocs/group-split-event-args.d.ts +15 -0
- package/dist/components/tabdocs/group-splitting-event-args.d.ts +17 -0
- package/dist/components/tabdocs/index.d.ts +102 -0
- package/dist/components/tabdocs/keep-scroll.d.ts +6 -0
- package/dist/components/tabdocs/layout-changed-event-args.d.ts +17 -0
- package/dist/components/tabdocs/layout-changing-event-args.d.ts +19 -0
- package/dist/components/tabdocs/layout-item.d.ts +4 -0
- package/dist/components/tabdocs/pinned-tab-size.d.ts +2 -0
- package/dist/components/tabdocs/place-node.d.ts +6 -0
- package/dist/components/tabdocs/presentation-changed-event-args.d.ts +8 -0
- package/dist/components/tabdocs/presentation-changing-event-args.d.ts +11 -0
- package/dist/components/tabdocs/sash-owner.d.ts +15 -0
- package/dist/components/tabdocs/screen-offsets.d.ts +9 -0
- package/dist/components/tabdocs/split-direction.d.ts +2 -0
- package/dist/components/tabdocs/tab-after-close.d.ts +2 -0
- package/dist/components/tabdocs/tab-auto-hidden-event-args.d.ts +9 -0
- package/dist/components/tabdocs/tab-auto-hiding-event-args.d.ts +10 -0
- package/dist/components/tabdocs/tab-bar-button-size.d.ts +2 -0
- package/dist/components/tabdocs/tab-bar-button.d.ts +2 -0
- package/dist/components/tabdocs/tab-close-button.d.ts +2 -0
- package/dist/components/tabdocs/tab-content-clone.d.ts +4 -0
- package/dist/components/tabdocs/tab-content-factory.d.ts +4 -0
- package/dist/components/tabdocs/tab-context-menu-event-args.d.ts +16 -0
- package/dist/components/tabdocs/tab-copy-modifier.d.ts +2 -0
- package/dist/components/tabdocs/tab-dock-guide-kind.d.ts +2 -0
- package/dist/components/tabdocs/tab-dock-presentation.d.ts +5 -0
- package/dist/components/tabdocs/tab-dock-side.d.ts +2 -0
- package/dist/components/tabdocs/tab-docked-event-args.d.ts +16 -0
- package/dist/components/tabdocs/tab-docking-event-args.d.ts +21 -0
- package/dist/components/tabdocs/tab-document-content.d.ts +4 -0
- package/dist/components/tabdocs/tab-document-keys.d.ts +105 -0
- package/dist/components/tabdocs/tab-document-manager-props.d.ts +351 -0
- package/dist/components/tabdocs/tab-document-options.d.ts +57 -0
- package/dist/components/tabdocs/tab-drag-ended-event-args.d.ts +11 -0
- package/dist/components/tabdocs/tab-drag-starting-event-args.d.ts +14 -0
- package/dist/components/tabdocs/tab-drag-subject.d.ts +16 -0
- package/dist/components/tabdocs/tab-drop-event-args.d.ts +20 -0
- package/dist/components/tabdocs/tab-drop-marks.d.ts +5 -0
- package/dist/components/tabdocs/tab-drop-place.d.ts +25 -0
- package/dist/components/tabdocs/tab-drop-side.d.ts +2 -0
- package/dist/components/tabdocs/tab-drop-target-kind.d.ts +10 -0
- package/dist/components/tabdocs/tab-drop-target.d.ts +23 -0
- package/dist/components/tabdocs/tab-dropped-event-args.d.ts +13 -0
- package/dist/components/tabdocs/tab-error-event-args.d.ts +17 -0
- package/dist/components/tabdocs/tab-floated-event-args.d.ts +13 -0
- package/dist/components/tabdocs/tab-floating-event-args.d.ts +16 -0
- package/dist/components/tabdocs/tab-key-preset.d.ts +6 -0
- package/dist/components/tabdocs/tab-keys.d.ts +12 -0
- package/dist/components/tabdocs/tab-layout-area.d.ts +13 -0
- package/dist/components/tabdocs/tab-layout-bar.d.ts +12 -0
- package/dist/components/tabdocs/tab-layout-browser-window.d.ts +10 -0
- package/dist/components/tabdocs/tab-layout-change.d.ts +2 -0
- package/dist/components/tabdocs/tab-layout-document.d.ts +9 -0
- package/dist/components/tabdocs/tab-layout-factory.d.ts +9 -0
- package/dist/components/tabdocs/tab-layout-group.d.ts +16 -0
- package/dist/components/tabdocs/tab-layout-hidden.d.ts +16 -0
- package/dist/components/tabdocs/tab-layout-node.d.ts +3 -0
- package/dist/components/tabdocs/tab-layout-split.d.ts +10 -0
- package/dist/components/tabdocs/tab-layout-window.d.ts +17 -0
- package/dist/components/tabdocs/tab-layout.d.ts +23 -0
- package/dist/components/tabdocs/tab-list-scope.d.ts +2 -0
- package/dist/components/tabdocs/tab-menu-command.d.ts +2 -0
- package/dist/components/tabdocs/tab-narrow-bars.d.ts +2 -0
- package/dist/components/tabdocs/tab-new-document.d.ts +5 -0
- package/dist/components/tabdocs/tab-new-window-close-action.d.ts +2 -0
- package/dist/components/tabdocs/tab-new-window-fallback.d.ts +2 -0
- package/dist/components/tabdocs/tab-new-window-options.d.ts +8 -0
- package/dist/components/tabdocs/tab-new-window-title.d.ts +7 -0
- package/dist/components/tabdocs/tab-open-options.d.ts +16 -0
- package/dist/components/tabdocs/tab-open-position.d.ts +2 -0
- package/dist/components/tabdocs/tab-open-window.d.ts +7 -0
- package/dist/components/tabdocs/tab-presentation-kind.d.ts +2 -0
- package/dist/components/tabdocs/tab-presentation.d.ts +2 -0
- package/dist/components/tabdocs/tab-rect.d.ts +7 -0
- package/dist/components/tabdocs/tab-restore-windows.d.ts +7 -0
- package/dist/components/tabdocs/tab-show-description.d.ts +2 -0
- package/dist/components/tabdocs/tab-show-options.d.ts +15 -0
- package/dist/components/tabdocs/tab-size.d.ts +2 -0
- package/dist/components/tabdocs/tab-slide-event-args.d.ts +16 -0
- package/dist/components/tabdocs/tab-tablet-when.d.ts +2 -0
- package/dist/components/tabdocs/tab-tone.d.ts +2 -0
- package/dist/components/tabdocs/tab-toolbar-items.d.ts +4 -0
- package/dist/components/tabdocs/tab-window-closed-event-args.d.ts +14 -0
- package/dist/components/tabdocs/tab-window-closing-event-args.d.ts +18 -0
- package/dist/components/tabdocs/tab-window-opened-event-args.d.ts +14 -0
- package/dist/components/tabdocs/tab-window-opening-event-args.d.ts +21 -0
- package/dist/components/tabdocs/tab-window-request.d.ts +11 -0
- package/dist/components/tabs/PanelContent.d.ts +20 -0
- package/dist/components/tabs/Tab.d.ts +71 -0
- package/dist/components/tabs/Tabs.d.ts +126 -0
- package/dist/components/tabs/index.d.ts +11 -0
- package/dist/components/tabs/tab-close-event-args.d.ts +11 -0
- package/dist/components/tabs/tab-props.d.ts +27 -0
- package/dist/components/tabs/tab-selecting-event-args.d.ts +12 -0
- package/dist/components/tabs/tab-selection-changed-event-args.d.ts +13 -0
- package/dist/components/tabs/tabs-activation.d.ts +2 -0
- package/dist/components/tabs/tabs-placement.d.ts +2 -0
- package/dist/components/tabs/tabs-props.d.ts +41 -0
- package/dist/components/tabs/tabs-variant.d.ts +2 -0
- package/dist/components/tagbox/TagBox.d.ts +140 -0
- package/dist/components/tagbox/index.d.ts +2 -0
- package/dist/components/tagbox/tag-box-props.d.ts +56 -0
- package/dist/components/textarea/TextArea.d.ts +76 -0
- package/dist/components/textarea/index.d.ts +3 -0
- package/dist/components/textarea/text-area-props.d.ts +36 -0
- package/dist/components/textarea/text-area-resize.d.ts +2 -0
- package/dist/components/textbox/TextBox.d.ts +89 -0
- package/dist/components/textbox/text-box-props.d.ts +41 -0
- package/dist/components/textbox/text-box-type.d.ts +1 -0
- package/dist/components/toast/Toast.d.ts +63 -0
- package/dist/components/toast/Toaster.d.ts +68 -0
- package/dist/components/toast/index.d.ts +9 -0
- package/dist/components/toast/show-toast.d.ts +20 -0
- package/dist/components/toast/toast-action.d.ts +7 -0
- package/dist/components/toast/toast-close-reason.d.ts +2 -0
- package/dist/components/toast/toast-position.d.ts +2 -0
- package/dist/components/toast/toast-props.d.ts +28 -0
- package/dist/components/toast/toast-tone.d.ts +2 -0
- package/dist/components/toast/toaster-props.d.ts +17 -0
- package/dist/components/toolbar/Toolbar.d.ts +93 -0
- package/dist/components/toolbar/ToolbarSeparator.d.ts +6 -0
- package/dist/components/toolbar/index.d.ts +9 -0
- package/dist/components/toolbar/toolbar-item-click-event-args.d.ts +9 -0
- package/dist/components/toolbar/toolbar-item-overflow.d.ts +2 -0
- package/dist/components/toolbar/toolbar-item-type.d.ts +2 -0
- package/dist/components/toolbar/toolbar-item.d.ts +36 -0
- package/dist/components/toolbar/toolbar-orientation.d.ts +2 -0
- package/dist/components/toolbar/toolbar-overflow.d.ts +2 -0
- package/dist/components/toolbar/toolbar-props.d.ts +25 -0
- package/dist/components/tooltip/Tooltip.d.ts +57 -0
- package/dist/components/tooltip/add-tooltip.d.ts +11 -0
- package/dist/components/tooltip/index.d.ts +5 -0
- package/dist/components/tooltip/tooltip-hub.d.ts +12 -0
- package/dist/components/tooltip/tooltip-props.d.ts +25 -0
- package/dist/components/tooltip/tooltip-show-on.d.ts +2 -0
- package/dist/components/tooltip/tooltip-target.d.ts +3 -0
- package/dist/components/treeview/TreeModel.d.ts +43 -0
- package/dist/components/treeview/TreeView.d.ts +218 -0
- package/dist/components/treeview/index.d.ts +16 -0
- package/dist/components/treeview/tree-check-state.d.ts +2 -0
- package/dist/components/treeview/tree-fields.d.ts +7 -0
- package/dist/components/treeview/tree-node.d.ts +12 -0
- package/dist/components/treeview/tree-row.d.ts +9 -0
- package/dist/components/treeview/tree-view-check-changed-event-args.d.ts +13 -0
- package/dist/components/treeview/tree-view-expand-on.d.ts +2 -0
- package/dist/components/treeview/tree-view-expanded-event-args.d.ts +8 -0
- package/dist/components/treeview/tree-view-expanding-event-args.d.ts +11 -0
- package/dist/components/treeview/tree-view-item-click-event-args.d.ts +8 -0
- package/dist/components/treeview/tree-view-item-template.d.ts +2 -0
- package/dist/components/treeview/tree-view-load-children.d.ts +2 -0
- package/dist/components/treeview/tree-view-props.d.ts +75 -0
- package/dist/components/treeview/tree-view-selection-changed-event-args.d.ts +10 -0
- package/dist/components/treeview/tree-view-selection-mode.d.ts +2 -0
- package/dist/core/UiLocale.d.ts +52 -0
- package/dist/core/access-key.d.ts +32 -0
- package/dist/core/after-press.d.ts +5 -0
- package/dist/core/back-button.d.ts +15 -0
- package/dist/core/connect-i18n.d.ts +11 -0
- package/dist/core/container.d.ts +52 -0
- package/dist/core/control-map.d.ts +7 -0
- package/dist/core/control-size.d.ts +2 -0
- package/dist/core/control.d.ts +156 -0
- package/dist/core/document-watch.d.ts +10 -0
- package/dist/core/draw-parts.d.ts +36 -0
- package/dist/core/enable.d.ts +16 -0
- package/dist/core/every.d.ts +5 -0
- package/dist/core/fill-template.d.ts +2 -0
- package/dist/core/fill-text.d.ts +6 -0
- package/dist/core/focus-guard.d.ts +2 -0
- package/dist/core/focus.d.ts +32 -0
- package/dist/core/follow.d.ts +7 -0
- package/dist/core/function-value.d.ts +6 -0
- package/dist/core/given-field.d.ts +12 -0
- package/dist/core/glyphs.d.ts +67 -0
- package/dist/core/icon-node.d.ts +10 -0
- package/dist/core/icon-source.d.ts +3 -0
- package/dist/core/input-mode.d.ts +2 -0
- package/dist/core/keyboard.d.ts +55 -0
- package/dist/core/language-look.d.ts +18 -0
- package/dist/core/later.d.ts +4 -0
- package/dist/core/locale-source.d.ts +9 -0
- package/dist/core/look-watch.d.ts +2 -0
- package/dist/core/mirror-page.d.ts +9 -0
- package/dist/core/next-frame.d.ts +6 -0
- package/dist/core/next-id.d.ts +1 -0
- package/dist/core/node-kind.d.ts +10 -0
- package/dist/core/on-language.d.ts +9 -0
- package/dist/core/on-re-state.d.ts +6 -0
- package/dist/core/page-documents.d.ts +21 -0
- package/dist/core/platform.d.ts +2 -0
- package/dist/core/press-origin.d.ts +2 -0
- package/dist/core/prop-binding.d.ts +25 -0
- package/dist/core/resize-watch.d.ts +21 -0
- package/dist/core/ui-locale-changed-event-args.d.ts +5 -0
- package/dist/core/ui-locale.d.ts +13 -0
- package/dist/core/ui-pack-module.d.ts +5 -0
- package/dist/core/ui-pack.d.ts +3 -0
- package/dist/core/ui-strings.d.ts +573 -0
- package/dist/core/window-stack.d.ts +21 -0
- package/dist/defineProperty-C0rC37pP.js +39 -0
- package/dist/excel/cell-range.d.ts +11 -0
- package/dist/excel/date-format.d.ts +6 -0
- package/dist/excel/excel-customize-cell-args.d.ts +8 -0
- package/dist/excel/excel-export-options.d.ts +50 -0
- package/dist/excel/export-data-grid.d.ts +21 -0
- package/dist/excel/index.d.ts +6 -0
- package/dist/excel/index.js +244 -0
- package/dist/excel/index.js.map +1 -0
- package/dist/excel/number-format.d.ts +6 -0
- package/dist/formula-guard-NYlpoA-t.js +10 -0
- package/dist/formula-guard-NYlpoA-t.js.map +1 -0
- package/dist/generated/tokens.d.ts +17580 -0
- package/dist/index.d.ts +157 -0
- package/dist/index.js +79642 -0
- package/dist/index.js.map +1 -0
- package/dist/locales/en.json +556 -0
- package/dist/locales/tr.json +556 -0
- package/dist/parts/color/color-hsva.d.ts +7 -0
- package/dist/parts/color/color-rgba.d.ts +7 -0
- package/dist/parts/color/colors.d.ts +11 -0
- package/dist/parts/data/DataItems.d.ts +50 -0
- package/dist/parts/data/KeyedItems.d.ts +91 -0
- package/dist/parts/data/keyed-item.d.ts +9 -0
- package/dist/parts/data/text-search.d.ts +12 -0
- package/dist/parts/dates/add-days.d.ts +1 -0
- package/dist/parts/dates/add-months.d.ts +2 -0
- package/dist/parts/dates/date-kind.d.ts +2 -0
- package/dist/parts/dates/date-part.d.ts +1 -0
- package/dist/parts/dates/date-pattern-of.d.ts +4 -0
- package/dist/parts/dates/date-pattern.d.ts +7 -0
- package/dist/parts/dates/date-to-digits.d.ts +3 -0
- package/dist/parts/dates/day-start.d.ts +2 -0
- package/dist/parts/dates/digits-to-date.d.ts +3 -0
- package/dist/parts/dates/first-day-of-week.d.ts +2 -0
- package/dist/parts/dates/iso-week.d.ts +2 -0
- package/dist/parts/dates/same-day.d.ts +1 -0
- package/dist/parts/dates/time-zone.d.ts +53 -0
- package/dist/parts/drag/DragGhost.d.ts +57 -0
- package/dist/parts/drag/scroll-step.d.ts +6 -0
- package/dist/parts/field/Field.d.ts +130 -0
- package/dist/parts/field/box-area.d.ts +2 -0
- package/dist/parts/field/enter-key-event-args.d.ts +6 -0
- package/dist/parts/field/field-button-click-event-args.d.ts +7 -0
- package/dist/parts/field/field-button.d.ts +18 -0
- package/dist/parts/field/field-label-mode.d.ts +2 -0
- package/dist/parts/field/field-props.d.ts +44 -0
- package/dist/parts/field/field-variant.d.ts +2 -0
- package/dist/parts/field/same-as-written.d.ts +5 -0
- package/dist/parts/field/validate-on.d.ts +2 -0
- package/dist/parts/field/validated-event-args.d.ts +7 -0
- package/dist/parts/field/value-changed-event-args.d.ts +10 -0
- package/dist/parts/icalendar/add-duration.d.ts +9 -0
- package/dist/parts/icalendar/date-property.d.ts +4 -0
- package/dist/parts/icalendar/escape-text.d.ts +2 -0
- package/dist/parts/icalendar/event-lines.d.ts +3 -0
- package/dist/parts/icalendar/fold-line.d.ts +2 -0
- package/dist/parts/icalendar/format-content-line.d.ts +3 -0
- package/dist/parts/icalendar/format-offset.d.ts +2 -0
- package/dist/parts/icalendar/icalendar-component.d.ts +8 -0
- package/dist/parts/icalendar/icalendar-date.d.ts +6 -0
- package/dist/parts/icalendar/icalendar-event.d.ts +25 -0
- package/dist/parts/icalendar/icalendar-moment.d.ts +12 -0
- package/dist/parts/icalendar/icalendar-observance.d.ts +15 -0
- package/dist/parts/icalendar/icalendar-property.d.ts +9 -0
- package/dist/parts/icalendar/icalendar-time-zone.d.ts +7 -0
- package/dist/parts/icalendar/icalendar-write-options.d.ts +15 -0
- package/dist/parts/icalendar/icalendar.d.ts +13 -0
- package/dist/parts/icalendar/observance-moment.d.ts +7 -0
- package/dist/parts/icalendar/parse-icalendar.d.ts +11 -0
- package/dist/parts/icalendar/read-components.d.ts +3 -0
- package/dist/parts/icalendar/read-content-line.d.ts +3 -0
- package/dist/parts/icalendar/read-duration.d.ts +5 -0
- package/dist/parts/icalendar/read-event.d.ts +4 -0
- package/dist/parts/icalendar/read-icalendar-dates.d.ts +4 -0
- package/dist/parts/icalendar/read-offset.d.ts +2 -0
- package/dist/parts/icalendar/read-time-zone.d.ts +4 -0
- package/dist/parts/icalendar/same-form.d.ts +3 -0
- package/dist/parts/icalendar/short-zone-name.d.ts +2 -0
- package/dist/parts/icalendar/time-zone-lines.d.ts +10 -0
- package/dist/parts/icalendar/unescape-text.d.ts +2 -0
- package/dist/parts/icalendar/unfold-lines.d.ts +2 -0
- package/dist/parts/icalendar/write-icalendar.d.ts +9 -0
- package/dist/parts/list/OptionList.d.ts +88 -0
- package/dist/parts/list/item-field.d.ts +2 -0
- package/dist/parts/list/item-own-value.d.ts +2 -0
- package/dist/parts/list/item-source.d.ts +8 -0
- package/dist/parts/list/list-move.d.ts +2 -0
- package/dist/parts/list/option-chosen-event-args.d.ts +5 -0
- package/dist/parts/list/read-item-field.d.ts +6 -0
- package/dist/parts/mask/InputMask.d.ts +41 -0
- package/dist/parts/mask/MaskedText.d.ts +38 -0
- package/dist/parts/mask/input-mask-options.d.ts +11 -0
- package/dist/parts/mask/mask-char.d.ts +4 -0
- package/dist/parts/mask/mask-chars.d.ts +3 -0
- package/dist/parts/mask/mask-slot.d.ts +8 -0
- package/dist/parts/mask/parse-mask.d.ts +4 -0
- package/dist/parts/menu/MenuList.d.ts +74 -0
- package/dist/parts/menu/line-after.d.ts +4 -0
- package/dist/parts/menu/menu-item-click-event-args.d.ts +10 -0
- package/dist/parts/menu/menu-item.d.ts +37 -0
- package/dist/parts/overlay/OverlayPanel.d.ts +123 -0
- package/dist/parts/overlay/css-length.d.ts +2 -0
- package/dist/parts/overlay/inert-around.d.ts +5 -0
- package/dist/parts/overlay/overlay-close-reason.d.ts +2 -0
- package/dist/parts/overlay/overlay-closed-event-args.d.ts +6 -0
- package/dist/parts/overlay/overlay-closing-event-args.d.ts +8 -0
- package/dist/parts/overlay/overlay-container.d.ts +3 -0
- package/dist/parts/overlay/overlay-event-args.d.ts +5 -0
- package/dist/parts/overlay/overlay-opening-event-args.d.ts +6 -0
- package/dist/parts/overlay/overlay-panel-props.d.ts +48 -0
- package/dist/parts/overlay/swipe-tracker.d.ts +11 -0
- package/dist/parts/popup/Popup.d.ts +41 -0
- package/dist/parts/popup/place-popup.d.ts +7 -0
- package/dist/parts/popup/popup-close-reason.d.ts +2 -0
- package/dist/parts/popup/popup-open-options.d.ts +7 -0
- package/dist/parts/popup/popup-placement.d.ts +6 -0
- package/dist/parts/recurrence/add-rule-date.d.ts +6 -0
- package/dist/parts/recurrence/describe-recurrence.d.ts +16 -0
- package/dist/parts/recurrence/filter-rule-dates.d.ts +3 -0
- package/dist/parts/recurrence/format-recurrence-rule.d.ts +3 -0
- package/dist/parts/recurrence/format-rule-date.d.ts +3 -0
- package/dist/parts/recurrence/parse-recurrence-rule.d.ts +11 -0
- package/dist/parts/recurrence/parse-rule-date.d.ts +3 -0
- package/dist/parts/recurrence/read-rule-dates.d.ts +7 -0
- package/dist/parts/recurrence/recurrence-dates-options.d.ts +7 -0
- package/dist/parts/recurrence/recurrence-dates.d.ts +14 -0
- package/dist/parts/recurrence/recurrence-frequency.d.ts +2 -0
- package/dist/parts/recurrence/recurrence-rule.d.ts +33 -0
- package/dist/parts/recurrence/rule-date.d.ts +10 -0
- package/dist/parts/recurrence/rule-weekday.d.ts +7 -0
- package/dist/parts/recurrence/weekday-codes.d.ts +2 -0
- package/dist/parts/validation/ValidationGroup.d.ts +25 -0
- package/dist/parts/validation/check-rules.d.ts +4 -0
- package/dist/parts/validation/validate-fields.d.ts +10 -0
- package/dist/parts/validation/validate-targets.d.ts +3 -0
- package/dist/parts/validation/validation-message.d.ts +2 -0
- package/dist/parts/validation/validation-result.d.ts +6 -0
- package/dist/parts/validation/validation-rule.d.ts +55 -0
- package/dist/parts/validation/validation-target.d.ts +8 -0
- package/dist/parts/window/follow-pointer.d.ts +5 -0
- package/dist/parts/window/resize-box.d.ts +13 -0
- package/dist/parts/window/resize-frame.d.ts +2 -0
- package/dist/parts/window/window-box.d.ts +7 -0
- package/dist/parts/window/window-edge.d.ts +2 -0
- package/dist/pdf/export-data-grid.d.ts +23 -0
- package/dist/pdf/index.d.ts +8 -0
- package/dist/pdf/index.js +355 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/pdf-cell.d.ts +33 -0
- package/dist/pdf/pdf-custom-draw-cell-args.d.ts +17 -0
- package/dist/pdf/pdf-customize-cell-args.d.ts +7 -0
- package/dist/pdf/pdf-export-options.d.ts +59 -0
- package/dist/pdf/pdf-export-result.d.ts +7 -0
- package/dist/pdf/pdf-margin.d.ts +7 -0
- package/dist/pdf/pdf-row-exporting-args.d.ts +7 -0
- package/dist/pdf/pdf-table.d.ts +49 -0
- package/dist/styles.css +27373 -0
- package/dist/tokens/index.d.ts +19290 -0
- package/dist/tokens/index.js +17611 -0
- package/dist/tokens/index.js.map +1 -0
- package/docs/accordion.md +295 -0
- package/docs/actionsheet.md +209 -0
- package/docs/avatar.md +238 -0
- package/docs/badge.md +193 -0
- package/docs/bottomsheet.md +316 -0
- package/docs/breadcrumb.md +125 -0
- package/docs/button.md +416 -0
- package/docs/buttongroup.md +141 -0
- package/docs/calendar.md +136 -0
- package/docs/card.md +254 -0
- package/docs/checkbox.md +336 -0
- package/docs/chip.md +278 -0
- package/docs/colorbox.md +153 -0
- package/docs/combobox.md +214 -0
- package/docs/control.md +232 -0
- package/docs/datagrid-api.md +417 -0
- package/docs/datagrid-bands.md +317 -0
- package/docs/datagrid-drag-select.md +326 -0
- package/docs/datagrid-drag.md +341 -0
- package/docs/datagrid-editing.md +537 -0
- package/docs/datagrid-filtering.md +455 -0
- package/docs/datagrid-forms.md +402 -0
- package/docs/datagrid-grouping.md +419 -0
- package/docs/datagrid-layout.md +540 -0
- package/docs/datagrid-lookups.md +363 -0
- package/docs/datagrid-master-detail.md +326 -0
- package/docs/datagrid-scrolling.md +348 -0
- package/docs/datagrid-selection.md +599 -0
- package/docs/datagrid.md +362 -0
- package/docs/datebox.md +201 -0
- package/docs/drawer.md +229 -0
- package/docs/dropdown.md +317 -0
- package/docs/filterbuilder.md +601 -0
- package/docs/formlayout.md +118 -0
- package/docs/getting-started.md +105 -0
- package/docs/home.md +54 -0
- package/docs/keyboard.md +188 -0
- package/docs/layout.md +584 -0
- package/docs/listbox.md +374 -0
- package/docs/lookup.md +128 -0
- package/docs/menus.md +312 -0
- package/docs/numberbox.md +309 -0
- package/docs/pagination.md +115 -0
- package/docs/progress.md +401 -0
- package/docs/radiogroup.md +324 -0
- package/docs/rating.md +124 -0
- package/docs/scheduler-agenda.md +597 -0
- package/docs/scheduler-big-data.md +253 -0
- package/docs/scheduler-editing.md +545 -0
- package/docs/scheduler-form.md +631 -0
- package/docs/scheduler-icalendar.md +591 -0
- package/docs/scheduler-mobile.md +664 -0
- package/docs/scheduler-recurrence.md +420 -0
- package/docs/scheduler-resources.md +702 -0
- package/docs/scheduler-timeline.md +632 -0
- package/docs/scheduler.md +592 -0
- package/docs/showcase.md +5 -0
- package/docs/skeleton.md +131 -0
- package/docs/slider.md +361 -0
- package/docs/switch.md +242 -0
- package/docs/tabdocs-dock.md +877 -0
- package/docs/tabdocs-drag.md +554 -0
- package/docs/tabdocs-menus.md +689 -0
- package/docs/tabdocs-mobile.md +277 -0
- package/docs/tabdocs-tabs.md +830 -0
- package/docs/tabdocs-windows.md +657 -0
- package/docs/tabdocs-workspace.md +409 -0
- package/docs/tabdocs.md +888 -0
- package/docs/tabs.md +456 -0
- package/docs/tagbox.md +361 -0
- package/docs/textarea.md +305 -0
- package/docs/textbox.md +449 -0
- package/docs/toast.md +313 -0
- package/docs/tokens.md +3903 -0
- package/docs/toolbar.md +462 -0
- package/docs/tooltip.md +339 -0
- package/docs/treeview.md +763 -0
- package/docs/window.md +556 -0
- package/llms-full.txt +33665 -0
- package/llms.txt +127 -0
- package/package.json +116 -6
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,1803 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this package are documented here.
|
|
4
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the package uses
|
|
5
|
+
[Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.1.0-beta.0] - 2026-10-30
|
|
10
|
+
|
|
11
|
+
The first preview on npm (`npm i @motifx-community/ui@beta`). The package also carries its documentation for
|
|
12
|
+
readers that are not a browser: a Markdown page per component in `docs/`, an index in `llms.txt` and every page in
|
|
13
|
+
`llms-full.txt`.
|
|
14
|
+
|
|
15
|
+
### New components
|
|
16
|
+
|
|
17
|
+
- `Badge`: a text, a count (`max` → `99+`, hidden at 0 unless `showZero`) or a dot, in six tones and three looks;
|
|
18
|
+
on a corner of what it is in (`position`, `Badge.attach`), the anchor's frame stepped over; the count in the kit's
|
|
19
|
+
language.
|
|
20
|
+
- `Avatar` and `AvatarGroup`: a picture, else initials (in the capitals of the kit's language), else a person icon;
|
|
21
|
+
a tone of the language's or one taken from the name (`tone: 'auto'`); circle or square; a presence dot. A group
|
|
22
|
+
stacks or spreads its avatars and counts the rest (`max`, `total`, `+N`), from JSX lists too.
|
|
23
|
+
- `Chip` and `ChipGroup`: an icon or an avatar before the text, removable (its button, Delete / Backspace), pressable
|
|
24
|
+
or selectable, six tones; a group selects one or several (`x-model`), one Tab stop, the arrow keys between chips.
|
|
25
|
+
- `Card`: a picture, a header (avatar, title, subtitle, action), content and actions; vertical or horizontal;
|
|
26
|
+
clickable, a link through its title (`href`, `rel="router"`), selectable with a check box.
|
|
27
|
+
- `Skeleton`: lines, a block or a circle while `loading`, then the content; a wave or a pulse that reduced motion
|
|
28
|
+
keeps still.
|
|
29
|
+
- `ButtonGroup`: the kit's buttons attached, a segmented choice (`single`, `multiple`, `x-model`) or actions.
|
|
30
|
+
- `Rating`: stars or icons of your own, halves, a preview under the pointer, read-only; a field (label, rules).
|
|
31
|
+
- `ColorPicker` and `ColorBox`: an area of saturation and brightness, hue and opacity strips, hex and channel inputs,
|
|
32
|
+
presets, a colour from the screen; the box applies at once or on OK.
|
|
33
|
+
- `Breadcrumb`: links (the router's too) or buttons, the current page last, the steps that do not fit in a menu.
|
|
34
|
+
- `Pagination`: the grid's pager as a component of its own: page sizes, info, steps, page buttons, compact when it
|
|
35
|
+
does not fit.
|
|
36
|
+
- The design system's opaque neutral fill (`color.fill.neutral`) for marks on any surface; kit glyphs `person`,
|
|
37
|
+
`star`, `star-filled`, `eyedropper`, `slash`.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- `Badge.attach` takes a component only: the badge becomes one of its children and goes with it.
|
|
42
|
+
|
|
43
|
+
### DataGrid: drawn by hand, with nothing followed inside
|
|
44
|
+
|
|
45
|
+
- What changes in the grid is told where it is changed (`GridNotices`, once a turn); the rows, the header, the
|
|
46
|
+
filter row, the totals, the group rows and footers, the toolbar, the bottom bar, the pager, the filter panel,
|
|
47
|
+
the band headers, the group panel, the edit and adaptive forms and the filter builder window draw again what a
|
|
48
|
+
change concerns. No JSX, no bindings and no effects of its own inside; what comes in from outside is the
|
|
49
|
+
developer's data, props (a function among them followed by one binding per source) and `reState()`. The state
|
|
50
|
+
the API calls "reactive" stays so for the app's own bindings.
|
|
51
|
+
- Datagrid page: bindings 1,306 → 87, live effects 2,285 → 579, effects run while it opens 2,478 → 346; a sort
|
|
52
|
+
runs none (was 140). Every write is made only when its value changed.
|
|
53
|
+
- Widening a column no longer has the whole page's style worked out again at each step (the grid's column sheet
|
|
54
|
+
is written only when its rules change): 60–110 ms per step → no long task.
|
|
55
|
+
- `onRowPrepared` of the total row comes when what its cells show changed, not on every change of the grid.
|
|
56
|
+
- A value the user changes too (the search box, the pager's page box and size list, the filter row's editors,
|
|
57
|
+
the filter panel's check box) is given again only when the grid's value changed, so what is typed stays.
|
|
58
|
+
|
|
59
|
+
### DataGrid: `masterDetail.keepAcrossPages`
|
|
60
|
+
|
|
61
|
+
- A paged grid disposes the details of the page left when the page or the page size changes, and makes them again
|
|
62
|
+
when their page shows; a row stays open. `keepAcrossPages: true` keeps them while the user pages, up to
|
|
63
|
+
`keepLimit`. Closing a row keeps its details with `keepDetails` (the default) and disposes them without it.
|
|
64
|
+
|
|
65
|
+
### Focus: a control hidden or disabled while focused does not scroll the page
|
|
66
|
+
|
|
67
|
+
- Focus moved off a control that is hidden or disabled goes to the next one without scrolling (the page jumped
|
|
68
|
+
after the first "Save changes" of a batch-edited grid).
|
|
69
|
+
|
|
70
|
+
### FormLayout: a field not shown is not checked
|
|
71
|
+
|
|
72
|
+
- A field whose item is not shown (`visible: false`) is left out of `validate()` and `isValid`, its message cleared;
|
|
73
|
+
shown again, it is checked again. A field on a tab not chosen is still checked. The Scheduler form of "Fields for
|
|
74
|
+
one appointment" saves again (its required "Guests" stopped it while hidden).
|
|
75
|
+
|
|
76
|
+
### Properties: a function prop follows through the component's bindings; `x-model` mirrors the state
|
|
77
|
+
|
|
78
|
+
- A property given as a function is followed by a binding of the component (`follow`, `PropBinding`): a reactive
|
|
79
|
+
source updates it by itself, plain data shows on the developer's `reState()`. The value is handed on only when it
|
|
80
|
+
differs from the last one read, so a change the user made stays across a `reState()`; a property set from code
|
|
81
|
+
stops following its function. `refreshProps()` is gone (one way, not two).
|
|
82
|
+
- `x-model` shows the component's state on every path: the user, code (`value`, `pressed`, `position`, a tab or a
|
|
83
|
+
panel chosen from code), the component's own rules (a mask, `decimals`, `min`/`max`) and a cancelled close.
|
|
84
|
+
- NumberBox rounds its value to `decimals` and shows that many digits; its spin buttons come back after `none`.
|
|
85
|
+
Calendar shows the month of a value given from anywhere.
|
|
86
|
+
- Every docs page's components converted; `onReState(component, run)` for parts drawn by hand.
|
|
87
|
+
|
|
88
|
+
### Scheduler: drawn by hand, with nothing followed inside
|
|
89
|
+
|
|
90
|
+
- The views (timeline, day and week, month, agenda), the appointment boxes, the tooltip, the "+N more" list, the
|
|
91
|
+
toolbar, the recurrence editor and the series question are made in code and drawn by hand: no JSX, no bindings,
|
|
92
|
+
no inner `reState()`. What comes in from outside is the developer's data, props and `reState()`.
|
|
93
|
+
- Effects on the timeline page 10,860 → those of the example templates only; resizing an appointment runs nothing
|
|
94
|
+
reactive (was 1,353 to 1,598 runs); scrolling a big timeline: script, style, layout and paint all below before.
|
|
95
|
+
Every write is made only when its value changed.
|
|
96
|
+
- Big views open faster: the view's settings are read once per turn, the week of many groups builds the columns in
|
|
97
|
+
view first and the ones on each side in the frames after (big-data example: first box 950 → ~430 ms, dev).
|
|
98
|
+
- Fixed: "On a date" in the recurrence editor jumped back to "Never" (it comes with a date three months after the
|
|
99
|
+
start); a focused box taken away threw in `itemOf`, and its focus going with it took a move by the keys back;
|
|
100
|
+
rows of cells gone with other hours were written again (MJX208); a virtual timeline row let go after its view
|
|
101
|
+
threw, and so did a scroll coming after it; a box waiting for its store shows it locked again; `selectCells` right
|
|
102
|
+
after `showDate` finds the cells of the new days; a resource kind's field given as a function
|
|
103
|
+
(`useColorAsDefault: () => …`) is followed again.
|
|
104
|
+
- Docs: "From code" selects the next workday (the work week has no Saturday); the two copies of a TabDocs document
|
|
105
|
+
read a field again when the other one changes it. Tests: the back-button session waits for its history moves
|
|
106
|
+
between tests (`backButtonSettled`), a new window's `onMounted` is waited for.
|
|
107
|
+
|
|
108
|
+
### Lists, menus, forms, trees and the filter builder: the developer's data as given
|
|
109
|
+
|
|
110
|
+
- The items of ListBox, DropDown, Lookup, ComboBox, Autocomplete, TagBox, RadioGroup, Toolbar, MenuBar,
|
|
111
|
+
ContextMenu, ActionSheet and a Button's menu, a field's `buttons`, FormLayout's `data` and `items`, TreeView's
|
|
112
|
+
items, FilterBuilder's fields and value and a document's `actions` may be plain or reactive: they are read as
|
|
113
|
+
they are and come back as the very objects given, in events, templates, getters and `x-model`.
|
|
114
|
+
- Their fields are read untracked: a change made in place shows after the new `refresh()`, the same for both
|
|
115
|
+
kinds; a list given anew (or by a function that returns a new one) shows at once, and a function in an item's
|
|
116
|
+
field is still followed. New: `refresh()` on every list and menu control, Field (its buttons), FormLayout
|
|
117
|
+
(with `refreshField(field)`), TreeView (with `refreshItem(key)`) and FilterBuilder.
|
|
118
|
+
- An object value written to a reactive `x-model` stays the very item: the model's copy handed back is not taken
|
|
119
|
+
in its place and reports no second change.
|
|
120
|
+
- A submenu in an ActionSheet and a split button's menu in the toolbar's "more" menu no longer copy the first item
|
|
121
|
+
to draw the line before it.
|
|
122
|
+
- `uiLocale` keeps the set it is given as it is: to change a text, assign a new set
|
|
123
|
+
(`uiLocale.strings = { ...uiLocale.strings, close: 'Kapat' }`); a text changed inside the set is not seen.
|
|
124
|
+
- A property's drawing and its `normalize` run untracked, so a setter called inside an app's own watch adds
|
|
125
|
+
nothing to it, and a Slider range given by a getter is not followed by its numbers changing in place.
|
|
126
|
+
|
|
127
|
+
### Scheduler: the developer's data as given
|
|
128
|
+
|
|
129
|
+
- The appointments and the resource items may be plain or reactive: the Scheduler reads them as they are and never
|
|
130
|
+
wraps, copies or marks them. Events, templates, getters (`shownAppointments`, `seriesOf`, `resourcesOf`) and the
|
|
131
|
+
tooltip hand back the very objects given; its reactive state holds only its own values (a piece's appointment is
|
|
132
|
+
`itemOf(piece)`; the tooltip, the "+N more" list and a drag keep theirs in plain fields; occurrences are plain objects).
|
|
133
|
+
- Their fields are read untracked: a change made in place shows after `refresh()`, `refreshAppointment(item)` or
|
|
134
|
+
`refreshResources()`, the same for both kinds; its own edits and a data source's changes show at once.
|
|
135
|
+
- Delete, a drag, the form and the series edits work on a plain array; an appointment without a key has one id.
|
|
136
|
+
- `addAppointment(values)` stores the object given, not a copy.
|
|
137
|
+
|
|
138
|
+
### DataGrid: the developer's data as given
|
|
139
|
+
|
|
140
|
+
- Rows, columns, actions, toolbar and form items, summary items, filter values and the options of `settings`,
|
|
141
|
+
`toolbar`, `export`, `form`, `popup`, `filterBuilder`, `masterDetail`, `adaptiveDetail` and `rowDragging` may be
|
|
142
|
+
plain or reactive: the grid keeps them as given and hands back the very objects (`grid.toolbar.items` is your
|
|
143
|
+
array, `rowDragging.data` your object). Its reactive state holds only its own values, with a counter per option.
|
|
144
|
+
- Their fields are read untracked: a change made in place shows after `refresh()`, `repaint()`, `repaintRows(keys)`,
|
|
145
|
+
`refreshSummary()` or `refreshActions()`, the same for both kinds. A new array given to `rows` (or returned by
|
|
146
|
+
its function) still loads again; a `push` or `splice` into it now needs `refresh()`.
|
|
147
|
+
- New: `repaintRows(keys)`, `refreshSummary()`, `refreshActions()`. `repaint()` draws the details, the adaptive
|
|
148
|
+
detail, the totals, the toolbar and the actions again too; `refresh()` reads everything again.
|
|
149
|
+
- The editing events (`onEditingStart`, `onEditorPreparing`, `onEditorPrepared`, `onRowValidating`) get the row
|
|
150
|
+
itself in `row` and the values entered apart in `values`, with `getValue(field)`; no merged copy, so a class
|
|
151
|
+
instance keeps its prototype. The same for a custom editor's context, `setCellValue(values, value, row, context)`,
|
|
152
|
+
`validate(value, row, context)`, `validateRow(row, { values, getValue, isNew, changed })`, `options(row, context)`,
|
|
153
|
+
`lookup.filter(row, context)`, `comparisonTarget(row, context)` and `validationCallback({ …, context })`.
|
|
154
|
+
- `grid.changes` lists `added` and `updated` as `{ row, changed }`: the row itself and the values entered.
|
|
155
|
+
`RowChange.original` is gone (it was the same row). Summaries that follow unsaved edits read them beside the rows.
|
|
156
|
+
|
|
157
|
+
### Scheduler: smooth scrolling in big views
|
|
158
|
+
|
|
159
|
+
- The cells of a timeline row and of the day views have no bindings of their own: a cell is written once when it
|
|
160
|
+
is made, and again only when what it shows changes (`CellWriter`, followed once per row or view; the model's
|
|
161
|
+
`look` counter says when the days, columns, time rows or blocked times were written again). The focus writes only
|
|
162
|
+
the cells it left and reached. Cell events are listened for once per row.
|
|
163
|
+
- The day views with many groups keep their cells in places: scrolling shows other columns in the same cells, none
|
|
164
|
+
are made or dropped. Their rows and cells are laid out on their own (`contain`).
|
|
165
|
+
- After a drop only the timeline rows whose appointments changed are laid out again.
|
|
166
|
+
- Measured with a wheel, frame by frame: 1,000 rows × 10,000 appointments in development went from 47 frames over
|
|
167
|
+
33 ms to 2–4 (of about 520) down and from up to 25 to none sideways; the week of 200 groups down from 14 to none.
|
|
168
|
+
|
|
169
|
+
### Design languages: the token model, units and places
|
|
170
|
+
|
|
171
|
+
Any design system is carried by a design language's files alone: a new one, or a new version of one, needs no
|
|
172
|
+
component touched (roadmap/28-token-model.md). This replaces `tokens/component/` and its `identity/` mappings
|
|
173
|
+
mentioned further down.
|
|
174
|
+
|
|
175
|
+
- **Schema and languages.** `tokens/schema/<component>.json` names a component's tokens; every language is a folder,
|
|
176
|
+
`tokens/languages/<language>/`, with the values its design draws. The build checks every language against the
|
|
177
|
+
schema and the design system's references and types. `npm run language -- <name> [--from <language>]` starts a new
|
|
178
|
+
language; the docs Style menu and the checks take the list of languages from the design system.
|
|
179
|
+
- **Units.** Every piece a design could draw on its own is a unit (`$units`): the field's box, frame, notch, active
|
|
180
|
+
indicator, label, buttons and help line; a button's face, caption, spinner and split parts; a list's items; a
|
|
181
|
+
slider's segments, knob and stops; and so on for every component. The build gives each unit the same box (display,
|
|
182
|
+
size, margin and padding per side, fill, frame per side, corners, shadow and glow, backdrop, opacity, scale,
|
|
183
|
+
rotation, translation, text, outline, icon) in each of its states and paints it in `src/generated/units.css`; a
|
|
184
|
+
unit standing upright (a vertical slider) is turned a quarter by the build. A language writes only what its design
|
|
185
|
+
has: a piece it leaves out stays invisible, and pieces it shows as one have the space and the corners between
|
|
186
|
+
them at 0. Component CSS keeps the layout only.
|
|
187
|
+
- **Slots and places.** A component reads its tokens through slots on its own root (`--_<component>-…`), so one
|
|
188
|
+
instance's values never flow into another inside it. Where a component holds a part (a list in a popup, a field in
|
|
189
|
+
a grid cell, a toolbar's buttons) a place decides that part's units there.
|
|
190
|
+
- **Shapes.** `tokens/shapes/kit.shapes.json` describes shapes by kind (circle, ellipse, rounded polygon, rect,
|
|
191
|
+
wave: soft burst, cookies, sunny, pill, pentagon …); the build turns each into a `polygon()` of the same 180
|
|
192
|
+
points, so one becomes the next smoothly. A `shape` token names one.
|
|
193
|
+
- Every look in every language and theme is unchanged by the move, measured by pixel and computed-style compares,
|
|
194
|
+
except where a language now draws its source: below.
|
|
195
|
+
|
|
196
|
+
### Material 3 Expressive, from its specs and videos
|
|
197
|
+
|
|
198
|
+
- **Slider:** a 16 px track of segments with a 6 px gap at each side of a 4 × 44 px bar handle that narrows to 2 px
|
|
199
|
+
pressed or focused, 2 px inner corners, stop dots at the ends of the inactive track, the steps as dots on the
|
|
200
|
+
track; centred (`origin`) and range sliders the same way; the value as a pill on the inverse surface.
|
|
201
|
+
- **Loading indicator (Spinner):** a filled shape that becomes the next of seven (soft burst, 9-sided cookie,
|
|
202
|
+
pentagon, pill, sunny, 4-sided cookie, oval) with a spring while it turns; `contained` draws it in a disc
|
|
203
|
+
(`accent.subtle`, the shape in `accent.on-subtle`). A busy button turns the same shape in its place.
|
|
204
|
+
- **Progress indicator (ProgressBar):** while the value is known the bar is a wave travelling along, flat while short
|
|
205
|
+
and again at 100 %, with a gap, the rest of the track and a stop dot; `shape="circle"` the same round a ring. While
|
|
206
|
+
the value is not known both stay as they were.
|
|
207
|
+
|
|
208
|
+
### New in the components
|
|
209
|
+
|
|
210
|
+
- `Slider`: `origin` (a centred slider), a track of segments that can stop short of the thumbs (`track-gap`), stop
|
|
211
|
+
dots, a halo, a knob and a core, a value bubble with an arrow, `tick-label-room`; a disabled slider sends nothing
|
|
212
|
+
with its form.
|
|
213
|
+
- `Spinner`: `contained`; a shape instead of the ring where the language draws one.
|
|
214
|
+
- `ProgressBar`: `shape: 'line' | 'circle'` (a determinate and a turning circle), `labelPosition: 'bottom'`, a wave.
|
|
215
|
+
- `Button`: the caption is an element (`.mx-button__text`), so a language can trim its line box (`text-box`) and
|
|
216
|
+
centre the letters optically; `data-icon-only`; `readLook()`. `Field`: `readLook()`. Both for a control placed in
|
|
217
|
+
the page outside the component tree.
|
|
218
|
+
- `Accordion`: the chevron stands in a plate of its own (`.mx-accordion__plate`).
|
|
219
|
+
- `Toolbar` measures again when a control takes another size or variant from its place.
|
|
220
|
+
|
|
221
|
+
### Design languages
|
|
222
|
+
|
|
223
|
+
- Material and Fluent in the docs Style menu next to Tactile and Lounge, with per-language component
|
|
224
|
+
mappings in `tokens/component/identity/material/` (from the Material 3 component specs) and
|
|
225
|
+
`tokens/component/identity/fluent/` (from the WinUI 3 theme resources).
|
|
226
|
+
- Every kit stylesheet paints only with its own component tokens, one per role: fills and text per
|
|
227
|
+
state, frame and edge per side, the raised face (`<c>.shadow`), the marks (tab indicator,
|
|
228
|
+
selection bar, check mark) and keyboard focus (`<c>.focus-width|offset|color|halo`). A language can
|
|
229
|
+
change any of them for one component. `tests/tokens.test.ts` enforces it, and the focus rule
|
|
230
|
+
too. New: `tokens/component/{textbox,dropdown,combobox,base}.tokens.json` (`--mx-glyph-size`,
|
|
231
|
+
`--mx-disabled-fg`). Surfaces read the design system's `elevation.*` (Material's toast is level 3
|
|
232
|
+
there now). Every look in every language and theme is unchanged, measured.
|
|
233
|
+
- Lilac in the Style menu, with its own spacing in `tokens/component/identity/lilac/` (more room
|
|
234
|
+
between a label and its field, between form rows and columns, in popups, tooltips, toasts, dialogs,
|
|
235
|
+
tabs, accordions and calendars; 18 px check boxes and radios; a 3 px tab indicator; a framed field
|
|
236
|
+
shows focus as a 2 px lilac ring all around, from its field tokens). `e2e/checks/37-design-languages.mjs` measures it too.
|
|
237
|
+
- A split button's focus ring is drawn whole: the focused part sits above the arrow next to it.
|
|
238
|
+
- Material: pill tabs and the tab scroll buttons are fully round (the segmented button shape).
|
|
239
|
+
- Tools: `npm run fingerprint` / `fingerprint:compare` (the computed look of every element on every
|
|
240
|
+
docs page, in every language, theme and state, compared), `e2e/state-sheet.mjs` (every part in
|
|
241
|
+
every state and language on one page) and `e2e/checks/37-design-languages.mjs` (each language
|
|
242
|
+
measured against its source).
|
|
243
|
+
|
|
244
|
+
### Check boxes and radios
|
|
245
|
+
|
|
246
|
+
- The check box, the radio circle and the check boxes of DataGrid, ListBox and TreeView draw one
|
|
247
|
+
stroke all around; the pressable depth is a 1px shadow under the mark instead of a darker bottom
|
|
248
|
+
border, which vanished on dark backgrounds and left the outline open at the bottom.
|
|
249
|
+
- `checkbox.radius` and the `check-radius` of DataGrid, ListBox and TreeView read the design
|
|
250
|
+
system's new `radius.xs`, so a check box stays square in a design language with round corners
|
|
251
|
+
(Lounge). Same 4px as before in Tactile.
|
|
252
|
+
- The docs site has a Style menu (Tactile / Lounge) next to Theme, kept between visits.
|
|
253
|
+
|
|
254
|
+
### rewrite
|
|
255
|
+
|
|
256
|
+
- The components are being rewritten from scratch, one at a time. Removed: `Button`, `Label`,
|
|
257
|
+
`Panel`, `Stack`, `Grid`, `GroupBox`, `SplitContainer`, `MxForm`, their component tokens and docs
|
|
258
|
+
pages, the layout props of `Control` (`dock`, offsets, size, grid cells), `UiLocale`,
|
|
259
|
+
`FormResult` / `CloseReason` and the `x-model` helpers of `Control`. The entries below describe
|
|
260
|
+
them as they were.
|
|
261
|
+
- Kept: `Control`, `FocusContainer`, `addShortcut`, `parseAccessKey`, the focus guard and the
|
|
262
|
+
`enabled` cascade. The window stack marks a modal window with `modal`. The token build writes
|
|
263
|
+
empty files when there are no component tokens.
|
|
264
|
+
|
|
265
|
+
### Button
|
|
266
|
+
|
|
267
|
+
- `Button`: a native `<button>`; `variant` (solid / outline / ghost), `tone` (standard / accent /
|
|
268
|
+
danger), `size` (sm / md / lg) from the density tokens, pressable solid faces; `text` with an `&`
|
|
269
|
+
access key or JSX children; `icon` (an address, an element or a component) at the start or end;
|
|
270
|
+
`stretch`, `type`, `hint`; `toggle` / `pressed` with `x-model`; `busy` (spinner, presses ignored,
|
|
271
|
+
size kept, `aria-busy`); `focusableWhenDisabled` (`aria-disabled`, stays in the Tab order). Every
|
|
272
|
+
prop is a value or a function and a settable, reactive property; set from code, a function is
|
|
273
|
+
bound and followed too (`Control` setters as well: `ctrl.enabled = () => !state.busy`).
|
|
274
|
+
- A menu: `menu` (items with icon, hint, enabled, visible, checked, beginGroup, each a value or a
|
|
275
|
+
function the open menu follows; click, data) or any
|
|
276
|
+
content (`dropDown`), opened by the whole button or, with `split`, by an arrow next to it while the
|
|
277
|
+
button keeps its own action; `split` changes live; `opened`, `open()`, `close()`, `onItemClick`.
|
|
278
|
+
- Shared parts: `Popup` (top layer, follows its anchor, flips when there is no room, closes on
|
|
279
|
+
Escape / a press outside / focus leaving, gives focus back) and `MenuList` (arrows, Home / End,
|
|
280
|
+
letters, `&` keys); `placePopup`; `IconSource`.
|
|
281
|
+
- `uiLocale` / `enStrings` / `trStrings` / `UiStrings`: the texts controls write, reactive, starting
|
|
282
|
+
with the page's `lang`.
|
|
283
|
+
- Component tokens `button.*`, `popup.*`, `menu.*`. `@motifx/core` 1.2.0-rc.19.
|
|
284
|
+
|
|
285
|
+
### TextBox
|
|
286
|
+
|
|
287
|
+
- `TextBox`: a native `<input>` in a field frame; `label` (`&` access key) with `labelMode` top /
|
|
288
|
+
side / floating / hidden, `placeholder`, `helpText`, `hint`, `prefix` / `suffix`, `icon`,
|
|
289
|
+
`buttons` (your own, each with `enabled`, `visible`, `position`, `tabStop`), `clearButton`
|
|
290
|
+
(Escape too), `type` (text, password with a reveal button, email, search, tel, url), `maxLength`
|
|
291
|
+
/ `minLength` / `showCounter`, `updateOn` input / change, `selectOnFocus`, `align`, `readOnly`,
|
|
292
|
+
`required`, `size`, `variant` (outline, filled, underline), `stretch`, `inputMode`,
|
|
293
|
+
`autocomplete`, `spellcheck`, `name`; `onValueChanged` (`byUser`), `onEnter`, `onValidated`.
|
|
294
|
+
- Mask: `mask` (`0` digit, `9` optional digit, `a` letter, `*` letter or digit, `\` fixed),
|
|
295
|
+
`maskChars` (own characters with case), `maskPlaceholder`, `maskValue` raw / formatted,
|
|
296
|
+
`showMask`; typing, deleting and pasting follow the mask; an unfilled mask fails validation.
|
|
297
|
+
- Validation: `rules` (required, email, url, pattern, length, range, compare, custom, async),
|
|
298
|
+
`error` from outside, `validateOn` blur / input / manual, `isValid`, `validationMessage`,
|
|
299
|
+
`validating`, `validate()`, `resetValidation()`; `ValidationGroup` and `validateFields(root)`
|
|
300
|
+
focus the first failed field. Messages come from `uiLocale` and follow it.
|
|
301
|
+
- Shared parts: `Field` (the base of every editor), `InputMask` / `MaskedText` / `parseMask`
|
|
302
|
+
(work on any `<input>`), `checkRules`. `Control.changeProperty` stores a user's value without
|
|
303
|
+
dropping a bound getter. New `uiLocale` texts. Component tokens `field.*`.
|
|
304
|
+
|
|
305
|
+
### The rest of the set
|
|
306
|
+
|
|
307
|
+
- Editors: `TextArea` (auto-grow between `minRows` / `maxRows`, resize, counter, Ctrl+Enter),
|
|
308
|
+
`NumberBox` (`min` / `max` / `step` / `largeStep`, spin buttons that repeat, wheel, `Intl` formats
|
|
309
|
+
with locale-aware typing, decimal arithmetic, `clamp`, `allowEmpty`), `Slider` (one value or a
|
|
310
|
+
range, ticks and labels, value bubble, vertical, RTL).
|
|
311
|
+
- Choice: `CheckBox` (three states), `Switch`, `RadioGroup` (APG keys, columns), `ListBox` (single or
|
|
312
|
+
multiple, select all, search, data sources), `TagBox` (tags, search, `maxTags`, custom values).
|
|
313
|
+
- Data: `TreeView` (nested or flat items, lazy children with retry, selection, tri-state check boxes,
|
|
314
|
+
filter, long trees drawn in view), `DataGrid` (moved in from motifjs-data-grid onto
|
|
315
|
+
`@motifx-community/data`: virtual or paged, sorting, column layout, editing with the kit's
|
|
316
|
+
editors, new rows, three save modes, row actions, selection over any number of rows, filter row
|
|
317
|
+
and header filter, copy and paste, CSV export, a saved layout). Rows stay in place in the DOM
|
|
318
|
+
while scrolling; the reading order is given through `aria-owns`. `resizeMode` (grid and column):
|
|
319
|
+
`widget` resizes the column alone, `nextColumn` moves only the edge between it and the next column.
|
|
320
|
+
- `DataGrid` lookup columns: `lookup` (a `DataSource` of any adapter, also of another service, or an
|
|
321
|
+
array; `valueField`, `textField`, `searchFields`, `filter(row)`, `allowClearing`, `resolve`
|
|
322
|
+
`batch` / `byKey`, `batchSize`, `sortBy`, `editor` `dropdown` / `combobox` / `lookup`,
|
|
323
|
+
`editorOptions`). Only the keys on the screen are asked for, several in one request, and only the
|
|
324
|
+
cells that show them are drawn again; loading and "not found" states; the chosen text is
|
|
325
|
+
remembered. `textFrom` and `sortField` on any column; `setCellValue` (also async) and the
|
|
326
|
+
`onEditorPreparing` event for every column; the `syncLookupFilterValues` setting (grid and
|
|
327
|
+
column); `refreshLookups()`. Filter row "(All)" lists, header filter texts, copy, export and paste
|
|
328
|
+
by text, and a key the source does not have stops its row from being saved.
|
|
329
|
+
- `DataGrid` search panel and toolbar. `searchPanel` (with `searchPanelWidth`, `searchPlaceholder`,
|
|
330
|
+
`searchDelay`, `highlightSearchText`, `highlightCaseSensitive`, `searchVisibleColumnsOnly`, all
|
|
331
|
+
live) puts a search box in a toolbar above the rows; `searchText` (followed, told back through
|
|
332
|
+
`onSearchTextChanged`), `searchByText()`, `searchable` (grid and column; a column that turns its
|
|
333
|
+
filters off is left out). Text columns contain the text, numbers, dates and yes/no equal it when it
|
|
334
|
+
reads as one, lists match their option texts, lookup columns ask their own source for the keys
|
|
335
|
+
whose text holds it (`lookup.searchLimit`) or search a `textFrom` field; the columns are joined
|
|
336
|
+
with OR and with the filters with AND, a text no column reads keeps no row, and the filter goes to
|
|
337
|
+
the data source like any other. What was found is marked with `<mark>`; the count is announced; the
|
|
338
|
+
text is kept with the layout. `toolbar` (`visible`, `items`, also `grid.toolbar`, live): the grid's
|
|
339
|
+
own items (`addRowButton`, `saveButton`, `revertButton`, `exportButton`, `columnChooserButton`,
|
|
340
|
+
`searchPanel`) whose features are on, or the listed ones, changed by name, and items of the app's
|
|
341
|
+
own (buttons or `content`) at the start or the end, on the kit's `Toolbar` with its "more" menu.
|
|
342
|
+
"New row", "Save changes" / "Discard" and "Export" moved from the bar under the rows to the toolbar
|
|
343
|
+
(the bar keeps the counts, the error summary and the pager); `columnChooserButton` setting,
|
|
344
|
+
`showColumnChooser()`; the `gridPendingChanges` text went with the bar's old buttons. `clearFilters()`
|
|
345
|
+
also clears the search text. `KeyedItems.searchInMemory`.
|
|
346
|
+
- `DataGrid` grouping. Column `groupIndex` (followed when a function), `groupable` (grid and
|
|
347
|
+
column), `showWhenGrouped`, `autoExpandGroup`, `calculateGroupValue` (a function for rows in
|
|
348
|
+
memory, a field for a server) and `groupCell`; settings `groupPanel`, `groupPanelDragging`,
|
|
349
|
+
`groupPanelEmptyText`, `autoExpandAll`, `groupExpandMode` (`button` / `rowClick`, also per column),
|
|
350
|
+
`remoteGrouping` (`auto` / `true` / `false`), `groupLoadPageSize`, `groupToggleKeys`,
|
|
351
|
+
`groupArrowKeys`, `dragThreshold`, and the column features `groupable`, `showWhenGrouped`,
|
|
352
|
+
`allowCollapsing`, `groupCount`, `groupMenu` (grid and column, the column wins), all live; column
|
|
353
|
+
`groupCompare`; grid `groupCell`; export option `groups`. `grid.group` (read and assign),
|
|
354
|
+
`groupBy(field, index?, dir?)`, `ungroup(field)`, `setGroupOrder(field, dir)`, `clearGrouping()`,
|
|
355
|
+
`expandAll(level?)`, `collapseAll(level?)`, `expandGroup(key)`, `collapseGroup(key)`,
|
|
356
|
+
`isGroupExpanded(key)`; `onRowExpanding` / `onRowExpanded` / `onRowCollapsing` / `onRowCollapsed`,
|
|
357
|
+
`onGroupingChanging` / `onGroupingChanged` (user or code) and `onGroupDropping` (a header or chip
|
|
358
|
+
dropped), the "before" ones cancellable. Group rows are pooled like data rows: "Column: value (count)" (a lookup's
|
|
359
|
+
text, the column's format, "(empty)"), an arrow, moved in by level; a closed group is one row, in
|
|
360
|
+
the virtual list and in pages alike. The grid is a `treegrid` while grouped (`aria-expanded`,
|
|
361
|
+
`aria-level`, `aria-colspan`). Enter / Space open and close a group row, Right and Left open and
|
|
362
|
+
close it and go in and out. The group panel (`groupPanel` toolbar item, at the start): headers
|
|
363
|
+
dropped anywhere on the toolbar group (the bar is outlined while a header is dragged and filled
|
|
364
|
+
under the pointer; a copy of the dragged header or chip follows the pointer, marked when a drop
|
|
365
|
+
would group, move or ungroup; `dragGhost` turns it off), chips turn the order of their groups (click, Enter), move (drag, Shift +
|
|
366
|
+
arrows) and ungroup (Delete, or dragged back onto the headers, where the column lands); the column
|
|
367
|
+
menu has "Group by this column", "Ungroup", "Ungroup all". A grouped column leaves the columns and
|
|
368
|
+
the sort; its header sorts its groups. Data: rows in memory and sources that load everything are
|
|
369
|
+
grouped in memory; a source that loads by blocks over an adapter that groups is asked for the
|
|
370
|
+
groups only and loads the rows of the open groups where the list looks; anything else gets every
|
|
371
|
+
matching row grouped in memory. Filters, search, selection, editing (a saved row moves to its
|
|
372
|
+
group), copy (a group row copies its text), the CSV export (a "Column: value" line per group) and
|
|
373
|
+
the kept layout (`group`) work with it. Texts `gridGroup…` / `gridUngroup…` in en and tr; component
|
|
374
|
+
tokens `datagrid.group-*`, `chip-*`, `panel-empty-color`, `drop-target`.
|
|
375
|
+
- `KeyedItems` (shared, batched key → item cache per source and value field); `DataItems.find`
|
|
376
|
+
goes through it. `DropDown` and `ComboBox` ask for a value on no loaded page by their `valueField`
|
|
377
|
+
when it is a field. `DropDown.open(search)` starts the search box with a text.
|
|
378
|
+
- Layout and windows: `Stack`, `Grid`, `DockPanel`, `Panel`, `GroupBox`, `SplitContainer`, `Tabs`,
|
|
379
|
+
`Accordion`, `MxForm` (window and modal form, `show` / `showDialog`, move, resize, minimize,
|
|
380
|
+
maximize, nested modals), `messageBox`, `confirm`.
|
|
381
|
+
- Commands: `Toolbar` (roving focus, overflow menu), `MenuBar`, `ContextMenu`; `MenuList` gained
|
|
382
|
+
submenus, shortcuts and radio items.
|
|
383
|
+
- `DataGrid`: every behaviour is the developer's, today's value its default. New settings
|
|
384
|
+
`tooltipDelay` (500), `extraRows` (4), `columnWidth` (140), `columnMinWidth` (48), `rowStatusWidth`
|
|
385
|
+
(28), `selectionColumnWidth` (36), `resizeStep` (10), `resizeFineStep` (1), `pagerNeighbors` (1),
|
|
386
|
+
`pagerNavigation` (`true`), `pagerInfo` (`true`), `headerFilterPageSize` (100), `headerFilterRows`
|
|
387
|
+
(8), `exportPageSize` (1000), `trueTexts` / `falseTexts`, `editKeys` (`['Enter', 'F2']`),
|
|
388
|
+
`clearKeys` (`['Delete']`), `editOnKeyPress` (`true`), `startEditAction` (`'dblClick'`); column
|
|
389
|
+
fields `headerCell`, `editOnKeyPress`, `startEditAction`, `trueTexts`, `falseTexts` (a column's
|
|
390
|
+
value wins); lookup fields `pageSize` (50), `filterSearchLimit` (1000), `parallelRequests` (6),
|
|
391
|
+
`pasteSearchLimit` (50); prop `layoutStorage` (default `localStorage`). Events, DevExtreme's names,
|
|
392
|
+
`…ing` cancelable: `onCellClick`, `onCellDblClick`, `onRowClick`, `onRowDblClick`, `onCellPrepared`,
|
|
393
|
+
`onRowPrepared`, `onContentReady`, `onDataErrorOccurred`, `onEditingStart`, `onInitNewRow`,
|
|
394
|
+
`onSaving` / `onSaved`, `onRowInserting` / `Inserted`, `onRowUpdating` / `Updated`, `onRowRemoving` /
|
|
395
|
+
`Removed`, `onEditCanceling` / `Canceled`, `onFocusedCellChanging` / `Changed`,
|
|
396
|
+
`onFocusedRowChanging` / `Changed`, `onKeyHandling` (DevExtreme's `onKeyDown`, a DOM event name in
|
|
397
|
+
JSX), `onOptionChanged`, `onExporting` / `onExported`, `onContextMenuPreparing` (the column menu's
|
|
398
|
+
items, and a row menu on right click or Shift + F10 when items are added), `onToolbarPreparing`,
|
|
399
|
+
`onSelectionChanging`, `onSortChanging` / `Changed`, `onFilterChanging` / `Changed`,
|
|
400
|
+
`onPageChanging` / `Changed`, `onLayoutChanging`, `onSearchTextChanging`, `onCopying`, `onPasting`;
|
|
401
|
+
every event also as `grid.onX(fn)`. State and methods: `status`, `loadError`, `failedBlocks`,
|
|
402
|
+
`editingCell`, `saving`, `exporting`, `focusedRowIndex`, `focusedRowKey`, `getVisibleRows()`,
|
|
403
|
+
`getRowElement()`, `getCellElement()`, `getKeyByRowIndex()`, `getRowIndexByKey()`, `byKey()`,
|
|
404
|
+
`cellValue()`, `navigateToRow()`, `focusCell()`, `editCell()`, `editRow()`, `closeEditCell()`,
|
|
405
|
+
`beginUpdate()` / `endUpdate()`, `repaint()`, `columnOption()`, `getCombinedFilter()`, `state()`.
|
|
406
|
+
`OptionList` `extraRows` (6) and `typingDelay` (600); `KeyedItems` `parallelRequests` (6) and
|
|
407
|
+
`pasteSearchLimit` (50).
|
|
408
|
+
- `DataGrid` summaries, as DevExtreme's `summary`. Prop and property `summary` (`totalItems`,
|
|
409
|
+
`groupItems`, `calculateCustomSummary`, `recalculateWhileEditing`, `skipEmptyValues`, `texts`, each
|
|
410
|
+
followed when a function); item fields `column`, `summaryType` (`sum`, `min`, `max`, `avg`, `count`,
|
|
411
|
+
`custom`), `name`, `showInColumn`, `valueFormat` (`Intl` options or a function; default the column's
|
|
412
|
+
format), `displayFormat` (`{0}`, `{1}`), `customizeText`, `alignment`, `cssClass`, `skipEmptyValues`,
|
|
413
|
+
`visible`, and for group items `showInGroupFooter`, `alignByColumn`. Settings `totalSummary`,
|
|
414
|
+
`groupSummary` (an item's `visible` wins), `totalSummaryTabStop`, `remoteSummary` (`auto` / `true` /
|
|
415
|
+
`false`); `groupLoadPageSize` also paces every-row loads for summaries. `getTotalSummaryValue(name)`
|
|
416
|
+
(by name, place, type, column or `type_column`), `getGroupSummaryValue(key, name)`, `summaryStatus`,
|
|
417
|
+
`onSummaryChanged` (`{ total, editing }`). The row of totals sits under the rows in a sticky row group,
|
|
418
|
+
moves sideways with the columns (sticky ones stay), stacks several items in a column, is a row of the
|
|
419
|
+
ARIA model and a Tab stop of its own; its cells read as items that name their column ("Sum of Amount:
|
|
420
|
+
1,234"). Group items show after the group row's count, under their columns in the group row, or in
|
|
421
|
+
group footer rows (pooled like the other rows, reached by the arrows, in pages too). Totals of rows in
|
|
422
|
+
memory are worked out in the data path; a source that loads pages or blocks asks its adapter
|
|
423
|
+
(`DataSource.loadSummary`) or loads every matching row once (shared with grouping); a server that
|
|
424
|
+
groups gets the group summaries with the groups, and group items only memory can work out group in
|
|
425
|
+
memory. `rowType` `groupFooter` and `totalFooter` in the click and prepared events; `GroupCellContext`
|
|
426
|
+
`summaryItems`. Export: group footers after their rows and the totals last in the CSV and
|
|
427
|
+
`exportRows()`, group items on the group lines; option `summaries`. Texts `gridSummary…`,
|
|
428
|
+
`gridSummarySeparator`, `gridTotalSummary` in en and tr.
|
|
429
|
+
- Feedback: `ProgressBar`, `Spinner` (with `Spinner.cover`), `Tooltip` / `addTooltip`, `Toast` /
|
|
430
|
+
`toast` / `Toaster`.
|
|
431
|
+
- `Control` binds DOM events given from code (`new Button({ onclick })`); its private state getter is
|
|
432
|
+
`controlState`, so a subclass may have a `state` field.
|
|
433
|
+
- Fixed: `Stack`, `Grid` and `DockPanel` overflowed the call stack when a child was added in their
|
|
434
|
+
`ref`. `TreeView` reported a check again and again when `checkedKeys` was bound both ways with
|
|
435
|
+
`onCheckChanged` writing the keys back; keys equal to the checked ones now change nothing. A tooltip
|
|
436
|
+
shown for keyboard focus closed at once when focusing scrolled its field into view; it now follows
|
|
437
|
+
the field while the page scrolls and closes only if the field is off the screen when scrolling ends.
|
|
438
|
+
|
|
439
|
+
### DataGrid PDF export and row drag and drop
|
|
440
|
+
|
|
441
|
+
- A new entry, `@motifx-community/ui/pdf`, with `exportDataGrid({ jsPDFDocument, component, … })`
|
|
442
|
+
(DevExtreme's `pdfExporter.exportDataGrid`): jsPDF is an optional peer dependency, the entry draws
|
|
443
|
+
the grid's `exportSheet()` on the document with jsPDF's own calls (no table plugin): the header rows
|
|
444
|
+
with bands merged over their columns, the data rows with the grid's texts and alignment, the group
|
|
445
|
+
rows across the row, group footers, the totals; the grid's widths narrowed to the page; rows that do
|
|
446
|
+
not fit go on to the next page under the header rows again; right to left from the right edge.
|
|
447
|
+
Options: `topLeft`, `columnWidths`, `margin` (40 pt), `indent`, `repeatHeaders` (`true`),
|
|
448
|
+
`selectedRowsOnly`, `loadPanel` (with Stop), `customizeCell({ gridCell, pdfCell })`,
|
|
449
|
+
`customDrawCell({ doc, rect, gridCell, pdfCell, cancel })`, `onRowExporting({ rowCells, rowHeight })`;
|
|
450
|
+
ours: `fitColumns` (`'shrink'` / `'fill'` / `'none'`), `wordWrapEnabled`, `fontSize`, `headers`,
|
|
451
|
+
`groups`, `summaries`, `pageSize`, `onProgress`, `signal`. It resolves with where the table ends
|
|
452
|
+
(`{ page, y }`). Types `PdfExportOptions`, `PdfCell`, `PdfCustomizeCellArgs`, `PdfCustomDrawCellArgs`,
|
|
453
|
+
`PdfRowExportingArgs`, `PdfExportResult`, `PdfMargin`. `'pdf'` in `export.formats` puts “Export all
|
|
454
|
+
data to PDF” in the toolbar's menu (`onExporting` with `format: 'pdf'`).
|
|
455
|
+
- An export given a signal that is already stopped, or stopped while rows in memory are collected,
|
|
456
|
+
now rejects with the `AbortError` instead of going on.
|
|
457
|
+
- Row drag and drop (DevExtreme's `rowDragging`): the `rowDragging` prop and the live
|
|
458
|
+
`grid.rowDragging` — `allowReordering`, `allowDropInsideItem`, `dropFeedbackMode` (`'indicate'`: a
|
|
459
|
+
line; `'push'`: the rows make room), `showDragIcons` (a drag icon column pinned to the start; off:
|
|
460
|
+
the whole row), `handle`, `group` (drag between grids), `data`, `dragDirection`, `boundary`,
|
|
461
|
+
`container`, `cursorOffset`, `dragTemplate`, `autoScroll` / `scrollSpeed` / `scrollSensitivity`;
|
|
462
|
+
ours: `keyboard`, `moveUpKeys` / `moveDownKeys` (`Ctrl+Shift+ArrowUp` / `Down`), `columnWidth`. A
|
|
463
|
+
copy of the row follows the pointer (`settings.dragGhost`, `dragThreshold`); the rows scroll near
|
|
464
|
+
the edges, also over pooled rows of the virtual list. Handlers `onDragStart`, `onDragMove`,
|
|
465
|
+
`onDragChange`, `onDragEnd` (cancelable, `GridRowDragEventArgs`) and `onReorder`, `onAdd`,
|
|
466
|
+
`onRemove` (`GridRowDropEventArgs`, with `promise`), with `fromIndex`, `toIndex`, `itemData`,
|
|
467
|
+
`itemKey`, `toItemData`, `dropInsideItem`, `fromComponent`, `toComponent`, `fromData`, `toData`.
|
|
468
|
+
`moveRow(fromIndex, toIndex)`; Escape cancels a drag; moves are announced. Texts `gridDragColumn`,
|
|
469
|
+
`gridDragRow`, `gridRowMoved`, `gridRowMovedTo`, `gridRowDroppedOnto`, `gridRowMoveFirst`,
|
|
470
|
+
`gridRowMoveLast`, `gridRowDragCanceled` (en/tr); tokens `datagrid.drag-color`, `drag-radius`,
|
|
471
|
+
`row-drag-opacity`, `row-drag-placeholder`, `row-drop-color`, `row-drop-width`,
|
|
472
|
+
`row-drop-inside-width`, `row-ghost-radius`.
|
|
473
|
+
- Docs: “Export to PDF” on the Selection and export page; a new page “Row drag and drop”
|
|
474
|
+
(`/datagrid/drag`: reorder in memory, on a server with an order field, between two grids);
|
|
475
|
+
`e2e/checks/43-datagrid-pdf-drag.mjs`.
|
|
476
|
+
|
|
477
|
+
### DataGrid infinite scrolling and virtual columns
|
|
478
|
+
|
|
479
|
+
- Infinite scrolling (DevExtreme's `scrolling.mode: 'infinite'`): `mode: 'infinite'` next to
|
|
480
|
+
`'virtual'` and `'paged'`. The rows show part by part (`pageSize` for rows in memory, the block size
|
|
481
|
+
of a source that loads by blocks), the next part loading as the view nears the end; the scroll bar
|
|
482
|
+
grows with the rows that came, and the rows stay pooled and in the source's block cache. No total is
|
|
483
|
+
needed: over a source with `count: false` a part that comes back short ends the rows. While a part
|
|
484
|
+
loads a “Loading more rows…” mark shows over the last rows, with Retry when it fails (the bottom
|
|
485
|
+
bar does with the mark off; Retry asks `onMoreRowsLoading` first); the pager is hidden; Ctrl+End goes
|
|
486
|
+
to the last row shown and loads the next part; a sort, filter, search or grouping starts again from
|
|
487
|
+
the first part. Grouped rows, details, the selection, the row in edit and the focused row keep
|
|
488
|
+
working; “select all” and the export take every row. Settings `loadMoreDistance` (`0`),
|
|
489
|
+
`preloadEnabled` (`false`; in virtual mode it loads a part on each side of the view),
|
|
490
|
+
`loadMoreIndicator` (`true`). `loadMore()`, `loadingMore`, `endReached`,
|
|
491
|
+
`onMoreRowsLoading` (cancelable, `{ skip, take }`) and `onMoreRowsLoaded` (`{ skip, count, ended }`);
|
|
492
|
+
in infinite mode `pageIndex()` is the last part shown and `pageIndex(n)` loads up to it, `pageCount`
|
|
493
|
+
counts the parts, `totalCount()` is −1 until the end is known, `aria-rowcount` −1 too. Texts
|
|
494
|
+
`gridLoadingMore`, `gridLoadMoreFailed`, `gridRecordsLoaded` (en/tr); tokens `datagrid.more-gap`,
|
|
495
|
+
`more-padding-block`, `more-padding-inline`, `more-offset`, `more-radius`, `more-color`,
|
|
496
|
+
`more-danger-color`, `more-background`, `more-shadow`.
|
|
497
|
+
- Virtual columns (DevExtreme's `columnRenderingMode: 'virtual'`): `settings.columnRenderingMode`
|
|
498
|
+
(`'standard'`) and a column's own `columnRenderingMode`, which wins. Only the scrolling columns in
|
|
499
|
+
view and `extraColumns` (`2`) on each side get cells, in the header, the filter row, the rows, the
|
|
500
|
+
group rows' items under their columns, the group footers and the totals; pinned columns, the active
|
|
501
|
+
column, the column in edit and the columns that stay `'standard'` always do. Cells keep their track
|
|
502
|
+
(the per-grid sheet places them by number), `aria-colindex` and `aria-colcount` stay the real ones; a
|
|
503
|
+
band header spans its columns drawn only and keeps its real `aria-colindex` / `aria-colspan`.
|
|
504
|
+
Resizing, moving (over columns without cells too), pinning and “Fit all columns” work as before; the
|
|
505
|
+
keyboard moves into a column without cells, which gets them and scrolls into view; CSV, Excel and
|
|
506
|
+
PDF write every column. `renderAsync` (`'auto'`), `columnRenderingThreshold` (`300` ms) and
|
|
507
|
+
`columnRenderingDelay` (`300` ms) decide whether new columns are drawn as the rows scroll or once the
|
|
508
|
+
scrolling stops. Measured in Chrome on 200 columns × 100,000 rows: 4,776 cells in the page before,
|
|
509
|
+
154 after (206 at most while scrolling sideways); scrolling down 26–27 fps before, 48–51 after;
|
|
510
|
+
sideways about 60 fps both ways.
|
|
511
|
+
- The band header rows keep every band and the pieces over pinned columns on one line (a piece over a
|
|
512
|
+
pinned column could fall to a line of its own, with no height).
|
|
513
|
+
- Docs: a new page “Scrolling” (`/datagrid/scrolling`: the modes, infinite scrolling over a slow
|
|
514
|
+
server without a count, rows in memory grouped part by part, 200 virtual columns);
|
|
515
|
+
`e2e/checks/44-datagrid-infinite-columns.mjs`.
|
|
516
|
+
|
|
517
|
+
### DataGrid band headers and adaptive columns
|
|
518
|
+
|
|
519
|
+
- Bands (DevExtreme's band columns): a `GridBand` in `columns` (`title`, `columns` — columns and
|
|
520
|
+
bands to any depth —, `name`, `align`, `sticky`, `hidden`, `movable`, `hideable`, `pinnable`,
|
|
521
|
+
`menu`, `headerCell`), or given flat with `isBand` and a column's `ownerBand` (a band's `name` or
|
|
522
|
+
place). The header becomes a row per level of bands over the titles, each band's header over its
|
|
523
|
+
columns (`columnheader` with the `aria-colindex` of its first column and `aria-colspan`; the band
|
|
524
|
+
rows count in `aria-rowindex` / `aria-rowcount`). A column moves only inside its band (dragging,
|
|
525
|
+
“Move”, `visibleIndex`), a band among its neighbours with all its columns; a band is pinned, hidden
|
|
526
|
+
and moved as a whole (pinning a column in a band pins its band); a band header does not sort.
|
|
527
|
+
Hiding all its columns hides a band. A band's menu (its button, Alt+Down): pin, move, hide, the
|
|
528
|
+
column chooser, reset. Up from a column's header goes to its band's, Down back, Left / Right along
|
|
529
|
+
the bands of a row. With bands the column chooser is a `TreeView` with check boxes. The layout
|
|
530
|
+
keeps `bands` (each band's hidden state and side; its place comes from its columns) and puts a band
|
|
531
|
+
torn apart by a layout back together. `columnOption` and `columnSettings` take a band's name;
|
|
532
|
+
`addColumn` takes a band, or a column with `ownerBand`. CSV writes a line per band level above the
|
|
533
|
+
titles; `exportSheet()` gives the band rows as header rows and `merges` (the cells a band, or a
|
|
534
|
+
column down the band rows, spans). Setting `bandAlign` (`'center'`). Text `gridHideBand`, token
|
|
535
|
+
`datagrid.band-line-color`. Over a pinned column no band covers, an empty piece stays with the
|
|
536
|
+
column so the band rows scroll under it. Excel: the sheet carries the merges, the writer does not
|
|
537
|
+
apply them yet.
|
|
538
|
+
- Adaptive columns: `settings.columnHidingEnabled` and a column's `hidingPriority` (Bind). While the
|
|
539
|
+
grid is narrower than its columns, they hide (the last one first; given a priority on any column,
|
|
540
|
+
only those, the lowest first; pinned and grouped columns never), worked out from the widths kept
|
|
541
|
+
and the viewport's width only, again on every resize. A “…” column at the end of the scrolling
|
|
542
|
+
columns opens a row's adaptive detail under the row (one at a time), before the row's master-detail:
|
|
543
|
+
the hidden columns' titles and values in the edit form's `FormLayout`, editors where the row can be
|
|
544
|
+
edited in its cells (they write into the row's draft; `'cell'` mode saves each). The detail rides on
|
|
545
|
+
the master-detail rows (measured, `aria-owns`, Tab in and out). `adaptiveDetail` (`colCount`,
|
|
546
|
+
`minColWidth`, `labelMode`, `editors`, `expandOnEdit`, `columnWidth`, `toggleKeys`; live through
|
|
547
|
+
`grid.adaptiveDetail`), `onAdaptiveDetailRowPreparing` (`formOptions`),
|
|
548
|
+
`onAdaptiveDetailRowExpanding/Expanded/Collapsing/Collapsed`, `expandAdaptiveDetailRow(key)`,
|
|
549
|
+
`collapseAdaptiveDetailRow()`, `isAdaptiveDetailRowExpanded(key)`, `adaptiveHiddenColumns`;
|
|
550
|
+
`getVisibleRows()` lists it as `rowType: 'detailAdaptive'`. Editing a row in `'row'` mode opens
|
|
551
|
+
its detail and leaving the row closes it (`expandOnEdit`). Hidden columns still count as shown:
|
|
552
|
+
`getVisibleColumns()`, the column chooser, copying and the export have them. Texts `gridAdaptive`,
|
|
553
|
+
`gridAdaptiveOf`; tokens `datagrid.adaptive-*`.
|
|
554
|
+
- The per-grid column stylesheet now targets the cells of the grid's rows only, so the fields of an
|
|
555
|
+
edit form inside the grid no longer pick up the rules of hidden columns.
|
|
556
|
+
- Docs: a new page “Bands and adaptive columns” (`/datagrid/bands`); `e2e/checks/42-datagrid-bands-adaptive.mjs`.
|
|
557
|
+
- Excel export merges a band's header over its columns and a column's header down the band rows (`mergeHeaders`, default `true`).
|
|
558
|
+
|
|
559
|
+
### FilterBuilder, the DataGrid filter panel and the filter value
|
|
560
|
+
|
|
561
|
+
- `FilterBuilder` (`src/components/filterbuilder/`): a tree of groups (`and`, `or`, `notAnd`,
|
|
562
|
+
`notOr`) and conditions (field, operation, value) whose `value` is the data layer's
|
|
563
|
+
`data.FilterExpression`, two-way with `x-model`; a condition without its value stays out of it.
|
|
564
|
+
`fields` (`dataField`, `caption`, `dataType`, `format`, `lookup`, `filterOperations`,
|
|
565
|
+
`defaultOperation`, `editor`, `editorOptions`, `customizeText`, `trueText` / `falseText`; Bind
|
|
566
|
+
fields), `customOperations` (`name`, `caption`, `dataTypes`, `hasValue`, `editor`,
|
|
567
|
+
`customizeText`, `calculateFilterExpression`, `readFilterExpression`), `groupOperations`,
|
|
568
|
+
`maxGroupLevel`, `allowHierarchicalFields` (dotted fields as submenus), `texts`, `locale`, `label`,
|
|
569
|
+
`size`, `addKeys` (`Insert`), `removeKeys` (`Delete`). Operations are the data layer's (`in` /
|
|
570
|
+
`notin` read DevExtreme's `anyof` / `noneof`); per type as DevExtreme's (`defaultOperations()`).
|
|
571
|
+
Values are edited in place with the kit's TextBox, NumberBox, DateBox, DropDown (yes/no, lookups),
|
|
572
|
+
TagBox (`in` / `notin`), two boxes for `between`, none for `isblank` / `isnotblank`.
|
|
573
|
+
- Every change is a method and asks first: `addCondition`, `addGroup`, `removeItem`, `setField`,
|
|
574
|
+
`setOperation`, `setConditionValue`, `setGroupOperation`, `clear`, `openEditor` / `closeEditor`,
|
|
575
|
+
`focusItem`; `onItemAdding/Added`, `onItemRemoving/Removed`, `onItemChanging/Changed` (cancelable,
|
|
576
|
+
`e.value` changeable), `onValueChanged`, `onEditorPreparing` (`options`, an `editor` of your own, or
|
|
577
|
+
`cancel`) / `onEditorPrepared`. `filterText` (property) and the `filterText(value, options)`
|
|
578
|
+
function write a filter as `[City] Equals 'Ankara' And [Amount] Is greater than '100'`;
|
|
579
|
+
`FilterBuilderModel` is the logic without the view.
|
|
580
|
+
- Keyboard and ARIA: a `treegrid` (rows with `aria-level`, `aria-posinset`, `aria-setsize`, a kit
|
|
581
|
+
Button per `gridcell`, named “Field: City”, “Operation: Equals”…), one Tab stop with roving focus;
|
|
582
|
+
arrows, Home / End, Ctrl + Home / End, Alt + Down opens a menu on its chosen item, F2 / Enter the
|
|
583
|
+
value editor (Enter keeps, Escape gives up, Tab keeps and goes on, from “from” to “to” first).
|
|
584
|
+
Texts `filterBuilder…` / `filterOp…` (en, tr). Tokens `filterbuilder.*`
|
|
585
|
+
(`tokens/component/filterbuilder.tokens.json`): the rows indent per level with a line along each group.
|
|
586
|
+
- DataGrid: `settings.filterPanel` (a panel under the rows: the check box, the filter's text that
|
|
587
|
+
opens the builder, “Create Filter”, “Clear”), `settings.filterSyncEnabled` (`'auto'`: while the
|
|
588
|
+
panel shows; the filter row and header filters are part of the filter value both ways, conditions
|
|
589
|
+
they cannot show stay in it), the column feature `filterBuilder` (default `true`), the props and
|
|
590
|
+
properties `filterValue` and `filterEnabled` (Bind, followed), `filterPanelText`, `filterBuilder`
|
|
591
|
+
(the builder's props, live) and `filterBuilderPopup` (the `MxForm` window: `title`, `showTitle`,
|
|
592
|
+
`width`, `height`, `resizable`, `movable`, `showCloseButton`, `showMaximize`, `fullScreen`), the
|
|
593
|
+
methods `openFilterBuilder()`, `closeFilterBuilder(apply?)`, `clearFilterValue()`, the property
|
|
594
|
+
`filterText`, the events `onFilterBuilderOpening/Opened/Closing/Closed`; `onFilterChanging` /
|
|
595
|
+
`onFilterChanged` carry `filterValue` and `filterEnabled` (and the previous ones) and run for the
|
|
596
|
+
panel and the builder too. A date condition chosen as a day stays a day in the filter value and
|
|
597
|
+
goes to the data source by the day. The kept layout and `state()` keep `filterValue` and
|
|
598
|
+
`filterEnabled`. `clearFilters()` takes the filter value away too. Texts `gridFilterPanel…`,
|
|
599
|
+
`gridFilterBuilderTitle`; tokens `datagrid.filter-panel-*`, `datagrid.filter-text-*`,
|
|
600
|
+
`datagrid.filter-icon-size`, `datagrid.filter-builder-buttons-gap`.
|
|
601
|
+
- Docs: a FilterBuilder page (Data group) and “Filter panel and builder” on DataGrid: Filtering
|
|
602
|
+
(the 100,000-row server grid of “Filters” moved there, with the panel); `e2e/checks/41-filterbuilder.mjs`.
|
|
603
|
+
|
|
604
|
+
### DataGrid pager, columns at run time, header filter ranges and entries
|
|
605
|
+
|
|
606
|
+
- The pager is a part of its own (`nav`, named by `pagerLabel` or “Pages: <grid>”): the page sizes
|
|
607
|
+
(`pageSizeSelector`, default `false`; `allowedPageSizes`, numbers and `'all'`, default `'auto'`:
|
|
608
|
+
half, once and twice the page size), the text (`pagerInfo`; `pagerInfoText` with `{0}` / `{page}`,
|
|
609
|
+
`{1}` / `{count}`, `{2}` / `{total}`; the default `gridPageOf` now reads “Page 3 of 12 (250
|
|
610
|
+
items)”), the steps (`pagerNavigation`) and the pages (`pagerNeighbors`, each named “Page 3”, the
|
|
611
|
+
current one `aria-current="page"`). `pagerDisplayMode`: `'full'` (page buttons, the sizes as
|
|
612
|
+
pressed-state buttons), `'compact'` (a page number box and a drop-down of the sizes, the text
|
|
613
|
+
hidden), `'adaptive'` (default: full while it fits in the bar, measured on resize). `pager: 'auto'`
|
|
614
|
+
shows it only while there is more than one page (default stays `true`). The pager's buttons keep
|
|
615
|
+
their element while they stay, so focus stays on a pressed page button.
|
|
616
|
+
- Page size: `pageSize(n?)` (0: every row on one page), `pageIndex(n?)`, `totalCount()`;
|
|
617
|
+
`onPageSizeChanging` (cancelable) / `onPageSizeChanged` (`{ pageSize, previous }`); the grid goes
|
|
618
|
+
back to the first page (`onPageChanged` tells it). A source that loads by page gets the new size
|
|
619
|
+
through the data layer's `DataSource.setPageSize`; a source of blocks pages by ranges. The size the
|
|
620
|
+
user chose is kept with the layout (`layoutKey`) and in `state()` (`pageSize`); a new `pageSize`
|
|
621
|
+
prop wins over it. `pageKeys` (default `'page'`): PageUp / PageDown turn the page in paged mode
|
|
622
|
+
(`'rows'`: a screen of rows, as before).
|
|
623
|
+
- Columns at run time: `addColumn(column, index?)` (what the kept layout says of a column added later
|
|
624
|
+
applies), `deleteColumn(field)` (its sort, grouping and filter go with it, without `…Changing`
|
|
625
|
+
events), `columnCount()`, `getVisibleColumns()`. `columnOption(field, name, value)` now writes any
|
|
626
|
+
field of the definition too (`title` follows where it shows; anything else makes the column's cells
|
|
627
|
+
again in every row, the header, the filter row, the group rows and footers and the totals, its
|
|
628
|
+
layout, sort and filter kept; a field the rows are read by — `type`, `value`, `lookup` … — queries
|
|
629
|
+
them again), plus `hidden`, `flex`, `filterValues`, `filterType`; `columnOption(field, options)`
|
|
630
|
+
sets several. `onOptionChanged` tells each, and `name: 'columns'` with the fields for a column added
|
|
631
|
+
or taken out. Rows in memory compare a column's type from its definition on every query.
|
|
632
|
+
- Header filter: a column's `headerFilterInterval` (`Bind`) groups its values — a number column in
|
|
633
|
+
ranges of that size (“0 – 100”, several sizes a tree), a date column in a tree of years → quarters
|
|
634
|
+
or months → days → hours → minutes → seconds down to the part it names; dates are a tree by default
|
|
635
|
+
(`headerFilterDateInterval`, default `'day'`; `null` lists the dates). The tree is the kit's
|
|
636
|
+
`TreeView` with check boxes and a “Select all” `CheckBox`; a node is kept as its path (`2026`,
|
|
637
|
+
`'2026/3'`, `'2026/3/15'`, as DevExtreme does) and filters with `>=` its start and `<` its end, on a
|
|
638
|
+
server too. Counts are worked out in the browser from the distinct values (memory, an adapter that
|
|
639
|
+
groups, or `loadValues`). `headerFilterItems`: entries of its own, `{ text, value }` (a value may be
|
|
640
|
+
a filter expression), or a function of `{ column, filter, signal, values() }`. `filterValues` and
|
|
641
|
+
`filterType` (`'include'` / `'exclude'`, both `Bind`) on the column, `filterType` in `grid.filters`;
|
|
642
|
+
in the list, choosing every value and then taking some away leaves those out.
|
|
643
|
+
- Texts (en, tr): `gridPage`, `gridPageCount`, `gridPageNumber`, `gridPageButton`, `gridPageSize`,
|
|
644
|
+
`gridPageSizeAll`, `gridValueRange`, `gridQuarter`; `gridPageOf` gained `{total}`. Tokens
|
|
645
|
+
`datagrid.page-number-width`, `page-size-width`, `values-row-height`.
|
|
646
|
+
- Docs: “Pager” (Overview), “Columns at run time” (Layout and events), “Ranges, dates and entries”
|
|
647
|
+
(Filtering), the settings, events, columns and methods tables. Tests: 23 new in the datagrid
|
|
648
|
+
(pager, runtime columns, intervals); `e2e/checks/40-datagrid-pager-columns.mjs`.
|
|
649
|
+
|
|
650
|
+
### DataGrid selection look, menu tones, deletions in one save
|
|
651
|
+
|
|
652
|
+
- Selected rows wear the design language's selection look, as the lists and the tree do: tokens
|
|
653
|
+
`datagrid.selected` (`color.selection.bg`, was `color.accent.subtle`), new `selected-text`
|
|
654
|
+
(`color.selection.fg`), `selected-border` (`color.selection.border`), `selected-border-width`
|
|
655
|
+
(`selection.border-width`), `selected-effect` (`effect.selection`), `indicator-width`,
|
|
656
|
+
`indicator-length`, `indicator-radius` (`indicator.*`) and `indicator-color`
|
|
657
|
+
(`color.selection.indicator`). The fill is the row's background, the frame and the effect are
|
|
658
|
+
drawn over the cells (sticky ones too) and the bar at the start where the language has one (Fluent);
|
|
659
|
+
none of it takes room. Hover and the active row's tint lie over the fill, the focus ring on top; on
|
|
660
|
+
a selected row the fill stands for the stripe and the new-row tint.
|
|
661
|
+
- `datagrid.ghost-shadow` and `datagrid.export-shadow` are `{elevation.popup}` (were `{shadow.8}`).
|
|
662
|
+
- `MenuItem.tone` (`Bind<'standard' | 'accent' | 'success' | 'caution' | 'danger'>`): `MenuList`
|
|
663
|
+
writes `data-tone` on the item (none for `standard`) and follows a function. The grid gives each
|
|
664
|
+
action's `tone` to its items in the row's "more" menu, the context menu and the bars' "Actions" menu.
|
|
665
|
+
- `deleteRows(rows)`: several rows in one save, asked once. The ready `remove` on several rows
|
|
666
|
+
(bars, context menu) uses it, through the data layer's `ChangeTracker.removeRows`: in `wait` and
|
|
667
|
+
`background` one save, one request when the adapter saves in batches; `batch` marks them as before.
|
|
668
|
+
- Docs: the selection look (Selection), `tone` and the one save (Row actions), `deleteRows` (API).
|
|
669
|
+
`e2e/checks/36-datagrid-bar-actions.mjs` checks that the Delete item carries `data-tone="danger"`.
|
|
670
|
+
- `Toolbar`: a button that moves into the "more" menu keeps its `tone` on the menu item.
|
|
671
|
+
|
|
672
|
+
### DataGrid master-detail rows
|
|
673
|
+
|
|
674
|
+
- `masterDetail` (each field a `Bind`, live through `grid.masterDetail`): `enabled` (the expand
|
|
675
|
+
column, after the status and check box columns, pinned like them), `template(ctx)` (what a row's
|
|
676
|
+
details hold: a component, an element or a text; `ctx` has `row`, `rowIndex`, `key`, `grid`,
|
|
677
|
+
`collapse()`), `autoExpandAll`, `canExpand` (a value or a function of the row), `keepDetails`
|
|
678
|
+
(default `true`: a closed row keeps its content), `keepLimit` (default `100` details kept out of
|
|
679
|
+
view), `height` (a value or a function of the row; default the content's), `estimatedHeight`
|
|
680
|
+
(default `200`), `columnWidth` (default `36`), `toggleKeys` (default `['Enter', ' ']`), `arrowKeys`
|
|
681
|
+
(default `true`). Changing `enabled`, `autoExpandAll` or `template` opens or closes every row again.
|
|
682
|
+
- A row's details are a row of their own under it, one cell across the grid that stays in place while
|
|
683
|
+
the columns scroll sideways. They are not pooled: made the first time they show, kept while the row
|
|
684
|
+
is open (parked out of view, laid out but not drawn), disposed when the row leaves the data, past
|
|
685
|
+
`keepLimit`, on closing without `keepDetails`, or with the grid. Their height is measured (a
|
|
686
|
+
`ResizeObserver`, so a tab or a nested grid that changes size moves the rows after it) and fed to the
|
|
687
|
+
scroll geometry (`ExtraHeights`, two Fenwick trees), so the scroll bar, `reveal` and moving to a row
|
|
688
|
+
stay right in the virtual list and on a page; the pooled rows keep their path.
|
|
689
|
+
- Methods `expandRow(key)`, `collapseRow(key)`, `isRowExpanded(key)` (reactive), `expandAllRows()`,
|
|
690
|
+
`collapseAllRows()`. The row events are the groups' ones, now with `kind: 'group' | 'detail'` (and
|
|
691
|
+
`row` for details): `onRowExpanding` / `onRowCollapsing` (cancellable) and `onRowExpanded` /
|
|
692
|
+
`onRowCollapsed`, from the user and from code. `onRowPrepared` with `rowType: 'detail'`,
|
|
693
|
+
`getVisibleRows()` lists the details after their row. `GridRowExpandingEventArgs` and
|
|
694
|
+
`GridRowExpandedEventArgs` are unions by `kind`: a handler that reads a group's `key` narrows first.
|
|
695
|
+
- Keyboard and ARIA: Enter / Space and Right / Left on the expand cell, Tab into the row's details,
|
|
696
|
+
Escape or Shift+Tab back to the row, Tab out of the grid from their last stop; with details on the
|
|
697
|
+
screen Tab never lands in another row's details. The arrow is a button with `aria-expanded` and
|
|
698
|
+
`aria-controls`; grouped (a treegrid) the row says `aria-expanded` too. The details come right after
|
|
699
|
+
their row in `aria-owns`, count in `aria-rowindex` / `aria-rowcount`, and are named “Details of row
|
|
700
|
+
3”. Clicks, keys, focus, paste and tooltips inside the details are left to their content.
|
|
701
|
+
- Texts `gridDetails`, `gridDetailsOf` (en, tr); tokens `datagrid.expand-color`, `expand-radius`,
|
|
702
|
+
`detail-padding`, `detail-background`. Docs: “Master-detail” page (`/datagrid/master-detail`).
|
|
703
|
+
`e2e/checks/39-datagrid-master-detail.mjs`.
|
|
704
|
+
|
|
705
|
+
### DataGrid edit forms, popups and validation rules
|
|
706
|
+
|
|
707
|
+
- `settings.editMode: 'row' | 'cell' | 'batch' | 'form' | 'popup'` (default `'row'`, live): how a
|
|
708
|
+
row is edited and when it is handed to saving. `saveMode` still says how a row handed over is
|
|
709
|
+
sent. `'row'` is what the grid did before (in the cells, on leaving the row); `'cell'` saves an
|
|
710
|
+
existing row as each of its cells is left (a new row on leaving it); `'batch'` sets the save mode
|
|
711
|
+
to `'batch'` (the same as `saveMode: 'batch'` with `'row'`), and switching to or from it starts
|
|
712
|
+
again with the data, like `saveMode`.
|
|
713
|
+
- `'form'`: the row opens as a form in its place, across the grid's width — the kit's `FormLayout`
|
|
714
|
+
with a field per column, each the editor its cell gets (by type, a lookup's, the column's own
|
|
715
|
+
`editor`), framed and labelled, read-only where the user cannot fill it, with the messages of the
|
|
716
|
+
checks on the fields and the row's own message above them. The rows after it move down by its
|
|
717
|
+
height, in the virtual list and on a page. Save (or Enter in a one-line field) saves the row as the
|
|
718
|
+
save mode says, Cancel (or Escape) gives it up; focus goes into the form and back to the row. A
|
|
719
|
+
field whose value changed through another (`setCellValue`) is made again. Typing on a cell does
|
|
720
|
+
not open it; Enter, F2, the start-edit click, the `edit` action, `editRow()` and `addRow()` do.
|
|
721
|
+
Editing another row, a new row, sorting, filtering, paging and `refresh()` give the form up, as
|
|
722
|
+
DevExtreme does.
|
|
723
|
+
- `'popup'`: the same form in the kit's `MxForm` as a modal window, for existing and new rows:
|
|
724
|
+
Save and Cancel in its footer (Enter and Escape press them), the close button cancels, focus stays
|
|
725
|
+
inside and comes back to the row.
|
|
726
|
+
- `form` prop / `grid.form` (live): `items` (field names or kit `FormItem`s — a column's field gets
|
|
727
|
+
its editor; groups, buttons and templates are the form's own), `colCount` (default 2),
|
|
728
|
+
`minColWidth`, `labelMode`. `popup` prop / `grid.popup` (live): `title`, `showTitle`, `width`,
|
|
729
|
+
`height`, `resizable`, `movable`, `showCloseButton`, `showMaximize`, `fullScreen`. Column
|
|
730
|
+
`formItem`: `visible`, `colSpan`, `label`, `helpText`, `editorOptions`, `order`. `onOptionChanged`
|
|
731
|
+
tells `form.*` and `popup.*`.
|
|
732
|
+
- Column `validationRules`, DevExtreme's set: `required` (`trim`), `numeric`, `range`, `stringLength`
|
|
733
|
+
(`trim`), `pattern`, `email`, `compare` (`comparisonTarget(row)`, `comparisonType`), `custom` and
|
|
734
|
+
`async` (`validationCallback({ value, row, column, rule })`), each with `message`,
|
|
735
|
+
`ignoreEmptyValue` (DevExtreme's defaults) and, where DevExtreme has it, `reevaluate` (on for
|
|
736
|
+
`async`). Checked with the kit's `checkRules` as a value is written and before the row is saved,
|
|
737
|
+
after `required` and `validate` (which keep working); `async` rules run last and together, the row
|
|
738
|
+
waits for them (its cell busy) and a value is not checked twice. Batch `saveChanges()` checks every
|
|
739
|
+
row first. Messages in the cells, the form and the window.
|
|
740
|
+
- `onRowValidating` (`{ key, row, isNew, changed, errors, isValid, errorText, cancel }`) after the
|
|
741
|
+
cells, once per check of the row: add or take out messages, or say no with `errorText`.
|
|
742
|
+
`onEditorPrepared` (`{ field, row, isNew, editor, element, place: 'cell' | 'form' }`).
|
|
743
|
+
`onEditingStart` comes for the form too (`field` `''`); `onEditorPreparing` for every form field
|
|
744
|
+
(`cancel` leaves it out).
|
|
745
|
+
- `settings.confirmDelete` (default `true`, as DevExtreme): `deleteRow()` and the ready `remove`
|
|
746
|
+
ask with the kit's `confirm()` first, once for all the rows an action deletes; not in batch mode.
|
|
747
|
+
`settings.selectTextOnEditStart` (default `true`, what the grid did): off, the caret goes to the end.
|
|
748
|
+
- Methods: `editRow(i)` opens the form in the form modes, `editRowByKey(key)`, `saveEditData()`,
|
|
749
|
+
`cancelEditData()`; `closeEditCell()` keeps the form's values. Texts in en and tr:
|
|
750
|
+
`gridConfirmDelete`, `gridConfirmDeleteRows`, `gridConfirmDeleteTitle`, `gridEditRowTitle`,
|
|
751
|
+
`gridNewRowTitle`, `gridRowInvalid`. Tokens: `datagrid.form-padding`, `form-gap`,
|
|
752
|
+
`form-background`, `form-message-color`, `form-label-color`, `form-label-font-size`.
|
|
753
|
+
- Docs: a new page "Edit forms and popups" (`/datagrid/forms`: the form with groups and an edit-mode
|
|
754
|
+
switch, the window, the rules with an async one) with the tables of modes, settings, form and popup
|
|
755
|
+
options, rules, events and methods; rows in the API and layout pages; a browser check
|
|
756
|
+
`e2e/checks/38-datagrid-forms.mjs`.
|
|
757
|
+
|
|
758
|
+
### DataGrid actions in the bars
|
|
759
|
+
|
|
760
|
+
- Row actions can show in the toolbar (`actionsLocation: 'toolbar'`, the new `rowActions` toolbar
|
|
761
|
+
item, at the start, placed through `toolbar.items` like the others) or at the start of the bottom
|
|
762
|
+
bar (`'bottom'`, on a kit `Toolbar` of its own) for the rows they act on: the selected rows, or the
|
|
763
|
+
active row without selection (`actionsTarget: 'selection' | 'focused' | 'auto'`). Default
|
|
764
|
+
`'row'`, as before; an action's `location` wins, and the actions column shows only while an action
|
|
765
|
+
sits in the row. No target: nothing shows. One row: its own actions, as the row would show them.
|
|
766
|
+
Several rows: the actions every row has (same `id`, visible for each), disabled while disabled for
|
|
767
|
+
one of them (`actionsMultipleEnabled: 'any'`: enabled for any, and run on those), with the count
|
|
768
|
+
after the text ("Print (3)", `actionsShowCount`), named "Print, 3 rows" and described by what the
|
|
769
|
+
bar acts on ("Actions for 3 selected rows"), which is announced when it changes.
|
|
770
|
+
- Running on several rows: `onclickMany(rows, e)` once, else `onclick` for each row in turn, a
|
|
771
|
+
promise waited for; a throw, a rejection or a promise of `false` counts the row as failed and does
|
|
772
|
+
not stop the others unless `actionsStopOnError` (or the action's `stopOnError`). While it waits the
|
|
773
|
+
export load panel shows the progress and a Stop button (`actionsProgress`, `actionsStopButton`,
|
|
774
|
+
`grid.stopAction()`); the outcome is announced ("Print: 2 of 3 done, 1 failed"). `multiple: false`
|
|
775
|
+
keeps an action to one row (the ready `edit`). The ready `remove` marks every row in batch mode and
|
|
776
|
+
sends each in the other modes.
|
|
777
|
+
- After "select all" over a server (rows not loaded) only actions with `onclickSelection(selection,
|
|
778
|
+
e)` show; they get the selection state of `grid.selection`.
|
|
779
|
+
- A row's actions are in its context menu (right click, Shift+F10 / the context menu key), wherever
|
|
780
|
+
they show: inside a selection of several rows the common ones, with the count, for all of them;
|
|
781
|
+
right click makes the row the active one. `actionsContextMenu` and an action's `contextMenu` turn
|
|
782
|
+
it off; `onContextMenuPreparing` gets them in `e.items`; an empty menu does not open.
|
|
783
|
+
- `actionsDisplay: 'menu'`: a row shows only its "more" button, every action in its menu, and the
|
|
784
|
+
column is as wide as that button (unless an action is a button always); the bars show one
|
|
785
|
+
"Actions" menu button. An action's `menu: 'auto' | 'always' | 'never'` wins. The row's "more"
|
|
786
|
+
button is named "More actions for row N".
|
|
787
|
+
- New: `onActionRunning` (cancelable: `{ action, rows, selection, location }`), `onActionRan`
|
|
788
|
+
(`{ action, rows, location, done, failed, canceled, errors }`), `grid.runAction(id, rows?)`,
|
|
789
|
+
`grid.actionTargets`, `grid.barActions`, `grid.stopAction()`. A press in a row runs through the same
|
|
790
|
+
events. `GridAction.onclick` is optional now and may return a promise; new fields `location`,
|
|
791
|
+
`menu`, `multiple`, `multipleEnabled`, `stopOnError`, `showCount`, `contextMenu`, `beginGroup`,
|
|
792
|
+
`onclickMany`, `onclickSelection`. Texts in en and tr (`gridActionCount`, `gridActionCountLabel`,
|
|
793
|
+
`gridActionsForRow`, `gridActionsForSelectedRow`, `gridActionsForSelectedRows`, `gridActionRunning`,
|
|
794
|
+
`gridActionProgress`, `gridActionStop`, `gridActionDone`, `gridActionPartly`, `gridActionFailed`,
|
|
795
|
+
`gridActionStopped`, `gridMoreActionsForRow`).
|
|
796
|
+
- Docs: "Row actions" has a new example (location switch, menu only, Approve with `onclickMany`,
|
|
797
|
+
Print row by row, Delete) and tables of the settings, action fields, events and members; a browser
|
|
798
|
+
check `e2e/checks/36-datagrid-bar-actions.mjs`.
|
|
799
|
+
|
|
800
|
+
### DataGrid Excel export
|
|
801
|
+
|
|
802
|
+
- New entry `@motifx-community/ui/excel`: `exportDataGrid({ component, worksheet, … })` writes a
|
|
803
|
+
`DataGrid` to an ExcelJS worksheet, as DevExtreme's `excelExporter.exportDataGrid`; ExcelJS is an
|
|
804
|
+
optional peer dependency the app brings, and apps that do not import the entry never load it. It
|
|
805
|
+
resolves with the cells written (`{ from, to }`). Options `topLeftCell` (`{ row, column }` or
|
|
806
|
+
`'B2'`), `customizeCell({ gridCell, excelCell })`, `autoFilterEnabled`, `keepColumnWidths`,
|
|
807
|
+
`selectedRowsOnly`, `loadPanel`, `encodeExecutableContent`, and `headers`, `frozenHeader`, `groups`,
|
|
808
|
+
`outline`, `summaries`, `numberFormats`, `booleanText`, `pageSize`, `onProgress`, `signal`. Also
|
|
809
|
+
`excelNumberFormat` and `excelDateFormat` (an `Intl` format as an Excel number format).
|
|
810
|
+
- The sheet: a frozen header row, the rows in the grid's order with its filter, search and grouping
|
|
811
|
+
(every matching row, a server's in parts), group rows ("Column: value" with their summary items,
|
|
812
|
+
aligned ones under their columns) with outline levels, group footers and the totals (several items
|
|
813
|
+
of a column a row each). Numbers stay numbers with a number format made from the column's `Intl`
|
|
814
|
+
format, dates stay dates, yes/no cells are `TRUE` / `FALSE`, lookup and list cells and columns with a
|
|
815
|
+
`format` function hold their texts; widths follow the grid.
|
|
816
|
+
- Column `format` also takes `Intl` options for number and date columns (shown by the grid, and the
|
|
817
|
+
number format in Excel).
|
|
818
|
+
- `export` prop and live `grid.export` (`formats`, default `['csv']`; `allowExportSelectedData`;
|
|
819
|
+
`texts`: `exportTo`, `exportAll`, `exportSelectedRows`, `formats`): the toolbar's export button
|
|
820
|
+
offers a command per format, and "Export selected rows" for each, as a menu when there is more than
|
|
821
|
+
one. `csv` is written by the grid as before; other formats raise `onExporting` with `format`,
|
|
822
|
+
`component` and `selectedRowsOnly`, where the app writes the file. `exportTo(format, options)`,
|
|
823
|
+
`exportSheet(options, write)` (the rows as a sheet of typed cells for any writer; `onExported`
|
|
824
|
+
follows with its `format`), `cancelExport()`; types `GridSheet`, `GridSheetRow`, `GridSheetCell`,
|
|
825
|
+
`GridSheetColumn`, `GridExportCell`, `GridSheetOptions`, `GridExportSettings`, `GridExportTexts`,
|
|
826
|
+
`GridLoadPanel`.
|
|
827
|
+
- A load panel over the rows while an export runs, with its progress and a button that stops it
|
|
828
|
+
(`loadPanel`; on for `exportDataGrid`, off for `exportCsv` / `exportRows`). A stopped export rejects
|
|
829
|
+
with the `AbortError`. Texts `gridExportAll`, `gridExportSelectedRows`, `gridExportProgress`,
|
|
830
|
+
`gridExportCancel`, `gridExportCanceled`, `gridFormatXlsx`, `gridFormatCsv`, `gridFormatPdf` in en
|
|
831
|
+
and tr. ExcelJS 4.4 as a dev dependency for the tests and the docs.
|
|
832
|
+
|
|
833
|
+
### DropDown, ComboBox, Autocomplete, Lookup
|
|
834
|
+
|
|
835
|
+
- `DropDown`: pick one item (APG select-only combobox); `items` (plain values, `DropDownItem`s or any
|
|
836
|
+
shape through `textField` / `valueField` / `iconField` / `groupField` / `enabledField`) or a
|
|
837
|
+
`dataSource` of `@motifx-community/data` (searched on the server, a value on no loaded page found
|
|
838
|
+
by key); `searchEnabled` (a TextBox in the list), `searchMode`, `searchDelay`, `clearButton`,
|
|
839
|
+
`itemTemplate`, `fieldTemplate`, `matchWidth`, groups, type-ahead, long lists drawn in view only.
|
|
840
|
+
- `ComboBox`: a text field whose list follows the text (APG combobox, list autocomplete); items in
|
|
841
|
+
memory or a data source; `minSearchLength`, `searchDelay`, `acceptCustomValue`, `autoHighlight`,
|
|
842
|
+
`showDropDownButton`. `Autocomplete`: the value is the text.
|
|
843
|
+
- `Lookup`: a drop-down with a table-like list (`columns` with captions, widths, alignment), a search
|
|
844
|
+
box on by default, for data sources.
|
|
845
|
+
- Shared parts: `OptionList` (`role="listbox"`, items or an `ItemSource` that loads while scrolled,
|
|
846
|
+
windowing with spacer rows, `handleKey`, `typeAhead`), `DataItems` (an array or a `DataSource`
|
|
847
|
+
behind one interface), `readItemField`, `functionValue` (a function prop with parameters is the
|
|
848
|
+
value, one without is a getter). `@motifx-community/data` is a peer dependency.
|
|
849
|
+
|
|
850
|
+
### Calendar, DateBox
|
|
851
|
+
|
|
852
|
+
- `Calendar`: the APG date grid with year and decade views; `min`, `max`, `disabledDates`, `locale`
|
|
853
|
+
(names and first day of the week from `Intl`), `firstDayOfWeek`, `showWeekNumbers` (ISO),
|
|
854
|
+
`showOtherMonths`, `showTodayButton`, `currentView`, `minView` (pick a month or a year).
|
|
855
|
+
- `DateBox`: `type` date / time / datetime typed through a mask in the locale's order
|
|
856
|
+
(`datePatternOf`), a calendar and a list of times (`timeStep`, `showSeconds`) on a popup,
|
|
857
|
+
`displayFormat` while not edited, `min` / `max` / `disabledDates` checked, an unfinished text
|
|
858
|
+
reported (`unfinished`, `invalidDate`).
|
|
859
|
+
|
|
860
|
+
### FormLayout
|
|
861
|
+
|
|
862
|
+
- `FormLayout`: the fields of a data object on a grid (`columns`, `minColumnWidth`), each with an
|
|
863
|
+
editor by name or by the type of its value (`FormLayout.editors` can be extended), bound both ways;
|
|
864
|
+
groups with captions, `colSpan`, `visible`, buttons (`submit`), templates; one validation group;
|
|
865
|
+
`onValidSubmit` / `onInvalidSubmit`.
|
|
866
|
+
|
|
867
|
+
### Field
|
|
868
|
+
|
|
869
|
+
- A stored `null` stays `null` (a nullable value round-trips). A field checked when it is left waits
|
|
870
|
+
for a press in progress to end, so an error line appearing cannot move a button away from the
|
|
871
|
+
pointer. The clear button is shared (`showClearButton`). `Popup` placements on every side
|
|
872
|
+
(`top`, `start`, `end-start` …) and a closed popup stays hidden whatever its content's display.
|
|
873
|
+
|
|
874
|
+
### docs app
|
|
875
|
+
|
|
876
|
+
- The docs site is one MotifJS app: `Application` + router (history mode), `DocsLayout` with a
|
|
877
|
+
`RouterView`, pages loaded when first opened, `SiteSettings` and `PageOutline` services (each
|
|
878
|
+
`Section` adds itself to the outline), the side-menu search is a `TextBox`.
|
|
879
|
+
- Every example is its own file (`pages/<id>/examples/`), complete with imports and state; the page
|
|
880
|
+
runs it and "Show code" shows its exact source, a tab per file, with a Copy button. The content
|
|
881
|
+
column grows with wide windows. The browser checks fail on any MotifJS console warning.
|
|
882
|
+
|
|
883
|
+
### design system
|
|
884
|
+
|
|
885
|
+
- The look comes from `@motifx-community/design-system` (a peer dependency): its primitive,
|
|
886
|
+
semantic and density tokens, the three themes (`[data-theme]`, `prefers-color-scheme` by
|
|
887
|
+
default), `[data-density="compact"]`, the fonts, the reset, the typography ramp, the focus ring
|
|
888
|
+
and the reduced-motion / reduced-transparency / forced-colors overrides. `styles.css` imports
|
|
889
|
+
the design system's stylesheet first. This package defines no color, size, font or motion value
|
|
890
|
+
of its own and never redefines a design-system token.
|
|
891
|
+
- Component tokens (`button.*`, `form.*`, `groupbox.*`, `split.*`): DTCG 2025.10 JSON in
|
|
892
|
+
`tokens/component/`, one fine-tuning knob per component, each referencing a design-system token
|
|
893
|
+
(or a literal size only that component has). Built with Style Dictionary against the design
|
|
894
|
+
system's source — a reference to a token that does not exist, or a `$type` mismatch, fails the
|
|
895
|
+
build — and written as `--mx-<component>-*` inside `@layer mx.components`, after the design
|
|
896
|
+
system's layers. Title bars read `color.bg.bar` and `bar.height` (density-aware), the form
|
|
897
|
+
footer `color.bg.layer`, the close button's hover the danger colors.
|
|
898
|
+
- `./tokens`: `cssVar` / `cssProperty` over the design system's token names plus the component
|
|
899
|
+
token names (`TokenName`), and the `componentTokens` map.
|
|
900
|
+
- Tests check that the generated files match the source, that every kit CSS file sits in
|
|
901
|
+
`@layer mx.components` and that every `var(--mx-…)` it uses is a design-system or component
|
|
902
|
+
token; `npm run lint:css` runs the design system's shared stylelint config.
|
|
903
|
+
|
|
904
|
+
### components
|
|
905
|
+
|
|
906
|
+
- `Control`: the base of every control. `text`, `enabled` (alias `disabled`), `visible`,
|
|
907
|
+
`tabStop` and `tabIndex` work the same as props (value or getter) and as properties set from
|
|
908
|
+
code; a value set in code replaces a bound getter; every property is reactive to read.
|
|
909
|
+
`enabled` is the control's own value (like the HTML attribute), `isEnabled` whether it can be
|
|
910
|
+
used now (like CSS `:enabled`). `enabled = false` disables the whole subtree (native
|
|
911
|
+
`disabled`, otherwise `tabindex="-1"` + `aria-disabled`, pointer input swallowed), restores it
|
|
912
|
+
exactly, nests, follows content added later, and leaves windows opened inside usable. Hiding or
|
|
913
|
+
disabling the focused part moves focus on instead of dropping it to `<body>`. `focus()`,
|
|
914
|
+
`canFocus`, `focused`, `focusWithin`, `parentControl`, `onAccessKey()`, `addShortcut()`.
|
|
915
|
+
Layout props on every control: `dock`, `left` / `top` / `right` / `bottom`, `width` /
|
|
916
|
+
`height`, `row` / `column` / `rowSpan` / `columnSpan` (1-based, as CSS grid lines). Subclass
|
|
917
|
+
API: `applyProperty` / `peekProperty`, `observeProperty`, `getProperty` / `setProperty` /
|
|
918
|
+
`bindProperty`, `focusElement`, `hasModel` / `writeModel` (two-way `x-model`), `strings`.
|
|
919
|
+
Untouched properties cost nothing; only getter props create effects; state is kept off class
|
|
920
|
+
fields so `ref` callbacks (called by core before fields exist) stick.
|
|
921
|
+
- `FocusContainer`: remembers the active control inside (`activeControl`, reactive and
|
|
922
|
+
assignable; `restoreFocus()`) and is a scope for Tab: the outermost one runs `tabIndex` order
|
|
923
|
+
per level of the control tree (ties in document order, one radio per group) and leaves Tab to
|
|
924
|
+
the browser until a control sets a `tabIndex`; `cyclesTab` keeps Tab inside a modal window.
|
|
925
|
+
- Keyboard: `&Text` access keys (`parseAccessKey`): Alt + key, Control + Option + key on Apple
|
|
926
|
+
platforms (where Option types characters), written to `aria-keyshortcuts`. The key is
|
|
927
|
+
underlined while the modifiers are held, after an Alt tap (kept from the browser menu while the
|
|
928
|
+
page has access keys), or always with `data-mx-access-keys="always"`; AltGr is ignored; scope
|
|
929
|
+
is the modal form, else the focused window, else the page; shared keys cycle focus; disabled
|
|
930
|
+
controls do not take the key; plain elements take part via `aria-keyshortcuts`.
|
|
931
|
+
`addShortcut(chord, handler, { scope, inEditable })` and `control.addShortcut` (most specific
|
|
932
|
+
scope first, silent across a modal form, plain keys left to text fields and windows). One
|
|
933
|
+
capture listener for the document.
|
|
934
|
+
- Focus guard: focus inside a Control never falls to `<body>` when it is removed, disposed or
|
|
935
|
+
hidden; it moves to the next usable element from that spot.
|
|
936
|
+
- Layout: `Panel` (padding as token step or free CSS; `scrollable`, a Tab stop so it can be
|
|
937
|
+
scrolled by keyboard; docking: `dock` top / bottom / start / end / fill / float on any child,
|
|
938
|
+
`start` / `end` following the reading direction, document order, CSS grid, no script on
|
|
939
|
+
resize), `Stack` (vertical / horizontal flex line, `gap`, `align`, `justify`, `wrap`), `Grid`
|
|
940
|
+
(`rows` / `columns` as CSS tracks or pixels, with `*` / `2*` as a shrinkable-share shorthand;
|
|
941
|
+
children by `row` / `column` / spans), `GroupBox` (`<fieldset>` + `<legend>`, access key focuses
|
|
942
|
+
its first field, docks like a Panel, `controls.add` goes inside the frame), `SplitContainer`
|
|
943
|
+
(`orientation` as in Stack, `position`, `fixedPanel`, `firstMinSize` / `secondMinSize`,
|
|
944
|
+
`collapsed`, `resizable`, `step`, `splitterSize`; pointer and keyboard with a localized
|
|
945
|
+
`separator`; RTL aware; `first` / `second` are `SplitPanel`s).
|
|
946
|
+
- `Label`: a `<label>` with the type ramp (`textStyle`) and theme `tone`s, inheriting font and
|
|
947
|
+
color when unset. `target` (control, element or id) makes it the target's accessible name
|
|
948
|
+
(`for`, or `aria-labelledby` for non-labelable elements); a click focuses the target and the
|
|
949
|
+
access key moves focus there without clicking. Without a target it names the field inside it.
|
|
950
|
+
`accessKeys`, `textAlign`, `verticalAlign`, `ellipsis` and `maxLines` (full text as a tooltip
|
|
951
|
+
on hover). Labels inside a disabled control dim.
|
|
952
|
+
- `Button`: standard / accent / danger, outline and ghost buttons with reactive `variant` /
|
|
953
|
+
`size` / `tone` props exposed as `data-*` attributes; built on `Control`. Static look props
|
|
954
|
+
create no effects. Solid buttons are pressable the way the design system describes: opaque fill,
|
|
955
|
+
bottom edge (`control.edge.width`, `color.stroke.control.edge`), inner top highlight
|
|
956
|
+
(`color.highlight.control`), press offset on `:active`; the focus ring keeps its inner ring.
|
|
957
|
+
- `MxForm`: a form (title bar, close/maximize/minimize caption buttons, content area) shown when
|
|
958
|
+
needed. `show(host, disposeRef?)` opens it as a modeless window, `showDialog(host,
|
|
959
|
+
disposeRef?)` as a modal one that resolves with a `FormResult` (`'ok'`, `'cancel'`, any string,
|
|
960
|
+
like `dialog.returnValue`); `host` is any component or the `Application`. It dies when it
|
|
961
|
+
closes, or when `host` or `disposeRef` is disposed while it is open. Content from a subclass
|
|
962
|
+
`view()`, the `content` prop or JSX children; cancelable async `onClosing` (reason `'code'`,
|
|
963
|
+
`'user'` or `'owner'`), `onClosed`, `defaultButton` / `cancelButton` (props or assignable from a
|
|
964
|
+
subclass), `data-result` buttons, nested dialogs, window order, dragging and edge resizing
|
|
965
|
+
(`resizable`). A modal form closes on Escape by default (`closeOnEscape`), keeps Tab inside and
|
|
966
|
+
cannot be minimized; Tab moves on from a modeless window to the page. In JSX,
|
|
967
|
+
`x-model={() => state.open}` binds it two-way (the form writes `false` back when the user closes
|
|
968
|
+
it and keeps its state between openings; `modal` picks dialog or window). Minimize collapses a
|
|
969
|
+
window to its title bar, or moves it into `minimizeTarget`. Events inside a window stop at the
|
|
970
|
+
window's root. `form.*` tokens.
|
|
971
|
+
- `src/core/`: `FormResult`, `CloseReason`, the reactive `UiLocale` for component texts (en, tr),
|
|
972
|
+
focus helpers, the page-wide window stack and the scroll lock.
|
|
973
|
+
- Base styles of the kit: only the aria-disabled dimming inside a disabled control and the
|
|
974
|
+
access-key underline, inside `@layer mx.components`; everything else comes from the design system.
|
|
975
|
+
|
|
976
|
+
### entries
|
|
977
|
+
|
|
978
|
+
- `.` (components and core exports), `./tokens`, `./styles.css`. The per-theme files are the
|
|
979
|
+
design system's (`@motifx-community/design-system/themes/*.css`).
|
|
980
|
+
|
|
981
|
+
### docs
|
|
982
|
+
|
|
983
|
+
- A full reference page per component (usage both ways, behaviour, keyboard, accessibility,
|
|
984
|
+
localization, API tables, styling hooks, tokens) and a token reference: the component tokens,
|
|
985
|
+
and the design system's layers for reference (from its `json/*` export). The theme and density
|
|
986
|
+
switches use the design system's `setTheme` / `setDensity`.
|
|
987
|
+
- The DataGrid reference is a side-menu group of eight pages (overview, editing, filtering and
|
|
988
|
+
search, lookup columns, grouping and summaries, selection and export, layout and events, API
|
|
989
|
+
reference), at most five live grids each, so no page is slow to open; a pointer to a section on
|
|
990
|
+
another page is a link (`[text](/page#anchor)` in a table cell's text).
|
|
991
|
+
|
|
992
|
+
### TabDocumentManager
|
|
993
|
+
|
|
994
|
+
- `TabDocumentManager` (`src/components/tabdocs/`), milestone 1 of `roadmap/25-tab-document-manager.md`:
|
|
995
|
+
documents in tabs, tabs in groups, groups in a layout tree of n-ary horizontal and vertical splits
|
|
996
|
+
with a share per child. A document's content is any component; moving a tab or splitting a group
|
|
997
|
+
moves the same component, never makes it again. `TabDocument` (`id`, `type`, `title`, `description`,
|
|
998
|
+
`icon`, `tooltip`, `badge`, `dirty`, `pinned`, `preview`, `closable`, `contentLifetime`, `content`,
|
|
999
|
+
`state`; Bind fields, reactive) and `TabGroup` (`documents`, `activeDocument`, `recentDocuments`,
|
|
1000
|
+
`locked`, `index`, `isActive`, `isMaximized`).
|
|
1001
|
+
- The strip: icon, title, description, badge, the dirty dot in the close button's place (the button
|
|
1002
|
+
under the pointer), the close button (`closeButton`: `always`, `active`, `never`; a document's
|
|
1003
|
+
`closable`), the kit Tooltip, sideways scrolling with the wheel, the active tab kept in sight, a
|
|
1004
|
+
middle click closes, a double click maximizes (`maximizeOnDoubleClick`); the kit Toolbar at the end
|
|
1005
|
+
with Split right and Maximize / Restore (`groupActions`). An empty group says so.
|
|
1006
|
+
- Splitters (`role="separator"`, value, orientation): the pointer, the keys (`resizeStep`), the
|
|
1007
|
+
smallest group size (`minGroupWidth`, `minGroupHeight`), a double click evens the sizes. A group left
|
|
1008
|
+
empty closes (`closeEmptyGroups`), a split left with one child gives its place to it.
|
|
1009
|
+
- Methods: `open(doc, { group, index, active, focus })`, `close` (`onClosing` may set `e.promise`),
|
|
1010
|
+
`closeAll`, `activate`, `activateNext`, `activatePrevious`, `move`, `split(group, direction, doc)`,
|
|
1011
|
+
`closeGroup`, `focusGroup`, `maximizeGroup`, `restoreGroups`, `evenSizes`, `resizeGroup`,
|
|
1012
|
+
`findDocument`, `contentOf`, `saveLayout()` (plain JSON: the tree with the shares, each document's
|
|
1013
|
+
`id`, `type`, `title`, `state`, `pinned`, `preview`, the active and recently used tabs, the active and
|
|
1014
|
+
maximized group) and `loadLayout(json, factory)`. Properties `documents`, `groups`, `activeGroup`,
|
|
1015
|
+
`activeDocument`, `maximizedGroup`. Events: `onOpening`, `onClosing`, `onDocumentActivating`,
|
|
1016
|
+
`onMoving`, `onSplitting`, `onLayoutChanging` (cancelable) and `onOpened`, `onClosed`,
|
|
1017
|
+
`onDocumentActivated`, `onMoved`, `onSplit`, `onLayoutChanged`.
|
|
1018
|
+
- Options: `contentLifetime` (`keep`, `lazy`, `dispose`; a document's own wins), `openPosition`,
|
|
1019
|
+
`afterClose` (`recent`, `left`, `right`), `activation`, `factory`, `keys` (every key, over
|
|
1020
|
+
`TabDocumentManager.defaultKeys`: Ctrl + Page Down / Up, Ctrl + W, Ctrl + 1…9, Ctrl + \, arrows,
|
|
1021
|
+
Home, End and Delete on a tab, arrows, Home, End on a splitter), `texts`, `announce` (a polite live
|
|
1022
|
+
region), `label` (a `region` landmark). Texts `tabDocs…` (en, tr); tokens `tabdocs.*`, with Material
|
|
1023
|
+
and Lilac's 3 px indicator.
|
|
1024
|
+
- `core/glyphs.ts`: `splitMark`, the split button's glyph.
|
|
1025
|
+
- Docs: a TabDocumentManager group with an overview page (documents and splits with a form, a grid
|
|
1026
|
+
and text; live options; a panel driving the API with an event log; unsaved changes asked with
|
|
1027
|
+
`confirm`; saving and restoring the layout); `e2e/checks/45-tabdocs.mjs`.
|
|
1028
|
+
- Milestone 2, the tabs at an editor's level. Preview tabs: `open(doc, { preview: true })` opens a tab
|
|
1029
|
+
in italics that the next preview in the group replaces; it stays after a double click, unsaved
|
|
1030
|
+
changes, `keep(doc)`, the menu or a move (`onKeeping` / `onKept`, `previewTabs` turns it off).
|
|
1031
|
+
- Pinned tabs: `pin(doc)` / `unpin(doc)` (`onPinning`, `onPinned`, `onUnpinning`, `onUnpinned`), first
|
|
1032
|
+
in pin order and never moved past the others, a pin mark that unpins, no close button unless
|
|
1033
|
+
`closeButtonOnPinned`, `pinnedTabSize` (`normal`, `compact`: the icon or first letter, `shrink`),
|
|
1034
|
+
`pinnedTabsOnSeparateRow`; close all, others, to the right or left and close saved leave them
|
|
1035
|
+
(`keepPinned`); saved and restored.
|
|
1036
|
+
- Sizes and overflow: `tabSize` (`fit`, `shrink`, `fixed`) with `tabMinWidth`, `tabMaxWidth`,
|
|
1037
|
+
`tabFixedWidth`; `wrapTabs`; scroll buttons (`scrollButtons`) and the wheel. A tab wider than the
|
|
1038
|
+
strip shows its start; the active tab stays in sight when a late font changes its width.
|
|
1039
|
+
- The look: `badge` may be `true` (a dot), `tone` (`warning`, `danger`, `success`, `accent`) colours the
|
|
1040
|
+
title and the badge, the description shows as `showDescription` says (`duplicates` by default: only
|
|
1041
|
+
when two open documents share a title).
|
|
1042
|
+
- Menus and lists: a context menu on every tab and on the empty strip (the kit `ContextMenu`;
|
|
1043
|
+
close, close others, to the right, to the left, saved, all, copy the title, keep open, pin or
|
|
1044
|
+
unpin, split up, down, left or right, move to the next or previous group; new document, reopen
|
|
1045
|
+
closed, lock; `contextMenu`, `menuItems`, `onContextMenuOpening`). The group toolbar's "…" button
|
|
1046
|
+
opens a searchable list of the group's (or every group's, `openListScope`) documents with close
|
|
1047
|
+
all, close saved and lock under it (`Popup`, `ListBox`, `MenuList`; `showOpenList`). The app's own
|
|
1048
|
+
buttons: `toolbarItems` per group, a document's `actions` while it is active, with icons and tones.
|
|
1049
|
+
`newDocument` makes a document for a double click on the empty strip (`openNew`).
|
|
1050
|
+
- Recently used, history, reopening: `showRecentList` (Ctrl+E in a browser tab, Ctrl+Tab installed;
|
|
1051
|
+
again to walk, Shift back, letting go of Ctrl opens; arrows, Enter and Escape alone work too;
|
|
1052
|
+
`recentListScope`), `goBack` / `goForward` over the documents activated in every group
|
|
1053
|
+
(`canGoBack`, `canGoForward`, `historySize`), `reopenClosed` (`closedDocuments`,
|
|
1054
|
+
`closedHistorySize`), `recentDocuments`, `moveToGroup`, `copyTitle`, `closeOthers`, `closeToRight`,
|
|
1055
|
+
`closeToLeft`, `closeSaved`.
|
|
1056
|
+
- Locked groups: `lock(group)` / `unlock(group)` (`onLocking`, `onLocked`, `onUnlocking`, `onUnlocked`,
|
|
1057
|
+
`group.lock()`), `open` without a group goes elsewhere (a new group when all are locked, the only
|
|
1058
|
+
group still takes it), an "Unlock group" mark in the toolbar, “Group 1, locked” for screen readers.
|
|
1059
|
+
- One document in two groups: `allowDuplicate` (a document's own wins) opens a copy with content of
|
|
1060
|
+
its own (`clone`, a `content` function or the `factory`) that shares the title, the unsaved changes
|
|
1061
|
+
and the state (`original`, `onClosing`'s `lastCopy`); splitting copies it (`splitCopies`, the split
|
|
1062
|
+
events' `copy`), or moves it as before. A layout saved with a copy brings it back as one.
|
|
1063
|
+
- Keys: a browser tab never gets Ctrl+W, Ctrl+Tab, Ctrl+Shift+T, Ctrl+Page Up / Down and often
|
|
1064
|
+
Ctrl+1…9, so the default keys are ones it does get, chosen as the editor's web version does (Ctrl+Alt
|
|
1065
|
+
for a Ctrl the browser keeps), the desktop key kept beside them: `TabDocumentManager.browserKeys` and
|
|
1066
|
+
`TabDocumentManager.desktopKeys` (replacing `defaultKeys`), `keyPreset` (`auto` takes the desktop
|
|
1067
|
+
keys in an installed app). New keys: `closeAllTabs`, `closeSavedTabs`, `recentNext`,
|
|
1068
|
+
`recentPrevious`, `goBack`, `goForward`, `reopenClosed`, `keepOpen`, `togglePin`, `showOpenList`.
|
|
1069
|
+
Polite announcements for pinned, unpinned, kept, locked and unlocked; new `tabDocs…` texts (en, tr).
|
|
1070
|
+
- Focus stays where it was when a group's element moves in a browser without `moveBefore`.
|
|
1071
|
+
- Kit: `addShortcut` takes two chords in a row (`'Ctrl+K W'`); a Ctrl+Alt chord leaves a key that AltGr
|
|
1072
|
+
typed a character with (`{` on a German keyboard). `Toolbar` places the controls of its items
|
|
1073
|
+
through `controls.moveToIndex`: an item hidden (`visible: false`) before the toolbar was built
|
|
1074
|
+
showed, at the front. `ToolbarItem.tone`. Glyphs `pinMark`, `lockMark`.
|
|
1075
|
+
- Docs: two more pages, Tabs (preview, pinned tabs, sizes, badges and tones, copies) and Menus and
|
|
1076
|
+
keys (context menus, the list, toolbar buttons, recently used, locked groups, the key table);
|
|
1077
|
+
`e2e/checks/46-tabdocs-tabs.mjs`; 45 presses the browser keys.
|
|
1078
|
+
- Milestone 3, drag and drop. A tab is dragged along its strip (across the border between pinned and
|
|
1079
|
+
other tabs it is pinned or unpinned, `pinOnDrag`), onto another strip at the place under the pointer
|
|
1080
|
+
or at its end, into a group (the middle of its content), beside a group (an edge of its content: a
|
|
1081
|
+
split that way, `dropEdgeSize`), or along an edge of the whole layout (`layoutEdgeDrop`,
|
|
1082
|
+
`layoutEdgeSize`, `split(null, side, doc)`). The last tab out closes its group (`closeEmptyGroups`).
|
|
1083
|
+
Ctrl (Option on Apple platforms, `copyModifier`) opens a copy when the document may be open twice.
|
|
1084
|
+
A whole group is dragged by the empty part of its bar or by a handle at the start of its toolbar
|
|
1085
|
+
(`groupDragHandle`; a click on it starts "Move group to…"): beside another group, along an edge of
|
|
1086
|
+
the layout, or into another group, whose documents it joins (`moveGroup(group, target, side)`,
|
|
1087
|
+
`onLayoutChanging` / `onLayoutChanged` with `'move'`).
|
|
1088
|
+
- What a drag shows: a copy of the tab under the pointer (`dragGhost`), a mark between tabs, a
|
|
1089
|
+
translucent area over the half or the whole of the group a drop would take that glides between
|
|
1090
|
+
places (the motion tokens, so reduced motion makes it jump), the cursor (`data-dragging`: `move`,
|
|
1091
|
+
`copy`, `none`), the dragged tab or group dimmed. A strip scrolls near its ends (`dragAutoScroll`);
|
|
1092
|
+
resting on a tab of another group activates it (`dragHoverActivate`, `dragHoverDelay`). Escape
|
|
1093
|
+
cancels and puts back what hovering activated and what the strips scrolled.
|
|
1094
|
+
- Touch and pen: a long press starts the drag (`longPressDelay`), so a swipe still scrolls the strip;
|
|
1095
|
+
held still and let go, it opens the tab's menu. `dragThreshold` for the mouse.
|
|
1096
|
+
- Settings: `allowDrag` on the manager and per document, `allowDragGroups`, `dropSides` on the
|
|
1097
|
+
manager and per group, `allowDrop` per group (both saved with the layout).
|
|
1098
|
+
- Events: `onDragStarting` (cancelable), `onDragOver` (change the place, or cancel to refuse it; outside
|
|
1099
|
+
every manager it comes with `target: 'outside'`, refused), `onDropping` (cancelable, the place may
|
|
1100
|
+
change), `onDropped`, `onDragEnded`; each with the document (or `null` for a group), the group it
|
|
1101
|
+
comes from, the target, manager, group, index and side, `copy` and `byKeyboard`. `onMoving` /
|
|
1102
|
+
`onMoved`, `onSplitting` / `onSplit`, `onOpening` / `onOpened`, `onPinning` / `onPinned` still fire
|
|
1103
|
+
for what a drop does. `onSplitting`'s `group` is `null` for a split of the whole layout. `dragging`
|
|
1104
|
+
(reactive) says what is being dragged; `cancelDrag()`.
|
|
1105
|
+
- Between managers: managers with the same `dragGroup` take each other's tabs and groups; the tab, its
|
|
1106
|
+
panel and its content move over (the other manager asks through its `onOpening`, after `onMoving`
|
|
1107
|
+
here) and follow that manager's settings from then on.
|
|
1108
|
+
- Drop targets are a list the manager asks (`dropTargets`, `addDropTarget(target)`: `placeAt`, `marks`,
|
|
1109
|
+
`drop`); the built-in one covers the strips, the groups and the layout's edges, so the dock guides
|
|
1110
|
+
and floating windows of milestone 4 can be added as targets.
|
|
1111
|
+
- Keys: the active tab a place along its strip (`moveTabLeft`, `moveTabRight`: Alt + Shift + Page Up /
|
|
1112
|
+
Down in a browser tab, Ctrl + Shift + Page Up / Down installed; `moveInGroup(doc, by)`), to the next
|
|
1113
|
+
or previous group (`moveToNextGroup`, `moveToPreviousGroup`: Ctrl + Alt + Right / Left), to the group
|
|
1114
|
+
on a side or a new one there (`moveToGroupLeft`, `…Right`, `…Up`, `…Down`: Ctrl + K, Shift + an
|
|
1115
|
+
arrow; `moveToGroup(doc, 'left' | 'right' | 'up' | 'down')`). "Move to…" (`moveTo`, Ctrl + K M; the
|
|
1116
|
+
tab's and the strip's menus, `moveTo` and `moveGroupTo` commands; `showMoveTo(doc | group)`): the
|
|
1117
|
+
arrows pick a side of a group, again that way the next group or the layout's edge, Tab the next
|
|
1118
|
+
group, Enter moves, Escape cancels (`targetLeft` … `targetCancel`), with the same areas shown and
|
|
1119
|
+
each place announced. Moved, copied, split and canceled are announced; new `tabDocs…` texts (en, tr).
|
|
1120
|
+
- Narrow groups: the strip keeps at least one tab's room (`tabMinWidth`) and the group's toolbar folds
|
|
1121
|
+
its buttons into its "…" menu first (the kit Toolbar's `overflow: 'menu'`). The sizes the props give
|
|
1122
|
+
(`--_min-width`, `--_tab-min`, …) are written on each group, not on the root, whose inline style the
|
|
1123
|
+
app may replace (`style.cssText` dropped them, and the groups' smallest sizes with them).
|
|
1124
|
+
- Kit: `ContextMenu` no longer closes on any scroll. It goes along with the element it opened on and
|
|
1125
|
+
closes once that element is out of sight (off the screen, or out of the box that scrolls it); the
|
|
1126
|
+
late scroll a press makes when it moves focus kept closing the menu of a tab. `closeOnScroll: false`
|
|
1127
|
+
keeps it open even then. `DragGhost` and `scrollStep` moved from the DataGrid to `src/parts/drag/`
|
|
1128
|
+
(exported) and the DataGrid uses them from there; a copy is now `inert`. `isChord(chords, e)` in
|
|
1129
|
+
`core/keyboard.ts`, for keys a component reads itself. Glyph `gripMark`.
|
|
1130
|
+
- Docs: a Drag and drop page (dragging, settings, two managers side by side, the keys, changing a
|
|
1131
|
+
drop, the API); `e2e/checks/47-tabdocs-drag.mjs`; 46 chooses menu items with real clicks again.
|
|
1132
|
+
- Milestone 4, docking. Floating windows in the page (`TabWindow`): `float(doc | group, rect?)`, a drag
|
|
1133
|
+
let go outside every manager (or, with the dock guides, away from them), Ctrl + K O, the menus. A
|
|
1134
|
+
window holds groups as the documents' area does (split, resized, dragged between), opens as large as
|
|
1135
|
+
the group it came from (`floatingWindowSize`), moves by the empty part of its strips (the strip is
|
|
1136
|
+
its title), resizes from its edges and corners, comes to the front when pressed (the page's
|
|
1137
|
+
`windowStack`), maximizes within the page and is restored, stays in the viewport
|
|
1138
|
+
(`keepFloatingInView`), closes with its last document (`closeEmptyWindows`) and docks back where it
|
|
1139
|
+
was on a double click on its strip (`dockOnDoubleClick`), "Dock back" or Ctrl + K D. Its maximize and
|
|
1140
|
+
close buttons sit in the group at its top end corner. `moveWindow`, `resizeWindow`, `maximizeWindow`,
|
|
1141
|
+
`restoreWindow`, `closeWindow` (each document still asks), `focusWindow`; the window's own `move`,
|
|
1142
|
+
`resize`, `maximize`, `restore`, `close`, `dock(side?)`, `focus`; `floatingWindows` (reactive, back to
|
|
1143
|
+
front). Ctrl + K Space moves it by the arrows and resizes it with Shift.
|
|
1144
|
+
- Dock areas (`TabDockArea`) on the manager's four sides, nesting in the order they were made: each
|
|
1145
|
+
holds its own layout, has a size in pixels or a share (`dockAreaSize` per side, `dockAreaMinSize`,
|
|
1146
|
+
the documents keep their smallest) and a splitter moved by the mouse and the splitter keys.
|
|
1147
|
+
`dock(doc | group | window, side?, size?)` (a document not open yet opens there), `resizeDockArea`,
|
|
1148
|
+
`dockAreas`, `dockArea(side)`; empty areas go. Folded (`autoHide(area | doc, on)`, the pin in the
|
|
1149
|
+
area's toolbar, the menu, Ctrl + K H), only the titles stay along the edge (a toolbar); a click,
|
|
1150
|
+
Enter or resting on a title (`autoHideHover`, `autoHideDelay`) slides the area out over the
|
|
1151
|
+
documents (`showAutoHidden`), a press outside, Escape or focus leaving slides it back
|
|
1152
|
+
(`hideAutoHidden`). Auto hide is the area's, not one document's.
|
|
1153
|
+
- Dock guides (`dockGuides`, off by default; `dockGuideKinds`): while dragging, a cross over the group
|
|
1154
|
+
under the pointer and a guide in the middle of each edge of the manager, shown only over a manager
|
|
1155
|
+
or one of its windows; the guide pointed at shows the area a drop would take, a drop away from the
|
|
1156
|
+
guides and strips floats. They are a drop target on the list of milestone 3 (`dockDropTarget`, asked
|
|
1157
|
+
before the built-in one; `TabDropTarget.follow` tells a target where the pointer is). New place
|
|
1158
|
+
kinds `'dock-guide'`, `'dock-area'` (`dockSide`) and `'float'` (`rect`). A drop over a manager outside
|
|
1159
|
+
the `dragGroup` is refused rather than floated.
|
|
1160
|
+
- Settings, the document's own first: `allowFloat`, `allowDock`, `dockSides`, `allowAutoHide`
|
|
1161
|
+
(`TabDocument` and the manager); `TabDocument.window` / `dockArea` and `TabGroup.window` /
|
|
1162
|
+
`dockArea` (reactive). Opening a document without a group never puts it in a dock area.
|
|
1163
|
+
- Events, each cancelable and then reported: `onFloating` (the rect may change) / `onFloated`,
|
|
1164
|
+
`onDocking` (side and size may change) / `onDocked`, `onAutoHiding` / `onAutoHidden` (`on`),
|
|
1165
|
+
`onSlideChanging` / `onSlideChanged` (a folded area sliding out or back), `onWindowClosing` /
|
|
1166
|
+
`onWindowClosed` (`reason`: closed, docked, empty). `onLayoutChanging` / `onLayoutChanged` also for
|
|
1167
|
+
`float`, `dock`, `autoHide`, `resizeArea`, `moveWindow`, `resizeWindow`, `maximizeWindow`,
|
|
1168
|
+
`restoreWindow`, `closeWindow`, with `window` or `area`.
|
|
1169
|
+
- Keys and menus: float, dock back, dock left / right / top / bottom (Ctrl + K, Alt + an arrow), auto
|
|
1170
|
+
hide on the tab and strip menus and as keys; F6 / Shift + F6 go round the documents, the dock areas
|
|
1171
|
+
and the windows (`focusPart`); "Move to…" goes on past the edge of the layout to the dock area of
|
|
1172
|
+
that side and to a window of its own. Announced: floated, docked, folded and shown, slid out,
|
|
1173
|
+
window closed, maximized, restored (en, tr).
|
|
1174
|
+
- The layout saves the dock areas (side, size, folded, layout) and the windows (place, maximized, back
|
|
1175
|
+
to front, where they dock back, layout): `TabLayout.version` 2; a version 1 layout still loads.
|
|
1176
|
+
- Look: `tabdocs.window-*`, `area-*`, `panel-*`, `autohide-*`, `guide-*` tokens; Material's guides are
|
|
1177
|
+
its middle control height, Material and Lilac's folded titles have their 3 px indicator. The root is
|
|
1178
|
+
a grid now (the documents in the middle, the areas around them); the drop area and the mark are
|
|
1179
|
+
fixed in the viewport, above the windows.
|
|
1180
|
+
- Kit: content moved between groups (core's `Transporter`, and `placeNode` without `moveBefore`) lost
|
|
1181
|
+
the scroll of everything scrolled inside it: `keepScroll` reads it before and writes it back after
|
|
1182
|
+
(CORE-REPORTS R29). `parts/window/` (`followPointer`, `resizeBox`, `resizeFrame`, `WindowBox`,
|
|
1183
|
+
`WindowEdge`): the move and resize of `MxForm`, which the floating windows use too. `dockGuideMark`
|
|
1184
|
+
glyph. A menu or a popup opened from a slid out area keeps it open.
|
|
1185
|
+
- Docs: a "Dock and floating windows" page (an editor with tool areas, floating by code, the settings,
|
|
1186
|
+
saving the whole layout, the keys, the API); `e2e/checks/48-tabdocs-dock.mjs`; 45 reads layout
|
|
1187
|
+
version 2; the drag and drop page says what a drop outside the manager does now.
|
|
1188
|
+
- Milestone 5, new browser windows. `moveToNewWindow(doc | group | floatingWindow, { rect, url })` opens
|
|
1189
|
+
a window of the page's origin (`window.open`, or the app's `openWindow` for Electron, a host page or a
|
|
1190
|
+
test) at the size of what moves, beside it (`newWindowSize`), and moves the document, the group or the
|
|
1191
|
+
floating window's whole layout into it; the content is not made again. The window (`TabBrowserWindow`:
|
|
1192
|
+
`window`, `element`, `rect`, `groups`, `documents`, `activeGroup`, `activeDocument`, `moveToMainWindow()`,
|
|
1193
|
+
`close()`, `focus()`; `browserWindows`, reactive) holds groups as the documents' area does: tabs, pins,
|
|
1194
|
+
previews, the lists, splitting, the splitters, the menus, the keys and dragging work there. Its title
|
|
1195
|
+
follows its active document (`newWindowTitle`: `'{title} – {page}'` or a function).
|
|
1196
|
+
- Back: `moveToMainWindow(doc | group | window)` (into the group it came from, else the main window's
|
|
1197
|
+
active one), "Move back to main window" on the tab and strip menus, Ctrl + K Shift + D
|
|
1198
|
+
(`moveToMainWindow` key); "Move into new window" on the tab menu, the strip menu and a floating
|
|
1199
|
+
window's strip ("Move window into new window"), Ctrl + K Shift + O (`moveToNewWindow` key). `move`,
|
|
1200
|
+
`split`, `dock` and `float` take groups of any window; "Move to…" goes through the groups of every
|
|
1201
|
+
window and, past floating, to a new window.
|
|
1202
|
+
- Dragging: inside a new window as in the page (strips, a group's zones or guides, the edges of its
|
|
1203
|
+
layout: an `'edge'` place carries `browserWindow`). The pointer stays with a drag that leaves its
|
|
1204
|
+
window; the window under it there, found by its place on the screen, takes the drop. Let go past
|
|
1205
|
+
every window: from the page into a new window there (`'new-window'` place, with `rect`), from a new
|
|
1206
|
+
window back to the main window (`'main-window'`); `dragOutToNewWindow` turns it off.
|
|
1207
|
+
- Closing: when the user closes a new window its documents come back, or close
|
|
1208
|
+
(`newWindowCloseAction: 'back' | 'close'`, `onWindowClosing`'s `then`); each one closing asks through
|
|
1209
|
+
`onClosing` as usual, back in the main window. `closeWindow(window)` and `window.close()` by code (a
|
|
1210
|
+
closing cancel keeps it). When the page goes away its new windows close. `onWindowClosing` /
|
|
1211
|
+
`onWindowClosed` carry `kind` (`'floating' | 'browser'`) and `then`; `reason` `'moved'` for a floating
|
|
1212
|
+
window that went into a new window; `then: 'back'` docks a floating window back instead of closing.
|
|
1213
|
+
- Blocked: no window from the browser fires `onError` (`windowBlocked`; `windowNotUsable` for a page of
|
|
1214
|
+
another origin) and opens a floating window instead (`newWindowFallback: 'float' | 'none'`, changeable
|
|
1215
|
+
in the event). `allowNewWindow` on the manager and per document (the document's own wins).
|
|
1216
|
+
`onWindowOpening` (cancelable; `rect`, `url` may change) / `onWindowOpened`. `onLayoutChanging` /
|
|
1217
|
+
`onLayoutChanged` also for `'newWindow'` and `'mainWindow'`.
|
|
1218
|
+
- The layout saves the new windows (place on the screen, layout, the group they came from):
|
|
1219
|
+
`TabLayout.version` 3, `browserWindows`; versions 1 and 2 still load. `loadLayout` puts them back as
|
|
1220
|
+
floating windows (`restoreWindows: 'float'`), among the main window's documents (`'main'`) or as
|
|
1221
|
+
windows again (`'reopen'`): a browser opens windows only on a click or a key, so `loadLayout` called
|
|
1222
|
+
from one opens them and `reopenWindows()` opens later what was blocked.
|
|
1223
|
+
- The look: the page's style sheets (links, `<style>`, constructed sheets) and the attributes of `<html>`
|
|
1224
|
+
and `<body>` are copied into the new window and followed (a sheet added or changed later, the theme,
|
|
1225
|
+
the design language, `dir`, `lang`). Announced: moved into a new window, back to the main window,
|
|
1226
|
+
window closed, the browser did not open the window (en, tr).
|
|
1227
|
+
- Kit, for other documents: `connectDocument(doc)` / `disconnectDocument(doc)` / `pageDocuments()`: the
|
|
1228
|
+
kit's document-wide listeners (shortcuts and access keys, tooltips, the focus guard, the press
|
|
1229
|
+
tracking of `afterPress`) work in another same-origin document too and leave it when its window
|
|
1230
|
+
closes. `deepActiveElement(node?)` reads the document of `node`, else the one focus went to last.
|
|
1231
|
+
`Popup`, `ContextMenu` and `Tooltip` open in the document of the element they open at (its own top
|
|
1232
|
+
layer, viewport and window events); `MenuList`, `ListBox`, `Button`, `Field`, `MxForm`, `FocusContainer`,
|
|
1233
|
+
the `enabled` cascade, `Control.focused` / `focusWithin` use their element's document and window; the
|
|
1234
|
+
window stack keeps one stack per document (`windowStack.top(doc)`); a scoped shortcut holds for parts
|
|
1235
|
+
of its component moved into another window. Checks that work for nodes and events of any window
|
|
1236
|
+
(`instanceof Element` and `instanceof KeyboardEvent` fail across windows; Chrome also remakes a
|
|
1237
|
+
collected node's wrapper with its new window's classes, so a DropDown in a new window stopped
|
|
1238
|
+
choosing after a while): `OptionList`, `Tabs`, `TreeView`, `MenuBar`, `FilterBuilder`, `Toaster` and the
|
|
1239
|
+
DataGrid's cell contents use them. `ResizeWatch` (exported):
|
|
1240
|
+
a `ResizeObserver` that follows its elements into another window, used by the DataGrid, its pager and
|
|
1241
|
+
rows, `Tabs`, `TextArea`, `Toolbar` and the manager's groups. `mirrorPage(source, target)` (exported).
|
|
1242
|
+
The DataGrid's focus, copy and paste, row drag and column sheet follow it into another window.
|
|
1243
|
+
`iconNode(source, doc?)`.
|
|
1244
|
+
- Core: an element that first reaches another window's document gets no `onMounted`, and a router
|
|
1245
|
+
link clicked there would load its page into that window (CORE-REPORTS R30): content made in a new
|
|
1246
|
+
window stands for a moment in the page (`core/let-mount.ts`), and a router link clicked there is
|
|
1247
|
+
clicked again in the page.
|
|
1248
|
+
- Docs: a "New windows" page (moving a tab, a group and back with a form, a DropDown and a DataGrid
|
|
1249
|
+
keeping their state; closing, blocked windows and the events; saving and restoring with windows and
|
|
1250
|
+
why reopening needs a click; what works there and the limits; the API); `e2e/checks/49-tabdocs-window.mjs`.
|
|
1251
|
+
- Popup: scrolling inside a popup (a menu taller than the window) no longer places it again, which took
|
|
1252
|
+
the scroll back to the top; the page scrolling still moves it along with its anchor.
|
|
1253
|
+
- TabDocumentManager: each tab panel stacks on its own (`isolation`), so a document's own z-index (a
|
|
1254
|
+
DataGrid's sticky summary row) no longer rises over a slid-out dock area, a floating window or the drop
|
|
1255
|
+
marks. Docs: a "A whole workspace" page; `e2e/checks/51-tabdocs-workspace.mjs`.
|
|
1256
|
+
- TabDocumentManager, compact bars: the strips of dock areas and floating windows keep their room for
|
|
1257
|
+
the tabs. No scroll buttons there (`compactScrollButtons`, default `false`): the wheel, touch and the
|
|
1258
|
+
keys scroll the strip, a thin scrollbar shows over the foot of the tabs while the pointer is over it
|
|
1259
|
+
(it takes no room and can be dragged), and the "…" button shows how many tabs are not fully in sight
|
|
1260
|
+
in place of its mark ("+2", also in its name; `TabGroup.hiddenTabCount`). Tabs shrink before the strip
|
|
1261
|
+
scrolls (`compactTabSize: 'shrink'`, `compactTabMinWidth: 64`); shrinking, a tab keeps its icon, its
|
|
1262
|
+
close button and a few letters (`tabdocs.tab-title-min-width`). A strip with one document shows it as
|
|
1263
|
+
a title, still the tab with its close button, menu, keys, drag and tooltip (`compactSingleTabTitle`,
|
|
1264
|
+
default `true`). Only the pin of an area and the close button of a window stay in the toolbar
|
|
1265
|
+
(`compactBarButtons`, default `['autoHide', 'closeWindow']`, a list of `TabBarButton`); the other
|
|
1266
|
+
buttons, the app's toolbar items but those with `overflow: 'never'`, "Dock back" in a window and the
|
|
1267
|
+
group's commands go into one "…" menu above its searchable list of documents (the commands are a Tab
|
|
1268
|
+
stop there). Each dock area and floating window has its own `scrollButtons`, `tabSize`,
|
|
1269
|
+
`tabMinWidth`, `singleTabTitle` and `barButtons` (`TabBarSettings`, a value or a function, `null`
|
|
1270
|
+
follows the manager), saved with the layout as `bar` when they are plain values. The documents' bar
|
|
1271
|
+
and new browser windows keep the whole bar by default and have `singleTabTitle` and `barButtons`
|
|
1272
|
+
(`'all'`) of their own; how tabs are sized and the scroll buttons are now written on each group
|
|
1273
|
+
(`data-tab-size`, `data-scroll-buttons`, `data-compact`, `data-title`). Texts `tabDocsOpenListHidden`,
|
|
1274
|
+
`tabDocsBarMenu`, `tabDocsBarMenuHidden` (en, tr). Tokens `tabdocs.scrollbar-*`, `title-*`, `count-*`,
|
|
1275
|
+
`tab-title-min-width`. Docs: a "Compact bars" section on the Dock page; `e2e/checks/50-tabdocs-compact.mjs`.
|
|
1276
|
+
- TabDocumentManager, a close button in every dock area, hidden documents and small bar buttons:
|
|
1277
|
+
every dock area's bar has a close button next to the pin for its group's active document
|
|
1278
|
+
(`TabBarButton` `'close'`, `.mx-tabdocs__bar-close`, named "Close Notes" or "Hide Explorer"). A
|
|
1279
|
+
document that may close closes through `onClosing` / `onClosed` (a dirty one can still ask); one that
|
|
1280
|
+
may not (`closable: false`, the tools) is hidden. A single document shown as a title in that bar shows
|
|
1281
|
+
no close button of its own (`data-bar-close`). `compactBarButtons` is now `'auto'` by default: an area
|
|
1282
|
+
keeps `['autoHide', 'close']`, a floating window `['closeWindow']`; a list is followed as it is in both,
|
|
1283
|
+
and an area's or a window's `barButtons` takes `'auto'` too. A floating window's close button now hides
|
|
1284
|
+
the documents that cannot close instead of leaving the window open (`closeWindow` from code still
|
|
1285
|
+
closes them all). Hidden documents: `hide(doc)` and `show(doc, { group, side, index, active, focus })`
|
|
1286
|
+
(also `TabDocument.hide()` / `show()`, and `open(doc)` shows a hidden one) put it back into the group
|
|
1287
|
+
it was hidden from, else its dock area (made again at its size, folded if it was), else a floating
|
|
1288
|
+
window where its window was, else among the documents; `hiddenDocuments` (reactive),
|
|
1289
|
+
`TabDocument.isHidden` (`isOpen` stays `true`), `findDocument` finds them; `allowHide` on the manager
|
|
1290
|
+
and per document (default `true`); cancelable `onHiding` / `onShowing`, then `onHidden` / `onShown`,
|
|
1291
|
+
and `onLayoutChanged` with `'hide'` / `'show'`. The content is kept as `contentLifetime` says. Menus:
|
|
1292
|
+
"Hide" on the tab menu of a document that cannot close, "Show hidden" (a submenu of the hidden
|
|
1293
|
+
documents) in the strip's menu and the "…" menu (`TabMenuCommand` `'hide'`, `'showHidden'`); key
|
|
1294
|
+
`hide` (Ctrl+K X). `saveLayout` writes `hidden` (`TabLayoutHidden`: the document and where it goes
|
|
1295
|
+
back), still version 3; older layouts load. The buttons of compact bars are small squares of 24 pixels
|
|
1296
|
+
with a smaller mark and tight gaps (`barButtonSize` for the documents' bar, default `'normal'`;
|
|
1297
|
+
`compactBarButtonSize`, default `'small'`; an area's or a window's own `barButtonSize` wins); the "+2"
|
|
1298
|
+
count fits them, and the ends of the toolbar leave room for the focus ring. Tokens
|
|
1299
|
+
`tabdocs.bar-button-size`, `bar-button-padding`, `bar-button-gap`, `bar-icon-size`, `focus-offset`.
|
|
1300
|
+
Texts `tabDocsHide`, `tabDocsShowHidden`, `tabDocsCloseActive`, `tabDocsHideActive`, `tabDocsHidden`,
|
|
1301
|
+
`tabDocsShown` (en, tr). Docs: rows and a sentence on the Dock page, a "Small buttons" switch in the
|
|
1302
|
+
compact bars example; the Workspace example's "Show the activity" shows the hidden Activity again;
|
|
1303
|
+
`e2e/checks/50-tabdocs-compact.mjs` covers the close button, hidden tools and the small buttons.
|
|
1304
|
+
- TabDocumentManager, the document menus are one menu: the group's "…" menu (and a compact bar's single
|
|
1305
|
+
"…" menu) draws its documents with the kit's `MenuList`, in the same popup as its commands and with a
|
|
1306
|
+
line between them, instead of a `ListBox` with its own field frame and type; so commands and documents
|
|
1307
|
+
share the language's menu height, padding, type, radius, hover and focus in every design language and
|
|
1308
|
+
theme (measured: a command and a document both 14px / h32 / 11px / 4px in Fluent, 14px / h44 / 16px /
|
|
1309
|
+
4px in Material, where the document rows were 12px / h40 and 14px / h56 / radius 9999px). The shown
|
|
1310
|
+
document is a checked `menuitemradio` item; its description, and its group when the menu lists every
|
|
1311
|
+
group, is the item's secondary text; the unsaved mark sits at the end of the item and its name still
|
|
1312
|
+
says "unsaved changes"; the tooltip is the tab's. A search field (the kit's `TextBox` in search mode, the
|
|
1313
|
+
size of the menu's items) heads the documents and filters them as you type; nothing found shows a dimmed
|
|
1314
|
+
"No items". Up and Down go on from the search through the documents and the commands and around, Tab
|
|
1315
|
+
goes from part to part (out of the menu from the last), typing on a document goes back to the search
|
|
1316
|
+
with the letter, Enter in the search opens the first document. Only the documents scroll
|
|
1317
|
+
(`tabdocs.list-max-height`, default 20rem). The recently used list (Ctrl+E) is the same menu of
|
|
1318
|
+
documents, walked by focus while the modifier is held. Hooks `.mx-tabdocs__search`,
|
|
1319
|
+
`.mx-tabdocs__documents`, `.mx-tabdocs__commands`; tokens `tabdocs.list-note-fg` and
|
|
1320
|
+
`list-note-font-size` are gone (the menu's description tokens draw that text), `list-gap` is now the
|
|
1321
|
+
gap under the search. Checks 46 and 50 read the menu.
|
|
1322
|
+
- `MenuItem.description` (`Bind<string>`): a second, dimmer text after the label (`.mx-menu__description`,
|
|
1323
|
+
tokens `menu.description-font-size`, `menu.description-color`), part of the item's name, never a key
|
|
1324
|
+
or `aria-keyshortcuts`; typing to an item goes by the label alone. `MenuList.markColumn` keeps the
|
|
1325
|
+
column for a mark or an icon when no item has one, so the texts line up with a menu beside it.
|
|
1326
|
+
- TabDocumentManager document menu: the shown document keeps its icon and gets a check in a column of
|
|
1327
|
+
its own (a dot already means unsaved there); the search is as tall as the menu's items in every
|
|
1328
|
+
language (tokens `tabdocs.list-search-height`, `list-search-font-size`; Material 44 px instead of its
|
|
1329
|
+
56 px field). `MenuList.markBesideIcon` gives the mark its own column before the icons, and
|
|
1330
|
+
`MenuList.radioMark: 'dot' | 'check'` chooses how a chosen radio item is marked.
|
|
1331
|
+
|
|
1332
|
+
### DataGrid selection by dragging
|
|
1333
|
+
|
|
1334
|
+
- Rows: with `selection: 'multiple'`, pressing on a row and dragging over others selects the rows
|
|
1335
|
+
passed, live, with a frame around them while the drag runs (`settings.rowDragSelection`, on by
|
|
1336
|
+
default). A plain drag replaces the selection, Ctrl/⌘ adds the rows, Shift goes from the anchor;
|
|
1337
|
+
over the check box column the rows passed take the state the first one takes. Group rows, group
|
|
1338
|
+
footers, details and new rows are passed over (the rows of a closed group are not selected);
|
|
1339
|
+
rows that load while the list scrolls under the drag are taken in. `onSelectionChanging` and
|
|
1340
|
+
`onSelectionChanged` come once per row reached, with the new `byDrag`; Escape gives the drag up
|
|
1341
|
+
and puts the selection back.
|
|
1342
|
+
- Cell ranges, as in a spreadsheet: `settings.cellSelection` (`'none'`, `'single'`, `'multiple'`).
|
|
1343
|
+
Press on a cell and drag to draw a range (a frame, a fill over the row's own look, the anchor cell
|
|
1344
|
+
left unfilled); Ctrl/⌘ starts another range, Shift+click extends the last one from its anchor, a
|
|
1345
|
+
plain click starts over. Shift with the arrows, Home / End and PageUp / PageDown extend it from its
|
|
1346
|
+
far corner (focus goes with the corner), `selectAllCellsKeys` (`['Mod+A']`) selects every cell,
|
|
1347
|
+
`clearCellSelectionKeys` (`['Escape']`) clears, a plain move clears. The extending keys are options
|
|
1348
|
+
too: `extendCellsKeys` (`GridCellExtendKeys`: a chord list per move — `up`, `down`, `left`, `right`,
|
|
1349
|
+
`pageUp`, `pageDown`, `home`, `end` with Shift; `top`, `bottom`, `leftmost`, `rightmost` with
|
|
1350
|
+
`Mod+Shift` and the arrows; `first`, `last` with `Mod+Shift+Home` / `End`), and for rows
|
|
1351
|
+
`toggleRowSelectionKeys` (`['Shift+Space']`) and `extendRowSelectionKeys` (`GridRowExtendKeys`,
|
|
1352
|
+
Shift with Up / Down and PageUp / PageDown). Ctrl+C copies the ranges as
|
|
1353
|
+
tab-separated text and an HTML table (the rows and columns they cover, cells outside them empty;
|
|
1354
|
+
`copyValues`, `copyHeaders`, `onCopying` with the new `ranges`); Ctrl+V pastes one value into every
|
|
1355
|
+
cell of the ranges or a block from the last range's first cell; Delete (`clearKeys`) empties the
|
|
1356
|
+
cells the user can edit, through the rows' drafts, the checks and the save mode
|
|
1357
|
+
(`onRowUpdating`…). While cells can be selected, clicks on the cells draw ranges and rows are
|
|
1358
|
+
selected from the check box column.
|
|
1359
|
+
- Ranges are kept by row key (a new row by its id) and field: they follow their rows when rows are
|
|
1360
|
+
added above or loaded again and keep their columns when these move or hide; a sort, filter,
|
|
1361
|
+
search, grouping, opening or closing a group, or another page takes them away. A column opts out
|
|
1362
|
+
with `cellSelectable: false` (its own value wins over `settings.cellSelectable`).
|
|
1363
|
+
- API: `cellRanges` (read/write, reactive; also a prop, a function followed),
|
|
1364
|
+
`selectCells(from, to?, add?)`, `clearCellSelection()`, `getSelectedCellValues()`,
|
|
1365
|
+
`cellSelectionSummary` (`{ cells, count, numbers, sum, average, min, max }`),
|
|
1366
|
+
`onCellSelectionChanging` (cancelable) and `onCellSelectionChanged` (`{ ranges, byDrag }`); types
|
|
1367
|
+
`GridCellPoint`, `GridCellRange`, `GridCellValue`, `GridCellSummary`, `GridCellSummaryItem`,
|
|
1368
|
+
`GridCellSelectionChangingEventArgs`, `GridCellSelectionChangedEventArgs`. The bottom bar shows the
|
|
1369
|
+
summary while more than one cell is selected (`cellSummary`, `cellSummaryItems`:
|
|
1370
|
+
`['average', 'count', 'sum']`).
|
|
1371
|
+
- Both: `cellDragSelection`, `dragSelectionThreshold` (`5`; a shorter move stays a click, so clicks
|
|
1372
|
+
that select or start editing work as before), `dragSelectionAutoScroll`,
|
|
1373
|
+
`dragSelectionScrollSpeed` (`30`) and `dragSelectionScrollSensitivity` (`60`) — the rows scroll
|
|
1374
|
+
near or past an edge, down and sideways, frame by frame — `dragSelectionTouch` (`'scroll'`, or
|
|
1375
|
+
`'longPress'` after `dragSelectionLongPress` ms) and `dragSelectionOnEditableCells`, all live. Row
|
|
1376
|
+
drag and drop keeps its icon (and the whole row without icons); headers, the filter row, the group
|
|
1377
|
+
panel, action buttons, master-detail and adaptive toggles, links, buttons and fields in cells keep
|
|
1378
|
+
their presses; no text is selected while a drag runs, Alt+drag is left to the browser.
|
|
1379
|
+
- Accessibility: `aria-multiselectable` while cells can be selected, `aria-selected` on every
|
|
1380
|
+
selectable cell; polite announcements `gridRowsSelected`, `gridCellsSelected`,
|
|
1381
|
+
`gridCellRangesSelected`, `gridCellSelectionCleared`, `gridDragSelectCanceled`, `gridCopiedCells`,
|
|
1382
|
+
`gridCopyNotLoaded`, `gridCellsCleared` (en/tr). Tokens `datagrid.range-fill`,
|
|
1383
|
+
`range-fill-opacity`, `range-selected-fill`, `range-text`, `range-border-color`,
|
|
1384
|
+
`range-border-width`, `range-anchor-fill` (Material: its card surface), `row-run-border-color`,
|
|
1385
|
+
`row-run-border-width`; forced colors frame each cell of a range in `Highlight`.
|
|
1386
|
+
- The ranges are marks on the cells drawn now (pooled rows, columns in view), worked out once per
|
|
1387
|
+
change for every row; a cell's text is never written again for them. Measured in Chrome drawing
|
|
1388
|
+
a range over 100,000 rows × 60 virtual columns: 60 fps inside the rows, 59 fps while scrolling
|
|
1389
|
+
past the bottom edge, no cell text written while only the range changed.
|
|
1390
|
+
- Docs: a new page “Selecting by dragging” (`/datagrid/drag-select`: rows in memory with grouping,
|
|
1391
|
+
an editable sheet of orders, 100,000 rows × 60 virtual columns set from code), the API page's
|
|
1392
|
+
rows and tokens; `e2e/checks/52-datagrid-drag-select.mjs`.
|
|
1393
|
+
- Touch on real phones (found on an Android phone, Chrome 155): a long press drag of a tab and the DataGrid's
|
|
1394
|
+
long press selection did nothing, because the browser decides when the finger lands whether the page may
|
|
1395
|
+
scroll at once, and the listener that can stop it was added only on the press. The group bars, and the
|
|
1396
|
+
grid's rows while `dragSelectionTouch: 'longPress'`, now hold a touchmove listener from the start that
|
|
1397
|
+
stops the scroll only while a drag runs; a plain swipe still scrolls. Docs: long page titles break on a
|
|
1398
|
+
phone, the parts of an example stay within it, the token tables scroll in their own box.
|
|
1399
|
+
|
|
1400
|
+
### BottomSheet, Drawer and ActionSheet
|
|
1401
|
+
|
|
1402
|
+
- `BottomSheet`: a panel that comes up from the bottom of the page (the top layer) or of a `container`
|
|
1403
|
+
and stops at `detents` (`'peek'`, `'half'`, `'full'`, `'fit'`, pixels, or a share such as `'40%'`;
|
|
1404
|
+
default `['half', 'full']`), `detent` the one it is at (written back when the user moves it). The
|
|
1405
|
+
handle and the title follow the finger and the mouse; let go, it snaps to the nearest height, a flick
|
|
1406
|
+
faster than `flickSpeed` goes on to the next, past the tallest it gives a little, and dragged or
|
|
1407
|
+
flicked down below the lowest it closes (`swipeToClose`). The content takes the sheet along when it
|
|
1408
|
+
cannot scroll that way (`dragContent`): down from its top, up while the sheet is not at its tallest; a
|
|
1409
|
+
sideways swipe and a scroll stay the content's. A tap on the handle goes to the next height. The
|
|
1410
|
+
handle is a vertical `slider` for the keys (Up/Right/Page Up, Down/Left/Page Down, Home, End; its value
|
|
1411
|
+
the share of the full height, read as "Half height"…). `showHandle`, `draggable`, `topGap` (`0`: a
|
|
1412
|
+
full-screen sheet, its corners square off at the top), `snapTo()`, `expand()`, `collapse()`, `height`;
|
|
1413
|
+
`onDetentChanging` (cancelable, `to` can be changed) / `onDetentChanged`. It stands on the on-screen
|
|
1414
|
+
keyboard over the page (the visual viewport), and keeps clear of the safe areas.
|
|
1415
|
+
- `Drawer`: a panel from an edge of the page or of a `container` (`side`: `start`, `end` — they follow the
|
|
1416
|
+
reading direction —, `left`, `right`, `top`, `bottom`), over the content or pushing `pushTarget` aside
|
|
1417
|
+
(`mode: 'push'`, not modal unless asked), `size` (else `drawer.size`, never more than 85%). A finger
|
|
1418
|
+
swiping in from the edge opens it, following the finger (`edgeSwipe`, `edgeSize`); swiped back towards
|
|
1419
|
+
the edge it closes (`swipeToClose`); a flick decides however far it went (`flickSpeed`).
|
|
1420
|
+
- `ActionSheet`: the kit's `MenuItem`s in a bottom sheet (as tall as its items), large enough for a
|
|
1421
|
+
finger, with a title, a `message` and a cancel button apart (`showCancel`, `cancelText`). A submenu
|
|
1422
|
+
opens in place with "Back" first; `choose(items?, host?)` resolves with the item chosen or `null`;
|
|
1423
|
+
`open(byKeyboard)` puts focus on the first item or on the list; `onItemClick`, `chosenItem`, `menu`.
|
|
1424
|
+
- What they share is `OverlayPanel` (`parts/overlay`, public): `value` (`x-model`), `modal` (what is
|
|
1425
|
+
around it is made `inert` inside its container or on the page, Tab stays inside, the window stack knows
|
|
1426
|
+
it), `scrim`, `container` (a value or a function read when it opens), `title` / `label`, `content`,
|
|
1427
|
+
`footer`, `showClose`, `closeOnEscape`, `closeOnScrim`, `focusOnOpen` (a finger opening it does not
|
|
1428
|
+
bring the on-screen keyboard up: no field first on a coarse pointer), `returnFocus`, `disposeOnClose`,
|
|
1429
|
+
`open()`, `close(reason)`, `toggle()`, `show(host)`, `onOpening` / `onOpened` / `onClosing` /
|
|
1430
|
+
`onClosed` (`reason`: `code`, `escape`, `scrim`, `swipe`, `back`, `button`, `owner`). Content that
|
|
1431
|
+
scrolls with nothing to focus in it takes focus itself. `closeOnBack` (default `true`): the browser's
|
|
1432
|
+
back, Android's back button and back gesture close it through the session history, holding one entry
|
|
1433
|
+
while open and taking it back when it closes otherwise (`holdBackButton(view, onBack, layer)` in core:
|
|
1434
|
+
the holder of the highest layer, the last held or raised among equals, closes first; the state the
|
|
1435
|
+
page's router keeps in the entry stays). `SwipeTracker` measures a finger's speed.
|
|
1436
|
+
- `ContextMenu.presentation`: `'menu'` (default), `'sheet'` (its items in an `ActionSheet`) or `'auto'` (a
|
|
1437
|
+
sheet when a finger opened it — a long press — or on a screen with only a coarse pointer when not
|
|
1438
|
+
opened by a key); `actionSheet`. `MenuList.openSubmenus` (`false` reports a submenu item as chosen, for
|
|
1439
|
+
an owner that shows the submenu itself).
|
|
1440
|
+
- Texts (en, tr): `sheetLabel`, `sheetHandle`, `sheetPeek`, `sheetHalf`, `sheetFull`, `sheetFit`,
|
|
1441
|
+
`sheetHeight`, `drawerLabel`, `actionSheetLabel`, `back`. Tokens `sheet.*`, `drawer.*`,
|
|
1442
|
+
`actionsheet.*`; Material maps the sheet's outline away and a 32 high handle area, its drawer to 16
|
|
1443
|
+
corners, 360 wide, no outline; Lilac more room and rounder drawers; Fluent 8 corners on the drawer.
|
|
1444
|
+
- Docs: BottomSheet, Drawer and ActionSheet pages; `e2e/checks/54-bottomsheet.mjs`,
|
|
1445
|
+
`55-drawer.mjs`, `56-actionsheet.mjs`.
|
|
1446
|
+
|
|
1447
|
+
### TabDocumentManager on a tablet and a phone
|
|
1448
|
+
|
|
1449
|
+
- The layout stays the same and saves the same at every size; only where things show changes, and the
|
|
1450
|
+
content is moved, never made again. `presentation: 'auto' | 'desktop' | 'tablet' | 'phone'` (default
|
|
1451
|
+
`'auto'`: under `phoneWidth` (560) of the manager's own width as on a phone, whatever the pointer;
|
|
1452
|
+
under `tabletWidth` (1024) as on a tablet when the screen's pointer is a finger, `(pointer: coarse)`,
|
|
1453
|
+
followed live; with a mouse a narrow manager stays a desktop; `tabletWhen: 'width'` lets the width
|
|
1454
|
+
alone decide). 560: phones are 360–430 pixels wide, a manager of about 590 beside a desktop page's
|
|
1455
|
+
side column stays a desktop; apps change both limits. `currentPresentation` (reactive);
|
|
1456
|
+
`onPresentationChanging` (cancelable: `from`, `to`, `width`) / `onPresentationChanged`. A manager
|
|
1457
|
+
on a desktop with a mouse is as before.
|
|
1458
|
+
- On a tablet or a phone the documents' groups take the compact bars as the dock areas do (no scroll
|
|
1459
|
+
buttons, shrinking tabs, small buttons, a single document as a title; `compactBarButtons: 'auto'` keeps
|
|
1460
|
+
only the "…" menu there), through the same `compact…` props; `narrowBars: 'documents'` keeps the
|
|
1461
|
+
desktop bar. A narrow tab gives up its description before the letters of its title.
|
|
1462
|
+
- Tablet: at most two groups side by side (the first branch of the layout and the rest, each showing the
|
|
1463
|
+
group used last); the groups that do not fit fold their tabs into the strip of the group beside them
|
|
1464
|
+
(a tap activates the tab's own group there; the arrow keys go along the strip as it shows). Dock
|
|
1465
|
+
areas go into drawers from their edge, the bottom one into a sheet, opened from their titles along the
|
|
1466
|
+
edges or by a finger from the edge (`edgeSwipe`); a floating window is a large sheet.
|
|
1467
|
+
- Phone: one document, full screen, under a bar with its title (a swipe left or right, or the arrow keys,
|
|
1468
|
+
go to the document beside; a tap opens its commands in an action sheet), its close button and the
|
|
1469
|
+
number of open documents, which opens a full-screen list: groups (and floating windows) as sections,
|
|
1470
|
+
pinned first, a search, a tap to show, a swipe sideways to close, a long press to lift a row and drag
|
|
1471
|
+
it within its group or into another, a long press let go to open its commands; Up, Down, Enter,
|
|
1472
|
+
Delete, Alt+Up/Down, the Menu key. The tools of the dock areas are buttons in a bar at the bottom: a
|
|
1473
|
+
tap opens a sheet above it (peek, half, full by its handle; swipe down closes) or a drawer for an area
|
|
1474
|
+
that asks for one. A floating window is a full-screen sheet; new browser windows are off; the tab menu
|
|
1475
|
+
is an action sheet ("Move to…" and "Move into new window" are left out there). The browser's back
|
|
1476
|
+
closes what is open on top, then goes back through the documents (`backButton`), past the tools used
|
|
1477
|
+
in between; of several managers the one used last.
|
|
1478
|
+
- Settings: `phoneDockMode` (`'sheet'`), `tabletDockMode` (`'auto'`: drawers for the sides, a sheet for
|
|
1479
|
+
the bottom) and the area's own `TabDockArea.phoneDockMode` / `tabletDockMode` (`'sheet'`, `'drawer'`,
|
|
1480
|
+
`'hidden'`; its own wins), `edgeSwipe`, `backButton`, `menuPresentation`. Methods
|
|
1481
|
+
`tabletWhen`, `narrowBars`, `showDocumentList()`, `hideDocumentList()`, `documentListOpen`, `showTool(doc)`, `hideTool(area)`;
|
|
1482
|
+
`activate()` of a tool or of a document in a window opens its drawer or sheet. `split`, `move`,
|
|
1483
|
+
`float`, `dock` keep working and are shown the way the presentation allows; `moveToNewWindow` returns
|
|
1484
|
+
`null` on a phone.
|
|
1485
|
+
- On a coarse pointer the tabs, their close buttons and the folded areas' titles are taller in every
|
|
1486
|
+
presentation (`tabdocs.touch-tab-height`, `touch-close-size`). Tokens for the phone's bar, tools and
|
|
1487
|
+
list (`tabdocs.phone-*`, `tool-*`, `phone-list-*`, `divider-*`); the shown document and the open tool
|
|
1488
|
+
are marked as the design language marks a selection. Texts (en, tr) `tabDocsPresentation`,
|
|
1489
|
+
`tabDocsDesktop`, `tabDocsTablet`, `tabDocsPhone`, `tabDocsPhoneTitle`, `tabDocsPhoneCount`,
|
|
1490
|
+
`tabDocsPhoneList`, `tabDocsPhoneSearch`, `tabDocsPhoneTools`.
|
|
1491
|
+
- Docs: a "Tablet and phone" page (one layout shown four ways and saved the same, a manager that follows
|
|
1492
|
+
its width in a resizable frame, the settings and events, the list, the back button, API); the Preview
|
|
1493
|
+
and "Between managers" examples, narrow beside their logs, are shown as on a desktop.
|
|
1494
|
+
`e2e/checks/53-tabdocs-mobile.mjs` (a phone of 390 × 844 and a tablet of 820 × 1180, both with touch).
|
|
1495
|
+
|
|
1496
|
+
### MotifJS 1.2.0-rc.22
|
|
1497
|
+
|
|
1498
|
+
- Needs `@motifx/core` 1.2.0-rc.22 (peer `^1.2.0-rc.22`): other documents (R30) and the window manager with
|
|
1499
|
+
`onClosing` / `returnOnClose` (R31) are in core now.
|
|
1500
|
+
- TabDocumentManager's new browser windows are given to the app's window manager
|
|
1501
|
+
(`app.windows.attach(view, { styles: 'live', onClosing })`): core mirrors the page's styles and root attributes,
|
|
1502
|
+
connects the document (router links, mounting) and says when the window closes. Without an app the kit's own
|
|
1503
|
+
mirroring and `pagehide` handling still do it. The kit's workarounds are gone: `core/let-mount.ts` and the
|
|
1504
|
+
router-link relay.
|
|
1505
|
+
- onMounted now fires only under the app's `run()` host or a built `new Component(existingElement)` root, never for
|
|
1506
|
+
a raw `appendChild`: the no-app message box and a Toaster in no component tree place themselves under a root of
|
|
1507
|
+
their own in the page; the tests' `mount()` helper does the same.
|
|
1508
|
+
|
|
1509
|
+
### TabDocumentManager: folded areas slide from under their strip
|
|
1510
|
+
|
|
1511
|
+
- A folded area slides out from under its strip and back into it, never over it (the strip lies above the area).
|
|
1512
|
+
- Nothing else moves while it slides: the manager clips instead of being a scroll box, and the focus given to the
|
|
1513
|
+
slid out content does not scroll the page (`focusContent(still)`). Before, a bottom area scrolled the manager
|
|
1514
|
+
(or the page) by its own height and back, so the documents above it jumped. `e2e/checks/48-tabdocs-dock.mjs`
|
|
1515
|
+
checks it frame by frame for the left and the bottom area.
|
|
1516
|
+
|
|
1517
|
+
### Scheduler, milestone 1: the views, the layout, moving, the keys
|
|
1518
|
+
|
|
1519
|
+
- `Scheduler` (`src/components/scheduler/`), written with MotifJS alone: every part is a component of its tree (JSX,
|
|
1520
|
+
`.map` lists, `x-display`, a `switch` between the day views and the month); nothing is built or placed by hand.
|
|
1521
|
+
`SchedulerModel` is the scheduler without its DOM: the days and times shown, where each appointment goes and the
|
|
1522
|
+
selection, filled in place (a day, a time row and an appointment's piece stay the same objects while they stay on
|
|
1523
|
+
screen, so a change moves the same box).
|
|
1524
|
+
- Views `day`, `week`, `workWeek` and `month`, and views of their own (`views`: a name, a caption, `intervalCount`,
|
|
1525
|
+
the hours, `cellDuration`, `allDayPanel`, `maxAppointmentsPerCell`, winning over the scheduler's settings).
|
|
1526
|
+
- Appointments from `appointments` (a reactive array is followed) or a `DataSource` (`remoteFiltering`: the days shown
|
|
1527
|
+
only, asked again when the view moves; loading and a retry), the fields named by `fields`.
|
|
1528
|
+
- Appointments at the same time side by side (`overlapMode: 'columns' | 'cascade'`), over midnight on each day,
|
|
1529
|
+
all-day and multi-day ones as bars in the all-day panel (`allDayLines`), timed ones in the month as chips, "+N more"
|
|
1530
|
+
where a day is full (`maxAppointmentsPerCell`, or as many as fit) with the day's list in a popup.
|
|
1531
|
+
- Work days and hours shaded, today, holidays (`isHoliday`), the current time line, ended appointments quieter
|
|
1532
|
+
(`dimPast`), its own colour per appointment as a tint and a stripe, `appointmentTemplate`.
|
|
1533
|
+
- The bar: today, previous, next, the date (it opens the kit's `Calendar`) and the views (`toolbar`). Keys: arrows over
|
|
1534
|
+
the cells (Shift selects; past the first or last day the view moves on), Home / End, Page Up / Page Down, Enter and
|
|
1535
|
+
Space, Escape; `T`, `N` / `J`, `P` / `K`, `D`, `W`, `X`, `M` (`keys`). Focus keeps its date when the view or the
|
|
1536
|
+
date changes.
|
|
1537
|
+
- API: `goToday`, `next`, `previous`, `showDate`, `showView`, `scrollToTime`, `selectCells`, `appointmentsIn`,
|
|
1538
|
+
`findAppointment`, `visibleRange`, `resolvedView`, `selectedCells`, `shownAppointments`; events `viewChanging` /
|
|
1539
|
+
`viewChanged`, `dateChanging` / `dateChanged`, `cellClick` / `cellDblClick`, `appointmentClick` /
|
|
1540
|
+
`appointmentDblClick`, `selectionChanged`, `contentReady`, `moreOpening`.
|
|
1541
|
+
- Texts in `uiLocale` (en, tr) and `texts`; dates and times by `Intl` in `locale`. Component tokens
|
|
1542
|
+
`tokens/component/scheduler.tokens.json`; `chevronStart` in the glyphs.
|
|
1543
|
+
- Docs page `/scheduler`; `e2e/checks/57-scheduler.mjs` (32 checks, axe in every view in light and dark).
|
|
1544
|
+
|
|
1545
|
+
### Scheduler, milestone 2: adding, the form, moving and resizing
|
|
1546
|
+
|
|
1547
|
+
- Appointments are moved by dragging (on the step of `snapMinutes`; over the hours, onto the all-day panel, by days in
|
|
1548
|
+
the month), resized by their edges (`minDuration`), copied with Ctrl, taken back with Escape; the view scrolls near
|
|
1549
|
+
its edges; a finger starts with a long press. While it goes the appointment's own box stands where it would go (a
|
|
1550
|
+
draft the layout shows): nothing is built for the drag.
|
|
1551
|
+
- The keys: the arrows move a focused appointment (Shift + arrows its end), Enter saves, Escape takes it back; Delete
|
|
1552
|
+
deletes (asking first, `editing.confirmDelete`); Enter on cells opens the form for a new one over the selection.
|
|
1553
|
+
- A click shows the tooltip (text, time, description, Edit, Delete; `tooltip`); a double click opens the form
|
|
1554
|
+
(`MxForm` + `FormLayout`: title, start, end, all day, description, the end checked against the start).
|
|
1555
|
+
`onFormOpening` gets its `items` and `data` to add fields of its own (written to the appointment's fields of those
|
|
1556
|
+
names), or cancels it for a form of one's own.
|
|
1557
|
+
- Writes go where the appointments come from: into the array (pushed, assigned, spliced) or through the data source's
|
|
1558
|
+
adapter. `onAppointmentAdding` / `Updating` / `Deleting` may cancel or set a `promise` to wait; while one saves
|
|
1559
|
+
the appointment is locked; `onDataError` tells when saving failed, and it shows as it was.
|
|
1560
|
+
- `editing` (`false`: read only; or `allowAdding`, `allowUpdating`, `allowDeleting`, `allowDragging`,
|
|
1561
|
+
`allowResizing`, `allowCopying`, `confirmDelete`), an appointment's own `allowDrag`, `allowResize`, `allowEdit`,
|
|
1562
|
+
`allowDelete` winning. `onMoveStart` / `onMoving` / `onMoveEnd` and `onResizeStart` / `onResizing` / `onResizeEnd`
|
|
1563
|
+
(cancel on `…ing` marks a place it may not go). Methods `addAppointment`, `updateAppointment`, `deleteAppointment`,
|
|
1564
|
+
`showAppointmentForm`, `showTooltip`, `hideTooltip`.
|
|
1565
|
+
- A scheduler's data source must load `'all'` (it warns otherwise): a page of rows would leave appointments of the
|
|
1566
|
+
days shown out. The milestone 1 example used `'page'`; fixed.
|
|
1567
|
+
- A box carries its text, colour and disabled state from the layout, so a plain object changed by a data source
|
|
1568
|
+
reaches it too. Narrow boxes cut their text short on one line instead of breaking words.
|
|
1569
|
+
- Docs page `/scheduler/editing`; `e2e/checks/58-scheduler-editing.mjs`.
|
|
1570
|
+
|
|
1571
|
+
### Scheduler, milestone 3: recurrence and time zones
|
|
1572
|
+
|
|
1573
|
+
- **Recurrence rules (RFC 5545), the kit's own engine** (`src/parts/recurrence/`, DOM-free, exported):
|
|
1574
|
+
`parseRecurrenceRule` / `formatRecurrenceRule` (`FREQ` daily to yearly, `INTERVAL`, `COUNT`, `UNTIL`, `BYDAY`
|
|
1575
|
+
with `2MO` and `-1FR`, `BYMONTHDAY`, `BYMONTH`, `BYYEARDAY`, `BYWEEKNO`, `BYSETPOS`, `WKST`, `BYHOUR`,
|
|
1576
|
+
`BYMINUTE`, `BYSECOND`; parts it does not read are kept), `recurrenceDates` (the times in a range only, on the
|
|
1577
|
+
wall clock, skipping the steps before the range when there is no count), `describeRecurrence` (the rule in plain
|
|
1578
|
+
words, en and tr), exception dates (`readRuleDates`, `addRuleDate`, `filterRuleDates`, `parseRuleDate`,
|
|
1579
|
+
`formatRuleDate`). Tested with the RFC's examples, leap years and the 31st.
|
|
1580
|
+
- **Time zones** (`src/parts/dates/time-zone.ts`, `TimeZone`, `Intl` only): moments and wall clock times both ways,
|
|
1581
|
+
a time the clock skips moved on by the gap, one it shows twice taken as the first (or the later). Scheduler
|
|
1582
|
+
`timeZone` puts the days and hours on a zone's clock; a series repeats on its start's zone
|
|
1583
|
+
(`fields.startTimeZone`); a box on the night summer time changes reaches its end's row and is never shorter than
|
|
1584
|
+
it lasts.
|
|
1585
|
+
- **Series in the scheduler:** `fields.recurrenceRule`, `recurrenceException` (`EXDATE`), `recurrenceId` (an
|
|
1586
|
+
occurrence changed apart names its series' key), `startTimeZone`, `endTimeZone`. Only the days shown are
|
|
1587
|
+
expanded; each occurrence is an object of its own, kept while it stays on screen.
|
|
1588
|
+
- **Changing a series:** a drag, the keys, the form and Delete ask "this one / this and the following / the whole
|
|
1589
|
+
series" (`MxForm` + `FormLayout` with radio buttons; `seriesEdit` answers without asking; `onSeriesAsking` may
|
|
1590
|
+
answer, narrow or cancel; `onSeriesAnswered`). This one: a new appointment in its place and its time left out of
|
|
1591
|
+
the series. This and the following: the series ends before it (`UNTIL`, or the count split) and a new series
|
|
1592
|
+
goes on. The whole series: every occurrence moves as this one did (a weekly series moved a day moves its
|
|
1593
|
+
weekdays). The update and delete events carry `scope` and `series`; `onAppointmentUpdated` gives `added`.
|
|
1594
|
+
- **Through the data layer:** a change to a series is written one write after another through the adapter (new rows,
|
|
1595
|
+
then changes, then deletes). When a later write fails the earlier ones are taken back through the adapter;
|
|
1596
|
+
`onDataError` now has `saved`, `unsaved` and `undone`, and the live region says when part of a change stayed
|
|
1597
|
+
saved. A deleted series takes its changed occurrences, asked of the adapter (loaded or not). `rangeFilter(range,
|
|
1598
|
+
fields)` builds the data layer's filter for a range with the series that began before it; `remoteFiltering`
|
|
1599
|
+
uses it (the old filter left such series out).
|
|
1600
|
+
- **`RecurrenceEditor`** (exported, also in the appointment form, `editing.allowRecurrence`): the repeat list, every
|
|
1601
|
+
how many, the weekday buttons, a day of the month or a weekday by its place, the month, the end; it reads and
|
|
1602
|
+
writes the rule (`value`, `x-model`) and says it in words. With `editing.allowTimeZones` the form has one
|
|
1603
|
+
searchable time zone picker (`Intl`'s zones) and a box "Separate end time zone" (`separateEndZone`, an item like
|
|
1604
|
+
the others): checked, a second picker sets the end's zone, and an appointment whose end zone differs opens
|
|
1605
|
+
with it checked; unchecked, the end follows the start's zone. Each picker has the whole row (a zone's name is
|
|
1606
|
+
long), the box its own row under it; the field's tooltip gives the whole name.
|
|
1607
|
+
- **Marks:** an occurrence carries a series mark, one changed apart an exception mark (units `series-mark`,
|
|
1608
|
+
`exception-mark`; glyphs `repeat`, `repeat-off`; Material, like Google Calendar, draws none; `recurrenceMarks`).
|
|
1609
|
+
The tooltip says how it repeats (unit `tooltip-repeat`) and the time on the appointment's own clock.
|
|
1610
|
+
- Methods `seriesOf`, `isOccurrence`, `isException`, `occurrencesOf`, `recurrenceText`, `askSeries`;
|
|
1611
|
+
`updateAppointment` and `deleteAppointment` take a `scope`.
|
|
1612
|
+
- Token schema `recurrence-editor.json` (units `editor`, `days-label`, `days`, `summary`; the weekday buttons'
|
|
1613
|
+
place `day-button`), values in every language. The seven weekday buttons are of one width, the widest name's
|
|
1614
|
+
(measured in en, tr, de, fr, el, ta and ar); Fluent draws them as small rounded toggle buttons.
|
|
1615
|
+
- An appointment's text stands out on its fill in every language and theme, at rest, under the pointer and open:
|
|
1616
|
+
`appointment-text-auto` takes black or white by the fill (Material, whose boxes take the appointment's own
|
|
1617
|
+
colour), and the time takes the title's colour under the pointer and open (`appointment-time` `hover`, `open`).
|
|
1618
|
+
- Docs page `/scheduler/recurrence` (one example from a data source); `e2e/checks/60-scheduler-recurrence.mjs`.
|
|
1619
|
+
|
|
1620
|
+
### Scheduler, milestone 4: resources, groups and the form
|
|
1621
|
+
|
|
1622
|
+
- **Resources** (`resources: SchedulerResource[]`): a kind's `field` (one value, or a list with `allowMultiple`),
|
|
1623
|
+
`label`, `items` (an array, or a data source loaded once and followed), `valueExpr`, `displayExpr`, `colorExpr`,
|
|
1624
|
+
`useColorAsDefault`, `parentExpr`, and an item's own `workStartHour`, `workEndHour`, `workDays` (through
|
|
1625
|
+
`…Expr`). Resources colour the appointments (the kind marked, else the first kind whose item has a colour; an
|
|
1626
|
+
appointment's own `color` wins; in a group, the group's item). An item's own `allowDrag`, `allowResize`,
|
|
1627
|
+
`allowEdit`, `allowDelete` win over `editing` for its appointments. The tooltip has a line per kind.
|
|
1628
|
+
- **Groups** (`groups`, a view's own `groups`): the columns of the day, week, work week and month views split by
|
|
1629
|
+
resource, nested (a room over its people; `parentExpr` keeps a person under their own room), with a row of heads
|
|
1630
|
+
per level; `groupByDate` puts the groups under each date (a single day shows its date over the groups).
|
|
1631
|
+
`resourceHeaderTemplate` draws a head. Cells name their group (`aria-label`), `selectedCells` and the cell events
|
|
1632
|
+
carry `resources`, a new appointment from a cell gets its group's values. A bar under groups by date is cut into a
|
|
1633
|
+
piece per day. The model (`SchedulerModel`) is DOM-free: `groups`, `columns`, `dates`, `heads`, kept in place.
|
|
1634
|
+
- **Moving between groups:** a drag, and `Alt+Shift+ArrowLeft` / `ArrowRight` on an appointment (`keys.previousGroup`
|
|
1635
|
+
/ `nextGroup`, mirrored right to left), change the resource fields; in a list only the value of the group it
|
|
1636
|
+
leaves changes. `DragEventArgs.resources`, `AppointmentClickEventArgs.group`, `AppointmentTemplateContext.group`.
|
|
1637
|
+
- **Availability:** `blockedTimes` (`{ start, end, text?, allDay?, recurrenceRule?, resources? }`) mark their cells
|
|
1638
|
+
(`data-blocked`, read out); `allowOffHours: false` keeps what the user moves, resizes or saves in the work hours
|
|
1639
|
+
(of its resources, else the scheduler's); `allowOverlap: false` keeps it off another appointment of its group,
|
|
1640
|
+
and a function there decides the whole check (`SchedulerTimeCheck`: `overlapping`, `blocked`, `offHours`). A drag
|
|
1641
|
+
or a move by the keys shows where it may not go (`onMoving` / `onResizing` start with `cancel` set there);
|
|
1642
|
+
the form says why it cannot save. `checkTime()`, `resourcesOf()`.
|
|
1643
|
+
- **The form:** each kind gets a picker (`DropDown`, or `TagBox` for several), each item with its colour.
|
|
1644
|
+
`editing.form` (`SchedulerForm`): `items` by name (`text`, `start`, `end`, `allDay`, `timeZone` or its three items,
|
|
1645
|
+
`recurrenceRule`, `description`, a resource's field) or items of your own, groups and tabs, `columns`,
|
|
1646
|
+
`minColumnWidth`, `labelMode`, `title`, `width`. An item of a built-in's field changes it (its rules add); its
|
|
1647
|
+
`visible`, `readOnly`, `enabled`, `required`, `label`, `helpText`, `rules` may be functions of the form
|
|
1648
|
+
(`AppointmentFormContext`: `appointment`, `data`, `isNew`). `editor` may be a function (any component taking an
|
|
1649
|
+
editor's props) and `template` any MotifJS component. `onFormOpening` gets the items made and may cancel.
|
|
1650
|
+
- **`FormLayout`:** `tabs` items (every tab checked; a check shows the tab of the first field that failed), `editor`
|
|
1651
|
+
as a function, `template(context)` with `{ data, field, validationGroup }`, `editor: 'tagbox'`.
|
|
1652
|
+
- **Data:** `rangeFilter(range, fields, { resources })` (`RangeFilterOptions`) asks for the resources shown too; a
|
|
1653
|
+
scheduler grouped by a field of one value uses it with `remoteFiltering`.
|
|
1654
|
+
- Units `group-header` (`inner`, `month`), `group-swatch`, `group-divider` (`inner`, `head`), `unavailable` (`all-day`,
|
|
1655
|
+
`month`), `drop-mark` (`bar`, `chip`), `resource-swatch` (`tooltip`), `tooltip-resource-label`,
|
|
1656
|
+
`tooltip-resource-item`; the cell's `blocked` state; the glyph `blocked`. Material draws no divider and no drop
|
|
1657
|
+
mark (Google Calendar), Lounge no hatch.
|
|
1658
|
+
- **Text that reads on any colour:** an appointment's title and time read on its fill whatever the colour, in
|
|
1659
|
+
every language and theme. Black or white (`appointment-text-auto`) is chosen by contrast (the fill's luminance
|
|
1660
|
+
from 0.179 up takes black; it was a lightness of 0.65, which gave white on mid colours such as `#00838f`).
|
|
1661
|
+
A language's ink that would not stand out 4.6 times is made darker on a light fill or lighter on a dark one just
|
|
1662
|
+
as far as needed, its hue kept; one that does is left as it is. The time's colours are plain tokens now
|
|
1663
|
+
(`appointment-time-tone`, `-hover`, `-open`), read on the fill the same way. Measured in check 61 on 24 hues at 5
|
|
1664
|
+
lightnesses, 6 greys and the docs' colours, on a box, a bar and a chip, in six states: at least 4.56:1.
|
|
1665
|
+
- The layout's column variables are `--_columns` and `--_column` (they were `--_days` and `--_day`).
|
|
1666
|
+
- Docs pages `/scheduler/resources` and `/scheduler/form`; `e2e/checks/61-scheduler-resources.mjs` and
|
|
1667
|
+
`62-scheduler-form.mjs`.
|
|
1668
|
+
|
|
1669
|
+
### Scheduler, milestone 5: timelines, the agenda and big data
|
|
1670
|
+
|
|
1671
|
+
- **Timeline views** `timelineDay`, `timelineWeek`, `timelineWorkWeek`, `timelineMonth`: a row per group (one without
|
|
1672
|
+
groups), nested groups in levels of a resource column, the time along the row (mirrored right to left). The scale
|
|
1673
|
+
has two tiers (the days over their hours; the months over their days) and stays at the top while the rows scroll;
|
|
1674
|
+
the resource column stays at the start while the time scrolls; a long day's date stays in view. Appointments at
|
|
1675
|
+
the same time stack in lanes of their row and the row grows; each row is laid out on its own. The current time,
|
|
1676
|
+
blocked times and the hours outside work carry over; cells stretch to fill the room when they are few.
|
|
1677
|
+
`maxAppointmentsPerCell` (a number) keeps that many lanes and says "+N more" per day.
|
|
1678
|
+
- **Everything of milestones 2–4 in the timeline:** a drag along the row and to another row (its resources change),
|
|
1679
|
+
both ends resize, a copy with Ctrl, the drop mark; the keys over the cells (Left / Right along the time, Up / Down
|
|
1680
|
+
between rows, Home / End, Ctrl + Home / End, PageUp / PageDown, past the end the view moves on) and on an
|
|
1681
|
+
appointment (Left / Right a snap step, Up / Down to the row above or below, Shift for its end, Enter saves); the
|
|
1682
|
+
form, the tooltip, recurrence, time zones, availability. Cells read their group, date and time.
|
|
1683
|
+
- **Agenda** (`agenda`, `agendaDuration`, default 7, component-wide and per view): the coming days with their
|
|
1684
|
+
appointments in time order (the ones taking the day first; one that lasts days on each of them), days with none
|
|
1685
|
+
left out, grouped by resource with `groups`, "No appointments" (`uiLocale`) when empty. A list box: Up / Down,
|
|
1686
|
+
Home / End, PageUp / PageDown move over the rows (the focused one is selected), Space shows the tooltip, Enter the
|
|
1687
|
+
form, Delete deletes; `keys.agendaView` (`A`).
|
|
1688
|
+
- **Big data:** a timeline's rows go through `Virtualization` when they are many (each as tall as its lanes, worked
|
|
1689
|
+
out by the model from the lane's measured height); the cells and appointments along the time, and the columns of
|
|
1690
|
+
a day or a week with many groups, are built from a window the model keeps (`setWindow`, `shownTicks`,
|
|
1691
|
+
`shownColumns`, `shownTimed`, `shownHeads`), moved on by a few cells as the view scrolls. `scrolling: 'auto' |
|
|
1692
|
+
'standard' | 'virtual'` (component-wide and per view; `'auto'` turns virtual past about 2,000 cells). A drag lays
|
|
1693
|
+
out only the rows it touches; the appointments are read once for every layout until they change; groups are found
|
|
1694
|
+
by key. Measured in development (DevTools on), 1,440 × 900: 1,000 rows × 10,000 appointments in a timeline week
|
|
1695
|
+
show in about 0.6 s with about 850 elements and scroll at 55–60 fps both ways (dragging 50–60 fps); a week of 200
|
|
1696
|
+
groups (1,400 columns, 4,000 appointments) shows in about 0.75 s with about 2,700 elements, 60 fps down, 40–58 fps
|
|
1697
|
+
sideways (between runs), 45 fps dragging.
|
|
1698
|
+
- **Settings per view:** `startDate` (intervals counted from it), `agendaDuration`, `scrolling`, and every
|
|
1699
|
+
template: a view's own wins, `null` there turns it off.
|
|
1700
|
+
- **Narrow boxes:** in a row the text in front stays whole and the one after gives way; a short box and a box on a
|
|
1701
|
+
timeline read their title first, before the time. The time no longer runs under the series mark in a narrow box
|
|
1702
|
+
(it did in the week view too).
|
|
1703
|
+
- **Templates** (`SchedulerTemplates`, component-wide and per view): `appointmentTemplate`,
|
|
1704
|
+
`appointmentTooltipTemplate` (`TooltipTemplateContext`), `dataCellTemplate` (`CellTemplateContext`),
|
|
1705
|
+
`dateCellTemplate` (`DateTemplateContext`), `timeCellTemplate` (`TimeTemplateContext`), `resourceHeaderTemplate`,
|
|
1706
|
+
`agendaRowTemplate` (`AgendaRowContext`), `moreListTemplate` (`MoreListContext`).
|
|
1707
|
+
- **Methods:** `scrollTo(date, resources?)`; `scrollToTime` scrolls a timeline along.
|
|
1708
|
+
- Units `timeline-row` (`first`), `timeline-divider` (`inner`), `resource-cell` (`inner`, `first`, `continued`),
|
|
1709
|
+
`timeline-corner`, `timeline-corner-label`, `scale`, `scale-upper` (`today`), `scale-lower` (`day-start`, `day`,
|
|
1710
|
+
`weekend`, `today`), `agenda`, `agenda-group` (`first`), `agenda-resource`, `agenda-day` (`today`),
|
|
1711
|
+
`agenda-weekday` (`today`), `agenda-month`, `agenda-row` (`hover`, `selected`, `open`, `focus`, `past`,
|
|
1712
|
+
`disabled`), `agenda-content`, `agenda-time`, `agenda-dot`, `agenda-text`, `agenda-empty`; the cell's `line`,
|
|
1713
|
+
`line-hour`, `line-day`, the appointment's `line`, `line-before`, `line-after`, the day number's `scale` and
|
|
1714
|
+
`agenda`, the group swatch's `resource`; `now` and `now-dot` stand up in a timeline (turned). Plain tokens
|
|
1715
|
+
`timeline-cell-width`, `timeline-resource-width`, `timeline-lane-size`, `timeline-row-min-height`,
|
|
1716
|
+
`agenda-time-width`. Material draws no row divider (Google Calendar) and a Google-like agenda (a day's number in a
|
|
1717
|
+
circle, rows lit whole, a dot); Fluent a colour bar on an agenda row (Outlook).
|
|
1718
|
+
- Docs pages `/scheduler/timeline`, `/scheduler/agenda`, `/scheduler/big-data`; `e2e/checks/63-scheduler-timeline.mjs`,
|
|
1719
|
+
`64-scheduler-agenda.mjs`, `65-scheduler-big-data.mjs` (the numbers against limits).
|
|
1720
|
+
|
|
1721
|
+
### Scheduler, milestone 6: tablet, phone, touch, iCalendar and print
|
|
1722
|
+
|
|
1723
|
+
- **Presentation by screen, the same model** (as the TabDocumentManager): `presentation: 'auto' | 'desktop' |
|
|
1724
|
+
'tablet' | 'phone'`, `phoneWidth` (560), `tabletWidth` (1024), `tabletWhen` (`'touch'`: under `tabletWidth` only on
|
|
1725
|
+
a screen whose pointer is a finger, `(pointer: coarse)` followed live; `'width'`), `currentPresentation`,
|
|
1726
|
+
`onPresentationChanging` (cancellable) and `onPresentationChanged`. The appointments, views and date stay; only
|
|
1727
|
+
how they show changes.
|
|
1728
|
+
- **As on a phone:** `phoneView` (default `'agenda'`, a day when the views have none; `null` keeps the view; going
|
|
1729
|
+
back it shows the view it had, unless the user chose another), `tabletView` (default `null`). The bar is compact:
|
|
1730
|
+
the month as the title (with its year when it is not this year; the calendar opens from it), Today as an icon, one
|
|
1731
|
+
menu of the views; no steps (a swipe and the month's calendar move, as phone calendars do; N and P still work).
|
|
1732
|
+
The tooltip is an `ActionSheet` (the text, the time and how it repeats; Edit, Delete; with a tooltip template a
|
|
1733
|
+
`BottomSheet` holding it), the form a full-height `BottomSheet` in one column (`FormOpeningEventArgs.form` is the
|
|
1734
|
+
sheet there). A narrower ruler and resource column so a week fits; the agenda writes a row's time under its text.
|
|
1735
|
+
Every view works at every size.
|
|
1736
|
+
- **Touch** (`SchedulerTouch`, every listener on the scheduler before a finger lands):
|
|
1737
|
+
- a long press lifts an appointment (the `lifted` state) and drags it; let go, it stays selected with a handle in
|
|
1738
|
+
the middle of its start and its end edge (`resize-grip`); a finger on a handle resizes at once; a tap elsewhere
|
|
1739
|
+
puts it down. On another appointment an edge is a long press to move it, not a resize;
|
|
1740
|
+
- `swipeNavigation` (default `true`): a swipe sideways goes to the next or the previous days (mirrored right to
|
|
1741
|
+
left) past a quarter of the view or as a flick; a view that can still scroll that way scrolls first. The view
|
|
1742
|
+
follows the finger and an edge mark (`swipe-edge`) shows where the next days come from, `ready` when letting go
|
|
1743
|
+
moves on;
|
|
1744
|
+
- `pinchZoom` (default `true`, as Google Calendar and Apple Calendar) zooms the time scale: the hours of the day
|
|
1745
|
+
views (the time between the fingers stays there) and the cells of a timeline. `timeZoom` (0.5 to 4) is the
|
|
1746
|
+
setting it writes; `onTimeZoomChanging` (cancellable, the page zooms instead) and `onTimeZoomChanged`;
|
|
1747
|
+
- scrolling stays native; no click after a drag or a swipe; a long press opens no page menu; `data-touch` marks the
|
|
1748
|
+
scheduler while a finger is in use, so no hover look stays after a touch (the hover states and rules are written
|
|
1749
|
+
`:where(.mx-scheduler:not([data-touch]))`, the same specificity);
|
|
1750
|
+
- a finger selects one cell; a second tap on it opens the form for a new appointment (a double tap opens one form).
|
|
1751
|
+
- On a touch screen the bar takes the language's large buttons (`phone-bar-size` as on a phone: Material's top app
|
|
1752
|
+
bar takes its 40 px buttons), the agenda rows `touch-target`, the lines of the month and the all-day panel
|
|
1753
|
+
`touch-lane-size`.
|
|
1754
|
+
- **iCalendar (RFC 5545):** `exportICalendar({ range: 'visible' | 'all' | { start, end }, appointments, name })` returns
|
|
1755
|
+
the text; `importICalendar(text)` resolves to `{ added, updated, failed }`. Events `onICalendarExporting`
|
|
1756
|
+
(cancellable, `appointments` changeable), `onICalendarExported`, `onICalendarImporting` (cancellable, the values read
|
|
1757
|
+
changeable), `onICalendarImported`. Written: `UID` (the key), `DTSTAMP`, `DTSTART` / `DTEND` with `TZID` (all-day as
|
|
1758
|
+
`VALUE=DATE`), `SUMMARY`, `DESCRIPTION`, `RRULE` (a wall clock `UNTIL` in UTC), `EXDATE`, `RECURRENCE-ID` (an
|
|
1759
|
+
occurrence changed apart, under its series' UID: the left-out time of the series nearest to it), a `VTIMEZONE` for
|
|
1760
|
+
each zone used. Read: the same, folded lines, escaped text, `TZID` (an IANA name, else the file's `VTIMEZONE`, as
|
|
1761
|
+
Outlook's Windows names), UTC and floating times, `DURATION`, a cancelled occurrence left out of its series. Import
|
|
1762
|
+
goes through the editor and the store: `onAppointmentAdding` first, a data source gets the adds through its
|
|
1763
|
+
adapter; an event whose UID is an appointment's key changes it.
|
|
1764
|
+
- **The iCalendar part** (`src/parts/icalendar/`, DOM-free, exported): `parseICalendar`, `writeICalendar`,
|
|
1765
|
+
`timeZoneLines` (a zone's `VTIMEZONE` from `Intl`: a yearly `RRULE` when every change follows one, else `RDATE`s),
|
|
1766
|
+
`icalendarMoment`, and the types `ICalendar`, `ICalendarEvent`, `ICalendarDate`, `ICalendarProperty`,
|
|
1767
|
+
`ICalendarTimeZone`, `ICalendarObservance`, `ICalendarWriteOptions`.
|
|
1768
|
+
- **Print:** a print stylesheet and `print()` (`onPrinting` cancellable, `onPrinted`). On paper (the browser's print
|
|
1769
|
+
too: `beforeprint`) the scheduler is built whole (a virtual view turns standard), nothing scrolls, every hour, row
|
|
1770
|
+
and column shows, a week of the month, a timeline row, an agenda day and an appointment are not split between
|
|
1771
|
+
pages, the colours are kept (`print-color-adjust: exact`), the bar and the now line are left out. `print()` prints
|
|
1772
|
+
this scheduler alone (`data-mx-print-one` on the page while the dialog is open).
|
|
1773
|
+
- Units `resize-grip` (`active`; turned down the side of a bar), `swipe-edge` (`ready`), `swipe-icon` (`previous`,
|
|
1774
|
+
`ready`); new states: the appointment's `lifted`, `selected`, `print`, the bar's `phone`, the scheduler's `print`.
|
|
1775
|
+
Plain tokens `touch-target`, `touch-lane-size`, `phone-ruler-width`, `phone-column-min-width`,
|
|
1776
|
+
`phone-timeline-resource-width`, `phone-bar-size`, `swipe-inset`, `grip-ring`, `grip-ring-mix`. Places
|
|
1777
|
+
`today-icon-button`, `view-menu-button`, `tooltip-sheet`, `form-sheet`.
|
|
1778
|
+
- Docs pages `/scheduler/mobile` (presentations, a phone-sized frame, a finger) and `/scheduler/icalendar` (export,
|
|
1779
|
+
import, print); `e2e/checks/66-scheduler-mobile.mjs`, `67-scheduler-icalendar.mjs`.
|
|
1780
|
+
- **Memory:** a `Button` disposes its `dropDown` content with itself. Until its popup first opened the content was in
|
|
1781
|
+
no tree, so nothing disposed it: the scheduler's date calendar kept the whole scheduler (its model, every
|
|
1782
|
+
appointment) after the page was left, 13–18 MB a visit on the big-data page. A sweep of every docs page now finds
|
|
1783
|
+
no growth over 0.5 MB a visit.
|
|
1784
|
+
|
|
1785
|
+
### Design languages, step 1: what lets a language change everything
|
|
1786
|
+
|
|
1787
|
+
The owner's rule: any design system, or a new version of one, is added as files only and looks like its source
|
|
1788
|
+
(roadmap/27-design-languages.md; WinUI 3 and Material 3 references and an audit of every component next to it).
|
|
1789
|
+
|
|
1790
|
+
- Glyphs are names: `core/glyphs.ts` returns `span.mx-glyph[data-icon]` (the same helpers), drawn by CSS as a mask
|
|
1791
|
+
of `--mx-icon-<name>` in the text colour. The kit's set is `tokens/icons/kit.icons.json`; a language brings its own
|
|
1792
|
+
in `tokens/icons/<language>.icons.json`, built by `scripts/build-icons.mjs` (part of `npm run tokens`) into
|
|
1793
|
+
`src/generated/icons.css`. The datagrid's drag handle uses the set too (`dragDots`).
|
|
1794
|
+
- `core/press-origin.ts`: a part with `data-mx-press` gets `data-pressed` and `--_press-x` / `--_press-y` while it
|
|
1795
|
+
is pressed (keys press from its middle), for a language's state layer or ripple.
|
|
1796
|
+
- `core/look-watch.ts` `onLookChanged`: a design language, theme or density changed anywhere. Toolbar (its overflow),
|
|
1797
|
+
the option lists, TreeView, TextArea and DataGrid's action widths measure again; a toolbar switched to Material at
|
|
1798
|
+
run time now moves what does not fit into its menu.
|
|
1799
|
+
- DataGrid's per-column rules (hidden columns, alignment, sticky offsets and edges) are in `@layer mx.components`,
|
|
1800
|
+
so a language's stylesheet can change their look.
|
|
1801
|
+
- stylelint: the files of a component made ready for any language take no literal length (`LOSSLESS` in
|
|
1802
|
+
`stylelint.config.mjs`). AGENTS.md: the rules (state tokens, anatomy, icons, measurements, a language's files).
|
|
1803
|
+
- `e2e/language-diff.mjs`: from a fingerprint, how much of each component is the same in every language.
|