viveworker 0.7.0-beta.2 → 0.7.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.
- package/README.md +10 -0
- package/package.json +2 -1
- package/scripts/share-cli.mjs +553 -3
- package/scripts/viveworker-bridge.mjs +1147 -148
- package/viveworker.env.example +4 -0
- package/web/app.css +126 -4
- package/web/app.js +207 -57
- package/web/i18n.js +42 -8
- package/web/index.html +84 -0
- package/web/sw.js +2 -2
package/web/i18n.js
CHANGED
|
@@ -250,6 +250,7 @@ const translations = {
|
|
|
250
250
|
"timeline.filterLabel": "Thread filter",
|
|
251
251
|
"timeline.status.approved": "Approved",
|
|
252
252
|
"timeline.status.rejected": "Rejected",
|
|
253
|
+
"timeline.status.failed": "Failed",
|
|
253
254
|
"timeline.status.implemented": "Started",
|
|
254
255
|
"timeline.status.dismissed": "Dismissed",
|
|
255
256
|
"timeline.status.submitted": "Sent",
|
|
@@ -423,6 +424,8 @@ const translations = {
|
|
|
423
424
|
"settings.row.currentDeviceSubscribed": "This device subscribed",
|
|
424
425
|
"settings.row.lastSuccessfulDelivery": "Last successful delivery",
|
|
425
426
|
"settings.row.version": "Version",
|
|
427
|
+
"settings.updateAvailable.title": "New version available",
|
|
428
|
+
"settings.updateAvailable.copy": "viveworker v{latest} is available. You are currently using v{current}.",
|
|
426
429
|
"settings.row.currentLanguage": "Current language",
|
|
427
430
|
"settings.row.languageSource": "Language source",
|
|
428
431
|
"settings.row.defaultLanguage": "Setup default",
|
|
@@ -518,6 +521,9 @@ const translations = {
|
|
|
518
521
|
"settings.wallet.flow.title": "Recommended order",
|
|
519
522
|
"settings.wallet.flow.banner.title": "Let's set up your wallet",
|
|
520
523
|
"settings.wallet.flow.copy": "You need to activate your wallet to exchange task rewards over A2A.",
|
|
524
|
+
"settings.wallet.betaNotice": "Wallet is in beta. During this test period, wallet payments and payouts are available on testnets only.",
|
|
525
|
+
"settings.wallet.sessionExpired.title": "Refresh your wallet session",
|
|
526
|
+
"settings.wallet.sessionExpired.copy": "Your wallet session expired. Sign in again with a one-time password; your passkey and Base Sepolia address stay linked.",
|
|
521
527
|
"settings.wallet.ready.title": "Ready to use",
|
|
522
528
|
"settings.wallet.ready.copy": "Your email sign-in, passkey, and Base Sepolia wallet are all set.",
|
|
523
529
|
"settings.wallet.ready.payoutIntro": "Agents will use this address for payouts:",
|
|
@@ -529,19 +535,24 @@ const translations = {
|
|
|
529
535
|
"settings.wallet.status.pending": "Pending",
|
|
530
536
|
"settings.wallet.status.locked": "Waiting",
|
|
531
537
|
"settings.wallet.status.optional": "Optional",
|
|
538
|
+
"settings.wallet.status.comingSoon": "Coming soon",
|
|
532
539
|
"settings.wallet.step.signIn.title": "Sign in with email",
|
|
533
540
|
"settings.wallet.step.signIn.copy": "Send a one-time password to your email, then enter it here to sign in to your wallet.",
|
|
541
|
+
"settings.wallet.step.refreshSession.title": "Refresh session",
|
|
542
|
+
"settings.wallet.step.refreshSession.copy": "Send a new one-time password and sign in again before continuing wallet actions.",
|
|
534
543
|
"settings.wallet.step.passkey.title": "Register a passkey",
|
|
535
544
|
"settings.wallet.step.passkey.copy": "Register a passkey on this device. You will use it for wallet issuance and sensitive wallet actions.",
|
|
536
545
|
"settings.wallet.step.baseSepolia.title": "Issue a Base Sepolia wallet",
|
|
537
546
|
"settings.wallet.step.baseSepolia.copy": "Create a testing wallet for the current beta flow. This is the main wallet we recommend issuing first.",
|
|
538
547
|
"settings.wallet.step.base.title": "Issue a Base wallet",
|
|
539
|
-
"settings.wallet.step.base.copy": "
|
|
548
|
+
"settings.wallet.step.base.copy": "Base mainnet wallet issuance is planned for production payouts. It is not active yet.",
|
|
549
|
+
"settings.wallet.step.base.comingSoonDetail": "Coming soon",
|
|
540
550
|
"settings.wallet.mainnet.optIn": "Also set up Base mainnet",
|
|
541
551
|
"settings.wallet.mainnet.optInHint": "Optional — required only for production payouts.",
|
|
542
552
|
"settings.hazbase.title": "Wallet",
|
|
543
553
|
"settings.hazbase.status.signedOut": "Signed out",
|
|
544
554
|
"settings.hazbase.status.signedIn": "Signed in",
|
|
555
|
+
"settings.hazbase.status.sessionExpired": "Session expired",
|
|
545
556
|
"settings.hazbase.status.otpAwaitingVerify": "Sent. Check your inbox, then enter the code below.",
|
|
546
557
|
"settings.hazbase.passkey.ready": "Registered on this device",
|
|
547
558
|
"settings.hazbase.passkey.missing": "Not registered yet",
|
|
@@ -552,6 +563,7 @@ const translations = {
|
|
|
552
563
|
"settings.hazbase.field.otpLabel": "One-time password",
|
|
553
564
|
"settings.hazbase.field.otpPlaceholder": "e.g. 123456",
|
|
554
565
|
"settings.hazbase.action.requestOtp": "Send one-time password",
|
|
566
|
+
"settings.hazbase.action.refreshSession": "Refresh session",
|
|
555
567
|
"settings.hazbase.action.resendOtp": "Resend",
|
|
556
568
|
"settings.hazbase.action.verifyOtp": "Sign in",
|
|
557
569
|
"settings.hazbase.action.changeEmail": "Change email",
|
|
@@ -567,6 +579,7 @@ const translations = {
|
|
|
567
579
|
"settings.hazbase.notice.passkeyRegistered": "Passkey registered.",
|
|
568
580
|
"settings.hazbase.notice.walletBootstrapped": "Wallet issued on chain {chainId}.",
|
|
569
581
|
"settings.hazbase.notice.signedOut": "Signed out of wallet.",
|
|
582
|
+
"settings.hazbase.notice.sessionRefreshStarted": "Session refresh started. Send a one-time password to sign in again.",
|
|
570
583
|
"settings.hazbase.prompt.email": "Wallet email address",
|
|
571
584
|
"settings.hazbase.prompt.otp": "One-time password",
|
|
572
585
|
"settings.row.hazbaseStatus": "Wallet",
|
|
@@ -639,6 +652,7 @@ const translations = {
|
|
|
639
652
|
"error.choiceInputAlreadyHandled": "This choice request was already handled.",
|
|
640
653
|
"error.mkcertRootCaNotFound": "The mkcert root CA file could not be found.",
|
|
641
654
|
"error.hazbaseAuthRequired": "Sign in to your wallet first.",
|
|
655
|
+
"error.hazbaseSessionExpired": "Your wallet session expired. Open Wallet settings and sign in again.",
|
|
642
656
|
"error.hazbaseEmailRequired": "Enter your email address first.",
|
|
643
657
|
"error.hazbaseOtpRequired": "Enter the one-time password.",
|
|
644
658
|
"error.hazbasePasskeyLocalHostRequired": "Open viveworker on its .local hostname to use hazBase passkeys.",
|
|
@@ -659,6 +673,7 @@ const translations = {
|
|
|
659
673
|
"server.action.detail": "Detail",
|
|
660
674
|
"server.action.select": "Choose",
|
|
661
675
|
"server.action.approve": "Approve",
|
|
676
|
+
"server.action.payWithWallet": "Pay with wallet",
|
|
662
677
|
"server.action.reject": "Reject",
|
|
663
678
|
"server.action.implement": "Implement",
|
|
664
679
|
"server.message.commandApprovalNeeded": "Command approval needed.",
|
|
@@ -696,6 +711,8 @@ const translations = {
|
|
|
696
711
|
"claudeAway.notifyOnly.notice": "Sync mode is OFF — please respond on the desktop. {provider} is waiting for input there.",
|
|
697
712
|
"server.message.approvalAccepted": "Approved. {provider} will continue.",
|
|
698
713
|
"server.message.approvalRejected": "Rejected. {provider} was told not to continue this action.",
|
|
714
|
+
"server.message.paymentSubmitted": "Payment submitted. Waiting for settlement to complete.",
|
|
715
|
+
"server.message.paymentFailed": "Payment failed: {reason}",
|
|
699
716
|
"server.message.planImplemented": "{provider} was asked to start implementing from this plan.",
|
|
700
717
|
"server.message.planDismissed": "This plan prompt was closed and future reminders were suppressed.",
|
|
701
718
|
"server.confirm.planImplement": "Implementation will start from this plan.",
|
|
@@ -817,8 +834,8 @@ const translations = {
|
|
|
817
834
|
"Open the HTTP URL in a mobile browser only if you intentionally allowed insecure LAN access. This mode is not recommended on shared Wi-Fi.",
|
|
818
835
|
"cli.setup.instructions.localOnlyHttp":
|
|
819
836
|
"This setup is loopback-only HTTP for local development. Use the default HTTPS setup or --allow-insecure-http-lan if you explicitly need LAN access.",
|
|
820
|
-
"logout.confirm.title": "
|
|
821
|
-
"logout.confirm.copy": "
|
|
837
|
+
"logout.confirm.title": "Log out of viveworker?",
|
|
838
|
+
"logout.confirm.copy": "This ends the current session. This device stays trusted, so you can come back without pairing again.",
|
|
822
839
|
"logout.confirm.keepTrustedTitle": "Log out only",
|
|
823
840
|
"logout.confirm.keepTrustedCopy": "End this session now, but keep this device trusted for the next time you open viveworker.",
|
|
824
841
|
"logout.confirm.removeTitle": "Log out and remove this device",
|
|
@@ -1156,6 +1173,7 @@ const translations = {
|
|
|
1156
1173
|
"timeline.filterLabel": "スレッドフィルター",
|
|
1157
1174
|
"timeline.status.approved": "承認済み",
|
|
1158
1175
|
"timeline.status.rejected": "拒否済み",
|
|
1176
|
+
"timeline.status.failed": "失敗",
|
|
1159
1177
|
"timeline.status.implemented": "実装開始",
|
|
1160
1178
|
"timeline.status.dismissed": "見送り",
|
|
1161
1179
|
"timeline.status.submitted": "送信済み",
|
|
@@ -1282,14 +1300,14 @@ const translations = {
|
|
|
1282
1300
|
"settings.install.title": "ホーム画面に追加",
|
|
1283
1301
|
"settings.install.copy":
|
|
1284
1302
|
"いちばん使いやすい体験にするには、viveworker をホーム画面に追加して、インストール版を開いてください。",
|
|
1285
|
-
"settings.device.title": "
|
|
1303
|
+
"settings.device.title": "信頼済み端末",
|
|
1286
1304
|
"settings.device.copy": "この LAN 上で viveworker を開ける信頼済み端末を管理します。",
|
|
1287
1305
|
"settings.device.count": ({ count }) => `${count} 台の端末`,
|
|
1288
1306
|
"settings.device.section.current": "この端末",
|
|
1289
1307
|
"settings.device.section.other": "他の信頼済み端末",
|
|
1290
1308
|
"settings.device.thisDevice": "この端末",
|
|
1291
1309
|
"settings.device.emptyCurrent": "この端末は現在の有効な信頼済み端末一覧には入っていません。以前の信頼期限が切れたか、削除された可能性があります。必要なら Mac で `npx viveworker pair` を実行して再ペアリングしてください。",
|
|
1292
|
-
"settings.device.emptyOther": "
|
|
1310
|
+
"settings.device.emptyOther": "他に有効な信頼済み端末はありません。",
|
|
1293
1311
|
"settings.device.addAnother.title": "端末を追加する",
|
|
1294
1312
|
"settings.device.addAnother.heading": "新しい端末 / ブラウザを追加",
|
|
1295
1313
|
"settings.device.addAnother.copy":
|
|
@@ -1329,6 +1347,8 @@ const translations = {
|
|
|
1329
1347
|
"settings.row.currentDeviceSubscribed": "この端末の購読状態",
|
|
1330
1348
|
"settings.row.lastSuccessfulDelivery": "最後の通知成功時刻",
|
|
1331
1349
|
"settings.row.version": "バージョン",
|
|
1350
|
+
"settings.updateAvailable.title": "新しいバージョンがあります",
|
|
1351
|
+
"settings.updateAvailable.copy": "viveworker v{latest} が利用できます。現在は v{current} です。",
|
|
1332
1352
|
"settings.row.currentLanguage": "現在の言語",
|
|
1333
1353
|
"settings.row.languageSource": "言語ソース",
|
|
1334
1354
|
"settings.row.defaultLanguage": "setup 時の既定値",
|
|
@@ -1424,6 +1444,9 @@ const translations = {
|
|
|
1424
1444
|
"settings.wallet.flow.title": "おすすめの順番",
|
|
1425
1445
|
"settings.wallet.flow.banner.title": "まずは、セットアップしましょう",
|
|
1426
1446
|
"settings.wallet.flow.copy": "A2A でタスクの報酬をやりとりするには、ウォレットを有効化する必要があります。",
|
|
1447
|
+
"settings.wallet.betaNotice": "ウォレット機能はベータテスト中です。この期間はテストネットでのみ支払い・受け取りを利用できます。",
|
|
1448
|
+
"settings.wallet.sessionExpired.title": "ウォレットセッションを更新しましょう",
|
|
1449
|
+
"settings.wallet.sessionExpired.copy": "ウォレットのセッションが切れています。ワンタイムパスワードで再サインインすれば、Passkey と Base Sepolia アドレスはそのまま使えます。",
|
|
1427
1450
|
"settings.wallet.ready.title": "利用準備ができました",
|
|
1428
1451
|
"settings.wallet.ready.copy": "メールサインイン、Passkey、Base Sepolia ウォレットの準備ができています。",
|
|
1429
1452
|
"settings.wallet.ready.payoutIntro": "エージェントは下記アドレスを利用します:",
|
|
@@ -1435,19 +1458,24 @@ const translations = {
|
|
|
1435
1458
|
"settings.wallet.status.pending": "保留",
|
|
1436
1459
|
"settings.wallet.status.locked": "前の step 待ち",
|
|
1437
1460
|
"settings.wallet.status.optional": "任意",
|
|
1461
|
+
"settings.wallet.status.comingSoon": "Coming soon",
|
|
1438
1462
|
"settings.wallet.step.signIn.title": "メールでサインイン",
|
|
1439
1463
|
"settings.wallet.step.signIn.copy": "メールにワンタイムパスワードを送り、届いた値を入力してウォレットにサインインします。",
|
|
1464
|
+
"settings.wallet.step.refreshSession.title": "セッションを更新",
|
|
1465
|
+
"settings.wallet.step.refreshSession.copy": "ウォレット操作を続ける前に、新しいワンタイムパスワードで再サインインします。",
|
|
1440
1466
|
"settings.wallet.step.passkey.title": "Passkey を登録",
|
|
1441
1467
|
"settings.wallet.step.passkey.copy": "この端末に Passkey を登録します。ウォレット発行や重要な操作で使います。",
|
|
1442
1468
|
"settings.wallet.step.baseSepolia.title": "Base Sepolia ウォレットを発行",
|
|
1443
1469
|
"settings.wallet.step.baseSepolia.copy": "現在の beta フローで使うテスト用ウォレットを発行します。まずはこれを用意するのがおすすめです。",
|
|
1444
1470
|
"settings.wallet.step.base.title": "Base ウォレットを発行",
|
|
1445
|
-
"settings.wallet.step.base.copy": "
|
|
1471
|
+
"settings.wallet.step.base.copy": "本番 payout 向けの Base mainnet ウォレット発行は準備中です。まだ有効化されていません。",
|
|
1472
|
+
"settings.wallet.step.base.comingSoonDetail": "Coming soon",
|
|
1446
1473
|
"settings.wallet.mainnet.optIn": "Base mainnet も設定する",
|
|
1447
1474
|
"settings.wallet.mainnet.optInHint": "任意 — 本番 payout が必要な場合だけ。",
|
|
1448
1475
|
"settings.hazbase.title": "ウォレット",
|
|
1449
1476
|
"settings.hazbase.status.signedOut": "未サインイン",
|
|
1450
1477
|
"settings.hazbase.status.signedIn": "サインイン済み",
|
|
1478
|
+
"settings.hazbase.status.sessionExpired": "セッション切れ",
|
|
1451
1479
|
"settings.hazbase.status.otpAwaitingVerify": "送信しました。メールを確認して、下のフィールドに入力してください。",
|
|
1452
1480
|
"settings.hazbase.passkey.ready": "この端末で登録済み",
|
|
1453
1481
|
"settings.hazbase.passkey.missing": "まだ登録されていません",
|
|
@@ -1458,6 +1486,7 @@ const translations = {
|
|
|
1458
1486
|
"settings.hazbase.field.otpLabel": "ワンタイムパスワード",
|
|
1459
1487
|
"settings.hazbase.field.otpPlaceholder": "例: 123456",
|
|
1460
1488
|
"settings.hazbase.action.requestOtp": "ワンタイムパスワードを送信",
|
|
1489
|
+
"settings.hazbase.action.refreshSession": "セッションを更新",
|
|
1461
1490
|
"settings.hazbase.action.resendOtp": "再送信",
|
|
1462
1491
|
"settings.hazbase.action.verifyOtp": "サインイン",
|
|
1463
1492
|
"settings.hazbase.action.changeEmail": "メールアドレスを変更",
|
|
@@ -1473,6 +1502,7 @@ const translations = {
|
|
|
1473
1502
|
"settings.hazbase.notice.passkeyRegistered": "Passkeyを登録しました。",
|
|
1474
1503
|
"settings.hazbase.notice.walletBootstrapped": "chain {chainId} にウォレットを発行しました。",
|
|
1475
1504
|
"settings.hazbase.notice.signedOut": "ウォレットからログアウトしました。",
|
|
1505
|
+
"settings.hazbase.notice.sessionRefreshStarted": "セッション更新を開始しました。ワンタイムパスワードを送信して再サインインしてください。",
|
|
1476
1506
|
"settings.hazbase.prompt.email": "ウォレットのメールアドレス",
|
|
1477
1507
|
"settings.hazbase.prompt.otp": "ワンタイムパスワード",
|
|
1478
1508
|
"settings.row.hazbaseStatus": "ウォレット",
|
|
@@ -1545,6 +1575,7 @@ const translations = {
|
|
|
1545
1575
|
"error.choiceInputAlreadyHandled": "この選択入力はすでに処理済みです。",
|
|
1546
1576
|
"error.mkcertRootCaNotFound": "mkcert の root CA ファイルが見つかりません。",
|
|
1547
1577
|
"error.hazbaseAuthRequired": "先にウォレットへサインインしてください。",
|
|
1578
|
+
"error.hazbaseSessionExpired": "ウォレットのセッションが切れています。Wallet 設定を開いて再サインインしてください。",
|
|
1548
1579
|
"error.hazbaseEmailRequired": "先にメールアドレスを入力してください。",
|
|
1549
1580
|
"error.hazbaseOtpRequired": "ワンタイムパスワードを入力してください。",
|
|
1550
1581
|
"error.hazbasePasskeyLocalHostRequired": ".local ホスト名で viveworker を開くと hazBase Passkey を使えます。",
|
|
@@ -1565,6 +1596,7 @@ const translations = {
|
|
|
1565
1596
|
"server.action.detail": "詳細",
|
|
1566
1597
|
"server.action.select": "選ぶ",
|
|
1567
1598
|
"server.action.approve": "承認",
|
|
1599
|
+
"server.action.payWithWallet": "ウォレットで支払う",
|
|
1568
1600
|
"server.action.reject": "拒否",
|
|
1569
1601
|
"server.action.implement": "実装する",
|
|
1570
1602
|
"server.message.commandApprovalNeeded": "コマンド実行の承認が必要です。",
|
|
@@ -1602,6 +1634,8 @@ const translations = {
|
|
|
1602
1634
|
"claudeAway.notifyOnly.notice": "同期モードは OFF です。PC で操作してください。{provider} は PC からの入力を待っています。",
|
|
1603
1635
|
"server.message.approvalAccepted": "承認しました。{provider} を続行します。",
|
|
1604
1636
|
"server.message.approvalRejected": "拒否しました。{provider} にこの操作を続けないよう伝えました。",
|
|
1637
|
+
"server.message.paymentSubmitted": "支払いを送信しました。決済完了を待っています。",
|
|
1638
|
+
"server.message.paymentFailed": "支払いに失敗しました: {reason}",
|
|
1605
1639
|
"server.message.planImplemented": "この plan から実装を開始するよう {provider} に伝えました。",
|
|
1606
1640
|
"server.message.planDismissed": "この Plan 確認を閉じ、再通知を抑止しました。",
|
|
1607
1641
|
"server.confirm.planImplement": "この plan から実装を開始します。",
|
|
@@ -1723,8 +1757,8 @@ const translations = {
|
|
|
1723
1757
|
"HTTP URL は、LAN 上の平文アクセスを明示的に許可した場合だけブラウザで開いてください。共有 Wi-Fi では非推奨です。",
|
|
1724
1758
|
"cli.setup.instructions.localOnlyHttp":
|
|
1725
1759
|
"この setup はローカル開発用の loopback-only HTTP です。別の端末から使うなら既定の HTTPS setup か --allow-insecure-http-lan を使ってください。",
|
|
1726
|
-
"logout.confirm.title": "
|
|
1727
|
-
"logout.confirm.copy": "session
|
|
1760
|
+
"logout.confirm.title": "viveworker からログアウトしますか?",
|
|
1761
|
+
"logout.confirm.copy": "現在の session を終了します。この端末の信頼は維持されるので、次回は再 pairing なしで戻れます。",
|
|
1728
1762
|
"logout.confirm.keepTrustedTitle": "ログアウトのみ",
|
|
1729
1763
|
"logout.confirm.keepTrustedCopy": "今の session だけ終了し、この端末の信頼は残します。",
|
|
1730
1764
|
"logout.confirm.removeTitle": "ログアウトしてこの端末を削除",
|
package/web/index.html
CHANGED
|
@@ -8,9 +8,93 @@
|
|
|
8
8
|
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">
|
|
9
9
|
<link rel="icon" type="image/png" sizes="192x192" href="/icons/viveworker-icon-192.png">
|
|
10
10
|
<link rel="stylesheet" href="/app.css">
|
|
11
|
+
<style>
|
|
12
|
+
.boot-splash {
|
|
13
|
+
position: fixed;
|
|
14
|
+
inset: 0;
|
|
15
|
+
z-index: 9999;
|
|
16
|
+
display: grid;
|
|
17
|
+
place-items: center;
|
|
18
|
+
padding: max(1.2rem, env(safe-area-inset-top)) 1rem max(1.2rem, env(safe-area-inset-bottom));
|
|
19
|
+
color: #f5fbff;
|
|
20
|
+
background:
|
|
21
|
+
radial-gradient(circle at 50% 18%, rgba(47, 143, 103, 0.22), transparent 30%),
|
|
22
|
+
radial-gradient(circle at 78% 78%, rgba(79, 131, 216, 0.14), transparent 28%),
|
|
23
|
+
linear-gradient(180deg, #081015 0%, #091015 100%);
|
|
24
|
+
transition: opacity 220ms ease, visibility 220ms ease;
|
|
25
|
+
}
|
|
26
|
+
.boot-splash__card {
|
|
27
|
+
width: min(20rem, 82vw);
|
|
28
|
+
display: grid;
|
|
29
|
+
justify-items: center;
|
|
30
|
+
gap: 0.9rem;
|
|
31
|
+
text-align: center;
|
|
32
|
+
}
|
|
33
|
+
.boot-splash__logo {
|
|
34
|
+
width: clamp(5.4rem, 28vw, 7rem);
|
|
35
|
+
height: clamp(5.4rem, 28vw, 7rem);
|
|
36
|
+
border-radius: 28%;
|
|
37
|
+
background:
|
|
38
|
+
radial-gradient(circle at 76% 24%, rgba(125, 211, 252, 0.22), transparent 30%),
|
|
39
|
+
linear-gradient(180deg, rgba(23, 52, 72, 0.96), rgba(9, 17, 23, 0.96));
|
|
40
|
+
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.32);
|
|
41
|
+
}
|
|
42
|
+
.boot-splash__title {
|
|
43
|
+
margin: 0.25rem 0 0;
|
|
44
|
+
font-family: "Avenir Next", "SF Pro Rounded", "SF Pro Text", "Helvetica Neue", sans-serif;
|
|
45
|
+
font-size: clamp(1.65rem, 8vw, 2.4rem);
|
|
46
|
+
line-height: 1;
|
|
47
|
+
letter-spacing: -0.04em;
|
|
48
|
+
}
|
|
49
|
+
.boot-splash__status {
|
|
50
|
+
margin: 0;
|
|
51
|
+
color: rgba(205, 220, 231, 0.72);
|
|
52
|
+
font-family: "Avenir Next", "SF Pro Rounded", "SF Pro Text", "Helvetica Neue", sans-serif;
|
|
53
|
+
font-size: 0.9rem;
|
|
54
|
+
letter-spacing: 0.02em;
|
|
55
|
+
}
|
|
56
|
+
.boot-splash__dots {
|
|
57
|
+
display: inline-grid;
|
|
58
|
+
grid-auto-flow: column;
|
|
59
|
+
gap: 0.34rem;
|
|
60
|
+
margin-top: 0.15rem;
|
|
61
|
+
}
|
|
62
|
+
.boot-splash__dots span {
|
|
63
|
+
width: 0.42rem;
|
|
64
|
+
height: 0.42rem;
|
|
65
|
+
border-radius: 999px;
|
|
66
|
+
background: rgba(142, 215, 255, 0.88);
|
|
67
|
+
animation: viveworker-boot-dot 980ms ease-in-out infinite;
|
|
68
|
+
}
|
|
69
|
+
.boot-splash__dots span:nth-child(2) { animation-delay: 140ms; }
|
|
70
|
+
.boot-splash__dots span:nth-child(3) { animation-delay: 280ms; }
|
|
71
|
+
.viveworker-ready .boot-splash {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
visibility: hidden;
|
|
74
|
+
}
|
|
75
|
+
@keyframes viveworker-boot-dot {
|
|
76
|
+
0%, 80%, 100% { transform: translateY(0); opacity: 0.42; }
|
|
77
|
+
40% { transform: translateY(-0.28rem); opacity: 1; }
|
|
78
|
+
}
|
|
79
|
+
@media (prefers-reduced-motion: reduce) {
|
|
80
|
+
.boot-splash,
|
|
81
|
+
.boot-splash__dots span {
|
|
82
|
+
transition: none;
|
|
83
|
+
animation: none;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
</style>
|
|
11
87
|
<title>viveworker</title>
|
|
12
88
|
</head>
|
|
13
89
|
<body>
|
|
90
|
+
<div id="boot-splash" class="boot-splash" role="status" aria-live="polite" aria-label="viveworker is starting">
|
|
91
|
+
<div class="boot-splash__card">
|
|
92
|
+
<img class="boot-splash__logo" src="/icons/viveworker-v-pulse.svg" alt="" width="112" height="112" decoding="async">
|
|
93
|
+
<h1 class="boot-splash__title">viveworker</h1>
|
|
94
|
+
<p class="boot-splash__status">Starting</p>
|
|
95
|
+
<span class="boot-splash__dots" aria-hidden="true"><span></span><span></span><span></span></span>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
14
98
|
<div id="app"></div>
|
|
15
99
|
<script type="module" src="/app.js"></script>
|
|
16
100
|
</body>
|
package/web/sw.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const CACHE_NAME = "viveworker-
|
|
1
|
+
const CACHE_NAME = "viveworker-v66";
|
|
2
2
|
const NOTIFICATION_INTENT_CACHE = "viveworker-notification-intent-v1";
|
|
3
3
|
const NOTIFICATION_INTENT_PATH = "/__viveworker_notification_intent__";
|
|
4
|
-
const APP_ASSETS = ["/app.css", "/app.js", "/i18n.js"];
|
|
4
|
+
const APP_ASSETS = ["/app.css", "/app.js", "/i18n.js", "/icons/viveworker-v-pulse.svg"];
|
|
5
5
|
const APP_ROUTES = new Set(["/", "/app", "/app/"]);
|
|
6
6
|
const CACHED_PATHS = new Set(APP_ASSETS);
|
|
7
7
|
|