@vimine/sdk 0.3.2 → 0.3.4

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.
@@ -1,6 +1,173 @@
1
1
  import { Vimine, type VimineOptions } from "./index.js";
2
+ declare const STRINGS: {
3
+ it: {
4
+ signIn: string;
5
+ signOut: string;
6
+ loading: string;
7
+ notSignedIn: string;
8
+ noMembership: string;
9
+ notActive: string;
10
+ error: string;
11
+ noEvents: string;
12
+ free: string;
13
+ places: string;
14
+ register: string;
15
+ signInToRegister: string;
16
+ joinAndBook: string;
17
+ alreadyMember: string;
18
+ registered: string;
19
+ reserved: string;
20
+ details: string;
21
+ reason: Record<string, string>;
22
+ };
23
+ en: {
24
+ signIn: string;
25
+ signOut: string;
26
+ loading: string;
27
+ notSignedIn: string;
28
+ noMembership: string;
29
+ notActive: string;
30
+ error: string;
31
+ noEvents: string;
32
+ free: string;
33
+ places: string;
34
+ register: string;
35
+ signInToRegister: string;
36
+ joinAndBook: string;
37
+ alreadyMember: string;
38
+ registered: string;
39
+ reserved: string;
40
+ details: string;
41
+ reason: Record<string, string>;
42
+ };
43
+ "zh-Hans": {
44
+ signIn: string;
45
+ signOut: string;
46
+ loading: string;
47
+ notSignedIn: string;
48
+ noMembership: string;
49
+ notActive: string;
50
+ error: string;
51
+ noEvents: string;
52
+ free: string;
53
+ places: string;
54
+ register: string;
55
+ signInToRegister: string;
56
+ joinAndBook: string;
57
+ alreadyMember: string;
58
+ registered: string;
59
+ reserved: string;
60
+ details: string;
61
+ reason: Record<string, string>;
62
+ };
63
+ "zh-Hant": {
64
+ signIn: string;
65
+ signOut: string;
66
+ loading: string;
67
+ notSignedIn: string;
68
+ noMembership: string;
69
+ notActive: string;
70
+ error: string;
71
+ noEvents: string;
72
+ free: string;
73
+ places: string;
74
+ register: string;
75
+ signInToRegister: string;
76
+ joinAndBook: string;
77
+ alreadyMember: string;
78
+ registered: string;
79
+ reserved: string;
80
+ details: string;
81
+ reason: Record<string, string>;
82
+ };
83
+ fr: {
84
+ signIn: string;
85
+ signOut: string;
86
+ loading: string;
87
+ notSignedIn: string;
88
+ noMembership: string;
89
+ notActive: string;
90
+ error: string;
91
+ noEvents: string;
92
+ free: string;
93
+ places: string;
94
+ register: string;
95
+ signInToRegister: string;
96
+ joinAndBook: string;
97
+ alreadyMember: string;
98
+ registered: string;
99
+ reserved: string;
100
+ details: string;
101
+ reason: Record<string, string>;
102
+ };
103
+ es: {
104
+ signIn: string;
105
+ signOut: string;
106
+ loading: string;
107
+ notSignedIn: string;
108
+ noMembership: string;
109
+ notActive: string;
110
+ error: string;
111
+ noEvents: string;
112
+ free: string;
113
+ places: string;
114
+ register: string;
115
+ signInToRegister: string;
116
+ joinAndBook: string;
117
+ alreadyMember: string;
118
+ registered: string;
119
+ reserved: string;
120
+ details: string;
121
+ reason: Record<string, string>;
122
+ };
123
+ de: {
124
+ signIn: string;
125
+ signOut: string;
126
+ loading: string;
127
+ notSignedIn: string;
128
+ noMembership: string;
129
+ notActive: string;
130
+ error: string;
131
+ noEvents: string;
132
+ free: string;
133
+ places: string;
134
+ register: string;
135
+ signInToRegister: string;
136
+ joinAndBook: string;
137
+ alreadyMember: string;
138
+ registered: string;
139
+ reserved: string;
140
+ details: string;
141
+ reason: Record<string, string>;
142
+ };
143
+ "pt-BR": {
144
+ signIn: string;
145
+ signOut: string;
146
+ loading: string;
147
+ notSignedIn: string;
148
+ noMembership: string;
149
+ notActive: string;
150
+ error: string;
151
+ noEvents: string;
152
+ free: string;
153
+ places: string;
154
+ register: string;
155
+ signInToRegister: string;
156
+ joinAndBook: string;
157
+ alreadyMember: string;
158
+ registered: string;
159
+ reserved: string;
160
+ details: string;
161
+ reason: Record<string, string>;
162
+ };
163
+ };
164
+ type Lang = keyof typeof STRINGS;
165
+ /** The elements' language for a page's tag, or null when they do not speak it (`preview`: drafts included). */
166
+ export declare const matchLang: (tag: string, preview?: boolean) => Lang | null;
2
167
  /** The client the elements use. Call once; pass your own instance to share it with the rest of the page. */
3
- export declare function defineVimineElements(options: VimineOptions | Vimine): Vimine;
168
+ export declare function defineVimineElements(options: VimineOptions | Vimine, elements?: {
169
+ previewLanguages?: boolean;
170
+ }): Vimine;
4
171
  /** `<vimine-sign-in scope="…" return-to="/area" label="…" handle-redirect>` — a sign-in / sign-out button. */
5
172
  export declare class VimineSignIn extends HTMLElement {
6
173
  private unsubscribe;
@@ -79,3 +246,4 @@ export declare class VimineEvents extends HTMLElement {
79
246
  private card;
80
247
  private typeRow;
81
248
  }
249
+ export {};
package/dist/elements.js CHANGED
@@ -90,15 +90,255 @@ const STRINGS = {
90
90
  invalid_type: "invalid type",
91
91
  },
92
92
  },
93
+ "zh-Hans": {
94
+ signIn: "使用 Vimine 登录",
95
+ signOut: "退出",
96
+ loading: "加载中…",
97
+ notSignedIn: "请登录以查看您的会员卡。",
98
+ noMembership: "您在这个协会没有会员卡。",
99
+ notActive: "会员卡尚未生效:生效后会显示二维码。",
100
+ error: "出现错误。",
101
+ noEvents: "暂无安排的活动。",
102
+ free: "免费",
103
+ places: "个名额",
104
+ register: "报名",
105
+ signInToRegister: "登录后报名",
106
+ joinAndBook: "加入协会并预约",
107
+ alreadyMember: "已是会员?请登录",
108
+ registered: "报名已确认",
109
+ reserved: "名额已保留:等待缴纳参与费",
110
+ details: "详情",
111
+ reason: {
112
+ sold_out: "名额已满",
113
+ event_full: "已满员",
114
+ registration_not_open: "报名尚未开始",
115
+ registration_closed: "报名已截止",
116
+ membership_required: "仅限会员",
117
+ membership_not_active: "会员卡无效",
118
+ membership_not_yet_valid: "在该日期您的会员卡尚不可用",
119
+ membership_type_not_allowed: "该会员卡类型不在允许范围内",
120
+ max_per_user: "已报名",
121
+ event_past: "活动已结束",
122
+ event_cancelled: "活动已取消",
123
+ event_not_published: "未发布",
124
+ plan_limit: "不可用",
125
+ invalid_type: "类型无效",
126
+ },
127
+ },
128
+ "zh-Hant": {
129
+ signIn: "使用 Vimine 登入",
130
+ signOut: "退出",
131
+ loading: "載入中…",
132
+ notSignedIn: "請登入以檢視您的會員卡。",
133
+ noMembership: "您在這個協會沒有會員卡。",
134
+ notActive: "會員卡尚未生效:生效後會顯示二維碼。",
135
+ error: "出現錯誤。",
136
+ noEvents: "暫無安排的活動。",
137
+ free: "免費",
138
+ places: "個名額",
139
+ register: "報名",
140
+ signInToRegister: "登入後報名",
141
+ joinAndBook: "加入協會並預約",
142
+ alreadyMember: "已是會員?請登入",
143
+ registered: "報名已確認",
144
+ reserved: "名額已保留:等待繳納參與費",
145
+ details: "詳情",
146
+ reason: {
147
+ sold_out: "名額已滿",
148
+ event_full: "已滿員",
149
+ registration_not_open: "報名尚未開始",
150
+ registration_closed: "報名已截止",
151
+ membership_required: "僅限會員",
152
+ membership_not_active: "會員卡無效",
153
+ membership_not_yet_valid: "在該日期您的會員卡尚不可用",
154
+ membership_type_not_allowed: "該會員卡類型不在允許範圍內",
155
+ max_per_user: "已報名",
156
+ event_past: "活動已結束",
157
+ event_cancelled: "活動已取消",
158
+ event_not_published: "未釋出",
159
+ plan_limit: "不可用",
160
+ invalid_type: "類型無效",
161
+ },
162
+ },
163
+ "fr": {
164
+ signIn: "Se connecter avec Vimine",
165
+ signOut: "Se déconnecter",
166
+ loading: "Chargement…",
167
+ notSignedIn: "Connectez-vous pour voir votre carte.",
168
+ noMembership: "Aucune carte dans cette association.",
169
+ notActive: "La carte n'est pas encore active : le code apparaîtra lorsqu'elle le sera.",
170
+ error: "Une erreur s'est produite.",
171
+ noEvents: "Aucun événement prévu.",
172
+ free: "gratuite",
173
+ places: "places",
174
+ register: "S'inscrire",
175
+ signInToRegister: "Se connecter pour s'inscrire",
176
+ joinAndBook: "Adhérer à l'association et réserver",
177
+ alreadyMember: "Déjà membre : se connecter",
178
+ registered: "Inscription confirmée",
179
+ reserved: "Place réservée : en attente de la contribution",
180
+ details: "Détails",
181
+ reason: {
182
+ sold_out: "plus de places",
183
+ event_full: "complet",
184
+ registration_not_open: "inscriptions pas encore ouvertes",
185
+ registration_closed: "inscriptions closes",
186
+ membership_required: "réservé aux membres",
187
+ membership_not_active: "adhésion non valable",
188
+ membership_not_yet_valid: "la carte n'est pas encore utilisable à cette date",
189
+ membership_type_not_allowed: "type d'adhésion non admis",
190
+ max_per_user: "déjà inscrit",
191
+ event_past: "événement terminé",
192
+ event_cancelled: "événement annulé",
193
+ event_not_published: "non publié",
194
+ plan_limit: "non disponible",
195
+ invalid_type: "type non valide",
196
+ },
197
+ },
198
+ "es": {
199
+ signIn: "Iniciar sesión con Vimine",
200
+ signOut: "Cerrar sesión",
201
+ loading: "Cargando…",
202
+ notSignedIn: "Inicia sesión para ver tu carné.",
203
+ noMembership: "No tienes carné en esta asociación.",
204
+ notActive: "El carné aún no está activo: el código aparece cuando lo esté.",
205
+ error: "Se ha producido un error.",
206
+ noEvents: "No hay eventos programados.",
207
+ free: "gratuita",
208
+ places: "plazas",
209
+ register: "Inscríbete",
210
+ signInToRegister: "Inicia sesión para inscribirte",
211
+ joinAndBook: "Hazte socio y reserva",
212
+ alreadyMember: "¿Ya eres socio? Inicia sesión",
213
+ registered: "Inscripción confirmada",
214
+ reserved: "Plaza reservada: pendiente de la contribución",
215
+ details: "Detalles",
216
+ reason: {
217
+ sold_out: "agotado",
218
+ event_full: "completo",
219
+ registration_not_open: "inscripciones aún no abiertas",
220
+ registration_closed: "inscripciones cerradas",
221
+ membership_required: "solo para socios",
222
+ membership_not_active: "carné no válido",
223
+ membership_not_yet_valid: "el carné aún no se puede usar en esa fecha",
224
+ membership_type_not_allowed: "tipo de carné no admitido",
225
+ max_per_user: "ya inscrito",
226
+ event_past: "evento finalizado",
227
+ event_cancelled: "evento cancelado",
228
+ event_not_published: "no publicado",
229
+ plan_limit: "no disponible",
230
+ invalid_type: "tipo no válido",
231
+ },
232
+ },
233
+ "de": {
234
+ signIn: "Mit Vimine anmelden",
235
+ signOut: "Abmelden",
236
+ loading: "Wird geladen…",
237
+ notSignedIn: "Melden Sie sich an, um Ihren Ausweis zu sehen.",
238
+ noMembership: "Keine Mitgliedschaft in diesem Verein.",
239
+ notActive: "Der Ausweis ist noch nicht aktiv: Der Code erscheint, sobald er es ist.",
240
+ error: "Ein Fehler ist aufgetreten.",
241
+ noEvents: "Keine Veranstaltungen geplant.",
242
+ free: "kostenlos",
243
+ places: "Plätze",
244
+ register: "Teilnehmen",
245
+ signInToRegister: "Zum Teilnehmen anmelden",
246
+ joinAndBook: "Dem Verein beitreten und Platz reservieren",
247
+ alreadyMember: "Schon Mitglied? Anmelden",
248
+ registered: "Anmeldung bestätigt",
249
+ reserved: "Platz reserviert: Beitrag ausstehend",
250
+ details: "Details",
251
+ reason: {
252
+ sold_out: "ausgebucht",
253
+ event_full: "voll",
254
+ registration_not_open: "Anmeldung noch nicht offen",
255
+ registration_closed: "Anmeldung geschlossen",
256
+ membership_required: "nur für Mitglieder",
257
+ membership_not_active: "Mitgliedschaft nicht gültig",
258
+ membership_not_yet_valid: "Ihr Ausweis ist an diesem Datum noch nicht nutzbar",
259
+ membership_type_not_allowed: "Mitgliedsart nicht zugelassen",
260
+ max_per_user: "bereits angemeldet",
261
+ event_past: "Veranstaltung vorbei",
262
+ event_cancelled: "Veranstaltung abgesagt",
263
+ event_not_published: "nicht veröffentlicht",
264
+ plan_limit: "nicht verfügbar",
265
+ invalid_type: "ungültige Art",
266
+ },
267
+ },
268
+ "pt-BR": {
269
+ signIn: "Entrar com Vimine",
270
+ signOut: "Sair",
271
+ loading: "Carregando…",
272
+ notSignedIn: "Entre para ver sua carteirinha.",
273
+ noMembership: "Nenhuma carteirinha nesta associação.",
274
+ notActive: "A carteirinha ainda não está ativa: o código aparece quando ela for ativada.",
275
+ error: "Ocorreu um erro.",
276
+ noEvents: "Nenhum evento programado.",
277
+ free: "gratuita",
278
+ places: "vagas",
279
+ register: "Inscrever-se",
280
+ signInToRegister: "Entre para se inscrever",
281
+ joinAndBook: "Associe-se e reserve",
282
+ alreadyMember: "Já sou associado: entrar",
283
+ registered: "Inscrição confirmada",
284
+ reserved: "Vaga reservada: aguardando a contribuição",
285
+ details: "Detalhes",
286
+ reason: {
287
+ sold_out: "esgotado",
288
+ event_full: "lotado",
289
+ registration_not_open: "inscrições ainda não abertas",
290
+ registration_closed: "inscrições encerradas",
291
+ membership_required: "exclusivo para associados",
292
+ membership_not_active: "carteirinha inválida",
293
+ membership_not_yet_valid: "a carteirinha ainda não pode ser usada nessa data",
294
+ membership_type_not_allowed: "tipo de carteirinha não admitido",
295
+ max_per_user: "já inscrito",
296
+ event_past: "evento encerrado",
297
+ event_cancelled: "evento cancelado",
298
+ event_not_published: "não publicado",
299
+ plan_limit: "indisponível",
300
+ invalid_type: "tipo inválido",
301
+ },
302
+ },
303
+ };
304
+ // Languages drafted and not yet read by a native speaker — as on the platform, which serves a draft only where its preview
305
+ // switch names it. Their strings ship, but an element speaks one only on a page that opted in
306
+ // (`defineVimineElements(options, { previewLanguages: true })`); elsewhere it speaks Italian, as the platform would.
307
+ // A language leaves this list with the platform, in an SDK release. Empty since 2026-10-20: the platform enabled its six
308
+ // drafted languages ahead of their review (the owner's decision), and the elements speak them with it.
309
+ const DRAFT_LANGS = [];
310
+ let previewLanguages = false;
311
+ // The page's language → the elements' own: the tag itself, Chinese by script (zh-TW, zh-HK → Traditional; zh, zh-CN →
312
+ // Simplified), any other variant to the language's (en-GB → en, pt-PT → pt-BR); Italian otherwise. The platform's rule.
313
+ const LANGS = Object.keys(STRINGS);
314
+ /** The elements' language for a page's tag, or null when they do not speak it (`preview`: drafts included). */
315
+ export const matchLang = (tag, preview = previewLanguages) => {
316
+ const served = LANGS.filter((l) => preview || !DRAFT_LANGS.includes(l));
317
+ const lower = tag.trim().replace(/_/g, "-").toLowerCase();
318
+ const exact = served.find((l) => l.toLowerCase() === lower);
319
+ if (exact)
320
+ return exact;
321
+ const [lang, ...rest] = lower.split("-");
322
+ if (lang === "zh") {
323
+ const script = rest.some((p) => ["hant", "tw", "hk", "mo"].includes(p)) ? "zh-Hant" : "zh-Hans";
324
+ return served.includes(script) ? script : null;
325
+ }
326
+ return served.find((l) => l.toLowerCase().split("-")[0] === lang) || null;
93
327
  };
94
- const langOf = (el) => {
95
- const l = (el.getAttribute("lang") ||
96
- el.closest("[lang]")?.getAttribute("lang") ||
97
- document.documentElement.lang ||
98
- "it")
99
- .slice(0, 2)
100
- .toLowerCase();
101
- return l === "en" ? "en" : "it";
328
+ const langOf = (el) => matchLang(el.getAttribute("lang") ||
329
+ el.closest("[lang]")?.getAttribute("lang") ||
330
+ document.documentElement.lang ||
331
+ "it") || "it";
332
+ // Dates and amounts in the reader's conventions: English with day-month order, Chinese naming its script.
333
+ const INTL = {
334
+ it: "it-IT",
335
+ en: "en-GB",
336
+ "zh-Hans": "zh-Hans-CN",
337
+ "zh-Hant": "zh-Hant-TW",
338
+ fr: "fr-FR",
339
+ es: "es-ES",
340
+ de: "de-DE",
341
+ "pt-BR": "pt-BR",
102
342
  };
103
343
  const BASE_CSS = /* CSS */ `
104
344
  :host { display: inline-block; font-family: var(--vimine-font, system-ui, sans-serif); color: var(--vimine-color, #111); }
@@ -114,8 +354,9 @@ const shadow = (el, css) => {
114
354
  return root;
115
355
  };
116
356
  /** The client the elements use. Call once; pass your own instance to share it with the rest of the page. */
117
- export function defineVimineElements(options) {
357
+ export function defineVimineElements(options, elements = {}) {
118
358
  shared = options instanceof Vimine ? options : new Vimine(options);
359
+ previewLanguages = !!elements.previewLanguages;
119
360
  if (typeof customElements !== "undefined") {
120
361
  if (!customElements.get("vimine-sign-in"))
121
362
  customElements.define("vimine-sign-in", VimineSignIn);
@@ -366,7 +607,7 @@ export class VimineEnroll extends HTMLElement {
366
607
  }
367
608
  const money = (amount, currency, lang) => {
368
609
  try {
369
- return new Intl.NumberFormat(lang === "en" ? "en-GB" : "it-IT", {
610
+ return new Intl.NumberFormat(INTL[lang], {
370
611
  style: "currency",
371
612
  currency: currency || "EUR",
372
613
  }).format(amount);
@@ -377,7 +618,7 @@ const money = (amount, currency, lang) => {
377
618
  };
378
619
  const when = (iso, tz, lang) => {
379
620
  try {
380
- return new Date(iso).toLocaleString(lang === "en" ? "en-GB" : "it-IT", {
621
+ return new Date(iso).toLocaleString(INTL[lang], {
381
622
  timeZone: tz,
382
623
  dateStyle: "full",
383
624
  timeStyle: "short",