@ngbase/adk 0.1.17 → 0.1.19
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/ngbase-adk-a11y.mjs +42 -42
- package/fesm2022/ngbase-adk-a11y.mjs.map +1 -1
- package/fesm2022/ngbase-adk-accordion.mjs +20 -26
- package/fesm2022/ngbase-adk-accordion.mjs.map +1 -1
- package/fesm2022/ngbase-adk-autocomplete.mjs +11 -11
- package/fesm2022/ngbase-adk-autocomplete.mjs.map +1 -1
- package/fesm2022/ngbase-adk-avatar.mjs +13 -13
- package/fesm2022/ngbase-adk-avatar.mjs.map +1 -1
- package/fesm2022/ngbase-adk-bidi.mjs +3 -3
- package/fesm2022/ngbase-adk-bidi.mjs.map +1 -1
- package/fesm2022/ngbase-adk-breadcrumb.mjs +14 -14
- package/fesm2022/ngbase-adk-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngbase-adk-cache.mjs +3 -3
- package/fesm2022/ngbase-adk-cache.mjs.map +1 -1
- package/fesm2022/ngbase-adk-carousel.mjs +18 -18
- package/fesm2022/ngbase-adk-carousel.mjs.map +1 -1
- package/fesm2022/ngbase-adk-checkbox.mjs +15 -21
- package/fesm2022/ngbase-adk-checkbox.mjs.map +1 -1
- package/fesm2022/ngbase-adk-chip.mjs +12 -12
- package/fesm2022/ngbase-adk-chip.mjs.map +1 -1
- package/fesm2022/ngbase-adk-clipboard.mjs +7 -5
- package/fesm2022/ngbase-adk-clipboard.mjs.map +1 -1
- package/fesm2022/ngbase-adk-collections.mjs.map +1 -1
- package/fesm2022/ngbase-adk-color-picker.mjs +44 -53
- package/fesm2022/ngbase-adk-color-picker.mjs.map +1 -1
- package/fesm2022/ngbase-adk-cookies.mjs +3 -3
- package/fesm2022/ngbase-adk-cookies.mjs.map +1 -1
- package/fesm2022/ngbase-adk-datepicker.mjs +70 -89
- package/fesm2022/ngbase-adk-datepicker.mjs.map +1 -1
- package/fesm2022/ngbase-adk-dialog.mjs +17 -39
- package/fesm2022/ngbase-adk-dialog.mjs.map +1 -1
- package/fesm2022/ngbase-adk-drag.mjs +20 -20
- package/fesm2022/ngbase-adk-drag.mjs.map +1 -1
- package/fesm2022/ngbase-adk-form-field.mjs +65 -118
- package/fesm2022/ngbase-adk-form-field.mjs.map +1 -1
- package/fesm2022/ngbase-adk-hover-card.mjs +5 -5
- package/fesm2022/ngbase-adk-hover-card.mjs.map +1 -1
- package/fesm2022/ngbase-adk-icon.mjs +9 -11
- package/fesm2022/ngbase-adk-icon.mjs.map +1 -1
- package/fesm2022/ngbase-adk-inline-edit.mjs +27 -35
- package/fesm2022/ngbase-adk-inline-edit.mjs.map +1 -1
- package/fesm2022/ngbase-adk-jwt.mjs +6 -6
- package/fesm2022/ngbase-adk-jwt.mjs.map +1 -1
- package/fesm2022/ngbase-adk-keys.mjs +6 -6
- package/fesm2022/ngbase-adk-keys.mjs.map +1 -1
- package/fesm2022/ngbase-adk-layout.mjs.map +1 -1
- package/fesm2022/ngbase-adk-list.mjs +10 -10
- package/fesm2022/ngbase-adk-list.mjs.map +1 -1
- package/fesm2022/ngbase-adk-mask.mjs +8 -8
- package/fesm2022/ngbase-adk-mask.mjs.map +1 -1
- package/fesm2022/ngbase-adk-menu.mjs +69 -79
- package/fesm2022/ngbase-adk-menu.mjs.map +1 -1
- package/fesm2022/ngbase-adk-network.mjs +3 -3
- package/fesm2022/ngbase-adk-network.mjs.map +1 -1
- package/fesm2022/ngbase-adk-otp.mjs +24 -45
- package/fesm2022/ngbase-adk-otp.mjs.map +1 -1
- package/fesm2022/ngbase-adk-pagination.mjs +9 -9
- package/fesm2022/ngbase-adk-pagination.mjs.map +1 -1
- package/fesm2022/ngbase-adk-popover.mjs +120 -89
- package/fesm2022/ngbase-adk-popover.mjs.map +1 -1
- package/fesm2022/ngbase-adk-portal.mjs +139 -47
- package/fesm2022/ngbase-adk-portal.mjs.map +1 -1
- package/fesm2022/ngbase-adk-progress.mjs +7 -7
- package/fesm2022/ngbase-adk-progress.mjs.map +1 -1
- package/fesm2022/ngbase-adk-radio.mjs +20 -27
- package/fesm2022/ngbase-adk-radio.mjs.map +1 -1
- package/fesm2022/ngbase-adk-resizable.mjs +138 -48
- package/fesm2022/ngbase-adk-resizable.mjs.map +1 -1
- package/fesm2022/ngbase-adk-scroll-area.mjs +28 -20
- package/fesm2022/ngbase-adk-scroll-area.mjs.map +1 -1
- package/fesm2022/ngbase-adk-select.mjs +58 -80
- package/fesm2022/ngbase-adk-select.mjs.map +1 -1
- package/fesm2022/ngbase-adk-selectable.mjs +19 -30
- package/fesm2022/ngbase-adk-selectable.mjs.map +1 -1
- package/fesm2022/ngbase-adk-sheet.mjs +6 -20
- package/fesm2022/ngbase-adk-sheet.mjs.map +1 -1
- package/fesm2022/ngbase-adk-sidenav.mjs +65 -48
- package/fesm2022/ngbase-adk-sidenav.mjs.map +1 -1
- package/fesm2022/ngbase-adk-slider.mjs +40 -53
- package/fesm2022/ngbase-adk-slider.mjs.map +1 -1
- package/fesm2022/ngbase-adk-sonner.mjs +12 -19
- package/fesm2022/ngbase-adk-sonner.mjs.map +1 -1
- package/fesm2022/ngbase-adk-stepper.mjs +17 -25
- package/fesm2022/ngbase-adk-stepper.mjs.map +1 -1
- package/fesm2022/ngbase-adk-switch.mjs +25 -32
- package/fesm2022/ngbase-adk-switch.mjs.map +1 -1
- package/fesm2022/ngbase-adk-table.mjs +581 -83
- package/fesm2022/ngbase-adk-table.mjs.map +1 -1
- package/fesm2022/ngbase-adk-tabs.mjs +37 -35
- package/fesm2022/ngbase-adk-tabs.mjs.map +1 -1
- package/fesm2022/ngbase-adk-test.mjs.map +1 -1
- package/fesm2022/ngbase-adk-toggle-group.mjs +20 -34
- package/fesm2022/ngbase-adk-toggle-group.mjs.map +1 -1
- package/fesm2022/ngbase-adk-toggle.mjs +14 -19
- package/fesm2022/ngbase-adk-toggle.mjs.map +1 -1
- package/fesm2022/ngbase-adk-tooltip.mjs +12 -19
- package/fesm2022/ngbase-adk-tooltip.mjs.map +1 -1
- package/fesm2022/ngbase-adk-tour.mjs +47 -52
- package/fesm2022/ngbase-adk-tour.mjs.map +1 -1
- package/fesm2022/ngbase-adk-translate.mjs +8 -10
- package/fesm2022/ngbase-adk-translate.mjs.map +1 -1
- package/fesm2022/ngbase-adk-tree.mjs +20 -20
- package/fesm2022/ngbase-adk-tree.mjs.map +1 -1
- package/fesm2022/ngbase-adk-utils.mjs +30 -43
- package/fesm2022/ngbase-adk-utils.mjs.map +1 -1
- package/fesm2022/ngbase-adk-virtualizer.mjs +9 -9
- package/fesm2022/ngbase-adk-virtualizer.mjs.map +1 -1
- package/package.json +101 -101
- package/schematics/components/files/accordion/accordion.ts.template +10 -5
- package/schematics/components/files/audio/AudioPlayer.ts.template +245 -0
- package/schematics/components/files/audio/AudioRecorder.ts.template +377 -0
- package/schematics/components/files/audio/AudioVisualizer.ts.template +175 -0
- package/schematics/components/files/audio/index.ts.template +3 -0
- package/schematics/components/files/badge/badge-llm.md.template +2 -2
- package/schematics/components/files/badge/badge.ts.template +29 -9
- package/schematics/components/files/card/card.ts.template +1 -1
- package/schematics/components/files/charts/area-chart.component.ts.template +278 -0
- package/schematics/components/files/charts/bar-chart.component.ts.template +262 -0
- package/schematics/components/files/charts/chart-tooltip.component.ts.template +168 -0
- package/schematics/components/files/charts/index.ts.template +4 -0
- package/schematics/components/files/charts/line-chart.component.ts.template +238 -0
- package/schematics/components/files/charts/pie-chart.component.ts.template +283 -0
- package/schematics/components/files/checkbox/checkbox.ts.template +4 -7
- package/schematics/components/files/color-picker/color-picker.ts.template +2 -2
- package/schematics/components/files/dialog/dialog.ts.template +11 -14
- package/schematics/components/files/drawer/drawer.ts.template +25 -28
- package/schematics/components/files/form-field/form-field.ts.template +59 -23
- package/schematics/components/files/inline-edit/inline-edit.ts.template +3 -1
- package/schematics/components/files/pagination/pagination.ts.template +6 -6
- package/schematics/components/files/picasa/picasa-base.component.ts.template +9 -30
- package/schematics/components/files/popover/popover.ts.template +9 -4
- package/schematics/components/files/select/list-selection.ts.template +0 -2
- package/schematics/components/files/select/option.ts.template +1 -1
- package/schematics/components/files/selectable/selectable.ts.template +2 -2
- package/schematics/components/files/sheet/sheet.ts.template +20 -14
- package/schematics/components/files/sidenav/sidenav.ts.template +69 -6
- package/schematics/components/files/sonner/sonner.ts.template +1 -2
- package/schematics/components/files/stepper/stepper-llm.md.template +7 -0
- package/schematics/components/files/stepper/stepper.ts.template +2 -4
- package/schematics/components/files/switch/switch.ts.template +2 -2
- package/schematics/components/files/table/table-llm.md.template +14 -2
- package/schematics/components/files/table/table.ts.template +42 -3
- package/schematics/components/files/theme/theme.service.ts.template +3 -3
- package/schematics/components/files/toggle/toggle.ts.template +1 -1
- package/schematics/components/files/toggle-group/toggle-group.ts.template +1 -1
- package/schematics/components/files/tooltip/tooltip.ts.template +2 -3
- package/{accordion/index.d.ts → types/ngbase-adk-accordion.d.ts} +1 -3
- package/{autocomplete/index.d.ts → types/ngbase-adk-autocomplete.d.ts} +2 -7
- package/{checkbox/index.d.ts → types/ngbase-adk-checkbox.d.ts} +8 -14
- package/types/ngbase-adk-clipboard.d.ts +12 -0
- package/{color-picker/index.d.ts → types/ngbase-adk-color-picker.d.ts} +14 -26
- package/{datepicker/index.d.ts → types/ngbase-adk-datepicker.d.ts} +9 -18
- package/{dialog/index.d.ts → types/ngbase-adk-dialog.d.ts} +3 -8
- package/types/ngbase-adk-form-field.d.ts +88 -0
- package/{inline-edit/index.d.ts → types/ngbase-adk-inline-edit.d.ts} +8 -16
- package/{menu/index.d.ts → types/ngbase-adk-menu.d.ts} +6 -5
- package/{otp/index.d.ts → types/ngbase-adk-otp.d.ts} +8 -16
- package/{popover/index.d.ts → types/ngbase-adk-popover.d.ts} +14 -2
- package/{portal/index.d.ts → types/ngbase-adk-portal.d.ts} +30 -8
- package/{radio/index.d.ts → types/ngbase-adk-radio.d.ts} +9 -12
- package/{resizable/index.d.ts → types/ngbase-adk-resizable.d.ts} +4 -4
- package/{scroll-area/index.d.ts → types/ngbase-adk-scroll-area.d.ts} +2 -1
- package/{select/index.d.ts → types/ngbase-adk-select.d.ts} +8 -22
- package/{selectable/index.d.ts → types/ngbase-adk-selectable.d.ts} +6 -10
- package/{sheet/index.d.ts → types/ngbase-adk-sheet.d.ts} +4 -3
- package/{sidenav/index.d.ts → types/ngbase-adk-sidenav.d.ts} +7 -8
- package/{slider/index.d.ts → types/ngbase-adk-slider.d.ts} +8 -17
- package/{sonner/index.d.ts → types/ngbase-adk-sonner.d.ts} +1 -3
- package/{stepper/index.d.ts → types/ngbase-adk-stepper.d.ts} +1 -4
- package/{switch/index.d.ts → types/ngbase-adk-switch.d.ts} +7 -14
- package/{table/index.d.ts → types/ngbase-adk-table.d.ts} +126 -3
- package/{test/index.d.ts → types/ngbase-adk-test.d.ts} +1 -1
- package/{toggle-group/index.d.ts → types/ngbase-adk-toggle-group.d.ts} +5 -10
- package/types/ngbase-adk-toggle.d.ts +14 -0
- package/{tooltip/index.d.ts → types/ngbase-adk-tooltip.d.ts} +9 -11
- package/{tour/index.d.ts → types/ngbase-adk-tour.d.ts} +3 -6
- package/{utils/index.d.ts → types/ngbase-adk-utils.d.ts} +15 -11
- package/clipboard/index.d.ts +0 -11
- package/form-field/index.d.ts +0 -97
- package/toggle/index.d.ts +0 -16
- /package/{a11y/index.d.ts → types/ngbase-adk-a11y.d.ts} +0 -0
- /package/{avatar/index.d.ts → types/ngbase-adk-avatar.d.ts} +0 -0
- /package/{bidi/index.d.ts → types/ngbase-adk-bidi.d.ts} +0 -0
- /package/{breadcrumb/index.d.ts → types/ngbase-adk-breadcrumb.d.ts} +0 -0
- /package/{cache/index.d.ts → types/ngbase-adk-cache.d.ts} +0 -0
- /package/{carousel/index.d.ts → types/ngbase-adk-carousel.d.ts} +0 -0
- /package/{chip/index.d.ts → types/ngbase-adk-chip.d.ts} +0 -0
- /package/{collections/index.d.ts → types/ngbase-adk-collections.d.ts} +0 -0
- /package/{cookies/index.d.ts → types/ngbase-adk-cookies.d.ts} +0 -0
- /package/{drag/index.d.ts → types/ngbase-adk-drag.d.ts} +0 -0
- /package/{hover-card/index.d.ts → types/ngbase-adk-hover-card.d.ts} +0 -0
- /package/{icon/index.d.ts → types/ngbase-adk-icon.d.ts} +0 -0
- /package/{jwt/index.d.ts → types/ngbase-adk-jwt.d.ts} +0 -0
- /package/{keys/index.d.ts → types/ngbase-adk-keys.d.ts} +0 -0
- /package/{layout/index.d.ts → types/ngbase-adk-layout.d.ts} +0 -0
- /package/{list/index.d.ts → types/ngbase-adk-list.d.ts} +0 -0
- /package/{mask/index.d.ts → types/ngbase-adk-mask.d.ts} +0 -0
- /package/{network/index.d.ts → types/ngbase-adk-network.d.ts} +0 -0
- /package/{pagination/index.d.ts → types/ngbase-adk-pagination.d.ts} +0 -0
- /package/{progress/index.d.ts → types/ngbase-adk-progress.d.ts} +0 -0
- /package/{tabs/index.d.ts → types/ngbase-adk-tabs.d.ts} +0 -0
- /package/{translate/index.d.ts → types/ngbase-adk-translate.d.ts} +0 -0
- /package/{tree/index.d.ts → types/ngbase-adk-tree.d.ts} +0 -0
- /package/{virtualizer/index.d.ts → types/ngbase-adk-virtualizer.d.ts} +0 -0
- /package/{index.d.ts → types/ngbase-adk.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngbase/adk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/ng-base/ngbase.git"
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
"url": "https://github.com/ng-base/ngbase/issues"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"@angular/common": "^
|
|
17
|
-
"@angular/core": "^
|
|
18
|
-
"@angular/forms": "^
|
|
16
|
+
"@angular/common": "^21.0.0",
|
|
17
|
+
"@angular/core": "^21.0.0",
|
|
18
|
+
"@angular/forms": "^21.0.0"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"tslib": "^2.3.0"
|
|
@@ -23,233 +23,233 @@
|
|
|
23
23
|
"schematics": "./schematics/collection.json",
|
|
24
24
|
"sideEffects": false,
|
|
25
25
|
"module": "fesm2022/ngbase-adk.mjs",
|
|
26
|
-
"typings": "
|
|
26
|
+
"typings": "types/ngbase-adk.d.ts",
|
|
27
27
|
"exports": {
|
|
28
28
|
"./package.json": {
|
|
29
29
|
"default": "./package.json"
|
|
30
30
|
},
|
|
31
31
|
".": {
|
|
32
|
-
"types": "./
|
|
32
|
+
"types": "./types/ngbase-adk.d.ts",
|
|
33
33
|
"default": "./fesm2022/ngbase-adk.mjs"
|
|
34
34
|
},
|
|
35
35
|
"./a11y": {
|
|
36
|
-
"types": "./a11y
|
|
36
|
+
"types": "./types/ngbase-adk-a11y.d.ts",
|
|
37
37
|
"default": "./fesm2022/ngbase-adk-a11y.mjs"
|
|
38
38
|
},
|
|
39
39
|
"./accordion": {
|
|
40
|
-
"types": "./accordion
|
|
40
|
+
"types": "./types/ngbase-adk-accordion.d.ts",
|
|
41
41
|
"default": "./fesm2022/ngbase-adk-accordion.mjs"
|
|
42
42
|
},
|
|
43
|
+
"./autocomplete": {
|
|
44
|
+
"types": "./types/ngbase-adk-autocomplete.d.ts",
|
|
45
|
+
"default": "./fesm2022/ngbase-adk-autocomplete.mjs"
|
|
46
|
+
},
|
|
43
47
|
"./avatar": {
|
|
44
|
-
"types": "./avatar
|
|
48
|
+
"types": "./types/ngbase-adk-avatar.d.ts",
|
|
45
49
|
"default": "./fesm2022/ngbase-adk-avatar.mjs"
|
|
46
50
|
},
|
|
47
51
|
"./bidi": {
|
|
48
|
-
"types": "./bidi
|
|
52
|
+
"types": "./types/ngbase-adk-bidi.d.ts",
|
|
49
53
|
"default": "./fesm2022/ngbase-adk-bidi.mjs"
|
|
50
54
|
},
|
|
51
|
-
"./
|
|
52
|
-
"types": "./
|
|
53
|
-
"default": "./fesm2022/ngbase-adk-
|
|
55
|
+
"./breadcrumb": {
|
|
56
|
+
"types": "./types/ngbase-adk-breadcrumb.d.ts",
|
|
57
|
+
"default": "./fesm2022/ngbase-adk-breadcrumb.mjs"
|
|
54
58
|
},
|
|
55
59
|
"./cache": {
|
|
56
|
-
"types": "./cache
|
|
60
|
+
"types": "./types/ngbase-adk-cache.d.ts",
|
|
57
61
|
"default": "./fesm2022/ngbase-adk-cache.mjs"
|
|
58
62
|
},
|
|
59
|
-
"./breadcrumb": {
|
|
60
|
-
"types": "./breadcrumb/index.d.ts",
|
|
61
|
-
"default": "./fesm2022/ngbase-adk-breadcrumb.mjs"
|
|
62
|
-
},
|
|
63
63
|
"./carousel": {
|
|
64
|
-
"types": "./carousel
|
|
64
|
+
"types": "./types/ngbase-adk-carousel.d.ts",
|
|
65
65
|
"default": "./fesm2022/ngbase-adk-carousel.mjs"
|
|
66
66
|
},
|
|
67
67
|
"./checkbox": {
|
|
68
|
-
"types": "./checkbox
|
|
68
|
+
"types": "./types/ngbase-adk-checkbox.d.ts",
|
|
69
69
|
"default": "./fesm2022/ngbase-adk-checkbox.mjs"
|
|
70
70
|
},
|
|
71
71
|
"./chip": {
|
|
72
|
-
"types": "./chip
|
|
72
|
+
"types": "./types/ngbase-adk-chip.d.ts",
|
|
73
73
|
"default": "./fesm2022/ngbase-adk-chip.mjs"
|
|
74
74
|
},
|
|
75
|
-
"./collections": {
|
|
76
|
-
"types": "./collections/index.d.ts",
|
|
77
|
-
"default": "./fesm2022/ngbase-adk-collections.mjs"
|
|
78
|
-
},
|
|
79
75
|
"./clipboard": {
|
|
80
|
-
"types": "./clipboard
|
|
76
|
+
"types": "./types/ngbase-adk-clipboard.d.ts",
|
|
81
77
|
"default": "./fesm2022/ngbase-adk-clipboard.mjs"
|
|
82
78
|
},
|
|
83
|
-
"./
|
|
84
|
-
"types": "./
|
|
85
|
-
"default": "./fesm2022/ngbase-adk-
|
|
79
|
+
"./collections": {
|
|
80
|
+
"types": "./types/ngbase-adk-collections.d.ts",
|
|
81
|
+
"default": "./fesm2022/ngbase-adk-collections.mjs"
|
|
86
82
|
},
|
|
87
83
|
"./color-picker": {
|
|
88
|
-
"types": "./color-picker
|
|
84
|
+
"types": "./types/ngbase-adk-color-picker.d.ts",
|
|
89
85
|
"default": "./fesm2022/ngbase-adk-color-picker.mjs"
|
|
90
86
|
},
|
|
87
|
+
"./cookies": {
|
|
88
|
+
"types": "./types/ngbase-adk-cookies.d.ts",
|
|
89
|
+
"default": "./fesm2022/ngbase-adk-cookies.mjs"
|
|
90
|
+
},
|
|
91
91
|
"./datepicker": {
|
|
92
|
-
"types": "./datepicker
|
|
92
|
+
"types": "./types/ngbase-adk-datepicker.d.ts",
|
|
93
93
|
"default": "./fesm2022/ngbase-adk-datepicker.mjs"
|
|
94
94
|
},
|
|
95
95
|
"./dialog": {
|
|
96
|
-
"types": "./dialog
|
|
96
|
+
"types": "./types/ngbase-adk-dialog.d.ts",
|
|
97
97
|
"default": "./fesm2022/ngbase-adk-dialog.mjs"
|
|
98
98
|
},
|
|
99
|
-
"./hover-card": {
|
|
100
|
-
"types": "./hover-card/index.d.ts",
|
|
101
|
-
"default": "./fesm2022/ngbase-adk-hover-card.mjs"
|
|
102
|
-
},
|
|
103
99
|
"./drag": {
|
|
104
|
-
"types": "./drag
|
|
100
|
+
"types": "./types/ngbase-adk-drag.d.ts",
|
|
105
101
|
"default": "./fesm2022/ngbase-adk-drag.mjs"
|
|
106
102
|
},
|
|
107
103
|
"./form-field": {
|
|
108
|
-
"types": "./form-field
|
|
104
|
+
"types": "./types/ngbase-adk-form-field.d.ts",
|
|
109
105
|
"default": "./fesm2022/ngbase-adk-form-field.mjs"
|
|
110
106
|
},
|
|
107
|
+
"./hover-card": {
|
|
108
|
+
"types": "./types/ngbase-adk-hover-card.d.ts",
|
|
109
|
+
"default": "./fesm2022/ngbase-adk-hover-card.mjs"
|
|
110
|
+
},
|
|
111
111
|
"./icon": {
|
|
112
|
-
"types": "./icon
|
|
112
|
+
"types": "./types/ngbase-adk-icon.d.ts",
|
|
113
113
|
"default": "./fesm2022/ngbase-adk-icon.mjs"
|
|
114
114
|
},
|
|
115
|
-
"./jwt": {
|
|
116
|
-
"types": "./jwt/index.d.ts",
|
|
117
|
-
"default": "./fesm2022/ngbase-adk-jwt.mjs"
|
|
118
|
-
},
|
|
119
115
|
"./inline-edit": {
|
|
120
|
-
"types": "./inline-edit
|
|
116
|
+
"types": "./types/ngbase-adk-inline-edit.d.ts",
|
|
121
117
|
"default": "./fesm2022/ngbase-adk-inline-edit.mjs"
|
|
122
118
|
},
|
|
119
|
+
"./jwt": {
|
|
120
|
+
"types": "./types/ngbase-adk-jwt.d.ts",
|
|
121
|
+
"default": "./fesm2022/ngbase-adk-jwt.mjs"
|
|
122
|
+
},
|
|
123
123
|
"./keys": {
|
|
124
|
-
"types": "./keys
|
|
124
|
+
"types": "./types/ngbase-adk-keys.d.ts",
|
|
125
125
|
"default": "./fesm2022/ngbase-adk-keys.mjs"
|
|
126
126
|
},
|
|
127
127
|
"./layout": {
|
|
128
|
-
"types": "./layout
|
|
128
|
+
"types": "./types/ngbase-adk-layout.d.ts",
|
|
129
129
|
"default": "./fesm2022/ngbase-adk-layout.mjs"
|
|
130
130
|
},
|
|
131
131
|
"./list": {
|
|
132
|
-
"types": "./list
|
|
132
|
+
"types": "./types/ngbase-adk-list.d.ts",
|
|
133
133
|
"default": "./fesm2022/ngbase-adk-list.mjs"
|
|
134
134
|
},
|
|
135
|
-
"./menu": {
|
|
136
|
-
"types": "./menu/index.d.ts",
|
|
137
|
-
"default": "./fesm2022/ngbase-adk-menu.mjs"
|
|
138
|
-
},
|
|
139
135
|
"./mask": {
|
|
140
|
-
"types": "./mask
|
|
136
|
+
"types": "./types/ngbase-adk-mask.d.ts",
|
|
141
137
|
"default": "./fesm2022/ngbase-adk-mask.mjs"
|
|
142
138
|
},
|
|
139
|
+
"./menu": {
|
|
140
|
+
"types": "./types/ngbase-adk-menu.d.ts",
|
|
141
|
+
"default": "./fesm2022/ngbase-adk-menu.mjs"
|
|
142
|
+
},
|
|
143
143
|
"./network": {
|
|
144
|
-
"types": "./network
|
|
144
|
+
"types": "./types/ngbase-adk-network.d.ts",
|
|
145
145
|
"default": "./fesm2022/ngbase-adk-network.mjs"
|
|
146
146
|
},
|
|
147
147
|
"./otp": {
|
|
148
|
-
"types": "./otp
|
|
148
|
+
"types": "./types/ngbase-adk-otp.d.ts",
|
|
149
149
|
"default": "./fesm2022/ngbase-adk-otp.mjs"
|
|
150
150
|
},
|
|
151
|
-
"./popover": {
|
|
152
|
-
"types": "./popover/index.d.ts",
|
|
153
|
-
"default": "./fesm2022/ngbase-adk-popover.mjs"
|
|
154
|
-
},
|
|
155
151
|
"./pagination": {
|
|
156
|
-
"types": "./pagination
|
|
152
|
+
"types": "./types/ngbase-adk-pagination.d.ts",
|
|
157
153
|
"default": "./fesm2022/ngbase-adk-pagination.mjs"
|
|
158
154
|
},
|
|
155
|
+
"./popover": {
|
|
156
|
+
"types": "./types/ngbase-adk-popover.d.ts",
|
|
157
|
+
"default": "./fesm2022/ngbase-adk-popover.mjs"
|
|
158
|
+
},
|
|
159
159
|
"./portal": {
|
|
160
|
-
"types": "./portal
|
|
160
|
+
"types": "./types/ngbase-adk-portal.d.ts",
|
|
161
161
|
"default": "./fesm2022/ngbase-adk-portal.mjs"
|
|
162
162
|
},
|
|
163
|
-
"./radio": {
|
|
164
|
-
"types": "./radio/index.d.ts",
|
|
165
|
-
"default": "./fesm2022/ngbase-adk-radio.mjs"
|
|
166
|
-
},
|
|
167
163
|
"./progress": {
|
|
168
|
-
"types": "./progress
|
|
164
|
+
"types": "./types/ngbase-adk-progress.d.ts",
|
|
169
165
|
"default": "./fesm2022/ngbase-adk-progress.mjs"
|
|
170
166
|
},
|
|
167
|
+
"./radio": {
|
|
168
|
+
"types": "./types/ngbase-adk-radio.d.ts",
|
|
169
|
+
"default": "./fesm2022/ngbase-adk-radio.mjs"
|
|
170
|
+
},
|
|
171
171
|
"./resizable": {
|
|
172
|
-
"types": "./resizable
|
|
172
|
+
"types": "./types/ngbase-adk-resizable.d.ts",
|
|
173
173
|
"default": "./fesm2022/ngbase-adk-resizable.mjs"
|
|
174
174
|
},
|
|
175
175
|
"./scroll-area": {
|
|
176
|
-
"types": "./scroll-area
|
|
176
|
+
"types": "./types/ngbase-adk-scroll-area.d.ts",
|
|
177
177
|
"default": "./fesm2022/ngbase-adk-scroll-area.mjs"
|
|
178
178
|
},
|
|
179
|
-
"./selectable": {
|
|
180
|
-
"types": "./selectable/index.d.ts",
|
|
181
|
-
"default": "./fesm2022/ngbase-adk-selectable.mjs"
|
|
182
|
-
},
|
|
183
179
|
"./select": {
|
|
184
|
-
"types": "./select
|
|
180
|
+
"types": "./types/ngbase-adk-select.d.ts",
|
|
185
181
|
"default": "./fesm2022/ngbase-adk-select.mjs"
|
|
186
182
|
},
|
|
183
|
+
"./selectable": {
|
|
184
|
+
"types": "./types/ngbase-adk-selectable.d.ts",
|
|
185
|
+
"default": "./fesm2022/ngbase-adk-selectable.mjs"
|
|
186
|
+
},
|
|
187
187
|
"./sheet": {
|
|
188
|
-
"types": "./sheet
|
|
188
|
+
"types": "./types/ngbase-adk-sheet.d.ts",
|
|
189
189
|
"default": "./fesm2022/ngbase-adk-sheet.mjs"
|
|
190
190
|
},
|
|
191
|
-
"./slider": {
|
|
192
|
-
"types": "./slider/index.d.ts",
|
|
193
|
-
"default": "./fesm2022/ngbase-adk-slider.mjs"
|
|
194
|
-
},
|
|
195
191
|
"./sidenav": {
|
|
196
|
-
"types": "./sidenav
|
|
192
|
+
"types": "./types/ngbase-adk-sidenav.d.ts",
|
|
197
193
|
"default": "./fesm2022/ngbase-adk-sidenav.mjs"
|
|
198
194
|
},
|
|
195
|
+
"./slider": {
|
|
196
|
+
"types": "./types/ngbase-adk-slider.d.ts",
|
|
197
|
+
"default": "./fesm2022/ngbase-adk-slider.mjs"
|
|
198
|
+
},
|
|
199
199
|
"./sonner": {
|
|
200
|
-
"types": "./sonner
|
|
200
|
+
"types": "./types/ngbase-adk-sonner.d.ts",
|
|
201
201
|
"default": "./fesm2022/ngbase-adk-sonner.mjs"
|
|
202
202
|
},
|
|
203
203
|
"./stepper": {
|
|
204
|
-
"types": "./stepper
|
|
204
|
+
"types": "./types/ngbase-adk-stepper.d.ts",
|
|
205
205
|
"default": "./fesm2022/ngbase-adk-stepper.mjs"
|
|
206
206
|
},
|
|
207
207
|
"./switch": {
|
|
208
|
-
"types": "./switch
|
|
208
|
+
"types": "./types/ngbase-adk-switch.d.ts",
|
|
209
209
|
"default": "./fesm2022/ngbase-adk-switch.mjs"
|
|
210
210
|
},
|
|
211
|
-
"./tabs": {
|
|
212
|
-
"types": "./tabs/index.d.ts",
|
|
213
|
-
"default": "./fesm2022/ngbase-adk-tabs.mjs"
|
|
214
|
-
},
|
|
215
211
|
"./table": {
|
|
216
|
-
"types": "./table
|
|
212
|
+
"types": "./types/ngbase-adk-table.d.ts",
|
|
217
213
|
"default": "./fesm2022/ngbase-adk-table.mjs"
|
|
218
214
|
},
|
|
215
|
+
"./tabs": {
|
|
216
|
+
"types": "./types/ngbase-adk-tabs.d.ts",
|
|
217
|
+
"default": "./fesm2022/ngbase-adk-tabs.mjs"
|
|
218
|
+
},
|
|
219
219
|
"./test": {
|
|
220
|
-
"types": "./test
|
|
220
|
+
"types": "./types/ngbase-adk-test.d.ts",
|
|
221
221
|
"default": "./fesm2022/ngbase-adk-test.mjs"
|
|
222
222
|
},
|
|
223
223
|
"./toggle": {
|
|
224
|
-
"types": "./toggle
|
|
224
|
+
"types": "./types/ngbase-adk-toggle.d.ts",
|
|
225
225
|
"default": "./fesm2022/ngbase-adk-toggle.mjs"
|
|
226
226
|
},
|
|
227
227
|
"./toggle-group": {
|
|
228
|
-
"types": "./toggle-group
|
|
228
|
+
"types": "./types/ngbase-adk-toggle-group.d.ts",
|
|
229
229
|
"default": "./fesm2022/ngbase-adk-toggle-group.mjs"
|
|
230
230
|
},
|
|
231
|
-
"./translate": {
|
|
232
|
-
"types": "./translate/index.d.ts",
|
|
233
|
-
"default": "./fesm2022/ngbase-adk-translate.mjs"
|
|
234
|
-
},
|
|
235
231
|
"./tooltip": {
|
|
236
|
-
"types": "./tooltip
|
|
232
|
+
"types": "./types/ngbase-adk-tooltip.d.ts",
|
|
237
233
|
"default": "./fesm2022/ngbase-adk-tooltip.mjs"
|
|
238
234
|
},
|
|
239
|
-
"./tree": {
|
|
240
|
-
"types": "./tree/index.d.ts",
|
|
241
|
-
"default": "./fesm2022/ngbase-adk-tree.mjs"
|
|
242
|
-
},
|
|
243
235
|
"./tour": {
|
|
244
|
-
"types": "./tour
|
|
236
|
+
"types": "./types/ngbase-adk-tour.d.ts",
|
|
245
237
|
"default": "./fesm2022/ngbase-adk-tour.mjs"
|
|
246
238
|
},
|
|
239
|
+
"./translate": {
|
|
240
|
+
"types": "./types/ngbase-adk-translate.d.ts",
|
|
241
|
+
"default": "./fesm2022/ngbase-adk-translate.mjs"
|
|
242
|
+
},
|
|
243
|
+
"./tree": {
|
|
244
|
+
"types": "./types/ngbase-adk-tree.d.ts",
|
|
245
|
+
"default": "./fesm2022/ngbase-adk-tree.mjs"
|
|
246
|
+
},
|
|
247
247
|
"./utils": {
|
|
248
|
-
"types": "./utils
|
|
248
|
+
"types": "./types/ngbase-adk-utils.d.ts",
|
|
249
249
|
"default": "./fesm2022/ngbase-adk-utils.mjs"
|
|
250
250
|
},
|
|
251
251
|
"./virtualizer": {
|
|
252
|
-
"types": "./virtualizer
|
|
252
|
+
"types": "./types/ngbase-adk-virtualizer.d.ts",
|
|
253
253
|
"default": "./fesm2022/ngbase-adk-virtualizer.mjs"
|
|
254
254
|
}
|
|
255
255
|
}
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
NgbAccordionContent,
|
|
6
6
|
NgbAccordionGroup,
|
|
7
7
|
NgbAccordionHeader,
|
|
8
|
-
slideAnimation,
|
|
9
8
|
} from '@ngbase/adk/accordion';
|
|
10
9
|
|
|
11
10
|
@Component({
|
|
@@ -28,9 +27,16 @@ export class AccordionGroup {}
|
|
|
28
27
|
template: `
|
|
29
28
|
<ng-content select="[<%= name %>AccordionHeader]" />
|
|
30
29
|
@if (expanded()) {
|
|
31
|
-
<div
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
<div
|
|
31
|
+
ngbAccordionContent
|
|
32
|
+
class="grid overflow-hidden"
|
|
33
|
+
animate.enter="height-enter"
|
|
34
|
+
animate.leave="height-leave"
|
|
35
|
+
>
|
|
36
|
+
<div class="min-h-0">
|
|
37
|
+
<div class="px-3 pb-4">
|
|
38
|
+
<ng-content />
|
|
39
|
+
</div>
|
|
34
40
|
</div>
|
|
35
41
|
</div>
|
|
36
42
|
}
|
|
@@ -38,7 +44,6 @@ export class AccordionGroup {}
|
|
|
38
44
|
host: {
|
|
39
45
|
class: 'block will-change-auto [&:not(:last-child)]:border-b',
|
|
40
46
|
},
|
|
41
|
-
animations: [slideAnimation],
|
|
42
47
|
})
|
|
43
48
|
export class Accordion extends NgbAccordion {}
|
|
44
49
|
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangeDetectionStrategy,
|
|
3
|
+
Component,
|
|
4
|
+
computed,
|
|
5
|
+
signal,
|
|
6
|
+
ElementRef,
|
|
7
|
+
viewChild,
|
|
8
|
+
input,
|
|
9
|
+
output,
|
|
10
|
+
OnDestroy,
|
|
11
|
+
effect,
|
|
12
|
+
untracked,
|
|
13
|
+
} from '@angular/core';
|
|
14
|
+
import { AudioVisualizer } from './AudioVisualizer';
|
|
15
|
+
import { provideIcons } from '@ng-icons/core';
|
|
16
|
+
import { lucidePause, lucidePlay } from '@ng-icons/lucide';
|
|
17
|
+
import { Icon } from '<%= basepath %>/icon';
|
|
18
|
+
import { Button } from '<%= basepath %>/button';
|
|
19
|
+
|
|
20
|
+
export type AudioState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused';
|
|
21
|
+
|
|
22
|
+
@Component({
|
|
23
|
+
selector: '<%= name %>-audio-player',
|
|
24
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
25
|
+
viewProviders: [provideIcons({ lucidePlay, lucidePause })],
|
|
26
|
+
imports: [AudioVisualizer, Icon, Button],
|
|
27
|
+
template: `
|
|
28
|
+
<div class="bg-card flex items-center gap-1 rounded-xl border">
|
|
29
|
+
<!-- Play/Pause Button -->
|
|
30
|
+
<button
|
|
31
|
+
(click)="handlePlayClick()"
|
|
32
|
+
<%= name %>Button="secondary"
|
|
33
|
+
[disabled]="state() === 'idle' || state() === 'loading'"
|
|
34
|
+
[attr.aria-label]="state() === 'playing' ? 'Pause Audio' : 'Play Audio'"
|
|
35
|
+
class="m-1 aspect-square !px-1"
|
|
36
|
+
>
|
|
37
|
+
<<%= name %>-icon [name]="state() === 'playing' ? 'lucidePause' : 'lucidePlay'" />
|
|
38
|
+
</button>
|
|
39
|
+
|
|
40
|
+
<!-- Visualizer -->
|
|
41
|
+
<div
|
|
42
|
+
class="group relative h-8 flex-grow cursor-pointer overflow-hidden rounded-lg"
|
|
43
|
+
(click)="seekOnWaveform($event)"
|
|
44
|
+
>
|
|
45
|
+
<app-audio-visualizer
|
|
46
|
+
[audioBuffer]="decodedAudioBuffer()"
|
|
47
|
+
[progress]="playbackProgress()"
|
|
48
|
+
/>
|
|
49
|
+
@if (state() === 'loading') {
|
|
50
|
+
<div class="bg-muted/80 absolute inset-0 flex items-center justify-center">
|
|
51
|
+
<p class="text-muted-foreground text-sm font-medium">Loading...</p>
|
|
52
|
+
</div>
|
|
53
|
+
}
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<!-- Hidden audio element for playback -->
|
|
58
|
+
<audio
|
|
59
|
+
#audioPlayer
|
|
60
|
+
[src]="audioUrl()"
|
|
61
|
+
(loadedmetadata)="updateDuration()"
|
|
62
|
+
(ended)="onPlaybackEnded()"
|
|
63
|
+
></audio>
|
|
64
|
+
`,
|
|
65
|
+
host: {
|
|
66
|
+
class: 'block w-full',
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
export class AudioPlayer implements OnDestroy {
|
|
70
|
+
readonly audioPlayer = viewChild.required<ElementRef<HTMLAudioElement>>('audioPlayer');
|
|
71
|
+
|
|
72
|
+
// Input for audio file
|
|
73
|
+
readonly file = input<File | null>(null);
|
|
74
|
+
readonly volume = input(0.7);
|
|
75
|
+
|
|
76
|
+
// Internal state
|
|
77
|
+
readonly currentTime = signal(0);
|
|
78
|
+
readonly duration = signal(0);
|
|
79
|
+
readonly state = signal<AudioState>('idle');
|
|
80
|
+
readonly audioUrl = signal<string | null>(null);
|
|
81
|
+
readonly decodedAudioBuffer = signal<AudioBuffer | null>(null);
|
|
82
|
+
readonly error = signal<string | null>(null);
|
|
83
|
+
|
|
84
|
+
// Outputs to emit time updates to parent component
|
|
85
|
+
readonly currentTimeChange = output<number>();
|
|
86
|
+
readonly durationChange = output<number>();
|
|
87
|
+
readonly errorChange = output<string | null>();
|
|
88
|
+
|
|
89
|
+
private animationFrameId: number | null = null;
|
|
90
|
+
private audioContext: AudioContext | null = null;
|
|
91
|
+
|
|
92
|
+
readonly playbackProgress = computed(() =>
|
|
93
|
+
this.duration() > 0 ? this.currentTime() / this.duration() : 0,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
constructor() {
|
|
97
|
+
// Watch for file changes and load the audio
|
|
98
|
+
effect(() => {
|
|
99
|
+
const fileToLoad = this.file();
|
|
100
|
+
console.log('fileToLoad ', fileToLoad);
|
|
101
|
+
if (fileToLoad) {
|
|
102
|
+
untracked(() => this.loadAudioFile(fileToLoad));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async handlePlayClick(): Promise<void> {
|
|
108
|
+
const player = this.audioPlayer().nativeElement;
|
|
109
|
+
const currentState = this.state();
|
|
110
|
+
|
|
111
|
+
if (currentState === 'playing') {
|
|
112
|
+
this.pausePlayback(player);
|
|
113
|
+
this.stopAnimationLoop();
|
|
114
|
+
} else if (currentState === 'ready' || currentState === 'paused') {
|
|
115
|
+
await this.startPlayback(player);
|
|
116
|
+
if (this.state() === 'playing') {
|
|
117
|
+
this.startAnimationLoop();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
seekOnWaveform(event: MouseEvent): void {
|
|
123
|
+
const player = this.audioPlayer().nativeElement;
|
|
124
|
+
if (!player.duration) return;
|
|
125
|
+
|
|
126
|
+
const target = event.currentTarget as HTMLElement;
|
|
127
|
+
const rect = target.getBoundingClientRect();
|
|
128
|
+
const x = event.clientX - rect.left;
|
|
129
|
+
const percentage = x / rect.width;
|
|
130
|
+
player.currentTime = percentage * player.duration;
|
|
131
|
+
this.currentTime.set(player.currentTime);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
updateDuration(): void {
|
|
135
|
+
const player = this.audioPlayer().nativeElement;
|
|
136
|
+
this.duration.set(player.duration);
|
|
137
|
+
this.durationChange.emit(player.duration);
|
|
138
|
+
player.volume = this.volume();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
onPlaybackEnded(): void {
|
|
142
|
+
this.state.set('ready');
|
|
143
|
+
this.stopAnimationLoop();
|
|
144
|
+
this.currentTime.set(0);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
ngOnDestroy(): void {
|
|
148
|
+
this.stopAnimationLoop();
|
|
149
|
+
if (this.audioUrl()) {
|
|
150
|
+
URL.revokeObjectURL(this.audioUrl()!);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private initializeAudioContext(): void {
|
|
155
|
+
if (!this.audioContext) {
|
|
156
|
+
try {
|
|
157
|
+
this.audioContext = new AudioContext();
|
|
158
|
+
} catch (e) {
|
|
159
|
+
const errorMsg = 'Web Audio API is not supported by this browser.';
|
|
160
|
+
this.error.set(errorMsg);
|
|
161
|
+
this.errorChange.emit(errorMsg);
|
|
162
|
+
console.error(e);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private async loadAudioFile(file: File): Promise<void> {
|
|
168
|
+
this.state.set('loading');
|
|
169
|
+
this.error.set(null);
|
|
170
|
+
this.decodedAudioBuffer.set(null);
|
|
171
|
+
this.currentTime.set(0);
|
|
172
|
+
this.duration.set(0);
|
|
173
|
+
this.initializeAudioContext();
|
|
174
|
+
|
|
175
|
+
if (!this.audioContext) {
|
|
176
|
+
const errorMsg = 'Could not initialize audio context.';
|
|
177
|
+
this.error.set(errorMsg);
|
|
178
|
+
this.errorChange.emit(errorMsg);
|
|
179
|
+
this.state.set('idle');
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (this.audioUrl()) {
|
|
184
|
+
URL.revokeObjectURL(this.audioUrl()!);
|
|
185
|
+
}
|
|
186
|
+
const url = URL.createObjectURL(file);
|
|
187
|
+
this.audioUrl.set(url);
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
const arrayBuffer = await file.arrayBuffer();
|
|
191
|
+
const buffer = await this.audioContext.decodeAudioData(arrayBuffer);
|
|
192
|
+
this.decodedAudioBuffer.set(buffer);
|
|
193
|
+
this.state.set('ready');
|
|
194
|
+
} catch (e) {
|
|
195
|
+
console.error('Error decoding audio file:', e);
|
|
196
|
+
const errorMsg =
|
|
197
|
+
'Failed to process the audio file. It may be corrupt or in an unsupported format.';
|
|
198
|
+
this.error.set(errorMsg);
|
|
199
|
+
this.errorChange.emit(errorMsg);
|
|
200
|
+
this.state.set('idle');
|
|
201
|
+
this.audioUrl.set(null);
|
|
202
|
+
URL.revokeObjectURL(url);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private async startPlayback(audioElement: HTMLAudioElement): Promise<void> {
|
|
207
|
+
if (this.state() === 'ready' || this.state() === 'paused') {
|
|
208
|
+
try {
|
|
209
|
+
await audioElement.play();
|
|
210
|
+
this.state.set('playing');
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.error('Playback failed:', error);
|
|
213
|
+
const errorMsg = 'Could not play audio.';
|
|
214
|
+
this.error.set(errorMsg);
|
|
215
|
+
this.errorChange.emit(errorMsg);
|
|
216
|
+
this.state.set('ready');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private pausePlayback(audioElement: HTMLAudioElement): void {
|
|
222
|
+
if (this.state() === 'playing') {
|
|
223
|
+
audioElement.pause();
|
|
224
|
+
this.state.set('paused');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
private startAnimationLoop(): void {
|
|
229
|
+
const player = this.audioPlayer().nativeElement;
|
|
230
|
+
const animate = () => {
|
|
231
|
+
const time = player.currentTime;
|
|
232
|
+
this.currentTime.set(time);
|
|
233
|
+
this.currentTimeChange.emit(time);
|
|
234
|
+
this.animationFrameId = requestAnimationFrame(animate);
|
|
235
|
+
};
|
|
236
|
+
animate();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private stopAnimationLoop(): void {
|
|
240
|
+
if (this.animationFrameId) {
|
|
241
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
242
|
+
this.animationFrameId = null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|