sveltekit-ui 1.1.17 → 1.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/dist/Components/Alert/index.svelte +88 -0
- package/dist/Components/Alert/index.svelte.js +101 -0
- package/dist/Components/ArrowToggle/index.svelte +62 -0
- package/dist/Components/Attachment/index.svelte +77 -0
- package/dist/Components/Attachment/index.svelte.js +119 -0
- package/dist/Components/Audio/index.svelte +193 -0
- package/dist/Components/Audio/index.svelte.js +463 -0
- package/dist/Components/AudioEditor/index.svelte +252 -0
- package/dist/Components/AudioEditor/index.svelte.js +977 -0
- package/dist/Components/AudioEditor/samples/alloy-voice-sample.mp3 +0 -0
- package/dist/Components/AudioEditor/samples/echo-voice-sample.mp3 +0 -0
- package/dist/Components/AudioEditor/samples/fable-voice-sample.mp3 +0 -0
- package/dist/Components/AudioEditor/samples/nova-voice-sample.mp3 +0 -0
- package/dist/Components/AudioEditor/samples/onyx-voice-sample.mp3 +0 -0
- package/dist/Components/AudioEditor/samples/shimmer-voice-sample.mp3 +0 -0
- package/dist/Components/AuthCodeInput/index.svelte +85 -0
- package/dist/Components/AuthCodeInput/index.svelte.js +95 -0
- package/dist/Components/Breadcrumbs/index.svelte +27 -0
- package/dist/Components/Breadcrumbs/index.svelte.js +88 -0
- package/dist/Components/Button/index.svelte +721 -0
- package/dist/Components/Button/index.svelte.js +375 -0
- package/dist/Components/Chart/Klines/index.svelte +87 -0
- package/dist/Components/Chart/index.svelte +226 -0
- package/dist/Components/Chart/index.svelte.js +1099 -0
- package/dist/Components/ChartInput/DisplayNav/Klines/index.svelte +150 -0
- package/dist/Components/ChartInput/DisplayNav/Lines/index.svelte +45 -0
- package/dist/Components/ChartInput/DisplayNav/index.svelte +297 -0
- package/dist/Components/ChartInput/EditPanel/index.svelte +155 -0
- package/dist/Components/ChartInput/index.svelte +21 -0
- package/dist/Components/ChartInput/index.svelte.js +671 -0
- package/dist/Components/Checkbox/index.svelte +411 -0
- package/dist/Components/Checkbox/index.svelte.js +178 -0
- package/dist/Components/Code/index.svelte +23 -0
- package/dist/Components/Code/index.svelte.js +33 -0
- package/dist/Components/Color/index.svelte +51 -0
- package/dist/Components/Color/index.svelte.js +31 -0
- package/dist/Components/ColorInput/ChromaPicker/index.svelte +50 -0
- package/dist/Components/ColorInput/ColorPalette/index.svelte +62 -0
- package/dist/Components/ColorInput/OpacityPicker/index.svelte +68 -0
- package/dist/Components/ColorInput/ShowcasePicker/index.svelte +136 -0
- package/dist/Components/ColorInput/index.svelte +70 -0
- package/dist/Components/ColorInput/index.svelte.js +386 -0
- package/dist/Components/ConditionsInput/index.svelte +46 -0
- package/dist/Components/ConditionsInput/index.svelte.js +201 -0
- package/dist/Components/Confetti/index.svelte +98 -0
- package/dist/Components/Confetti/index.svelte.js +94 -0
- package/dist/Components/Content/index.svelte +500 -0
- package/dist/Components/Content/index.svelte.js +910 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte +31 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte.js +258 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte +31 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte.js +258 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte +58 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte.js +206 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte +28 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte.js +224 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte +44 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte.js +272 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte +41 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte.js +202 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte +19 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte.js +117 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte +60 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte.js +542 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte +47 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte.js +185 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte +35 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte.js +222 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte +20 -0
- package/dist/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte.js +84 -0
- package/dist/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte +25 -0
- package/dist/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte.js +91 -0
- package/dist/Components/ContentInput/AttributesInput/index.svelte +352 -0
- package/dist/Components/ContentInput/AttributesInput/index.svelte.js +1436 -0
- package/dist/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte +64 -0
- package/dist/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte.js +97 -0
- package/dist/Components/ContentInput/ContentPanelBuilder/ElementList/index.svelte +184 -0
- package/dist/Components/ContentInput/ContentPanelBuilder/index.svelte +41 -0
- package/dist/Components/ContentInput/index.svelte +78 -0
- package/dist/Components/ContentInput/index.svelte.js +1197 -0
- package/dist/Components/CronInput/index.svelte +78 -0
- package/dist/Components/CronInput/index.svelte.js +198 -0
- package/dist/Components/DataTypeInput/index.svelte +174 -0
- package/dist/Components/DataTypeInput/index.svelte.js +565 -0
- package/dist/Components/Dropdown/index.svelte +116 -0
- package/dist/Components/Dropdown/index.svelte.js +403 -0
- package/dist/Components/EmailAddress/index.svelte +22 -0
- package/dist/Components/EmailAddress/index.svelte.js +45 -0
- package/dist/Components/ErrorX/index.svelte +58 -0
- package/dist/Components/Eye/index.svelte +57 -0
- package/dist/Components/FileInput/index.svelte +146 -0
- package/dist/Components/FileInput/index.svelte.js +225 -0
- package/dist/Components/Hamburger/index.svelte +99 -0
- package/dist/Components/HorizScrollBox/index.svelte +145 -0
- package/dist/Components/Icon/index.svelte +412 -0
- package/dist/Components/Icon/index.svelte.js +116 -0
- package/dist/Components/IconInput/index.svelte +77 -0
- package/dist/Components/IconInput/index.svelte.js +259 -0
- package/dist/Components/Image/index.svelte +126 -0
- package/dist/Components/Image/index.svelte.js +116 -0
- package/dist/Components/ImageEditor/Image/CropBox/index.svelte +165 -0
- package/dist/Components/ImageEditor/Image/index.svelte +104 -0
- package/dist/Components/ImageEditor/Panels/AI/index.svelte +44 -0
- package/dist/Components/ImageEditor/Panels/Crop/index.svelte +96 -0
- package/dist/Components/ImageEditor/Panels/File/QualityPicker/index.svelte +124 -0
- package/dist/Components/ImageEditor/Panels/File/index.svelte +74 -0
- package/dist/Components/ImageEditor/Panels/Filters/index.svelte +46 -0
- package/dist/Components/ImageEditor/Panels/Resize/index.svelte +58 -0
- package/dist/Components/ImageEditor/index.svelte +93 -0
- package/dist/Components/ImageEditor/index.svelte.js +1961 -0
- package/dist/Components/ImageSlider/index.svelte +124 -0
- package/dist/Components/ImageSlider/index.svelte.js +99 -0
- package/dist/Components/InfoBox/index.svelte +89 -0
- package/dist/Components/Json/Nested/index.svelte +157 -0
- package/dist/Components/Json/index.svelte +60 -0
- package/dist/Components/Json/index.svelte.js +594 -0
- package/dist/Components/LabeledItem/index.svelte +102 -0
- package/dist/Components/Layout/NavBar/FullNav/index.svelte +52 -0
- package/dist/Components/Layout/NavBar/NavGuts/index.svelte +87 -0
- package/dist/Components/Layout/NavBar/index.svelte +72 -0
- package/dist/Components/Layout/index.svelte +149 -0
- package/dist/Components/Layout/index.svelte.js +360 -0
- package/dist/Components/Link/index.svelte +47 -0
- package/dist/Components/Link/index.svelte.js +136 -0
- package/dist/Components/LoadingSuccessDiv/index.svelte +51 -0
- package/dist/Components/LoadingWheel/index.svelte +38 -0
- package/dist/Components/Location/index.svelte +79 -0
- package/dist/Components/Location/index.svelte.js +288 -0
- package/dist/Components/LocationInput/index.svelte +197 -0
- package/dist/Components/LocationInput/index.svelte.js +965 -0
- package/dist/Components/Number/index.svelte +47 -0
- package/dist/Components/Number/index.svelte.js +151 -0
- package/dist/Components/PhoneCountryCode/index.svelte +7 -0
- package/dist/Components/PhoneCountryCode/index.svelte.js +260 -0
- package/dist/Components/PhoneNumber/index.svelte +22 -0
- package/dist/Components/PhoneNumber/index.svelte.js +41 -0
- package/dist/Components/Popover/index.svelte +396 -0
- package/dist/Components/Popover/index.svelte.js +319 -0
- package/dist/Components/Qr/index.svelte +85 -0
- package/dist/Components/Qr/index.svelte.js +301 -0
- package/dist/Components/QrInput/index.svelte +47 -0
- package/dist/Components/QrInput/index.svelte.js +218 -0
- package/dist/Components/Slider/index.svelte +239 -0
- package/dist/Components/Slider/index.svelte.js +469 -0
- package/dist/Components/Spacer/index.svelte +41 -0
- package/dist/Components/StoragePicker/DisplayFile/index.svelte +15 -0
- package/dist/Components/StoragePicker/index.svelte +187 -0
- package/dist/Components/StoragePicker/index.svelte.js +592 -0
- package/dist/Components/SuccessCheck/index.svelte +56 -0
- package/dist/Components/TableAdvanced/ColumnInput/index.svelte +117 -0
- package/dist/Components/TableAdvanced/ColumnInput/index.svelte.js +456 -0
- package/dist/Components/TableAdvanced/FilterInput/index.svelte +54 -0
- package/dist/Components/TableAdvanced/FilterInput/index.svelte.js +247 -0
- package/dist/Components/TableAdvanced/Pagination/index.svelte +43 -0
- package/dist/Components/TableAdvanced/Pagination/index.svelte.js +97 -0
- package/dist/Components/TableAdvanced/SortByInput/index.svelte +72 -0
- package/dist/Components/TableAdvanced/SortByInput/index.svelte.js +176 -0
- package/dist/Components/TableAdvanced/index.svelte +275 -0
- package/dist/Components/TableAdvanced/index.svelte.js +1565 -0
- package/dist/Components/Tag/index.svelte +45 -0
- package/dist/Components/Tag/index.svelte.js +76 -0
- package/dist/Components/TextArrayInput/index.svelte +108 -0
- package/dist/Components/TextArrayInput/index.svelte.js +239 -0
- package/dist/Components/TextInput/PasswordTooltip/index.svelte +89 -0
- package/dist/Components/TextInput/index.svelte +223 -0
- package/dist/Components/TextInput/index.svelte.js +447 -0
- package/dist/Components/Time/index.svelte +7 -0
- package/dist/Components/Time/index.svelte.js +38 -0
- package/dist/Components/TimeInput/NumberToggler/index.svelte +34 -0
- package/dist/Components/TimeInput/NumberToggler/index.svelte.js +79 -0
- package/dist/Components/TimeInput/index.js +702 -0
- package/dist/Components/TimeInput/index.svelte +211 -0
- package/dist/Components/TimeInput/index.svelte.js +638 -0
- package/dist/Components/Tooltip/index.svelte +143 -0
- package/dist/Components/TransparentBackground/index.svelte +153 -0
- package/dist/Components/TypingDots/index.svelte +84 -0
- package/dist/Components/VariablePathInput/index.svelte +63 -0
- package/dist/Components/VariablePathInput/index.svelte.js +273 -0
- package/dist/Components/VideoTBD/index.svelte +100 -0
- package/dist/Components/XFollow/index.svelte +42 -0
- package/dist/Components/XPost/index.svelte +52 -0
- package/dist/Components/XPost/index.svelte.js +64 -0
- package/dist/Components/YoutubeChannelButton/index.svelte +82 -0
- package/dist/Components/YoutubeVideo/index.svelte +73 -0
- package/dist/Components/YoutubeVideo/index.svelte.js +54 -0
- package/dist/actions/draggable.js +49 -0
- package/dist/actions/index.js +24 -0
- package/dist/actions/no_spaces.js +33 -0
- package/dist/actions/numbers_only.js +26 -0
- package/dist/actions/scroll_y.js +28 -0
- package/dist/actions/stop_scroll_propagation_y.js +42 -0
- package/dist/actions/swipe_handler.js +295 -0
- package/dist/client/astc_formatting/index.js +1128 -0
- package/dist/client/docs/index.js +7622 -0
- package/dist/client/index.js +735 -0
- package/dist/client/types/index.js +2812 -0
- package/dist/index.js +180 -0
- package/dist/style.css +682 -0
- package/package.json +2 -2
- package/src/lib/Components/Chart/index.svelte.js +11 -2
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { browser } from "$app/environment"
|
|
2
|
+
import { create_button_manager } from "../Button/index.svelte.js"
|
|
3
|
+
import { create_popover_manager } from "../Popover/index.svelte.js"
|
|
4
|
+
import { create_slider_manager } from "../Slider/index.svelte.js"
|
|
5
|
+
import { create_unique_id, set_closurable, deep_copy } from "../../client/index.js"
|
|
6
|
+
|
|
7
|
+
export function create_audio_manager(config) {
|
|
8
|
+
let id = create_unique_id(null, 20)
|
|
9
|
+
let src = $state(null)
|
|
10
|
+
let type = $state("audio/mpeg")
|
|
11
|
+
let title = $state(null)
|
|
12
|
+
let artist = $state(null)
|
|
13
|
+
let album = $state(null)
|
|
14
|
+
let image_src = $state(null)
|
|
15
|
+
let image_type = $state(null)
|
|
16
|
+
let default_skip_time = $state(10)
|
|
17
|
+
let ui_type = $state("standard") // standard, short, square
|
|
18
|
+
let ml = $derived(set_closurable(config?.ml, 0))
|
|
19
|
+
let mr = $derived(set_closurable(config?.mr, 0))
|
|
20
|
+
let mt = $derived(set_closurable(config?.mt, 0))
|
|
21
|
+
let mb = $derived(set_closurable(config?.mb, 0))
|
|
22
|
+
let is_hide_image = $derived(set_closurable(config?.is_hide_image, false))
|
|
23
|
+
let play_pause_support_icon = $state("play")
|
|
24
|
+
let play_pause_button_manager = $state(null)
|
|
25
|
+
let time_slider_manager = $state(null)
|
|
26
|
+
let settings_popover_manager = $state(null)
|
|
27
|
+
let settings_button_manager = $state(null)
|
|
28
|
+
let volume_slider_manager = $state(null)
|
|
29
|
+
let rate_slider_manager = $state(null)
|
|
30
|
+
|
|
31
|
+
let time_loaded_until = $state(0)
|
|
32
|
+
let time_highlight_range_start_percent = $derived((100 * time_slider_manager?.val) / time_slider_manager?.max)
|
|
33
|
+
let time_highlight_range_end_percent = $derived((100 * time_loaded_until) / time_slider_manager?.max)
|
|
34
|
+
|
|
35
|
+
let storage_path = $state(null)
|
|
36
|
+
let is_loading = $state(true)
|
|
37
|
+
let formatted_duration = $derived(!isNaN(time_slider_manager?.max) ? format_time(time_slider_manager?.max) : "")
|
|
38
|
+
let formatted_current_time = $derived(!isNaN(time_slider_manager?.val) ? format_time(time_slider_manager?.val) : "")
|
|
39
|
+
|
|
40
|
+
function get_src(src, storage_id) {
|
|
41
|
+
if (src) {
|
|
42
|
+
return src
|
|
43
|
+
} else if (storage_id && storage_path) {
|
|
44
|
+
return storage_path.replace("{storage_id}", storage_id)
|
|
45
|
+
} else {
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function handle_mount() {
|
|
51
|
+
if (!browser) {
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
55
|
+
if (audio_el) {
|
|
56
|
+
if (audio_el.readyState >= 3) {
|
|
57
|
+
handle_loaded_metadata()
|
|
58
|
+
is_loading = false
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function handle_volume_change(volume) {
|
|
64
|
+
if (!browser) {
|
|
65
|
+
// tbd on this
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
69
|
+
if (audio_el && volume) {
|
|
70
|
+
audio_el.volume = volume
|
|
71
|
+
volume_slider_manager.set_val(deep_copy(volume))
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function handle_rate_change(rate) {
|
|
76
|
+
if (!browser) {
|
|
77
|
+
// tbd on this
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
81
|
+
if (audio_el && rate) {
|
|
82
|
+
audio_el.playbackRate = rate
|
|
83
|
+
rate_slider_manager.set_val(rate)
|
|
84
|
+
update_position_state()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function format_time(seconds) {
|
|
89
|
+
const mins = Math.floor(seconds / 60)
|
|
90
|
+
.toString()
|
|
91
|
+
.padStart(2, "0")
|
|
92
|
+
const secs = Math.floor(seconds % 60)
|
|
93
|
+
.toString()
|
|
94
|
+
.padStart(2, "0")
|
|
95
|
+
return `${mins}:${secs}`
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function handle_loaded_metadata() {
|
|
99
|
+
if (!browser) {
|
|
100
|
+
// tbd on this
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
104
|
+
if (audio_el) {
|
|
105
|
+
time_slider_manager.set_max(audio_el.duration)
|
|
106
|
+
is_loading = false
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function handle_progress() {
|
|
111
|
+
if (!browser) {
|
|
112
|
+
// tbd on this
|
|
113
|
+
return
|
|
114
|
+
}
|
|
115
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
116
|
+
if (audio_el?.buffered?.length) {
|
|
117
|
+
time_loaded_until = audio_el.buffered.end(0)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function handle_time_update() {
|
|
122
|
+
if (!browser) {
|
|
123
|
+
// tbd on this
|
|
124
|
+
return
|
|
125
|
+
}
|
|
126
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
127
|
+
if (audio_el) {
|
|
128
|
+
time_slider_manager.set_val(audio_el.currentTime)
|
|
129
|
+
if (audio_el?.buffered?.length) {
|
|
130
|
+
time_loaded_until = audio_el.buffered.end(0)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function seek_to_audio(time) {
|
|
136
|
+
if (!browser) {
|
|
137
|
+
// tbd on this
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
if (time > -1) {
|
|
141
|
+
time_slider_manager.set_val(time)
|
|
142
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
143
|
+
if (audio_el) {
|
|
144
|
+
audio_el.currentTime = time
|
|
145
|
+
time_slider_manager.set_val(time)
|
|
146
|
+
if (audio_el?.buffered?.length) {
|
|
147
|
+
time_loaded_until = audio_el.buffered.end(0)
|
|
148
|
+
}
|
|
149
|
+
update_position_state()
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function resize_image(src, callback) {
|
|
155
|
+
let img = new Image()
|
|
156
|
+
img.crossOrigin = "anonymous" // Request CORS permissions
|
|
157
|
+
img.onload = function () {
|
|
158
|
+
let width = img.width
|
|
159
|
+
let height = img.height
|
|
160
|
+
if (width > height) {
|
|
161
|
+
if (width > 128) {
|
|
162
|
+
height *= 128 / width
|
|
163
|
+
width = 128
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
if (height > 128) {
|
|
167
|
+
width *= 128 / height
|
|
168
|
+
height = 128
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
let canvas = document.createElement("canvas")
|
|
172
|
+
let ctx = canvas.getContext("2d")
|
|
173
|
+
canvas.width = width
|
|
174
|
+
canvas.height = height
|
|
175
|
+
ctx.drawImage(img, 0, 0, width, height)
|
|
176
|
+
callback(canvas.toDataURL())
|
|
177
|
+
}
|
|
178
|
+
img.src = src
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
let has_setup_media_session = $state(false)
|
|
182
|
+
function setup_media_session() {
|
|
183
|
+
let metadata = {
|
|
184
|
+
title: title,
|
|
185
|
+
artist: artist || "",
|
|
186
|
+
album: album,
|
|
187
|
+
artwork: [],
|
|
188
|
+
}
|
|
189
|
+
if (image_src) {
|
|
190
|
+
//temp fix since ios mobile is trash and not working with sizes over 128x128 even though it did on ios idk 16.4 or something
|
|
191
|
+
resize_image(image_src, function (resized_image_src) {
|
|
192
|
+
metadata.artwork = [
|
|
193
|
+
{
|
|
194
|
+
src: resized_image_src,
|
|
195
|
+
sizes: "128x128", // maximum size is now 128x128
|
|
196
|
+
type: image_type,
|
|
197
|
+
},
|
|
198
|
+
// {
|
|
199
|
+
// src: image_src,
|
|
200
|
+
// sizes: "1000x1000", // seems as though need this even if not correct and max size of a size can be 1000px
|
|
201
|
+
// type: image_type,
|
|
202
|
+
// },
|
|
203
|
+
// {
|
|
204
|
+
// src: "https://dummyimage.com/1000x500",
|
|
205
|
+
// sizes: "1000x500",
|
|
206
|
+
// type: "image/png",
|
|
207
|
+
// },
|
|
208
|
+
]
|
|
209
|
+
navigator.mediaSession.metadata = new MediaMetadata(metadata)
|
|
210
|
+
navigator.mediaSession.setActionHandler("play", play_audio)
|
|
211
|
+
navigator.mediaSession.setActionHandler("pause", pause_audio)
|
|
212
|
+
navigator.mediaSession.setActionHandler("seekto", (details) => seek_to_audio(details.seekTime))
|
|
213
|
+
navigator.mediaSession.setActionHandler("seekbackward", (details) => nav_seek_backward(details))
|
|
214
|
+
navigator.mediaSession.setActionHandler("seekforward", (details) => nav_seek_forward(details))
|
|
215
|
+
})
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function update_position_state() {
|
|
220
|
+
if ("setPositionState" in navigator.mediaSession) {
|
|
221
|
+
navigator.mediaSession.setPositionState({
|
|
222
|
+
duration: time_slider_manager?.max,
|
|
223
|
+
playback_rate: rate_slider_manager?.val,
|
|
224
|
+
position: time_slider_manager?.val,
|
|
225
|
+
})
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function nav_seek_backward(details) {
|
|
230
|
+
const skip_time = details.seekOffset || default_skip_time
|
|
231
|
+
seek_to_audio(Math.max(time_slider_manager?.val - skip_time, 0))
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function nav_seek_forward(details) {
|
|
235
|
+
const skip_time = details.seekOffset || default_skip_time
|
|
236
|
+
seek_to_audio(Math.min(time_slider_manager?.val + skip_time, time_slider_manager?.max))
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function toggle_play_pause() {
|
|
240
|
+
if (!browser) {
|
|
241
|
+
// tbd on this
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
245
|
+
const is_playing = !audio_el ? false : !audio_el.paused && !audio_el.ended && audio_el.currentTime > 0
|
|
246
|
+
if (is_playing) {
|
|
247
|
+
pause_audio()
|
|
248
|
+
} else {
|
|
249
|
+
play_audio()
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function play_audio() {
|
|
254
|
+
if (!browser) {
|
|
255
|
+
// tbd on this
|
|
256
|
+
return
|
|
257
|
+
}
|
|
258
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
259
|
+
const is_playing = !audio_el ? false : !audio_el.paused && !audio_el.ended && audio_el.currentTime > 0
|
|
260
|
+
play_pause_support_icon = "pause"
|
|
261
|
+
if (audio_el && !is_playing) {
|
|
262
|
+
if (!has_setup_media_session) {
|
|
263
|
+
setup_media_session()
|
|
264
|
+
}
|
|
265
|
+
await audio_el.play()
|
|
266
|
+
navigator.mediaSession.playbackState = "playing"
|
|
267
|
+
update_position_state()
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function pause_audio() {
|
|
272
|
+
if (!browser) {
|
|
273
|
+
// tbd on this
|
|
274
|
+
return
|
|
275
|
+
}
|
|
276
|
+
let audio_el = document?.querySelector(`#audio_${id}`)
|
|
277
|
+
const is_playing = !audio_el ? false : !audio_el.paused && !audio_el.ended && audio_el.currentTime > 0
|
|
278
|
+
play_pause_support_icon = "play"
|
|
279
|
+
if (audio_el && is_playing) {
|
|
280
|
+
audio_el.pause()
|
|
281
|
+
navigator.mediaSession.playbackState = "paused"
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function set_is_loading(input) {
|
|
286
|
+
is_loading = !!input
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function handle_seeking() {
|
|
290
|
+
is_loading = true
|
|
291
|
+
}
|
|
292
|
+
function handle_can_play() {
|
|
293
|
+
is_loading = false
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function init(config) {
|
|
297
|
+
storage_path = config?.storage_path
|
|
298
|
+
src = get_src(config?.src, config?.storage_id)
|
|
299
|
+
type = config?.type ?? "audio/mpeg"
|
|
300
|
+
title = config?.title ?? null
|
|
301
|
+
artist = config?.artist ?? null
|
|
302
|
+
album = config?.album ?? null
|
|
303
|
+
image_src = get_src(config?.image_src, config?.image_storage_id)
|
|
304
|
+
image_type = config?.image_type ?? null
|
|
305
|
+
default_skip_time = config?.default_skip_time ?? null
|
|
306
|
+
ui_type = config?.ui_type ?? "standard"
|
|
307
|
+
play_pause_button_manager = create_button_manager({
|
|
308
|
+
type: "soft",
|
|
309
|
+
is_uniform: true,
|
|
310
|
+
is_icon_bg_tint: false,
|
|
311
|
+
aria_label: "play_pause",
|
|
312
|
+
is_loading: () => is_loading,
|
|
313
|
+
support_icon: () => play_pause_support_icon ?? "play",
|
|
314
|
+
on_click: () => toggle_play_pause(),
|
|
315
|
+
})
|
|
316
|
+
time_slider_manager = create_slider_manager({
|
|
317
|
+
min: 0,
|
|
318
|
+
max: null,
|
|
319
|
+
step: 1,
|
|
320
|
+
ml: 0.5,
|
|
321
|
+
mr: 0.5,
|
|
322
|
+
is_show_text: false,
|
|
323
|
+
is_short: true,
|
|
324
|
+
val: 0,
|
|
325
|
+
highlight_range_start_percent: () => time_highlight_range_start_percent,
|
|
326
|
+
highlight_range_end_percent: () => time_highlight_range_end_percent,
|
|
327
|
+
on_change: (input) => seek_to_audio(input),
|
|
328
|
+
})
|
|
329
|
+
settings_popover_manager = create_popover_manager({
|
|
330
|
+
header: "Settings",
|
|
331
|
+
type: "dropdown",
|
|
332
|
+
min_width: 100,
|
|
333
|
+
target_width: 200,
|
|
334
|
+
min_height: 100,
|
|
335
|
+
target_height: 200,
|
|
336
|
+
anchor_id: () => `button_${settings_button_manager?.id}`,
|
|
337
|
+
})
|
|
338
|
+
settings_button_manager = create_button_manager({
|
|
339
|
+
type: "soft",
|
|
340
|
+
support_icon: "three_dots",
|
|
341
|
+
icon_sw: 60,
|
|
342
|
+
is_icon_bg_tint: false,
|
|
343
|
+
is_uniform: true,
|
|
344
|
+
aria_label: "settings",
|
|
345
|
+
popover_target: () => `popover_${settings_popover_manager?.id}`,
|
|
346
|
+
})
|
|
347
|
+
volume_slider_manager = create_slider_manager({
|
|
348
|
+
label: "Volume",
|
|
349
|
+
min: 0,
|
|
350
|
+
max: 1,
|
|
351
|
+
step: 0.05,
|
|
352
|
+
is_show_text: true,
|
|
353
|
+
is_short: false,
|
|
354
|
+
val: 1,
|
|
355
|
+
on_change: (input) => handle_volume_change(input),
|
|
356
|
+
})
|
|
357
|
+
rate_slider_manager = create_slider_manager({
|
|
358
|
+
label: "Rate",
|
|
359
|
+
min: 0.5,
|
|
360
|
+
max: 3,
|
|
361
|
+
step: 0.05,
|
|
362
|
+
is_show_text: true,
|
|
363
|
+
is_short: false,
|
|
364
|
+
val: 1,
|
|
365
|
+
on_change: (input) => handle_rate_change(input),
|
|
366
|
+
})
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
init(config)
|
|
370
|
+
|
|
371
|
+
return {
|
|
372
|
+
id,
|
|
373
|
+
get src() {
|
|
374
|
+
return src
|
|
375
|
+
},
|
|
376
|
+
get type() {
|
|
377
|
+
return type
|
|
378
|
+
},
|
|
379
|
+
get title() {
|
|
380
|
+
return title
|
|
381
|
+
},
|
|
382
|
+
get artist() {
|
|
383
|
+
return artist
|
|
384
|
+
},
|
|
385
|
+
get album() {
|
|
386
|
+
return album
|
|
387
|
+
},
|
|
388
|
+
get image_src() {
|
|
389
|
+
return image_src
|
|
390
|
+
},
|
|
391
|
+
get image_type() {
|
|
392
|
+
return image_type
|
|
393
|
+
},
|
|
394
|
+
get default_skip_time() {
|
|
395
|
+
return default_skip_time
|
|
396
|
+
},
|
|
397
|
+
get ui_type() {
|
|
398
|
+
return ui_type
|
|
399
|
+
},
|
|
400
|
+
get ml() {
|
|
401
|
+
return ml
|
|
402
|
+
},
|
|
403
|
+
get mr() {
|
|
404
|
+
return mr
|
|
405
|
+
},
|
|
406
|
+
get mt() {
|
|
407
|
+
return mt
|
|
408
|
+
},
|
|
409
|
+
get mb() {
|
|
410
|
+
return mb
|
|
411
|
+
},
|
|
412
|
+
get is_hide_image() {
|
|
413
|
+
return is_hide_image
|
|
414
|
+
},
|
|
415
|
+
get play_pause_button_manager() {
|
|
416
|
+
return play_pause_button_manager
|
|
417
|
+
},
|
|
418
|
+
get time_slider_manager() {
|
|
419
|
+
return time_slider_manager
|
|
420
|
+
},
|
|
421
|
+
get settings_popover_manager() {
|
|
422
|
+
return settings_popover_manager
|
|
423
|
+
},
|
|
424
|
+
get settings_button_manager() {
|
|
425
|
+
return settings_button_manager
|
|
426
|
+
},
|
|
427
|
+
get volume_slider_manager() {
|
|
428
|
+
return volume_slider_manager
|
|
429
|
+
},
|
|
430
|
+
get rate_slider_manager() {
|
|
431
|
+
return rate_slider_manager
|
|
432
|
+
},
|
|
433
|
+
get has_setup_media_session() {
|
|
434
|
+
return has_setup_media_session
|
|
435
|
+
},
|
|
436
|
+
get formatted_duration() {
|
|
437
|
+
return formatted_duration
|
|
438
|
+
},
|
|
439
|
+
get formatted_current_time() {
|
|
440
|
+
return formatted_current_time
|
|
441
|
+
},
|
|
442
|
+
get is_loading() {
|
|
443
|
+
return is_loading
|
|
444
|
+
},
|
|
445
|
+
handle_mount,
|
|
446
|
+
handle_loaded_metadata,
|
|
447
|
+
handle_progress,
|
|
448
|
+
handle_time_update,
|
|
449
|
+
handle_rate_change,
|
|
450
|
+
handle_seeking,
|
|
451
|
+
handle_can_play,
|
|
452
|
+
seek_to_audio,
|
|
453
|
+
resize_image,
|
|
454
|
+
setup_media_session,
|
|
455
|
+
update_position_state,
|
|
456
|
+
nav_seek_backward,
|
|
457
|
+
nav_seek_forward,
|
|
458
|
+
toggle_play_pause,
|
|
459
|
+
play_audio,
|
|
460
|
+
pause_audio,
|
|
461
|
+
set_is_loading,
|
|
462
|
+
}
|
|
463
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Popover from "../Popover/index.svelte"
|
|
3
|
+
import Button from "../Button/index.svelte"
|
|
4
|
+
import InfoBox from "../InfoBox/index.svelte"
|
|
5
|
+
import HorizScrollBox from "../HorizScrollBox/index.svelte"
|
|
6
|
+
import LabeledItem from "../LabeledItem/index.svelte"
|
|
7
|
+
import Spacer from "../Spacer/index.svelte"
|
|
8
|
+
import Audio from "../Audio/index.svelte"
|
|
9
|
+
import FileInput from "../FileInput/index.svelte"
|
|
10
|
+
import TextInput from "../TextInput/index.svelte"
|
|
11
|
+
import Dropdown from "../Dropdown/index.svelte"
|
|
12
|
+
import StoragePicker from "../StoragePicker/index.svelte"
|
|
13
|
+
|
|
14
|
+
let { manager, extra_buttons } = $props()
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#snippet audio_input()}
|
|
18
|
+
<div style="padding-bottom: 20rem;">
|
|
19
|
+
{#if manager?.account?.id}
|
|
20
|
+
<p style="margin-bottom: 1rem;">
|
|
21
|
+
Generated files will be saved to {manager?.account?.name} ({manager?.account?.id})'s temporary storage
|
|
22
|
+
</p>
|
|
23
|
+
{:else}
|
|
24
|
+
<p>No account being used</p>
|
|
25
|
+
{/if}
|
|
26
|
+
<div style="display: flex; flex-wrap: wrap; gap: 1rem;">
|
|
27
|
+
<Button manager={manager?.clear_button_manager} />
|
|
28
|
+
<div>
|
|
29
|
+
<Button manager={manager?.seed_from_input_popover_button_manager} />
|
|
30
|
+
<Popover manager={manager?.seed_from_input_popover_manager}>
|
|
31
|
+
{#snippet content()}
|
|
32
|
+
<StoragePicker manager={manager?.seed_audio_storage_picker_manager} />
|
|
33
|
+
{/snippet}
|
|
34
|
+
</Popover>
|
|
35
|
+
</div>
|
|
36
|
+
{#if extra_buttons}
|
|
37
|
+
{@render extra_buttons()}
|
|
38
|
+
{/if}
|
|
39
|
+
<Button manager={manager?.generate_audio_changes_button_manager} />
|
|
40
|
+
</div>
|
|
41
|
+
{#if manager?.is_loading_generate_audio && manager?.is_text_to_audio && manager?.text_to_audio_text_input_manager && manager?.text_to_audio_text_input_manager.length > 10}
|
|
42
|
+
<p>
|
|
43
|
+
This should take around {manager?.text_to_audio_time_in_minutes} minutes.
|
|
44
|
+
</p>
|
|
45
|
+
{/if}
|
|
46
|
+
<InfoBox message={manager?.error_message} mt={0.5} mb={0.5} />
|
|
47
|
+
{#if manager?.generated_audio_file_obj}
|
|
48
|
+
<div class="card" style="margin: 1rem 0;">
|
|
49
|
+
<h3>Generated Audio</h3>
|
|
50
|
+
<p>type: {manager?.generated_audio_file_obj?.type}</p>
|
|
51
|
+
<p>file name: {manager?.generated_audio_file_obj?.file_name}</p>
|
|
52
|
+
<p>size: {manager?.generated_audio_file_obj?.size_kb}KB</p>
|
|
53
|
+
<p style="font-size: 1.2rem; color: var(--g10-t); margin-bottom: 1rem">
|
|
54
|
+
Note: Currently, our interface does not support extracting cover images directly from the metadata of audio
|
|
55
|
+
sources. We may add this feature in the future. At present, displaying images in the Audio component requires
|
|
56
|
+
a separate image URL. However, if a cover image is embedded in the audio file's metadata, it can still be
|
|
57
|
+
viewed in other applications, such as Apple Finder.
|
|
58
|
+
</p>
|
|
59
|
+
<Audio manager={manager?.audio_manager} />
|
|
60
|
+
<div style="display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 1rem;">
|
|
61
|
+
<Button manager={manager?.clear_generated_audio_button_manager} />
|
|
62
|
+
<Button manager={manager?.download_audio_file_button_manager} />
|
|
63
|
+
<Button manager={manager?.finish_button_manager} />
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
{/if}
|
|
67
|
+
<Spacer mt={1} mb={1} />
|
|
68
|
+
<LabeledItem
|
|
69
|
+
is_disabled={manager?.is_loading_generate_audio || manager?.is_disabled}
|
|
70
|
+
label={!manager?.audio_file_obj?.src && manager?.is_text_to_audio ? "Audio Generation" : "Audio File"}
|
|
71
|
+
mt={1}
|
|
72
|
+
content_min_width={35}
|
|
73
|
+
content_max_width={60}
|
|
74
|
+
>
|
|
75
|
+
{#if !manager?.is_text_to_audio}
|
|
76
|
+
<div style="display: flex; margin-bottom: 1rem;">
|
|
77
|
+
{#if !manager?.audio_file_obj?.src}
|
|
78
|
+
<Button manager={manager?.use_text_to_audio_button_manager} />
|
|
79
|
+
<Button manager={manager?.select_file_from_storage_button_manager} />
|
|
80
|
+
{/if}
|
|
81
|
+
</div>
|
|
82
|
+
<StoragePicker manager={manager?.audio_storage_picker_manager} />
|
|
83
|
+
{:else}
|
|
84
|
+
<Button manager={manager?.use_mp3_file_button_manager} />
|
|
85
|
+
<TextInput manager={manager?.text_to_audio_text_input_manager} />
|
|
86
|
+
{/if}
|
|
87
|
+
</LabeledItem>
|
|
88
|
+
{#if manager?.is_text_to_audio}
|
|
89
|
+
<LabeledItem
|
|
90
|
+
label="Voice"
|
|
91
|
+
content_min_width={35}
|
|
92
|
+
content_max_width={60}
|
|
93
|
+
mt={1}
|
|
94
|
+
is_disabled={manager?.title_text_input_manager?.is_disabled}
|
|
95
|
+
>
|
|
96
|
+
{#if Array.isArray(manager?.voice_options) && manager?.voice_options.length > 0}
|
|
97
|
+
<div style="display: flex; gap: 1rem;">
|
|
98
|
+
<div>
|
|
99
|
+
<p>{manager?.voice_options.find((h) => h?.id == (manager?.voice_id ?? "alloy"))?.name ?? "-"}</p>
|
|
100
|
+
<Button manager={manager?.edit_voice_button_manager} />
|
|
101
|
+
</div>
|
|
102
|
+
<Audio
|
|
103
|
+
manager={manager?.voice_options.find((h) => h?.id == (manager?.voice_id ?? "alloy"))?.audio_manager}
|
|
104
|
+
/>
|
|
105
|
+
</div>
|
|
106
|
+
<Popover manager={manager?.edit_voice_popover_manager}>
|
|
107
|
+
{#snippet content()}
|
|
108
|
+
<div>
|
|
109
|
+
{#each manager?.voice_options as voice, i}
|
|
110
|
+
<div style="padding: 1rem;">
|
|
111
|
+
<div style="display: flex; justify-content: space-between; gap: 1rem;">
|
|
112
|
+
<p>{voice?.name}{voice?.id == "alloy" ? "(default)" : ""}</p>
|
|
113
|
+
{#if Array.isArray(voice?.labels) && voice.labels.length > 0}
|
|
114
|
+
<HorizScrollBox>
|
|
115
|
+
<div style="display: flex; gap: .5rem;">
|
|
116
|
+
{#each voice?.labels as label}
|
|
117
|
+
<div
|
|
118
|
+
style="border: 1px solid var(--shadow5-t); border-radius: .5rem; padding: .2rem .4rem"
|
|
119
|
+
>
|
|
120
|
+
<p style="font-size: 1.4rem; white-space: nowrap;">{label}</p>
|
|
121
|
+
</div>
|
|
122
|
+
{/each}
|
|
123
|
+
</div>
|
|
124
|
+
</HorizScrollBox>
|
|
125
|
+
{/if}
|
|
126
|
+
</div>
|
|
127
|
+
<div style="display: flex; justify-content: space-between; margin-top: .5rem;">
|
|
128
|
+
<Audio manager={voice?.audio_manager} />
|
|
129
|
+
<Button manager={voice?.select_button_manager} />
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
{#if i < manager?.voice_options.length - 1}
|
|
133
|
+
<Spacer />
|
|
134
|
+
{/if}
|
|
135
|
+
{/each}
|
|
136
|
+
</div>
|
|
137
|
+
{/snippet}
|
|
138
|
+
</Popover>
|
|
139
|
+
{:else}
|
|
140
|
+
No voice options found
|
|
141
|
+
{/if}
|
|
142
|
+
</LabeledItem>
|
|
143
|
+
{/if}
|
|
144
|
+
<LabeledItem
|
|
145
|
+
is_disabled={manager?.is_loading_generate_audio || manager?.is_disabled}
|
|
146
|
+
label="File Name"
|
|
147
|
+
mt={1}
|
|
148
|
+
content_min_width={35}
|
|
149
|
+
content_max_width={60}
|
|
150
|
+
>
|
|
151
|
+
<TextInput manager={manager?.file_name_text_input_manager} />
|
|
152
|
+
</LabeledItem>
|
|
153
|
+
<Spacer mt={1} />
|
|
154
|
+
<h3 style="margin: 0; margin-top: 1rem; font-size: 1.6rem;">Metatags (optional)</h3>
|
|
155
|
+
<LabeledItem
|
|
156
|
+
label="Title"
|
|
157
|
+
content_min_width={35}
|
|
158
|
+
content_max_width={60}
|
|
159
|
+
mt={1}
|
|
160
|
+
is_disabled={manager?.title_text_input_manager?.is_disabled}
|
|
161
|
+
>
|
|
162
|
+
<TextInput manager={manager?.title_text_input_manager} />
|
|
163
|
+
</LabeledItem>
|
|
164
|
+
<LabeledItem
|
|
165
|
+
label="Album Title"
|
|
166
|
+
content_min_width={35}
|
|
167
|
+
content_max_width={60}
|
|
168
|
+
mt={1}
|
|
169
|
+
is_disabled={manager?.album_title_text_input_manager?.is_disabled}
|
|
170
|
+
>
|
|
171
|
+
<TextInput manager={manager?.album_title_text_input_manager} />
|
|
172
|
+
</LabeledItem>
|
|
173
|
+
<LabeledItem
|
|
174
|
+
label="Cover Image"
|
|
175
|
+
content_min_width={35}
|
|
176
|
+
content_max_width={60}
|
|
177
|
+
mt={1}
|
|
178
|
+
is_disabled={manager?.image_storage_picker_manager?.is_disabled}
|
|
179
|
+
>
|
|
180
|
+
<StoragePicker manager={manager?.image_storage_picker_manager} />
|
|
181
|
+
<TextInput manager={manager?.image_description_text_input_manager} />
|
|
182
|
+
</LabeledItem>
|
|
183
|
+
<LabeledItem
|
|
184
|
+
label="Artist"
|
|
185
|
+
content_min_width={35}
|
|
186
|
+
content_max_width={60}
|
|
187
|
+
mt={1}
|
|
188
|
+
is_disabled={manager?.artist_text_input_manager?.is_disabled}
|
|
189
|
+
>
|
|
190
|
+
<TextInput manager={manager?.artist_text_input_manager} />
|
|
191
|
+
</LabeledItem>
|
|
192
|
+
<LabeledItem
|
|
193
|
+
label="Lyrics"
|
|
194
|
+
content_min_width={35}
|
|
195
|
+
content_max_width={60}
|
|
196
|
+
mt={1}
|
|
197
|
+
is_disabled={manager?.lyrics_text_input_manager?.is_disabled}
|
|
198
|
+
>
|
|
199
|
+
<TextInput manager={manager?.lyrics_text_input_manager} />
|
|
200
|
+
</LabeledItem>
|
|
201
|
+
<LabeledItem
|
|
202
|
+
label="Release Year"
|
|
203
|
+
content_min_width={35}
|
|
204
|
+
content_max_width={60}
|
|
205
|
+
mt={1}
|
|
206
|
+
is_disabled={manager?.release_year_text_input_manager?.is_disabled}
|
|
207
|
+
>
|
|
208
|
+
<TextInput manager={manager?.release_year_text_input_manager} />
|
|
209
|
+
</LabeledItem>
|
|
210
|
+
<LabeledItem
|
|
211
|
+
label="Language"
|
|
212
|
+
content_min_width={35}
|
|
213
|
+
content_max_width={60}
|
|
214
|
+
mt={1}
|
|
215
|
+
is_disabled={manager?.language_dropdown_manager?.is_disabled}
|
|
216
|
+
>
|
|
217
|
+
<Dropdown manager={manager?.language_dropdown_manager} />
|
|
218
|
+
</LabeledItem>
|
|
219
|
+
<Spacer mt={1} mb={1} />
|
|
220
|
+
<p style="font-size: 1.4rem; color: var(--g8-t); margin-bottom: .5rem;">Additional Metatags</p>
|
|
221
|
+
<Dropdown manager={manager?.additional_metatags_dropdown_manager} />
|
|
222
|
+
{#if Array.isArray(manager?.additional_tag_keys_ordered) && manager?.additional_tag_keys_ordered.length > 0}
|
|
223
|
+
{#each manager?.additional_tag_keys_ordered as tag_key}
|
|
224
|
+
<LabeledItem
|
|
225
|
+
is_disabled={manager?.is_loading_generate_audio || manager?.is_disabled}
|
|
226
|
+
label={manager?.additional_tags_input_prepped?.[tag_key]?.name}
|
|
227
|
+
mt={1}
|
|
228
|
+
content_min_width={35}
|
|
229
|
+
content_max_width={60}
|
|
230
|
+
>
|
|
231
|
+
{#if manager?.additional_tags_input_prepped?.[tag_key]?.key == "tbd"}
|
|
232
|
+
<!-- tbd -->
|
|
233
|
+
{:else}
|
|
234
|
+
<TextInput manager={manager?.additional_tags_input_prepped?.[tag_key]?.text_input_manager} />
|
|
235
|
+
{/if}
|
|
236
|
+
</LabeledItem>
|
|
237
|
+
{/each}
|
|
238
|
+
{/if}
|
|
239
|
+
</div>
|
|
240
|
+
{/snippet}
|
|
241
|
+
|
|
242
|
+
{#if !manager?.is_popover}
|
|
243
|
+
{@render audio_input()}
|
|
244
|
+
{:else}
|
|
245
|
+
<Popover manager={manager.popover_manager}>
|
|
246
|
+
{#snippet content()}
|
|
247
|
+
<div>
|
|
248
|
+
{@render audio_input()}
|
|
249
|
+
</div>
|
|
250
|
+
{/snippet}
|
|
251
|
+
</Popover>
|
|
252
|
+
{/if}
|