@lumiastream/ui 0.3.3 → 0.3.5

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/se-import.js CHANGED
@@ -8,7 +8,7 @@ var SE_TO_LUMIA_PLACEHOLDER = {
8
8
  displayName: "displayname",
9
9
  sender: "gifter",
10
10
  amount: "amount",
11
- currency: "currency",
11
+ currency: "currencySymbol",
12
12
  message: "message",
13
13
  items: "itemsDetailed",
14
14
  item: "firstItem.name",
@@ -23,7 +23,10 @@ var SE_TO_LUMIA_PLACEHOLDER = {
23
23
  streamer: "streamer"
24
24
  };
25
25
  var TWITCH_CONTEXTS = {
26
- "follower-latest": { name: "twitch_last_follower", username: "twitch_last_follower" },
26
+ "follower-latest": {
27
+ name: "twitch_last_follower",
28
+ username: "twitch_last_follower"
29
+ },
27
30
  // Three SE listeners with genuinely distinct semantics — preserve the
28
31
  // distinction in the variable mapping so a widget configured for "Latest
29
32
  // new subscriber" doesn't render the latest *resub* (and vice versa).
@@ -31,9 +34,18 @@ var TWITCH_CONTEXTS = {
31
34
  // are subtype-specific. The dedicated TWITCH_LAST_{NEW_SUBSCRIBER,
32
35
  // RESUBSCRIBER} variables are written by the Twitch event pipeline on
33
36
  // the matching sub.type event.
34
- "subscriber-latest": { name: "twitch_last_subscriber", username: "twitch_last_subscriber" },
35
- "subscriber-new-latest": { name: "twitch_last_new_subscriber", username: "twitch_last_new_subscriber" },
36
- "subscriber-resub-latest": { name: "twitch_last_resubscriber", username: "twitch_last_resubscriber" },
37
+ "subscriber-latest": {
38
+ name: "twitch_last_subscriber",
39
+ username: "twitch_last_subscriber"
40
+ },
41
+ "subscriber-new-latest": {
42
+ name: "twitch_last_new_subscriber",
43
+ username: "twitch_last_new_subscriber"
44
+ },
45
+ "subscriber-resub-latest": {
46
+ name: "twitch_last_resubscriber",
47
+ username: "twitch_last_resubscriber"
48
+ },
37
49
  // `subscriber-gifted-latest`: SE uses `{sender}` for the giver and `{name}` for
38
50
  // the recipient (e.g. "{sender} gifted to {name}"). The two roles must point
39
51
  // at distinct Lumia variables — collapsing both onto `twitch_last_gifter`
@@ -41,12 +53,45 @@ var TWITCH_CONTEXTS = {
41
53
  // nowhere. `sender` keeps the gifter; `name` / `username` switch to the
42
54
  // dedicated recipient variable `twitch_last_gifted`. Amount stays on the
43
55
  // gifter (it's the count of subs in that drop, owned by the gifter).
44
- "subscriber-gifted-latest": { name: "twitch_last_gifted", username: "twitch_last_gifted", sender: "twitch_last_gifter", amount: "twitch_last_gifter_amount", count: "twitch_last_gifter_amount" },
45
- "subscriber-alltime-gifter": { name: "twitch_alltime_top_gifter", username: "twitch_alltime_top_gifter", amount: "twitch_alltime_top_gifter_amount", count: "twitch_alltime_top_gifter_amount" },
46
- "cheer-latest": { name: "twitch_last_bit", username: "twitch_last_bit", amount: "twitch_last_bit_amount", count: "twitch_last_bit_amount" },
47
- "tip-latest": { name: "latest_donator", username: "latest_donator", amount: "latest_donator_amount", count: "latest_donator_amount", currency: "latest_donator_currency_symbol" },
48
- latest_donator: { name: "latest_donator", username: "latest_donator", amount: "latest_donator_amount", count: "latest_donator_amount", currency: "latest_donator_currency_symbol" },
49
- "raid-latest": { name: "twitch_last_raider", username: "twitch_last_raider", amount: "twitch_last_raid_amount", count: "twitch_last_raid_amount" },
56
+ "subscriber-gifted-latest": {
57
+ name: "twitch_last_gifted",
58
+ username: "twitch_last_gifted",
59
+ sender: "twitch_last_gifter",
60
+ amount: "twitch_last_gifter_amount",
61
+ count: "twitch_last_gifter_amount"
62
+ },
63
+ "subscriber-alltime-gifter": {
64
+ name: "twitch_alltime_top_gifter",
65
+ username: "twitch_alltime_top_gifter",
66
+ amount: "twitch_alltime_top_gifter_amount",
67
+ count: "twitch_alltime_top_gifter_amount"
68
+ },
69
+ "cheer-latest": {
70
+ name: "twitch_last_bit",
71
+ username: "twitch_last_bit",
72
+ amount: "twitch_last_bit_amount",
73
+ count: "twitch_last_bit_amount"
74
+ },
75
+ "tip-latest": {
76
+ name: "latest_donator",
77
+ username: "latest_donator",
78
+ amount: "latest_donator_amount",
79
+ count: "latest_donator_amount",
80
+ currency: "latest_donator_currency_symbol"
81
+ },
82
+ latest_donator: {
83
+ name: "latest_donator",
84
+ username: "latest_donator",
85
+ amount: "latest_donator_amount",
86
+ count: "latest_donator_amount",
87
+ currency: "latest_donator_currency_symbol"
88
+ },
89
+ "raid-latest": {
90
+ name: "twitch_last_raider",
91
+ username: "twitch_last_raider",
92
+ amount: "twitch_last_raid_amount",
93
+ count: "twitch_last_raid_amount"
94
+ },
50
95
  // Period counters: count/amount = the running counter for that window.
51
96
  // SE lets the streamer pick session / week / month / total on the same widget
52
97
  // type; the chosen period lands in `widget.listener` (e.g. `cheer-week`).
@@ -54,25 +99,86 @@ var TWITCH_CONTEXTS = {
54
99
  // table only carried session+total and broke any widget configured for
55
100
  // week/month because `{amount}` fell through to the unscoped placeholder
56
101
  // and rendered blank.
57
- "follower-session": { amount: "twitch_session_follower_count", count: "twitch_session_follower_count" },
58
- "follower-week": { amount: "twitch_week_follower_count", count: "twitch_week_follower_count" },
59
- "follower-month": { amount: "twitch_month_follower_count", count: "twitch_month_follower_count" },
60
- "follower-total": { amount: "twitch_total_follower_count", count: "twitch_total_follower_count" },
61
- "subscriber-session": { amount: "twitch_session_subscribers_count", count: "twitch_session_subscribers_count" },
62
- "subscriber-week": { amount: "twitch_week_subscriber_count", count: "twitch_week_subscriber_count" },
63
- "subscriber-month": { amount: "twitch_month_subscriber_count", count: "twitch_month_subscriber_count" },
64
- "subscriber-total": { amount: "twitch_total_subscriber_count", count: "twitch_total_subscriber_count" },
65
- "subscriber-new-session": { amount: "twitch_session_new_subscribers_count", count: "twitch_session_new_subscribers_count" },
66
- "subscriber-resub-session": { amount: "twitch_session_resub_subscribers_count", count: "twitch_session_resub_subscribers_count" },
67
- "subscriber-gifted-session": { amount: "twitch_session_gifted_subscribers_count", count: "twitch_session_gifted_subscribers_count" },
68
- "cheer-session": { amount: "twitch_session_bits_count", count: "twitch_session_bits_count" },
69
- "cheer-week": { amount: "twitch_week_bits_count", count: "twitch_week_bits_count" },
70
- "cheer-month": { amount: "twitch_month_bits_count", count: "twitch_month_bits_count" },
71
- "cheer-total": { amount: "twitch_total_bits_count", count: "twitch_total_bits_count" },
72
- "tip-session": { amount: "session_donation_amount", count: "session_donation_count", currency: "session_donation_amount_currency_symbol" },
73
- "tip-week": { amount: "week_donation_amount", count: "week_donation_count", currency: "week_donation_amount_currency_symbol" },
74
- "tip-month": { amount: "month_donation_amount", count: "month_donation_count", currency: "month_donation_amount_currency_symbol" },
75
- "tip-total": { amount: "total_donation_amount", count: "total_donation_amount", currency: "total_donation_amount_currency_symbol" },
102
+ "follower-session": {
103
+ amount: "twitch_session_follower_count",
104
+ count: "twitch_session_follower_count"
105
+ },
106
+ "follower-week": {
107
+ amount: "twitch_week_follower_count",
108
+ count: "twitch_week_follower_count"
109
+ },
110
+ "follower-month": {
111
+ amount: "twitch_month_follower_count",
112
+ count: "twitch_month_follower_count"
113
+ },
114
+ "follower-total": {
115
+ amount: "twitch_total_follower_count",
116
+ count: "twitch_total_follower_count"
117
+ },
118
+ "subscriber-session": {
119
+ amount: "twitch_session_subscribers_count",
120
+ count: "twitch_session_subscribers_count"
121
+ },
122
+ "subscriber-week": {
123
+ amount: "twitch_week_subscriber_count",
124
+ count: "twitch_week_subscriber_count"
125
+ },
126
+ "subscriber-month": {
127
+ amount: "twitch_month_subscriber_count",
128
+ count: "twitch_month_subscriber_count"
129
+ },
130
+ "subscriber-total": {
131
+ amount: "twitch_total_subscriber_count",
132
+ count: "twitch_total_subscriber_count"
133
+ },
134
+ "subscriber-new-session": {
135
+ amount: "twitch_session_new_subscribers_count",
136
+ count: "twitch_session_new_subscribers_count"
137
+ },
138
+ "subscriber-resub-session": {
139
+ amount: "twitch_session_resub_subscribers_count",
140
+ count: "twitch_session_resub_subscribers_count"
141
+ },
142
+ "subscriber-gifted-session": {
143
+ amount: "twitch_session_gifted_subscribers_count",
144
+ count: "twitch_session_gifted_subscribers_count"
145
+ },
146
+ "cheer-session": {
147
+ amount: "twitch_session_bits_count",
148
+ count: "twitch_session_bits_count"
149
+ },
150
+ "cheer-week": {
151
+ amount: "twitch_week_bits_count",
152
+ count: "twitch_week_bits_count"
153
+ },
154
+ "cheer-month": {
155
+ amount: "twitch_month_bits_count",
156
+ count: "twitch_month_bits_count"
157
+ },
158
+ "cheer-total": {
159
+ amount: "twitch_total_bits_count",
160
+ count: "twitch_total_bits_count"
161
+ },
162
+ "tip-session": {
163
+ amount: "session_donation_amount",
164
+ count: "session_donation_count",
165
+ currency: "session_donation_amount_currency_symbol"
166
+ },
167
+ "tip-week": {
168
+ amount: "week_donation_amount",
169
+ count: "week_donation_count",
170
+ currency: "week_donation_amount_currency_symbol"
171
+ },
172
+ "tip-month": {
173
+ amount: "month_donation_amount",
174
+ count: "month_donation_count",
175
+ currency: "month_donation_amount_currency_symbol"
176
+ },
177
+ "tip-total": {
178
+ amount: "total_donation_amount",
179
+ count: "total_donation_amount",
180
+ currency: "total_donation_amount_currency_symbol"
181
+ },
76
182
  "tip-count": { amount: "donation_count", count: "donation_count" },
77
183
  // Top cheer / cheerer / donator readouts — per period. SE's `se-widget-top-*`
78
184
  // widgets encode the chosen period (session / weekly / monthly / alltime) in
@@ -88,26 +194,118 @@ var TWITCH_CONTEXTS = {
88
194
  // "the user who made the top donation", so the two rows below carry the
89
195
  // same name/username mapping — anything else falls through to the unscoped
90
196
  // `{{username}}` and renders blank.
91
- "cheer-session-top-donation": { name: "twitch_session_top_cheerer", username: "twitch_session_top_cheerer", amount: "twitch_session_top_cheer_amount", count: "twitch_session_top_cheer_amount" },
92
- "cheer-session-top-donator": { name: "twitch_session_top_cheerer", username: "twitch_session_top_cheerer", amount: "twitch_session_top_cheerer_amount", count: "twitch_session_top_cheerer_amount" },
93
- "cheer-weekly-top-donation": { name: "twitch_week_top_cheerer", username: "twitch_week_top_cheerer", amount: "twitch_week_top_cheerer_amount", count: "twitch_week_top_cheerer_amount" },
94
- "cheer-weekly-top-donator": { name: "twitch_week_top_cheerer", username: "twitch_week_top_cheerer", amount: "twitch_week_top_cheerer_amount", count: "twitch_week_top_cheerer_amount" },
95
- "cheer-monthly-top-donation": { name: "twitch_month_top_cheerer", username: "twitch_month_top_cheerer", amount: "twitch_month_top_cheerer_amount", count: "twitch_month_top_cheerer_amount" },
96
- "cheer-monthly-top-donator": { name: "twitch_month_top_cheerer", username: "twitch_month_top_cheerer", amount: "twitch_month_top_cheerer_amount", count: "twitch_month_top_cheerer_amount" },
97
- "cheer-alltime-top-donation": { name: "twitch_alltime_top_cheerer", username: "twitch_alltime_top_cheerer", amount: "twitch_alltime_top_cheerer_amount", count: "twitch_alltime_top_cheerer_amount" },
98
- "cheer-alltime-top-donator": { name: "twitch_alltime_top_cheerer", username: "twitch_alltime_top_cheerer", amount: "twitch_alltime_top_cheerer_amount", count: "twitch_alltime_top_cheerer_amount" },
99
- "tip-session-top-donation": { name: "session_top_donator", username: "session_top_donator", amount: "session_top_donator_amount", count: "session_top_donator_amount", currency: "session_top_donator_currency_symbol" },
100
- "tip-session-top-donator": { name: "session_top_donator", username: "session_top_donator", amount: "session_top_donator_amount", count: "session_top_donator_amount", currency: "session_top_donator_currency_symbol" },
101
- "tip-weekly-top-donation": { name: "week_top_donator", username: "week_top_donator", amount: "week_top_donator_amount", count: "week_top_donator_amount", currency: "week_top_donator_currency_symbol" },
102
- "tip-weekly-top-donator": { name: "week_top_donator", username: "week_top_donator", amount: "week_top_donator_amount", count: "week_top_donator_amount", currency: "week_top_donator_currency_symbol" },
103
- "tip-monthly-top-donation": { name: "month_top_donator", username: "month_top_donator", amount: "month_top_donator_amount", count: "month_top_donator_amount", currency: "month_top_donator_currency_symbol" },
104
- "tip-monthly-top-donator": { name: "month_top_donator", username: "month_top_donator", amount: "month_top_donator_amount", count: "month_top_donator_amount", currency: "month_top_donator_currency_symbol" },
105
- "tip-alltime-top-donation": { name: "top_donator", username: "top_donator", amount: "top_donator_amount", count: "top_donator_amount", currency: "top_donator_currency_symbol" },
106
- "tip-alltime-top-donator": { name: "top_donator", username: "top_donator", amount: "top_donator_amount", count: "top_donator_amount", currency: "top_donator_currency_symbol" },
197
+ "cheer-session-top-donation": {
198
+ name: "twitch_session_top_cheerer",
199
+ username: "twitch_session_top_cheerer",
200
+ amount: "twitch_session_top_cheer_amount",
201
+ count: "twitch_session_top_cheer_amount"
202
+ },
203
+ "cheer-session-top-donator": {
204
+ name: "twitch_session_top_cheerer",
205
+ username: "twitch_session_top_cheerer",
206
+ amount: "twitch_session_top_cheerer_amount",
207
+ count: "twitch_session_top_cheerer_amount"
208
+ },
209
+ "cheer-weekly-top-donation": {
210
+ name: "twitch_week_top_cheerer",
211
+ username: "twitch_week_top_cheerer",
212
+ amount: "twitch_week_top_cheerer_amount",
213
+ count: "twitch_week_top_cheerer_amount"
214
+ },
215
+ "cheer-weekly-top-donator": {
216
+ name: "twitch_week_top_cheerer",
217
+ username: "twitch_week_top_cheerer",
218
+ amount: "twitch_week_top_cheerer_amount",
219
+ count: "twitch_week_top_cheerer_amount"
220
+ },
221
+ "cheer-monthly-top-donation": {
222
+ name: "twitch_month_top_cheerer",
223
+ username: "twitch_month_top_cheerer",
224
+ amount: "twitch_month_top_cheerer_amount",
225
+ count: "twitch_month_top_cheerer_amount"
226
+ },
227
+ "cheer-monthly-top-donator": {
228
+ name: "twitch_month_top_cheerer",
229
+ username: "twitch_month_top_cheerer",
230
+ amount: "twitch_month_top_cheerer_amount",
231
+ count: "twitch_month_top_cheerer_amount"
232
+ },
233
+ "cheer-alltime-top-donation": {
234
+ name: "twitch_alltime_top_cheerer",
235
+ username: "twitch_alltime_top_cheerer",
236
+ amount: "twitch_alltime_top_cheerer_amount",
237
+ count: "twitch_alltime_top_cheerer_amount"
238
+ },
239
+ "cheer-alltime-top-donator": {
240
+ name: "twitch_alltime_top_cheerer",
241
+ username: "twitch_alltime_top_cheerer",
242
+ amount: "twitch_alltime_top_cheerer_amount",
243
+ count: "twitch_alltime_top_cheerer_amount"
244
+ },
245
+ "tip-session-top-donation": {
246
+ name: "session_top_donator",
247
+ username: "session_top_donator",
248
+ amount: "session_top_donator_amount",
249
+ count: "session_top_donator_amount",
250
+ currency: "session_top_donator_currency_symbol"
251
+ },
252
+ "tip-session-top-donator": {
253
+ name: "session_top_donator",
254
+ username: "session_top_donator",
255
+ amount: "session_top_donator_amount",
256
+ count: "session_top_donator_amount",
257
+ currency: "session_top_donator_currency_symbol"
258
+ },
259
+ "tip-weekly-top-donation": {
260
+ name: "week_top_donator",
261
+ username: "week_top_donator",
262
+ amount: "week_top_donator_amount",
263
+ count: "week_top_donator_amount",
264
+ currency: "week_top_donator_currency_symbol"
265
+ },
266
+ "tip-weekly-top-donator": {
267
+ name: "week_top_donator",
268
+ username: "week_top_donator",
269
+ amount: "week_top_donator_amount",
270
+ count: "week_top_donator_amount",
271
+ currency: "week_top_donator_currency_symbol"
272
+ },
273
+ "tip-monthly-top-donation": {
274
+ name: "month_top_donator",
275
+ username: "month_top_donator",
276
+ amount: "month_top_donator_amount",
277
+ count: "month_top_donator_amount",
278
+ currency: "month_top_donator_currency_symbol"
279
+ },
280
+ "tip-monthly-top-donator": {
281
+ name: "month_top_donator",
282
+ username: "month_top_donator",
283
+ amount: "month_top_donator_amount",
284
+ count: "month_top_donator_amount",
285
+ currency: "month_top_donator_currency_symbol"
286
+ },
287
+ "tip-alltime-top-donation": {
288
+ name: "top_donator",
289
+ username: "top_donator",
290
+ amount: "top_donator_amount",
291
+ count: "top_donator_amount",
292
+ currency: "top_donator_currency_symbol"
293
+ },
294
+ "tip-alltime-top-donator": {
295
+ name: "top_donator",
296
+ username: "top_donator",
297
+ amount: "top_donator_amount",
298
+ count: "top_donator_amount",
299
+ currency: "top_donator_currency_symbol"
300
+ },
107
301
  // Botcounter — SE uses `{wins}` for the running chat count; the dispatcher's
108
302
  // fallbackVar for `se-widget-botcounter` is `twitch_session_chat_count`, so
109
303
  // when the listener arg lands as that var name we treat it as the wins source.
110
- twitch_session_chat_count: { wins: "twitch_session_chat_count", count: "twitch_session_chat_count", amount: "twitch_session_chat_count" },
304
+ twitch_session_chat_count: {
305
+ wins: "twitch_session_chat_count",
306
+ count: "twitch_session_chat_count",
307
+ amount: "twitch_session_chat_count"
308
+ },
111
309
  // Merch readouts — SE used to ship via their own shop, now most users route
112
310
  // through Fourthwall. Lumia exposes `fourthwall_last_order` as a full object:
113
311
  // { username, email, friendlyId, amount, currency, message, items,
@@ -136,45 +334,151 @@ var TWITCH_CONTEXTS = {
136
334
  }
137
335
  };
138
336
  var KICK_CONTEXTS = {
139
- "follower-latest": { name: "kick_last_follower", username: "kick_last_follower" },
140
- "subscriber-latest": { name: "kick_last_subscriber", username: "kick_last_subscriber" },
141
- "subscriber-new-latest": { name: "kick_last_subscriber", username: "kick_last_subscriber" },
142
- "subscriber-resub-latest": { name: "kick_last_subscriber", username: "kick_last_subscriber" },
337
+ "follower-latest": {
338
+ name: "kick_last_follower",
339
+ username: "kick_last_follower"
340
+ },
341
+ "subscriber-latest": {
342
+ name: "kick_last_subscriber",
343
+ username: "kick_last_subscriber"
344
+ },
345
+ "subscriber-new-latest": {
346
+ name: "kick_last_subscriber",
347
+ username: "kick_last_subscriber"
348
+ },
349
+ "subscriber-resub-latest": {
350
+ name: "kick_last_subscriber",
351
+ username: "kick_last_subscriber"
352
+ },
143
353
  // Mirror the Twitch split: `{sender}` = giver, `{name}` = recipient.
144
354
  // `kick_last_gifted` was added alongside this mapping; see twitch context
145
355
  // above for the rationale (without the split, SE's "{sender} gifted to
146
356
  // {name}" renders the gifter on both sides).
147
- "subscriber-gifted-latest": { name: "kick_last_gifted", username: "kick_last_gifted", sender: "kick_last_gifter", amount: "kick_last_gifter_amount", count: "kick_last_gifter_amount" },
148
- "cheer-latest": { name: "kick_last_kicks", username: "kick_last_kicks", amount: "kick_last_kicks_amount", count: "kick_last_kicks_amount" },
149
- "raid-latest": { name: "kick_last_host", username: "kick_last_host", amount: "kick_last_host_amount", count: "kick_last_host_amount" },
150
- "follower-session": { amount: "kick_session_follower_count", count: "kick_session_follower_count" },
151
- "subscriber-session": { amount: "kick_session_subscriber_count", count: "kick_session_subscriber_count" },
152
- "cheer-session": { amount: "kick_session_kicks_count", count: "kick_session_kicks_count" },
153
- "subscriber-gifted-session": { amount: "kick_session_gifts_count", count: "kick_session_gifts_count" },
154
- "follower-total": { amount: "kick_total_follower_count", count: "kick_total_follower_count" },
155
- "subscriber-total": { amount: "kick_total_subscriber_count", count: "kick_total_subscriber_count" },
156
- "cheer-total": { amount: "kick_total_kicks_count", count: "kick_total_kicks_count" },
157
- "follower-week": { amount: "kick_week_follower_count", count: "kick_week_follower_count" },
158
- "follower-month": { amount: "kick_month_follower_count", count: "kick_month_follower_count" },
159
- "subscriber-week": { amount: "kick_week_subscriber_count", count: "kick_week_subscriber_count" },
160
- "subscriber-month": { amount: "kick_month_subscriber_count", count: "kick_month_subscriber_count" }
357
+ "subscriber-gifted-latest": {
358
+ name: "kick_last_gifted",
359
+ username: "kick_last_gifted",
360
+ sender: "kick_last_gifter",
361
+ amount: "kick_last_gifter_amount",
362
+ count: "kick_last_gifter_amount"
363
+ },
364
+ "cheer-latest": {
365
+ name: "kick_last_kicks",
366
+ username: "kick_last_kicks",
367
+ amount: "kick_last_kicks_amount",
368
+ count: "kick_last_kicks_amount"
369
+ },
370
+ "raid-latest": {
371
+ name: "kick_last_host",
372
+ username: "kick_last_host",
373
+ amount: "kick_last_host_amount",
374
+ count: "kick_last_host_amount"
375
+ },
376
+ "follower-session": {
377
+ amount: "kick_session_follower_count",
378
+ count: "kick_session_follower_count"
379
+ },
380
+ "subscriber-session": {
381
+ amount: "kick_session_subscriber_count",
382
+ count: "kick_session_subscriber_count"
383
+ },
384
+ "cheer-session": {
385
+ amount: "kick_session_kicks_count",
386
+ count: "kick_session_kicks_count"
387
+ },
388
+ "subscriber-gifted-session": {
389
+ amount: "kick_session_gifts_count",
390
+ count: "kick_session_gifts_count"
391
+ },
392
+ "follower-total": {
393
+ amount: "kick_total_follower_count",
394
+ count: "kick_total_follower_count"
395
+ },
396
+ "subscriber-total": {
397
+ amount: "kick_total_subscriber_count",
398
+ count: "kick_total_subscriber_count"
399
+ },
400
+ "cheer-total": {
401
+ amount: "kick_total_kicks_count",
402
+ count: "kick_total_kicks_count"
403
+ },
404
+ "follower-week": {
405
+ amount: "kick_week_follower_count",
406
+ count: "kick_week_follower_count"
407
+ },
408
+ "follower-month": {
409
+ amount: "kick_month_follower_count",
410
+ count: "kick_month_follower_count"
411
+ },
412
+ "subscriber-week": {
413
+ amount: "kick_week_subscriber_count",
414
+ count: "kick_week_subscriber_count"
415
+ },
416
+ "subscriber-month": {
417
+ amount: "kick_month_subscriber_count",
418
+ count: "kick_month_subscriber_count"
419
+ }
161
420
  };
162
421
  var YOUTUBE_CONTEXTS = {
163
- "follower-latest": { name: "youtube_last_subscriber", username: "youtube_last_subscriber" },
164
- "subscriber-latest": { name: "youtube_last_member", username: "youtube_last_member" },
165
- "subscriber-new-latest": { name: "youtube_last_member", username: "youtube_last_member" },
166
- "subscriber-resub-latest": { name: "youtube_last_member", username: "youtube_last_member" },
167
- "subscriber-gifted-latest": { name: "youtube_last_gift_member", username: "youtube_last_gift_member" },
168
- "cheer-latest": { name: "youtube_last_superchatter", username: "youtube_last_superchatter" },
169
- "follower-session": { amount: "youtube_session_subscriber_count", count: "youtube_session_subscriber_count" },
170
- "subscriber-session": { amount: "youtube_session_member_count", count: "youtube_session_member_count" },
171
- "cheer-session": { amount: "youtube_session_superchat_count", count: "youtube_session_superchat_count" },
172
- "follower-total": { amount: "youtube_total_subscriber_count", count: "youtube_total_subscriber_count" },
173
- "subscriber-total": { amount: "youtube_total_member_count", count: "youtube_total_member_count" },
174
- "follower-week": { amount: "youtube_week_subscriber_count", count: "youtube_week_subscriber_count" },
175
- "follower-month": { amount: "youtube_month_subscriber_count", count: "youtube_month_subscriber_count" },
176
- "subscriber-week": { amount: "youtube_week_member_count", count: "youtube_week_member_count" },
177
- "subscriber-month": { amount: "youtube_month_member_count", count: "youtube_month_member_count" }
422
+ "follower-latest": {
423
+ name: "youtube_last_subscriber",
424
+ username: "youtube_last_subscriber"
425
+ },
426
+ "subscriber-latest": {
427
+ name: "youtube_last_member",
428
+ username: "youtube_last_member"
429
+ },
430
+ "subscriber-new-latest": {
431
+ name: "youtube_last_member",
432
+ username: "youtube_last_member"
433
+ },
434
+ "subscriber-resub-latest": {
435
+ name: "youtube_last_member",
436
+ username: "youtube_last_member"
437
+ },
438
+ "subscriber-gifted-latest": {
439
+ name: "youtube_last_gift_member",
440
+ username: "youtube_last_gift_member"
441
+ },
442
+ "cheer-latest": {
443
+ name: "youtube_last_superchatter",
444
+ username: "youtube_last_superchatter"
445
+ },
446
+ "follower-session": {
447
+ amount: "youtube_session_subscriber_count",
448
+ count: "youtube_session_subscriber_count"
449
+ },
450
+ "subscriber-session": {
451
+ amount: "youtube_session_member_count",
452
+ count: "youtube_session_member_count"
453
+ },
454
+ "cheer-session": {
455
+ amount: "youtube_session_superchat_count",
456
+ count: "youtube_session_superchat_count"
457
+ },
458
+ "follower-total": {
459
+ amount: "youtube_total_subscriber_count",
460
+ count: "youtube_total_subscriber_count"
461
+ },
462
+ "subscriber-total": {
463
+ amount: "youtube_total_member_count",
464
+ count: "youtube_total_member_count"
465
+ },
466
+ "follower-week": {
467
+ amount: "youtube_week_subscriber_count",
468
+ count: "youtube_week_subscriber_count"
469
+ },
470
+ "follower-month": {
471
+ amount: "youtube_month_subscriber_count",
472
+ count: "youtube_month_subscriber_count"
473
+ },
474
+ "subscriber-week": {
475
+ amount: "youtube_week_member_count",
476
+ count: "youtube_week_member_count"
477
+ },
478
+ "subscriber-month": {
479
+ amount: "youtube_month_member_count",
480
+ count: "youtube_month_member_count"
481
+ }
178
482
  };
179
483
  var RECENT_TO_LATEST_LISTENER = {
180
484
  "follower-recent": "follower-latest",
@@ -226,11 +530,14 @@ function translateSeText(input, listener, passthrough, provider, options) {
226
530
  if (!input) return "";
227
531
  const ctx = listener ? listenerPlaceholderContext(listener, provider) : {};
228
532
  const useAlertFallback = (options?.context ?? "alert") === "alert";
229
- return input.replace(/\{([a-zA-Z][a-zA-Z0-9_.]*)\}/g, (_match, raw) => {
230
- if (passthrough?.has(raw)) return `{{${raw}}}`;
231
- const mapped = ctx[raw] ?? (useAlertFallback ? SE_TO_LUMIA_PLACEHOLDER[raw] : void 0) ?? raw;
232
- return `{{${mapped}}}`;
233
- });
533
+ return input.replace(
534
+ /\{([a-zA-Z][a-zA-Z0-9_.]*)\}/g,
535
+ (_match, raw) => {
536
+ if (passthrough?.has(raw)) return `{{${raw}}}`;
537
+ const mapped = ctx[raw] ?? (useAlertFallback ? SE_TO_LUMIA_PLACEHOLDER[raw] : void 0) ?? raw;
538
+ return `{{${mapped}}}`;
539
+ }
540
+ );
234
541
  }
235
542
  var KICK_LISTENER_VARS = {
236
543
  "follower-latest": "kick_last_follower",
@@ -273,8 +580,10 @@ var YOUTUBE_LISTENER_VARS = {
273
580
  function listenerToLumiaVariable(listener, provider = "twitch") {
274
581
  if (typeof listener !== "string" || !listener) return "username";
275
582
  const resolvedListener = RECENT_TO_LATEST_LISTENER[listener] ?? listener;
276
- if (provider === "kick" && KICK_LISTENER_VARS[resolvedListener]) return KICK_LISTENER_VARS[resolvedListener];
277
- if (provider === "youtube" && YOUTUBE_LISTENER_VARS[resolvedListener]) return YOUTUBE_LISTENER_VARS[resolvedListener];
583
+ if (provider === "kick" && KICK_LISTENER_VARS[resolvedListener])
584
+ return KICK_LISTENER_VARS[resolvedListener];
585
+ if (provider === "youtube" && YOUTUBE_LISTENER_VARS[resolvedListener])
586
+ return YOUTUBE_LISTENER_VARS[resolvedListener];
278
587
  const m = {
279
588
  // Latest events
280
589
  "follower-latest": "twitch_last_follower",
@@ -367,7 +676,9 @@ function seCssToBounds(css, defaults = { width: 600, height: 200 }, canvas) {
367
676
  let x = toPx(css.left, 0, "width");
368
677
  let y = toPx(css.top, 0, "height");
369
678
  if (typeof css.transform === "string" && css.transform.includes("translate")) {
370
- const m = /translate\s*\(\s*([^,)]+)\s*(?:,\s*([^)]+))?\s*\)/i.exec(css.transform);
679
+ const m = /translate\s*\(\s*([^,)]+)\s*(?:,\s*([^)]+))?\s*\)/i.exec(
680
+ css.transform
681
+ );
371
682
  if (m) {
372
683
  const parseShift = (raw, basis) => {
373
684
  if (!raw) return 0;
@@ -437,21 +748,33 @@ var LUMIA_DEFAULT_SIZES = {
437
748
  };
438
749
  function translateVariationCondition(seType, seCondition, requirement, seEventType) {
439
750
  if (seType === "gift") return { conditionType: "IS_GIFT", condition: 1 };
440
- if (seType === "communityGift") return { conditionType: "GIFT_SUB_GREATER", condition: requirement ?? 0 };
751
+ if (seType === "communityGift")
752
+ return { conditionType: "GIFT_SUB_GREATER", condition: requirement ?? 0 };
441
753
  const isSubscriberEvent = seEventType === "subscriber";
442
754
  if (isSubscriberEvent && seCondition === "ATLEAST" && requirement != null) {
443
- return { conditionType: "SUBSCRIBED_MONTHS_GREATER", condition: requirement };
755
+ return {
756
+ conditionType: "SUBSCRIBED_MONTHS_GREATER",
757
+ condition: requirement
758
+ };
444
759
  }
445
760
  if (isSubscriberEvent && seCondition === "EXACT" && requirement != null) {
446
761
  return { conditionType: "SUBSCRIBED_MONTHS_EQUAL", condition: requirement };
447
762
  }
448
- if (seCondition === "EXACT" && requirement != null) return { conditionType: "EQUAL_NUMBER", condition: requirement };
763
+ if (seCondition === "EXACT" && requirement != null)
764
+ return { conditionType: "EQUAL_NUMBER", condition: requirement };
449
765
  if (seCondition === "ATLEAST" && requirement != null) {
450
766
  return { conditionType: "GREATER_NUMBER", condition: requirement };
451
767
  }
452
768
  return { conditionType: "RANDOM", condition: 100 };
453
769
  }
454
- var LUMIA_LAYOUTS = /* @__PURE__ */ new Set(["column", "row", "onlyImage", "onlyText", "imageOver", "textOver"]);
770
+ var LUMIA_LAYOUTS = /* @__PURE__ */ new Set([
771
+ "column",
772
+ "row",
773
+ "onlyImage",
774
+ "onlyText",
775
+ "imageOver",
776
+ "textOver"
777
+ ]);
455
778
  var SE_LAYOUT_ALIASES = {
456
779
  behind: "textOver"
457
780
  };
@@ -477,16 +800,39 @@ function mapSeTextCssToModuleCss(widget, defaults = {}) {
477
800
  if (typeof v === "string" && v.length > 0) return v;
478
801
  return fallback;
479
802
  };
480
- return {
481
- lineHeight: asNumOrStr(seTextCss["line-height"], defaults.lineHeight ?? 1),
803
+ const out = {
804
+ lineHeight: asNumOrStr(
805
+ seTextCss["line-height"],
806
+ defaults.lineHeight ?? "normal"
807
+ ),
482
808
  fontSize: asNumOrStr(seTextCss["font-size"], defaults.fontSize ?? 24),
483
809
  textAlign: asStr(seTextCss["text-align"], defaults.textAlign ?? "center"),
484
- fontFamily: asStr(seTextCss["font-family"], defaults.fontFamily ?? "Roboto"),
810
+ fontFamily: asStr(
811
+ seTextCss["font-family"],
812
+ defaults.fontFamily ?? "Roboto"
813
+ ),
485
814
  fontWeight: asStr(seTextCss["font-weight"], defaults.fontWeight ?? "bold"),
815
+ fontStyle: asStr(seTextCss["font-style"], defaults.fontStyle ?? "normal"),
816
+ textTransform: asStr(
817
+ seTextCss["text-transform"],
818
+ defaults.textTransform ?? "none"
819
+ ),
486
820
  color: asStr(seTextCss.color, defaults.color ?? "#ffffff"),
487
- textShadow: asStr(seTextCss["text-shadow"], defaults.textShadow ?? "rgb(0, 0, 0) 1px 1px 1px"),
821
+ textShadow: asStr(
822
+ seTextCss["text-shadow"],
823
+ defaults.textShadow ?? "rgb(0, 0, 0) 1px 1px 1px"
824
+ ),
488
825
  background: defaults.background ?? "transparent"
489
826
  };
827
+ const ls = seTextCss["letter-spacing"];
828
+ if (typeof ls === "number" || typeof ls === "string" && ls.length > 0) out.letterSpacing = ls;
829
+ const ws = seTextCss["word-spacing"];
830
+ if (typeof ws === "number" || typeof ws === "string" && ws.length > 0) out.wordSpacing = ws;
831
+ const sw = seTextCss["-webkit-text-stroke-width"];
832
+ if (typeof sw === "number" || typeof sw === "string" && sw.length > 0) out.WebkitTextStrokeWidth = sw;
833
+ const sc = seTextCss["-webkit-text-stroke-color"];
834
+ if (typeof sc === "string" && sc.length > 0) out.WebkitTextStrokeColor = sc;
835
+ return out;
490
836
  }
491
837
  var READOUT_AUTO_FALLBACK_SIZE = { width: 400, height: 50 };
492
838
  function buildUnit(widget, lumiaType, moduleExtras, ctx, sizeOverride) {
@@ -533,10 +879,18 @@ function buildUnit(widget, lumiaType, moduleExtras, ctx, sizeOverride) {
533
879
  // src/se-import/mappers/basic.ts
534
880
  function seExtraTextCss(seCss, scrolling) {
535
881
  const extra = {};
536
- if (typeof seCss["text-decoration"] === "string") extra.textDecoration = seCss["text-decoration"];
537
- if (typeof seCss["text-transform"] === "string") extra.textTransform = seCss["text-transform"];
538
- if (seCss["-webkit-text-stroke-color"]) extra["-webkit-text-stroke-color"] = seCss["-webkit-text-stroke-color"];
539
- if (seCss["-webkit-text-stroke-width"] != null) extra["-webkit-text-stroke-width"] = seCss["-webkit-text-stroke-width"];
882
+ if (typeof seCss["text-decoration"] === "string")
883
+ extra.textDecoration = seCss["text-decoration"];
884
+ if (typeof seCss["text-transform"] === "string")
885
+ extra.textTransform = seCss["text-transform"];
886
+ if (typeof seCss["font-style"] === "string")
887
+ extra.fontStyle = seCss["font-style"];
888
+ if (seCss["-webkit-text-stroke-color"])
889
+ extra.WebkitTextStrokeColor = seCss["-webkit-text-stroke-color"];
890
+ if (seCss["-webkit-text-stroke-width"] != null)
891
+ extra.WebkitTextStrokeWidth = seCss["-webkit-text-stroke-width"];
892
+ if (seCss["letter-spacing"] != null) extra.letterSpacing = seCss["letter-spacing"];
893
+ if (seCss["word-spacing"] != null) extra.wordSpacing = seCss["word-spacing"];
540
894
  if (scrolling?.enabled) {
541
895
  extra.scroll = true;
542
896
  const speed = Number(scrolling.speed);
@@ -545,54 +899,82 @@ function seExtraTextCss(seCss, scrolling) {
545
899
  return extra;
546
900
  }
547
901
  function mapText(widget, ctx) {
548
- const value = translateSeText(widget.text?.value ?? "", null, void 0, ctx?.provider, { context: "static" });
902
+ const value = translateSeText(
903
+ widget.text?.value ?? "",
904
+ null,
905
+ void 0,
906
+ ctx?.provider,
907
+ { context: "static" }
908
+ );
549
909
  const seCss = widget.text?.css ?? {};
550
- return buildUnit(widget, "text", {
551
- content: {
552
- value,
553
- highlightColor: "inherit"
910
+ return buildUnit(
911
+ widget,
912
+ "text",
913
+ {
914
+ content: {
915
+ value,
916
+ highlightColor: "inherit"
917
+ },
918
+ css: {
919
+ fontSize: seCss["font-size"] ?? 24,
920
+ textAlign: seCss["text-align"] ?? "center",
921
+ fontFamily: seCss["font-family"] ?? "Roboto",
922
+ fontWeight: seCss["font-weight"] ?? "bold",
923
+ color: seCss["color"] ?? "#ffffff",
924
+ textShadow: seCss["text-shadow"] ?? "rgb(0, 0, 0) 1px 1px 1px",
925
+ lineHeight: seCss["line-height"] ?? "normal",
926
+ background: "transparent",
927
+ ...seExtraTextCss(seCss, widget.text?.scrolling)
928
+ }
554
929
  },
555
- css: {
556
- fontSize: seCss["font-size"] ?? 24,
557
- textAlign: seCss["text-align"] ?? "center",
558
- fontFamily: seCss["font-family"] ?? "Roboto",
559
- fontWeight: seCss["font-weight"] ?? "bold",
560
- color: seCss["color"] ?? "#ffffff",
561
- textShadow: seCss["text-shadow"] ?? "rgb(0, 0, 0) 1px 1px 1px",
562
- lineHeight: seCss["line-height"] ?? 1,
563
- background: "transparent",
564
- ...seExtraTextCss(seCss, widget.text?.scrolling)
565
- }
566
- }, ctx);
930
+ ctx
931
+ );
567
932
  }
568
933
  function mapImage(widget, ctx) {
569
- return buildUnit(widget, "image", {
570
- content: {
571
- src: widget.image?.src ?? "",
572
- loop: true
573
- }
574
- }, ctx);
934
+ return buildUnit(
935
+ widget,
936
+ "image",
937
+ {
938
+ content: {
939
+ src: widget.image?.src ?? "",
940
+ loop: true
941
+ }
942
+ },
943
+ ctx
944
+ );
575
945
  }
576
946
  function mapVideo(widget, ctx) {
577
- return buildUnit(widget, "video", {
578
- content: {
579
- src: widget.video?.src ?? "",
580
- volume: widget.video?.volume ?? 0.5,
581
- loop: true,
582
- muted: false
583
- }
584
- }, ctx);
947
+ const unit = buildUnit(
948
+ widget,
949
+ "video",
950
+ {
951
+ content: {
952
+ src: widget.video?.src ?? "",
953
+ volume: widget.video?.volume ?? 0.5,
954
+ loop: true,
955
+ muted: false
956
+ }
957
+ },
958
+ ctx
959
+ );
960
+ unit.layer.bounds.autoHeight = true;
961
+ return unit;
585
962
  }
586
963
  var LUMIA_SNOW_WEBM = "https://storage.lumiastream.com/overlays/global/seasonal/snow.webm";
587
964
  function mapSnow(widget, ctx) {
588
- return buildUnit(widget, "video", {
589
- content: {
590
- src: LUMIA_SNOW_WEBM,
591
- volume: 0,
592
- loop: true,
593
- muted: true
594
- }
595
- }, ctx);
965
+ return buildUnit(
966
+ widget,
967
+ "video",
968
+ {
969
+ content: {
970
+ src: LUMIA_SNOW_WEBM,
971
+ volume: 0,
972
+ loop: true,
973
+ muted: true
974
+ }
975
+ },
976
+ ctx
977
+ );
596
978
  }
597
979
  function mapReadout(widget, fallbackVar, ctx) {
598
980
  const explicitListener = widget.variables?.listener;
@@ -602,7 +984,9 @@ function mapReadout(widget, fallbackVar, ctx) {
602
984
  const variable = listenerToLumiaVariable(listener, ctx?.provider);
603
985
  const userTemplate = widget.text?.value ?? "";
604
986
  const inheritsText = userTemplate.trim().length > 0 && /\{[a-zA-Z]/.test(userTemplate);
605
- const value = inheritsText ? translateSeText(userTemplate, listener, void 0, ctx?.provider, { context: "static" }) : `{{${variable}}}`;
987
+ const value = inheritsText ? translateSeText(userTemplate, listener, void 0, ctx?.provider, {
988
+ context: "static"
989
+ }) : `{{${variable}}}`;
606
990
  const seCss = widget.text?.css ?? {};
607
991
  return buildUnit(
608
992
  widget,
@@ -616,7 +1000,7 @@ function mapReadout(widget, fallbackVar, ctx) {
616
1000
  fontWeight: seCss["font-weight"] ?? "bold",
617
1001
  color: seCss["color"] ?? "#ffffff",
618
1002
  textShadow: seCss["text-shadow"] ?? "rgb(0, 0, 0) 1px 1px 1px",
619
- lineHeight: seCss["line-height"] ?? 1,
1003
+ lineHeight: seCss["line-height"] ?? "normal",
620
1004
  background: "transparent",
621
1005
  ...seExtraTextCss(seCss, widget.text?.scrolling)
622
1006
  }
@@ -1487,15 +1871,13 @@ function computeAllowedEventsFromSEListeners(seListeners, explicitListener) {
1487
1871
  });
1488
1872
  return allowedAlerts;
1489
1873
  }
1490
- function seScrollSpeedToMarqueeDurationSec(seSpeed) {
1491
- const n = typeof seSpeed === "number" && Number.isFinite(seSpeed) ? seSpeed : 6;
1492
- const clamped = Math.min(20, Math.max(1, n));
1493
- const duration = 60 / clamped;
1494
- return Math.min(120, Math.max(5, Math.round(duration * 10) / 10));
1874
+ var LUMIA_DEFAULT_MARQUEE_PIXELS_PER_SECOND = 20;
1875
+ function seScrollSpeedToPixelsPerSecond(_seSpeed) {
1876
+ return LUMIA_DEFAULT_MARQUEE_PIXELS_PER_SECOND;
1495
1877
  }
1496
1878
  function seTemplateToMarqueeTemplate(seTemplate) {
1497
1879
  if (typeof seTemplate !== "string" || !seTemplate.trim()) return void 0;
1498
- return seTemplate.split("{name}").join("{username}").split("{username}").join("{username}");
1880
+ return translateSeText(seTemplate);
1499
1881
  }
1500
1882
  function mapEventList(widget, ctx) {
1501
1883
  const v = widget.variables ?? {};
@@ -1508,7 +1890,7 @@ function mapEventList(widget, ctx) {
1508
1890
  const scrolling = seText?.scrolling;
1509
1891
  const isMarquee = !!(scrolling && scrolling.enabled === true);
1510
1892
  const itemTemplate = isMarquee ? seTemplateToMarqueeTemplate(seText?.value) : void 0;
1511
- const marqueeSpeed = isMarquee ? seScrollSpeedToMarqueeDurationSec(scrolling?.speed) : void 0;
1893
+ const marqueeSpeed = isMarquee ? seScrollSpeedToPixelsPerSecond(scrolling?.speed) : void 0;
1512
1894
  const marqueeDirection = isMarquee ? scrolling?.direction === "right" ? "right" : "left" : void 0;
1513
1895
  const theme = isMarquee ? "marquee" : v.theme ?? "simple";
1514
1896
  return buildUnit(
@@ -1943,6 +2325,47 @@ function mapTimer(widget, ctx) {
1943
2325
  function mapNowPlaying(widget, ctx) {
1944
2326
  const v = widget.variables ?? {};
1945
2327
  const source = v.provider === "youtube" ? "youtubemusic" : "spotify";
2328
+ const isMarquee = !!v.simpleDesign;
2329
+ const text = widget.text ?? {};
2330
+ const scrolling = text.scrolling ?? {};
2331
+ const seTextCss = text.css ?? {};
2332
+ const seTemplate = typeof text.value === "string" && text.value.trim().length > 0 ? text.value : "";
2333
+ const itemTemplate = seTemplate ? seTemplate.replace(/\{title\}/gi, "{{songTitle}}").replace(/\{artist\}/gi, "{{songArtist}}") : "{{songTitle}} - {{songArtist}}";
2334
+ const marqueeSpeed = 20;
2335
+ const marqueeDirection = scrolling.direction === "right" ? "right" : "left";
2336
+ const wantsShadow = text.enableShadow !== false;
2337
+ const importedCss = {
2338
+ borderRadius: "0px",
2339
+ borderStyle: "solid",
2340
+ borderWidth: "0px",
2341
+ borderColor: "transparent",
2342
+ fontSize: seTextCss["font-size"] ?? 24,
2343
+ textAlign: seTextCss["text-align"] ?? "left",
2344
+ fontFamily: seTextCss["font-family"] ?? "Be Vietnam Pro",
2345
+ fontWeight: seTextCss["font-weight"] ?? "bold",
2346
+ color: seTextCss["color"] ?? "#ffffff",
2347
+ textShadow: wantsShadow ? seTextCss["text-shadow"] ?? "rgb(0, 0, 0) 1px 1px 1px" : "none",
2348
+ // `normal` (not `1`) when SE didn't specify — see the same fix in
2349
+ // `build.ts::mapSeTextCssToModuleCss` and `basic.ts::mapText` for the
2350
+ // rationale. This path is the now-playing / current-song mapper, which
2351
+ // is the one the user noticed had a too-tight line-height in the
2352
+ // marquee render.
2353
+ lineHeight: seTextCss["line-height"] ?? "normal",
2354
+ background: "transparent"
2355
+ };
2356
+ if (typeof seTextCss["text-transform"] === "string")
2357
+ importedCss.textTransform = seTextCss["text-transform"];
2358
+ if (typeof seTextCss["font-style"] === "string")
2359
+ importedCss.fontStyle = seTextCss["font-style"];
2360
+ if (typeof seTextCss["text-decoration"] === "string")
2361
+ importedCss.textDecoration = seTextCss["text-decoration"];
2362
+ if (typeof seTextCss["letter-spacing"] === "string" || typeof seTextCss["letter-spacing"] === "number") {
2363
+ importedCss.letterSpacing = seTextCss["letter-spacing"];
2364
+ }
2365
+ if (seTextCss["-webkit-text-stroke-color"])
2366
+ importedCss["-webkit-text-stroke-color"] = seTextCss["-webkit-text-stroke-color"];
2367
+ if (seTextCss["-webkit-text-stroke-width"] != null)
2368
+ importedCss["-webkit-text-stroke-width"] = seTextCss["-webkit-text-stroke-width"];
1946
2369
  return buildUnit(
1947
2370
  widget,
1948
2371
  "nowplaying",
@@ -1951,7 +2374,7 @@ function mapNowPlaying(widget, ctx) {
1951
2374
  version: 1,
1952
2375
  type: "nowplaying",
1953
2376
  source,
1954
- theme: "basic",
2377
+ theme: isMarquee ? "marquee" : "basic",
1955
2378
  borderRadius: "30px",
1956
2379
  songTitle: `{{${source}_now_playing_song=Lumia Dream}}`,
1957
2380
  songArtist: `{{${source}_now_playing_artist}}`,
@@ -1959,20 +2382,14 @@ function mapNowPlaying(widget, ctx) {
1959
2382
  showImg: true,
1960
2383
  oneLineTitle: false,
1961
2384
  highlightColor: "inherit",
2385
+ ...isMarquee ? {
2386
+ marqueeSpeed,
2387
+ marqueeDirection,
2388
+ themeConfig: { itemTemplate }
2389
+ } : {},
1962
2390
  importMeta: buildImportMeta(widget, { simpleDesign: !!v.simpleDesign })
1963
2391
  },
1964
- css: {
1965
- borderRadius: "0px",
1966
- borderStyle: "solid",
1967
- borderWidth: "0px",
1968
- borderColor: "transparent",
1969
- lineHeight: 1,
1970
- textAlign: "left",
1971
- fontFamily: "Be Vietnam Pro",
1972
- color: "#ffffff",
1973
- textShadow: "rgb(0, 0, 0) 1px 1px 1px",
1974
- background: "transparent"
1975
- }
2392
+ css: importedCss
1976
2393
  },
1977
2394
  ctx
1978
2395
  );
@@ -2391,6 +2808,22 @@ function mapEmoteWall(widget, ctx) {
2391
2808
  );
2392
2809
  }
2393
2810
  function mapUnsupportedAsText(widget, ctx) {
2811
+ const userTemplate = typeof widget.text?.value === "string" ? widget.text.value.trim() : "";
2812
+ const inheritsText = userTemplate.length > 0 && /\{[a-zA-Z]/.test(userTemplate);
2813
+ if (inheritsText) {
2814
+ return buildUnit(
2815
+ widget,
2816
+ "text",
2817
+ {
2818
+ css: mapSeTextCssToModuleCss(widget, { fontSize: 24 }),
2819
+ content: {
2820
+ value: translateSeText(userTemplate),
2821
+ highlightColor: "inherit"
2822
+ }
2823
+ },
2824
+ ctx
2825
+ );
2826
+ }
2394
2827
  return buildUnit(
2395
2828
  widget,
2396
2829
  "text",
@@ -4050,12 +4483,12 @@ var LSFontPicker = memo(function LSFontPicker2({
4050
4483
  transform: "rotate(180deg)"
4051
4484
  }
4052
4485
  }
4053
- }
4054
- },
4055
- ListboxProps: {
4056
- sx: {
4057
- maxHeight: 300,
4058
- padding: 0
4486
+ },
4487
+ listbox: {
4488
+ sx: {
4489
+ maxHeight: 300,
4490
+ padding: 0
4491
+ }
4059
4492
  }
4060
4493
  },
4061
4494
  noOptionsText: "No fonts found",
@@ -4078,27 +4511,39 @@ var LSFontPicker = memo(function LSFontPicker2({
4078
4511
  key
4079
4512
  );
4080
4513
  },
4081
- renderInput: (params) => /* @__PURE__ */ jsx8(
4082
- TextFieldComponent,
4083
- {
4084
- ...params,
4085
- label,
4086
- helperText,
4087
- placeholder,
4088
- fullWidth: true,
4089
- className: "mui-ls-input",
4090
- variant: "outlined",
4091
- sx: {
4092
- "& .MuiOutlinedInput-root": {
4093
- paddingRight: "0.5rem"
4514
+ renderInput: (params) => {
4515
+ const {
4516
+ InputLabelProps: paramsInputLabelProps,
4517
+ InputProps: paramsInputProps,
4518
+ ...restParams
4519
+ } = params;
4520
+ return /* @__PURE__ */ jsx8(
4521
+ TextFieldComponent,
4522
+ {
4523
+ ...restParams,
4524
+ label,
4525
+ helperText,
4526
+ placeholder,
4527
+ fullWidth: true,
4528
+ className: "mui-ls-input",
4529
+ variant: "outlined",
4530
+ sx: {
4531
+ "& .MuiOutlinedInput-root": {
4532
+ paddingRight: "0.5rem"
4533
+ }
4534
+ },
4535
+ slotProps: {
4536
+ inputLabel: {
4537
+ shrink: true,
4538
+ ...paramsInputLabelProps ?? {}
4539
+ },
4540
+ input: {
4541
+ ...paramsInputProps ?? {}
4542
+ }
4094
4543
  }
4095
- },
4096
- InputLabelProps: {
4097
- shrink: true,
4098
- ...params.InputLabelProps ?? {}
4099
4544
  }
4100
- }
4101
- )
4545
+ );
4546
+ }
4102
4547
  }
4103
4548
  ) });
4104
4549
  });