@hot-updater/console 1.0.0 → 1.0.1

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 (146) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{ConsoleFeatureUnavailable-jB4Loglh.js → ConsoleFeatureUnavailable-Bf8tgug-.js} +1 -1
  3. package/.output/public/assets/{EventDetails-B6yUsyNA.js → EventDetails-CgtEWl-Y.js} +1 -1
  4. package/.output/public/assets/HashValueDisplay-DvXl147n.js +1 -0
  5. package/.output/public/assets/{InsightsPageHeader-B892oVml.js → InsightsPageHeader-eViliItR.js} +1 -1
  6. package/.output/public/assets/{NotFoundPage-DIqCpWa3.js → NotFoundPage-HomiHjdL.js} +1 -1
  7. package/.output/public/assets/{alert-dialog-Bbk_4-WJ.js → alert-dialog-BSs_5Od-.js} +1 -1
  8. package/.output/public/assets/{api-DCM0wr6O.js → api-DSWk32Mz.js} +1 -1
  9. package/.output/public/assets/api-keys-CHA2X9W0.js +1 -0
  10. package/.output/public/assets/api-keys-D0yD891K.js +1 -0
  11. package/.output/public/assets/arrow-left-vK2qGQsd.js +1 -0
  12. package/.output/public/assets/arrow-up-right-Dz8o-Kab.js +1 -0
  13. package/.output/public/assets/chevron-right-CBl7aqu_.js +1 -0
  14. package/.output/public/assets/{clipboard-DS9ucUQL.js → clipboard-BYT_TJ0K.js} +1 -1
  15. package/.output/public/assets/{console-features-api-BH5m_PtQ.js → console-features-api-BD7j--gS.js} +1 -1
  16. package/.output/public/assets/{dialog-Bqbb7B0N.js → dialog-YKZpU5St.js} +1 -1
  17. package/.output/public/assets/{dist-LxKJB-Vu.js → dist-B7eA4Mtf.js} +1 -1
  18. package/.output/public/assets/{empty-CuT2UhFp.js → empty-L3UcNk_l.js} +1 -1
  19. package/.output/public/assets/{field-BBDpjIqu.js → field-DNqNwq7i.js} +1 -1
  20. package/.output/public/assets/{index-6o51GkFe.js → index-C-dDMnWK.js} +4 -4
  21. package/.output/public/assets/{input-group-ja_30qaF.js → input-group-C9ZIjV0o.js} +1 -1
  22. package/.output/public/assets/insights-C54__dPi.js +1 -0
  23. package/.output/public/assets/insights-DM0CTj58.js +2 -0
  24. package/.output/public/assets/insights-SVMoazdd.js +42 -0
  25. package/.output/public/assets/{insights-api-BigAU9sZ.js → insights-api-BsX1zQDf.js} +1 -1
  26. package/.output/public/assets/insights-search-B-F2wop6.js +1 -0
  27. package/.output/public/assets/insights-usage-rpc-CSAoKS_b.js +1 -0
  28. package/.output/public/assets/insights_.distribution-BAaD6rZK.js +1 -0
  29. package/.output/public/assets/insights_.distribution-C6tGV7qU.js +2 -0
  30. package/.output/public/assets/insights_.distribution-oxPmgcHr.js +1 -0
  31. package/.output/public/assets/installations-1jALHnM3.js +1 -0
  32. package/.output/public/assets/installations-DUidui9Z.js +1 -0
  33. package/.output/public/assets/{installations-BazSJXE0.js → installations-RfpwK-ld.js} +2 -2
  34. package/.output/public/assets/{key-round-wS_SIZ6b.js → key-round-CrqLmblG.js} +1 -1
  35. package/.output/public/assets/{list-CgrYiadM.js → list-BSpjGUS6.js} +1 -1
  36. package/.output/public/assets/{refresh-cw-BYgoNCco.js → refresh-cw-BMlpOsfM.js} +1 -1
  37. package/.output/public/assets/remote-config-BcoOZ9fs.js +1 -0
  38. package/.output/public/assets/remote-config-BtStN5bt.js +1 -0
  39. package/.output/public/assets/{remote-config-Br56BODb.js → remote-config-Cwwsatrr.js} +4 -4
  40. package/.output/public/assets/routes-Bc3J564t.js +2 -0
  41. package/.output/public/assets/routes-Bxu5_zNh.js +1 -0
  42. package/.output/public/assets/search-B_o3avCI.js +1 -0
  43. package/.output/public/assets/select-BE-xONpm.js +1 -0
  44. package/.output/public/assets/{sidebar-DNVyJPfX.js → sidebar-CQ6iq0qe.js} +1 -1
  45. package/.output/public/assets/smartphone--CTny1h9.js +1 -0
  46. package/.output/public/assets/{switch-DZ1TPwx-.js → switch-DR0WP2g8.js} +1 -1
  47. package/.output/public/assets/{table-Gm4qRWwE.js → table-DW0243Jw.js} +1 -1
  48. package/.output/public/assets/tabs-B4Ffq4fD.js +1 -0
  49. package/.output/public/assets/{undo-2-CmrHjwFc.js → undo-2-Dcq6sgUo.js} +1 -1
  50. package/.output/public/assets/{useCompositeListItem-9E4pj_CH.js → useCompositeListItem-VmWjhZ9j.js} +1 -1
  51. package/.output/public/assets/{valueToPercent-CH8GCHaL.js → valueToPercent-C-rPd_Or.js} +1 -1
  52. package/.output/server/{__23tanstack-start-server-fn-resolver-BpRlos5Q.mjs → __23tanstack-start-server-fn-resolver-CludPNXL.mjs} +40 -40
  53. package/.output/server/_libs/@base-ui/react+[...].mjs +20 -20
  54. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  55. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
  56. package/.output/server/_libs/recharts+[...].mjs +1 -1
  57. package/.output/server/_libs/sonner.mjs +1 -1
  58. package/.output/server/_ssr/{BundleIdDisplay-x94o9rlU.mjs → BundleIdDisplay-CAIibMnZ.mjs} +2 -2
  59. package/.output/server/_ssr/{ConsoleFeatureUnavailable-ldW8v8-q.mjs → ConsoleFeatureUnavailable-CTbvhAts.mjs} +6 -6
  60. package/.output/server/_ssr/{EventDetails-Q8kfj9Nr.mjs → EventDetails-Dz5O2hup.mjs} +6 -6
  61. package/.output/server/_ssr/{HashValueDisplay-n1GholGS.mjs → HashValueDisplay-BBUzwDu0.mjs} +2 -2
  62. package/.output/server/_ssr/{InsightsPageHeader-BSUX3Ye9.mjs → InsightsPageHeader-BisxLsg_.mjs} +6 -6
  63. package/.output/server/_ssr/{NotFoundPage-DZzOOzS3.mjs → NotFoundPage-oKeLJAKO.mjs} +2 -2
  64. package/.output/server/_ssr/{alert-dialog-C43Doa0I.mjs → alert-dialog-D9gKu-6B.mjs} +1 -1
  65. package/.output/server/_ssr/{api-oZjRn9tP.mjs → api-Ctf4ONl0.mjs} +3 -3
  66. package/.output/server/_ssr/{api-keys-CEnM9fqG.mjs → api-keys-BYVLgcvB.mjs} +2 -2
  67. package/.output/server/_ssr/{api-keys-B4sYm8dM.mjs → api-keys-CBdMIgQH.mjs} +7 -7
  68. package/.output/server/_ssr/{api-keys-rpc-BIFuUgMt.mjs → api-keys-rpc-D_MGDGrN.mjs} +3 -3
  69. package/.output/server/_ssr/{api-rpc-BNiFRRK8.mjs → api-rpc-BOn0fmSj.mjs} +3 -3
  70. package/.output/server/_ssr/{auth-rpc-DnZqYxyq.mjs → auth-rpc-MuU8dCi_.mjs} +4 -4
  71. package/.output/server/_ssr/{auth.server-DFpyxRDd.mjs → auth.server-QA_53YPj.mjs} +2 -2
  72. package/.output/server/_ssr/{config.server-DskXCAyI.mjs → config.server-fNcSQwfX.mjs} +3 -3
  73. package/.output/server/_ssr/{console-access-BJfAXknd.mjs → console-access-C6aSaMHp.mjs} +2 -2
  74. package/.output/server/_ssr/{console-features-api-C9kiKvaV.mjs → console-features-api-nN-3jUli.mjs} +5 -5
  75. package/.output/server/_ssr/{console-features-rpc-P0GL7Z-R.mjs → console-features-rpc-By6Aak_o.mjs} +3 -3
  76. package/.output/server/_ssr/{dialog-BbYDMjdC.mjs → dialog-IVRlM1J9.mjs} +1 -1
  77. package/.output/server/_ssr/{empty-CVLGfxuu.mjs → empty-CXw7UkQ9.mjs} +2 -2
  78. package/.output/server/_ssr/{field-asw83X0v.mjs → field-D5rycmNU.mjs} +2 -2
  79. package/.output/server/_ssr/{input-group-CuYJHosb.mjs → input-group-CcwGtPaf.mjs} +1 -1
  80. package/.output/server/_ssr/{insights-B55FG5fm.mjs → insights-BO3tHc8m.mjs} +5 -5
  81. package/.output/server/_ssr/{insights-CWnHIFUV.mjs → insights-BfjtzxAt.mjs} +2 -2
  82. package/.output/server/_ssr/{insights-CpLpedFZ.mjs → insights-CKC8xDHf.mjs} +24 -24
  83. package/.output/server/_ssr/{insights-api-sjws23WF.mjs → insights-api-CxvjRcJY.mjs} +3 -3
  84. package/.output/server/_ssr/{insights-failures-rpc-BvbWvqNf.mjs → insights-failures-rpc-3LR3gf5_.mjs} +4 -4
  85. package/.output/server/_ssr/{insights-recovery-rpc-GiYXdkaY.mjs → insights-recovery-rpc-KZuPFtPi.mjs} +3 -3
  86. package/.output/server/_ssr/{insights-rpc-DP_8Rmz4.mjs → insights-rpc-B5DF87z1.mjs} +3 -3
  87. package/.output/server/_ssr/{InsightsInfo-DuJFatQO.mjs → insights-search--Biw1Q83.mjs} +31 -31
  88. package/.output/server/_ssr/{insights-usage-rpc-BiolgB8e.mjs → insights-usage-rpc-BjyoZrsk.mjs} +3 -3
  89. package/.output/server/_ssr/{insights-usage-rpc-KStL0zOx.mjs → insights-usage-rpc-Dvt-RmGH.mjs} +3 -3
  90. package/.output/server/_ssr/{insights_.distribution-CVrnbP3R.mjs → insights_.distribution-C9WdD2pp.mjs} +2 -2
  91. package/.output/server/_ssr/{insights_.distribution-DN9pR422.mjs → insights_.distribution-Czd0R3x1.mjs} +13 -13
  92. package/.output/server/_ssr/{insights_.distribution-D2HaNTAA.mjs → insights_.distribution-DMcff9C5.mjs} +5 -5
  93. package/.output/server/_ssr/{installations-DD1g__Nc.mjs → installations-BZg4I7rk.mjs} +4 -4
  94. package/.output/server/_ssr/{installations-BSCmFq8Q.mjs → installations-CETpe6aH.mjs} +10 -10
  95. package/.output/server/_ssr/{installations-BHmbbnH8.mjs → installations-CbX4TTtL.mjs} +2 -2
  96. package/.output/server/_ssr/{release-adoption-rpc-BsstqxUp.mjs → release-adoption-rpc-CEY0I6O4.mjs} +5 -5
  97. package/.output/server/_ssr/{remote-config-Dv1ccMo-.mjs → remote-config-BZoufETF.mjs} +2 -2
  98. package/.output/server/_ssr/{remote-config-C2Ee8lXO.mjs → remote-config-CORErMXh.mjs} +2 -2
  99. package/.output/server/_ssr/{remote-config-of0lGQH8.mjs → remote-config-D2VfWi8m.mjs} +16 -16
  100. package/.output/server/_ssr/{remote-config-rpc-BzX31mUS.mjs → remote-config-rpc-DKcBdTyh.mjs} +3 -3
  101. package/.output/server/_ssr/{router-D8NuoJ_I.mjs → router-CRDbJodQ.mjs} +14 -14
  102. package/.output/server/_ssr/{routes-V8sDybGf.mjs → routes-Bpmxf-r8.mjs} +12 -12
  103. package/.output/server/_ssr/{routes-DgvnFqDy.mjs → routes-DC3sK0ON.mjs} +38 -25
  104. package/.output/server/_ssr/{select-t3iXRwc9.mjs → select-CzanJCWl.mjs} +1 -1
  105. package/.output/server/_ssr/{server-h4VxnExB.mjs → server-C4JCTB-q.mjs} +3 -3
  106. package/.output/server/_ssr/{sidebar-DJcErBMo.mjs → sidebar-DcFhy0Zq.mjs} +18 -18
  107. package/.output/server/_ssr/ssr.mjs +1 -1
  108. package/.output/server/_ssr/{switch-E-btwMGt.mjs → switch-DAHDLynM.mjs} +2 -2
  109. package/.output/server/_ssr/{table-37Dd23TN.mjs → table-DNcXrt9t.mjs} +1 -1
  110. package/.output/server/_ssr/{tabs-DEFnTm95.mjs → tabs-BlbEfZeV.mjs} +2 -2
  111. package/.output/server/_tanstack-start-manifest_v-DaM-WBL0.mjs +139 -0
  112. package/.output/server/index.mjs +265 -265
  113. package/package.json +7 -7
  114. package/src/components/{features/insights/InsightsInfo.tsx → InfoTooltip.tsx} +1 -1
  115. package/src/components/features/insights/AppUsage.tsx +3 -3
  116. package/src/components/features/insights/InsightsOverview.tsx +5 -5
  117. package/src/components/features/insights/ReleaseActivity.tsx +5 -5
  118. package/src/components/features/insights/ReportingDevicesSummary.tsx +3 -3
  119. package/src/components/features/insights/UpdateFailures.tsx +2 -4
  120. package/src/components/features/releases/ReleaseEditorSheet.tsx +33 -21
  121. package/src/routes/insights_.distribution.tsx +3 -3
  122. package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +0 -1
  123. package/.output/public/assets/InsightsInfo-BNO0WznZ.js +0 -1
  124. package/.output/public/assets/api-keys-CIO9L_wu.js +0 -1
  125. package/.output/public/assets/api-keys-DVTL_--f.js +0 -1
  126. package/.output/public/assets/arrow-left-CnMYpqB7.js +0 -1
  127. package/.output/public/assets/arrow-up-right-BtffZA6e.js +0 -1
  128. package/.output/public/assets/chevron-right-BqD5wtFb.js +0 -1
  129. package/.output/public/assets/insights-CmraDzQh.js +0 -1
  130. package/.output/public/assets/insights-CxZ2GCYV.js +0 -2
  131. package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +0 -1
  132. package/.output/public/assets/insights-vNRCrfnS.js +0 -42
  133. package/.output/public/assets/insights_.distribution-ChOerfJt.js +0 -1
  134. package/.output/public/assets/insights_.distribution-D-e4iga8.js +0 -1
  135. package/.output/public/assets/insights_.distribution-DZtkibX1.js +0 -2
  136. package/.output/public/assets/installations-ClHTqdAO.js +0 -1
  137. package/.output/public/assets/installations-DpKsBuHi.js +0 -1
  138. package/.output/public/assets/remote-config-BWwHOkCK.js +0 -1
  139. package/.output/public/assets/remote-config-CXOi0LRu.js +0 -1
  140. package/.output/public/assets/routes-B88Erkpk.js +0 -2
  141. package/.output/public/assets/routes-CfzsAleC.js +0 -1
  142. package/.output/public/assets/search-DaTDPW25.js +0 -1
  143. package/.output/public/assets/select-BZZBXMkr.js +0 -1
  144. package/.output/public/assets/smartphone-DpTFgtKf.js +0 -1
  145. package/.output/public/assets/tabs-C7FOEjFC.js +0 -1
  146. package/.output/server/_tanstack-start-manifest_v-55AGsehh.mjs +0 -139
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hot-updater/console",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "files": [
6
6
  ".output",
7
7
  "lib",
@@ -58,10 +58,10 @@
58
58
  "tailwindcss": "^4.2.1",
59
59
  "tw-animate-css": "^1.4.0",
60
60
  "verkit": "0.4.0",
61
- "@hot-updater/bsdiff": "1.0.0",
62
- "@hot-updater/protocol": "1.0.0",
63
- "@hot-updater/server": "1.0.0",
64
- "@hot-updater/plugin-core": "1.0.0"
61
+ "@hot-updater/bsdiff": "1.0.1",
62
+ "@hot-updater/plugin-core": "1.0.1",
63
+ "@hot-updater/protocol": "1.0.1",
64
+ "@hot-updater/server": "1.0.1"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@tanstack/devtools-vite": "^0.6.0",
@@ -86,8 +86,8 @@
86
86
  "vite-tsconfig-paths": "^6.1.1",
87
87
  "vitest": "4.1.4",
88
88
  "web-vitals": "^5.1.0",
89
- "@hot-updater/cli-tools": "1.0.0",
90
- "@hot-updater/mock": "1.0.0"
89
+ "@hot-updater/cli-tools": "1.0.1",
90
+ "@hot-updater/mock": "1.0.1"
91
91
  },
92
92
  "description": "React Native OTA solution for self-hosted",
93
93
  "license": "SEE LICENSE IN LICENSE",
@@ -8,7 +8,7 @@ import {
8
8
  TooltipTrigger,
9
9
  } from "@/components/ui/tooltip";
10
10
 
11
- export function InsightsInfo({
11
+ export function InfoTooltip({
12
12
  label,
13
13
  children,
14
14
  }: {
@@ -3,6 +3,7 @@ import { Link } from "@tanstack/react-router";
3
3
  import { ArrowRight, ChevronRight } from "lucide-react";
4
4
  import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts";
5
5
 
6
+ import { InfoTooltip } from "@/components/InfoTooltip";
6
7
  import { PlatformIcon } from "@/components/PlatformIcon";
7
8
  import { Badge } from "@/components/ui/badge";
8
9
  import { Button, buttonVariants } from "@/components/ui/button";
@@ -46,7 +47,6 @@ import type { AppUsageReport, UsageWindow } from "@/lib/insights-usage";
46
47
 
47
48
  import { EstimatedCount } from "./EstimatedCount";
48
49
  import { InsightsErrorAlert } from "./InsightsErrorAlert";
49
- import { InsightsInfo } from "./InsightsInfo";
50
50
  import { UsagePeriodSelector } from "./InsightsPeriodSelector";
51
51
  import { ReportingDevicesSummary } from "./ReportingDevicesSummary";
52
52
 
@@ -231,11 +231,11 @@ export function AppUsage({
231
231
  <CardTitle className="flex min-h-9 items-center">
232
232
  Distribution
233
233
  </CardTitle>
234
- <InsightsInfo label="How distribution is counted">
234
+ <InfoTooltip label="How distribution is counted">
235
235
  Each installation counts once, by its latest report{" "}
236
236
  {distributionPeriod}.
237
237
  {report?.truncated ? " Some history is missing." : ""}
238
- </InsightsInfo>
238
+ </InfoTooltip>
239
239
  </CardHeader>
240
240
  <CardContent className="flex-1">
241
241
  {query.isPending ? (
@@ -3,6 +3,7 @@ import { ListIcon, RotateCcw, RotateCw, TriangleAlert, X } from "lucide-react";
3
3
  import { useState } from "react";
4
4
 
5
5
  import { BundleIdDisplay } from "@/components/BundleIdDisplay";
6
+ import { InfoTooltip } from "@/components/InfoTooltip";
6
7
  import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
7
8
  import { Badge } from "@/components/ui/badge";
8
9
  import { Button, buttonVariants } from "@/components/ui/button";
@@ -60,7 +61,6 @@ import {
60
61
  useSeriesColors,
61
62
  } from "./ComparedBundlesChart";
62
63
  import { InsightsErrorAlert } from "./InsightsErrorAlert";
63
- import { InsightsInfo } from "./InsightsInfo";
64
64
  import { InsightsPeriodSelector } from "./InsightsPeriodSelector";
65
65
  import { RollbackButton } from "./RollbackButton";
66
66
 
@@ -185,11 +185,11 @@ export function InsightsOverview({
185
185
  <div className="flex flex-col gap-1">
186
186
  <div className="flex items-center gap-1 text-sm font-medium">
187
187
  Installations downloading and launching each bundle
188
- <InsightsInfo label="About adoption">
188
+ <InfoTooltip label="About adoption">
189
189
  Dashed: installations that downloaded the bundle. Solid:
190
190
  installations that launched it. After a forced update the two lines
191
191
  meet.
192
- </InsightsInfo>
192
+ </InfoTooltip>
193
193
  </div>
194
194
  <div className="flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground">
195
195
  <p>
@@ -212,12 +212,12 @@ export function InsightsOverview({
212
212
  <div className="flex flex-col gap-1">
213
213
  <div className="flex items-center gap-1 text-sm font-medium">
214
214
  Crashes after each deployment
215
- <InsightsInfo label="About crashes">
215
+ <InfoTooltip label="About crashes">
216
216
  Installations that crashed on a bundle and rolled back. Crash rate =
217
217
  crashed ÷ (launched + crashed). A rollback is suggested at{" "}
218
218
  {percent(CRASH_RATE_THRESHOLD)} once {CRASH_MIN_ATTEMPTS}{" "}
219
219
  installations tried it.
220
- </InsightsInfo>
220
+ </InfoTooltip>
221
221
  </div>
222
222
  <p className="text-xs text-muted-foreground">
223
223
  {cadenceOf(period.intervalMs)} · last {lengthOf(period.durationMs)} ·
@@ -1,6 +1,7 @@
1
1
  import { Link } from "@tanstack/react-router";
2
2
  import { ChartLine } from "lucide-react";
3
3
 
4
+ import { InfoTooltip } from "@/components/InfoTooltip";
4
5
  import { buttonVariants } from "@/components/ui/button";
5
6
  import {
6
7
  Card,
@@ -23,7 +24,6 @@ import { adoptionWindow } from "@/lib/insights-search";
23
24
  import { cn } from "@/lib/utils";
24
25
 
25
26
  import type { ReleaseColumn } from "../FeatureSlots";
26
- import { InsightsInfo } from "./InsightsInfo";
27
27
 
28
28
  const activityStats = [
29
29
  { label: "Downloaded", field: "downloads", color: "text-primary/85" },
@@ -46,11 +46,11 @@ const notLaunched = (report: BundleActivityReport) =>
46
46
 
47
47
  function ReleaseMetricsInfo() {
48
48
  return (
49
- <InsightsInfo label="About release insight metrics">
49
+ <InfoTooltip label="About release insight metrics">
50
50
  Downloaded: got this bundle. Launched: ran it. Crashed: crashed on it and
51
51
  rolled back. Once every installation restarts, Downloaded = Launched +
52
52
  Crashed.
53
- </InsightsInfo>
53
+ </InfoTooltip>
54
54
  );
55
55
  }
56
56
 
@@ -205,10 +205,10 @@ export function BundleDownloadFailures({
205
205
  —
206
206
  </span>
207
207
  )}
208
- <InsightsInfo label="About download failures">
208
+ <InfoTooltip label="About download failures">
209
209
  Failed downloads or installs of this bundle, at most one per
210
210
  installation a day. Rate = failures ÷ (failures + downloads).
211
- </InsightsInfo>
211
+ </InfoTooltip>
212
212
  </div>
213
213
  );
214
214
  }
@@ -1,8 +1,8 @@
1
+ import { InfoTooltip } from "@/components/InfoTooltip";
1
2
  import { Skeleton } from "@/components/ui/skeleton";
2
3
  import { usageMetrics, type UsageWindow } from "@/lib/insights-usage";
3
4
 
4
5
  import { EstimatedCount } from "./EstimatedCount";
5
- import { InsightsInfo } from "./InsightsInfo";
6
6
 
7
7
  export function ReportingDevicesSummary({
8
8
  window,
@@ -37,11 +37,11 @@ export function ReportingDevicesSummary({
37
37
  )}
38
38
  <div className="flex items-center gap-1 text-sm text-muted-foreground">
39
39
  <span>{metric.label}</span>
40
- <InsightsInfo label={`How ${metric.label} is counted`}>
40
+ <InfoTooltip label={`How ${metric.label} is counted`}>
41
41
  Installations that reported in the last {metric.period}, estimated
42
42
  within about 3%. The chart shows them per {metric.interval}.
43
43
  {partial ? " Some history is missing, so this is a minimum." : ""}
44
- </InsightsInfo>
44
+ </InfoTooltip>
45
45
  </div>
46
46
  </div>
47
47
  );
@@ -1,6 +1,7 @@
1
1
  import { ChevronRight, RotateCw } from "lucide-react";
2
2
  import type { ReactNode } from "react";
3
3
 
4
+ import { InfoTooltip } from "@/components/InfoTooltip";
4
5
  import { Button } from "@/components/ui/button";
5
6
  import {
6
7
  Card,
@@ -34,7 +35,6 @@ import { cn } from "@/lib/utils";
34
35
 
35
36
  import { EstimatedCount } from "./EstimatedCount";
36
37
  import { InsightsErrorAlert } from "./InsightsErrorAlert";
37
- import { InsightsInfo } from "./InsightsInfo";
38
38
 
39
39
  const share = (events: number, total: number) =>
40
40
  total === 0 ? "—" : `${((events / total) * 100).toFixed(1)}%`;
@@ -75,9 +75,7 @@ function FailureSummary({
75
75
  className="flex min-h-11 items-center gap-1 text-sm font-medium sm:min-h-7"
76
76
  >
77
77
  {title}
78
- <InsightsInfo label={`About ${title.toLowerCase()}`}>
79
- {info}
80
- </InsightsInfo>
78
+ <InfoTooltip label={`About ${title.toLowerCase()}`}>{info}</InfoTooltip>
81
79
  </h3>
82
80
  <p className="text-3xl font-semibold tracking-tight tabular-nums">
83
81
  <Rate value={rate} />
@@ -18,6 +18,7 @@ import { BundleIdDisplay } from "@/components/BundleIdDisplay";
18
18
  import { BundleMetadata } from "@/components/features/bundles/BundleMetadata";
19
19
  import { RolloutCohortsDialog } from "@/components/features/bundles/RolloutCohortsDialog";
20
20
  import { ReleaseSections } from "@/components/features/FeatureSlots";
21
+ import { InfoTooltip } from "@/components/InfoTooltip";
21
22
  import { PlatformIcon } from "@/components/PlatformIcon";
22
23
  import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
23
24
  import {
@@ -472,9 +473,16 @@ export function ReleaseEditorSheet({
472
473
  ) : null}
473
474
  <Field>
474
475
  <div className="flex items-center justify-between gap-4">
475
- <FieldLabel htmlFor="release-enabled">
476
- Enabled
477
- </FieldLabel>
476
+ <div className="flex items-center gap-1">
477
+ <FieldLabel htmlFor="release-enabled">
478
+ Enabled
479
+ </FieldLabel>
480
+ <InfoTooltip label="About Enabled">
481
+ Disabling rolls devices back to the previous enabled
482
+ bundle on their next check, or to the built-in app
483
+ when none remains.
484
+ </InfoTooltip>
485
+ </div>
478
486
  <Switch
479
487
  aria-label="Enabled"
480
488
  checked={draft.enabled}
@@ -485,25 +493,29 @@ export function ReleaseEditorSheet({
485
493
  }
486
494
  />
487
495
  </div>
488
- <FieldDescription>
489
- Disabling rolls devices back to the previous enabled
490
- bundle on their next check, or to the built-in app when
491
- none remains.
492
- </FieldDescription>
493
496
  </Field>
494
- <Field orientation="horizontal">
495
- <FieldLabel htmlFor="release-force-update">
496
- Force update
497
- </FieldLabel>
498
- <Switch
499
- aria-label="Force update"
500
- checked={draft.shouldForceUpdate}
501
- id="release-force-update"
502
- name="shouldForceUpdate"
503
- onCheckedChange={(shouldForceUpdate) =>
504
- setDraft({ ...draft, shouldForceUpdate })
505
- }
506
- />
497
+ <Field>
498
+ <div className="flex items-center justify-between gap-4">
499
+ <div className="flex items-center gap-1">
500
+ <FieldLabel htmlFor="release-force-update">
501
+ Force update
502
+ </FieldLabel>
503
+ <InfoTooltip label="About Force update">
504
+ Devices apply this bundle right away, and so do
505
+ devices that skip it to update straight to a newer
506
+ bundle.
507
+ </InfoTooltip>
508
+ </div>
509
+ <Switch
510
+ aria-label="Force update"
511
+ checked={draft.shouldForceUpdate}
512
+ id="release-force-update"
513
+ name="shouldForceUpdate"
514
+ onCheckedChange={(shouldForceUpdate) =>
515
+ setDraft({ ...draft, shouldForceUpdate })
516
+ }
517
+ />
518
+ </div>
507
519
  </Field>
508
520
  <Field>
509
521
  <FieldLabel htmlFor="release-rollout-percentage">
@@ -6,9 +6,9 @@ import { BundleIdDisplay } from "@/components/BundleIdDisplay";
6
6
  import { ConsoleFeatureUnavailable } from "@/components/ConsoleFeatureUnavailable";
7
7
  import { BuiltinBundleBadge } from "@/components/features/insights/BuiltinBundle";
8
8
  import { InsightsErrorAlert } from "@/components/features/insights/InsightsErrorAlert";
9
- import { InsightsInfo } from "@/components/features/insights/InsightsInfo";
10
9
  import { InsightsPageHeader } from "@/components/features/insights/InsightsPageHeader";
11
10
  import { UsagePeriodSelector } from "@/components/features/insights/InsightsPeriodSelector";
11
+ import { InfoTooltip } from "@/components/InfoTooltip";
12
12
  import { PlatformIcon } from "@/components/PlatformIcon";
13
13
  import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
14
14
  import { Badge } from "@/components/ui/badge";
@@ -219,12 +219,12 @@ function DistributionPage() {
219
219
  <CardHeader className="flex flex-col gap-3">
220
220
  <div className="flex items-center justify-between gap-2">
221
221
  <CardTitle>Bundles by app version</CardTitle>
222
- <InsightsInfo label="How bundle distribution is counted">
222
+ <InfoTooltip label="How bundle distribution is counted">
223
223
  Each installation counts once, by its latest report{" "}
224
224
  {distributionPeriod}. Shares are within each app version.
225
225
  Built-in bundle: the bundle the native build shipped, by its
226
226
  ID. Unknown bundle: no deployment and no built-in bundle ID.
227
- </InsightsInfo>
227
+ </InfoTooltip>
228
228
  </div>
229
229
  <div className="flex flex-wrap items-baseline gap-x-3 gap-y-1">
230
230
  {query.isPending ? (
@@ -1 +0,0 @@
1
- import{$ as e,Ln as t,Ur as n,ar as r,et as i,nt as a}from"./sidebar-DNVyJPfX.js";import{n as o}from"./dist-LxKJB-Vu.js";var s=r(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),c=n(),l=(e,t=12)=>e.length>t?`${e.slice(0,Math.max(1,t-4))}…${e.slice(-4)}`:e;function u({value:n,maxLength:r=12,className:s,buttonClassName:u}){let d=n.length>r,f=l(n,r),p=async()=>{try{await navigator.clipboard.writeText(n),o.success(`Copied to clipboard`,{description:n})}catch{o.error(`Failed to copy value`)}},m=e=>{e.preventDefault(),e.stopPropagation(),p()},h=e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),e.stopPropagation(),p())},g=(0,c.jsx)(`span`,{translate:`no`,className:t(`font-mono text-xs tabular-nums whitespace-nowrap`,s),children:f});return(0,c.jsxs)(e,{children:[(0,c.jsx)(a,{render:(0,c.jsx)(`button`,{type:`button`,"aria-label":`Copy full value: ${n}`,translate:`no`,className:t(`ring-ring/30 bg-muted/40 border-border/70 inline-flex min-w-0 max-w-full cursor-pointer items-center rounded-md border px-1.5 py-0.5 align-top shadow-xs outline-none transition-[background-color,border-color,transform,box-shadow]`,`hover:bg-muted/70 active:scale-[0.98] active:bg-muted/85 focus-visible:ring-[2px]`,`touch-manipulation select-none motion-reduce:transition-none motion-reduce:active:scale-100`,!d&&`cursor-copy`,u),onClick:m,onKeyDown:h}),children:g}),(0,c.jsx)(i,{hidden:!d,children:(0,c.jsx)(`p`,{translate:`no`,className:`break-all font-mono text-xs tabular-nums`,children:n})})]})}export{l as n,s as r,u as t};
@@ -1 +0,0 @@
1
- import{$ as e,Fn as t,Ur as n,ei as r,et as i,nt as a,ri as o}from"./sidebar-DNVyJPfX.js";import{b as s}from"./insights-api-BigAU9sZ.js";var c=`[a-zA-Z0-9-]`,l=String.raw`0|[1-9]\d*`,u=String.raw`\d+`,d=String.raw`\d*[a-zA-Z-]${c}*`,ee=String.raw`(${l})\.(${l})\.(${l})`,te=String.raw`(${u})\.(${u})\.(${u})`,f=`(?:${d}|${l})`,p=`(?:${d}|${u})`,m=String.raw`(?:-(${f}(?:\.${f})*))`,h=String.raw`(?:-?(${p}(?:\.${p})*))`,g=`${c}+`,_=String.raw`(?:\+(${g}(?:\.${g})*))`,v=`v?${ee}${m}?${_}?`,y=String.raw`[v=\s]*${te}${h}?${_}?`,b=String.raw`${l}|x|X|\*`,x=String.raw`${u}|x|X|\*`;String.raw`[v=\s]*(${b})(?:\.(${b})(?:\.(${b})(?:${m})?${_}?)?)?`,String.raw`[v=\s]*(${x})(?:\.(${x})(?:\.(${x})(?:${h})?${_}?)?)?`,String.raw`(?:\^)`;var S=String.raw`(^|[^\d])(\d{1,${16}})(?:\.(\d{1,${16}}))?(?:\.(\d{1,${16}}))?`,C=String.raw`${S}(?:$|[^\d])`,w=String.raw`${S}(?:${m})?(?:${_})?(?:$|[^\d])`;function T(e){let t=[[String.raw`\s`,1],[String.raw`\d`,256],[c,250]];for(let[n,r]of t)e=e.split(`${n}*`).join(`${n}{0,${r}}`).split(`${n}+`).join(`${n}{1,${r}}`);return e}function E(e,t){return new RegExp(T(e),t)}E(`^${v}$`),E(`^${y}$`),E(C),E(w),E(`^${m}$`),E(`^${h}$`);var ne=e=>{if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.baseBundleId==`string`&&typeof t.baseFileHash==`string`&&typeof t.patchFileHash==`string`&&typeof t.patchStorageUri==`string`},re=e=>Array.isArray(e)?e.filter(ne):[],ie=e=>{let t=re(e.patches),n=new Set;return t.filter(e=>n.has(e.baseBundleId)?!1:(n.add(e.baseBundleId),!0))},D=e=>ie(e)[0]??null,ae=e=>D(e)?.baseBundleId??null,oe=e=>D(e)?.baseFileHash??null,se=e=>D(e)?.patchFileHash??null,O=1e3,k=O,A=`Invalid cohort. Use 1-1000 or a lowercase slug without spaces, up to 64 characters.`,j=/^[a-z0-9-]+$/;function M(e){if(!/^\d+$/.test(e))return null;let t=Number.parseInt(e,10);return Number.isNaN(t)||t<1||t>1e3?null:t}function N(e,t){return(e%t+t)%t}function P(e){let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t|=0}return t}function F(e,t){let n=Math.abs(e),r=Math.abs(t);for(;r!==0;){let e=n%r;n=r,r=e}return n}function I(e,t){let n=0,r=1,i=t,a=N(e,t);for(;a!==0;){let e=Math.floor(i/a);[n,r]=[r,n-e*r],[i,a]=[a,i-e*a]}if(i>1)throw Error(`No modular inverse for ${e} mod ${t}`);return N(n,t)}function L(e){let t=N(P(`${e}:multiplier`),997);for(t===0&&(t=1);F(t,O)!==1;)t=N(t+1,O),t===0&&(t=1);let n=N(P(`${e}:offset`),O);return{multiplier:t,offset:n,inverseMultiplier:I(t,O)}}function R(e){return e==null?k:e<=0?0:e>=1e3?O:Math.floor(e)}function z(e){let t=e.trim().toLowerCase(),n=M(t);return n===null?t:String(n)}function B(e){return M(z(e))}function V(e){return B(e)!==null}function H(e){let t=z(e);return t.length>0&&t.length<=64&&!/^\d+$/.test(t)&&j.test(t)}function U(e){let t=z(e);return V(t)||H(t)}function W(e,t){if(t<1||t>1e3)throw Error(`Invalid numeric cohort: ${t}`);let{offset:n,inverseMultiplier:r}=L(e);return N(r*(t-1-n),O)}var G=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,K=e=>typeof e==`string`&&G.test(e),q=e=>{if(!K(e))throw TypeError(`Expected a canonical lowercase UUIDv7`);let t=e.split(`-`).join(``).slice(0,12);return Number.parseInt(t,16)},J=e=>typeof e==`string`&&e.trim().length>0&&e.length<=1024?e:void 0,Y=e=>e===`24h`||e===`7d`||e===`30d`?e:void 0,ce=e=>e===`adoption`||e===`crashes`?e:void 0,le=e=>e===`12m`?e:Y(e);function X(e){return{platform:e.platform===`all`||e.platform===`ios`||e.platform===`android`?e.platform:void 0,channel:J(e.channel),appVersion:J(e.appVersion),window:le(e.window),bundleWindow:Y(e.bundleWindow),healthPlatform:e.healthPlatform===`ios`||e.healthPlatform===`android`?e.healthPlatform:void 0,healthChannel:J(e.healthChannel),releaseId:J(e.releaseId),healthChart:ce(e.healthChart),bundles:J(e.bundles)}}function Z(e){return{...X(e),version:J(e.version),page:typeof e.page==`number`&&Number.isSafeInteger(e.page)&&e.page>0?e.page:void 0}}function ue(e,t=Date.now()){if(!K(e))return`7d`;let n=t-q(e);return n<=864e5?`24h`:n<=7*864e5?`7d`:`30d`}var de=e=>e===void 0?void 0:[...new Set(e.split(`,`).filter(e=>e.length>0))],Q=o(r(),1),$=n();function fe({label:n,children:r}){let o=(0,Q.useId)(),[c,l]=(0,Q.useState)(!1);return(0,$.jsxs)(e,{open:c,onOpenChange:l,triggerId:o,children:[(0,$.jsx)(a,{id:o,"aria-describedby":c?`${o}-description`:void 0,closeOnClick:!1,onClick:()=>l(e=>!e),render:(0,$.jsx)(t,{"aria-label":n,className:`size-11 sm:size-7`,size:`icon`,variant:`ghost`}),children:(0,$.jsx)(s,{})}),(0,$.jsx)(i,{id:`${o}-description`,role:`tooltip`,className:`max-w-64`,side:`bottom`,children:r})]})}export{X as a,O as c,oe as d,se as f,R as h,Z as i,W as l,z as m,ue as n,q as o,U as p,de as r,A as s,fe as t,ae as u};
@@ -1 +0,0 @@
1
- import{Fn as e,Hr as t,Nn as n,Ur as r,Wr as i,Z as a,ar as o,cr as s,ei as c,nr as l,p as u,ri as d,rr as f}from"./sidebar-DNVyJPfX.js";import{a as ee,c as te,d as p,i as ne,l as m,n as h,o as g,r as _,s as v,t as y,u as b}from"./alert-dialog-Bbk_4-WJ.js";import{a as x,b as re,d as ie,f as ae,h as oe,i as S,l as C,m as w,n as T,p as E,r as D,t as O,u as k,v as A,x as j,y as M}from"./field-BBDpjIqu.js";import{t as N}from"./clipboard-DS9ucUQL.js";import{t as P}from"./key-round-wS_SIZ6b.js";import{a as F,c as I,i as L,l as R,n as z,o as B,r as se,t as V}from"./dialog-Bqbb7B0N.js";import{t as H}from"./refresh-cw-BYgoNCco.js";import{n as U}from"./dist-LxKJB-Vu.js";import{a as W,i as G,n as K,o as q,r as J,t as ce}from"./table-Gm4qRWwE.js";var Y=o(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),X=d(c(),1),le=f({method:`GET`}).middleware([l]).handler(i(`2c7f3cdb9bd3cab2c026a48abdc84c362db0362924a08679052a325640aec56b`)),ue=f({method:`POST`}).middleware([l]).handler(i(`68a2d94ee016be64936401f5eba60ab08a47ff373e1cf9de48e4413336e6034b`)),de=f({method:`POST`}).middleware([l]).handler(i(`a1cb80b19ca72a64fb631ca28ebb9b6941db245983de082d5dd3203ec2eef795`)),Z={list:[`api-keys`,`list`]},fe=()=>s({queryKey:Z.list,queryFn:()=>le()}),Q=()=>{let e=t();return p({mutationFn:e=>ue({data:{name:e}}),onSuccess:async()=>{await e.invalidateQueries({queryKey:Z.list})}})},pe=()=>{let e=t();return p({mutationFn:e=>de({data:{id:e}}),onSuccess:async()=>{await e.invalidateQueries({queryKey:Z.list})}})},$=r(),me=e=>new Date(e).toISOString().slice(0,10);function he(){let[t,n]=(0,X.useState)(!1),[r,i]=(0,X.useState)(``),[o,s]=(0,X.useState)(null),c=Q(),l=r.trim(),u=l.length>64?`Name must be 64 characters or fewer.`:null,d=()=>{i(``),s(null),c.reset()},f=e=>{n(e),e||d()};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(e,{onClick:()=>n(!0),children:[(0,$.jsx)(I,{"data-icon":`inline-start`}),`Create API key`]}),(0,$.jsx)(V,{open:t,onOpenChange:f,children:(0,$.jsxs)(z,{showCloseButton:o===null,children:[(0,$.jsxs)(F,{children:[(0,$.jsx)(B,{children:o===null?`Create API key`:`Save your API key`}),(0,$.jsx)(se,{children:o===null?`Name the app or environment that will use this key.`:`This key is shown once. Store it securely before closing.`})]}),o===null?(0,$.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!(l.length===0||u!==null))try{s((await c.mutateAsync(l)).apiKey),U.success(`API key created`)}catch(e){U.error(e instanceof Error?e.message:`Unable to create API key`)}},children:[(0,$.jsx)(S,{children:(0,$.jsxs)(O,{"data-invalid":u!==null||void 0,children:[(0,$.jsx)(x,{htmlFor:`api-key-name`,children:`Name`}),(0,$.jsx)(a,{id:`api-key-name`,autoComplete:`off`,maxLength:65,onChange:e=>i(e.target.value),placeholder:`Production app`,value:r}),(0,$.jsx)(T,{children:`Use a name you can identify before revoking the key.`}),(0,$.jsx)(D,{children:u})]})}),(0,$.jsx)(L,{className:`mt-4`,children:(0,$.jsxs)(e,{disabled:c.isPending||l.length===0||u!==null,type:`submit`,children:[c.isPending?(0,$.jsx)(R,{"data-icon":`inline-start`,className:`animate-spin`}):(0,$.jsx)(P,{"data-icon":`inline-start`}),`Create API key`]})})]}):(0,$.jsxs)(S,{children:[(0,$.jsxs)(O,{children:[(0,$.jsx)(x,{htmlFor:`created-api-key`,children:`API key`}),(0,$.jsxs)(`div`,{className:`flex gap-2`,children:[(0,$.jsx)(a,{id:`created-api-key`,className:`font-mono`,readOnly:!0,value:o}),(0,$.jsxs)(e,{onClick:async()=>{if(o!==null)try{await navigator.clipboard.writeText(o),U.success(`API key copied`)}catch{U.error(`Unable to copy API key`)}},type:`button`,variant:`outline`,children:[(0,$.jsx)(N,{"data-icon":`inline-start`}),`Copy`]})]})]}),(0,$.jsx)(L,{children:(0,$.jsxs)(e,{onClick:()=>f(!1),children:[(0,$.jsx)(j,{"data-icon":`inline-start`}),`Done`]})})]})]})})]})}function ge({record:t}){let[n,r]=(0,X.useState)(!1),i=pe(),a=async e=>{e.preventDefault();try{await i.mutateAsync(t.id),r(!1),U.success(`API key revoked`)}catch(e){U.error(e instanceof Error?e.message:`Unable to revoke API key`)}};return(0,$.jsxs)(y,{open:n,onOpenChange:e=>{i.isPending||r(e)},children:[(0,$.jsxs)(b,{render:(0,$.jsx)(e,{size:`sm`,variant:`ghost`}),children:[(0,$.jsx)(Y,{"data-icon":`inline-start`}),`Revoke`]}),(0,$.jsxs)(ne,{children:[(0,$.jsxs)(v,{children:[(0,$.jsx)(te,{children:(0,$.jsx)(Y,{})}),(0,$.jsxs)(m,{children:[`Revoke `,t.name,`?`]}),(0,$.jsxs)(ee,{children:[`Apps using `,t.prefix,`… will immediately lose OTA update and insights access. This action cannot be undone.`]})]}),(0,$.jsxs)(g,{children:[(0,$.jsx)(_,{disabled:i.isPending,children:`Cancel`}),(0,$.jsx)(h,{disabled:i.isPending,onClick:e=>void a(e),variant:`destructive`,children:`Revoke API key`})]})]})]})}function _e(){let t=fe();return(0,$.jsxs)(w,{className:`overflow-hidden shadow-sm`,children:[(0,$.jsxs)(A,{className:`flex-row items-center justify-between space-y-0 border-b px-4 py-3`,children:[(0,$.jsx)(M,{className:`text-sm`,children:(0,$.jsx)(`h2`,{children:`API keys`})}),(0,$.jsx)(he,{})]}),(0,$.jsx)(oe,{className:`p-0`,children:t.isError?(0,$.jsx)(`div`,{className:`p-4`,children:(0,$.jsxs)(k,{variant:`destructive`,children:[(0,$.jsx)(re,{}),(0,$.jsx)(E,{children:`API keys couldn't be loaded`}),(0,$.jsx)(ae,{children:`Check your connection and try again.`}),(0,$.jsx)(ie,{children:(0,$.jsxs)(e,{onClick:()=>void t.refetch(),size:`xs`,variant:`outline`,children:[(0,$.jsx)(H,{"data-icon":`inline-start`}),`Retry`]})})]})}):(0,$.jsxs)(ce,{"aria-label":`API keys`,className:`table-fixed`,children:[(0,$.jsx)(W,{children:(0,$.jsxs)(q,{children:[(0,$.jsx)(G,{children:`Key`}),(0,$.jsx)(G,{className:`w-32`,children:`Created`}),(0,$.jsx)(G,{className:`w-24 text-right`,children:(0,$.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,$.jsx)(K,{children:t.isLoading?Array.from({length:3},(e,t)=>(0,$.jsxs)(q,{children:[(0,$.jsxs)(J,{className:`space-y-2 py-3`,children:[t===0?(0,$.jsx)(`span`,{className:`sr-only`,children:`Loading API keys`}):null,(0,$.jsx)(n,{className:`h-3.5 w-32`}),(0,$.jsx)(n,{className:`h-3 w-20`})]}),(0,$.jsx)(J,{children:(0,$.jsx)(n,{className:`h-3.5 w-20`})}),(0,$.jsx)(J,{children:(0,$.jsx)(n,{className:`ml-auto h-6 w-16`})})]},t)):t.data?.length===0?(0,$.jsx)(q,{children:(0,$.jsx)(J,{colSpan:3,className:`h-40 text-center text-muted-foreground`,children:(0,$.jsxs)(`div`,{className:`mx-auto flex max-w-xs flex-col items-center gap-2`,children:[(0,$.jsx)(P,{className:`size-5`}),(0,$.jsx)(`p`,{className:`font-medium text-foreground`,children:`No API keys`}),(0,$.jsx)(`p`,{children:`Create an API key to connect an app.`})]})})}):t.data?.map(e=>(0,$.jsxs)(q,{className:e.revoked_at_ms===null?void 0:`text-muted-foreground`,children:[(0,$.jsx)(J,{className:`whitespace-normal py-3`,children:(0,$.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,$.jsx)(`p`,{className:`break-words font-medium text-foreground`,children:e.name}),(0,$.jsxs)(`p`,{className:`font-mono text-xs text-muted-foreground`,children:[e.prefix,`…`]})]})}),(0,$.jsx)(J,{className:`text-xs text-muted-foreground`,children:(0,$.jsx)(`time`,{dateTime:new Date(e.created_at_ms).toISOString(),children:me(e.created_at_ms)})}),(0,$.jsx)(J,{className:`text-right`,children:e.revoked_at_ms===null?(0,$.jsx)(ge,{record:e}):(0,$.jsx)(C,{variant:`outline`,children:`Revoked`})})]},e.id))})]})})]})}function ve(){return(0,$.jsxs)(`div`,{className:`flex h-svh min-h-0 flex-col`,children:[(0,$.jsxs)(`header`,{className:`sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 border-b bg-background px-3 py-3 sm:min-h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm`,children:[(0,$.jsx)(u,{className:`-ml-1`}),(0,$.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,$.jsx)(P,{"aria-hidden":`true`,className:`size-3.5 text-muted-foreground`}),(0,$.jsx)(`h1`,{className:`text-sm font-medium`,children:`API keys`})]}),(0,$.jsx)(`p`,{className:`basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0`,children:`API keys can download OTA updates and submit insights only.`})]}),(0,$.jsx)(`div`,{className:`min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6`,children:(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-5xl`,children:(0,$.jsx)(_e,{})})})]})}export{ve as component};
@@ -1 +0,0 @@
1
- import{t as e}from"./ConsoleFeatureUnavailable-jB4Loglh.js";var t=e;export{t as notFoundComponent};
@@ -1 +0,0 @@
1
- import{ar as e}from"./sidebar-DNVyJPfX.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
@@ -1 +0,0 @@
1
- import{ar as e}from"./sidebar-DNVyJPfX.js";var t=e(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]);export{t};
@@ -1 +0,0 @@
1
- import{ar as e}from"./sidebar-DNVyJPfX.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]);export{t};
@@ -1 +0,0 @@
1
- import{t as e}from"./ConsoleFeatureUnavailable-jB4Loglh.js";var t=e;export{t as notFoundComponent};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/insights-CmraDzQh.js","assets/ConsoleFeatureUnavailable-jB4Loglh.js","assets/sidebar-DNVyJPfX.js","assets/console-features-api-BH5m_PtQ.js","assets/arrow-up-right-BtffZA6e.js","assets/NotFoundPage-DIqCpWa3.js","assets/empty-CuT2UhFp.js","assets/insights-vNRCrfnS.js","assets/useCompositeListItem-9E4pj_CH.js","assets/alert-dialog-Bbk_4-WJ.js","assets/select-BZZBXMkr.js","assets/field-BBDpjIqu.js","assets/tabs-C7FOEjFC.js","assets/insights-usage-rpc-DYEhsCKT.js","assets/valueToPercent-CH8GCHaL.js","assets/EventDetails-B6yUsyNA.js","assets/insights-api-BigAU9sZ.js","assets/HashValueDisplay-BFX_kY3-.js","assets/dist-LxKJB-Vu.js","assets/input-group-ja_30qaF.js","assets/smartphone-DpTFgtKf.js","assets/InsightsPageHeader-B892oVml.js","assets/list-CgrYiadM.js","assets/api-DCM0wr6O.js","assets/chevron-right-BqD5wtFb.js","assets/refresh-cw-BYgoNCco.js","assets/undo-2-CmrHjwFc.js","assets/InsightsInfo-BNO0WznZ.js","assets/table-Gm4qRWwE.js"])))=>i.map(i=>d[i]);
2
- import{r as e}from"./console-features-api-BH5m_PtQ.js";import{a as t,c as n,s as r}from"./useCompositeListItem-9E4pj_CH.js";import{a as i}from"./InsightsInfo-BNO0WznZ.js";var a=n(`/insights`)({beforeLoad:({context:t})=>e(t.queryClient,`insightsAnalytics`),notFoundComponent:r(()=>t(()=>import(`./insights-CmraDzQh.js`),__vite__mapDeps([0,1,2,3,4,5,6])),`notFoundComponent`),component:r(()=>t(()=>import(`./insights-vNRCrfnS.js`),__vite__mapDeps([7,2,8,3,9,10,11,12,13,14,15,16,17,18,19,20,21,22,6,23,4,24,25,26,27,28])),`component`),validateSearch:i});export{a as t};
@@ -1 +0,0 @@
1
- import{Bn as e,Gt as t,Jn as n,Ln as r,Ur as i,Vt as a,Wr as o,ar as s,ei as c,nr as l,ri as u,rr as d}from"./sidebar-DNVyJPfX.js";import{r as f,t as p}from"./valueToPercent-CH8GCHaL.js";var m=s(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),h=u(c()),g=h.createContext(void 0);function _(){let e=h.useContext(g);if(e===void 0)throw Error(n(51));return e}var v=function(e){return e.complete=`data-complete`,e.indeterminate=`data-indeterminate`,e.progressing=`data-progressing`,e}({}),y={status(e){return e===`progressing`?{[v.progressing]:``}:e===`complete`?{[v.complete]:``}:e===`indeterminate`?{[v.indeterminate]:``}:null}},b=i();function x(e,t){return t==null?`indeterminate progress`:e||`${t}%`}var S=h.forwardRef(function(n,r){let{format:i,getAriaValueText:o=x,locale:s,max:c=100,min:l=0,value:u,render:d,className:p,children:m,style:_,...v}=n,[S,C]=h.useState(),w=t(i),T=`indeterminate`;Number.isFinite(u)&&(T=u===c?`complete`:`progressing`);let E=f(u,s,w.current),D=h.useMemo(()=>({status:T}),[T]),O={"aria-labelledby":S,"aria-valuemax":c,"aria-valuemin":l,"aria-valuenow":u??void 0,"aria-valuetext":o(E,u),role:`progressbar`,children:(0,b.jsxs)(h.Fragment,{children:[m,(0,b.jsx)(`span`,{role:`presentation`,style:a,children:`x`})]})},k=h.useMemo(()=>({formattedValue:E,max:c,min:l,setLabelId:C,state:D,status:T,value:u}),[E,c,l,C,D,T,u]),A=e(`div`,n,{state:D,ref:r,props:[O,v],stateAttributesMapping:y});return(0,b.jsx)(g.Provider,{value:k,children:A})}),C=h.forwardRef(function(t,n){let{render:r,className:i,style:a,...o}=t,{state:s}=_();return e(`div`,t,{state:s,ref:n,props:o,stateAttributesMapping:y})}),w=h.forwardRef(function(t,n){let{render:r,className:i,style:a,...o}=t,{max:s,min:c,value:l,state:u}=_(),d=Number.isFinite(l)&&l!==null?p(l,c,s):null;return e(`div`,t,{state:u,ref:n,props:[{style:d==null?{}:{insetInlineStart:0,height:`inherit`,width:`${d}%`}},o],stateAttributesMapping:y})});function T({className:e,children:t,value:n,...i}){return(0,b.jsxs)(S,{value:n,"data-slot":`progress`,className:r(`w-full`,e),...i,children:[t,(0,b.jsx)(E,{children:(0,b.jsx)(D,{})})]})}function E({className:e,...t}){return(0,b.jsx)(C,{className:r(`relative flex h-1 w-full items-center overflow-x-hidden rounded-md bg-muted`,e),"data-slot":`progress-track`,...t})}function D({className:e,...t}){return(0,b.jsx)(w,{"data-slot":`progress-indicator`,className:r(`h-full bg-primary transition-transform motion-reduce:transition-none`,e),...t})}var O=d({method:`GET`}).middleware([l]).handler(o(`8a98cd9c178e4a54185d62c25a95f09d3d59850c43d3f5baa1563e1614ad942e`));export{T as n,m as r,O as t};