@semantic-components/ui-lab 0.63.0 → 0.65.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/fesm2022/semantic-components-ui-lab.mjs +36276 -0
- package/fesm2022/semantic-components-ui-lab.mjs.map +1 -0
- package/package.json +17 -3
- package/types/semantic-components-ui-lab.d.ts +7454 -0
- package/eslint.config.mjs +0 -39
- package/ng-package.json +0 -7
- package/project.json +0 -28
- package/src/index.ts +0 -2
- package/src/lib/components/accordion/README.md +0 -269
- package/src/lib/components/accordion/TODO.md +0 -58
- package/src/lib/components/accordion/accordion-content.ts +0 -31
- package/src/lib/components/accordion/accordion-header.ts +0 -15
- package/src/lib/components/accordion/accordion-item.ts +0 -17
- package/src/lib/components/accordion/accordion-panel.ts +0 -42
- package/src/lib/components/accordion/accordion-trigger-icon.ts +0 -27
- package/src/lib/components/accordion/accordion-trigger.ts +0 -46
- package/src/lib/components/accordion/accordion.ts +0 -35
- package/src/lib/components/accordion/index.ts +0 -7
- package/src/lib/components/alert/README.md +0 -117
- package/src/lib/components/alert/alert-action.ts +0 -17
- package/src/lib/components/alert/alert-description.ts +0 -20
- package/src/lib/components/alert/alert-title.ts +0 -20
- package/src/lib/components/alert/alert.ts +0 -39
- package/src/lib/components/alert/index.ts +0 -4
- package/src/lib/components/alert-dialog/ARCHITECTURE.md +0 -808
- package/src/lib/components/alert-dialog/README.md +0 -215
- package/src/lib/components/alert-dialog/alert-dialog-action.ts +0 -32
- package/src/lib/components/alert-dialog/alert-dialog-cancel.ts +0 -32
- package/src/lib/components/alert-dialog/alert-dialog-description.ts +0 -24
- package/src/lib/components/alert-dialog/alert-dialog-footer.ts +0 -21
- package/src/lib/components/alert-dialog/alert-dialog-header.ts +0 -23
- package/src/lib/components/alert-dialog/alert-dialog-media.ts +0 -22
- package/src/lib/components/alert-dialog/alert-dialog-portal.ts +0 -8
- package/src/lib/components/alert-dialog/alert-dialog-provider.ts +0 -135
- package/src/lib/components/alert-dialog/alert-dialog-title.ts +0 -20
- package/src/lib/components/alert-dialog/alert-dialog-trigger.ts +0 -25
- package/src/lib/components/alert-dialog/alert-dialog.ts +0 -77
- package/src/lib/components/alert-dialog/index.ts +0 -11
- package/src/lib/components/animated-counter/README.md +0 -102
- package/src/lib/components/animated-counter/animated-counter-types.ts +0 -23
- package/src/lib/components/animated-counter/animated-counter.ts +0 -143
- package/src/lib/components/animated-counter/index.ts +0 -6
- package/src/lib/components/aspect-ratio/README.md +0 -97
- package/src/lib/components/aspect-ratio/aspect-ratio.ts +0 -19
- package/src/lib/components/aspect-ratio/index.ts +0 -1
- package/src/lib/components/audio-player/README.md +0 -252
- package/src/lib/components/audio-player/audio-player-audio.ts +0 -32
- package/src/lib/components/audio-player/audio-player-cover.ts +0 -39
- package/src/lib/components/audio-player/audio-player-info.ts +0 -40
- package/src/lib/components/audio-player/audio-player-next.ts +0 -40
- package/src/lib/components/audio-player/audio-player-play-button.ts +0 -39
- package/src/lib/components/audio-player/audio-player-previous.ts +0 -40
- package/src/lib/components/audio-player/audio-player-progress.ts +0 -77
- package/src/lib/components/audio-player/audio-player-repeat.ts +0 -38
- package/src/lib/components/audio-player/audio-player-shuffle.ts +0 -39
- package/src/lib/components/audio-player/audio-player-volume.ts +0 -91
- package/src/lib/components/audio-player/audio-player.ts +0 -246
- package/src/lib/components/audio-player/index.ts +0 -11
- package/src/lib/components/avatar/README.md +0 -117
- package/src/lib/components/avatar/avatar-fallback.ts +0 -25
- package/src/lib/components/avatar/avatar-image.ts +0 -39
- package/src/lib/components/avatar/avatar.ts +0 -25
- package/src/lib/components/avatar/index.ts +0 -3
- package/src/lib/components/avatar-group/README.md +0 -94
- package/src/lib/components/avatar-group/avatar-group-types.ts +0 -9
- package/src/lib/components/avatar-group/avatar-group.ts +0 -181
- package/src/lib/components/avatar-group/index.ts +0 -2
- package/src/lib/components/backdrop/backdrop.ts +0 -75
- package/src/lib/components/backdrop/index.ts +0 -1
- package/src/lib/components/badge/README.md +0 -66
- package/src/lib/components/badge/badge.ts +0 -43
- package/src/lib/components/badge/index.ts +0 -1
- package/src/lib/components/barcode-scanner/README.md +0 -144
- package/src/lib/components/barcode-scanner/barcode-scanner-simple.ts +0 -36
- package/src/lib/components/barcode-scanner/barcode-scanner.ts +0 -460
- package/src/lib/components/barcode-scanner/index.ts +0 -3
- package/src/lib/components/breadcrumb/README.md +0 -80
- package/src/lib/components/breadcrumb/breadcrumb-ellipsis.ts +0 -46
- package/src/lib/components/breadcrumb/breadcrumb-item.ts +0 -17
- package/src/lib/components/breadcrumb/breadcrumb-link.ts +0 -17
- package/src/lib/components/breadcrumb/breadcrumb-list.ts +0 -20
- package/src/lib/components/breadcrumb/breadcrumb-page.ts +0 -20
- package/src/lib/components/breadcrumb/breadcrumb-separator.ts +0 -45
- package/src/lib/components/breadcrumb/breadcrumb.ts +0 -10
- package/src/lib/components/breadcrumb/index.ts +0 -7
- package/src/lib/components/button-group/button-group-separator.ts +0 -26
- package/src/lib/components/button-group/button-group-text.ts +0 -20
- package/src/lib/components/button-group/button-group.ts +0 -43
- package/src/lib/components/button-group/index.ts +0 -10
- package/src/lib/components/calendar/CALENDAR-VIEWS.md +0 -443
- package/src/lib/components/calendar/README.md +0 -227
- package/src/lib/components/calendar/calendar-day-view.ts +0 -310
- package/src/lib/components/calendar/calendar-header.ts +0 -58
- package/src/lib/components/calendar/calendar-month-view.ts +0 -176
- package/src/lib/components/calendar/calendar-year-view.ts +0 -167
- package/src/lib/components/calendar/calendar.ts +0 -273
- package/src/lib/components/calendar/index.ts +0 -1
- package/src/lib/components/card/README.md +0 -86
- package/src/lib/components/card/card-content.ts +0 -15
- package/src/lib/components/card/card-description.ts +0 -17
- package/src/lib/components/card/card-footer.ts +0 -17
- package/src/lib/components/card/card-header.ts +0 -17
- package/src/lib/components/card/card-title.ts +0 -17
- package/src/lib/components/card/card.ts +0 -20
- package/src/lib/components/card/index.ts +0 -6
- package/src/lib/components/chart/README.md +0 -220
- package/src/lib/components/chart/bar-chart.ts +0 -186
- package/src/lib/components/chart/chart-container.ts +0 -33
- package/src/lib/components/chart/chart-legend.ts +0 -42
- package/src/lib/components/chart/chart-tooltip.ts +0 -42
- package/src/lib/components/chart/chart-types.ts +0 -21
- package/src/lib/components/chart/donut-chart.ts +0 -35
- package/src/lib/components/chart/index.ts +0 -9
- package/src/lib/components/chart/line-chart.ts +0 -223
- package/src/lib/components/chart/pie-chart.ts +0 -186
- package/src/lib/components/checkbox/README.md +0 -293
- package/src/lib/components/checkbox/checkbox-field.ts +0 -78
- package/src/lib/components/checkbox/checkbox-indicator.ts +0 -27
- package/src/lib/components/checkbox/checkbox-types.ts +0 -15
- package/src/lib/components/checkbox/checkbox.ts +0 -74
- package/src/lib/components/checkbox/index.ts +0 -5
- package/src/lib/components/checkbox/visual-checkbox.ts +0 -47
- package/src/lib/components/collapsible/README.md +0 -191
- package/src/lib/components/collapsible/collapsible-content.ts +0 -28
- package/src/lib/components/collapsible/collapsible-panel.ts +0 -42
- package/src/lib/components/collapsible/collapsible-trigger.ts +0 -48
- package/src/lib/components/collapsible/collapsible.ts +0 -33
- package/src/lib/components/collapsible/index.ts +0 -4
- package/src/lib/components/color-picker/README.md +0 -218
- package/src/lib/components/color-picker/color-picker-area.ts +0 -107
- package/src/lib/components/color-picker/color-picker-eyedropper.ts +0 -76
- package/src/lib/components/color-picker/color-picker-hue.ts +0 -92
- package/src/lib/components/color-picker/color-picker-input.ts +0 -70
- package/src/lib/components/color-picker/color-picker-preview.ts +0 -21
- package/src/lib/components/color-picker/color-picker-swatches.ts +0 -60
- package/src/lib/components/color-picker/color-picker.ts +0 -227
- package/src/lib/components/color-picker/index.ts +0 -8
- package/src/lib/components/combobox/README.md +0 -166
- package/src/lib/components/combobox/combobox-empty.ts +0 -17
- package/src/lib/components/combobox/combobox-icon.ts +0 -20
- package/src/lib/components/combobox/combobox-input.ts +0 -32
- package/src/lib/components/combobox/combobox-item-indicator.ts +0 -20
- package/src/lib/components/combobox/combobox-item.ts +0 -49
- package/src/lib/components/combobox/combobox-list.ts +0 -40
- package/src/lib/components/combobox/combobox-portal.ts +0 -111
- package/src/lib/components/combobox/combobox-trigger.ts +0 -20
- package/src/lib/components/combobox/combobox.ts +0 -42
- package/src/lib/components/combobox/index.ts +0 -9
- package/src/lib/components/command/README.md +0 -161
- package/src/lib/components/command/command-empty.ts +0 -17
- package/src/lib/components/command/command-group-heading.ts +0 -20
- package/src/lib/components/command/command-group.ts +0 -23
- package/src/lib/components/command/command-input.ts +0 -67
- package/src/lib/components/command/command-item.ts +0 -61
- package/src/lib/components/command/command-list.ts +0 -19
- package/src/lib/components/command/command-separator.ts +0 -18
- package/src/lib/components/command/command-shortcut.ts +0 -20
- package/src/lib/components/command/command.ts +0 -35
- package/src/lib/components/command/index.ts +0 -9
- package/src/lib/components/confetti/README.md +0 -103
- package/src/lib/components/confetti/confetti-types.ts +0 -47
- package/src/lib/components/confetti/confetti.ts +0 -220
- package/src/lib/components/confetti/index.ts +0 -7
- package/src/lib/components/context-menu/README.md +0 -149
- package/src/lib/components/context-menu/context-menu-content.ts +0 -46
- package/src/lib/components/context-menu/context-menu-item.ts +0 -44
- package/src/lib/components/context-menu/context-menu-label.ts +0 -22
- package/src/lib/components/context-menu/context-menu-separator.ts +0 -18
- package/src/lib/components/context-menu/context-menu-shortcut.ts +0 -20
- package/src/lib/components/context-menu/context-menu-sub-content.ts +0 -83
- package/src/lib/components/context-menu/context-menu-sub-trigger.ts +0 -91
- package/src/lib/components/context-menu/context-menu-sub.ts +0 -38
- package/src/lib/components/context-menu/context-menu-trigger.ts +0 -40
- package/src/lib/components/context-menu/context-menu.ts +0 -106
- package/src/lib/components/context-menu/index.ts +0 -10
- package/src/lib/components/copy-button/README.md +0 -211
- package/src/lib/components/copy-button/copy-button-with-text.ts +0 -53
- package/src/lib/components/copy-button/copy-button.ts +0 -137
- package/src/lib/components/copy-button/copy-code.ts +0 -42
- package/src/lib/components/copy-button/copy-input.ts +0 -54
- package/src/lib/components/copy-button/index.ts +0 -4
- package/src/lib/components/countdown/README.md +0 -168
- package/src/lib/components/countdown/countdown-simple.ts +0 -118
- package/src/lib/components/countdown/countdown.ts +0 -235
- package/src/lib/components/countdown/index.ts +0 -3
- package/src/lib/components/data-table/README.md +0 -330
- package/src/lib/components/data-table/data-table-body.ts +0 -28
- package/src/lib/components/data-table/data-table-cell.ts +0 -20
- package/src/lib/components/data-table/data-table-column-toggle.ts +0 -96
- package/src/lib/components/data-table/data-table-filter.ts +0 -45
- package/src/lib/components/data-table/data-table-head.ts +0 -96
- package/src/lib/components/data-table/data-table-header.ts +0 -28
- package/src/lib/components/data-table/data-table-pagination.ts +0 -152
- package/src/lib/components/data-table/data-table-row.ts +0 -23
- package/src/lib/components/data-table/data-table.ts +0 -181
- package/src/lib/components/data-table/index.ts +0 -15
- package/src/lib/components/date-picker/README.md +0 -101
- package/src/lib/components/date-picker/date-picker.ts +0 -175
- package/src/lib/components/date-picker/index.ts +0 -1
- package/src/lib/components/date-range-picker/README.md +0 -148
- package/src/lib/components/date-range-picker/date-range-picker.ts +0 -348
- package/src/lib/components/date-range-picker/index.ts +0 -3
- package/src/lib/components/dialog/ARCHITECTURE.md +0 -792
- package/src/lib/components/dialog/README.md +0 -208
- package/src/lib/components/dialog/dialog-close.ts +0 -33
- package/src/lib/components/dialog/dialog-description.ts +0 -23
- package/src/lib/components/dialog/dialog-footer.ts +0 -20
- package/src/lib/components/dialog/dialog-header.ts +0 -17
- package/src/lib/components/dialog/dialog-portal.ts +0 -8
- package/src/lib/components/dialog/dialog-provider.ts +0 -175
- package/src/lib/components/dialog/dialog-title.ts +0 -20
- package/src/lib/components/dialog/dialog-trigger.ts +0 -25
- package/src/lib/components/dialog/dialog.ts +0 -79
- package/src/lib/components/dialog/index.ts +0 -9
- package/src/lib/components/diff-viewer/README.md +0 -172
- package/src/lib/components/diff-viewer/diff-algorithm.ts +0 -337
- package/src/lib/components/diff-viewer/diff-viewer.ts +0 -369
- package/src/lib/components/diff-viewer/index.ts +0 -8
- package/src/lib/components/dock/README.md +0 -204
- package/src/lib/components/dock/dock-badge.ts +0 -36
- package/src/lib/components/dock/dock-item.ts +0 -76
- package/src/lib/components/dock/dock-items.ts +0 -31
- package/src/lib/components/dock/dock-types.ts +0 -25
- package/src/lib/components/dock/dock.ts +0 -101
- package/src/lib/components/dock/index.ts +0 -11
- package/src/lib/components/drawer/ARCHITECTURE.md +0 -972
- package/src/lib/components/drawer/README.md +0 -205
- package/src/lib/components/drawer/drawer-close.ts +0 -18
- package/src/lib/components/drawer/drawer-description.ts +0 -17
- package/src/lib/components/drawer/drawer-footer.ts +0 -17
- package/src/lib/components/drawer/drawer-handle.ts +0 -17
- package/src/lib/components/drawer/drawer-header.ts +0 -17
- package/src/lib/components/drawer/drawer-portal.ts +0 -8
- package/src/lib/components/drawer/drawer-provider.ts +0 -142
- package/src/lib/components/drawer/drawer-title.ts +0 -17
- package/src/lib/components/drawer/drawer-trigger.ts +0 -24
- package/src/lib/components/drawer/drawer.ts +0 -77
- package/src/lib/components/drawer/index.ts +0 -11
- package/src/lib/components/emoji-picker/README.md +0 -151
- package/src/lib/components/emoji-picker/emoji-picker-trigger.ts +0 -48
- package/src/lib/components/emoji-picker/emoji-picker.ts +0 -666
- package/src/lib/components/emoji-picker/index.ts +0 -3
- package/src/lib/components/empty/README.md +0 -72
- package/src/lib/components/empty/empty-content.ts +0 -20
- package/src/lib/components/empty/empty-description.ts +0 -20
- package/src/lib/components/empty/empty-header.ts +0 -17
- package/src/lib/components/empty/empty-media.ts +0 -29
- package/src/lib/components/empty/empty-title.ts +0 -17
- package/src/lib/components/empty/empty.ts +0 -20
- package/src/lib/components/empty/index.ts +0 -6
- package/src/lib/components/field/README.md +0 -326
- package/src/lib/components/field/field-content.ts +0 -20
- package/src/lib/components/field/field-description.ts +0 -22
- package/src/lib/components/field/field-error.ts +0 -18
- package/src/lib/components/field/field-group.ts +0 -20
- package/src/lib/components/field/field-legend.ts +0 -24
- package/src/lib/components/field/field-separator.ts +0 -20
- package/src/lib/components/field/field-set.ts +0 -20
- package/src/lib/components/field/field-title.ts +0 -20
- package/src/lib/components/field/field.ts +0 -89
- package/src/lib/components/field/index.ts +0 -9
- package/src/lib/components/file-upload/README.md +0 -256
- package/src/lib/components/file-upload/file-upload-dropzone.ts +0 -100
- package/src/lib/components/file-upload/file-upload-item-delete.ts +0 -59
- package/src/lib/components/file-upload/file-upload-item-name.ts +0 -17
- package/src/lib/components/file-upload/file-upload-item-preview.ts +0 -52
- package/src/lib/components/file-upload/file-upload-item-progress.ts +0 -33
- package/src/lib/components/file-upload/file-upload-item-size.ts +0 -39
- package/src/lib/components/file-upload/file-upload-item.ts +0 -35
- package/src/lib/components/file-upload/file-upload-list.ts +0 -17
- package/src/lib/components/file-upload/file-upload-trigger.ts +0 -70
- package/src/lib/components/file-upload/file-upload.ts +0 -156
- package/src/lib/components/file-upload/index.ts +0 -11
- package/src/lib/components/hover-card/ARCHITECTURE.md +0 -341
- package/src/lib/components/hover-card/README.md +0 -118
- package/src/lib/components/hover-card/hover-card-portal.ts +0 -142
- package/src/lib/components/hover-card/hover-card-provider.ts +0 -85
- package/src/lib/components/hover-card/hover-card-trigger.ts +0 -75
- package/src/lib/components/hover-card/hover-card.ts +0 -97
- package/src/lib/components/hover-card/index.ts +0 -5
- package/src/lib/components/image-annotator/README.md +0 -132
- package/src/lib/components/image-annotator/image-annotator-types.ts +0 -29
- package/src/lib/components/image-annotator/image-annotator.ts +0 -549
- package/src/lib/components/image-annotator/index.ts +0 -7
- package/src/lib/components/image-compare/README.md +0 -239
- package/src/lib/components/image-compare/image-compare-after.ts +0 -39
- package/src/lib/components/image-compare/image-compare-before.ts +0 -30
- package/src/lib/components/image-compare/image-compare-container.ts +0 -119
- package/src/lib/components/image-compare/image-compare-label.ts +0 -34
- package/src/lib/components/image-compare/image-compare-slider.ts +0 -103
- package/src/lib/components/image-compare/image-compare.ts +0 -79
- package/src/lib/components/image-compare/index.ts +0 -10
- package/src/lib/components/image-cropper/README.md +0 -322
- package/src/lib/components/image-cropper/image-cropper-aspect-ratio.ts +0 -65
- package/src/lib/components/image-cropper/image-cropper-container.ts +0 -294
- package/src/lib/components/image-cropper/image-cropper-controls.ts +0 -95
- package/src/lib/components/image-cropper/image-cropper-preview.ts +0 -66
- package/src/lib/components/image-cropper/image-cropper.ts +0 -459
- package/src/lib/components/image-cropper/index.ts +0 -10
- package/src/lib/components/index.ts +0 -106
- package/src/lib/components/infinite-scroll/README.md +0 -134
- package/src/lib/components/infinite-scroll/index.ts +0 -4
- package/src/lib/components/infinite-scroll/infinite-scroll-end.ts +0 -9
- package/src/lib/components/infinite-scroll/infinite-scroll-loader.ts +0 -9
- package/src/lib/components/infinite-scroll/infinite-scroll.ts +0 -199
- package/src/lib/components/infinite-scroll/virtual-scroll.ts +0 -83
- package/src/lib/components/input/README.md +0 -93
- package/src/lib/components/input/index.ts +0 -1
- package/src/lib/components/input/input.ts +0 -41
- package/src/lib/components/input-group/README.md +0 -60
- package/src/lib/components/input-group/index.ts +0 -6
- package/src/lib/components/input-group/input-group-addon.ts +0 -46
- package/src/lib/components/input-group/input-group-button.ts +0 -49
- package/src/lib/components/input-group/input-group-input.ts +0 -20
- package/src/lib/components/input-group/input-group-text.ts +0 -20
- package/src/lib/components/input-group/input-group-textarea.ts +0 -20
- package/src/lib/components/input-group/input-group.ts +0 -21
- package/src/lib/components/kanban-board/README.md +0 -238
- package/src/lib/components/kanban-board/index.ts +0 -12
- package/src/lib/components/kanban-board/kanban-board.ts +0 -281
- package/src/lib/components/kanban-board/kanban-card.ts +0 -241
- package/src/lib/components/kanban-board/kanban-column.ts +0 -371
- package/src/lib/components/kanban-board/kanban-types.ts +0 -52
- package/src/lib/components/kbd/README.md +0 -58
- package/src/lib/components/kbd/index.ts +0 -2
- package/src/lib/components/kbd/kbd-group.ts +0 -17
- package/src/lib/components/kbd/kbd.ts +0 -20
- package/src/lib/components/label/README.md +0 -90
- package/src/lib/components/label/index.ts +0 -1
- package/src/lib/components/label/label.ts +0 -32
- package/src/lib/components/language-switcher/index.ts +0 -4
- package/src/lib/components/language-switcher/language-button.ts +0 -98
- package/src/lib/components/language-switcher/language-select.ts +0 -65
- package/src/lib/components/language-switcher/language-toggle.ts +0 -98
- package/src/lib/components/language-switcher/language.service.ts +0 -239
- package/src/lib/components/language-switcher/styles.ts +0 -16
- package/src/lib/components/lightbox/README.md +0 -387
- package/src/lib/components/lightbox/index.ts +0 -9
- package/src/lib/components/lightbox/lightbox-container.ts +0 -338
- package/src/lib/components/lightbox/lightbox-gallery.ts +0 -81
- package/src/lib/components/lightbox/lightbox-trigger.ts +0 -19
- package/src/lib/components/lightbox/lightbox.ts +0 -210
- package/src/lib/components/lightbox/lightbox.types.ts +0 -7
- package/src/lib/components/marquee/README.md +0 -183
- package/src/lib/components/marquee/auto-marquee.ts +0 -73
- package/src/lib/components/marquee/index.ts +0 -6
- package/src/lib/components/marquee/marquee-clone.ts +0 -17
- package/src/lib/components/marquee/marquee-fade.ts +0 -53
- package/src/lib/components/marquee/marquee-item.ts +0 -17
- package/src/lib/components/marquee/marquee-text.ts +0 -80
- package/src/lib/components/marquee/marquee.ts +0 -96
- package/src/lib/components/masonry-grid/README.md +0 -204
- package/src/lib/components/masonry-grid/index.ts +0 -4
- package/src/lib/components/masonry-grid/masonry-grid.ts +0 -178
- package/src/lib/components/masonry-grid/masonry-item.ts +0 -66
- package/src/lib/components/masonry-grid/masonry-types.ts +0 -24
- package/src/lib/components/mention-input/README.md +0 -122
- package/src/lib/components/mention-input/index.ts +0 -2
- package/src/lib/components/mention-input/mention-input.ts +0 -279
- package/src/lib/components/menu/README.md +0 -176
- package/src/lib/components/menu/index.ts +0 -11
- package/src/lib/components/menu/menu-item.ts +0 -32
- package/src/lib/components/menu/menu-portal.ts +0 -53
- package/src/lib/components/menu/menu-provider.ts +0 -50
- package/src/lib/components/menu/menu-separator.ts +0 -19
- package/src/lib/components/menu/menu-sub-icon.ts +0 -18
- package/src/lib/components/menu/menu-sub-portal.ts +0 -53
- package/src/lib/components/menu/menu-sub-provider.ts +0 -52
- package/src/lib/components/menu/menu-sub-trigger.ts +0 -34
- package/src/lib/components/menu/menu-sub.ts +0 -41
- package/src/lib/components/menu/menu-trigger.ts +0 -27
- package/src/lib/components/menu/menu.ts +0 -41
- package/src/lib/components/multi-select/README.md +0 -155
- package/src/lib/components/multi-select/index.ts +0 -2
- package/src/lib/components/multi-select/multi-select.ts +0 -394
- package/src/lib/components/native-checkbox/README.md +0 -113
- package/src/lib/components/native-checkbox/index.ts +0 -1
- package/src/lib/components/native-checkbox/native-checkbox.ts +0 -116
- package/src/lib/components/navbar/ARCHITECTURE.md +0 -605
- package/src/lib/components/navbar/README.md +0 -246
- package/src/lib/components/navbar/index.ts +0 -9
- package/src/lib/components/navbar/navbar-actions.ts +0 -28
- package/src/lib/components/navbar/navbar-brand.ts +0 -24
- package/src/lib/components/navbar/navbar-group.ts +0 -28
- package/src/lib/components/navbar/navbar-mobile-link.ts +0 -28
- package/src/lib/components/navbar/navbar-mobile-menu.ts +0 -71
- package/src/lib/components/navbar/navbar-mobile-portal.ts +0 -118
- package/src/lib/components/navbar/navbar-mobile-trigger.ts +0 -51
- package/src/lib/components/navbar/navbar-provider.ts +0 -85
- package/src/lib/components/navbar/navbar.ts +0 -40
- package/src/lib/components/navigation-menu/README.md +0 -135
- package/src/lib/components/navigation-menu/index.ts +0 -8
- package/src/lib/components/navigation-menu/navigation-menu-content.ts +0 -80
- package/src/lib/components/navigation-menu/navigation-menu-indicator.ts +0 -35
- package/src/lib/components/navigation-menu/navigation-menu-item.ts +0 -88
- package/src/lib/components/navigation-menu/navigation-menu-link.ts +0 -29
- package/src/lib/components/navigation-menu/navigation-menu-list.ts +0 -20
- package/src/lib/components/navigation-menu/navigation-menu-trigger.ts +0 -52
- package/src/lib/components/navigation-menu/navigation-menu-viewport.ts +0 -35
- package/src/lib/components/navigation-menu/navigation-menu.ts +0 -39
- package/src/lib/components/notification-center/README.md +0 -365
- package/src/lib/components/notification-center/index.ts +0 -20
- package/src/lib/components/notification-center/notification-center-container.ts +0 -226
- package/src/lib/components/notification-center/notification-center.ts +0 -157
- package/src/lib/components/notification-center/notification-group.ts +0 -198
- package/src/lib/components/notification-center/notification-item.ts +0 -214
- package/src/lib/components/notification-center/notification-types.ts +0 -52
- package/src/lib/components/number-field/README.md +0 -369
- package/src/lib/components/number-field/index.ts +0 -6
- package/src/lib/components/number-field/number-field-decrement.ts +0 -57
- package/src/lib/components/number-field/number-field-increment.ts +0 -58
- package/src/lib/components/number-field/number-field-input-group.ts +0 -37
- package/src/lib/components/number-field/number-field-input.ts +0 -87
- package/src/lib/components/number-field/number-field-scrub-area.ts +0 -74
- package/src/lib/components/number-field/number-field.ts +0 -143
- package/src/lib/components/opt-field/index.ts +0 -7
- package/src/lib/components/opt-field/opt-field-separator.ts +0 -18
- package/src/lib/components/opt-field/opt-field-slot-caret.ts +0 -31
- package/src/lib/components/opt-field/opt-field-slot-char.ts +0 -19
- package/src/lib/components/opt-field/opt-field-slot-group.ts +0 -17
- package/src/lib/components/opt-field/opt-field-slot-input.ts +0 -60
- package/src/lib/components/opt-field/opt-field-slot.ts +0 -111
- package/src/lib/components/opt-field/opt-field.ts +0 -113
- package/src/lib/components/org-chart/README.md +0 -265
- package/src/lib/components/org-chart/index.ts +0 -8
- package/src/lib/components/org-chart/org-chart-node.ts +0 -253
- package/src/lib/components/org-chart/org-chart-types.ts +0 -22
- package/src/lib/components/org-chart/org-chart.ts +0 -67
- package/src/lib/components/pagination/ACCESSIBILITY_REVIEW.md +0 -530
- package/src/lib/components/pagination/KEYBOARD-NAVIGATION.md +0 -356
- package/src/lib/components/pagination/README.md +0 -359
- package/src/lib/components/pagination/REVIEW_SUMMARY.md +0 -55
- package/src/lib/components/pagination/SMART-PAGINATION.md +0 -345
- package/src/lib/components/pagination/index.ts +0 -11
- package/src/lib/components/pagination/pagination-ellipsis.ts +0 -32
- package/src/lib/components/pagination/pagination-first.ts +0 -75
- package/src/lib/components/pagination/pagination-item.ts +0 -15
- package/src/lib/components/pagination/pagination-last.ts +0 -77
- package/src/lib/components/pagination/pagination-link.ts +0 -70
- package/src/lib/components/pagination/pagination-list.ts +0 -17
- package/src/lib/components/pagination/pagination-next.ts +0 -78
- package/src/lib/components/pagination/pagination-page-size-select.ts +0 -44
- package/src/lib/components/pagination/pagination-previous.ts +0 -78
- package/src/lib/components/pagination/pagination.ts +0 -190
- package/src/lib/components/password-field/README.md +0 -247
- package/src/lib/components/password-field/index.ts +0 -7
- package/src/lib/components/password-field/password-field-input-group.ts +0 -32
- package/src/lib/components/password-field/password-field-input.ts +0 -55
- package/src/lib/components/password-field/password-field-requirements.ts +0 -90
- package/src/lib/components/password-field/password-field-strength-bar.ts +0 -64
- package/src/lib/components/password-field/password-field-strength.ts +0 -91
- package/src/lib/components/password-field/password-field-toggle.ts +0 -86
- package/src/lib/components/password-field/password-field.ts +0 -95
- package/src/lib/components/pdf-viewer/README.md +0 -221
- package/src/lib/components/pdf-viewer/index.ts +0 -47
- package/src/lib/components/pdf-viewer/pdf-viewer-container.ts +0 -54
- package/src/lib/components/pdf-viewer/pdf-viewer-content.ts +0 -60
- package/src/lib/components/pdf-viewer/pdf-viewer-download.ts +0 -34
- package/src/lib/components/pdf-viewer/pdf-viewer-empty.ts +0 -62
- package/src/lib/components/pdf-viewer/pdf-viewer-error.ts +0 -73
- package/src/lib/components/pdf-viewer/pdf-viewer-fullscreen.ts +0 -36
- package/src/lib/components/pdf-viewer/pdf-viewer-loading.ts +0 -44
- package/src/lib/components/pdf-viewer/pdf-viewer-nav.ts +0 -30
- package/src/lib/components/pdf-viewer/pdf-viewer-next-page.ts +0 -38
- package/src/lib/components/pdf-viewer/pdf-viewer-page-info.ts +0 -53
- package/src/lib/components/pdf-viewer/pdf-viewer-prev-page.ts +0 -38
- package/src/lib/components/pdf-viewer/pdf-viewer-print.ts +0 -34
- package/src/lib/components/pdf-viewer/pdf-viewer-retry.ts +0 -36
- package/src/lib/components/pdf-viewer/pdf-viewer-root.ts +0 -239
- package/src/lib/components/pdf-viewer/pdf-viewer-rotate-left.ts +0 -34
- package/src/lib/components/pdf-viewer/pdf-viewer-rotate-right.ts +0 -34
- package/src/lib/components/pdf-viewer/pdf-viewer-separator.ts +0 -28
- package/src/lib/components/pdf-viewer/pdf-viewer-spacer.ts +0 -24
- package/src/lib/components/pdf-viewer/pdf-viewer-toolbar-base.ts +0 -34
- package/src/lib/components/pdf-viewer/pdf-viewer-toolbar.ts +0 -391
- package/src/lib/components/pdf-viewer/pdf-viewer-types.ts +0 -52
- package/src/lib/components/pdf-viewer/pdf-viewer-zoom-in.ts +0 -37
- package/src/lib/components/pdf-viewer/pdf-viewer-zoom-out.ts +0 -37
- package/src/lib/components/pdf-viewer/pdf-viewer-zoom-select.ts +0 -61
- package/src/lib/components/pdf-viewer/pdf-viewer-zoom.ts +0 -30
- package/src/lib/components/pdf-viewer/pdf-viewer.ts +0 -417
- package/src/lib/components/phone-input/README.md +0 -173
- package/src/lib/components/phone-input/countries.ts +0 -69
- package/src/lib/components/phone-input/index.ts +0 -4
- package/src/lib/components/phone-input/phone-input-simple.ts +0 -141
- package/src/lib/components/phone-input/phone-input.ts +0 -304
- package/src/lib/components/popover/ARCHITECTURE.md +0 -569
- package/src/lib/components/popover/README.md +0 -247
- package/src/lib/components/popover/index.ts +0 -6
- package/src/lib/components/popover/popover-close.ts +0 -29
- package/src/lib/components/popover/popover-portal.ts +0 -161
- package/src/lib/components/popover/popover-provider.ts +0 -82
- package/src/lib/components/popover/popover-trigger.ts +0 -27
- package/src/lib/components/popover/popover.ts +0 -66
- package/src/lib/components/progress/README.md +0 -75
- package/src/lib/components/progress/index.ts +0 -1
- package/src/lib/components/progress/progress.ts +0 -62
- package/src/lib/components/qr-code/README.md +0 -124
- package/src/lib/components/qr-code/index.ts +0 -3
- package/src/lib/components/qr-code/qr-code-download.ts +0 -105
- package/src/lib/components/qr-code/qr-code.ts +0 -121
- package/src/lib/components/qr-code/qr-generator.ts +0 -479
- package/src/lib/components/radio-group/README.md +0 -273
- package/src/lib/components/radio-group/index.ts +0 -3
- package/src/lib/components/radio-group/radio-field.ts +0 -43
- package/src/lib/components/radio-group/radio-group.ts +0 -18
- package/src/lib/components/radio-group/radio.ts +0 -30
- package/src/lib/components/range-slider/README.md +0 -118
- package/src/lib/components/range-slider/index.ts +0 -1
- package/src/lib/components/range-slider/range-slider.ts +0 -304
- package/src/lib/components/rating-field/README.md +0 -150
- package/src/lib/components/rating-field/index.ts +0 -3
- package/src/lib/components/rating-field/rating-field.ts +0 -87
- package/src/lib/components/rating-field/rating-item-group.ts +0 -73
- package/src/lib/components/rating-field/rating-item.ts +0 -89
- package/src/lib/components/resizable/README.md +0 -133
- package/src/lib/components/resizable/index.ts +0 -4
- package/src/lib/components/resizable/resizable-handle.ts +0 -160
- package/src/lib/components/resizable/resizable-panel-group.ts +0 -38
- package/src/lib/components/resizable/resizable-panel.ts +0 -51
- package/src/lib/components/resizable/resizable.types.ts +0 -1
- package/src/lib/components/scroll-area/README.md +0 -76
- package/src/lib/components/scroll-area/index.ts +0 -2
- package/src/lib/components/scroll-area/scroll-area.ts +0 -87
- package/src/lib/components/scroll-area/scroll-bar.ts +0 -207
- package/src/lib/components/search-input/README.md +0 -99
- package/src/lib/components/search-input/index.ts +0 -6
- package/src/lib/components/search-input/search-input-types.ts +0 -21
- package/src/lib/components/search-input/search-input.ts +0 -302
- package/src/lib/components/select/README.md +0 -175
- package/src/lib/components/select/index.ts +0 -9
- package/src/lib/components/select/select-icon.ts +0 -20
- package/src/lib/components/select/select-input.ts +0 -32
- package/src/lib/components/select/select-item-indicator.ts +0 -20
- package/src/lib/components/select/select-item.ts +0 -48
- package/src/lib/components/select/select-list.ts +0 -42
- package/src/lib/components/select/select-portal.ts +0 -48
- package/src/lib/components/select/select-trigger.ts +0 -36
- package/src/lib/components/select/select-value.ts +0 -32
- package/src/lib/components/select/select.ts +0 -57
- package/src/lib/components/separator/README.md +0 -59
- package/src/lib/components/separator/index.ts +0 -1
- package/src/lib/components/separator/separator.ts +0 -29
- package/src/lib/components/sheet/ARCHITECTURE.md +0 -915
- package/src/lib/components/sheet/README.md +0 -248
- package/src/lib/components/sheet/index.ts +0 -10
- package/src/lib/components/sheet/sheet-close.ts +0 -32
- package/src/lib/components/sheet/sheet-description.ts +0 -20
- package/src/lib/components/sheet/sheet-footer.ts +0 -20
- package/src/lib/components/sheet/sheet-header.ts +0 -17
- package/src/lib/components/sheet/sheet-portal.ts +0 -8
- package/src/lib/components/sheet/sheet-provider.ts +0 -142
- package/src/lib/components/sheet/sheet-title.ts +0 -20
- package/src/lib/components/sheet/sheet-trigger.ts +0 -24
- package/src/lib/components/sheet/sheet.ts +0 -92
- package/src/lib/components/sidebar/README.md +0 -254
- package/src/lib/components/sidebar/index.ts +0 -24
- package/src/lib/components/sidebar/sidebar-content.ts +0 -20
- package/src/lib/components/sidebar/sidebar-footer.ts +0 -17
- package/src/lib/components/sidebar/sidebar-group-action.ts +0 -24
- package/src/lib/components/sidebar/sidebar-group-content.ts +0 -17
- package/src/lib/components/sidebar/sidebar-group-label.ts +0 -23
- package/src/lib/components/sidebar/sidebar-group.ts +0 -17
- package/src/lib/components/sidebar/sidebar-header.ts +0 -17
- package/src/lib/components/sidebar/sidebar-input.ts +0 -20
- package/src/lib/components/sidebar/sidebar-inset.ts +0 -21
- package/src/lib/components/sidebar/sidebar-menu-action.ts +0 -31
- package/src/lib/components/sidebar/sidebar-menu-badge.ts +0 -25
- package/src/lib/components/sidebar/sidebar-menu-button.ts +0 -55
- package/src/lib/components/sidebar/sidebar-menu-item.ts +0 -17
- package/src/lib/components/sidebar/sidebar-menu-skeleton.ts +0 -40
- package/src/lib/components/sidebar/sidebar-menu-sub-button.ts +0 -33
- package/src/lib/components/sidebar/sidebar-menu-sub-item.ts +0 -15
- package/src/lib/components/sidebar/sidebar-menu-sub.ts +0 -21
- package/src/lib/components/sidebar/sidebar-menu.ts +0 -17
- package/src/lib/components/sidebar/sidebar-provider.ts +0 -128
- package/src/lib/components/sidebar/sidebar-rail.ts +0 -39
- package/src/lib/components/sidebar/sidebar-separator.ts +0 -21
- package/src/lib/components/sidebar/sidebar-state.service.ts +0 -33
- package/src/lib/components/sidebar/sidebar-trigger.ts +0 -38
- package/src/lib/components/sidebar/sidebar.ts +0 -120
- package/src/lib/components/signature-pad/README.md +0 -236
- package/src/lib/components/signature-pad/index.ts +0 -8
- package/src/lib/components/signature-pad/signature-pad-canvas.ts +0 -228
- package/src/lib/components/signature-pad/signature-pad-clear-button.ts +0 -48
- package/src/lib/components/signature-pad/signature-pad-color-button.ts +0 -50
- package/src/lib/components/signature-pad/signature-pad-controls.ts +0 -26
- package/src/lib/components/signature-pad/signature-pad-toolbar.ts +0 -25
- package/src/lib/components/signature-pad/signature-pad-undo-button.ts +0 -48
- package/src/lib/components/signature-pad/signature-pad-width-button.ts +0 -50
- package/src/lib/components/signature-pad/signature-pad.ts +0 -97
- package/src/lib/components/skeleton/README.md +0 -80
- package/src/lib/components/skeleton/index.ts +0 -1
- package/src/lib/components/skeleton/skeleton.ts +0 -17
- package/src/lib/components/slider/README.md +0 -106
- package/src/lib/components/slider/index.ts +0 -4
- package/src/lib/components/slider/slider-range.ts +0 -28
- package/src/lib/components/slider/slider-thumb.ts +0 -73
- package/src/lib/components/slider/slider-track.ts +0 -31
- package/src/lib/components/slider/slider.ts +0 -185
- package/src/lib/components/sortable-list/README.md +0 -229
- package/src/lib/components/sortable-list/index.ts +0 -4
- package/src/lib/components/sortable-list/sortable-handle.ts +0 -72
- package/src/lib/components/sortable-list/sortable-item.ts +0 -162
- package/src/lib/components/sortable-list/sortable-list.ts +0 -127
- package/src/lib/components/sortable-list/sortable-overlay.ts +0 -31
- package/src/lib/components/speed-dial/README.md +0 -259
- package/src/lib/components/speed-dial/index.ts +0 -7
- package/src/lib/components/speed-dial/speed-dial-action.ts +0 -99
- package/src/lib/components/speed-dial/speed-dial-types.ts +0 -14
- package/src/lib/components/speed-dial/speed-dial.ts +0 -224
- package/src/lib/components/spinner/README.md +0 -41
- package/src/lib/components/spinner/index.ts +0 -1
- package/src/lib/components/spinner/spinner.ts +0 -20
- package/src/lib/components/split-button/README.md +0 -99
- package/src/lib/components/split-button/index.ts +0 -6
- package/src/lib/components/split-button/split-button-types.ts +0 -14
- package/src/lib/components/split-button/split-button.ts +0 -240
- package/src/lib/components/spotlight/README.md +0 -136
- package/src/lib/components/spotlight/index.ts +0 -5
- package/src/lib/components/spotlight/spotlight-actions.ts +0 -24
- package/src/lib/components/spotlight/spotlight-description.ts +0 -24
- package/src/lib/components/spotlight/spotlight-title.ts +0 -24
- package/src/lib/components/spotlight/spotlight.ts +0 -367
- package/src/lib/components/stat-card/README.md +0 -319
- package/src/lib/components/stat-card/REFACTORING-COMPLETE.md +0 -250
- package/src/lib/components/stat-card/REFACTORING-PLAN.md +0 -471
- package/src/lib/components/stat-card/index.ts +0 -11
- package/src/lib/components/stat-card/stat-card-change.ts +0 -27
- package/src/lib/components/stat-card/stat-card-description.ts +0 -17
- package/src/lib/components/stat-card/stat-card-icon.ts +0 -28
- package/src/lib/components/stat-card/stat-card-label.ts +0 -27
- package/src/lib/components/stat-card/stat-card-types.ts +0 -3
- package/src/lib/components/stat-card/stat-card-value.ts +0 -27
- package/src/lib/components/stat-card/stat-card.ts +0 -34
- package/src/lib/components/stepper/README.md +0 -250
- package/src/lib/components/stepper/index.ts +0 -12
- package/src/lib/components/stepper/stepper-content.ts +0 -25
- package/src/lib/components/stepper/stepper-description.ts +0 -17
- package/src/lib/components/stepper/stepper-item.ts +0 -35
- package/src/lib/components/stepper/stepper-list.ts +0 -26
- package/src/lib/components/stepper/stepper-next.ts +0 -41
- package/src/lib/components/stepper/stepper-previous.ts +0 -42
- package/src/lib/components/stepper/stepper-separator.ts +0 -35
- package/src/lib/components/stepper/stepper-title.ts +0 -17
- package/src/lib/components/stepper/stepper-trigger.ts +0 -67
- package/src/lib/components/stepper/stepper-types.ts +0 -10
- package/src/lib/components/stepper/stepper.ts +0 -46
- package/src/lib/components/switch/README.md +0 -99
- package/src/lib/components/switch/index.ts +0 -1
- package/src/lib/components/switch/switch.ts +0 -56
- package/src/lib/components/table/README.md +0 -105
- package/src/lib/components/table/index.ts +0 -8
- package/src/lib/components/table/table-body.ts +0 -17
- package/src/lib/components/table/table-caption.ts +0 -17
- package/src/lib/components/table/table-cell.ts +0 -17
- package/src/lib/components/table/table-footer.ts +0 -20
- package/src/lib/components/table/table-header-cell.ts +0 -20
- package/src/lib/components/table/table-header.ts +0 -17
- package/src/lib/components/table/table-row.ts +0 -20
- package/src/lib/components/table/table.ts +0 -17
- package/src/lib/components/tabs/README.md +0 -169
- package/src/lib/components/tabs/index.ts +0 -4
- package/src/lib/components/tabs/tab-list.ts +0 -38
- package/src/lib/components/tabs/tab-panel.ts +0 -45
- package/src/lib/components/tabs/tab.ts +0 -45
- package/src/lib/components/tabs/tabs.ts +0 -28
- package/src/lib/components/tag-input/README.md +0 -271
- package/src/lib/components/tag-input/index.ts +0 -5
- package/src/lib/components/tag-input/tag-input-clear.ts +0 -60
- package/src/lib/components/tag-input/tag-input-count.ts +0 -42
- package/src/lib/components/tag-input/tag-input-field.ts +0 -121
- package/src/lib/components/tag-input/tag-input-tag.ts +0 -70
- package/src/lib/components/tag-input/tag-input.ts +0 -118
- package/src/lib/components/textarea/README.md +0 -80
- package/src/lib/components/textarea/index.ts +0 -1
- package/src/lib/components/textarea/textarea.ts +0 -41
- package/src/lib/components/theme-toggle/README.md +0 -258
- package/src/lib/components/theme-toggle/index.ts +0 -4
- package/src/lib/components/theme-toggle/theme-field.ts +0 -40
- package/src/lib/components/theme-toggle/theme-select.ts +0 -56
- package/src/lib/components/theme-toggle/theme-toggle.ts +0 -76
- package/src/lib/components/theme-toggle/theme.service.ts +0 -81
- package/src/lib/components/time-picker/README.md +0 -188
- package/src/lib/components/time-picker/index.ts +0 -5
- package/src/lib/components/time-picker/time-picker-clock.ts +0 -195
- package/src/lib/components/time-picker/time-picker-input.ts +0 -174
- package/src/lib/components/time-picker/time-picker-period.ts +0 -89
- package/src/lib/components/time-picker/time-picker-separator.ts +0 -20
- package/src/lib/components/time-picker/time-picker.ts +0 -87
- package/src/lib/components/timeline/README.md +0 -177
- package/src/lib/components/timeline/index.ts +0 -8
- package/src/lib/components/timeline/timeline-connector.ts +0 -29
- package/src/lib/components/timeline/timeline-content.ts +0 -26
- package/src/lib/components/timeline/timeline-description.ts +0 -17
- package/src/lib/components/timeline/timeline-dot.ts +0 -45
- package/src/lib/components/timeline/timeline-item.ts +0 -28
- package/src/lib/components/timeline/timeline-time.ts +0 -17
- package/src/lib/components/timeline/timeline-title.ts +0 -17
- package/src/lib/components/timeline/timeline.ts +0 -17
- package/src/lib/components/timezone/index.ts +0 -5
- package/src/lib/components/timezone/timezone-badge.ts +0 -85
- package/src/lib/components/timezone/timezone-button.ts +0 -104
- package/src/lib/components/timezone/timezone-display.ts +0 -105
- package/src/lib/components/timezone/timezone-select.ts +0 -87
- package/src/lib/components/timezone/timezone.service.ts +0 -233
- package/src/lib/components/toast/README.md +0 -151
- package/src/lib/components/toast/index.ts +0 -8
- package/src/lib/components/toast/toast-action.ts +0 -27
- package/src/lib/components/toast/toast-close.ts +0 -29
- package/src/lib/components/toast/toast-description.ts +0 -17
- package/src/lib/components/toast/toast-stack.ts +0 -95
- package/src/lib/components/toast/toast-title.ts +0 -17
- package/src/lib/components/toast/toast.ts +0 -64
- package/src/lib/components/toast/toast.types.ts +0 -24
- package/src/lib/components/toast/toaster.ts +0 -67
- package/src/lib/components/toggle/README.md +0 -72
- package/src/lib/components/toggle/index.ts +0 -1
- package/src/lib/components/toggle/toggle.ts +0 -53
- package/src/lib/components/toggle-group/README.md +0 -101
- package/src/lib/components/toggle-group/index.ts +0 -2
- package/src/lib/components/toggle-group/toggle-group-item.ts +0 -62
- package/src/lib/components/toggle-group/toggle-group.ts +0 -53
- package/src/lib/components/toolbar/README.md +0 -76
- package/src/lib/components/toolbar/index.ts +0 -4
- package/src/lib/components/toolbar/toolbar-separator.ts +0 -32
- package/src/lib/components/toolbar/toolbar-widget-group.ts +0 -35
- package/src/lib/components/toolbar/toolbar-widget.ts +0 -48
- package/src/lib/components/toolbar/toolbar.ts +0 -44
- package/src/lib/components/tooltip/ANIMATIONS.md +0 -274
- package/src/lib/components/tooltip/README.md +0 -100
- package/src/lib/components/tooltip/index.ts +0 -3
- package/src/lib/components/tooltip/tooltip-manager.ts +0 -194
- package/src/lib/components/tooltip/tooltip-trigger.ts +0 -148
- package/src/lib/components/tooltip/tooltip.ts +0 -72
- package/src/lib/components/tour-guide/README.md +0 -158
- package/src/lib/components/tour-guide/index.ts +0 -2
- package/src/lib/components/tour-guide/tour-guide.ts +0 -492
- package/src/lib/components/transfer-list/README.md +0 -98
- package/src/lib/components/transfer-list/index.ts +0 -5
- package/src/lib/components/transfer-list/transfer-list-types.ts +0 -11
- package/src/lib/components/transfer-list/transfer-list.ts +0 -434
- package/src/lib/components/tree/README.md +0 -358
- package/src/lib/components/tree/TODO.md +0 -94
- package/src/lib/components/tree/index.ts +0 -6
- package/src/lib/components/tree/tree-item-group.ts +0 -40
- package/src/lib/components/tree/tree-item-icon.ts +0 -17
- package/src/lib/components/tree/tree-item-trigger-icon.ts +0 -26
- package/src/lib/components/tree/tree-item-trigger.ts +0 -51
- package/src/lib/components/tree/tree-item.ts +0 -64
- package/src/lib/components/tree/tree.ts +0 -21
- package/src/lib/components/video-player/README.md +0 -275
- package/src/lib/components/video-player/index.ts +0 -14
- package/src/lib/components/video-player/video-player-big-play-button.ts +0 -35
- package/src/lib/components/video-player/video-player-buffering.ts +0 -36
- package/src/lib/components/video-player/video-player-controls.ts +0 -28
- package/src/lib/components/video-player/video-player-fullscreen-button.ts +0 -38
- package/src/lib/components/video-player/video-player-pip-button.ts +0 -37
- package/src/lib/components/video-player/video-player-play-button.ts +0 -37
- package/src/lib/components/video-player/video-player-progress.ts +0 -56
- package/src/lib/components/video-player/video-player-skip-button.ts +0 -44
- package/src/lib/components/video-player/video-player-speed-button.ts +0 -74
- package/src/lib/components/video-player/video-player-time.ts +0 -31
- package/src/lib/components/video-player/video-player-types.ts +0 -13
- package/src/lib/components/video-player/video-player-video.ts +0 -127
- package/src/lib/components/video-player/video-player-volume.ts +0 -61
- package/src/lib/components/video-player/video-player.ts +0 -139
- package/src/lib/components/virtual-list/README.md +0 -120
- package/src/lib/components/virtual-list/index.ts +0 -2
- package/src/lib/components/virtual-list/virtual-list-types.ts +0 -9
- package/src/lib/components/virtual-list/virtual-list.ts +0 -174
- package/src/lib/layouts/auth-layout.ts +0 -30
- package/src/lib/layouts/index.ts +0 -3
- package/src/lib/layouts/sidebar-layout.ts +0 -37
- package/src/lib/layouts/stacked-layout/README.md +0 -84
- package/src/lib/layouts/stacked-layout/index.ts +0 -1
- package/src/lib/layouts/stacked-layout/stacked-layout.ts +0 -39
- package/tsconfig.json +0 -28
- package/tsconfig.lib.json +0 -12
- package/tsconfig.lib.prod.json +0 -9
|
@@ -1,972 +0,0 @@
|
|
|
1
|
-
# Drawer Architecture
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
The drawer component uses a multi-signal architecture pattern to ensure smooth, complete animations before DOM cleanup. This document focuses on how animations are coordinated across the drawer content and backdrop using a signal counter to track completion of both animations.
|
|
6
|
-
|
|
7
|
-
**Drawer-Specific Features:**
|
|
8
|
-
|
|
9
|
-
- Uses directional slide animations (top, right, bottom, left) via `direction` input
|
|
10
|
-
- Implements `ScDrawer` as a **Directive** instead of a Component
|
|
11
|
-
- Often includes a handle indicator for mobile-friendly dragging affordance
|
|
12
|
-
|
|
13
|
-
## Component Structure
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
ScDrawerProvider (Root State Manager + CDK Overlay Manager)
|
|
17
|
-
├── ScDrawerTrigger (Opens drawer)
|
|
18
|
-
└── ng-template[scDrawerPortal] (Lazy content, portaled to CDK overlay)
|
|
19
|
-
│
|
|
20
|
-
Inside CDK Overlay (managed by Provider):
|
|
21
|
-
├── CDK Backdrop (Transparent - click blocking only)
|
|
22
|
-
├── ScBackdrop (Visual backdrop with animations)
|
|
23
|
-
└── ScDrawer (Drawer Directive - slides from configured direction)
|
|
24
|
-
├── ScDrawerHandle (Optional drag indicator)
|
|
25
|
-
├── ScDrawerHeader
|
|
26
|
-
│ └── ScDrawerTitle
|
|
27
|
-
│ └── ScDrawerDescription
|
|
28
|
-
└── ScDrawerFooter
|
|
29
|
-
└── ScDrawerClose
|
|
30
|
-
|
|
31
|
-
Plus: ScDrawerTrigger (Opens drawer)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### ScDrawerPortal Directive
|
|
35
|
-
|
|
36
|
-
`ScDrawerPortal` is a structural directive on `ng-template` that marks the lazy content to be portaled into the CDK overlay. It holds a reference to the `TemplateRef` which the provider reads via `contentChild`.
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
@Directive({
|
|
40
|
-
selector: 'ng-template[scDrawerPortal]',
|
|
41
|
-
})
|
|
42
|
-
export class ScDrawerPortal {
|
|
43
|
-
readonly templateRef = inject(TemplateRef);
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
The provider queries it and projects the template into the overlay:
|
|
48
|
-
|
|
49
|
-
```typescript
|
|
50
|
-
// In ScDrawerProvider
|
|
51
|
-
protected readonly drawerPortal = contentChild.required(ScDrawerPortal);
|
|
52
|
-
|
|
53
|
-
// In provider's overlay template
|
|
54
|
-
<ng-container [ngTemplateOutlet]="drawerPortal().templateRef" />
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Why a Directive?
|
|
58
|
-
|
|
59
|
-
- **Explicit**: A bare `<ng-template>` is ambiguous; `scDrawerPortal` communicates intent
|
|
60
|
-
- **Lazy**: Content inside `ng-template` is not instantiated until the provider stamps it
|
|
61
|
-
- **Provider owns lifecycle**: The provider decides _when_ to stamp the template (on open)
|
|
62
|
-
- **DI preserved**: Using `TemplatePortal(overlayTemplate, viewContainerRef)` with the provider's own `ViewContainerRef` keeps the injector chain intact -- `ScDrawer` can inject `ScDrawerProvider`
|
|
63
|
-
|
|
64
|
-
## The Multi-Signal Pattern
|
|
65
|
-
|
|
66
|
-
The core of the animation architecture is the separation of **logical state** from **physical state**, with a **coordination signal** to track animation completions.
|
|
67
|
-
|
|
68
|
-
### Signal 1: `open` (Logical State)
|
|
69
|
-
|
|
70
|
-
**Purpose:** Controls what the drawer _should_ be doing
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
// In ScDrawerProvider
|
|
74
|
-
readonly open = model<boolean>(false);
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**Responsibilities:**
|
|
78
|
-
|
|
79
|
-
- Represents user intent ("should the drawer be visible?")
|
|
80
|
-
- Triggers animation state changes
|
|
81
|
-
- When `true`: Triggers entry animations
|
|
82
|
-
- When `false`: Triggers exit animations
|
|
83
|
-
|
|
84
|
-
### Signal 2: `overlayOpen` (Physical State)
|
|
85
|
-
|
|
86
|
-
**Purpose:** Controls whether DOM exists
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
// In ScDrawerProvider
|
|
90
|
-
readonly overlayOpen = signal<boolean>(false);
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**Responsibilities:**
|
|
94
|
-
|
|
95
|
-
- Controls CDK overlay attachment/detachment
|
|
96
|
-
- Stays `true` during close animations (critical!)
|
|
97
|
-
- Only becomes `false` after animations complete
|
|
98
|
-
- Ensures animations can play before DOM removal
|
|
99
|
-
|
|
100
|
-
### Signal 3: `animationsCompleted` (Animation Coordination)
|
|
101
|
-
|
|
102
|
-
**Purpose:** Tracks completion of multiple animations
|
|
103
|
-
|
|
104
|
-
```typescript
|
|
105
|
-
// In ScDrawerProvider (private)
|
|
106
|
-
private readonly animationsCompleted = signal<number>(0);
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**Responsibilities:**
|
|
110
|
-
|
|
111
|
-
- Counts completed animations during close sequence
|
|
112
|
-
- Target count: 2 (drawer + backdrop)
|
|
113
|
-
- Resets to 0 when opening (for next cycle)
|
|
114
|
-
- Triggers overlay closure when target reached
|
|
115
|
-
|
|
116
|
-
### Why Both Are Needed
|
|
117
|
-
|
|
118
|
-
**The Problem:**
|
|
119
|
-
|
|
120
|
-
CDK overlay's lifecycle is tied to DOM presence:
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
// This doesn't work:
|
|
124
|
-
if (open()) {
|
|
125
|
-
overlayRef.attach(portal); // DOM mounted
|
|
126
|
-
} else {
|
|
127
|
-
overlayRef.detach(); // DOM removed IMMEDIATELY
|
|
128
|
-
// Animation never plays - element is gone!
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**The Solution:**
|
|
133
|
-
|
|
134
|
-
Separate signals allow animation completion:
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
// This works:
|
|
138
|
-
if (overlayOpen()) {
|
|
139
|
-
// Physical state
|
|
140
|
-
overlayRef.attach(portal); // DOM mounted
|
|
141
|
-
} else {
|
|
142
|
-
overlayRef.detach(); // DOM removed AFTER animations
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Meanwhile, open() controls animations:
|
|
146
|
-
if (open()) {
|
|
147
|
-
// Logical state
|
|
148
|
-
state = 'open'; // Entry animation
|
|
149
|
-
} else {
|
|
150
|
-
state = 'closed'; // Exit animation (DOM still mounted!)
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Animation Architecture
|
|
155
|
-
|
|
156
|
-
### Three Layers (Separated by Concern)
|
|
157
|
-
|
|
158
|
-
1. **CDK Backdrop** (Transparent - No Animation)
|
|
159
|
-
- Class: `cdk-overlay-transparent-backdrop`
|
|
160
|
-
- Purpose: Click blocking and scroll prevention
|
|
161
|
-
- Functional layer only, no visual styling
|
|
162
|
-
|
|
163
|
-
2. **ScBackdrop Component** (300ms fade animation)
|
|
164
|
-
- Reusable component from `components/backdrop`
|
|
165
|
-
- Fade effect via Tailwind animate classes
|
|
166
|
-
- Positioned with `-z-10` (behind drawer)
|
|
167
|
-
- Emits `animationComplete` output when close animation finishes
|
|
168
|
-
|
|
169
|
-
3. **Drawer Content Animation** (300ms directional slide)
|
|
170
|
-
- Slide animations from configured direction (top/right/bottom/left)
|
|
171
|
-
- Managed by Tailwind animate classes
|
|
172
|
-
- Completion detected via `animationend` event (triggers cleanup)
|
|
173
|
-
|
|
174
|
-
### Synchronization
|
|
175
|
-
|
|
176
|
-
Both ScBackdrop and Drawer animations:
|
|
177
|
-
|
|
178
|
-
- Start simultaneously when `open` changes
|
|
179
|
-
- Use same duration (300ms)
|
|
180
|
-
- Respond to same `data-state` attribute
|
|
181
|
-
- Inside same overlay (removed together)
|
|
182
|
-
|
|
183
|
-
### Drawer Content Animations
|
|
184
|
-
|
|
185
|
-
Applied via Tailwind classes in `drawer.ts`:
|
|
186
|
-
|
|
187
|
-
```typescript
|
|
188
|
-
const directionAnimationClasses: Record<DrawerDirection, string> = {
|
|
189
|
-
top: 'slide-in-from-top data-[state=closed]:slide-out-to-top',
|
|
190
|
-
right: 'slide-in-from-right data-[state=closed]:slide-out-to-right',
|
|
191
|
-
bottom: 'slide-in-from-bottom data-[state=closed]:slide-out-to-bottom',
|
|
192
|
-
left: 'slide-in-from-left data-[state=closed]:slide-out-to-left',
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
protected readonly class = computed(() => {
|
|
196
|
-
const direction = this.drawer.direction();
|
|
197
|
-
|
|
198
|
-
return cn(
|
|
199
|
-
// Base styles
|
|
200
|
-
'fixed z-50 flex flex-col bg-background',
|
|
201
|
-
directionBaseClasses[direction],
|
|
202
|
-
|
|
203
|
-
// Entry animation (fade + slide)
|
|
204
|
-
'animate-in fade-in-0 duration-300',
|
|
205
|
-
directionAnimationClasses[direction],
|
|
206
|
-
|
|
207
|
-
// Exit animation (triggered by data-state="closed")
|
|
208
|
-
'data-[state=closed]:animate-out',
|
|
209
|
-
'data-[state=closed]:fade-out-0',
|
|
210
|
-
'data-[state=closed]:duration-300',
|
|
211
|
-
);
|
|
212
|
-
});
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
**Animation Flow:**
|
|
216
|
-
|
|
217
|
-
1. `state` signal changes from `'open'` to `'closed'`
|
|
218
|
-
2. `data-state` attribute updates to `"closed"`
|
|
219
|
-
3. Tailwind applies exit animation classes (fade + slide to configured direction)
|
|
220
|
-
4. Animation plays for 300ms
|
|
221
|
-
5. `animationend` event fires
|
|
222
|
-
|
|
223
|
-
**Directional Slide Animations:**
|
|
224
|
-
|
|
225
|
-
The drawer uses different slide directions based on the `direction` input:
|
|
226
|
-
|
|
227
|
-
- **top**: Slides in from top, slides out to top
|
|
228
|
-
- **right**: Slides in from right, slides out to right
|
|
229
|
-
- **bottom**: Slides in from bottom, slides out to bottom
|
|
230
|
-
- **left**: Slides in from left, slides out to left
|
|
231
|
-
|
|
232
|
-
Each direction uses Tailwind's directional slide utilities combined with fade for smooth entry/exit.
|
|
233
|
-
|
|
234
|
-
### ScBackdrop Component Animations
|
|
235
|
-
|
|
236
|
-
Managed via ScBackdrop component from `components/backdrop`:
|
|
237
|
-
|
|
238
|
-
```typescript
|
|
239
|
-
// In backdrop.ts
|
|
240
|
-
protected readonly class = computed(() =>
|
|
241
|
-
cn(
|
|
242
|
-
'fixed inset-0 -z-10 bg-black/10',
|
|
243
|
-
'supports-backdrop-filter:backdrop-blur-xs',
|
|
244
|
-
'animate-in fade-in-0 duration-300',
|
|
245
|
-
'data-[state=closed]:animate-out',
|
|
246
|
-
'data-[state=closed]:fade-out-0',
|
|
247
|
-
'data-[state=closed]:duration-300',
|
|
248
|
-
),
|
|
249
|
-
);
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
**Animation Flow:**
|
|
253
|
-
|
|
254
|
-
1. Provider renders: `<div sc-backdrop [open]="open()" (animationComplete)="onBackdropAnimationComplete()"></div>`
|
|
255
|
-
2. ScBackdrop receives `open` input
|
|
256
|
-
3. Sets `data-state` based on `open` value
|
|
257
|
-
4. Tailwind applies appropriate animation classes
|
|
258
|
-
5. Animation plays for 300ms
|
|
259
|
-
6. On `animationend`, emits `animationComplete` output
|
|
260
|
-
7. Provider handles the event directly for coordination
|
|
261
|
-
|
|
262
|
-
**Why Separate Component?**
|
|
263
|
-
|
|
264
|
-
- Reusable across dialog, drawer, sheet, etc.
|
|
265
|
-
- Consistent animation pattern
|
|
266
|
-
- Single responsibility (visual layer only)
|
|
267
|
-
- CDK backdrop handles functionality separately
|
|
268
|
-
|
|
269
|
-
## Complete Animation Timeline
|
|
270
|
-
|
|
271
|
-
### Opening Sequence
|
|
272
|
-
|
|
273
|
-
```
|
|
274
|
-
User clicks trigger:
|
|
275
|
-
│
|
|
276
|
-
├─ t=0ms: Trigger calls open.set(true)
|
|
277
|
-
│ │
|
|
278
|
-
│ ├─ Provider effect 1:
|
|
279
|
-
│ │ ├─ overlayOpen.set(true) <- Mount DOM immediately
|
|
280
|
-
│ │ └─ animationsCompleted.set(0) <- Reset for next cycle
|
|
281
|
-
│ │
|
|
282
|
-
│ └─ Provider effect 3 (triggered by overlayOpen):
|
|
283
|
-
│ └─ attachDrawer() <- CDK overlay attached
|
|
284
|
-
│ └─ TemplatePortal(overlayTemplate, viewContainerRef)
|
|
285
|
-
│ ├─ ScBackdrop rendered with [open]="open()"
|
|
286
|
-
│ └─ ng-template outlet stamps scDrawerPortal content
|
|
287
|
-
│
|
|
288
|
-
├─ t=0ms: CDK adds .cdk-overlay-backdrop-showing
|
|
289
|
-
│ └─ Backdrop: opacity 0 -> 1 (300ms)
|
|
290
|
-
│
|
|
291
|
-
├─ t=0ms: Drawer effect (triggered by open):
|
|
292
|
-
│ └─ state.set('open')
|
|
293
|
-
│ └─ data-state="open" -> Entry animation starts
|
|
294
|
-
│ ├─ fade-in-0
|
|
295
|
-
│ ├─ slide-in-from-{direction}
|
|
296
|
-
│ └─ duration-300
|
|
297
|
-
│
|
|
298
|
-
├─ t=0-300ms: Both animations play
|
|
299
|
-
│
|
|
300
|
-
└─ t=300ms: Animations complete, drawer visible
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### Closing Sequence (Coordinated Completion)
|
|
304
|
-
|
|
305
|
-
```
|
|
306
|
-
User clicks close/backdrop/escape:
|
|
307
|
-
│
|
|
308
|
-
├─ t=0ms: Provider calls open.set(false)
|
|
309
|
-
│ │
|
|
310
|
-
│ ├─ Drawer effect (triggered by open):
|
|
311
|
-
│ │ └─ state.set('closed') <- Triggers animation
|
|
312
|
-
│ │ └─ data-state="closed" -> Exit animation starts
|
|
313
|
-
│ │ ├─ animate-out
|
|
314
|
-
│ │ ├─ fade-out-0
|
|
315
|
-
│ │ ├─ slide-out-to-{direction}
|
|
316
|
-
│ │ └─ duration-300
|
|
317
|
-
│ │
|
|
318
|
-
│ └─ Backdrop receives [open]="false" input:
|
|
319
|
-
│ └─ state.set('closed') <- Triggers backdrop animation
|
|
320
|
-
│ └─ data-state="closed" -> Backdrop fade-out (300ms)
|
|
321
|
-
│
|
|
322
|
-
├─ IMPORTANT: overlayOpen is STILL true!
|
|
323
|
-
│ └─ DOM remains mounted so animations can play
|
|
324
|
-
│ └─ animationsCompleted = 0 (waiting for both)
|
|
325
|
-
│
|
|
326
|
-
├─ t=0-300ms: Both animations play simultaneously
|
|
327
|
-
│
|
|
328
|
-
├─ t=~300ms: Drawer animation completes
|
|
329
|
-
│ └─ onAnimationEnd(event) fires
|
|
330
|
-
│ └─ if (state === 'closed' && target === element):
|
|
331
|
-
│ └─ provider.onDrawerAnimationComplete()
|
|
332
|
-
│ └─ animationsCompleted.update(n => n + 1) <- Count = 1
|
|
333
|
-
│
|
|
334
|
-
├─ t=~300ms: Backdrop animation completes
|
|
335
|
-
│ └─ backdrop emits (animationComplete)
|
|
336
|
-
│ └─ provider.onBackdropAnimationComplete()
|
|
337
|
-
│ └─ animationsCompleted.update(n => n + 1) <- Count = 2
|
|
338
|
-
│
|
|
339
|
-
├─ Provider effect 2 detects: animationsCompleted === 2 && !open()
|
|
340
|
-
│ └─ overlayOpen.set(false) <- Cleanup triggered!
|
|
341
|
-
│ └─ animationsCompleted.set(0) <- Reset for next cycle
|
|
342
|
-
│
|
|
343
|
-
└─ t=~300ms: Provider effect 3 (triggered by overlayOpen):
|
|
344
|
-
└─ detachDrawer() <- DOM removed cleanly after BOTH complete
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
## Why Track Both Animations?
|
|
348
|
-
|
|
349
|
-
**Question:** Why coordinate two separate animations instead of using a single timer?
|
|
350
|
-
|
|
351
|
-
**Answer:** Explicit animation tracking is more robust and event-driven:
|
|
352
|
-
|
|
353
|
-
### The Problem with Single Timers
|
|
354
|
-
|
|
355
|
-
```typescript
|
|
356
|
-
// Old approach - assumes both animations finish together
|
|
357
|
-
onDrawerAnimationComplete(): void {
|
|
358
|
-
setTimeout(() => {
|
|
359
|
-
this.overlayOpen.set(false);
|
|
360
|
-
}, 300); // Hope backdrop finishes too!
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
**Issues:**
|
|
365
|
-
|
|
366
|
-
- Assumes backdrop takes exactly 300ms
|
|
367
|
-
- Browser rendering variations can cause timing differences
|
|
368
|
-
- Backdrop might take 305ms, getting cut off at 300ms
|
|
369
|
-
- No way to know if backdrop actually completed
|
|
370
|
-
- Might wait longer than necessary if backdrop finishes early
|
|
371
|
-
|
|
372
|
-
### The Solution: Signal Counter Pattern
|
|
373
|
-
|
|
374
|
-
```typescript
|
|
375
|
-
// New approach - explicitly track both completions
|
|
376
|
-
private readonly animationsCompleted = signal<number>(0);
|
|
377
|
-
|
|
378
|
-
onDrawerAnimationComplete(): void {
|
|
379
|
-
this.animationsCompleted.update(n => n + 1); // Count = 1
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
onBackdropAnimationComplete(): void {
|
|
383
|
-
this.animationsCompleted.update(n => n + 1); // Count = 2
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
effect(() => {
|
|
387
|
-
if (this.animationsCompleted() === 2 && !this.open()) {
|
|
388
|
-
this.overlayOpen.set(false); // Both confirmed complete!
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
**Benefits:**
|
|
394
|
-
|
|
395
|
-
1. **Event-driven**: Waits for actual completion, not estimated time
|
|
396
|
-
2. **Robust**: Handles browser timing variations (300ms vs 305ms)
|
|
397
|
-
3. **Accurate**: Both animations explicitly signal completion
|
|
398
|
-
4. **Extensible**: Easy to add more animations (just increase target count)
|
|
399
|
-
5. **No race conditions**: Counter resets on open for clean cycles
|
|
400
|
-
|
|
401
|
-
## State Synchronization
|
|
402
|
-
|
|
403
|
-
### Provider Constructor Effects
|
|
404
|
-
|
|
405
|
-
```typescript
|
|
406
|
-
constructor() {
|
|
407
|
-
// Effect 1: Sync overlayOpen with open for OPENING
|
|
408
|
-
effect(() => {
|
|
409
|
-
if (this.open()) {
|
|
410
|
-
// Opening: Mount DOM immediately
|
|
411
|
-
this.overlayOpen.set(true);
|
|
412
|
-
// Reset counter for next close cycle
|
|
413
|
-
this.animationsCompleted.set(0);
|
|
414
|
-
}
|
|
415
|
-
// Note: When closing, overlayOpen stays true!
|
|
416
|
-
// It will be set to false by the coordination effect below
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
// Effect 2: Close overlay when both animations complete
|
|
420
|
-
effect(() => {
|
|
421
|
-
const completed = this.animationsCompleted();
|
|
422
|
-
if (completed === 2 && !this.open()) {
|
|
423
|
-
// Both animations confirmed complete
|
|
424
|
-
this.overlayOpen.set(false);
|
|
425
|
-
// Reset for next cycle
|
|
426
|
-
this.animationsCompleted.set(0);
|
|
427
|
-
}
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
// Effect 3: Attach/detach CDK overlay based on overlayOpen
|
|
431
|
-
effect(() => {
|
|
432
|
-
if (this.overlayOpen()) {
|
|
433
|
-
this.attachDrawer();
|
|
434
|
-
} else {
|
|
435
|
-
this.detachDrawer();
|
|
436
|
-
}
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
### Provider Overlay Template
|
|
442
|
-
|
|
443
|
-
The provider's template includes the backdrop and focus trap, projecting the consumer's `scDrawerPortal` template via `ngTemplateOutlet`:
|
|
444
|
-
|
|
445
|
-
```html
|
|
446
|
-
<ng-content />
|
|
447
|
-
<ng-template #overlayTemplate>
|
|
448
|
-
<div sc-backdrop [open]="open()" (animationComplete)="onBackdropAnimationComplete()"></div>
|
|
449
|
-
<div cdkTrapFocus [cdkTrapFocusAutoCapture]="true">
|
|
450
|
-
<ng-container [ngTemplateOutlet]="drawerPortal().templateRef" />
|
|
451
|
-
</div>
|
|
452
|
-
</ng-template>
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
### Drawer Directive Constructor Effects
|
|
456
|
-
|
|
457
|
-
```typescript
|
|
458
|
-
constructor() {
|
|
459
|
-
// Effect: Sync animation state with logical state
|
|
460
|
-
effect(() => {
|
|
461
|
-
const isOpen = this.drawer.open();
|
|
462
|
-
this.state.set(isOpen ? 'open' : 'closed');
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
**Note:** Unlike dialog and sheet, drawer is a **Directive** not a Component, so it doesn't have its own template. It attaches behavior to a host element and relies on the host for focus management and content.
|
|
468
|
-
|
|
469
|
-
## Animation Completion Handling
|
|
470
|
-
|
|
471
|
-
### Drawer Directive
|
|
472
|
-
|
|
473
|
-
```typescript
|
|
474
|
-
protected onAnimationEnd(event: AnimationEvent): void {
|
|
475
|
-
// Only trigger cleanup when close animation completes
|
|
476
|
-
if (
|
|
477
|
-
this.state() === 'closed' &&
|
|
478
|
-
event.target === this.elementRef.nativeElement
|
|
479
|
-
) {
|
|
480
|
-
this.drawer.onDrawerAnimationComplete();
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
**Why check `event.target`?**
|
|
486
|
-
|
|
487
|
-
- `animationend` bubbles from child elements
|
|
488
|
-
- We only care about the drawer's own animation
|
|
489
|
-
- Prevents false triggers from child element animations
|
|
490
|
-
|
|
491
|
-
**Directive vs Component:**
|
|
492
|
-
|
|
493
|
-
Unlike the dialog and sheet components, drawer is a directive. This means:
|
|
494
|
-
|
|
495
|
-
- It enhances existing host elements instead of creating new ones
|
|
496
|
-
- Animation completion still works the same way via host binding
|
|
497
|
-
- `(animationend)` is bound in the host metadata
|
|
498
|
-
- Still requires ElementRef to check event.target
|
|
499
|
-
|
|
500
|
-
### Provider Component
|
|
501
|
-
|
|
502
|
-
The provider directly handles backdrop animation completion in its template -- no intermediary needed:
|
|
503
|
-
|
|
504
|
-
```html
|
|
505
|
-
<!-- In provider's overlay template -->
|
|
506
|
-
<div sc-backdrop [open]="open()" (animationComplete)="onBackdropAnimationComplete()"></div>
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
```typescript
|
|
510
|
-
// In ScDrawerProvider
|
|
511
|
-
onDrawerAnimationComplete(): void {
|
|
512
|
-
if (!this.open()) {
|
|
513
|
-
this.animationsCompleted.update(n => n + 1);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
onBackdropAnimationComplete(): void {
|
|
518
|
-
if (!this.open()) {
|
|
519
|
-
this.animationsCompleted.update(n => n + 1);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
**Why check `!this.open()` before incrementing?**
|
|
525
|
-
|
|
526
|
-
- User might have reopened drawer during close animation
|
|
527
|
-
- Prevents counter from incrementing during new open cycle
|
|
528
|
-
- Guards against race conditions
|
|
529
|
-
- Example: User clicks close (close starts), then immediately clicks trigger again (reopens)
|
|
530
|
-
- Without this check, the counter would incorrectly increment for the new cycle
|
|
531
|
-
|
|
532
|
-
**Why use `update()` instead of `set()`?**
|
|
533
|
-
|
|
534
|
-
- Increment is relative to current value
|
|
535
|
-
- Safe if multiple updates happen
|
|
536
|
-
- Immutable update pattern
|
|
537
|
-
- Consistent with Angular signals best practices
|
|
538
|
-
|
|
539
|
-
## Comparison: Evolution of Animation Coordination
|
|
540
|
-
|
|
541
|
-
### Approach 1: Single Timer (Previous Implementation)
|
|
542
|
-
|
|
543
|
-
```typescript
|
|
544
|
-
// Problems:
|
|
545
|
-
private async detachDrawerWithAnimation() {
|
|
546
|
-
if (this.overlayRef.hasAttached()) {
|
|
547
|
-
const backdrop = this.overlayRef.backdropElement;
|
|
548
|
-
backdrop?.classList.add('sc-backdrop-hiding');
|
|
549
|
-
|
|
550
|
-
// Wait arbitrary 300ms
|
|
551
|
-
await firstValueFrom(timer(300));
|
|
552
|
-
|
|
553
|
-
this.overlayRef.detach(); // Might cut off drawer animation!
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
```
|
|
557
|
-
|
|
558
|
-
**Issues:**
|
|
559
|
-
|
|
560
|
-
1. Single hardcoded timer for all animations
|
|
561
|
-
2. No detection of actual animation completion
|
|
562
|
-
3. Drawer animation might take longer or shorter
|
|
563
|
-
4. Not coordinated with drawer state
|
|
564
|
-
5. No way to cancel if reopened
|
|
565
|
-
|
|
566
|
-
### Approach 2: Signal Counter (Current Implementation)
|
|
567
|
-
|
|
568
|
-
```typescript
|
|
569
|
-
// Both animations explicitly tracked:
|
|
570
|
-
private readonly animationsCompleted = signal<number>(0);
|
|
571
|
-
|
|
572
|
-
constructor() {
|
|
573
|
-
// Effect 1: Open and reset
|
|
574
|
-
effect(() => {
|
|
575
|
-
if (this.open()) {
|
|
576
|
-
this.overlayOpen.set(true);
|
|
577
|
-
this.animationsCompleted.set(0);
|
|
578
|
-
}
|
|
579
|
-
});
|
|
580
|
-
|
|
581
|
-
// Effect 2: Close when both complete
|
|
582
|
-
effect(() => {
|
|
583
|
-
if (this.animationsCompleted() === 2 && !this.open()) {
|
|
584
|
-
this.overlayOpen.set(false);
|
|
585
|
-
this.animationsCompleted.set(0);
|
|
586
|
-
}
|
|
587
|
-
});
|
|
588
|
-
|
|
589
|
-
// Effect 3: Attach/detach CDK overlay
|
|
590
|
-
effect(() => {
|
|
591
|
-
if (this.overlayOpen()) {
|
|
592
|
-
this.attachDrawer();
|
|
593
|
-
} else {
|
|
594
|
-
this.detachDrawer();
|
|
595
|
-
}
|
|
596
|
-
});
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
// Both animations signal completion
|
|
600
|
-
onDrawerAnimationComplete(): void {
|
|
601
|
-
if (!this.open()) {
|
|
602
|
-
this.animationsCompleted.update(n => n + 1);
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
onBackdropAnimationComplete(): void {
|
|
607
|
-
if (!this.open()) {
|
|
608
|
-
this.animationsCompleted.update(n => n + 1);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
**Improvements:**
|
|
614
|
-
|
|
615
|
-
1. Both animations event-driven
|
|
616
|
-
2. No timing assumptions
|
|
617
|
-
3. Handles browser rendering variations
|
|
618
|
-
4. Explicit completion signals
|
|
619
|
-
5. Extensible (easy to add more animations)
|
|
620
|
-
6. Signal-based reactivity
|
|
621
|
-
7. Clean cycle management
|
|
622
|
-
|
|
623
|
-
## Key Design Decisions
|
|
624
|
-
|
|
625
|
-
### 1. Provider Owns Everything
|
|
626
|
-
|
|
627
|
-
**Decision:** `ScDrawerProvider` manages state, overlay lifecycle, backdrop, and focus trap
|
|
628
|
-
|
|
629
|
-
**Why:**
|
|
630
|
-
|
|
631
|
-
- Provider controls _when_ content appears (open state)
|
|
632
|
-
- Provider controls _where_ content appears (CDK overlay)
|
|
633
|
-
- Single component owns the full lifecycle -- no coordination between sibling components
|
|
634
|
-
- `ScDrawerPortal` directive just marks _what_ content to portal -- no logic
|
|
635
|
-
|
|
636
|
-
### 2. `display: contents` on Provider
|
|
637
|
-
|
|
638
|
-
**Decision:** Provider uses `display: contents` via Tailwind `contents` class to be invisible to CSS layout
|
|
639
|
-
|
|
640
|
-
**Why:**
|
|
641
|
-
|
|
642
|
-
- Provider is a `<div>` (required for CDK overlay's `ViewContainerRef`)
|
|
643
|
-
- But it shouldn't affect the consumer's layout
|
|
644
|
-
- `display: contents` makes the element's box disappear while keeping children in flow
|
|
645
|
-
- Consumer can place trigger and other content without layout interference
|
|
646
|
-
|
|
647
|
-
### 3. Separation of Logical and Physical State
|
|
648
|
-
|
|
649
|
-
**Decision:** Split logical state (`open`) from physical state (`overlayOpen`)
|
|
650
|
-
|
|
651
|
-
**Why:**
|
|
652
|
-
|
|
653
|
-
- Logical state drives animations
|
|
654
|
-
- Physical state drives DOM lifecycle
|
|
655
|
-
- Animations need time to complete before DOM removal
|
|
656
|
-
- Clean separation makes flow easier to understand
|
|
657
|
-
|
|
658
|
-
### 4. Signal Counter Pattern
|
|
659
|
-
|
|
660
|
-
**Decision:** Use signal counter to track multiple animation completions
|
|
661
|
-
|
|
662
|
-
**Why:**
|
|
663
|
-
|
|
664
|
-
- Both animations explicitly signal completion
|
|
665
|
-
- No timing assumptions or hardcoded delays
|
|
666
|
-
- Reactive: effect triggers when counter reaches target
|
|
667
|
-
- Extensible: easy to add more animations (increase target)
|
|
668
|
-
- Debuggable: counter value visible in Angular DevTools
|
|
669
|
-
|
|
670
|
-
### 5. Event-Driven Completion
|
|
671
|
-
|
|
672
|
-
**Decision:** Both drawer and backdrop emit completion events
|
|
673
|
-
|
|
674
|
-
**Why:**
|
|
675
|
-
|
|
676
|
-
- Precise: no guessing when animations finish
|
|
677
|
-
- Robust: handles browser timing variations
|
|
678
|
-
- Decoupled: backdrop component remains reusable
|
|
679
|
-
- Provider handles backdrop events directly in its own template
|
|
680
|
-
- No arbitrary timeouts or magic numbers
|
|
681
|
-
|
|
682
|
-
### 6. Guard Pattern for Counter Increments
|
|
683
|
-
|
|
684
|
-
**Decision:** Check `!open()` before incrementing animation counter
|
|
685
|
-
|
|
686
|
-
**Why:**
|
|
687
|
-
|
|
688
|
-
- Prevents counter increments during new open cycle
|
|
689
|
-
- User might reopen during close animation
|
|
690
|
-
- Without guard, counter would increment incorrectly for new cycle
|
|
691
|
-
- Example: Close starts -> drawer completes -> user reopens -> backdrop completes would incorrectly increment counter for new open
|
|
692
|
-
- Effect checks both counter AND `!open()` for safety
|
|
693
|
-
|
|
694
|
-
### 7. Effect-Based Reactivity
|
|
695
|
-
|
|
696
|
-
**Decision:** Use Angular effects instead of manual subscriptions
|
|
697
|
-
|
|
698
|
-
**Why:**
|
|
699
|
-
|
|
700
|
-
- Automatic cleanup on component destruction
|
|
701
|
-
- Declarative: describes "what" not "how"
|
|
702
|
-
- Runs automatically when dependencies change
|
|
703
|
-
- Easier to reason about than imperative code
|
|
704
|
-
|
|
705
|
-
### 8. Directive Pattern
|
|
706
|
-
|
|
707
|
-
**Decision:** Implement ScDrawer as a Directive instead of a Component
|
|
708
|
-
|
|
709
|
-
**Why:**
|
|
710
|
-
|
|
711
|
-
- More flexible: attaches behavior to existing elements
|
|
712
|
-
- Lighter weight: no additional wrapper element
|
|
713
|
-
- Composable: easy to combine with other directives
|
|
714
|
-
- Similar to how CDK components work
|
|
715
|
-
- Still supports animation coordination through host bindings
|
|
716
|
-
|
|
717
|
-
### 9. Directional Animation System
|
|
718
|
-
|
|
719
|
-
**Decision:** Use `direction` input to determine animation direction dynamically
|
|
720
|
-
|
|
721
|
-
**Why:**
|
|
722
|
-
|
|
723
|
-
- Single directive handles all four directions
|
|
724
|
-
- Animation classes computed based on direction
|
|
725
|
-
- Maintains consistency across all directions
|
|
726
|
-
- Easy to add new directions if needed
|
|
727
|
-
|
|
728
|
-
### 10. Backdrop + Escape Handling
|
|
729
|
-
|
|
730
|
-
**Decision:** Provider subscribes to CDK overlay's `backdropClick()` and `keydownEvents()` directly
|
|
731
|
-
|
|
732
|
-
**Why:**
|
|
733
|
-
|
|
734
|
-
- Provider owns the overlay, so it handles all overlay events directly
|
|
735
|
-
- No need for portal to forward events
|
|
736
|
-
- `backdropClick()` triggers `open.set(false)` on the provider
|
|
737
|
-
- `keydownEvents()` filters for Escape key and triggers `open.set(false)`
|
|
738
|
-
- Keeps event handling centralized in the lifecycle owner
|
|
739
|
-
|
|
740
|
-
## Animation Classes Reference
|
|
741
|
-
|
|
742
|
-
### Drawer Content Classes
|
|
743
|
-
|
|
744
|
-
```typescript
|
|
745
|
-
// Position classes (fixed to specific direction)
|
|
746
|
-
const directionBaseClasses: Record<DrawerDirection, string> = {
|
|
747
|
-
top: 'inset-x-0 top-0 border-b rounded-b-[10px]',
|
|
748
|
-
right: 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',
|
|
749
|
-
bottom: 'inset-x-0 bottom-0 border-t rounded-t-[10px]',
|
|
750
|
-
left: 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',
|
|
751
|
-
};
|
|
752
|
-
|
|
753
|
-
// Directional animation classes
|
|
754
|
-
const directionAnimationClasses: Record<DrawerDirection, string> = {
|
|
755
|
-
top: 'slide-in-from-top data-[state=closed]:slide-out-to-top',
|
|
756
|
-
right: 'slide-in-from-right data-[state=closed]:slide-out-to-right',
|
|
757
|
-
bottom: 'slide-in-from-bottom data-[state=closed]:slide-out-to-bottom',
|
|
758
|
-
left: 'slide-in-from-left data-[state=closed]:slide-out-to-left',
|
|
759
|
-
};
|
|
760
|
-
|
|
761
|
-
// Entry animation (fade + slide based on direction)
|
|
762
|
-
('animate-in fade-in-0 duration-300');
|
|
763
|
-
directionAnimationClasses[direction];
|
|
764
|
-
|
|
765
|
-
// Exit animation (via data-state="closed")
|
|
766
|
-
('data-[state=closed]:animate-out');
|
|
767
|
-
('data-[state=closed]:fade-out-0');
|
|
768
|
-
('data-[state=closed]:duration-300');
|
|
769
|
-
```
|
|
770
|
-
|
|
771
|
-
### Backdrop Classes
|
|
772
|
-
|
|
773
|
-
```typescript
|
|
774
|
-
// Entry animation
|
|
775
|
-
'animate-in fade-in-0 duration-300';
|
|
776
|
-
|
|
777
|
-
// Exit animation (via data-state="closed")
|
|
778
|
-
'data-[state=closed]:animate-out';
|
|
779
|
-
'data-[state=closed]:fade-out-0';
|
|
780
|
-
'data-[state=closed]:duration-300';
|
|
781
|
-
```
|
|
782
|
-
|
|
783
|
-
## Accessibility Considerations
|
|
784
|
-
|
|
785
|
-
The animation system preserves accessibility:
|
|
786
|
-
|
|
787
|
-
1. **Focus Management:** Drawer auto-focuses on mount via `cdkTrapFocus` with `cdkTrapFocusAutoCapture`
|
|
788
|
-
2. **ARIA Attributes:** Set before animations start (`role="dialog"`, `aria-modal="true"`)
|
|
789
|
-
3. **Screen Readers:** Announce drawer immediately (not after animation)
|
|
790
|
-
4. **Keyboard:** Escape key closes the drawer (via CDK overlay keydown events)
|
|
791
|
-
5. **Backdrop Click:** Click outside closes the drawer (via CDK overlay backdrop click)
|
|
792
|
-
6. **Reduced Motion:** Could add `@media (prefers-reduced-motion)` support
|
|
793
|
-
7. **Drawer Handle:** Optional visual indicator improves discoverability on mobile
|
|
794
|
-
|
|
795
|
-
## Performance Considerations
|
|
796
|
-
|
|
797
|
-
### Efficient Rendering
|
|
798
|
-
|
|
799
|
-
- Uses `ChangeDetectionStrategy.OnPush` everywhere
|
|
800
|
-
- Effects only run when dependencies change
|
|
801
|
-
- No manual subscriptions to manage
|
|
802
|
-
- Single overlay instance reused
|
|
803
|
-
- Directive pattern adds minimal overhead
|
|
804
|
-
|
|
805
|
-
### Animation Performance
|
|
806
|
-
|
|
807
|
-
- CSS animations (GPU accelerated)
|
|
808
|
-
- Opacity and transform (composited properties)
|
|
809
|
-
- No layout thrashing
|
|
810
|
-
- Minimal JavaScript during animation
|
|
811
|
-
|
|
812
|
-
### Memory Management
|
|
813
|
-
|
|
814
|
-
- Effects auto-cleanup on destroy
|
|
815
|
-
- No timeout leaks (event-driven approach)
|
|
816
|
-
- Overlay detached after use
|
|
817
|
-
- No memory leaks
|
|
818
|
-
|
|
819
|
-
## Consumer API
|
|
820
|
-
|
|
821
|
-
```html
|
|
822
|
-
<div sc-drawer-provider direction="bottom" [(open)]="isOpen">
|
|
823
|
-
<button sc-drawer-trigger sc-button>Open</button>
|
|
824
|
-
<ng-template scDrawerPortal>
|
|
825
|
-
<div sc-drawer>
|
|
826
|
-
<div sc-drawer-handle></div>
|
|
827
|
-
<div sc-drawer-header>
|
|
828
|
-
<h2 sc-drawer-title>Title</h2>
|
|
829
|
-
<p sc-drawer-description>Description</p>
|
|
830
|
-
</div>
|
|
831
|
-
<!-- content -->
|
|
832
|
-
<div sc-drawer-footer>
|
|
833
|
-
<button sc-drawer-close sc-button>Close</button>
|
|
834
|
-
</div>
|
|
835
|
-
</div>
|
|
836
|
-
</ng-template>
|
|
837
|
-
</div>
|
|
838
|
-
```
|
|
839
|
-
|
|
840
|
-
**Key points:**
|
|
841
|
-
|
|
842
|
-
- `scDrawerPortal` on `ng-template` marks lazy content
|
|
843
|
-
- Content is only instantiated when drawer opens
|
|
844
|
-
- `ScDrawerPortal` must be imported in the consumer's `imports` array
|
|
845
|
-
- `[(open)]` provides two-way binding for programmatic control
|
|
846
|
-
- `direction` input on the provider controls slide direction
|
|
847
|
-
|
|
848
|
-
## Future Enhancements
|
|
849
|
-
|
|
850
|
-
### Potential Improvements
|
|
851
|
-
|
|
852
|
-
1. **Variable Animation Durations:**
|
|
853
|
-
- Input property for animation duration
|
|
854
|
-
- Provider passes duration to drawer and backdrop
|
|
855
|
-
- Configurable timing for different use cases
|
|
856
|
-
|
|
857
|
-
2. **Animation Events:**
|
|
858
|
-
- Output events for animation start/end
|
|
859
|
-
- External components can react to animation state
|
|
860
|
-
|
|
861
|
-
3. **Reduced Motion Support:**
|
|
862
|
-
- Detect `prefers-reduced-motion`
|
|
863
|
-
- Instant show/hide if user prefers
|
|
864
|
-
- Keep accessibility benefits
|
|
865
|
-
|
|
866
|
-
4. **Stacking Context:**
|
|
867
|
-
- Support multiple overlapping drawers
|
|
868
|
-
- z-index management
|
|
869
|
-
- Close all vs close top
|
|
870
|
-
|
|
871
|
-
5. **Custom Animations:**
|
|
872
|
-
- Allow custom animation classes via input
|
|
873
|
-
- Support different animation styles per direction
|
|
874
|
-
|
|
875
|
-
6. **Drag-to-Close:**
|
|
876
|
-
- Native touch/pointer gesture support
|
|
877
|
-
- Threshold-based closing
|
|
878
|
-
- Spring physics for natural feel
|
|
879
|
-
|
|
880
|
-
## Testing Considerations
|
|
881
|
-
|
|
882
|
-
### What to Test
|
|
883
|
-
|
|
884
|
-
1. **State Transitions:**
|
|
885
|
-
- open: false -> true -> false
|
|
886
|
-
- overlayOpen follows correctly
|
|
887
|
-
- state syncs with open
|
|
888
|
-
|
|
889
|
-
2. **Animation Timing:**
|
|
890
|
-
- Animations play for full duration
|
|
891
|
-
- DOM not removed early
|
|
892
|
-
- Backdrop fades correctly
|
|
893
|
-
- Drawer slides in correct direction
|
|
894
|
-
|
|
895
|
-
3. **All Directions:**
|
|
896
|
-
- Test each direction (top, right, bottom, left)
|
|
897
|
-
- Verify correct slide direction
|
|
898
|
-
- Ensure consistent timing across all directions
|
|
899
|
-
|
|
900
|
-
4. **Directive Behavior:**
|
|
901
|
-
- Host element receives correct classes
|
|
902
|
-
- Animation events fire on host
|
|
903
|
-
- data-state attribute updates correctly
|
|
904
|
-
|
|
905
|
-
5. **Edge Cases:**
|
|
906
|
-
- Rapid open/close
|
|
907
|
-
- Open during close animation
|
|
908
|
-
- Close during open animation
|
|
909
|
-
- Changing direction while open
|
|
910
|
-
|
|
911
|
-
6. **Cleanup:**
|
|
912
|
-
- No memory leaks
|
|
913
|
-
- Effects unsubscribe
|
|
914
|
-
- No hanging timeouts
|
|
915
|
-
|
|
916
|
-
### Testing Strategy
|
|
917
|
-
|
|
918
|
-
```typescript
|
|
919
|
-
// Example test structure
|
|
920
|
-
describe('Drawer Animations', () => {
|
|
921
|
-
it('should keep DOM mounted during close animation', async () => {
|
|
922
|
-
// Open drawer
|
|
923
|
-
provider.open.set(true);
|
|
924
|
-
fixture.detectChanges();
|
|
925
|
-
|
|
926
|
-
// Close drawer
|
|
927
|
-
provider.open.set(false);
|
|
928
|
-
fixture.detectChanges();
|
|
929
|
-
|
|
930
|
-
// Immediately after close - DOM should still exist
|
|
931
|
-
expect(overlayRef.hasAttached()).toBe(true);
|
|
932
|
-
|
|
933
|
-
// After animations complete - DOM should be removed
|
|
934
|
-
await delay(400); // Buffer for 300ms animation
|
|
935
|
-
expect(overlayRef.hasAttached()).toBe(false);
|
|
936
|
-
});
|
|
937
|
-
|
|
938
|
-
it('should slide from correct direction', () => {
|
|
939
|
-
provider.direction.set('left');
|
|
940
|
-
provider.open.set(true);
|
|
941
|
-
fixture.detectChanges();
|
|
942
|
-
|
|
943
|
-
const drawer = fixture.debugElement.query(By.css('[sc-drawer]'));
|
|
944
|
-
expect(drawer.nativeElement.classList.contains('slide-in-from-left')).toBe(true);
|
|
945
|
-
});
|
|
946
|
-
});
|
|
947
|
-
```
|
|
948
|
-
|
|
949
|
-
## Summary
|
|
950
|
-
|
|
951
|
-
The drawer animation architecture achieves smooth, reliable animations through:
|
|
952
|
-
|
|
953
|
-
1. **Two-signal pattern:** Separates intent (`open`) from DOM lifecycle (`overlayOpen`)
|
|
954
|
-
2. **Signal counter coordination:** Tracks completion of multiple animations (`animationsCompleted`)
|
|
955
|
-
3. **Event-driven completion:** Both drawer and backdrop explicitly signal when done
|
|
956
|
-
4. **Reactive updates:** Effects respond to state changes automatically
|
|
957
|
-
5. **Robust timing:** No assumptions, handles browser variations
|
|
958
|
-
6. **Centralized ownership:** Provider owns all lifecycle logic; portal directive is just a content marker
|
|
959
|
-
7. **Directional animations:** Dynamically applies correct slide direction based on `direction` input
|
|
960
|
-
8. **Directive pattern:** Lightweight, composable behavior attachment
|
|
961
|
-
|
|
962
|
-
This architecture provides:
|
|
963
|
-
|
|
964
|
-
- Reliable animation completion detection
|
|
965
|
-
- Clean separation of concerns
|
|
966
|
-
- Extensibility (easy to add more animations)
|
|
967
|
-
- No race conditions or timing assumptions
|
|
968
|
-
- Debuggable signal-based state
|
|
969
|
-
- Better user experience (smooth, never cut off)
|
|
970
|
-
- Flexible directional animations (top, right, bottom, left)
|
|
971
|
-
- Directive pattern for maximum flexibility
|
|
972
|
-
- Lazy content instantiation via `ng-template`
|