@vicacha-devs/strapi-plugin-certificates 0.0.0-stage → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +17 -2
  3. package/dist/admin/CertificatesPage-CFDIEBN_.js +783 -0
  4. package/dist/admin/CertificatesPage-DeGmoX7h.cjs +783 -0
  5. package/dist/admin/SettingsPage-CsWFO1XB.js +447 -0
  6. package/dist/admin/SettingsPage-D7Ob1gV0.cjs +447 -0
  7. package/dist/admin/ar-Bv3T0_7C.cjs +258 -0
  8. package/dist/admin/ar-CDFHNnFd.js +258 -0
  9. package/dist/admin/de-BjMxn-Lt.js +258 -0
  10. package/dist/admin/de-DB5eW-yI.cjs +258 -0
  11. package/dist/admin/en-BI5Z3lPW.js +258 -0
  12. package/dist/admin/en-CsYV0VDf.cjs +258 -0
  13. package/dist/admin/es-B7uy9a-2.js +258 -0
  14. package/dist/admin/es-DEp3j3kD.cjs +258 -0
  15. package/dist/admin/fr-D7y038Pm.cjs +258 -0
  16. package/dist/admin/fr-DxbtdEIA.js +258 -0
  17. package/dist/admin/id-DfW4ARVm.js +258 -0
  18. package/dist/admin/id-Wuw9jl-Y.cjs +258 -0
  19. package/dist/admin/index-BQdS3gc3.cjs +707 -0
  20. package/dist/admin/index-BYO34da4.js +708 -0
  21. package/dist/admin/index.cjs +5 -0
  22. package/dist/admin/index.js +5 -0
  23. package/dist/admin/index.mjs +5 -0
  24. package/dist/admin/pt-C0QaikKS.js +258 -0
  25. package/dist/admin/pt-Dj2oc3Ga.cjs +258 -0
  26. package/dist/admin/src/components/IssueCertificateModal.d.ts +9 -0
  27. package/dist/admin/src/components/SettingsTabHelpers.d.ts +13 -0
  28. package/dist/admin/src/index.d.ts +11 -0
  29. package/dist/admin/src/pages/CertificatesPage.d.ts +3 -0
  30. package/dist/admin/src/pages/SettingsPage.d.ts +3 -0
  31. package/dist/admin/src/translations/cmLabels.d.ts +1 -0
  32. package/dist/admin/src/translations/cmPlaceholders.d.ts +1 -0
  33. package/dist/admin/tr-BbeagXRY.js +258 -0
  34. package/dist/admin/tr-DlGl_XMF.cjs +258 -0
  35. package/dist/admin/ur-Bwn4TrjF.js +258 -0
  36. package/dist/admin/ur-qIlUtgqb.cjs +258 -0
  37. package/dist/admin/zh-Cmg5mEvP.js +258 -0
  38. package/dist/admin/zh-D-3QDsuQ.cjs +258 -0
  39. package/dist/package.json +3 -0
  40. package/dist/server/index.cjs +2282 -0
  41. package/dist/server/index.js +2282 -0
  42. package/dist/server/index.mjs +2282 -0
  43. package/dist/server/src/bootstrap.d.ts +5 -0
  44. package/dist/server/src/content-types/certificate/schema.json.d.ts +165 -0
  45. package/dist/server/src/content-types/index.d.ts +277 -0
  46. package/dist/server/src/content-types/template/schema.json.d.ts +118 -0
  47. package/dist/server/src/controllers/admin.d.ts +31 -0
  48. package/dist/server/src/controllers/content-api.d.ts +28 -0
  49. package/dist/server/src/controllers/index.d.ts +30 -0
  50. package/dist/server/src/index.d.ts +413 -0
  51. package/dist/server/src/register.d.ts +5 -0
  52. package/dist/server/src/routes/admin.d.ts +12 -0
  53. package/dist/server/src/routes/content-api.d.ts +12 -0
  54. package/dist/server/src/routes/index.d.ts +25 -0
  55. package/dist/server/src/services/docusign.d.ts +76 -0
  56. package/dist/server/src/services/index.d.ts +76 -0
  57. package/dist/server/src/services/issuance.d.ts +54 -0
  58. package/dist/server/src/services/issuanceHelpers.d.ts +47 -0
  59. package/dist/server/src/services/settings.d.ts +17 -0
  60. package/dist/server/src/services/urlHelpers.d.ts +2 -0
  61. package/dist/shared/calendarSystems.d.ts +3 -0
  62. package/dist/shared/cryptoEngine.d.ts +27 -0
  63. package/dist/shared/documentRenderer.d.ts +12 -0
  64. package/dist/shared/index.cjs +636 -0
  65. package/dist/shared/index.d.ts +5 -0
  66. package/dist/shared/index.js +613 -0
  67. package/dist/shared/index.mjs +613 -0
  68. package/dist/shared/pluginId.d.ts +2 -0
  69. package/dist/shared/types.d.ts +194 -0
  70. package/package.json +112 -3
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const designSystem = require("@strapi/design-system");
5
+ const admin = require("@strapi/strapi/admin");
6
+ const react = require("react");
7
+ const reactIntl = require("react-intl");
8
+ const index = require("./index-BQdS3gc3.cjs");
9
+ const SUB_CARD_BORDER = {
10
+ border: "1px solid rgba(128, 128, 128, 0.18)"
11
+ };
12
+ const INLINE_CODE_STYLE = {
13
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
14
+ fontSize: "0.88em",
15
+ padding: "2px 6px",
16
+ borderRadius: 4,
17
+ background: "rgba(128, 128, 128, 0.16)",
18
+ border: "1px solid rgba(128, 128, 128, 0.25)"
19
+ };
20
+ const gridStyle = (cols) => ({
21
+ display: "grid",
22
+ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,
23
+ gap: 20
24
+ });
25
+ const Code = ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("code", { style: INLINE_CODE_STYLE, children });
26
+ const renderCheckbox = (checked, onChange, children) => /* @__PURE__ */ jsxRuntime.jsx(
27
+ designSystem.Checkbox,
28
+ {
29
+ checked,
30
+ onCheckedChange: (val) => onChange(Boolean(val)),
31
+ children
32
+ }
33
+ );
34
+ const renderField = (label, hint, placeholder, value, onChange) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { hint, children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: label }),
36
+ /* @__PURE__ */ jsxRuntime.jsx(
37
+ designSystem.TextInput,
38
+ {
39
+ placeholder,
40
+ value,
41
+ onChange: (e) => onChange(e.target.value)
42
+ }
43
+ ),
44
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
45
+ ] });
46
+ const TabPanelBox = ({ value, children }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tabs.Content, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
47
+ designSystem.Box,
48
+ {
49
+ padding: 6,
50
+ background: "neutral0",
51
+ hasRadius: true,
52
+ shadow: "filterShadow",
53
+ style: { borderTopLeftRadius: 0, borderTopRightRadius: 0 },
54
+ children
55
+ }
56
+ ) });
57
+ const SettingsPage = () => {
58
+ const { formatMessage } = reactIntl.useIntl();
59
+ const t = (id, defaultMessage) => formatMessage({ id: `${index.PLUGIN_ID}.${id}`, defaultMessage });
60
+ const { get, put, post } = admin.useFetchClient();
61
+ const { toggleNotification } = admin.useNotification();
62
+ const notify = (type, message) => toggleNotification({ type, message });
63
+ const [settings, setSettings] = react.useState(null);
64
+ const [saving, setSaving] = react.useState(false);
65
+ const [rotating, setRotating] = react.useState(false);
66
+ const runAsync = async (fn, errMsg, setBusy) => {
67
+ setBusy?.(true);
68
+ try {
69
+ await fn();
70
+ } catch {
71
+ notify("danger", errMsg);
72
+ } finally {
73
+ setBusy?.(false);
74
+ }
75
+ };
76
+ const loadSettings = react.useCallback(
77
+ () => runAsync(
78
+ async () => {
79
+ const res = await get(
80
+ `/${index.PLUGIN_ID}/settings`
81
+ );
82
+ if (res.data?.data) setSettings(res.data.data);
83
+ },
84
+ t(
85
+ "settings.ui.msg_failed_to_load_certificates_plugin_settings",
86
+ "Failed to load certificates plugin settings"
87
+ )
88
+ ),
89
+ [get, toggleNotification]
90
+ );
91
+ react.useEffect(() => {
92
+ void loadSettings();
93
+ }, [loadSettings]);
94
+ const handleSave = () => settings && runAsync(
95
+ async () => {
96
+ const res = await put(
97
+ `/${index.PLUGIN_ID}/settings`,
98
+ settings
99
+ );
100
+ if (res.data?.data) setSettings(res.data.data);
101
+ notify(
102
+ "success",
103
+ t(
104
+ "settings.ui.msg_certificates_authority_settings_saved",
105
+ "Certificates authority settings saved"
106
+ )
107
+ );
108
+ },
109
+ t("settings.ui.msg_failed_to_save_settings", "Failed to save settings"),
110
+ setSaving
111
+ );
112
+ const handleRotateKeys = () => runAsync(
113
+ async () => {
114
+ await post(`/${index.PLUGIN_ID}/settings/rotate-keys`, {});
115
+ notify(
116
+ "warning",
117
+ t(
118
+ "settings.ui.msg_generated_new_ed25519_signing_keypair",
119
+ "Generated new Ed25519 signing keypair"
120
+ )
121
+ );
122
+ await loadSettings();
123
+ },
124
+ t(
125
+ "settings.ui.msg_failed_to_rotate_ed25519_keypair",
126
+ "Failed to rotate Ed25519 keypair"
127
+ ),
128
+ setRotating
129
+ );
130
+ const handleSeedDefaults = () => runAsync(
131
+ async () => {
132
+ const res = await post(
133
+ `/${index.PLUGIN_ID}/templates/seed`,
134
+ {}
135
+ );
136
+ notify(
137
+ "success",
138
+ `Seeded ${res.data?.data?.seededCount ?? 0} default template(s)`
139
+ );
140
+ },
141
+ t(
142
+ "settings.ui.msg_failed_to_seed_default_templates",
143
+ "Failed to seed default templates"
144
+ )
145
+ );
146
+ if (!settings) {
147
+ return /* @__PURE__ */ jsxRuntime.jsx(admin.Layouts.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(admin.Layouts.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 6, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: t("settings.ui.loading_settings", "Loading settings...") }) }) }) });
148
+ }
149
+ const patchSettings = (patch) => setSettings({ ...settings, ...patch });
150
+ const updateEsign = (patch) => patchSettings({
151
+ esign: {
152
+ ...settings.esign || {
153
+ enabled: false,
154
+ provider: "docusign",
155
+ baseUrl: "https://demo.docusign.net/restapi",
156
+ accountId: ""
157
+ },
158
+ ...patch
159
+ }
160
+ });
161
+ return /* @__PURE__ */ jsxRuntime.jsxs(admin.Layouts.Root, { children: [
162
+ /* @__PURE__ */ jsxRuntime.jsx(
163
+ admin.Layouts.Header,
164
+ {
165
+ title: t(
166
+ "settings.ui.title_certificates_authority_ed25519_docusign_settings",
167
+ "Certificates Authority & Ed25519 / DocuSign Settings"
168
+ ),
169
+ subtitle: t(
170
+ "settings.ui.subtitle_configure_issuer_organization_metadata_public_ve",
171
+ "Configure issuer organization metadata, public verification URL, Ed25519 cryptographic signing keys, and optional DocuSign eSignature integration"
172
+ ),
173
+ primaryAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleSave, loading: saving, children: t("settings.ui.save_settings", "Save Settings") })
174
+ }
175
+ ),
176
+ /* @__PURE__ */ jsxRuntime.jsx(admin.Layouts.Content, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tabs.Root, { defaultValue: "organization", children: [
177
+ /* @__PURE__ */ jsxRuntime.jsxs(
178
+ designSystem.Tabs.List,
179
+ {
180
+ "aria-label": t(
181
+ "settings.ui.title_certificates_authority_ed25519_docusign_settings",
182
+ "Certificates Authority Settings"
183
+ ),
184
+ children: [
185
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tabs.Trigger, { value: "organization", children: t(
186
+ "settings.tab.organization",
187
+ "Issuing Organization & Verification"
188
+ ) }),
189
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tabs.Trigger, { value: "docusign", children: t("settings.tab.docusign", "DocuSign E-Signature") }),
190
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tabs.Trigger, { value: "keys", children: t("settings.tab.keys", "Ed25519 Signing Keys") })
191
+ ]
192
+ }
193
+ ),
194
+ /* @__PURE__ */ jsxRuntime.jsxs(TabPanelBox, { value: "organization", children: [
195
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "beta", fontWeight: "bold", children: t(
196
+ "settings.ui.1_issuing_organization_verification_portal",
197
+ "Issuing Organization & Verification Portal"
198
+ ) }),
199
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { marginTop: 4, style: gridStyle(3), children: [
200
+ renderField(
201
+ t("field.organization_name", "Organization Name"),
202
+ t(
203
+ "settings.ui.official_issuing_authority_name_printed_on_signe",
204
+ "Official issuing authority name printed on signed certificates and verification payloads."
205
+ ),
206
+ t(
207
+ "placeholder.e_g_mezquita_central_abu_bakr_as_siddiq",
208
+ "e.g., Abu Bakr As-Siddiq Central Mosque"
209
+ ),
210
+ settings.organizationName,
211
+ (organizationName) => patchSettings({ organizationName })
212
+ ),
213
+ renderField(
214
+ t(
215
+ "field.organization_subheader_jurisdiction",
216
+ "Organization Subheader / Jurisdiction"
217
+ ),
218
+ t(
219
+ "settings.ui.legal_registration_or_jurisdiction_line_displaye",
220
+ "Legal registration or jurisdiction line displayed beneath the organization header."
221
+ ),
222
+ t(
223
+ "placeholder.e_g_bogot_d_c_colombia_personer_a_jur_dica_espec",
224
+ "e.g., Bogotá D.C., Colombia — Special Legal Entity"
225
+ ),
226
+ settings.organizationSubheader,
227
+ (organizationSubheader) => patchSettings({ organizationSubheader })
228
+ ),
229
+ renderField(
230
+ t(
231
+ "field.public_verification_base_url",
232
+ "Public Verification Base URL"
233
+ ),
234
+ t(
235
+ "settings.ui.base_url_encoded_into_certificate_qr_codes_for_i",
236
+ "Base URL encoded into certificate QR codes for instant authenticity verification."
237
+ ),
238
+ t(
239
+ "placeholder.e_g_https_mezquitacentralbogota_org_verify",
240
+ "e.g., https://mezquitacentralbogota.org/verify"
241
+ ),
242
+ settings.verificationBaseUrl,
243
+ (verificationBaseUrl) => patchSettings({ verificationBaseUrl })
244
+ )
245
+ ] }),
246
+ /* @__PURE__ */ jsxRuntime.jsx(
247
+ designSystem.Box,
248
+ {
249
+ marginTop: 4,
250
+ padding: 4,
251
+ background: "neutral100",
252
+ hasRadius: true,
253
+ style: SUB_CARD_BORDER,
254
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 3, alignItems: "stretch", children: [
255
+ renderCheckbox(
256
+ settings.maskPublicRecipientName,
257
+ (maskPublicRecipientName) => patchSettings({ maskPublicRecipientName }),
258
+ t(
259
+ "checkbox.mask_recipient_full_name_on_public_serial_lookup",
260
+ "Mask recipient full name on public serial lookups unless verification token is provided"
261
+ )
262
+ ),
263
+ renderCheckbox(
264
+ settings.allowPublicApplications,
265
+ (allowPublicApplications) => patchSettings({ allowPublicApplications }),
266
+ /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
267
+ t(
268
+ "checkbox.allow_public_certificate_applications",
269
+ "Allow public certificate applications"
270
+ ),
271
+ " ",
272
+ "(",
273
+ /* @__PURE__ */ jsxRuntime.jsx(Code, { children: t(
274
+ "settings.ui.endpoint_apply",
275
+ "POST /api/certificates/apply"
276
+ ) }),
277
+ ")"
278
+ ] })
279
+ )
280
+ ] })
281
+ }
282
+ )
283
+ ] }),
284
+ /* @__PURE__ */ jsxRuntime.jsxs(TabPanelBox, { value: "docusign", children: [
285
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "beta", fontWeight: "bold", children: t(
286
+ "settings.ui.2_optional_docusign_e_signature_service",
287
+ "Optional DocuSign E-Signature Service"
288
+ ) }),
289
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: [
290
+ t("settings.ui.secrets_prefix", "Secrets"),
291
+ " (",
292
+ /* @__PURE__ */ jsxRuntime.jsx(Code, { children: "DOCUSIGN_ACCESS_TOKEN" }),
293
+ " ",
294
+ t("settings.ui.and_conjunction", "&"),
295
+ " ",
296
+ /* @__PURE__ */ jsxRuntime.jsx(Code, { children: "DOCUSIGN_WEBHOOK_SECRET" }),
297
+ ")",
298
+ " ",
299
+ t(
300
+ "settings.ui.secrets_loaded_from_env",
301
+ "are loaded from environment variables. Connect webhook endpoint:"
302
+ ),
303
+ " ",
304
+ /* @__PURE__ */ jsxRuntime.jsx(Code, { children: t(
305
+ "settings.ui.endpoint_docusign_webhook",
306
+ "POST /api/certificates/webhooks/docusign"
307
+ ) })
308
+ ] }) }),
309
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 4, marginTop: 4, alignItems: "stretch", children: [
310
+ /* @__PURE__ */ jsxRuntime.jsx(
311
+ designSystem.Box,
312
+ {
313
+ padding: 4,
314
+ background: "neutral100",
315
+ hasRadius: true,
316
+ style: SUB_CARD_BORDER,
317
+ children: renderCheckbox(
318
+ settings.esign?.enabled ?? false,
319
+ (enabled) => updateEsign({
320
+ enabled,
321
+ provider: enabled ? "docusign" : "none"
322
+ }),
323
+ t(
324
+ "checkbox.enable_docusign_esignature_multi_party_envelope_",
325
+ "Enable DocuSign eSignature multi-party envelope routing for Witnesses & Signatories"
326
+ )
327
+ )
328
+ }
329
+ ),
330
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: gridStyle(2), children: [
331
+ renderField(
332
+ t(
333
+ "field.docusign_rest_api_base_url_https",
334
+ "DocuSign REST API Base URL (HTTPS)"
335
+ ),
336
+ t(
337
+ "settings.ui.docusign_rest_api_endpoint_demo_sandbox_or_produ",
338
+ "DocuSign REST API endpoint (demo sandbox or production account URI)."
339
+ ),
340
+ t(
341
+ "placeholder.e_g_https_demo_docusign_net_restapi",
342
+ "e.g., https://demo.docusign.net/restapi"
343
+ ),
344
+ settings.esign?.baseUrl || "https://demo.docusign.net/restapi",
345
+ (baseUrl) => updateEsign({ baseUrl })
346
+ ),
347
+ renderField(
348
+ t("field.docusign_account_id", "DocuSign Account ID"),
349
+ t(
350
+ "settings.ui.docusign_api_account_guid_used_when_dispatching_",
351
+ "DocuSign API Account GUID used when dispatching signature envelopes."
352
+ ),
353
+ t("placeholder.e_g_a1b2c3d4", "e.g., a1b2c3d4-..."),
354
+ settings.esign?.accountId || "ds-account-bogota-central",
355
+ (accountId) => updateEsign({ accountId })
356
+ )
357
+ ] })
358
+ ] })
359
+ ] }),
360
+ /* @__PURE__ */ jsxRuntime.jsxs(TabPanelBox, { value: "keys", children: [
361
+ /* @__PURE__ */ jsxRuntime.jsxs(
362
+ designSystem.Flex,
363
+ {
364
+ justifyContent: "space-between",
365
+ alignItems: "center",
366
+ wrap: "wrap",
367
+ gap: 2,
368
+ children: [
369
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
370
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "beta", fontWeight: "bold", children: t(
371
+ "settings.ui.3_ed25519_cryptographic_public_key",
372
+ "Ed25519 Cryptographic Public Key"
373
+ ) }),
374
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: [
375
+ t(
376
+ "settings.ui.active_key_fingerprint",
377
+ "Active Key Fingerprint:"
378
+ ),
379
+ " ",
380
+ /* @__PURE__ */ jsxRuntime.jsx(Code, { children: settings.publicKeyFingerprint })
381
+ ] }) })
382
+ ] }),
383
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
384
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "secondary", onClick: handleSeedDefaults, children: t(
385
+ "settings.ui.seed_default_templates",
386
+ "Seed Default Templates"
387
+ ) }),
388
+ /* @__PURE__ */ jsxRuntime.jsx(
389
+ designSystem.Button,
390
+ {
391
+ variant: "danger-light",
392
+ onClick: handleRotateKeys,
393
+ loading: rotating,
394
+ children: t(
395
+ "settings.ui.rotate_ed25519_keypair",
396
+ "Rotate Ed25519 Keypair"
397
+ )
398
+ }
399
+ )
400
+ ] })
401
+ ]
402
+ }
403
+ ),
404
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(
405
+ designSystem.Field.Root,
406
+ {
407
+ hint: t(
408
+ "settings.ui.public_key_pem_hint",
409
+ "Read-only Ed25519 public key in SPKI PEM format used to verify certificate signatures offline."
410
+ ),
411
+ children: [
412
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { children: [
413
+ t(
414
+ "field.public_key_pem_published_at",
415
+ "Public Key PEM (Published at"
416
+ ),
417
+ " ",
418
+ /* @__PURE__ */ jsxRuntime.jsx(Code, { children: t(
419
+ "settings.ui.endpoint_public_key",
420
+ "GET /api/certificates/public-key"
421
+ ) }),
422
+ " ",
423
+ t(
424
+ "field.for_offline_embassy_verification",
425
+ "for offline embassy/consular verification)"
426
+ )
427
+ ] }),
428
+ /* @__PURE__ */ jsxRuntime.jsx(
429
+ designSystem.Textarea,
430
+ {
431
+ placeholder: t(
432
+ "placeholder.begin_public_key",
433
+ "-----BEGIN PUBLIC KEY-----"
434
+ ),
435
+ value: settings.publicKeyPem,
436
+ disabled: true
437
+ }
438
+ ),
439
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
440
+ ]
441
+ }
442
+ ) })
443
+ ] })
444
+ ] }) })
445
+ ] });
446
+ };
447
+ exports.SettingsPage = SettingsPage;