@vuepress/plugin-pwa 2.0.0-rc.7 → 2.0.0-rc.71

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 (44) hide show
  1. package/lib/client/PwaReadyPopup-x_4DCmI1.js +2 -0
  2. package/lib/client/PwaReadyPopup-x_4DCmI1.js.map +1 -0
  3. package/lib/client/components/PwaFoundPopup.d.ts +25 -0
  4. package/lib/client/components/PwaFoundPopup.js +2 -0
  5. package/lib/client/components/PwaFoundPopup.js.map +1 -0
  6. package/lib/client/components/PwaInstall.d.ts +20 -0
  7. package/lib/client/components/PwaInstall.js +2 -0
  8. package/lib/client/components/PwaInstall.js.map +1 -0
  9. package/lib/client/components/PwaReadyPopup.d.ts +25 -0
  10. package/lib/client/components/PwaReadyPopup.js +2 -0
  11. package/lib/client/components/PwaReadyPopup.js.map +1 -0
  12. package/lib/client/composables/index.d.ts +22 -2
  13. package/lib/client/composables/index.js +2 -2
  14. package/lib/client/composables/index.js.map +1 -0
  15. package/lib/client/icons-DQk7h1-3.js +2 -0
  16. package/lib/client/icons-DQk7h1-3.js.map +1 -0
  17. package/lib/client/index-DYf0Bvv5.js +2 -0
  18. package/lib/client/index-DYf0Bvv5.js.map +1 -0
  19. package/lib/client/index.d.ts +51 -1
  20. package/lib/client/index.js +2 -1
  21. package/lib/client/index.js.map +1 -0
  22. package/lib/client/styles/modal.css +1 -0
  23. package/lib/client/styles/modal.css.map +1 -0
  24. package/lib/client/styles/popup.css +1 -0
  25. package/lib/client/styles/popup.css.map +1 -0
  26. package/lib/client/styles/vars.css +1 -0
  27. package/lib/client/styles/vars.css.map +1 -0
  28. package/lib/client/types-B0Ty8tPv.d.ts +74 -0
  29. package/lib/client/usePwaEvent-CUDY9qle.js +2 -0
  30. package/lib/client/usePwaEvent-CUDY9qle.js.map +1 -0
  31. package/lib/node/index.d.ts +370 -4
  32. package/lib/node/index.js +28 -4
  33. package/lib/node/index.js.map +1 -0
  34. package/package.json +15 -12
  35. package/lib/client/composables/usePwaEvent.d.ts +0 -13
  36. package/lib/client/composables/usePwaEvent.js +0 -9
  37. package/lib/client/composables/useSkipWaiting.d.ts +0 -4
  38. package/lib/client/composables/useSkipWaiting.js +0 -13
  39. package/lib/client/config.d.ts +0 -3
  40. package/lib/client/config.js +0 -50
  41. package/lib/node/generateServiceWorker.d.ts +0 -4
  42. package/lib/node/generateServiceWorker.js +0 -36
  43. package/lib/node/pwaPlugin.d.ts +0 -17
  44. package/lib/node/pwaPlugin.js +0 -19
@@ -0,0 +1,2 @@
1
+ import{useLocaleConfig as r}from"@vuepress/helper/client";import{defineComponent as i,shallowRef as d,computed as c,onMounted as m,h as a,Transition as f}from"vue";import{U as v}from"./icons-DQk7h1-3.js";import"./styles/popup.css";import{u as w}from"./usePwaEvent-CUDY9qle.js";const u=o=>{const t=o.waiting;if(!t)return;const s=new MessageChannel;t.postMessage({type:"SKIP_WAITING"},[s.port2])},P=i({name:"PwaReadyPopup",props:{locales:{type:Object,required:!0}},slots:Object,setup(o,{slots:t}){const s=r(o.locales),e=d(),n=c(()=>!!e.value),p=()=>{e.value&&(u(e.value),e.value=void 0)};return m(()=>{w().on("updated",l=>{e.value=l})}),()=>a(f,{name:"popup"},()=>t.default?.({isReady:n.value,reload:p})??(n.value?a("button",{type:"button",class:"sw-update-popup",tabindex:0,onClick:()=>{p()}},[s.value.update,a("span",{class:"icon-wrapper"},a(v))]):null))}});export{P,u as s};
2
+ //# sourceMappingURL=PwaReadyPopup-x_4DCmI1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PwaReadyPopup-x_4DCmI1.js","sources":["../../src/client/utils/skipWaiting.ts","../../src/client/components/PwaReadyPopup.ts"],"sourcesContent":["/**\n * Call `skipWaiting()` inside current waiting worker\n *\n * 在当前等待中的 Service Worker 中调用 `skipWaiting()`\n */\nexport const skipWaiting = (registration: ServiceWorkerRegistration): void => {\n // Get the waiting worker\n const worker = registration.waiting\n\n // If there is no waiting worker, return directly\n if (!worker) return\n\n // Post SKIP_WAITING message to the waiting worker\n const channel = new MessageChannel()\n\n worker.postMessage({ type: 'SKIP_WAITING' }, [channel.port2])\n}\n","import { useLocaleConfig } from '@vuepress/helper/client'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport {\n Transition,\n computed,\n defineComponent,\n h,\n onMounted,\n shallowRef,\n} from 'vue'\nimport { usePwaEvent } from '../composables/index.js'\nimport type { PwaPluginLocaleConfig } from '../types.js'\nimport { skipWaiting } from '../utils/index.js'\nimport { UpdateIcon } from './icons.js'\n\nimport '../styles/popup.css'\n\nexport const PwaReadyPopup = defineComponent({\n name: 'PwaReadyPopup',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n },\n\n slots: Object as SlotsType<{\n default?: (props: {\n isReady: boolean\n reload: () => void\n }) => VNode | VNode[] | null\n }>,\n\n setup(props, { slots }) {\n const locale = useLocaleConfig(props.locales)\n const registration = shallowRef<ServiceWorkerRegistration>()\n\n const isReady = computed(() => Boolean(registration.value))\n\n const reload = (): void => {\n if (registration.value) {\n skipWaiting(registration.value)\n registration.value = undefined\n }\n }\n\n onMounted(() => {\n const event = usePwaEvent()\n\n event.on('updated', (reg) => {\n registration.value = reg\n })\n })\n\n return (): VNode =>\n h(\n Transition,\n { name: 'popup' },\n () =>\n slots.default?.({\n isReady: isReady.value,\n reload,\n }) ??\n (isReady.value\n ? h(\n 'button',\n {\n type: 'button',\n class: 'sw-update-popup',\n tabindex: 0,\n onClick: () => {\n reload()\n },\n },\n [\n locale.value.update,\n h('span', { class: 'icon-wrapper' }, h(UpdateIcon)),\n ],\n )\n : null),\n )\n },\n})\n"],"names":["skipWaiting","registration","worker","channel","PwaReadyPopup","defineComponent","props","slots","locale","useLocaleConfig","shallowRef","isReady","computed","reload","onMounted","usePwaEvent","reg","h","Transition","UpdateIcon"],"mappings":"qRAKa,MAAAA,EAAeC,GAAkD,CAE5E,MAAMC,EAASD,EAAa,QAG5B,GAAI,CAACC,EAAQ,OAGb,MAAMC,EAAU,IAAI,eAEpBD,EAAO,YAAY,CAAE,KAAM,cAAe,EAAG,CAACC,EAAQ,KAAK,CAAC,CAC9D,ECCaC,EAAgBC,EAAgB,CAC3C,KAAM,gBAEN,MAAO,CAEL,QAAS,CACP,KAAM,OACN,SAAU,EACZ,CACF,EAEA,MAAO,OAOP,MAAMC,EAAO,CAAE,MAAAC,CAAM,EAAG,CACtB,MAAMC,EAASC,EAAgBH,EAAM,OAAO,EACtCL,EAAeS,EAAsC,EAErDC,EAAUC,EAAS,IAAM,CAAQX,CAAAA,EAAa,KAAM,EAEpDY,EAAS,IAAY,CACrBZ,EAAa,QACfD,EAAYC,EAAa,KAAK,EAC9BA,EAAa,MAAQ,OAEzB,EAEA,OAAAa,EAAU,IAAM,CACAC,EAAAA,EAER,GAAG,UAAYC,GAAQ,CAC3Bf,EAAa,MAAQe,CACvB,CAAC,CACH,CAAC,EAEM,IACLC,EACEC,EACA,CAAE,KAAM,OAAQ,EAChB,IACEX,EAAM,UAAU,CACd,QAASI,EAAQ,MACjB,OAAAE,CACF,CAAC,IACAF,EAAQ,MACLM,EACE,SACA,CACE,KAAM,SACN,MAAO,kBACP,SAAU,EACV,QAAS,IAAM,CACbJ,EACF,CAAA,CACF,EACA,CACEL,EAAO,MAAM,OACbS,EAAE,OAAQ,CAAE,MAAO,cAAe,EAAGA,EAAEE,CAAU,CAAC,CACpD,CACF,EACA,KACR,CACJ,CACF,CAAC"}
@@ -0,0 +1,25 @@
1
+ import * as vue from 'vue';
2
+ import { PropType, VNode, SlotsType } from 'vue';
3
+ import { P as PwaPluginLocaleConfig } from '../types-B0Ty8tPv.js';
4
+ import '@vuepress/helper/client';
5
+
6
+ declare const PwaFoundPopup: vue.DefineComponent<vue.ExtractPropTypes<{
7
+ /** locale data */
8
+ locales: {
9
+ type: PropType<PwaPluginLocaleConfig>;
10
+ required: true;
11
+ };
12
+ }>, () => VNode, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
13
+ /** locale data */
14
+ locales: {
15
+ type: PropType<PwaPluginLocaleConfig>;
16
+ required: true;
17
+ };
18
+ }>> & Readonly<{}>, {}, SlotsType<{
19
+ default?: (props: {
20
+ found: boolean;
21
+ refresh: () => void;
22
+ }) => VNode | VNode[] | null;
23
+ }>, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
24
+
25
+ export { PwaFoundPopup };
@@ -0,0 +1,2 @@
1
+ import{useLocaleConfig as s}from"@vuepress/helper/client";import{defineComponent as l,ref as i,onMounted as c,h as o,Transition as d}from"vue";import{U as f}from"../icons-DQk7h1-3.js";import"../styles/popup.css";import{u as m}from"../usePwaEvent-CUDY9qle.js";const v=l({name:"PwaFoundPopup",props:{locales:{type:Object,required:!0}},slots:Object,setup(a,{slots:r}){const u=s(a.locales),e=i(!1),t=()=>{e.value&&(window.location.reload(!0),e.value=!1)};return c(()=>{const n=m();n.on("updatefound",()=>{navigator.serviceWorker.getRegistration().then(p=>{p?.active&&(e.value=!0)})}),n.on("updated",()=>{e.value=!1})}),()=>o(d,{name:"popup"},()=>r.default?.({found:e.value,refresh:t})??(e.value?o("button",{type:"button",class:"sw-hint-popup",tabindex:0,onClick:()=>{t()}},[u.value.hint,o("span",{class:"icon-wrapper"},o(f))]):null))}});export{v as PwaFoundPopup};
2
+ //# sourceMappingURL=PwaFoundPopup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PwaFoundPopup.js","sources":["../../../src/client/components/PwaFoundPopup.ts"],"sourcesContent":["import { useLocaleConfig } from '@vuepress/helper/client'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport { Transition, defineComponent, h, onMounted, ref } from 'vue'\nimport { usePwaEvent } from '../composables/index.js'\nimport type { PwaPluginLocaleConfig } from '../types.js'\nimport { UpdateIcon } from './icons.js'\n\nimport '../styles/popup.css'\n\nexport const PwaFoundPopup = defineComponent({\n name: 'PwaFoundPopup',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n },\n\n slots: Object as SlotsType<{\n default?: (props: {\n found: boolean\n refresh: () => void\n }) => VNode | VNode[] | null\n }>,\n\n setup(props, { slots }) {\n const locale = useLocaleConfig(props.locales)\n const found = ref(false)\n\n const refresh = (): void => {\n if (found.value) {\n // force refresh\n // @ts-expect-error: A non-standard API\n window.location.reload(true)\n found.value = false\n }\n }\n\n onMounted(() => {\n const event = usePwaEvent()\n\n event.on('updatefound', () => {\n void navigator.serviceWorker.getRegistration().then((registration) => {\n // Check whether a valid service worker is active\n if (registration?.active) found.value = true\n })\n })\n\n event.on('updated', () => {\n found.value = false\n })\n })\n\n return (): VNode =>\n h(\n Transition,\n { name: 'popup' },\n () =>\n slots.default?.({\n found: found.value,\n refresh,\n }) ??\n (found.value\n ? h(\n 'button',\n {\n type: 'button',\n class: 'sw-hint-popup',\n tabindex: 0,\n onClick: () => {\n refresh()\n },\n },\n [\n locale.value.hint,\n h('span', { class: 'icon-wrapper' }, h(UpdateIcon)),\n ],\n )\n : null),\n )\n },\n})\n"],"names":["PwaFoundPopup","defineComponent","props","slots","locale","useLocaleConfig","found","ref","refresh","onMounted","event","usePwaEvent","registration","h","Transition","UpdateIcon"],"mappings":"mQASa,MAAAA,EAAgBC,EAAgB,CAC3C,KAAM,gBAEN,MAAO,CAEL,QAAS,CACP,KAAM,OACN,SAAU,EACZ,CACF,EAEA,MAAO,OAOP,MAAMC,EAAO,CAAE,MAAAC,CAAM,EAAG,CACtB,MAAMC,EAASC,EAAgBH,EAAM,OAAO,EACtCI,EAAQC,EAAI,EAAK,EAEjBC,EAAU,IAAY,CACtBF,EAAM,QAGR,OAAO,SAAS,OAAO,EAAI,EAC3BA,EAAM,MAAQ,GAElB,EAEA,OAAAG,EAAU,IAAM,CACd,MAAMC,EAAQC,EAAY,EAE1BD,EAAM,GAAG,cAAe,IAAM,CACvB,UAAU,cAAc,gBAAA,EAAkB,KAAME,GAAiB,CAEhEA,GAAc,SAAQN,EAAM,MAAQ,GAC1C,CAAC,CACH,CAAC,EAEDI,EAAM,GAAG,UAAW,IAAM,CACxBJ,EAAM,MAAQ,EAChB,CAAC,CACH,CAAC,EAEM,IACLO,EACEC,EACA,CAAE,KAAM,OAAQ,EAChB,IACEX,EAAM,UAAU,CACd,MAAOG,EAAM,MACb,QAAAE,CACF,CAAC,IACAF,EAAM,MACHO,EACE,SACA,CACE,KAAM,SACN,MAAO,gBACP,SAAU,EACV,QAAS,IAAM,CACbL,GACF,CACF,EACA,CACEJ,EAAO,MAAM,KACbS,EAAE,OAAQ,CAAE,MAAO,cAAe,EAAGA,EAAEE,CAAU,CAAC,CACpD,CACF,EACA,KACR,CACJ,CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import * as vue from 'vue';
2
+ import { PropType, VNode } from 'vue';
3
+ import { P as PwaPluginLocaleConfig } from '../types-B0Ty8tPv.js';
4
+ import '@vuepress/helper/client';
5
+
6
+ declare const PwaInstall: vue.DefineComponent<vue.ExtractPropTypes<{
7
+ /** locale data */
8
+ locales: {
9
+ type: PropType<PwaPluginLocaleConfig>;
10
+ required: true;
11
+ };
12
+ }>, () => VNode, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
13
+ /** locale data */
14
+ locales: {
15
+ type: PropType<PwaPluginLocaleConfig>;
16
+ required: true;
17
+ };
18
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
19
+
20
+ export { PwaInstall };
@@ -0,0 +1,2 @@
1
+ import{useLocaleConfig as h}from"@vuepress/helper/client";import{useEventListener as f,useToggle as C}from"@vueuse/core";import{defineComponent as g,shallowRef as b,onMounted as w,h as e,ref as u,computed as y}from"vue";import{withBase as k}from"vuepress/client";import{C as P,A as S,a as A}from"../icons-DQk7h1-3.js";import"../styles/modal.css";const O=g({name:"PwaInstallModal",props:{locales:{type:Object,required:!0},useHint:Boolean},emits:["canInstall","hint","close"],setup(c,{emit:l}){const o=h(c.locales),t=b({}),n=b(),r=async()=>{const a=localStorage.getItem("manifest");if(a)t.value=JSON.parse(a);else try{const m=await(await fetch(k("manifest.webmanifest"))).json();t.value=m,localStorage.setItem("manifest",JSON.stringify(m))}catch{console.error("[PWA]: Error getting manifest, check that you have a valid web manifest or network connection")}},v=()=>{const a=document.querySelector(".screenshot");a&&a.scrollBy({left:-a.clientWidth,top:0,behavior:"smooth"})},p=()=>{const a=document.querySelector(".screenshot");a&&a.scrollBy({left:a.clientWidth,top:0,behavior:"smooth"})},i=async()=>{n.value&&(n.value.prompt(),document.dispatchEvent(new CustomEvent("show")),(await n.value.userChoice).outcome==="accepted"?(console.info("PWA has been installed"),l("close",!1),l("canInstall",!1)):(console.info("You choose to not install PWA"),l("close",!1),l("canInstall",!1)))},d=()=>{console.info("You accepted the install hint"),l("hint")};return w(()=>{window.hasOwnProperty("BeforeInstallPromptEvent")&&(f(window,"beforeinstallprompt",a=>{n.value=a,l("canInstall",!0),a.preventDefault()}),f("keyup",a=>{a.key==="Escape"&&l("close",!1)}),r())}),()=>e("div",{id:"install-modal-wrapper"},[e("div",{class:"background",onClick:()=>{l("close",!1)}}),e("div",{class:"install-modal"},[e("div",{class:"header"},[e("button",{type:"button",class:"close-button","aria-label":o.value.close,onClick:()=>{l("close",!1)}},e(P)),e("div",{class:"logo"},[t.value.icons?e("img",{src:t.value.icons[0]?.src,alt:"App Logo"}):null,e("div",{class:"title"},[e("h1",t.value.short_name||t.value.name),e("p",{class:"desc"},o.value.explain)])])]),e("div",{class:"content"},[e("div",{class:"highlight"},[t.value.features?e("div",{class:"feature-wrapper"},[e("h3",o.value.feature),e("ul",t.value.features.map(a=>e("li",a)))]):null,t.value.screenshots?e("div",{class:"screenshot-wrapper"},[e("button",{type:"button","aria-label":o.value.prevImage,onClick:v},e(S)),e("section",{class:"screenshot"},[t.value.screenshots.map(a=>e("div",e("img",{src:a.src,alt:"App Screenshot"})))]),e("button",{type:"button","aria-label":o.value.nextImage,onClick:p},e(A))]):null]),e("div",{class:"description"},[e("h3",o.value.desc),e("p",t.value.description)])]),c.useHint?e("div",{class:"ios-text",onClick:d},[e("p",o.value.iOSInstall),e("button",{type:"button",class:"success"},"Got it!")]):e("div",{class:"button-wrapper"},[e("button",{type:"button",class:"install-button",onClick:i},[o.value.install,e("span",t.value.short_name)]),e("button",{type:"button",class:"cancel-button",onClick:()=>{l("close",!1)}},o.value.cancel)])])])}}),x=g({name:"PwaInstall",props:{locales:{type:Object,required:!0}},setup(c){const l=h(c.locales),[o,t]=C(!1),n=u(!1),r=u(!1),v=u(!1),p=u(!1),i=u(!1),d=y(()=>v.value&&p.value&&!i.value),a=y(()=>r.value&&n.value||d.value),m=()=>navigator.standalone?navigator.standalone:matchMedia("(display-mode: standalone)").matches,I=()=>{t(!1),i.value=!0,localStorage.setItem("iOS-pwa-hint","hinted")};return w(()=>{if(m()){const{userAgent:s}=navigator;v.value=s.includes("iPhone")||s.includes("iPad")||!!(s.includes("Macintosh")&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2),p.value=navigator.userAgent.includes("Safari")&&!s.includes("Chrome"),i.value=!!localStorage.getItem("iOS-pwa-hint")}"getInstalledRelatedApps"in navigator&&navigator.getInstalledRelatedApps().then(s=>{r.value=s.length>0})}),()=>e("div",{id:"pwa-install"},[a.value?e("button",{type:"button",class:"modal-button",onClick:()=>{t(!0)}},l.value.install):null,e(O,{style:{display:o.value?"block":"none"},locales:c.locales,useHint:d.value,onCanInstall:s=>{n.value=s},onHint:()=>{I()},onClose:()=>t(!1)})])}});export{x as PwaInstall};
2
+ //# sourceMappingURL=PwaInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PwaInstall.js","sources":["../../../src/client/components/PwaInstallModal.ts","../../../src/client/components/PwaInstall.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { useLocaleConfig } from '@vuepress/helper/client'\nimport { useEventListener } from '@vueuse/core'\nimport type { PropType, VNode } from 'vue'\nimport { defineComponent, h, onMounted, shallowRef } from 'vue'\nimport { withBase } from 'vuepress/client'\nimport type { AppManifest } from '../../shared/index.js'\nimport type { PwaPluginLocaleConfig } from '../types.js'\nimport { ArrowLeftIcon, ArrowRightIcon, CloseIcon } from './icons.js'\n\ninterface InstallPromptEvent extends Event {\n readonly platforms: string\n prompt: () => void\n readonly userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>\n}\n\nexport const PwaInstallModal = defineComponent({\n name: 'PwaInstallModal',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n\n /**\n * Whether use hint message instead of showing a button\n *\n * 是否使用提示\n */\n useHint: Boolean,\n },\n\n emits: ['canInstall', 'hint', 'close'],\n\n setup(props, { emit }) {\n const locale = useLocaleConfig(props.locales)\n\n const manifest = shallowRef<AppManifest>({})\n const deferredPrompt = shallowRef<InstallPromptEvent>()\n\n const getManifest = async (): Promise<void> => {\n const manifestContent = localStorage.getItem('manifest')\n\n if (manifestContent)\n manifest.value = JSON.parse(manifestContent) as AppManifest\n else\n try {\n const response = await fetch(withBase('manifest.webmanifest'))\n const data = (await response.json()) as AppManifest\n\n manifest.value = data\n localStorage.setItem('manifest', JSON.stringify(data))\n } catch {\n console.error(\n '[PWA]: Error getting manifest, check that you have a valid web manifest or network connection',\n )\n }\n }\n\n const scrollToLeft = (): void => {\n const screenshotsDiv = document.querySelector('.screenshot')\n\n if (screenshotsDiv)\n screenshotsDiv.scrollBy({\n left: -screenshotsDiv.clientWidth,\n top: 0,\n behavior: 'smooth',\n })\n }\n\n const scrollToRight = (): void => {\n const screenshotsDiv = document.querySelector('.screenshot')\n\n if (screenshotsDiv)\n screenshotsDiv.scrollBy({\n left: screenshotsDiv.clientWidth,\n top: 0,\n behavior: 'smooth',\n })\n }\n\n const install = async (): Promise<void> => {\n if (deferredPrompt.value) {\n deferredPrompt.value.prompt()\n\n document.dispatchEvent(new CustomEvent('show'))\n\n const choiceResult = await deferredPrompt.value.userChoice\n\n if (choiceResult.outcome === 'accepted') {\n console.info('PWA has been installed')\n\n emit('close', false)\n emit('canInstall', false)\n } else {\n console.info('You choose to not install PWA')\n\n emit('close', false)\n emit('canInstall', false)\n }\n }\n }\n\n const hint = (): void => {\n console.info('You accepted the install hint')\n emit('hint')\n }\n\n onMounted(() => {\n // eslint-disable-next-line no-prototype-builtins\n if (window.hasOwnProperty('BeforeInstallPromptEvent')) {\n useEventListener(window, 'beforeinstallprompt', (event) => {\n deferredPrompt.value = event as InstallPromptEvent\n\n emit('canInstall', true)\n event.preventDefault()\n })\n\n useEventListener('keyup', (event): void => {\n if (event.key === 'Escape') emit('close', false)\n })\n\n void getManifest()\n }\n })\n\n return (): VNode =>\n h('div', { id: 'install-modal-wrapper' }, [\n h('div', {\n class: 'background',\n onClick: () => {\n emit('close', false)\n },\n }),\n\n h('div', { class: 'install-modal' }, [\n h('div', { class: 'header' }, [\n // close button\n h(\n 'button',\n {\n 'type': 'button',\n 'class': 'close-button',\n 'aria-label': locale.value.close,\n 'onClick': () => {\n emit('close', false)\n },\n },\n h(CloseIcon),\n ),\n\n h('div', { class: 'logo' }, [\n manifest.value.icons\n ? h('img', {\n src: manifest.value.icons[0]?.src,\n alt: 'App Logo',\n })\n : null,\n h('div', { class: 'title' }, [\n h('h1', manifest.value.short_name || manifest.value.name),\n h('p', { class: 'desc' }, locale.value.explain),\n ]),\n ]),\n ]),\n\n h('div', { class: 'content' }, [\n h('div', { class: 'highlight' }, [\n manifest.value.features\n ? h('div', { class: 'feature-wrapper' }, [\n h('h3', locale.value.feature),\n h(\n 'ul',\n manifest.value.features.map((feature) =>\n h('li', feature),\n ),\n ),\n ])\n : null,\n\n manifest.value.screenshots\n ? h('div', { class: 'screenshot-wrapper' }, [\n h(\n 'button',\n {\n 'type': 'button',\n 'aria-label': locale.value.prevImage,\n 'onClick': scrollToLeft,\n },\n h(ArrowLeftIcon),\n ),\n h('section', { class: 'screenshot' }, [\n manifest.value.screenshots.map((screenshot) =>\n h(\n 'div',\n h('img', {\n src: screenshot.src,\n alt: 'App Screenshot',\n }),\n ),\n ),\n ]),\n h(\n 'button',\n {\n 'type': 'button',\n 'aria-label': locale.value.nextImage,\n 'onClick': scrollToRight,\n },\n h(ArrowRightIcon),\n ),\n ])\n : null,\n ]),\n\n h('div', { class: 'description' }, [\n h('h3', locale.value.desc),\n h('p', manifest.value.description),\n ]),\n ]),\n\n props.useHint\n ? h('div', { class: 'ios-text', onClick: hint }, [\n h('p', locale.value.iOSInstall),\n h('button', { type: 'button', class: 'success' }, 'Got it!'),\n ])\n : h('div', { class: 'button-wrapper' }, [\n h(\n 'button',\n { type: 'button', class: 'install-button', onClick: install },\n [locale.value.install, h('span', manifest.value.short_name)],\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'cancel-button',\n onClick: () => {\n emit('close', false)\n },\n },\n locale.value.cancel,\n ),\n ]),\n ]),\n ])\n },\n})\n","import { useLocaleConfig } from '@vuepress/helper/client'\nimport { useToggle } from '@vueuse/core'\nimport type { PropType, VNode } from 'vue'\nimport { computed, defineComponent, h, onMounted, ref } from 'vue'\nimport type { ManifestExternalApplicationResource } from '../../shared/index.js'\nimport type { PwaPluginLocaleConfig } from '../types.js'\nimport { PwaInstallModal } from './PwaInstallModal.js'\n\nimport '../styles/modal.css'\n\ninterface ModernNavigator extends Navigator {\n // Nonstandard Api\n getInstalledRelatedApps: () => Promise<ManifestExternalApplicationResource[]>\n}\n\ninterface SafariNavigator extends Navigator {\n // Available on Apple’s iOS Safari only.\n standalone: boolean\n}\n\nexport const PwaInstall = defineComponent({\n name: 'PwaInstall',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n },\n\n setup(props) {\n const locale = useLocaleConfig(props.locales)\n const [isOpen, toggleIsOpen] = useToggle(false)\n\n const canInstall = ref(false)\n const hasRelatedApps = ref(false)\n const isIOS = ref(false)\n const isSafari = ref(false)\n const hinted = ref(false)\n\n const useHint = computed(\n () => isIOS.value && isSafari.value && !hinted.value,\n )\n\n const showInstall = computed(\n () => (hasRelatedApps.value && canInstall.value) || useHint.value,\n )\n\n const getInstallStatus = (): boolean => {\n if ((navigator as SafariNavigator).standalone)\n return (navigator as SafariNavigator).standalone\n\n return matchMedia('(display-mode: standalone)').matches\n }\n\n const hint = (): void => {\n toggleIsOpen(false)\n hinted.value = true\n // do not notify again\n localStorage.setItem('iOS-pwa-hint', 'hinted')\n }\n\n onMounted(() => {\n if (getInstallStatus()) {\n const { userAgent } = navigator\n\n // handle iOS specifically\n isIOS.value =\n // regular iPhone\n userAgent.includes('iPhone') ||\n // regular iPad\n userAgent.includes('iPad') ||\n // iPad pro\n Boolean(\n userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints &&\n navigator.maxTouchPoints > 2,\n )\n\n isSafari.value =\n navigator.userAgent.includes('Safari') &&\n !userAgent.includes('Chrome')\n\n hinted.value = Boolean(localStorage.getItem('iOS-pwa-hint'))\n }\n\n if ('getInstalledRelatedApps' in (navigator as ModernNavigator))\n void (navigator as ModernNavigator)\n .getInstalledRelatedApps()\n .then((result) => {\n hasRelatedApps.value = result.length > 0\n })\n })\n\n return (): VNode =>\n h('div', { id: 'pwa-install' }, [\n showInstall.value\n ? h(\n 'button',\n {\n type: 'button',\n class: 'modal-button',\n onClick: () => {\n toggleIsOpen(true)\n },\n },\n locale.value.install,\n )\n : null,\n h(PwaInstallModal, {\n style: {\n display: isOpen.value ? 'block' : 'none',\n },\n locales: props.locales,\n useHint: useHint.value,\n onCanInstall: (value: boolean) => {\n canInstall.value = value\n },\n onHint: () => {\n hint()\n },\n onClose: () => toggleIsOpen(false),\n }),\n ])\n },\n})\n"],"names":["PwaInstallModal","defineComponent","props","emit","locale","useLocaleConfig","manifest","shallowRef","deferredPrompt","getManifest","manifestContent","data","withBase","scrollToLeft","screenshotsDiv","scrollToRight","install","hint","onMounted","useEventListener","event","h","CloseIcon","feature","ArrowLeftIcon","screenshot","ArrowRightIcon","PwaInstall","isOpen","toggleIsOpen","useToggle","canInstall","ref","hasRelatedApps","isIOS","isSafari","hinted","useHint","computed","showInstall","getInstallStatus","userAgent","result","value"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import * as vue from 'vue';
2
+ import { PropType, VNode, SlotsType } from 'vue';
3
+ import { P as PwaPluginLocaleConfig } from '../types-B0Ty8tPv.js';
4
+ import '@vuepress/helper/client';
5
+
6
+ declare const PwaReadyPopup: vue.DefineComponent<vue.ExtractPropTypes<{
7
+ /** locale data */
8
+ locales: {
9
+ type: PropType<PwaPluginLocaleConfig>;
10
+ required: true;
11
+ };
12
+ }>, () => VNode, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
13
+ /** locale data */
14
+ locales: {
15
+ type: PropType<PwaPluginLocaleConfig>;
16
+ required: true;
17
+ };
18
+ }>> & Readonly<{}>, {}, SlotsType<{
19
+ default?: (props: {
20
+ isReady: boolean;
21
+ reload: () => void;
22
+ }) => VNode | VNode[] | null;
23
+ }>, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
24
+
25
+ export { PwaReadyPopup };
@@ -0,0 +1,2 @@
1
+ import"@vuepress/helper/client";import"vue";import"../icons-DQk7h1-3.js";import"../styles/popup.css";import{P}from"../PwaReadyPopup-x_4DCmI1.js";import"../usePwaEvent-CUDY9qle.js";export{P as PwaReadyPopup};
2
+ //# sourceMappingURL=PwaReadyPopup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PwaReadyPopup.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,22 @@
1
- export * from './usePwaEvent.js';
2
- export * from './useSkipWaiting.js';
1
+ import { Emitter } from 'mitt';
2
+ import { InjectionKey } from 'vue';
3
+
4
+ declare const setupPwa: (serviceWorkerPath: string, shouldForceUpdate?: boolean) => void;
5
+
6
+ declare const setupViewPoint: () => void;
7
+
8
+ type PwaEvent = Emitter<{
9
+ ready: ServiceWorkerRegistration;
10
+ registered: ServiceWorkerRegistration;
11
+ cached: ServiceWorkerRegistration;
12
+ updatefound: ServiceWorkerRegistration;
13
+ updated: ServiceWorkerRegistration;
14
+ offline: void;
15
+ error: Error;
16
+ }>;
17
+ declare const pwaEventSymbol: InjectionKey<PwaEvent>;
18
+ declare const usePwaEvent: () => PwaEvent;
19
+
20
+ declare const useRegisterSW: (serviceWorkerPath: string, event: PwaEvent) => Promise<void>;
21
+
22
+ export { type PwaEvent, pwaEventSymbol, setupPwa, setupViewPoint, usePwaEvent, useRegisterSW };
@@ -1,2 +1,2 @@
1
- export * from './usePwaEvent.js';
2
- export * from './useSkipWaiting.js';
1
+ import{s as p,a as r,u as i}from"../index-DYf0Bvv5.js";import{p as u,u as w}from"../usePwaEvent-CUDY9qle.js";import"mitt";import"vue";import"vuepress/client";export{u as pwaEventSymbol,p as setupPwa,r as setupViewPoint,w as usePwaEvent,i as useRegisterSW};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{h as a}from"vue";const c=({name:o="",color:n="currentColor"},{slots:r})=>a("svg",{xmlns:"http://www.w3.org/2000/svg",class:["icon",`${o}-icon`],viewBox:"0 0 1024 1024",fill:n,"aria-label":`${o} icon`},r.default());c.displayName="SVGWrapper";const l=()=>a(c,{name:"arrow-left"},()=>a("path",{d:"M802.8 448h-428l166-158.8c23.8-25 23.8-65.4 0-90.4s-62.4-25-86.4 0L178 466.8c-12 11.6-18 27.4-18 44.8v0.8c0 17.4 6 33.2 18 44.8l276.2 268c24 25 62.6 25 86.4 0 23.8-25 23.8-65.4 0-90.4l-166-158.8h428c33.8 0 61.2-28.6 61.2-64 0.2-36-27.2-64-61-64z"}));l.displayName="ArrowLeftIcon";const s=()=>a(c,{name:"arrow-right"},()=>a("path",{d:"M569.8 825.2l276.2-268c12-11.6 18-27.4 18-44.8v-0.8c0-17.4-6-33.2-18-44.8l-276.2-268c-24-25-62.6-25-86.4 0-23.8 25-23.8 65.4 0 90.4l166 158.8h-428c-34 0-61.4 28.6-61.4 64 0 36 27.4 64 61.2 64h428l-166 158.8c-23.8 25-23.8 65.4 0 90.4 24 25 62.6 25 86.6 0z"}));s.displayName="ArrowRightIcon";const t=()=>a(c,{name:"close"},()=>a("path",{d:"M589.654 511.965 1007.212 84.22a49.777 49.777 0 0 0-.73-70.02 49.046 49.046 0 0 0-69.687.665L519.967 441.946 85.882 14.2a49.08 49.08 0 0 0-69.687.664 49.777 49.777 0 0 0 .664 70.019l433.454 427.082L16.859 939.048a49.777 49.777 0 0 0-.664 70.019 49.013 49.013 0 0 0 69.687.663l434.085-427.746 416.828 427.083A49.013 49.013 0 0 0 972.037 1024a48.416 48.416 0 0 0 34.512-14.27 49.777 49.777 0 0 0 .73-70.019z"}));t.displayName="CloseIcon";const e=()=>a(c,{name:"update"},()=>a("path",{d:"M949.949 146.25v255.826c0 21.981-13.989 35.97-35.97 35.97H658.154c-13.988 0-25.983-7.992-33.973-21.981-5.997-13.989-4-27.977 7.991-39.97l79.942-77.946c-55.954-51.973-121.918-77.955-199.863-77.955-37.975 0-75.95 8.002-113.924 21.99-37.975 15.985-67.948 37.976-91.934 63.957-25.982 23.987-47.973 53.96-63.957 91.934-29.983 73.955-29.983 153.895 0 227.85 15.984 37.976 37.975 67.947 63.957 91.934 23.986 25.982 53.959 47.973 91.934 63.956 37.974 13.989 75.95 21.991 113.924 21.991 45.967 0 87.942-9.998 127.913-29.982 41.976-17.99 75.951-45.967 101.931-83.943 7.993-4 11.994-5.995 13.989-5.995 5.997 0 9.998 1.994 13.988 5.995l77.958 77.946c3.989 4 5.986 7.993 5.986 11.994 0 1.994-1.996 5.995-3.99 11.994-43.973 51.962-93.941 91.934-151.9 117.914-53.958 25.983-115.92 39.972-185.874 39.972-61.961 0-119.921-11.984-169.89-33.973-57.96-25.985-105.923-57.963-139.896-93.943-35.98-33.972-67.958-81.936-93.94-139.897-45.967-101.93-45.967-237.846 0-339.777 25.982-57.96 57.96-105.923 93.94-139.896 33.973-35.98 81.936-67.958 139.896-93.94 49.968-21.99 107.928-33.974 169.89-33.974 55.963 0 109.923 9.988 161.885 29.973 53.97 21.99 101.933 51.963 139.908 89.938l73.954-73.944c9.987-9.998 23.987-13.988 39.971-8.002 13.988 8.002 21.98 19.995 21.98 33.984z"}));e.displayName="UpdateIcon";export{l as A,t as C,e as U,s as a};
2
+ //# sourceMappingURL=icons-DQk7h1-3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons-DQk7h1-3.js","sources":["../../src/client/components/icons.ts"],"sourcesContent":["import type { FunctionalComponent, VNode } from 'vue'\nimport { h } from 'vue'\n\ninterface SVGWrapperProps {\n name?: string\n color?: string\n}\n\nconst SVGWrapper: FunctionalComponent<\n SVGWrapperProps,\n Record<never, never>,\n { default: () => VNode | VNode[] }\n> = ({ name = '', color = 'currentColor' }, { slots }) =>\n h(\n 'svg',\n {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'class': ['icon', `${name}-icon`],\n 'viewBox': '0 0 1024 1024',\n 'fill': color,\n 'aria-label': `${name} icon`,\n },\n slots.default(),\n )\n\nSVGWrapper.displayName = 'SVGWrapper'\n\nexport const ArrowLeftIcon: FunctionalComponent = () =>\n h(SVGWrapper, { name: 'arrow-left' }, () =>\n h('path', {\n d: 'M802.8 448h-428l166-158.8c23.8-25 23.8-65.4 0-90.4s-62.4-25-86.4 0L178 466.8c-12 11.6-18 27.4-18 44.8v0.8c0 17.4 6 33.2 18 44.8l276.2 268c24 25 62.6 25 86.4 0 23.8-25 23.8-65.4 0-90.4l-166-158.8h428c33.8 0 61.2-28.6 61.2-64 0.2-36-27.2-64-61-64z',\n }),\n )\n\nArrowLeftIcon.displayName = 'ArrowLeftIcon'\n\nexport const ArrowRightIcon: FunctionalComponent = () =>\n h(SVGWrapper, { name: 'arrow-right' }, () =>\n h('path', {\n d: 'M569.8 825.2l276.2-268c12-11.6 18-27.4 18-44.8v-0.8c0-17.4-6-33.2-18-44.8l-276.2-268c-24-25-62.6-25-86.4 0-23.8 25-23.8 65.4 0 90.4l166 158.8h-428c-34 0-61.4 28.6-61.4 64 0 36 27.4 64 61.2 64h428l-166 158.8c-23.8 25-23.8 65.4 0 90.4 24 25 62.6 25 86.6 0z',\n }),\n )\n\nArrowRightIcon.displayName = 'ArrowRightIcon'\n\nexport const CloseIcon: FunctionalComponent = () =>\n h(SVGWrapper, { name: 'close' }, () =>\n h('path', {\n d: 'M589.654 511.965 1007.212 84.22a49.777 49.777 0 0 0-.73-70.02 49.046 49.046 0 0 0-69.687.665L519.967 441.946 85.882 14.2a49.08 49.08 0 0 0-69.687.664 49.777 49.777 0 0 0 .664 70.019l433.454 427.082L16.859 939.048a49.777 49.777 0 0 0-.664 70.019 49.013 49.013 0 0 0 69.687.663l434.085-427.746 416.828 427.083A49.013 49.013 0 0 0 972.037 1024a48.416 48.416 0 0 0 34.512-14.27 49.777 49.777 0 0 0 .73-70.019z',\n }),\n )\n\nCloseIcon.displayName = 'CloseIcon'\n\nexport const UpdateIcon: FunctionalComponent = () =>\n h(SVGWrapper, { name: 'update' }, () =>\n h('path', {\n d: 'M949.949 146.25v255.826c0 21.981-13.989 35.97-35.97 35.97H658.154c-13.988 0-25.983-7.992-33.973-21.981-5.997-13.989-4-27.977 7.991-39.97l79.942-77.946c-55.954-51.973-121.918-77.955-199.863-77.955-37.975 0-75.95 8.002-113.924 21.99-37.975 15.985-67.948 37.976-91.934 63.957-25.982 23.987-47.973 53.96-63.957 91.934-29.983 73.955-29.983 153.895 0 227.85 15.984 37.976 37.975 67.947 63.957 91.934 23.986 25.982 53.959 47.973 91.934 63.956 37.974 13.989 75.95 21.991 113.924 21.991 45.967 0 87.942-9.998 127.913-29.982 41.976-17.99 75.951-45.967 101.931-83.943 7.993-4 11.994-5.995 13.989-5.995 5.997 0 9.998 1.994 13.988 5.995l77.958 77.946c3.989 4 5.986 7.993 5.986 11.994 0 1.994-1.996 5.995-3.99 11.994-43.973 51.962-93.941 91.934-151.9 117.914-53.958 25.983-115.92 39.972-185.874 39.972-61.961 0-119.921-11.984-169.89-33.973-57.96-25.985-105.923-57.963-139.896-93.943-35.98-33.972-67.958-81.936-93.94-139.897-45.967-101.93-45.967-237.846 0-339.777 25.982-57.96 57.96-105.923 93.94-139.896 33.973-35.98 81.936-67.958 139.896-93.94 49.968-21.99 107.928-33.974 169.89-33.974 55.963 0 109.923 9.988 161.885 29.973 53.97 21.99 101.933 51.963 139.908 89.938l73.954-73.944c9.987-9.998 23.987-13.988 39.971-8.002 13.988 8.002 21.98 19.995 21.98 33.984z',\n }),\n )\n\nUpdateIcon.displayName = 'UpdateIcon'\n"],"names":["SVGWrapper","name","color","slots","h","ArrowLeftIcon","ArrowRightIcon","CloseIcon","UpdateIcon"],"mappings":"wBAQA,MAAMA,EAIF,CAAC,CAAE,KAAAC,EAAO,GAAI,MAAAC,EAAQ,cAAe,EAAG,CAAE,MAAAC,CAAM,IAClDC,EACE,MACA,CACE,MAAS,6BACT,MAAS,CAAC,OAAQ,GAAGH,CAAI,OAAO,EAChC,QAAW,gBACX,KAAQC,EACR,aAAc,GAAGD,CAAI,OACvB,EACAE,EAAM,QAAA,CACR,EAEFH,EAAW,YAAc,aAElB,MAAMK,EAAqC,IAChDD,EAAEJ,EAAY,CAAE,KAAM,YAAa,EAAG,IACpCI,EAAE,OAAQ,CACR,EAAG,uPACL,CAAC,CACH,EAEFC,EAAc,YAAc,gBAErB,MAAMC,EAAsC,IACjDF,EAAEJ,EAAY,CAAE,KAAM,aAAc,EAAG,IACrCI,EAAE,OAAQ,CACR,EAAG,gQACL,CAAC,CACH,EAEFE,EAAe,YAAc,iBAEhB,MAAAC,EAAiC,IAC5CH,EAAEJ,EAAY,CAAE,KAAM,OAAQ,EAAG,IAC/BI,EAAE,OAAQ,CACR,EAAG,uZACL,CAAC,CACH,EAEFG,EAAU,YAAc,YAEX,MAAAC,EAAkC,IAC7CJ,EAAEJ,EAAY,CAAE,KAAM,QAAS,EAAG,IAChCI,EAAE,OAAQ,CACR,EAAG,+tCACL,CAAC,CACH,EAEFI,EAAW,YAAc"}
@@ -0,0 +1,2 @@
1
+ import d from"mitt";import{provide as l,onMounted as i}from"vue";import{p as m}from"./usePwaEvent-CUDY9qle.js";import{withBase as u}from"vuepress/client";const n=()=>{navigator.serviceWorker.getRegistration().then(r=>{r?.active&&r.addEventListener("updatefound",()=>{window.location.reload(!0)})})},c=async(r,t={},e=!0)=>{const{register:a}=await import("register-service-worker");a(r,{ready(o){e&&console.info("[Service Worker]: active"),t.ready?.(o)},registered(o){e&&console.log("[Service Worker]: registered"),t.registered?.(o)},cached(o){e&&console.log("[Service Worker]: cached"),t.cached?.(o)},async updatefound(o){await navigator.serviceWorker.getRegistration()&&(e&&console.log("[Service Worker]: update found"),t.updatefound?.(o))},updated(o){e&&console.log("[Service Worker]: updated"),t.updated?.(o)},offline(){e&&console.log("[Service Worker]: offline"),t.offline?.()},error(o){e&&console.error("[Service Worker]: ",o),t.error?.(o)}})},s=async(r,t)=>c(u(r),{ready(e){t.emit("ready",e)},registered(e){t.emit("registered",e)},cached(e){t.emit("cached",e)},updatefound(e){t.emit("updatefound",e)},updated(e){const a="service-worker-version",o=Number(localStorage.getItem(a)||0);localStorage.setItem(a,(o+1).toString()),localStorage.removeItem("manifest"),t.emit("updated",e)},offline(){t.emit("offline")},error(e){t.emit("error",e)}}),v=(r,t=!1)=>{if(__VUEPRESS_SSR__)return;const e=d();l(m,e),i(async()=>{if(__VUEPRESS_DEV__||!("serviceWorker"in navigator))return;let a=!1;navigator.serviceWorker.controller&&navigator.serviceWorker.addEventListener("controllerchange",()=>{a||(a=!0,window.location.reload())}),t&&n(),await s(r,e)})},f=()=>{i(()=>{if(window.matchMedia("(display-mode: standalone)").matches){const r=document.head.querySelector('meta[name="viewport"]');if(r){r.setAttribute("content","width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover");return}const t=document.createElement("meta");t.name="viewport",t.content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover",document.head.appendChild(t)}})};export{f as a,n as f,c as r,v as s,s as u};
2
+ //# sourceMappingURL=index-DYf0Bvv5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DYf0Bvv5.js","sources":["../../src/client/utils/forceUpdate.ts","../../src/client/utils/registerSW.ts","../../src/client/composables/useRegisterSW.ts","../../src/client/composables/setupPwa.ts","../../src/client/composables/setupViewPoint.ts"],"sourcesContent":["/**\n * Force update page content\n *\n * 强制更新页面内容\n */\nexport const forceUpdate = (): void => {\n void navigator.serviceWorker.getRegistration().then((registration) => {\n // Check whether a valid service worker is active\n if (registration?.active)\n registration.addEventListener('updatefound', () => {\n // force refresh\n // @ts-expect-error: A non-standard API\n window.location.reload(true)\n })\n })\n}\n","/* eslint-disable no-console */\nimport type { Hooks } from 'register-service-worker'\n\n/**\n * Register serviceWorker under `serviceWorkerPath`\n *\n * @param serviceWorkerPath Service Worker path\n * @param hooks Service worker hooks\n * @param showStatus Whether to show status in console\n *\n * 在 `serviceWorkerPath` 下注册 Service Worker\n *\n * @param serviceWorkerPath Service Worker 路径\n * @param hooks Service Worker 钩子\n * @param showStatus 是否在控制台显示状态\n */\nexport const registerSW = async (\n serviceWorkerPath: string,\n hooks: Hooks = {},\n showStatus = true,\n): Promise<void> => {\n const { register } = await import(\n /* webpackChunkName: \"register-service-worker\" */ 'register-service-worker'\n )\n\n // Register service worker\n register(serviceWorkerPath, {\n ready(registration) {\n if (showStatus) console.info('[Service Worker]: active')\n hooks.ready?.(registration)\n },\n\n registered(registration) {\n if (showStatus) console.log('[Service Worker]: registered')\n hooks.registered?.(registration)\n },\n\n cached(registration) {\n if (showStatus) console.log('[Service Worker]: cached')\n hooks.cached?.(registration)\n },\n\n async updatefound(registration) {\n if (await navigator.serviceWorker.getRegistration()) {\n if (showStatus) console.log('[Service Worker]: update found')\n hooks.updatefound?.(registration)\n }\n },\n\n updated(registration) {\n if (showStatus) console.log('[Service Worker]: updated')\n hooks.updated?.(registration)\n },\n\n offline() {\n if (showStatus) console.log('[Service Worker]: offline')\n hooks.offline?.()\n },\n\n error(err) {\n if (showStatus) console.error('[Service Worker]: ', err)\n hooks.error?.(err)\n },\n })\n}\n","import { withBase } from 'vuepress/client'\nimport { registerSW } from '../utils/index.js'\nimport type { PwaEvent } from './usePwaEvent.js'\n\nexport const useRegisterSW = async (\n serviceWorkerPath: string,\n event: PwaEvent,\n): Promise<void> =>\n registerSW(withBase(serviceWorkerPath), {\n ready(registration) {\n event.emit('ready', registration)\n },\n\n registered(registration) {\n event.emit('registered', registration)\n },\n\n cached(registration) {\n event.emit('cached', registration)\n },\n\n updatefound(registration) {\n event.emit('updatefound', registration)\n },\n\n updated(registration) {\n const key = 'service-worker-version'\n const version = Number(localStorage.getItem(key) || 0)\n\n localStorage.setItem(key, (version + 1).toString())\n localStorage.removeItem('manifest')\n\n event.emit('updated', registration)\n },\n\n offline() {\n event.emit('offline')\n },\n\n error(err) {\n event.emit('error', err)\n },\n })\n","import mitt from 'mitt'\nimport { onMounted, provide } from 'vue'\nimport { forceUpdate } from '../utils/index.js'\nimport { pwaEventSymbol } from './usePwaEvent.js'\nimport { useRegisterSW } from './useRegisterSW.js'\nimport type { PwaEvent } from './index.js'\n\nexport const setupPwa = (\n serviceWorkerPath: string,\n shouldForceUpdate = false,\n): void => {\n if (__VUEPRESS_SSR__) return\n\n // Create event emitter and provide it\n const event: PwaEvent = mitt()\n\n provide(pwaEventSymbol, event)\n\n onMounted(async () => {\n if (__VUEPRESS_DEV__ || !('serviceWorker' in navigator)) return\n\n let refreshing = false\n\n // Only listen controllerchange event when a serviceWorker is active\n if (navigator.serviceWorker.controller)\n navigator.serviceWorker.addEventListener('controllerchange', () => {\n if (refreshing) return\n\n refreshing = true\n window.location.reload()\n })\n\n if (shouldForceUpdate) forceUpdate()\n\n await useRegisterSW(serviceWorkerPath, event)\n })\n}\n","import { onMounted } from 'vue'\n\nexport const setupViewPoint = (): void => {\n onMounted(() => {\n const isStandAlone = window.matchMedia('(display-mode: standalone)').matches\n\n if (isStandAlone) {\n const head = document.head.querySelector('meta[name=\"viewport\"]')\n\n if (head) {\n head.setAttribute(\n 'content',\n 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover',\n )\n return\n }\n\n const viewportMeta = document.createElement('meta')\n\n viewportMeta.name = 'viewport'\n viewportMeta.content =\n 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover'\n\n document.head.appendChild(viewportMeta)\n }\n })\n}\n"],"names":["forceUpdate","registration","registerSW","serviceWorkerPath","hooks","showStatus","register","err","useRegisterSW","event","withBase","key","version","setupPwa","shouldForceUpdate","mitt","provide","pwaEventSymbol","onMounted","refreshing","setupViewPoint","head","viewportMeta"],"mappings":"0JAKa,MAAAA,EAAc,IAAY,CAChC,UAAU,cAAc,kBAAkB,KAAMC,GAAiB,CAEhEA,GAAc,QAChBA,EAAa,iBAAiB,cAAe,IAAM,CAGjD,OAAO,SAAS,OAAO,EAAI,CAC7B,CAAC,CACL,CAAC,CACH,ECCaC,EAAa,MACxBC,EACAC,EAAe,GACfC,EAAa,KACK,CAClB,KAAM,CAAE,SAAAC,CAAS,EAAI,KAAM,QACyB,yBACpD,EAGAA,EAASH,EAAmB,CAC1B,MAAMF,EAAc,CACdI,GAAY,QAAQ,KAAK,0BAA0B,EACvDD,EAAM,QAAQH,CAAY,CAC5B,EAEA,WAAWA,EAAc,CACnBI,GAAY,QAAQ,IAAI,8BAA8B,EAC1DD,EAAM,aAAaH,CAAY,CACjC,EAEA,OAAOA,EAAc,CACfI,GAAY,QAAQ,IAAI,0BAA0B,EACtDD,EAAM,SAASH,CAAY,CAC7B,EAEA,MAAM,YAAYA,EAAc,CAC1B,MAAM,UAAU,cAAc,gBAC5BI,IAAAA,GAAY,QAAQ,IAAI,gCAAgC,EAC5DD,EAAM,cAAcH,CAAY,EAEpC,EAEA,QAAQA,EAAc,CAChBI,GAAY,QAAQ,IAAI,2BAA2B,EACvDD,EAAM,UAAUH,CAAY,CAC9B,EAEA,SAAU,CACJI,GAAY,QAAQ,IAAI,2BAA2B,EACvDD,EAAM,UACR,CAAA,EAEA,MAAMG,EAAK,CACLF,GAAY,QAAQ,MAAM,qBAAsBE,CAAG,EACvDH,EAAM,QAAQG,CAAG,CACnB,CACF,CAAC,CACH,EC5DaC,EAAgB,MAC3BL,EACAM,IAEAP,EAAWQ,EAASP,CAAiB,EAAG,CACtC,MAAMF,EAAc,CAClBQ,EAAM,KAAK,QAASR,CAAY,CAClC,EAEA,WAAWA,EAAc,CACvBQ,EAAM,KAAK,aAAcR,CAAY,CACvC,EAEA,OAAOA,EAAc,CACnBQ,EAAM,KAAK,SAAUR,CAAY,CACnC,EAEA,YAAYA,EAAc,CACxBQ,EAAM,KAAK,cAAeR,CAAY,CACxC,EAEA,QAAQA,EAAc,CACpB,MAAMU,EAAM,yBACNC,EAAU,OAAO,aAAa,QAAQD,CAAG,GAAK,CAAC,EAErD,aAAa,QAAQA,GAAMC,EAAU,GAAG,SAAU,CAAA,EAClD,aAAa,WAAW,UAAU,EAElCH,EAAM,KAAK,UAAWR,CAAY,CACpC,EAEA,SAAU,CACRQ,EAAM,KAAK,SAAS,CACtB,EAEA,MAAMF,EAAK,CACTE,EAAM,KAAK,QAASF,CAAG,CACzB,CACF,CAAC,ECnCUM,EAAW,CACtBV,EACAW,EAAoB,KACX,CACT,GAAI,iBAAkB,OAGtB,MAAML,EAAkBM,IAExBC,EAAQC,EAAgBR,CAAK,EAE7BS,EAAU,SAAY,CACpB,GAAI,kBAAoB,EAAE,kBAAmB,WAAY,OAEzD,IAAIC,EAAa,GAGb,UAAU,cAAc,YAC1B,UAAU,cAAc,iBAAiB,mBAAoB,IAAM,CAC7DA,IAEJA,EAAa,GACb,OAAO,SAAS,SAClB,CAAC,EAECL,GAAmBd,IAEvB,MAAMQ,EAAcL,EAAmBM,CAAK,CAC9C,CAAC,CACH,EClCaW,EAAiB,IAAY,CACxCF,EAAU,IAAM,CAGd,GAFqB,OAAO,WAAW,4BAA4B,EAAE,QAEnD,CAChB,MAAMG,EAAO,SAAS,KAAK,cAAc,uBAAuB,EAEhE,GAAIA,EAAM,CACRA,EAAK,aACH,UACA,gGACF,EACA,MACF,CAEA,MAAMC,EAAe,SAAS,cAAc,MAAM,EAElDA,EAAa,KAAO,WACpBA,EAAa,QACX,iGAEF,SAAS,KAAK,YAAYA,CAAY,CACxC,CACF,CAAC,CACH"}
@@ -1 +1,51 @@
1
- export * from './composables/index.js';
1
+ export { PwaInstall } from './components/PwaInstall.js';
2
+ export { PwaFoundPopup } from './components/PwaFoundPopup.js';
3
+ export { PwaReadyPopup } from './components/PwaReadyPopup.js';
4
+ export { PwaEvent, pwaEventSymbol, setupPwa, setupViewPoint, usePwaEvent, useRegisterSW } from './composables/index.js';
5
+ import { Hooks } from 'register-service-worker';
6
+ import 'vue';
7
+ import './types-B0Ty8tPv.js';
8
+ import '@vuepress/helper/client';
9
+ import 'mitt';
10
+
11
+ /**
12
+ * Force update page content
13
+ *
14
+ * 强制更新页面内容
15
+ */
16
+ declare const forceUpdate: () => void;
17
+
18
+ /**
19
+ * Register serviceWorker under `serviceWorkerPath`
20
+ *
21
+ * @param serviceWorkerPath Service Worker path
22
+ * @param hooks Service worker hooks
23
+ * @param showStatus Whether to show status in console
24
+ *
25
+ * 在 `serviceWorkerPath` 下注册 Service Worker
26
+ *
27
+ * @param serviceWorkerPath Service Worker 路径
28
+ * @param hooks Service Worker 钩子
29
+ * @param showStatus 是否在控制台显示状态
30
+ */
31
+ declare const registerSW: (serviceWorkerPath: string, hooks?: Hooks, showStatus?: boolean) => Promise<void>;
32
+
33
+ /**
34
+ * Call `skipWaiting()` inside current waiting worker
35
+ *
36
+ * 在当前等待中的 Service Worker 中调用 `skipWaiting()`
37
+ */
38
+ declare const skipWaiting: (registration: ServiceWorkerRegistration) => void;
39
+
40
+ /**
41
+ * Call `unregister()` inside current active worker
42
+ *
43
+ * @returns `true` if unregister success, `false` if unregister failed
44
+ *
45
+ * 在当前激活的 Service Worker 中调用 `unregister()`
46
+ *
47
+ * @returns `true` 表示注销成功,`false` 表示注销失败
48
+ */
49
+ declare const unregisterSW: () => Promise<boolean>;
50
+
51
+ export { forceUpdate, registerSW, skipWaiting, unregisterSW };
@@ -1 +1,2 @@
1
- export * from './composables/index.js';
1
+ import{PwaInstall as c}from"./components/PwaInstall.js";import{PwaFoundPopup as l}from"./components/PwaFoundPopup.js";import{P as W,s as v}from"./PwaReadyPopup-x_4DCmI1.js";import{f as d,r as h,s as k,a as S,u as R}from"./index-DYf0Bvv5.js";import{p as A,u as E}from"./usePwaEvent-CUDY9qle.js";import"@vuepress/helper/client";import"@vueuse/core";import"vue";import"vuepress/client";import"./icons-DQk7h1-3.js";import"./styles/modal.css";import"./styles/popup.css";import"mitt";const t=()=>navigator.serviceWorker.getRegistration().then(e=>e?e.unregister().then(r=>(r&&console.log("[PWA] Current service worker unregistered"),r)):!1).catch(e=>(console.log("[PWA] Unregister current service worker failed with error:",e),!1));export{l as PwaFoundPopup,c as PwaInstall,W as PwaReadyPopup,d as forceUpdate,A as pwaEventSymbol,h as registerSW,k as setupPwa,S as setupViewPoint,v as skipWaiting,t as unregisterSW,E as usePwaEvent,R as useRegisterSW};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/client/utils/unregisterSW.ts"],"sourcesContent":["/* eslint-disable no-console */\n/**\n * Call `unregister()` inside current active worker\n *\n * @returns `true` if unregister success, `false` if unregister failed\n *\n * 在当前激活的 Service Worker 中调用 `unregister()`\n *\n * @returns `true` 表示注销成功,`false` 表示注销失败\n */\nexport const unregisterSW = (): Promise<boolean> =>\n navigator.serviceWorker\n .getRegistration()\n .then((registration) => {\n if (registration)\n return registration.unregister().then((found) => {\n if (found) console.log('[PWA] Current service worker unregistered')\n\n return found\n })\n\n return false\n })\n .catch((error: unknown) => {\n console.log(\n '[PWA] Unregister current service worker failed with error:',\n error,\n )\n\n return false\n })\n"],"names":["unregisterSW","registration","found","error"],"mappings":"8dAUO,MAAMA,EAAe,IAC1B,UAAU,cACP,gBAAgB,EAChB,KAAMC,GACDA,EACKA,EAAa,WAAW,EAAE,KAAMC,IACjCA,GAAO,QAAQ,IAAI,2CAA2C,EAE3DA,EACR,EAEI,EACR,EACA,MAAOC,IACN,QAAQ,IACN,6DACAA,CACF,EAEO,GACR"}
@@ -0,0 +1 @@
1
+ @keyframes pwa-opened{from{opacity:.4;transform:scale(0.8, 0.8)}to{opacity:1;transform:scale(1, 1)}}@keyframes pwa-mobile{from{opacity:.6}to{opacity:1}}@keyframes pwa-fade-in{from{opacity:.2}to{opacity:1}}.modal-button{position:fixed;right:1rem;bottom:1rem;z-index:50;padding:0 16px;border-width:0;border-radius:1.2rem;background:var(--pwa-c-accent-bg);color:var(--pwa-c-accent-text);outline:none;font-weight:600;line-height:2.2rem;cursor:pointer;transition:background .3s,color .3s}@media(display-mode: standalone){.modal-button{display:none}}@media print{.modal-button{display:none}}.modal-button:hover,.modal-button:active{background:var(--pwa-c-accent-hover)}#install-modal-wrapper{position:fixed;top:0;left:0;z-index:997;display:flex;align-items:center;justify-content:center;overflow:auto;width:100vw;height:100vh}@media print{#install-modal-wrapper{display:none}}#install-modal-wrapper button{border-width:0;background:rgba(0,0,0,0);cursor:pointer}#install-modal-wrapper .background{position:fixed;inset:0;z-index:998;backdrop-filter:blur(10px);animation:.25s pwa-fade-in}#install-modal-wrapper .install-modal{position:absolute;z-index:999;display:flex;flex-direction:column;max-width:56em;border-radius:10px;background:var(--pwa-c-bg);transition:background .3s;animation:.15s pwa-opened}@media(max-width: 1280px){#install-modal-wrapper .install-modal{width:92%;animation:.25s pwa-mobile}}@media(max-width: 419px){#install-modal-wrapper .install-modal{overflow-y:auto;max-height:80%}#install-modal-wrapper .install-modal::-webkit-scrollbar{display:none}}#install-modal-wrapper .header{margin:40px 40px 32px}@media(max-width: 959px){#install-modal-wrapper .header{margin-bottom:24px}}@media(max-width: 719px){#install-modal-wrapper .header{margin:20px}}#install-modal-wrapper .header .close-button{float:right;border-width:0;background:rgba(0,0,0,0);color:var(--pwa-c-text);cursor:pointer;transition:color .3s ease}#install-modal-wrapper .header .close-button:hover,#install-modal-wrapper .header .close-button:focus{color:var(--pwa-c-text-mute)}#install-modal-wrapper .header .logo{display:flex}#install-modal-wrapper .header h1{margin-top:0;margin-bottom:7px;color:var(--pwa-c-text-mute);font-size:34px}@media(max-width: 959px){#install-modal-wrapper .header h1{margin-bottom:0}}@media(max-width: 419px){#install-modal-wrapper .header h1{font-size:26px}}#install-modal-wrapper .header img{width:122px;height:122px;margin-inline-end:24px;padding:12px;border-radius:24px}@media(max-width: 959px){#install-modal-wrapper .header img{width:60px;height:60px}}@media(max-width: 719px){#install-modal-wrapper .header img{margin-inline-end:12px;padding:8px}}@media(max-width: 419px){#install-modal-wrapper .header img{width:40px;height:40px;padding:6px}}#install-modal-wrapper .header .desc{overflow:hidden;max-width:40em;color:#888;font-size:14px;text-overflow:ellipsis;white-space:pre-wrap}@media(max-width: 959px){#install-modal-wrapper .header .desc{display:none}}#install-modal-wrapper .content{flex:1;margin:0 40px;color:var(--pwa-c-text)}@media(max-width: 719px){#install-modal-wrapper .content{margin:0 20px}}#install-modal-wrapper .content h3{margin-bottom:12px;font-size:22px}#install-modal-wrapper .content p{font-size:14px}#install-modal-wrapper .highlight{display:flex;align-items:center;justify-content:space-around;margin-inline-end:20px}@media(max-width: 719px){#install-modal-wrapper .highlight{flex-direction:column;align-items:flex-start;margin-inline-end:0}}#install-modal-wrapper .highlight h3{margin-top:0;font-weight:600;font-size:22px;line-height:225%}@media(max-width: 419px){#install-modal-wrapper .highlight h3{margin-bottom:0;font-size:18px}}#install-modal-wrapper .feature-wrapper{overflow:hidden;padding-inline-end:2em}#install-modal-wrapper .feature-wrapper ul{margin-block-start:12px;padding-inline-start:22px}@media(max-width: 419px){#install-modal-wrapper .feature-wrapper ul{margin-top:0}}#install-modal-wrapper .feature-wrapper li{color:var(--pwa-c-text-mute);font-weight:600;font-size:16px;line-height:29px;transition:color .3s}#install-modal-wrapper .screenshot-wrapper{display:flex;max-width:30em;max-height:220px}@media(max-width: 719px){#install-modal-wrapper .screenshot-wrapper{width:100%}}#install-modal-wrapper .screenshot-wrapper button{width:4em;border-width:0;background:rgba(0,0,0,0);cursor:pointer;transition:background .3s}#install-modal-wrapper .screenshot-wrapper button:hover,#install-modal-wrapper .screenshot-wrapper button:focus{background:#bbb}#install-modal-wrapper .screenshot-wrapper button svg{width:28px;fill:#6b6969}#install-modal-wrapper .screenshot{display:flex;flex-flow:column wrap;overflow-x:auto;width:22em;max-height:220px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch}@media(max-width: 1280px){#install-modal-wrapper .screenshot{justify-content:center}}#install-modal-wrapper .screenshot::-webkit-scrollbar{display:none}#install-modal-wrapper .screenshot div{display:flex;align-items:center;justify-content:center;width:100%;height:14em;background:#efefef;scroll-snap-align:start}#install-modal-wrapper .screenshot img{object-fit:contain;height:100%}@media(max-width: 719px){#install-modal-wrapper .screenshot img{height:180px}}#install-modal-wrapper .description{margin-bottom:3em}#install-modal-wrapper .button-wrapper{width:100%;padding:1rem 0;text-align:end}@media(max-width: 719px){#install-modal-wrapper .button-wrapper{text-align:center}}#install-modal-wrapper .install-button,#install-modal-wrapper .cancel-button{display:inline-block;flex:0 0 auto;min-width:80px;margin:.5rem 1rem;padding:.5rem 1rem;border-radius:20px;background:rgba(0,0,0,0);font-weight:600;font-size:14px;cursor:pointer}#install-modal-wrapper .install-button{background:var(--pwa-c-accent-bg);color:var(--pwa-c-accent-text);transition:color .3s}#install-modal-wrapper .install-button:hover,#install-modal-wrapper .install-button:focus{background:var(--pwa-c-accent-hover)}@media(max-width: 419px){#install-modal-wrapper .install-button span{display:none}}#install-modal-wrapper .cancel-button{background:var(--pwa-c-control);color:var(--pwa-c-text)}#install-modal-wrapper .cancel-button:hover,#install-modal-wrapper .cancel-button:focus{background:var(--pwa-c-control-hover)}#install-modal-wrapper .ios-text{position:fixed;bottom:0;box-sizing:border-box;width:92%;margin:2em auto;padding:.5em 2em;border-radius:8px;background:var(--pwa-c-bg);box-shadow:0 2px 12px 0 var(--pwa-c-shadow);font-weight:bold;font-size:14px;text-align:center;transition:background .3s,box-shadow .3s}#install-modal-wrapper .ios-text::after{content:" ";position:absolute;bottom:-1em;left:calc(50% - .8em);width:0;height:0;border-top:1em solid var(--pwa-c-bg);border-right:.8em solid rgba(0,0,0,0);border-left:.8em solid rgba(0,0,0,0);transition:border-color .3s}#install-modal-wrapper .ios-text p{margin:0 0 .5em}#install-modal-wrapper .ios-text .success{margin-bottom:.5em;padding:.5em 1em;border:none;border-radius:1em;background:#07c160;color:var(--pwa-c-bg);cursor:pointer;transition:color .3s}/*# sourceMappingURL=modal.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/client/styles/modal.scss"],"names":[],"mappings":"AAAA,sBACE,KACE,WACA,0BAGF,GACE,UACA,uBAIJ,sBACE,KACE,WAGF,GACE,WAIJ,uBACE,KACE,WAGF,GACE,WAIJ,cACE,eACA,WACA,YACA,WAEA,eACA,eACA,qBAEA,kCACA,+BACA,aAEA,gBACA,mBAEA,eAEA,WACE,yBAGF,iCAvBF,cAwBI,cAGF,aA3BF,cA4BI,cAGF,yCAEE,qCAIJ,uBACE,eACA,MACA,OACA,YAEA,aACA,mBACA,uBAEA,cAEA,YACA,aAEA,aAfF,uBAgBI,cAGF,8BACE,eACA,yBACA,eAGF,mCACE,eACA,QACA,YAEA,2BAEA,2BAGF,sCACE,kBACA,YAEA,aACA,sBAEA,eACA,mBAEA,2BAEA,0BAEA,0BAEA,0BAhBF,sCAiBI,UACA,2BAGF,yBArBF,sCAsBI,gBACA,eAEA,yDACE,cAKN,+BACE,sBAEA,yBAHF,+BAII,oBAGF,yBAPF,+BAQI,aAGF,6CACE,YAEA,eAEA,yBACA,wBAEA,eAEA,0BAEA,sGAEE,6BAIJ,qCACE,aAGF,kCACE,aACA,kBACA,6BACA,eAEA,yBANF,kCAOI,iBAGF,yBAVF,kCAWI,gBAIJ,mCACE,YACA,aACA,uBACA,aACA,mBAEA,yBAPF,mCAQI,WACA,aAGF,yBAZF,mCAaI,uBACA,aAGF,yBAjBF,mCAkBI,WACA,YACA,aAIJ,qCACE,gBAEA,eAEA,WAEA,eACA,uBACA,qBAEA,yBAXF,qCAYI,cAKN,gCACE,OACA,cACA,wBAEA,yBALF,gCAMI,eAGF,mCACE,mBACA,eAGF,kCACE,eAIJ,kCACE,aACA,mBACA,6BACA,uBAEA,yBANF,kCAOI,sBACA,uBACA,qBAGF,qCACE,aACA,gBACA,eACA,iBAEA,yBANF,qCAOI,gBACA,gBAKN,wCACE,gBACA,uBAEA,2CACE,wBACA,0BAEA,yBAJF,2CAKI,cAIJ,2CACE,6BAEA,gBACA,eACA,iBAEA,qBAIJ,2CACE,aACA,eACA,iBAEA,yBALF,2CAMI,YAGF,kDACE,UACA,eAEA,yBAEA,eAEA,0BAEA,gHAEE,gBAGF,sDACE,WACA,aAKN,mCACE,aACA,sBAEA,gBAEA,WACA,iBAEA,6BAEA,iCAEA,0BAbF,mCAcI,wBAGF,sDACE,aAGF,uCACE,aACA,mBACA,uBAEA,WACA,YAEA,mBAEA,wBAGF,uCACE,mBACA,YAEA,yBAJF,uCAKI,cAKN,oCACE,kBAGF,uCACE,WACA,eACA,eAEA,yBALF,uCAMI,mBAIJ,6EAEE,qBACA,cAEA,eACA,kBACA,mBACA,mBAEA,yBAEA,gBACA,eAEA,eAGF,uCACE,kCACA,+BACA,qBAEA,0FAEE,qCAIA,yBADF,4CAEI,cAKN,sCACE,gCACA,wBAEA,wFAEE,sCAIJ,iCACE,eACA,SAEA,sBACA,UACA,gBACA,iBACA,kBAEA,2BACA,4CAEA,iBACA,eACA,kBAEA,WACE,8BAGF,wCACE,YAEA,kBACA,YACA,sBAEA,QACA,SACA,qCACA,sCACA,qCAEA,4BAGF,mCACE,gBAGF,0CACE,mBACA,iBACA,YACA,kBAEA,mBACA,sBAEA,eAEA","file":"modal.css","sourcesContent":["@keyframes pwa-opened {\n from {\n opacity: 0.4;\n transform: scale(0.8, 0.8);\n }\n\n to {\n opacity: 1;\n transform: scale(1, 1);\n }\n}\n\n@keyframes pwa-mobile {\n from {\n opacity: 0.6;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes pwa-fade-in {\n from {\n opacity: 0.2;\n }\n\n to {\n opacity: 1;\n }\n}\n\n.modal-button {\n position: fixed;\n right: 1rem;\n bottom: 1rem;\n z-index: 50;\n\n padding: 0 16px;\n border-width: 0;\n border-radius: 1.2rem;\n\n background: var(--pwa-c-accent-bg);\n color: var(--pwa-c-accent-text);\n outline: none;\n\n font-weight: 600;\n line-height: 2.2rem;\n\n cursor: pointer;\n\n transition:\n background 0.3s,\n color 0.3s;\n\n @media (display-mode: standalone) {\n display: none;\n }\n\n @media print {\n display: none;\n }\n\n &:hover,\n &:active {\n background: var(--pwa-c-accent-hover);\n }\n}\n\n#install-modal-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 997;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n overflow: auto;\n\n width: 100vw;\n height: 100vh;\n\n @media print {\n display: none;\n }\n\n button {\n border-width: 0;\n background: transparent;\n cursor: pointer;\n }\n\n .background {\n position: fixed;\n inset: 0;\n z-index: 998;\n\n backdrop-filter: blur(10px);\n\n animation: 0.25s pwa-fade-in;\n }\n\n .install-modal {\n position: absolute;\n z-index: 999;\n\n display: flex;\n flex-direction: column;\n\n max-width: 56em;\n border-radius: 10px;\n\n background: var(--pwa-c-bg);\n\n transition: background 0.3s;\n\n animation: 0.15s pwa-opened;\n\n @media (max-width: 1280px) {\n width: 92%;\n animation: 0.25s pwa-mobile;\n }\n\n @media (max-width: 419px) {\n overflow-y: auto;\n max-height: 80%;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n }\n\n .header {\n margin: 40px 40px 32px;\n\n @media (max-width: 959px) {\n margin-bottom: 24px;\n }\n\n @media (max-width: 719px) {\n margin: 20px;\n }\n\n .close-button {\n float: right;\n\n border-width: 0;\n\n background: transparent;\n color: var(--pwa-c-text);\n\n cursor: pointer;\n\n transition: color 0.3s ease;\n\n &:hover,\n &:focus {\n color: var(--pwa-c-text-mute);\n }\n }\n\n .logo {\n display: flex;\n }\n\n h1 {\n margin-top: 0;\n margin-bottom: 7px;\n color: var(--pwa-c-text-mute);\n font-size: 34px;\n\n @media (max-width: 959px) {\n margin-bottom: 0;\n }\n\n @media (max-width: 419px) {\n font-size: 26px;\n }\n }\n\n img {\n width: 122px;\n height: 122px;\n margin-inline-end: 24px;\n padding: 12px;\n border-radius: 24px;\n\n @media (max-width: 959px) {\n width: 60px;\n height: 60px;\n }\n\n @media (max-width: 719px) {\n margin-inline-end: 12px;\n padding: 8px;\n }\n\n @media (max-width: 419px) {\n width: 40px;\n height: 40px;\n padding: 6px;\n }\n }\n\n .desc {\n overflow: hidden;\n\n max-width: 40em;\n\n color: #888;\n\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: pre-wrap;\n\n @media (max-width: 959px) {\n display: none;\n }\n }\n }\n\n .content {\n flex: 1;\n margin: 0 40px;\n color: var(--pwa-c-text);\n\n @media (max-width: 719px) {\n margin: 0 20px;\n }\n\n h3 {\n margin-bottom: 12px;\n font-size: 22px;\n }\n\n p {\n font-size: 14px;\n }\n }\n\n .highlight {\n display: flex;\n align-items: center;\n justify-content: space-around;\n margin-inline-end: 20px;\n\n @media (max-width: 719px) {\n flex-direction: column;\n align-items: flex-start;\n margin-inline-end: 0;\n }\n\n h3 {\n margin-top: 0;\n font-weight: 600;\n font-size: 22px;\n line-height: 225%;\n\n @media (max-width: 419px) {\n margin-bottom: 0;\n font-size: 18px;\n }\n }\n }\n\n .feature-wrapper {\n overflow: hidden;\n padding-inline-end: 2em;\n\n ul {\n margin-block-start: 12px;\n padding-inline-start: 22px;\n\n @media (max-width: 419px) {\n margin-top: 0;\n }\n }\n\n li {\n color: var(--pwa-c-text-mute);\n\n font-weight: 600;\n font-size: 16px;\n line-height: 29px;\n\n transition: color 0.3s;\n }\n }\n\n .screenshot-wrapper {\n display: flex;\n max-width: 30em;\n max-height: 220px;\n\n @media (max-width: 719px) {\n width: 100%;\n }\n\n button {\n width: 4em;\n border-width: 0;\n\n background: transparent;\n\n cursor: pointer;\n\n transition: background 0.3s;\n\n &:hover,\n &:focus {\n background: #bbb;\n }\n\n svg {\n width: 28px;\n fill: #6b6969;\n }\n }\n }\n\n .screenshot {\n display: flex;\n flex-flow: column wrap;\n\n overflow-x: auto;\n\n width: 22em;\n max-height: 220px;\n\n scroll-snap-type: x mandatory;\n\n -webkit-overflow-scrolling: touch;\n\n @media (max-width: 1280px) {\n justify-content: center;\n }\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n div {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 100%;\n height: 14em;\n\n background: #efefef;\n\n scroll-snap-align: start;\n }\n\n img {\n object-fit: contain;\n height: 100%;\n\n @media (max-width: 719px) {\n height: 180px;\n }\n }\n }\n\n .description {\n margin-bottom: 3em;\n }\n\n .button-wrapper {\n width: 100%;\n padding: 1rem 0;\n text-align: end;\n\n @media (max-width: 719px) {\n text-align: center;\n }\n }\n\n .install-button,\n .cancel-button {\n display: inline-block;\n flex: 0 0 auto;\n\n min-width: 80px;\n margin: 0.5rem 1rem;\n padding: 0.5rem 1rem;\n border-radius: 20px;\n\n background: transparent;\n\n font-weight: 600;\n font-size: 14px;\n\n cursor: pointer;\n }\n\n .install-button {\n background: var(--pwa-c-accent-bg);\n color: var(--pwa-c-accent-text);\n transition: color 0.3s;\n\n &:hover,\n &:focus {\n background: var(--pwa-c-accent-hover);\n }\n\n span {\n @media (max-width: 419px) {\n display: none;\n }\n }\n }\n\n .cancel-button {\n background: var(--pwa-c-control);\n color: var(--pwa-c-text);\n\n &:hover,\n &:focus {\n background: var(--pwa-c-control-hover);\n }\n }\n\n .ios-text {\n position: fixed;\n bottom: 0;\n\n box-sizing: border-box;\n width: 92%;\n margin: 2em auto;\n padding: 0.5em 2em;\n border-radius: 8px;\n\n background: var(--pwa-c-bg);\n box-shadow: 0 2px 12px 0 var(--pwa-c-shadow);\n\n font-weight: bold;\n font-size: 14px;\n text-align: center;\n\n transition:\n background 0.3s,\n box-shadow 0.3s;\n\n &::after {\n content: ' ';\n\n position: absolute;\n bottom: -1em;\n left: calc(50% - 0.8em);\n\n width: 0;\n height: 0;\n border-top: 1em solid var(--pwa-c-bg);\n border-right: 0.8em solid transparent;\n border-left: 0.8em solid transparent;\n\n transition: border-color 0.3s;\n }\n\n p {\n margin: 0 0 0.5em;\n }\n\n .success {\n margin-bottom: 0.5em;\n padding: 0.5em 1em;\n border: none;\n border-radius: 1em;\n\n background: #07c160;\n color: var(--pwa-c-bg);\n\n cursor: pointer;\n\n transition: color 0.3s;\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ @keyframes rotate{0%{transform:rotate(0deg)}50%{transform:rotate(360deg)}100%{transform:rotate(360deg)}}.popup-enter-active,.popup-leave-active{transition:opacity .3s,transform .3s}.popup-enter-from,.popup-leave-to{opacity:0;transform:translate(0, 50%) scale(0.5)}.sw-hint-popup,.sw-update-popup{position:fixed;inset-inline-end:1rem;bottom:1rem;z-index:var(--pwa-z-index);padding:.5rem .75rem;border-width:0;border-radius:.5rem;background:var(--pwa-c-bg);color:var(--pwa-c-text);box-shadow:0 2px 12px 0 var(--pwa-c-shadow);font-size:1rem;line-height:1.5;cursor:pointer}@media print{.sw-hint-popup,.sw-update-popup{display:none}}.sw-hint-popup .icon-wrapper,.sw-update-popup .icon-wrapper{display:inline-block;vertical-align:middle;width:1.5rem;height:1.5rem;margin-inline-start:.4rem;border-radius:.75rem;background:var(--pwa-c-accent-bg)}.sw-hint-popup .icon-wrapper:hover,.sw-update-popup .icon-wrapper:hover{background:var(--pwa-c-accent-hover)}.sw-hint-popup .icon-wrapper svg,.sw-update-popup .icon-wrapper svg{width:1.2rem;height:1.2rem;margin:.15rem;color:var(--pwa-c-accent-text);animation:rotate 3s ease infinite}/*# sourceMappingURL=popup.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/client/styles/popup.scss"],"names":[],"mappings":"AAAA,kBACE,GACE,uBAGF,IACE,yBAGF,KACE,0BAIJ,wCAEE,WACE,0BAIJ,kCAEE,UACA,uCAGF,gCAEE,eACA,sBACA,YACA,2BAEA,qBACA,eACA,oBAEA,2BACA,wBACA,4CAEA,eACA,gBAEA,eAEA,aApBF,gCAqBI,cAGF,4DACE,qBACA,sBAEA,aACA,cACA,0BACA,qBAEA,kCAEA,wEACE,qCAGF,oEACE,aACA,cACA,cAEA,+BAEA","file":"popup.css","sourcesContent":["@keyframes rotate {\n 0% {\n transform: rotate(0deg);\n }\n\n 50% {\n transform: rotate(360deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.popup-enter-active,\n.popup-leave-active {\n transition:\n opacity 0.3s,\n transform 0.3s;\n}\n\n.popup-enter-from,\n.popup-leave-to {\n opacity: 0;\n transform: translate(0, 50%) scale(0.5);\n}\n\n.sw-hint-popup,\n.sw-update-popup {\n position: fixed;\n inset-inline-end: 1rem;\n bottom: 1rem;\n z-index: var(--pwa-z-index);\n\n padding: 0.5rem 0.75rem;\n border-width: 0;\n border-radius: 0.5rem;\n\n background: var(--pwa-c-bg);\n color: var(--pwa-c-text);\n box-shadow: 0 2px 12px 0 var(--pwa-c-shadow);\n\n font-size: 1rem;\n line-height: 1.5;\n\n cursor: pointer;\n\n @media print {\n display: none;\n }\n\n .icon-wrapper {\n display: inline-block;\n vertical-align: middle;\n\n width: 1.5rem;\n height: 1.5rem;\n margin-inline-start: 0.4rem;\n border-radius: 0.75rem;\n\n background: var(--pwa-c-accent-bg);\n\n &:hover {\n background: var(--pwa-c-accent-hover);\n }\n\n svg {\n width: 1.2rem;\n height: 1.2rem;\n margin: 0.15rem;\n\n color: var(--pwa-c-accent-text);\n\n animation: rotate 3s ease infinite;\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ :root{--pwa-z-index: 10;--pwa-c-bg: var(--vp-c-bg-elv);--pwa-c-text: var(--vp-c-text);--pwa-c-shadow: var(--vp-c-shadow);--pwa-c-accent-bg: var(--vp-c-accent-bg);--pwa-c-accent-hover: var(--vp-c-accent-hover);--pwa-c-accent-text: var(--vp-c-accent-text);--pwa-c-control: var(--vp-c-control);--pwa-c-control-hover: var(--vp-c-control-hover);--pwa-c-text-mute: var(--vp-c-text-mute)}/*# sourceMappingURL=vars.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/client/styles/vars.css"],"names":[],"mappings":"AAAA,MACE,kBACA,+BACA,+BACA,mCACA,yCACA,+CACA,6CACA,qCACA,iDACA","file":"vars.css","sourcesContent":[":root {\n --pwa-z-index: 10;\n --pwa-c-bg: var(--vp-c-bg-elv);\n --pwa-c-text: var(--vp-c-text);\n --pwa-c-shadow: var(--vp-c-shadow);\n --pwa-c-accent-bg: var(--vp-c-accent-bg);\n --pwa-c-accent-hover: var(--vp-c-accent-hover);\n --pwa-c-accent-text: var(--vp-c-accent-text);\n --pwa-c-control: var(--vp-c-control);\n --pwa-c-control-hover: var(--vp-c-control-hover);\n --pwa-c-text-mute: var(--vp-c-text-mute);\n}\n"]}
@@ -0,0 +1,74 @@
1
+ import { ExactLocaleConfig } from '@vuepress/helper/client';
2
+
3
+ interface PwaPluginLocaleData {
4
+ /**
5
+ * Install button text
6
+ *
7
+ * 安装按钮文字
8
+ */
9
+ install: string;
10
+ /**
11
+ * iOS install hint text
12
+ *
13
+ * iOS 安装文字
14
+ */
15
+ iOSInstall: string;
16
+ /**
17
+ * Cancel button text
18
+ *
19
+ * 取消按钮文字
20
+ */
21
+ cancel: string;
22
+ /**
23
+ * Close button text
24
+ *
25
+ * 关闭按钮文字
26
+ */
27
+ close: string;
28
+ /**
29
+ * Previous image text
30
+ *
31
+ * 上一张图片文字
32
+ */
33
+ prevImage: string;
34
+ /**
35
+ * Next image text
36
+ *
37
+ * 下一张图片文字
38
+ */
39
+ nextImage: string;
40
+ /**
41
+ * Install explain text
42
+ *
43
+ * 安装解释
44
+ */
45
+ explain: string;
46
+ /**
47
+ * Description label text
48
+ *
49
+ * 描述标签文字
50
+ */
51
+ desc: string;
52
+ /**
53
+ * Feature label text
54
+ *
55
+ * 特性标签文字
56
+ */
57
+ feature: string;
58
+ /**
59
+ * Update hint text
60
+ *
61
+ * 提示有更新文字
62
+ */
63
+ hint: string;
64
+ /**
65
+ * Update available text
66
+ *
67
+ * 更新可用文字
68
+ */
69
+ update: string;
70
+ }
71
+
72
+ type PwaPluginLocaleConfig = ExactLocaleConfig<PwaPluginLocaleData>;
73
+
74
+ export type { PwaPluginLocaleConfig as P };
@@ -0,0 +1,2 @@
1
+ import{inject as o}from"vue";const t=Symbol(__VUEPRESS_DEV__?"PwaEvent":""),r=()=>{const e=o(t);if(!e)throw new Error("usePwaEvent() is called without provider.");return e};export{t as p,r as u};
2
+ //# sourceMappingURL=usePwaEvent-CUDY9qle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePwaEvent-CUDY9qle.js","sources":["../../src/client/composables/usePwaEvent.ts"],"sourcesContent":["import type { Emitter } from 'mitt'\nimport type { InjectionKey } from 'vue'\nimport { inject } from 'vue'\n\ndeclare const __VUEPRESS_DEV__: boolean\n\nexport type PwaEvent = Emitter<{\n ready: ServiceWorkerRegistration\n registered: ServiceWorkerRegistration\n cached: ServiceWorkerRegistration\n updatefound: ServiceWorkerRegistration\n updated: ServiceWorkerRegistration\n offline: void\n error: Error\n}>\n\nexport const pwaEventSymbol: InjectionKey<PwaEvent> = Symbol(\n __VUEPRESS_DEV__ ? 'PwaEvent' : '',\n)\n\nexport const usePwaEvent = (): PwaEvent => {\n const pwaEvent = inject(pwaEventSymbol)\n\n if (!pwaEvent) throw new Error('usePwaEvent() is called without provider.')\n\n return pwaEvent\n}\n"],"names":["pwaEventSymbol","usePwaEvent","pwaEvent","inject"],"mappings":"6BAgBa,MAAAA,EAAyC,OACpD,iBAAmB,WAAa,EAClC,EAEaC,EAAc,IAAgB,CACzC,MAAMC,EAAWC,EAAOH,CAAc,EAEtC,GAAI,CAACE,EAAU,MAAM,IAAI,MAAM,2CAA2C,EAE1E,OAAOA,CACT"}