@flamingo-stack/openframe-frontend-core 0.0.721 → 0.0.723

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 (154) hide show
  1. package/dist/assets/index.cjs +0 -6
  2. package/dist/assets/index.d.ts +0 -1
  3. package/dist/assets/index.d.ts.map +1 -1
  4. package/dist/assets/index.js +1 -5
  5. package/dist/{chunk-I2254QN6.cjs → chunk-2MC4DRSC.cjs} +3 -3
  6. package/dist/{chunk-UXU7Y5BH.js → chunk-2VOPQJNR.js} +3 -3
  7. package/dist/{chunk-QYS4YVEP.cjs → chunk-3RIKO2O2.cjs} +31 -31
  8. package/dist/{chunk-KFOAV77K.js → chunk-5D2K7TFT.js} +1 -1
  9. package/dist/{chunk-GGBYZKMS.cjs → chunk-6QTGLBJH.cjs} +5 -5
  10. package/dist/{chunk-5QXE5HMV.js → chunk-7JXCLUU7.js} +3 -3
  11. package/dist/{chunk-LAXKEBDD.js → chunk-A7JPMNHF.js} +7 -7
  12. package/dist/{chunk-7Z5FMQYR.cjs → chunk-ABSWD4PQ.cjs} +14 -14
  13. package/dist/{chunk-742BGXNX.js → chunk-EWED6ISQ.js} +1 -1
  14. package/dist/{chunk-S63QBBT7.js → chunk-F6JAGSKV.js} +5 -5
  15. package/dist/{chunk-QLTXT562.cjs → chunk-FDWYBJYD.cjs} +6 -6
  16. package/dist/{chunk-2P2M27EW.js → chunk-G6YNPBWV.js} +2219 -2202
  17. package/dist/{chunk-QQCFPMAA.js → chunk-GRDJR2Q7.js} +1 -1
  18. package/dist/{chunk-O5EHOJZD.cjs → chunk-GYUFKNOQ.cjs} +7 -7
  19. package/dist/{chunk-OKE5BIQH.cjs → chunk-HP4UUBJC.cjs} +8 -8
  20. package/dist/{chunk-HXB7SEYG.js → chunk-IIBTYCEN.js} +7 -16
  21. package/dist/{chunk-GCK75D7F.cjs → chunk-JENNI7XU.cjs} +56 -31
  22. package/dist/{chunk-ZLUFEWZZ.js → chunk-JL7AHSFE.js} +6 -6
  23. package/dist/{chunk-JDBZ4ZHU.js → chunk-KS3YLYVL.js} +2 -2
  24. package/dist/{chunk-6AJIOW3S.cjs → chunk-KSADTFNZ.cjs} +37 -37
  25. package/dist/{chunk-D2DH6VZL.cjs → chunk-KSZRALRL.cjs} +3 -3
  26. package/dist/{chunk-RJMWJAJO.cjs → chunk-KY4WQYYG.cjs} +19 -19
  27. package/dist/{chunk-IYVFSLWJ.js → chunk-KZQO5EJQ.js} +4 -0
  28. package/dist/{chunk-IMTY3GRR.cjs → chunk-LV6UJD2K.cjs} +2 -2
  29. package/dist/{chunk-UZTOI6FJ.cjs → chunk-MWLVYYRX.cjs} +619 -602
  30. package/dist/{chunk-44Q6MV7C.js → chunk-N4VCU6XP.js} +1 -1
  31. package/dist/{chunk-F7ORKKEF.cjs → chunk-NESUUHPV.cjs} +83 -83
  32. package/dist/{chunk-BYVVE7HP.cjs → chunk-NFABAOMD.cjs} +34 -36
  33. package/dist/{chunk-3R32ZNA2.cjs → chunk-OHC2MPUO.cjs} +35 -35
  34. package/dist/{chunk-RCI3PALX.js → chunk-OVG6MV3X.js} +6 -6
  35. package/dist/{chunk-HJMSNOBT.cjs → chunk-OWRD2GZU.cjs} +258 -267
  36. package/dist/{chunk-VFICDEYJ.cjs → chunk-P7MDECYI.cjs} +41 -41
  37. package/dist/{chunk-NPSJE7J3.js → chunk-PKS2QQJU.js} +29 -4
  38. package/dist/{chunk-57UTI7ZH.js → chunk-QBXEF7D5.js} +4 -4
  39. package/dist/{chunk-74N742ZG.js → chunk-SBCJFJ6Q.js} +4 -4
  40. package/dist/{chunk-XXO52RZR.cjs → chunk-TDSLKKX7.cjs} +18 -18
  41. package/dist/{chunk-F5BPGWGT.cjs → chunk-TKFTWM3V.cjs} +5 -1
  42. package/dist/{chunk-GYAXV3MZ.js → chunk-UYMTAFHG.js} +4 -6
  43. package/dist/{chunk-XE2K53GH.cjs → chunk-VGXAZEQP.cjs} +17 -17
  44. package/dist/{chunk-3LY7V3RF.js → chunk-VIFVSFYY.js} +2 -2
  45. package/dist/{chunk-LODMNSQY.cjs → chunk-WSMOTZRJ.cjs} +11 -11
  46. package/dist/{chunk-CO3FOZIH.js → chunk-WVA7SCLY.js} +1 -1
  47. package/dist/{chunk-ZZEKXGFS.js → chunk-WY4SLTMZ.js} +2 -2
  48. package/dist/{chunk-NJ5TBTJG.js → chunk-XTG7W75B.js} +5 -5
  49. package/dist/{chunk-NMPVK53I.cjs → chunk-Y5H3M7OM.cjs} +23 -23
  50. package/dist/{chunk-E6SMMMKV.js → chunk-YGIUWQEN.js} +9 -9
  51. package/dist/{chunk-RQZQHLNS.cjs → chunk-YQOJOW2Z.cjs} +66 -66
  52. package/dist/{chunk-LGKMR7NZ.js → chunk-YUSA7IPD.js} +3 -3
  53. package/dist/{cloud-tenants-HZHKRUIW.cjs → cloud-tenants-3TVX7U23.cjs} +10 -10
  54. package/dist/{cloud-tenants-Q4TCJS5Y.js → cloud-tenants-N6KV2T7X.js} +9 -9
  55. package/dist/components/case-studies/index.cjs +23 -23
  56. package/dist/components/case-studies/index.js +10 -10
  57. package/dist/components/chat/index.cjs +7 -7
  58. package/dist/components/chat/index.js +6 -6
  59. package/dist/components/contact/index.cjs +11 -11
  60. package/dist/components/contact/index.js +10 -10
  61. package/dist/components/docs/index.cjs +14 -14
  62. package/dist/components/docs/index.js +13 -13
  63. package/dist/components/embeds/index.cjs +11 -11
  64. package/dist/components/embeds/index.js +10 -10
  65. package/dist/components/faq/index.cjs +11 -11
  66. package/dist/components/faq/index.js +10 -10
  67. package/dist/components/features/index.cjs +10 -10
  68. package/dist/components/features/index.js +9 -9
  69. package/dist/components/features/remote-session/remote-access-request-card.d.ts.map +1 -1
  70. package/dist/components/help-center-pages/download-apps-page.d.ts +19 -6
  71. package/dist/components/help-center-pages/download-apps-page.d.ts.map +1 -1
  72. package/dist/components/help-center-pages/index.cjs +170 -151
  73. package/dist/components/help-center-pages/index.d.ts +1 -1
  74. package/dist/components/help-center-pages/index.d.ts.map +1 -1
  75. package/dist/components/help-center-pages/index.js +88 -69
  76. package/dist/components/help-center-pages/trust-center-page.d.ts +34 -1
  77. package/dist/components/help-center-pages/trust-center-page.d.ts.map +1 -1
  78. package/dist/components/help-center-pages/trust-center-sections.d.ts +1 -1
  79. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  80. package/dist/components/index.cjs +66 -64
  81. package/dist/components/index.js +23 -21
  82. package/dist/components/meeting-scheduler/index.cjs +47 -47
  83. package/dist/components/meeting-scheduler/index.js +9 -9
  84. package/dist/components/navigation/index.cjs +13 -13
  85. package/dist/components/navigation/index.js +12 -12
  86. package/dist/components/onboarding-guides/index.cjs +13 -13
  87. package/dist/components/onboarding-guides/index.js +12 -12
  88. package/dist/components/product-demo/index.cjs +8 -8
  89. package/dist/components/product-demo/index.js +8 -8
  90. package/dist/components/related-content/index.cjs +5 -5
  91. package/dist/components/related-content/index.js +4 -4
  92. package/dist/components/tickets/index.cjs +14 -14
  93. package/dist/components/tickets/index.js +13 -13
  94. package/dist/components/ui/data-attribution.d.ts +3 -1
  95. package/dist/components/ui/data-attribution.d.ts.map +1 -1
  96. package/dist/components/ui/download-button.d.ts +19 -0
  97. package/dist/components/ui/download-button.d.ts.map +1 -0
  98. package/dist/components/ui/index.cjs +12 -10
  99. package/dist/components/ui/index.d.ts +1 -0
  100. package/dist/components/ui/index.d.ts.map +1 -1
  101. package/dist/components/ui/index.js +11 -9
  102. package/dist/components/ui/mobile-app-qr.d.ts +13 -15
  103. package/dist/components/ui/mobile-app-qr.d.ts.map +1 -1
  104. package/dist/{devices-NOUGVTES.js → devices-275UZZUS.js} +9 -9
  105. package/dist/{devices-6XHUFIC6.cjs → devices-MAALZ7DX.cjs} +11 -11
  106. package/dist/index.cjs +19 -19
  107. package/dist/index.js +23 -23
  108. package/dist/{knowledge-2YTUXQ2Z.js → knowledge-THXC2KC3.js} +9 -9
  109. package/dist/{knowledge-ANEKPMO2.cjs → knowledge-YMMULPPK.cjs} +11 -11
  110. package/dist/{logs-WVQIONUT.js → logs-GM2XBHYT.js} +9 -9
  111. package/dist/{logs-U3IB3HUM.cjs → logs-IBUKQOHS.cjs} +18 -18
  112. package/dist/{policies-UFRN2EQF.cjs → policies-J5GJXD6G.cjs} +14 -14
  113. package/dist/{policies-66EGDW2H.js → policies-NKMRK6RR.js} +9 -9
  114. package/dist/{remote-session-6WEUJZDC.js → remote-session-WCLR47RN.js} +4 -4
  115. package/dist/{remote-session-A75X5NPC.cjs → remote-session-Z2YCUPHU.cjs} +6 -6
  116. package/dist/{software-update-3ZD3MXF3.js → software-update-EKKMKDWI.js} +9 -9
  117. package/dist/{software-update-2MHKL76D.cjs → software-update-JHC4T4SE.cjs} +14 -14
  118. package/dist/{tickets-board-IFWMIZ35.cjs → tickets-board-R5OQSEEC.cjs} +8 -8
  119. package/dist/{tickets-board-MYXG3V72.js → tickets-board-U3RF3AO4.js} +3 -3
  120. package/dist/types/downloads.d.ts +16 -0
  121. package/dist/types/downloads.d.ts.map +1 -1
  122. package/dist/types/index.cjs +27 -2
  123. package/dist/types/index.js +25 -3
  124. package/dist/types/trust-center.d.ts +19 -2
  125. package/dist/types/trust-center.d.ts.map +1 -1
  126. package/dist/utils/format.d.ts +11 -0
  127. package/dist/utils/format.d.ts.map +1 -1
  128. package/dist/utils/index.cjs +4 -9
  129. package/dist/utils/index.d.ts +1 -1
  130. package/dist/utils/index.d.ts.map +1 -1
  131. package/dist/utils/index.js +4 -7
  132. package/dist/utils/mobile-app.cjs +0 -9
  133. package/dist/utils/mobile-app.d.ts +8 -25
  134. package/dist/utils/mobile-app.d.ts.map +1 -1
  135. package/dist/utils/mobile-app.js +1 -7
  136. package/package.json +1 -1
  137. package/src/assets/index.ts +0 -1
  138. package/src/components/features/remote-session/remote-access-request-card.tsx +6 -6
  139. package/src/components/help-center-pages/download-apps-page.tsx +53 -29
  140. package/src/components/help-center-pages/index.ts +1 -1
  141. package/src/components/help-center-pages/trust-center-page.tsx +50 -29
  142. package/src/components/help-center-pages/trust-center-sections.tsx +2 -2
  143. package/src/components/ui/data-attribution.tsx +19 -6
  144. package/src/components/ui/download-button.tsx +34 -0
  145. package/src/components/ui/index.ts +1 -0
  146. package/src/components/ui/mobile-app-qr.tsx +17 -22
  147. package/src/types/downloads.ts +17 -0
  148. package/src/types/trust-center.ts +52 -4
  149. package/src/utils/format.ts +15 -0
  150. package/src/utils/index.ts +1 -1
  151. package/src/utils/mobile-app.ts +8 -31
  152. package/dist/assets/mobile-app-qr.d.ts +0 -17
  153. package/dist/assets/mobile-app-qr.d.ts.map +0 -1
  154. package/src/assets/mobile-app-qr.ts +0 -19
@@ -188,6 +188,21 @@ export function isTrustCenterMonitored(
188
188
  return Number.isFinite(synced) && nowMs - synced <= data.monitoredWindowMs;
189
189
  }
190
190
 
191
+ /**
192
+ * THE monitoring claim and its wording, judged against a clock: monitored,
193
+ * paused, or not enabled. The page reads it after mount (its own clock) and the
194
+ * PDF when it is generated, so both say the same thing in the same words.
195
+ */
196
+ export function trustCenterMonitoringStatus(
197
+ data: Pick<TrustCenterPublic, 'connected' | 'syncedAt' | 'monitoredWindowMs'>,
198
+ nowMs: number,
199
+ ): { status: 'success' | 'pending' | 'missing'; label: string } {
200
+ if (!data.connected) return { status: 'missing', label: 'Live control monitoring is not enabled yet' };
201
+ return isTrustCenterMonitored(data, nowMs)
202
+ ? { status: 'success', label: 'Controls continuously monitored' }
203
+ : { status: 'pending', label: 'Monitoring paused' };
204
+ }
205
+
191
206
  /** "SOC 2 Type II: In progress · ISO 27001: Planned" — the ONE framework summary line (chat card, RAG mapper). */
192
207
  export function trustFrameworksSummary(
193
208
  frameworks: ReadonlyArray<Pick<TrustCenterFramework, 'label' | 'monitoring' | 'percent'>>,
@@ -195,10 +210,16 @@ export function trustFrameworksSummary(
195
210
  return frameworks.map(f => `${f.label}: ${trustFrameworkBadge(f)}`).join(' · ');
196
211
  }
197
212
 
213
+ /** A path BESIDE the page's `endpoint`, which may carry a query string (an embed proxy): `endpoint/segment?query`. */
214
+ function besideTrustCenterEndpoint(endpoint: string, segment: string): string {
215
+ const [path, query] = endpoint.split('?', 2);
216
+ return `${path}/${segment}${query ? `?${query}` : ''}`;
217
+ }
218
+
198
219
  /**
199
220
  * Where a public document opens: its own link, or — for a file — the hub's
200
- * documents route beside the page's `endpoint` (which may carry a query string,
201
- * e.g. an embed proxy). `null` for a document that is only available on request.
221
+ * documents route beside the page's `endpoint`. `null` for a document that is
222
+ * only available on request.
202
223
  */
203
224
  export function trustCenterDocumentUrl(
204
225
  endpoint: string,
@@ -206,8 +227,35 @@ export function trustCenterDocumentUrl(
206
227
  ): string | null {
207
228
  if (document.access !== 'public') return null;
208
229
  if (document.externalUrl) return document.externalUrl;
209
- const [path, query] = endpoint.split('?', 2);
210
- return `${path}/documents/${encodeURIComponent(document.id)}${query ? `?${query}` : ''}`;
230
+ return besideTrustCenterEndpoint(endpoint, `documents/${encodeURIComponent(document.id)}`);
231
+ }
232
+
233
+ /** Where the page downloads as a PDF: the hub's `pdf` route beside the page's `endpoint`. */
234
+ export function trustCenterPdfUrl(endpoint: string): string {
235
+ return besideTrustCenterEndpoint(endpoint, 'pdf');
236
+ }
237
+
238
+ /**
239
+ * THE rule for which sections a trust center shows, in reading order: a section
240
+ * with nothing to list is left out; Contact always shows. The page and its PDF
241
+ * both read it, so the two can never disagree about what is published.
242
+ */
243
+ export function visibleTrustCenterSections(
244
+ data: Pick<
245
+ TrustCenterPublic,
246
+ 'aiPractices' | 'frameworks' | 'controlDomains' | 'documents' | 'subprocessors' | 'faqs'
247
+ >,
248
+ ): Array<(typeof TRUST_CENTER_SECTIONS)[number]> {
249
+ const hasContent: Record<TrustCenterSectionId, boolean> = {
250
+ ai: data.aiPractices.length > 0,
251
+ compliance: data.frameworks.length > 0,
252
+ controls: data.controlDomains.length > 0,
253
+ documents: data.documents.length > 0,
254
+ subprocessors: data.subprocessors.length > 0,
255
+ faq: data.faqs.length > 0,
256
+ contact: true,
257
+ };
258
+ return TRUST_CENTER_SECTIONS.filter(section => hasContent[section.id]);
211
259
  }
212
260
 
213
261
  // ---------------------------------------------------------------------------
@@ -1059,3 +1059,18 @@ export function formatWebinarTimeMeta(
1059
1059
  const time = formatProgramTimeRange(at, { startAt: opts.startAt, withZoneLabel: opts.withZoneLabel });
1060
1060
  return [time, duration].filter(Boolean).join(' · ');
1061
1061
  }
1062
+
1063
+ /**
1064
+ * A web address as it is shown to a person to read or type, not to follow: no
1065
+ * scheme, no query or fragment, no trailing slash.
1066
+ * `https://www.example.com/mobile?from=qr` reads `example.com/mobile`.
1067
+ *
1068
+ * `www` is dropped by default, because nobody types it; `keepWww` keeps it where
1069
+ * the address is shown as the site's own name.
1070
+ */
1071
+ export function formatUrlForDisplay(url: string, options: { keepWww?: boolean } = {}): string {
1072
+ return url
1073
+ .replace(options.keepWww ? /^https?:\/\//i : /^https?:\/\/(www\.)?/i, '')
1074
+ .replace(/[?#].*$/, '')
1075
+ .replace(/\/$/, '');
1076
+ }
@@ -16,7 +16,7 @@ export {
16
16
  // Number / currency / byte / date formatters live in `./format` (single
17
17
  // source of truth). Re-exported here so existing callers that pull from
18
18
  // the barrel keep working without changing imports.
19
- export { formatDate, formatNumber, formatPrice, formatBytes } from './format';
19
+ export { formatDate, formatNumber, formatPrice, formatBytes, formatUrlForDisplay } from './format';
20
20
  export { TRIAL_DAYS, TRIAL_LABELS } from './trial';
21
21
  export {
22
22
  VENDOR_CLASSIFICATIONS,
@@ -1,8 +1,8 @@
1
1
  /**
2
- * The download page's own addresses: where it lives, the parameter that sends a
3
- * phone on to its store, and the URL the install QR code encodes. The store
4
- * listings and installer links are NOT here: they are the server's
5
- * (`DownloadsPublic`, read through `useDownloads`).
2
+ * The download page's address, and what a server needs to send a phone on to
3
+ * its store. No link lives here: the store listings, the installer links and
4
+ * the install link the QR code encodes are all the server's (`DownloadsPublic`,
5
+ * read through `useDownloads`).
6
6
  *
7
7
  * Pure and server-safe; also published as the granular subpath
8
8
  * `./utils/mobile-app`, for an Edge proxy and other server-only consumers.
@@ -13,37 +13,14 @@ import { detectVisitorOs } from './visitor-os';
13
13
  /** The website's download page: every installer and the mobile app. */
14
14
  export const DOWNLOAD_PAGE_PATH = '/download';
15
15
 
16
- /**
17
- * On the download page: "send a phone or a tablet on to its store". The install
18
- * QR code carries it, because whoever scans a code is holding the phone the app
19
- * goes on. Anyone who opens the page without it reads the page.
20
- */
21
- export const DOWNLOAD_PAGE_STORE_PARAM = 'store';
22
-
23
- /**
24
- * The one URL the install QR code encodes: the website's download page, asking
25
- * it to send a phone on to its store.
26
- *
27
- * Absolute and on the production host on purpose: a code must point at
28
- * production whichever deployment rendered the page it came from. `MobileAppQr`
29
- * draws this value as committed path data, so the two change together: see the
30
- * regeneration note on that component.
31
- */
32
- export const MOBILE_APP_INSTALL_URL = `https://www.flamingo.run${DOWNLOAD_PAGE_PATH}?${DOWNLOAD_PAGE_STORE_PARAM}=1`;
33
-
34
- /** The download page as it is printed for a human to read or type: no scheme, no `www`, no query. */
35
- export const MOBILE_APP_INSTALL_HOST_PATH = MOBILE_APP_INSTALL_URL.replace(/^https:\/\/(www\.)?/, '').replace(
36
- /\?.*$/,
37
- '',
38
- );
39
-
40
16
  /**
41
17
  * The store for a phone or tablet, or `null` for every other system and for a
42
18
  * store the server names no listing for (`links` is the server's answer).
43
19
  *
44
- * The server passes the request's User-Agent; a browser also passes
45
- * `navigator.maxTouchPoints`, the only signal that tells an iPad asking for the
46
- * desktop site (it calls itself a Macintosh) from a real Mac.
20
+ * The server passes the request's User-Agent (the install link's redirect).
21
+ * A browser may also pass `navigator.maxTouchPoints`, the only signal that tells
22
+ * an iPad asking for the desktop site (it calls itself a Macintosh) from a real
23
+ * Mac; the server cannot, so that iPad lands on the download page and its badges.
47
24
  */
48
25
  export function resolveMobileStoreUrl(
49
26
  links: MobileAppLinks,
@@ -1,17 +0,0 @@
1
- /**
2
- * The install QR code's artwork: the modules of `MOBILE_APP_INSTALL_URL`
3
- * (`utils/mobile-app`) at version 3, ECC level M, as one SVG path. Packaged with
4
- * the library like the other assets, so every consumer draws the same code with
5
- * no host-asset serving. `MobileAppQr` (components/ui) is the component that
6
- * renders it.
7
- *
8
- * It changes WITH that URL. To regenerate: with the `qrcode` package,
9
- * `QRCode.create(url, { errorCorrectionLevel: 'M' })` gives the modules; each
10
- * row is one `M{x+4} {y+4}.5h{run}` followed by `m{gap} 0h{run}` per further
11
- * run (the 4 is the quiet zone), and the viewBox side is `size + 8`.
12
- */
13
- /** The side of the artwork's square viewBox: 29 modules plus a 4-module quiet zone on each side. */
14
- export declare const MOBILE_APP_QR_VIEWBOX_SIZE = 37;
15
- /** The dark modules, as horizontal strokes one module tall (`stroke` draws them). */
16
- export declare const MOBILE_APP_QR_PATH = "M4 4.5h7m2 0h2m2 0h1m2 0h1m2 0h2m1 0h7M4 5.5h1m5 0h1m2 0h2m2 0h3m6 0h1m5 0h1M4 6.5h1m1 0h3m1 0h1m1 0h3m1 0h1m1 0h3m2 0h1m2 0h1m1 0h3m1 0h1M4 7.5h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h6m2 0h1m1 0h1m1 0h3m1 0h1M4 8.5h1m1 0h3m1 0h1m1 0h3m1 0h1m1 0h1m1 0h5m1 0h1m1 0h3m1 0h1M4 9.5h1m5 0h1m1 0h1m1 0h2m1 0h1m1 0h3m4 0h1m5 0h1M4 10.5h7m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h7M12 11.5h1m2 0h2m5 0h3M4 12.5h1m1 0h5m3 0h1m1 0h8m2 0h5M4 13.5h4m4 0h2m2 0h1m3 0h4m1 0h4m3 0h1M6 14.5h1m3 0h3m1 0h1m3 0h4m2 0h1M4 15.5h1m2 0h3m2 0h2m1 0h2m1 0h1m1 0h1m2 0h5m1 0h1m1 0h1M4 16.5h1m4 0h2m1 0h2m1 0h1m1 0h1m2 0h2m1 0h1m5 0h2M16 17.5h3m3 0h5m1 0h1m3 0h1M5 18.5h1m3 0h2m1 0h1m5 0h2m4 0h1m1 0h2m1 0h2M4 19.5h6m1 0h1m3 0h1m2 0h3m1 0h4m1 0h2m2 0h1M8 20.5h1m1 0h1m2 0h2m1 0h2m1 0h1m1 0h1m5 0h1m1 0h2M4 21.5h1m1 0h2m7 0h1m2 0h1m1 0h9m1 0h1m1 0h1M4 22.5h1m3 0h3m2 0h1m1 0h2m2 0h3m3 0h1m1 0h1m2 0h1M4 23.5h1m6 0h4m3 0h2m3 0h2m2 0h2m2 0h1M4 24.5h1m2 0h4m4 0h1m3 0h1m1 0h1m1 0h6m1 0h3M12 25.5h6m2 0h1m3 0h1m3 0h5M4 26.5h7m3 0h8m1 0h2m1 0h1m1 0h3M4 27.5h1m5 0h1m1 0h2m1 0h3m2 0h1m2 0h2m3 0h1M4 28.5h1m1 0h3m1 0h1m1 0h2m2 0h1m1 0h1m2 0h1m2 0h5m1 0h3M4 29.5h1m1 0h3m1 0h1m1 0h2m1 0h2m3 0h4m3 0h1m1 0h4M4 30.5h1m1 0h3m1 0h1m1 0h1m3 0h4m1 0h1m2 0h8M4 31.5h1m5 0h1m4 0h1m1 0h1m1 0h2m1 0h1m1 0h1m1 0h2m1 0h1m1 0h1M4 32.5h7m1 0h1m2 0h2m4 0h1m1 0h1m3 0h4";
17
- //# sourceMappingURL=mobile-app-qr.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mobile-app-qr.d.ts","sourceRoot":"","sources":["../../src/assets/mobile-app-qr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,oGAAoG;AACpG,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,qFAAqF;AACrF,eAAO,MAAM,kBAAkB,uyCACuwC,CAAC"}
@@ -1,19 +0,0 @@
1
- /**
2
- * The install QR code's artwork: the modules of `MOBILE_APP_INSTALL_URL`
3
- * (`utils/mobile-app`) at version 3, ECC level M, as one SVG path. Packaged with
4
- * the library like the other assets, so every consumer draws the same code with
5
- * no host-asset serving. `MobileAppQr` (components/ui) is the component that
6
- * renders it.
7
- *
8
- * It changes WITH that URL. To regenerate: with the `qrcode` package,
9
- * `QRCode.create(url, { errorCorrectionLevel: 'M' })` gives the modules; each
10
- * row is one `M{x+4} {y+4}.5h{run}` followed by `m{gap} 0h{run}` per further
11
- * run (the 4 is the quiet zone), and the viewBox side is `size + 8`.
12
- */
13
-
14
- /** The side of the artwork's square viewBox: 29 modules plus a 4-module quiet zone on each side. */
15
- export const MOBILE_APP_QR_VIEWBOX_SIZE = 37;
16
-
17
- /** The dark modules, as horizontal strokes one module tall (`stroke` draws them). */
18
- export const MOBILE_APP_QR_PATH =
19
- 'M4 4.5h7m2 0h2m2 0h1m2 0h1m2 0h2m1 0h7M4 5.5h1m5 0h1m2 0h2m2 0h3m6 0h1m5 0h1M4 6.5h1m1 0h3m1 0h1m1 0h3m1 0h1m1 0h3m2 0h1m2 0h1m1 0h3m1 0h1M4 7.5h1m1 0h3m1 0h1m1 0h1m1 0h1m1 0h6m2 0h1m1 0h1m1 0h3m1 0h1M4 8.5h1m1 0h3m1 0h1m1 0h3m1 0h1m1 0h1m1 0h5m1 0h1m1 0h3m1 0h1M4 9.5h1m5 0h1m1 0h1m1 0h2m1 0h1m1 0h3m4 0h1m5 0h1M4 10.5h7m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h7M12 11.5h1m2 0h2m5 0h3M4 12.5h1m1 0h5m3 0h1m1 0h8m2 0h5M4 13.5h4m4 0h2m2 0h1m3 0h4m1 0h4m3 0h1M6 14.5h1m3 0h3m1 0h1m3 0h4m2 0h1M4 15.5h1m2 0h3m2 0h2m1 0h2m1 0h1m1 0h1m2 0h5m1 0h1m1 0h1M4 16.5h1m4 0h2m1 0h2m1 0h1m1 0h1m2 0h2m1 0h1m5 0h2M16 17.5h3m3 0h5m1 0h1m3 0h1M5 18.5h1m3 0h2m1 0h1m5 0h2m4 0h1m1 0h2m1 0h2M4 19.5h6m1 0h1m3 0h1m2 0h3m1 0h4m1 0h2m2 0h1M8 20.5h1m1 0h1m2 0h2m1 0h2m1 0h1m1 0h1m5 0h1m1 0h2M4 21.5h1m1 0h2m7 0h1m2 0h1m1 0h9m1 0h1m1 0h1M4 22.5h1m3 0h3m2 0h1m1 0h2m2 0h3m3 0h1m1 0h1m2 0h1M4 23.5h1m6 0h4m3 0h2m3 0h2m2 0h2m2 0h1M4 24.5h1m2 0h4m4 0h1m3 0h1m1 0h1m1 0h6m1 0h3M12 25.5h6m2 0h1m3 0h1m3 0h5M4 26.5h7m3 0h8m1 0h2m1 0h1m1 0h3M4 27.5h1m5 0h1m1 0h2m1 0h3m2 0h1m2 0h2m3 0h1M4 28.5h1m1 0h3m1 0h1m1 0h2m2 0h1m1 0h1m2 0h1m2 0h5m1 0h3M4 29.5h1m1 0h3m1 0h1m1 0h2m1 0h2m3 0h4m3 0h1m1 0h4M4 30.5h1m1 0h3m1 0h1m1 0h1m3 0h4m1 0h1m2 0h8M4 31.5h1m5 0h1m4 0h1m1 0h1m1 0h2m1 0h1m1 0h1m1 0h2m1 0h1m1 0h1M4 32.5h7m1 0h1m2 0h2m4 0h1m1 0h1m3 0h4';