@metricinsights/pp-dev 0.18.3 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +178 -0
- package/README.md +222 -250
- package/dist/CHANGELOG.md +178 -0
- package/dist/README.md +222 -250
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/helpers.js +1 -1
- package/dist/cjs/helpers.js.map +1 -1
- package/dist/cjs/index-MzGAxNTB.js +2 -0
- package/dist/cjs/index-MzGAxNTB.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/migrate-r2mXdGLZ.js +2 -0
- package/dist/cjs/migrate-r2mXdGLZ.js.map +1 -0
- package/dist/cjs/package.json +18 -16
- package/dist/cjs/plugin-34c8_AjI.js +2 -0
- package/dist/cjs/plugin-34c8_AjI.js.map +1 -0
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/version-plugin-BOFuJ-Rp.js +2 -0
- package/dist/cjs/version-plugin-BOFuJ-Rp.js.map +1 -0
- package/dist/client/client.css +1 -1
- package/dist/client/client.css.map +1 -1
- package/dist/client/client.js +168 -25
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.html +33 -16
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/helpers.js +1 -1
- package/dist/esm/helpers.js.map +1 -1
- package/dist/esm/index-C7dYPskY.js +2 -0
- package/dist/esm/index-C7dYPskY.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/migrate-BYuCtRbI.js +2 -0
- package/dist/esm/migrate-BYuCtRbI.js.map +1 -0
- package/dist/esm/package.json +18 -16
- package/dist/esm/plugin-Dvva-sxE.js +2 -0
- package/dist/esm/plugin-Dvva-sxE.js.map +1 -0
- package/dist/esm/plugin.js +1 -1
- package/dist/esm/version-plugin-vu8VWkws.js +2 -0
- package/dist/esm/version-plugin-vu8VWkws.js.map +1 -0
- package/dist/types/index.d.ts +103 -139
- package/package.json +37 -28
- package/dist/cjs/index-B1GblhLQ.js +0 -2
- package/dist/cjs/index-B1GblhLQ.js.map +0 -1
- package/dist/cjs/plugin-DY9gjLm8.js +0 -2
- package/dist/cjs/plugin-DY9gjLm8.js.map +0 -1
- package/dist/cjs/version-plugin-DSLhm6Q1.js +0 -2
- package/dist/cjs/version-plugin-DSLhm6Q1.js.map +0 -1
- package/dist/esm/index-basLGB1P.js +0 -2
- package/dist/esm/index-basLGB1P.js.map +0 -1
- package/dist/esm/plugin-B6DaUVqp.js +0 -2
- package/dist/esm/plugin-B6DaUVqp.js.map +0 -1
- package/dist/esm/version-plugin-DekxT1OJ.js +0 -2
- package/dist/esm/version-plugin-DekxT1OJ.js.map +0 -1
package/dist/client/client.css
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
.pp-dev-info-namespace{--pp-dev-info-color-primary: #007bff;--pp-dev-info-color-secondary: #6c757d;--pp-dev-info-color-success: #28a745;--pp-dev-info-color-info: #17a2b8;--pp-dev-info-color-warning: #ffc107;--pp-dev-info-color-danger: #dc3545;--pp-dev-info-color-light: #f8f9fa;--pp-dev-info-color-dark: #343a40;--pp-dev-info-color-white: #ffffff;--pp-dev-info-color-black: #000000}.pp-dev-info-namespace .pp-dev-info__popup{position:fixed;top:10px;right:10px;width:max-content;max-width:300px;height:max-content;max-height:max-content;background-color:var(--pp-dev-info-color-white);box-shadow:0 4px 6px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.08);border-radius:8px;display:flex;flex-direction:column;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);overflow:hidden;z-index:100001;border:1px solid var(--pp-dev-info-color-secondary);transform:translateX(0);opacity:1;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.pp-dev-info-namespace .pp-dev-info__popup.entering{transform:translateX(100%);opacity:0}.pp-dev-info-namespace .pp-dev-info__popup.exiting{transform:translateX(100%);opacity:0}.pp-dev-info-namespace .pp-dev-info__popup-progress{position:absolute;bottom:0;left:0;height:4px;background:linear-gradient(90deg, var(--pp-dev-info-color-primary), var(--pp-dev-info-color-info));width:100%;transform-origin:left;transition:width .1s linear;border-radius:0 0 0 8px}.pp-dev-info-namespace .pp-dev-info__popup-title{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;height:auto;min-height:30px;width:100%;box-sizing:border-box;border-bottom:1px solid var(--pp-dev-info-color-light);background-color:var(--pp-dev-info-color-secondary)}.pp-dev-info-namespace .pp-dev-info__popup-title-text{font-size:14px;font-weight:600;color:var(--pp-dev-info-color-white);line-height:1.4}.pp-dev-info-namespace .pp-dev-info__popup-title-close{cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--pp-dev-info-color-white);border-radius:4px;transition:background-color .2s ease}.pp-dev-info-namespace .pp-dev-info__popup-title-close:hover{background-color:hsla(0,0%,100%,.1)}.pp-dev-info-namespace .pp-dev-info__popup-title-close svg{transition:transform .2s ease}.pp-dev-info-namespace .pp-dev-info__popup-title-close:hover svg{transform:scale(1.1)}.pp-dev-info-namespace .pp-dev-info__popup-content{padding:12px 16px;overflow-y:auto;box-sizing:border-box;flex-grow:1;background-color:var(--pp-dev-info-color-white);width:100%;line-height:1.5;font-size:13px}.pp-dev-info-namespace .pp-dev-info__popup--success{border-color:var(--pp-dev-info-color-success);box-shadow:0 4px 6px rgba(40,167,69,.1),0 1px 3px rgba(40,167,69,.08)}.pp-dev-info-namespace .pp-dev-info__popup--success .pp-dev-info__popup-title{background-color:var(--pp-dev-info-color-success)}.pp-dev-info-namespace .pp-dev-info__popup--success .pp-dev-info__popup-content{color:var(--pp-dev-info-color-success)}.pp-dev-info-namespace .pp-dev-info__popup--success .pp-dev-info__popup-progress{background:linear-gradient(90deg, var(--pp-dev-info-color-success), #4caf50)}.pp-dev-info-namespace .pp-dev-info__popup--danger{border-color:var(--pp-dev-info-color-danger);box-shadow:0 4px 6px rgba(220,53,69,.1),0 1px 3px rgba(220,53,69,.08)}.pp-dev-info-namespace .pp-dev-info__popup--danger .pp-dev-info__popup-title{background-color:var(--pp-dev-info-color-danger)}.pp-dev-info-namespace .pp-dev-info__popup--danger .pp-dev-info__popup-content{color:var(--pp-dev-info-color-danger)}.pp-dev-info-namespace .pp-dev-info__popup--danger .pp-dev-info__popup-progress{background:linear-gradient(90deg, var(--pp-dev-info-color-danger), #f44336)}.pp-dev-info-namespace .pp-dev-info__popup--info{border-color:var(--pp-dev-info-color-info);box-shadow:0 4px 6px rgba(23,162,184,.1),0 1px 3px rgba(23,162,184,.08)}.pp-dev-info-namespace .pp-dev-info__popup--info .pp-dev-info__popup-title{background-color:var(--pp-dev-info-color-info)}.pp-dev-info-namespace .pp-dev-info__popup--info .pp-dev-info__popup-content{color:var(--pp-dev-info-color-info)}.pp-dev-info-namespace .pp-dev-info__popup--info .pp-dev-info__popup-progress{background:linear-gradient(90deg, var(--pp-dev-info-color-info), #2196f3)}.pp-dev-info-namespace .pp-dev-info__popup--warning{border-color:var(--pp-dev-info-color-warning);box-shadow:0 4px 6px rgba(255,193,7,.1),0 1px 3px rgba(255,193,7,.08)}.pp-dev-info-namespace .pp-dev-info__popup--warning .pp-dev-info__popup-title{background-color:var(--pp-dev-info-color-warning);color:var(--pp-dev-info-color-dark)}.pp-dev-info-namespace .pp-dev-info__popup--warning .pp-dev-info__popup-content{color:var(--pp-dev-info-color-warning)}.pp-dev-info-namespace .pp-dev-info__popup--warning .pp-dev-info__popup-progress{background:linear-gradient(90deg, var(--pp-dev-info-color-warning), #ff9800)}.pp-dev-info-namespace.pp-dev-info__confirm-overlay,.pp-dev-info-namespace .pp-dev-info__confirm-overlay{position:fixed;inset:0;z-index:100003;display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.35);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.pp-dev-info-namespace .pp-dev-info__confirm{width:min(500px,100vw - 32px);border-radius:10px;border:1px solid rgba(0,0,0,.15);background-color:var(--pp-dev-info-color-white);box-shadow:0 18px 40px rgba(0,0,0,.35),0 2px 6px rgba(0,0,0,.2);overflow:hidden}.pp-dev-info-namespace .pp-dev-info__confirm-title{padding:14px 16px;font-size:15px;font-weight:600;border-bottom:1px solid rgba(0,0,0,.08);color:var(--pp-dev-info-color-dark);background-color:rgba(0,0,0,.03)}.pp-dev-info-namespace .pp-dev-info__confirm-content{padding:16px;white-space:pre-wrap;color:var(--pp-dev-info-color-dark);font-size:13px;line-height:1.5}.pp-dev-info-namespace .pp-dev-info__confirm-actions{display:flex;justify-content:flex-end;gap:8px;padding:0 16px 16px}.pp-dev-info-namespace .pp-dev-info__confirm-btn{min-width:110px;padding:8px 12px;border-radius:6px;border:1px solid rgba(0,0,0,0);font-size:13px;font-weight:600;cursor:pointer;transition:all .2s ease}.pp-dev-info-namespace .pp-dev-info__confirm-btn--cancel{color:var(--pp-dev-info-color-dark);background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,.2)}.pp-dev-info-namespace .pp-dev-info__confirm-btn--confirm{color:var(--pp-dev-info-color-white);background-color:var(--pp-dev-info-color-primary)}.pp-dev-info-namespace .pp-dev-info__confirm-btn:hover{opacity:.9}.pp-dev-info-namespace.pp-dev-info,.pp-dev-info-namespace .pp-dev-info{position:fixed;z-index:100000;white-space:nowrap;width:fit-content;height:30px;top:calc(100% - 30px);right:0;text-align:center;padding:8px 12px;background-color:var(--pp-dev-info-color-white);border-radius:8px 0 0 0;color:var(--pp-dev-info-color-dark);box-shadow:0 -2px 4px rgba(0,0,0,.1);box-sizing:border-box;display:flex;align-items:center;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);overflow:visible;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.pp-dev-info-namespace.pp-dev-info *,.pp-dev-info-namespace .pp-dev-info *{color:var(--pp-dev-info-color-dark);font-family:sans-serif;font-size:13px;font-weight:300;line-height:1.5;letter-spacing:.00938em;text-decoration:none;text-transform:inherit;vertical-align:inherit;box-sizing:border-box;margin:0;padding:0;border:0;outline:0;background:0 0;list-style:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pp-dev-info-namespace.pp-dev-info__content,.pp-dev-info-namespace .pp-dev-info__content{display:flex;align-items:center;gap:0px}.pp-dev-info-namespace.pp-dev-info__section,.pp-dev-info-namespace .pp-dev-info__section{display:flex;align-items:center;position:relative;padding:0 8px}.pp-dev-info-namespace.pp-dev-info__section:not(:last-child)::after,.pp-dev-info-namespace .pp-dev-info__section:not(:last-child)::after{content:"";position:absolute;right:0;top:50%;transform:translateY(-50%);height:12px;width:1px;background-color:rgba(0,0,0,.15)}@media screen and (prefers-color-scheme: dark){.pp-dev-info-namespace.pp-dev-info__section:not(:last-child)::after,.pp-dev-info-namespace .pp-dev-info__section:not(:last-child)::after{background-color:hsla(0,0%,100%,.2)}}.pp-dev-info-namespace.pp-dev-info__section:first-child,.pp-dev-info-namespace .pp-dev-info__section:first-child{padding-left:0}.pp-dev-info-namespace.pp-dev-info__section:last-child,.pp-dev-info-namespace .pp-dev-info__section:last-child{padding-right:0}.pp-dev-info-namespace.pp-dev-info__item,.pp-dev-info-namespace .pp-dev-info__item{display:flex;align-items:center;gap:8px;font-size:13px;line-height:1.5}.pp-dev-info-namespace.pp-dev-info__label,.pp-dev-info-namespace .pp-dev-info__label{color:var(--pp-dev-info-color-secondary);font-weight:500}.pp-dev-info-namespace.pp-dev-info__value,.pp-dev-info-namespace .pp-dev-info__value{font-weight:600}.pp-dev-info-namespace.pp-dev-info__link,.pp-dev-info-namespace .pp-dev-info__link{color:var(--pp-dev-info-color-primary);text-decoration:none;transition:color .2s ease;display:flex;align-items:center;gap:4px}.pp-dev-info-namespace.pp-dev-info__link:hover,.pp-dev-info-namespace .pp-dev-info__link:hover{color:var(--pp-dev-info-color-primary);text-decoration:underline}.pp-dev-info-namespace.pp-dev-info .primary,.pp-dev-info-namespace .pp-dev-info .primary{color:var(--pp-dev-info-color-primary) !important}.pp-dev-info-namespace.pp-dev-info .success,.pp-dev-info-namespace .pp-dev-info .success{color:var(--pp-dev-info-color-success) !important}.pp-dev-info-namespace.pp-dev-info .info,.pp-dev-info-namespace .pp-dev-info .info{color:var(--pp-dev-info-color-info) !important}.pp-dev-info-namespace.pp-dev-info .warning,.pp-dev-info-namespace .pp-dev-info .warning{color:var(--pp-dev-info-color-warning) !important}.pp-dev-info-namespace.pp-dev-info .danger,.pp-dev-info-namespace .pp-dev-info .danger{color:var(--pp-dev-info-color-danger) !important}.pp-dev-info-namespace.pp-dev-info a,.pp-dev-info-namespace .pp-dev-info a{color:var(--pp-dev-info-color-primary);text-decoration:none;vertical-align:middle;line-height:1.5}.pp-dev-info-namespace.pp-dev-info a:hover,.pp-dev-info-namespace .pp-dev-info a:hover{text-decoration:none}.pp-dev-info-namespace.pp-dev-info a:active,.pp-dev-info-namespace.pp-dev-info a:hover,.pp-dev-info-namespace .pp-dev-info a:active,.pp-dev-info-namespace .pp-dev-info a:hover{outline:0}.pp-dev-info-namespace.pp-dev-info button,.pp-dev-info-namespace .pp-dev-info button{padding:1px;border:none;background:none;cursor:pointer;outline:none}.pp-dev-info-namespace.pp-dev-info .bold,.pp-dev-info-namespace.pp-dev-info .status-text,.pp-dev-info-namespace .pp-dev-info .bold,.pp-dev-info-namespace .pp-dev-info .status-text{font-weight:700}.pp-dev-info-namespace.pp-dev-info__wrap-btn,.pp-dev-info-namespace .pp-dev-info__wrap-btn{box-sizing:content-box;display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin-right:12px;padding:4px;cursor:pointer;border-radius:4px;transition:background-color .2s ease}.pp-dev-info-namespace.pp-dev-info__wrap-btn:hover,.pp-dev-info-namespace .pp-dev-info__wrap-btn:hover{background-color:rgba(0,0,0,.05);animation:arrowHover .8s linear infinite}.pp-dev-info-namespace.pp-dev-info__wrap-btn-arrow,.pp-dev-info-namespace .pp-dev-info__wrap-btn-arrow{width:16px;height:16px;fill:var(--pp-dev-info-color-dark);transition:transform .2s ease}.pp-dev-info-namespace.pp-dev-info.closed,.pp-dev-info-namespace .pp-dev-info.closed{transform:translateX(calc(100% - 40px));z-index:100002}.pp-dev-info-namespace.pp-dev-info.closed .pp-dev-info__wrap-btn:hover,.pp-dev-info-namespace .pp-dev-info.closed .pp-dev-info__wrap-btn:hover{animation:arrowHover 1.2s linear infinite}.pp-dev-info-namespace.pp-dev-info.closed .pp-dev-info__wrap-btn-arrow,.pp-dev-info-namespace .pp-dev-info.closed .pp-dev-info__wrap-btn-arrow{transform:rotate(180deg)}.pp-dev-info-namespace.pp-dev-info .sync-button,.pp-dev-info-namespace .pp-dev-info .sync-button{display:flex;align-items:center;justify-content:center;width:24px;height:26px;padding:4px;margin-left:12px;background-color:rgba(0,0,0,0);border:none;border-radius:4px;cursor:pointer;color:var(--pp-dev-info-color-primary);transition:all .2s ease;position:relative;overflow:hidden}.pp-dev-info-namespace.pp-dev-info .sync-button::before,.pp-dev-info-namespace .pp-dev-info .sync-button::before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;opacity:0;transition:opacity .2s ease;border-radius:4px}.pp-dev-info-namespace.pp-dev-info .sync-button svg,.pp-dev-info-namespace .pp-dev-info .sync-button svg{position:relative;z-index:1;transition:transform .3s ease}.pp-dev-info-namespace.pp-dev-info .sync-button:hover:not(.disabled),.pp-dev-info-namespace .pp-dev-info .sync-button:hover:not(.disabled){color:var(--pp-dev-info-color-primary)}.pp-dev-info-namespace.pp-dev-info .sync-button:hover:not(.disabled) svg,.pp-dev-info-namespace .pp-dev-info .sync-button:hover:not(.disabled) svg{transform:scale(1.1) rotate(45deg);transition:transform .2s ease}.pp-dev-info-namespace.pp-dev-info .sync-button:active:not(.disabled) svg,.pp-dev-info-namespace .pp-dev-info .sync-button:active:not(.disabled) svg{transform:scale(0.9) rotate(45deg)}.pp-dev-info-namespace.pp-dev-info .sync-button.disabled,.pp-dev-info-namespace .pp-dev-info .sync-button.disabled{opacity:.5;cursor:not-allowed;pointer-events:none;color:var(--pp-dev-info-color-secondary)}.pp-dev-info-namespace.pp-dev-info .sync-button.syncing svg,.pp-dev-info-namespace .pp-dev-info .sync-button.syncing svg{animation:rotate 1.5s linear infinite}@keyframes rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.pp-dev-info-namespace.pp-dev-info .margin-5,.pp-dev-info-namespace .pp-dev-info .margin-5{margin-right:5px}.pp-dev-info-namespace.pp-dev-info .margin-10,.pp-dev-info-namespace .pp-dev-info .margin-10{margin-right:10px}.pp-dev-info-namespace.pp-dev-info .custom-font,.pp-dev-info-namespace .pp-dev-info .custom-font{font-family:sans-serif;font-size:13px;font-weight:300;vertical-align:middle;line-height:1.5;color:var(--pp-dev-info-color-dark)}.pp-dev-info-namespace.pp-dev-info .custom-font:not(.not-colored) a,.pp-dev-info-namespace .pp-dev-info .custom-font:not(.not-colored) a{color:var(--pp-dev-info-color-primary) !important}@keyframes rotation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes arrowHover{0%{transform:translateX(2px)}50%{transform:translateX(-2px)}100%{transform:translateX(2px)}}@media screen and (prefers-color-scheme: dark){.pp-dev-info-namespace.pp-dev-info,.pp-dev-info-namespace .pp-dev-info{--pp-dev-info-color-primary: #007bff;--pp-dev-info-color-secondary: #a4abb6;--pp-dev-info-color-success: #56f000;--pp-dev-info-color-info: #2dccff;--pp-dev-info-color-warning: #ffb302;--pp-dev-info-color-danger: #ff3838;--pp-dev-info-color-light: #343a40;--pp-dev-info-color-dark: #f8f9fa;--pp-dev-info-color-white: #000000;--pp-dev-info-color-black: #ffffff}}
|
|
1
|
+
.pp-dev-info-namespace{--pp-dev-info-color-primary: #075b7e;--pp-dev-info-color-secondary: rgba(34, 34, 34, 0.64);--pp-dev-info-color-success: #077e45;--pp-dev-info-color-info: #17a2b8;--pp-dev-info-color-warning: #ffb000;--pp-dev-info-color-danger: #ac2b2b;--pp-dev-info-color-light: #f8f9fa;--pp-dev-info-color-dark: #343a40;--pp-dev-info-color-white: #ffffff;--pp-dev-info-color-black: #000000}.pp-dev-info-namespace .pp-dev-info__popup{position:fixed;top:10px;right:10px;width:280px;max-width:calc(100vw - 20px);height:auto;background-color:var(--pp-dev-info-color-white);box-shadow:0 2px 4px rgba(34,34,34,.2);border-radius:2px;display:flex;flex-direction:column;align-items:flex-end;gap:4px;padding:12px;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);overflow:hidden;z-index:100001;border-left:2px solid var(--pp-dev-info-color-primary);transform:translateX(0);opacity:1;box-sizing:border-box;--pp-dev-info-popup-accent: var(--pp-dev-info-color-primary)}.pp-dev-info-namespace .pp-dev-info__popup.entering{transform:translateX(calc(100% + 10px));opacity:0}.pp-dev-info-namespace .pp-dev-info__popup.exiting{transform:translateX(calc(100% + 10px));opacity:0}.pp-dev-info-namespace .pp-dev-info__popup-title{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;padding:0;min-height:0;width:100%;box-sizing:border-box;border-bottom:0;color:#040404}.pp-dev-info-namespace .pp-dev-info__popup-title-icon{display:flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;color:var(--pp-dev-info-popup-accent)}.pp-dev-info-namespace .pp-dev-info__popup-title-text{flex:1;color:#040404;font-size:12px;font-weight:600;line-height:18px;text-align:left;word-break:break-word}.pp-dev-info-namespace .pp-dev-info__popup-title-close{cursor:pointer;width:12px;height:12px;display:flex;align-items:center;justify-content:center;margin-top:2px;color:rgba(34,34,34,.64);border-radius:2px;transition:color .2s ease;flex-shrink:0}.pp-dev-info-namespace .pp-dev-info__popup-title-close:hover{color:var(--pp-dev-info-color-dark)}.pp-dev-info-namespace .pp-dev-info__popup-title-close svg{transition:transform .2s ease}.pp-dev-info-namespace .pp-dev-info__popup-content{margin-left:24px;padding:0;width:calc(100% - 24px);overflow-y:auto;box-sizing:border-box;flex-grow:0;background-color:rgba(0,0,0,0);color:rgba(34,34,34,.8);font-size:12px;font-weight:400;line-height:18px;text-align:left;word-break:break-word}.pp-dev-info-namespace .pp-dev-info__popup--success{--pp-dev-info-popup-accent: var(--pp-dev-info-color-success);border-left-color:var(--pp-dev-info-color-success)}.pp-dev-info-namespace .pp-dev-info__popup--danger{--pp-dev-info-popup-accent: var(--pp-dev-info-color-danger);border-left-color:var(--pp-dev-info-color-danger)}.pp-dev-info-namespace .pp-dev-info__popup--info{--pp-dev-info-popup-accent: var(--pp-dev-info-color-info);border-left-color:var(--pp-dev-info-color-info)}.pp-dev-info-namespace .pp-dev-info__popup--warning{--pp-dev-info-popup-accent: var(--pp-dev-info-color-warning);border-left-color:var(--pp-dev-info-color-warning)}.pp-dev-info-namespace.pp-dev-info__confirm-overlay,.pp-dev-info-namespace .pp-dev-info__confirm-overlay{position:fixed;inset:0;z-index:100003;display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.35);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.pp-dev-info-namespace .pp-dev-info__confirm{width:min(408px,100vw - 32px);border-radius:3px;border:1px solid rgba(0,0,0,.15);background-color:var(--pp-dev-info-color-white);box-shadow:0px 8px 32px 0px rgba(34,34,34,.4);overflow:hidden}.pp-dev-info-namespace .pp-dev-info__confirm-title{padding:14px 16px;font-size:15px;font-weight:600;border-bottom:1px solid rgba(0,0,0,.08);color:var(--pp-dev-info-color-dark);background-color:rgba(0,0,0,.03)}.pp-dev-info-namespace .pp-dev-info__confirm-content{padding:16px;white-space:pre-wrap;color:var(--pp-dev-info-color-dark);font-size:13px;line-height:1.5}.pp-dev-info-namespace .pp-dev-info__confirm-actions{display:flex;flex-direction:column;gap:8px;padding:0 16px 16px}.pp-dev-info-namespace .pp-dev-info__confirm-btn{width:100%;padding:8px 12px;border-radius:6px;border:1px solid rgba(0,0,0,0);font-size:13px;font-weight:600;cursor:pointer;transition:all .2s ease}.pp-dev-info-namespace .pp-dev-info__confirm-btn--cancel{color:var(--pp-dev-info-color-dark);background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,.2)}.pp-dev-info-namespace .pp-dev-info__confirm-btn--confirm{color:var(--pp-dev-info-color-white);background-color:var(--pp-dev-info-color-primary)}.pp-dev-info-namespace .pp-dev-info__confirm-btn:hover{opacity:.9}.pp-dev-info-namespace.pp-dev-info,.pp-dev-info-namespace .pp-dev-info{position:fixed;z-index:100000;white-space:nowrap;width:fit-content;height:32px;top:calc(100% - 32px);right:0;text-align:center;padding:2px;gap:8px;background-color:var(--pp-dev-info-color-white);border-radius:4px 0 0 0;border-bottom:1px solid rgba(34,34,34,.08);color:var(--pp-dev-info-color-dark);box-shadow:-2px -2px 8px 0px rgba(34,34,34,.08);box-sizing:border-box;display:flex;align-items:center;transition:all .3s cubic-bezier(0.4, 0, 0.2, 1);overflow:visible;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.pp-dev-info-namespace.pp-dev-info *,.pp-dev-info-namespace .pp-dev-info *{color:var(--pp-dev-info-color-dark);font-family:"Inter",sans-serif;font-size:12px;font-weight:400;line-height:18px;letter-spacing:0;text-decoration:none;text-transform:inherit;vertical-align:inherit;box-sizing:border-box;margin:0;padding:0;border:0;outline:0;background:0 0;list-style:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pp-dev-info-namespace.pp-dev-info__content,.pp-dev-info-namespace .pp-dev-info__content{display:flex;align-items:center;gap:0px}.pp-dev-info-namespace.pp-dev-info__section,.pp-dev-info-namespace .pp-dev-info__section{display:flex;align-items:center;position:relative;padding:0 8px}.pp-dev-info-namespace.pp-dev-info__section:not(:last-child)::after,.pp-dev-info-namespace .pp-dev-info__section:not(:last-child)::after{content:"";position:absolute;right:0;top:50%;transform:translateY(-50%);height:16px;width:1px;background-color:rgba(34,34,34,.24)}@media screen and (prefers-color-scheme: dark){.pp-dev-info-namespace.pp-dev-info__section:not(:last-child)::after,.pp-dev-info-namespace .pp-dev-info__section:not(:last-child)::after{background-color:hsla(0,0%,100%,.2)}}.pp-dev-info-namespace.pp-dev-info__section:first-child,.pp-dev-info-namespace .pp-dev-info__section:first-child{padding-left:0}.pp-dev-info-namespace.pp-dev-info__section:last-child,.pp-dev-info-namespace .pp-dev-info__section:last-child{padding-right:0}.pp-dev-info-namespace.pp-dev-info__item,.pp-dev-info-namespace .pp-dev-info__item{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:400;line-height:18px}.pp-dev-info-namespace.pp-dev-info__label,.pp-dev-info-namespace .pp-dev-info__label{color:var(--pp-dev-info-color-secondary);font-weight:400}.pp-dev-info-namespace.pp-dev-info__value,.pp-dev-info-namespace .pp-dev-info__value{font-weight:600}.pp-dev-info-namespace.pp-dev-info__link,.pp-dev-info-namespace .pp-dev-info__link{color:var(--pp-dev-info-color-primary);text-decoration:none;transition:color .2s ease;display:flex;align-items:center;gap:8px}.pp-dev-info-namespace.pp-dev-info__link:hover,.pp-dev-info-namespace .pp-dev-info__link:hover{color:var(--pp-dev-info-color-primary);text-decoration:underline}.pp-dev-info-namespace.pp-dev-info .primary,.pp-dev-info-namespace .pp-dev-info .primary{color:var(--pp-dev-info-color-primary) !important}.pp-dev-info-namespace.pp-dev-info .success,.pp-dev-info-namespace .pp-dev-info .success{color:var(--pp-dev-info-color-success) !important}.pp-dev-info-namespace.pp-dev-info .info,.pp-dev-info-namespace .pp-dev-info .info{color:var(--pp-dev-info-color-info) !important}.pp-dev-info-namespace.pp-dev-info .warning,.pp-dev-info-namespace .pp-dev-info .warning{color:var(--pp-dev-info-color-warning) !important}.pp-dev-info-namespace.pp-dev-info .danger,.pp-dev-info-namespace .pp-dev-info .danger{color:var(--pp-dev-info-color-danger) !important}.pp-dev-info-namespace.pp-dev-info a,.pp-dev-info-namespace .pp-dev-info a{color:var(--pp-dev-info-color-primary);text-decoration:none;vertical-align:middle;line-height:18px}.pp-dev-info-namespace.pp-dev-info a:hover,.pp-dev-info-namespace .pp-dev-info a:hover{text-decoration:none}.pp-dev-info-namespace.pp-dev-info a:active,.pp-dev-info-namespace.pp-dev-info a:hover,.pp-dev-info-namespace .pp-dev-info a:active,.pp-dev-info-namespace .pp-dev-info a:hover{outline:0}.pp-dev-info-namespace.pp-dev-info button,.pp-dev-info-namespace .pp-dev-info button{padding:1px;border:none;background:none;cursor:pointer;outline:none}.pp-dev-info-namespace.pp-dev-info .bold,.pp-dev-info-namespace.pp-dev-info .status-text,.pp-dev-info-namespace .pp-dev-info .bold,.pp-dev-info-namespace .pp-dev-info .status-text{font-weight:700}.pp-dev-info-namespace.pp-dev-info__wrap-btn,.pp-dev-info-namespace .pp-dev-info__wrap-btn{box-sizing:border-box;display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:6px;cursor:pointer;border-radius:3px;transition:background-color .2s ease}.pp-dev-info-namespace.pp-dev-info__wrap-btn:hover,.pp-dev-info-namespace .pp-dev-info__wrap-btn:hover{background-color:rgba(7,91,126,.06);animation:arrowHover .8s linear infinite}.pp-dev-info-namespace.pp-dev-info__wrap-btn-arrow,.pp-dev-info-namespace .pp-dev-info__wrap-btn-arrow{width:16px;height:16px;color:var(--pp-dev-info-color-dark);fill:none;transition:transform .2s ease}.pp-dev-info-namespace.pp-dev-info.closed,.pp-dev-info-namespace .pp-dev-info.closed{transform:translateX(calc(100% - 32px));z-index:100002}.pp-dev-info-namespace.pp-dev-info.closed .pp-dev-info__wrap-btn:hover,.pp-dev-info-namespace .pp-dev-info.closed .pp-dev-info__wrap-btn:hover{animation:arrowHover 1.2s linear infinite}.pp-dev-info-namespace.pp-dev-info.closed .pp-dev-info__wrap-btn-arrow,.pp-dev-info-namespace .pp-dev-info.closed .pp-dev-info__wrap-btn-arrow{transform:rotate(180deg)}.pp-dev-info-namespace.pp-dev-info .sync-button,.pp-dev-info-namespace .pp-dev-info .sync-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:6px;background-color:rgba(0,0,0,0);border-radius:3px;cursor:pointer;color:var(--pp-dev-info-color-primary);transition:all .2s ease;position:relative;overflow:hidden}.pp-dev-info-namespace.pp-dev-info .sync-button::before,.pp-dev-info-namespace .pp-dev-info .sync-button::before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:currentColor;opacity:0;transition:opacity .2s ease;border-radius:3px}.pp-dev-info-namespace.pp-dev-info .sync-button svg,.pp-dev-info-namespace .pp-dev-info .sync-button svg{width:16px;height:16px;position:relative;z-index:1;transition:transform .3s ease}.pp-dev-info-namespace.pp-dev-info .sync-button:hover:not(.disabled),.pp-dev-info-namespace .pp-dev-info .sync-button:hover:not(.disabled){color:var(--pp-dev-info-color-primary);background-color:rgba(7,91,126,.06)}.pp-dev-info-namespace.pp-dev-info .sync-button:hover:not(.disabled) svg,.pp-dev-info-namespace .pp-dev-info .sync-button:hover:not(.disabled) svg{transform:scale(1.1) rotate(45deg);transition:transform .2s ease}.pp-dev-info-namespace.pp-dev-info .sync-button:active:not(.disabled) svg,.pp-dev-info-namespace .pp-dev-info .sync-button:active:not(.disabled) svg{transform:scale(0.9) rotate(45deg)}.pp-dev-info-namespace.pp-dev-info .sync-button.disabled,.pp-dev-info-namespace .pp-dev-info .sync-button.disabled{opacity:.5;cursor:not-allowed;pointer-events:none;color:var(--pp-dev-info-color-secondary)}.pp-dev-info-namespace.pp-dev-info .sync-button.syncing svg,.pp-dev-info-namespace .pp-dev-info .sync-button.syncing svg{animation:rotate 1.5s linear infinite}.pp-dev-info-namespace.pp-dev-info__sep,.pp-dev-info-namespace .pp-dev-info__sep{display:inline-flex;flex-shrink:0;width:1px;height:16px;background-color:rgba(34,34,34,.24)}@media screen and (prefers-color-scheme: dark){.pp-dev-info-namespace.pp-dev-info__sep,.pp-dev-info-namespace .pp-dev-info__sep{background-color:hsla(0,0%,100%,.2)}}@keyframes rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.pp-dev-info-namespace.pp-dev-info .margin-5,.pp-dev-info-namespace .pp-dev-info .margin-5{margin-right:5px}.pp-dev-info-namespace.pp-dev-info .margin-10,.pp-dev-info-namespace .pp-dev-info .margin-10{margin-right:10px}.pp-dev-info-namespace.pp-dev-info .custom-font,.pp-dev-info-namespace .pp-dev-info .custom-font{font-family:"Inter",sans-serif;font-size:13px;font-weight:400;vertical-align:middle;line-height:18px;color:var(--pp-dev-info-color-dark)}.pp-dev-info-namespace.pp-dev-info .custom-font:not(.not-colored) a,.pp-dev-info-namespace .pp-dev-info .custom-font:not(.not-colored) a{color:var(--pp-dev-info-color-primary) !important}@keyframes rotation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes arrowHover{0%{transform:translateX(2px)}50%{transform:translateX(-2px)}100%{transform:translateX(2px)}}@media screen and (prefers-color-scheme: dark){.pp-dev-info-namespace.pp-dev-info,.pp-dev-info-namespace .pp-dev-info{--pp-dev-info-color-primary: #2a8db5;--pp-dev-info-color-secondary: rgba(220, 220, 220, 0.64);--pp-dev-info-color-success: #0fad5e;--pp-dev-info-color-info: #2dccff;--pp-dev-info-color-warning: #ffb302;--pp-dev-info-color-danger: #e05252;--pp-dev-info-color-light: #343a40;--pp-dev-info-color-dark: #f8f9fa;--pp-dev-info-color-white: #000000;--pp-dev-info-color-black: #ffffff}}
|
|
2
2
|
|
|
3
3
|
/*# sourceMappingURL=client.css.map */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["client.scss"],"names":[],"mappings":"AAEA,uBAEE,qCACA,uCACA,qCACA,kCACA,qCACA,oCACA,mCACA,kCACA,mCACA,mCAEA,2CACE,eACA,SACA,WACA,kBACA,gBACA,mBACA,uBACA,gDACA,WACE,mDAEF,kBACA,aACA,sBACA,gDACA,gBACA,eACA,oDACA,wBACA,UACA,0BACA,kCAEA,oDACE,2BACA,UAGF,mDACE,2BACA,UAGF,oDACE,kBACA,SACA,OACA,WACA,mGACA,WACA,sBACA,4BACA,wBAGF,iDACE,aACA,mBACA,8BACA,kBACA,YACA,gBACA,WACA,sBACA,uDACA,oDAEA,sDACE,eACA,gBACA,qCACA,gBAGF,uDACE,eACA,WACA,YACA,aACA,mBACA,uBACA,qCACA,kBACA,qCAEA,6DACE,oCAGF,2DACE,8BAGF,iEACE,qBAKN,mDACE,kBACA,gBACA,sBACA,YACA,gDACA,WACA,gBACA,eAGF,oDACE,8CACA,WACE,2DAIA,8EACE,kDAGF,gFACE,uCAGF,iFACE,6EAKN,mDACE,6CACA,WACE,2DAIA,6EACE,iDAGF,+EACE,sCAGF,gFACE,4EAKN,iDACE,2CACA,WACE,6DAIA,2EACE,+CAGF,6EACE,oCAGF,8EACE,0EAKN,oDACE,8CACA,WACE,2DAIA,8EACE,kDACA,oCAGF,gFACE,uCAGF,iFACE,6EAMR,yGAEE,eACA,QACA,eACA,aACA,mBACA,uBACA,iCACA,0BACA,kCAGF,6CACE,8BACA,mBACA,iCACA,gDACA,WACE,qDAEF,gBAEA,mDACE,kBACA,eACA,gBACA,wCACA,oCACA,iCAGF,qDACE,aACA,qBACA,oCACA,eACA,gBAGF,qDACE,aACA,yBACA,QACA,oBAGF,iDACE,gBACA,iBACA,kBACA,+BACA,eACA,gBACA,eACA,wBAEA,yDACE,oCACA,+BACA,4BAGF,0DACE,qCACA,kDAGF,uDACE,WAKN,uEAEE,eACA,eACA,mBACA,kBACA,OA1RY,KA2RZ,sBACA,QACA,kBACA,iBACA,gDACA,wBACA,oCACA,qCACA,sBACA,aACA,mBACA,gDACA,iBACA,0BACA,kCAMA,2EACE,oCACA,uBACA,eACA,gBACA,gBACA,wBACA,qBACA,uBACA,uBACA,sBACA,SACA,UACA,SACA,UACA,eACA,gBACA,mCACA,kCAGF,yFACE,aACA,mBACA,QAGF,yFACE,aACA,mBACA,kBACA,cAEA,yIACE,WACA,kBACA,QACA,QACA,2BACA,YACA,UACA,iCAEA,+CAVF,yIAWI,qCAIJ,iHACE,eAGF,+GACE,gBAIJ,mFACE,aACA,mBACA,QACA,eACA,gBAGF,qFACE,yCACA,gBAGF,qFACE,gBAGF,mFACE,uCACA,qBACA,0BACA,aACA,mBACA,QAEA,+FACE,uCACA,0BAQJ,yFACE,kDAGF,yFACE,kDAGF,mFACE,+CAGF,yFACE,kDAGF,uFACE,iDAGF,2EACE,uCACA,qBACA,sBACA,gBAEA,uFACE,qBAGF,gLAEE,UAIJ,qFACE,YACA,YACA,gBACA,eACA,aAGF,oLA/CE,gBAoDF,2FACE,uBACA,aACA,mBACA,uBACA,WACA,YACA,kBACA,YACA,eACA,kBACA,qCAEA,uGACE,iCACA,yCAGF,uGACE,WACA,YACA,mCACA,8BAIJ,qFACE,wCACA,eAGE,+IACE,0CAGF,+IACE,yBAKN,iGACE,aACA,mBACA,uBACA,WACA,YACA,YACA,iBACA,+BACA,YACA,kBACA,eACA,uCACA,wBACA,kBACA,gBAEA,iHACE,WACA,kBACA,MACA,OACA,WACA,YACA,8BACA,UACA,4BACA,kBAGF,yGACE,kBACA,UACA,8BAGF,2IACE,uCAEA,mJACE,mCACA,8BAKF,qJACE,mCAIJ,mHACE,WACA,mBACA,oBACA,yCAIA,yHACE,sCAKN,kBACE,KACE,uBAEF,GACE,0BAIJ,2FACE,iBAGF,6FACE,kBAGF,iGACE,uBACA,eACA,gBACA,sBACA,gBACA,oCAEA,yIACE,kDAIJ,oBACE,GACE,uBAEF,KACE,0BAIJ,sBACE,GACE,0BAEF,IACE,2BAEF,KACE,2BAKJ,+CACE,uEAEE,qCACA,uCACA,qCACA,kCACA,qCACA,oCACA,mCACA,kCACA,mCACA","file":"client.css","sourcesContent":["$pp-dev-height: 30px;\n\n.pp-dev-info-namespace {\n // Define theme colors\n --pp-dev-info-color-primary: #007bff;\n --pp-dev-info-color-secondary: #6c757d;\n --pp-dev-info-color-success: #28a745;\n --pp-dev-info-color-info: #17a2b8;\n --pp-dev-info-color-warning: #ffc107;\n --pp-dev-info-color-danger: #dc3545;\n --pp-dev-info-color-light: #f8f9fa;\n --pp-dev-info-color-dark: #343a40;\n --pp-dev-info-color-white: #ffffff;\n --pp-dev-info-color-black: #000000;\n\n .pp-dev-info__popup {\n position: fixed;\n top: 10px;\n right: 10px;\n width: max-content;\n max-width: 300px;\n height: max-content;\n max-height: max-content;\n background-color: var(--pp-dev-info-color-white);\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 1px 3px rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n z-index: 100001;\n border: 1px solid var(--pp-dev-info-color-secondary);\n transform: translateX(0);\n opacity: 1;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n\n &.entering {\n transform: translateX(100%);\n opacity: 0;\n }\n\n &.exiting {\n transform: translateX(100%);\n opacity: 0;\n }\n\n &-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 4px;\n background: linear-gradient(90deg, var(--pp-dev-info-color-primary), var(--pp-dev-info-color-info));\n width: 100%;\n transform-origin: left;\n transition: width 0.1s linear;\n border-radius: 0 0 0 8px;\n }\n\n &-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n height: auto;\n min-height: 30px;\n width: 100%;\n box-sizing: border-box;\n border-bottom: 1px solid var(--pp-dev-info-color-light);\n background-color: var(--pp-dev-info-color-secondary);\n\n &-text {\n font-size: 14px;\n font-weight: 600;\n color: var(--pp-dev-info-color-white);\n line-height: 1.4;\n }\n\n &-close {\n cursor: pointer;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--pp-dev-info-color-white);\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.1);\n }\n\n svg {\n transition: transform 0.2s ease;\n }\n\n &:hover svg {\n transform: scale(1.1);\n }\n }\n }\n\n &-content {\n padding: 12px 16px;\n overflow-y: auto;\n box-sizing: border-box;\n flex-grow: 1;\n background-color: var(--pp-dev-info-color-white);\n width: 100%;\n line-height: 1.5;\n font-size: 13px;\n }\n\n &--success {\n border-color: var(--pp-dev-info-color-success);\n box-shadow:\n 0 4px 6px rgba(40, 167, 69, 0.1),\n 0 1px 3px rgba(40, 167, 69, 0.08);\n\n .pp-dev-info__popup {\n &-title {\n background-color: var(--pp-dev-info-color-success);\n }\n\n &-content {\n color: var(--pp-dev-info-color-success);\n }\n\n &-progress {\n background: linear-gradient(90deg, var(--pp-dev-info-color-success), #4caf50);\n }\n }\n }\n\n &--danger {\n border-color: var(--pp-dev-info-color-danger);\n box-shadow:\n 0 4px 6px rgba(220, 53, 69, 0.1),\n 0 1px 3px rgba(220, 53, 69, 0.08);\n\n .pp-dev-info__popup {\n &-title {\n background-color: var(--pp-dev-info-color-danger);\n }\n\n &-content {\n color: var(--pp-dev-info-color-danger);\n }\n\n &-progress {\n background: linear-gradient(90deg, var(--pp-dev-info-color-danger), #f44336);\n }\n }\n }\n\n &--info {\n border-color: var(--pp-dev-info-color-info);\n box-shadow:\n 0 4px 6px rgba(23, 162, 184, 0.1),\n 0 1px 3px rgba(23, 162, 184, 0.08);\n\n .pp-dev-info__popup {\n &-title {\n background-color: var(--pp-dev-info-color-info);\n }\n\n &-content {\n color: var(--pp-dev-info-color-info);\n }\n\n &-progress {\n background: linear-gradient(90deg, var(--pp-dev-info-color-info), #2196f3);\n }\n }\n }\n\n &--warning {\n border-color: var(--pp-dev-info-color-warning);\n box-shadow:\n 0 4px 6px rgba(255, 193, 7, 0.1),\n 0 1px 3px rgba(255, 193, 7, 0.08);\n\n .pp-dev-info__popup {\n &-title {\n background-color: var(--pp-dev-info-color-warning);\n color: var(--pp-dev-info-color-dark);\n }\n\n &-content {\n color: var(--pp-dev-info-color-warning);\n }\n\n &-progress {\n background: linear-gradient(90deg, var(--pp-dev-info-color-warning), #ff9800);\n }\n }\n }\n }\n\n &.pp-dev-info__confirm-overlay,\n .pp-dev-info__confirm-overlay {\n position: fixed;\n inset: 0;\n z-index: 100003;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.35);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n }\n\n .pp-dev-info__confirm {\n width: min(500px, calc(100vw - 32px));\n border-radius: 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n background-color: var(--pp-dev-info-color-white);\n box-shadow:\n 0 18px 40px rgba(0, 0, 0, 0.35),\n 0 2px 6px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n\n &-title {\n padding: 14px 16px;\n font-size: 15px;\n font-weight: 600;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n color: var(--pp-dev-info-color-dark);\n background-color: rgba(0, 0, 0, 0.03);\n }\n\n &-content {\n padding: 16px;\n white-space: pre-wrap;\n color: var(--pp-dev-info-color-dark);\n font-size: 13px;\n line-height: 1.5;\n }\n\n &-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 0 16px 16px;\n }\n\n &-btn {\n min-width: 110px;\n padding: 8px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &--cancel {\n color: var(--pp-dev-info-color-dark);\n background-color: transparent;\n border-color: rgba(0, 0, 0, 0.2);\n }\n\n &--confirm {\n color: var(--pp-dev-info-color-white);\n background-color: var(--pp-dev-info-color-primary);\n }\n\n &:hover {\n opacity: 0.9;\n }\n }\n }\n\n &.pp-dev-info,\n .pp-dev-info {\n position: fixed;\n z-index: 100000;\n white-space: nowrap;\n width: fit-content;\n height: $pp-dev-height;\n top: calc(100% - $pp-dev-height);\n right: 0;\n text-align: center;\n padding: 8px 12px;\n background-color: var(--pp-dev-info-color-white);\n border-radius: 8px 0 0 0;\n color: var(--pp-dev-info-color-dark);\n box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);\n box-sizing: border-box;\n display: flex;\n align-items: center;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: visible;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n\n // Setup default values for styles that can be overlapped by other page styles\n // (e.g. color, font-family, font-size etc.)\n // This is needed to make sure that the extension styles are not overlapped by the page styles\n // and the extension is still usable\n * {\n color: var(--pp-dev-info-color-dark);\n font-family: sans-serif;\n font-size: 13px;\n font-weight: 300;\n line-height: 1.5;\n letter-spacing: 0.00938em;\n text-decoration: none;\n text-transform: inherit;\n vertical-align: inherit;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: 0 0;\n list-style: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n &__content {\n display: flex;\n align-items: center;\n gap: 0px;\n }\n\n &__section {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 8px;\n\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n height: 12px;\n width: 1px;\n background-color: rgba(0, 0, 0, 0.15);\n\n @media screen and (prefers-color-scheme: dark) {\n background-color: rgba(255, 255, 255, 0.2);\n }\n }\n\n &:first-child {\n padding-left: 0;\n }\n\n &:last-child {\n padding-right: 0;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n line-height: 1.5;\n }\n\n &__label {\n color: var(--pp-dev-info-color-secondary);\n font-weight: 500;\n }\n\n &__value {\n font-weight: 600;\n }\n\n &__link {\n color: var(--pp-dev-info-color-primary);\n text-decoration: none;\n transition: color 0.2s ease;\n display: flex;\n align-items: center;\n gap: 4px;\n\n &:hover {\n color: var(--pp-dev-info-color-primary);\n text-decoration: underline;\n }\n }\n\n @mixin bold {\n font-weight: 700;\n }\n\n .primary {\n color: var(--pp-dev-info-color-primary) !important;\n }\n\n .success {\n color: var(--pp-dev-info-color-success) !important;\n }\n\n .info {\n color: var(--pp-dev-info-color-info) !important;\n }\n\n .warning {\n color: var(--pp-dev-info-color-warning) !important;\n }\n\n .danger {\n color: var(--pp-dev-info-color-danger) !important;\n }\n\n a {\n color: var(--pp-dev-info-color-primary);\n text-decoration: none;\n vertical-align: middle;\n line-height: 1.5;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:hover {\n outline: 0;\n }\n }\n\n button {\n padding: 1px;\n border: none;\n background: none;\n cursor: pointer;\n outline: none;\n }\n\n .bold,\n .status-text {\n @include bold;\n }\n\n &__wrap-btn {\n box-sizing: content-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin-right: 12px;\n padding: 4px;\n cursor: pointer;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.05);\n animation: arrowHover 0.8s linear infinite;\n }\n\n &-arrow {\n width: 16px;\n height: 16px;\n fill: var(--pp-dev-info-color-dark);\n transition: transform 0.2s ease;\n }\n }\n\n &.closed {\n transform: translateX(calc(100% - 40px));\n z-index: 100002;\n\n & .pp-dev-info__wrap-btn {\n &:hover {\n animation: arrowHover 1.2s linear infinite;\n }\n\n &-arrow {\n transform: rotate(180deg);\n }\n }\n }\n\n .sync-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 26px;\n padding: 4px;\n margin-left: 12px;\n background-color: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: var(--pp-dev-info-color-primary);\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: currentColor;\n opacity: 0;\n transition: opacity 0.2s ease;\n border-radius: 4px;\n }\n\n svg {\n position: relative;\n z-index: 1;\n transition: transform 0.3s ease;\n }\n\n &:hover:not(.disabled) {\n color: var(--pp-dev-info-color-primary);\n\n svg {\n transform: scale(1.1) rotate(45deg);\n transition: transform 0.2s ease;\n }\n }\n\n &:active:not(.disabled) {\n svg {\n transform: scale(0.9) rotate(45deg);\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n color: var(--pp-dev-info-color-secondary);\n }\n\n &.syncing {\n svg {\n animation: rotate 1.5s linear infinite;\n }\n }\n }\n\n @keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n .margin-5 {\n margin-right: 5px;\n }\n\n .margin-10 {\n margin-right: 10px;\n }\n\n .custom-font {\n font-family: sans-serif;\n font-size: 13px;\n font-weight: 300;\n vertical-align: middle;\n line-height: 1.5;\n color: var(--pp-dev-info-color-dark);\n\n &:not(.not-colored) a {\n color: var(--pp-dev-info-color-primary) !important;\n }\n }\n\n @keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n\n @keyframes arrowHover {\n 0% {\n transform: translateX(2px);\n }\n 50% {\n transform: translateX(-2px);\n }\n 100% {\n transform: translateX(2px);\n }\n }\n\n // Dark mode support with css variables\n @media screen and (prefers-color-scheme: dark) {\n & {\n // Dark theme colors\n --pp-dev-info-color-primary: #007bff;\n --pp-dev-info-color-secondary: #a4abb6;\n --pp-dev-info-color-success: #56f000;\n --pp-dev-info-color-info: #2dccff;\n --pp-dev-info-color-warning: #ffb302;\n --pp-dev-info-color-danger: #ff3838;\n --pp-dev-info-color-light: #343a40;\n --pp-dev-info-color-dark: #f8f9fa;\n --pp-dev-info-color-white: #000000;\n --pp-dev-info-color-black: #ffffff;\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["client.scss"],"names":[],"mappings":"AAEA,uBAEE,qCACA,sDACA,qCACA,kCACA,qCACA,oCACA,mCACA,kCACA,mCACA,mCAEA,2CACE,eACA,SACA,WACA,YACA,6BACA,YACA,gDACA,uCACA,kBACA,aACA,sBACA,qBACA,QACA,aACA,gDACA,gBACA,eACA,uDACA,wBACA,UACA,sBACA,6DAEA,oDACE,wCACA,UAGF,mDACE,wCACA,UAGF,iDACE,aACA,uBACA,8BACA,QACA,UACA,aACA,WACA,sBACA,gBACA,cAEA,sDACE,aACA,mBACA,uBACA,WACA,YACA,cACA,sCAGF,sDACE,OACA,cACA,eACA,gBACA,iBACA,gBACA,sBAGF,uDACE,eACA,WACA,YACA,aACA,mBACA,uBACA,eACA,yBACA,kBACA,0BACA,cAEA,6DACE,oCAGF,2DACE,8BAKN,mDACE,iBACA,UACA,wBACA,gBACA,sBACA,YACA,+BACA,wBACA,eACA,gBACA,iBACA,gBACA,sBAGF,oDACE,6DACA,mDAGF,mDACE,4DACA,kDAGF,iDACE,0DACA,gDAGF,oDACE,6DACA,mDAIJ,yGAEE,eACA,QACA,eACA,aACA,mBACA,uBACA,iCACA,0BACA,kCAGF,6CACE,8BACA,kBACA,iCACA,gDACA,8CACA,gBAEA,mDACE,kBACA,eACA,gBACA,wCACA,oCACA,iCAGF,qDACE,aACA,qBACA,oCACA,eACA,gBAGF,qDACE,aACA,sBACA,QACA,oBAGF,iDACE,WACA,iBACA,kBACA,+BACA,eACA,gBACA,eACA,wBAEA,yDACE,oCACA,+BACA,4BAGF,0DACE,qCACA,kDAGF,uDACE,WAKN,uEAEE,eACA,eACA,mBACA,kBACA,OA3NY,KA4NZ,sBACA,QACA,kBACA,YACA,QACA,gDACA,wBACA,2CACA,oCACA,gDACA,sBACA,aACA,mBACA,gDACA,iBACA,0BACA,kCAMA,2EACE,oCACA,+BACA,eACA,gBACA,iBACA,iBACA,qBACA,uBACA,uBACA,sBACA,SACA,UACA,SACA,UACA,eACA,gBACA,mCACA,kCAGF,yFACE,aACA,mBACA,QAGF,yFACE,aACA,mBACA,kBACA,cAEA,yIACE,WACA,kBACA,QACA,QACA,2BACA,YACA,UACA,oCAEA,+CAVF,yIAWI,qCAIJ,iHACE,eAGF,+GACE,gBAIJ,mFACE,aACA,mBACA,QACA,eACA,gBACA,iBAGF,qFACE,yCACA,gBAGF,qFACE,gBAGF,mFACE,uCACA,qBACA,0BACA,aACA,mBACA,QAEA,+FACE,uCACA,0BAQJ,yFACE,kDAGF,yFACE,kDAGF,mFACE,+CAGF,yFACE,kDAGF,uFACE,iDAGF,2EACE,uCACA,qBACA,sBACA,iBAEA,uFACE,qBAGF,gLAEE,UAIJ,qFACE,YACA,YACA,gBACA,eACA,aAGF,oLA/CE,gBAoDF,2FACE,sBACA,aACA,mBACA,uBACA,WACA,YACA,YACA,eACA,kBACA,qCAEA,uGACE,oCACA,yCAGF,uGACE,WACA,YACA,oCACA,UACA,8BAIJ,qFACE,wCACA,eAGE,+IACE,0CAGF,+IACE,yBAKN,iGACE,aACA,mBACA,uBACA,WACA,YACA,YACA,+BACA,kBACA,eACA,uCACA,wBACA,kBACA,gBAEA,iHACE,WACA,kBACA,MACA,OACA,WACA,YACA,8BACA,UACA,4BACA,kBAGF,yGACE,WACA,YACA,kBACA,UACA,8BAGF,2IACE,uCACA,oCAEA,mJACE,mCACA,8BAKF,qJACE,mCAIJ,mHACE,WACA,mBACA,oBACA,yCAIA,yHACE,sCAKN,iFACE,oBACA,cACA,UACA,YACA,oCAEA,+CAPF,iFAQI,qCAIJ,kBACE,KACE,uBAEF,GACE,0BAIJ,2FACE,iBAGF,6FACE,kBAGF,iGACE,+BACA,eACA,gBACA,sBACA,iBACA,oCAEA,yIACE,kDAIJ,oBACE,GACE,uBAEF,KACE,0BAIJ,sBACE,GACE,0BAEF,IACE,2BAEF,KACE,2BAKJ,+CACE,uEAEE,qCACA,yDACA,qCACA,kCACA,qCACA,oCACA,mCACA,kCACA,mCACA","file":"client.css","sourcesContent":["$pp-dev-height: 32px;\n\n.pp-dev-info-namespace {\n // Define theme colors\n --pp-dev-info-color-primary: #075b7e;\n --pp-dev-info-color-secondary: rgba(34, 34, 34, 0.64);\n --pp-dev-info-color-success: #077e45;\n --pp-dev-info-color-info: #17a2b8;\n --pp-dev-info-color-warning: #ffb000;\n --pp-dev-info-color-danger: #ac2b2b;\n --pp-dev-info-color-light: #f8f9fa;\n --pp-dev-info-color-dark: #343a40;\n --pp-dev-info-color-white: #ffffff;\n --pp-dev-info-color-black: #000000;\n\n .pp-dev-info__popup {\n position: fixed;\n top: 10px;\n right: 10px;\n width: 280px;\n max-width: calc(100vw - 20px);\n height: auto;\n background-color: var(--pp-dev-info-color-white);\n box-shadow: 0 2px 4px rgba(34, 34, 34, 0.2);\n border-radius: 2px;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n padding: 12px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n z-index: 100001;\n border-left: 2px solid var(--pp-dev-info-color-primary);\n transform: translateX(0);\n opacity: 1;\n box-sizing: border-box;\n --pp-dev-info-popup-accent: var(--pp-dev-info-color-primary);\n\n &.entering {\n transform: translateX(calc(100% + 10px));\n opacity: 0;\n }\n\n &.exiting {\n transform: translateX(calc(100% + 10px));\n opacity: 0;\n }\n\n &-title {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n padding: 0;\n min-height: 0;\n width: 100%;\n box-sizing: border-box;\n border-bottom: 0;\n color: #040404;\n\n &-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n color: var(--pp-dev-info-popup-accent);\n }\n\n &-text {\n flex: 1;\n color: #040404;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n text-align: left;\n word-break: break-word;\n }\n\n &-close {\n cursor: pointer;\n width: 12px;\n height: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 2px;\n color: rgba(34, 34, 34, 0.64);\n border-radius: 2px;\n transition: color 0.2s ease;\n flex-shrink: 0;\n\n &:hover {\n color: var(--pp-dev-info-color-dark);\n }\n\n svg {\n transition: transform 0.2s ease;\n }\n }\n }\n\n &-content {\n margin-left: 24px;\n padding: 0;\n width: calc(100% - 24px);\n overflow-y: auto;\n box-sizing: border-box;\n flex-grow: 0;\n background-color: transparent;\n color: rgba(34, 34, 34, 0.8);\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n text-align: left;\n word-break: break-word;\n }\n\n &--success {\n --pp-dev-info-popup-accent: var(--pp-dev-info-color-success);\n border-left-color: var(--pp-dev-info-color-success);\n }\n\n &--danger {\n --pp-dev-info-popup-accent: var(--pp-dev-info-color-danger);\n border-left-color: var(--pp-dev-info-color-danger);\n }\n\n &--info {\n --pp-dev-info-popup-accent: var(--pp-dev-info-color-info);\n border-left-color: var(--pp-dev-info-color-info);\n }\n\n &--warning {\n --pp-dev-info-popup-accent: var(--pp-dev-info-color-warning);\n border-left-color: var(--pp-dev-info-color-warning);\n }\n }\n\n &.pp-dev-info__confirm-overlay,\n .pp-dev-info__confirm-overlay {\n position: fixed;\n inset: 0;\n z-index: 100003;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.35);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n }\n\n .pp-dev-info__confirm {\n width: min(408px, calc(100vw - 32px));\n border-radius: 3px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n background-color: var(--pp-dev-info-color-white);\n box-shadow: 0px 8px 32px 0px rgba(34, 34, 34, 0.4);\n overflow: hidden;\n\n &-title {\n padding: 14px 16px;\n font-size: 15px;\n font-weight: 600;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n color: var(--pp-dev-info-color-dark);\n background-color: rgba(0, 0, 0, 0.03);\n }\n\n &-content {\n padding: 16px;\n white-space: pre-wrap;\n color: var(--pp-dev-info-color-dark);\n font-size: 13px;\n line-height: 1.5;\n }\n\n &-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 16px 16px;\n }\n\n &-btn {\n width: 100%;\n padding: 8px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &--cancel {\n color: var(--pp-dev-info-color-dark);\n background-color: transparent;\n border-color: rgba(0, 0, 0, 0.2);\n }\n\n &--confirm {\n color: var(--pp-dev-info-color-white);\n background-color: var(--pp-dev-info-color-primary);\n }\n\n &:hover {\n opacity: 0.9;\n }\n }\n }\n\n &.pp-dev-info,\n .pp-dev-info {\n position: fixed;\n z-index: 100000;\n white-space: nowrap;\n width: fit-content;\n height: $pp-dev-height;\n top: calc(100% - $pp-dev-height);\n right: 0;\n text-align: center;\n padding: 2px;\n gap: 8px;\n background-color: var(--pp-dev-info-color-white);\n border-radius: 4px 0 0 0;\n border-bottom: 1px solid rgba(34, 34, 34, 0.08);\n color: var(--pp-dev-info-color-dark);\n box-shadow: -2px -2px 8px 0px rgba(34, 34, 34, 0.08);\n box-sizing: border-box;\n display: flex;\n align-items: center;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: visible;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n\n // Setup default values for styles that can be overlapped by other page styles\n // (e.g. color, font-family, font-size etc.)\n // This is needed to make sure that the extension styles are not overlapped by the page styles\n // and the extension is still usable\n * {\n color: var(--pp-dev-info-color-dark);\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n letter-spacing: 0;\n text-decoration: none;\n text-transform: inherit;\n vertical-align: inherit;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: 0 0;\n list-style: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n &__content {\n display: flex;\n align-items: center;\n gap: 0px;\n }\n\n &__section {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 8px;\n\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n height: 16px;\n width: 1px;\n background-color: rgba(34, 34, 34, 0.24);\n\n @media screen and (prefers-color-scheme: dark) {\n background-color: rgba(255, 255, 255, 0.2);\n }\n }\n\n &:first-child {\n padding-left: 0;\n }\n\n &:last-child {\n padding-right: 0;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n }\n\n &__label {\n color: var(--pp-dev-info-color-secondary);\n font-weight: 400;\n }\n\n &__value {\n font-weight: 600;\n }\n\n &__link {\n color: var(--pp-dev-info-color-primary);\n text-decoration: none;\n transition: color 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n\n &:hover {\n color: var(--pp-dev-info-color-primary);\n text-decoration: underline;\n }\n }\n\n @mixin bold {\n font-weight: 700;\n }\n\n .primary {\n color: var(--pp-dev-info-color-primary) !important;\n }\n\n .success {\n color: var(--pp-dev-info-color-success) !important;\n }\n\n .info {\n color: var(--pp-dev-info-color-info) !important;\n }\n\n .warning {\n color: var(--pp-dev-info-color-warning) !important;\n }\n\n .danger {\n color: var(--pp-dev-info-color-danger) !important;\n }\n\n a {\n color: var(--pp-dev-info-color-primary);\n text-decoration: none;\n vertical-align: middle;\n line-height: 18px;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:hover {\n outline: 0;\n }\n }\n\n button {\n padding: 1px;\n border: none;\n background: none;\n cursor: pointer;\n outline: none;\n }\n\n .bold,\n .status-text {\n @include bold;\n }\n\n &__wrap-btn {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n cursor: pointer;\n border-radius: 3px;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: rgba(7, 91, 126, 0.06);\n animation: arrowHover 0.8s linear infinite;\n }\n\n &-arrow {\n width: 16px;\n height: 16px;\n color: var(--pp-dev-info-color-dark);\n fill: none;\n transition: transform 0.2s ease;\n }\n }\n\n &.closed {\n transform: translateX(calc(100% - $pp-dev-height));\n z-index: 100002;\n\n & .pp-dev-info__wrap-btn {\n &:hover {\n animation: arrowHover 1.2s linear infinite;\n }\n\n &-arrow {\n transform: rotate(180deg);\n }\n }\n }\n\n .sync-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n background-color: transparent;\n border-radius: 3px;\n cursor: pointer;\n color: var(--pp-dev-info-color-primary);\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: currentColor;\n opacity: 0;\n transition: opacity 0.2s ease;\n border-radius: 3px;\n }\n\n svg {\n width: 16px;\n height: 16px;\n position: relative;\n z-index: 1;\n transition: transform 0.3s ease;\n }\n\n &:hover:not(.disabled) {\n color: var(--pp-dev-info-color-primary);\n background-color: rgba(7, 91, 126, 0.06);\n\n svg {\n transform: scale(1.1) rotate(45deg);\n transition: transform 0.2s ease;\n }\n }\n\n &:active:not(.disabled) {\n svg {\n transform: scale(0.9) rotate(45deg);\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n color: var(--pp-dev-info-color-secondary);\n }\n\n &.syncing {\n svg {\n animation: rotate 1.5s linear infinite;\n }\n }\n }\n\n &__sep {\n display: inline-flex;\n flex-shrink: 0;\n width: 1px;\n height: 16px;\n background-color: rgba(34, 34, 34, 0.24);\n\n @media screen and (prefers-color-scheme: dark) {\n background-color: rgba(255, 255, 255, 0.2);\n }\n }\n\n @keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n .margin-5 {\n margin-right: 5px;\n }\n\n .margin-10 {\n margin-right: 10px;\n }\n\n .custom-font {\n font-family: 'Inter', sans-serif;\n font-size: 13px;\n font-weight: 400;\n vertical-align: middle;\n line-height: 18px;\n color: var(--pp-dev-info-color-dark);\n\n &:not(.not-colored) a {\n color: var(--pp-dev-info-color-primary) !important;\n }\n }\n\n @keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n\n @keyframes arrowHover {\n 0% {\n transform: translateX(2px);\n }\n 50% {\n transform: translateX(-2px);\n }\n 100% {\n transform: translateX(2px);\n }\n }\n\n // Dark mode support with css variables\n @media screen and (prefers-color-scheme: dark) {\n & {\n // Dark theme colors\n --pp-dev-info-color-primary: #2a8db5;\n --pp-dev-info-color-secondary: rgba(220, 220, 220, 0.64);\n --pp-dev-info-color-success: #0fad5e;\n --pp-dev-info-color-info: #2dccff;\n --pp-dev-info-color-warning: #ffb302;\n --pp-dev-info-color-danger: #e05252;\n --pp-dev-info-color-light: #343a40;\n --pp-dev-info-color-dark: #f8f9fa;\n --pp-dev-info-color-white: #000000;\n --pp-dev-info-color-black: #ffffff;\n }\n }\n }\n}\n"]}
|
package/dist/client/client.js
CHANGED
|
@@ -1,3 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `import.meta.hot`-compatible context for environments without Vite HMR
|
|
3
|
+
* (e.g. the `pp-dev next` server). The dev-panel client only uses `hot.on()` and
|
|
4
|
+
* `hot.send()`; this shim implements those over a raw WebSocket using the same
|
|
5
|
+
* custom-event wire shape Vite uses: `{ type: 'custom', event, data }`.
|
|
6
|
+
*
|
|
7
|
+
* Used only as a fallback: when `import.meta.hot` exists (Vite), that is used
|
|
8
|
+
* instead and this code never runs.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* WebSocket path the pp-dev Next.js server listens on for dev-panel messages.
|
|
12
|
+
* Kept in sync with `PP_DEV_HMR_WS_PATH` in `src/constants.ts` (server side).
|
|
13
|
+
*/
|
|
14
|
+
const PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';
|
|
15
|
+
const MAX_OUTBOX_SIZE = 50;
|
|
16
|
+
function resolveWebSocketUrl() {
|
|
17
|
+
const { protocol, host } = window.location;
|
|
18
|
+
const wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';
|
|
19
|
+
return `${wsProtocol}//${host}${PP_DEV_HMR_WS_PATH}`;
|
|
20
|
+
}
|
|
21
|
+
function createPPDevHotContext() {
|
|
22
|
+
const handlers = new Map();
|
|
23
|
+
/** Outgoing messages queued while the socket is not OPEN; flushed on connect. */
|
|
24
|
+
const outbox = [];
|
|
25
|
+
let socket = null;
|
|
26
|
+
let reconnectTimer = null;
|
|
27
|
+
let reconnectDelay = 1_000;
|
|
28
|
+
const MAX_RECONNECT_DELAY = 10_000;
|
|
29
|
+
const flushOutbox = () => {
|
|
30
|
+
if (!socket || socket.readyState !== WebSocket.OPEN) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
while (outbox.length > 0) {
|
|
34
|
+
socket.send(outbox.shift());
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const dispatch = (event, data) => {
|
|
38
|
+
const eventHandlers = handlers.get(event);
|
|
39
|
+
if (!eventHandlers) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
for (const handler of eventHandlers) {
|
|
43
|
+
try {
|
|
44
|
+
handler(data);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
// A failing handler must not break dispatch to the others.
|
|
48
|
+
console.error(`[pp-dev] hot handler for "${event}" failed`, err);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const connect = () => {
|
|
53
|
+
try {
|
|
54
|
+
socket = new WebSocket(resolveWebSocketUrl());
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error('[pp-dev] failed to open dev-panel WebSocket', err);
|
|
58
|
+
scheduleReconnect();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
socket.addEventListener('open', () => {
|
|
62
|
+
reconnectDelay = 1_000;
|
|
63
|
+
flushOutbox();
|
|
64
|
+
});
|
|
65
|
+
socket.addEventListener('message', (ev) => {
|
|
66
|
+
let message;
|
|
67
|
+
try {
|
|
68
|
+
message = JSON.parse(typeof ev.data === 'string' ? ev.data : '');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (message && message.type === 'custom' && typeof message.event === 'string') {
|
|
74
|
+
dispatch(message.event, message.data);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
socket.addEventListener('close', () => {
|
|
78
|
+
socket = null;
|
|
79
|
+
scheduleReconnect();
|
|
80
|
+
});
|
|
81
|
+
socket.addEventListener('error', () => {
|
|
82
|
+
// `close` follows `error`; reconnect is scheduled there.
|
|
83
|
+
socket?.close();
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
const scheduleReconnect = () => {
|
|
87
|
+
if (reconnectTimer) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
reconnectTimer = setTimeout(() => {
|
|
91
|
+
reconnectTimer = null;
|
|
92
|
+
reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);
|
|
93
|
+
connect();
|
|
94
|
+
}, reconnectDelay);
|
|
95
|
+
};
|
|
96
|
+
connect();
|
|
97
|
+
const noop = () => { };
|
|
98
|
+
const context = {
|
|
99
|
+
on(event, cb) {
|
|
100
|
+
let set = handlers.get(event);
|
|
101
|
+
if (!set) {
|
|
102
|
+
set = new Set();
|
|
103
|
+
handlers.set(event, set);
|
|
104
|
+
}
|
|
105
|
+
set.add(cb);
|
|
106
|
+
},
|
|
107
|
+
off(event, cb) {
|
|
108
|
+
handlers.get(event)?.delete(cb);
|
|
109
|
+
},
|
|
110
|
+
send(event, data) {
|
|
111
|
+
const payload = JSON.stringify({ type: 'custom', event, data });
|
|
112
|
+
if (socket && socket.readyState === WebSocket.OPEN) {
|
|
113
|
+
socket.send(payload);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (outbox.length >= MAX_OUTBOX_SIZE) {
|
|
117
|
+
outbox.shift();
|
|
118
|
+
}
|
|
119
|
+
outbox.push(payload);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
// Unused by the dev-panel client; provided as no-ops to satisfy the shape.
|
|
123
|
+
accept: noop,
|
|
124
|
+
acceptExports: noop,
|
|
125
|
+
dispose: noop,
|
|
126
|
+
prune: noop,
|
|
127
|
+
invalidate: noop,
|
|
128
|
+
data: {},
|
|
129
|
+
};
|
|
130
|
+
return context;
|
|
131
|
+
}
|
|
132
|
+
|
|
1
133
|
/// <reference types="vite/client" />
|
|
2
134
|
function checkLocalStorage() {
|
|
3
135
|
try {
|
|
@@ -25,6 +157,8 @@ const POPUP_HEIGHT = 100;
|
|
|
25
157
|
const ANIMATION_DURATION = 300;
|
|
26
158
|
const CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay';
|
|
27
159
|
const activeConfirmModals = new Map();
|
|
160
|
+
const ICON_SIZE = 16;
|
|
161
|
+
const CLOSE_ICON_SIZE = 12;
|
|
28
162
|
function teardownConfirmModal(overlay, result) {
|
|
29
163
|
const entry = activeConfirmModals.get(overlay);
|
|
30
164
|
if (!entry) {
|
|
@@ -35,19 +169,27 @@ function teardownConfirmModal(overlay, result) {
|
|
|
35
169
|
overlay.remove();
|
|
36
170
|
entry.resolve(result);
|
|
37
171
|
}
|
|
172
|
+
const TYPE_ICONS = {
|
|
173
|
+
success: `<svg viewBox="0 0 24 24" width="${ICON_SIZE}" height="${ICON_SIZE}" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg>`,
|
|
174
|
+
danger: `<svg viewBox="0 0 24 24" width="${ICON_SIZE}" height="${ICON_SIZE}" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 8v4"/><path d="M12 16h.01"/></svg>`,
|
|
175
|
+
warning: `<svg viewBox="0 0 24 24" width="${ICON_SIZE}" height="${ICON_SIZE}" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg>`,
|
|
176
|
+
info: `<svg viewBox="0 0 24 24" width="${ICON_SIZE}" height="${ICON_SIZE}" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>`,
|
|
177
|
+
};
|
|
38
178
|
function createPopupElement(opts) {
|
|
39
179
|
const $popup = document.createElement('div');
|
|
40
180
|
$popup.classList.add('pp-dev-info-namespace');
|
|
41
181
|
const typeClass = opts.type ? `pp-dev-info__popup--${opts.type}` : '';
|
|
182
|
+
const iconHtml = opts.type ? `<div class="pp-dev-info__popup-title-icon">${TYPE_ICONS[opts.type]}</div>` : '';
|
|
42
183
|
const template = `
|
|
43
184
|
<div class="pp-dev-info__popup ${typeClass} ${opts.className || ''}" style="${opts.style || ''}">
|
|
44
185
|
<div class="pp-dev-info__popup-title">
|
|
186
|
+
${iconHtml}
|
|
45
187
|
<div class="pp-dev-info__popup-title-text">${opts.title}</div>
|
|
46
188
|
<div class="pp-dev-info__popup-title-close">
|
|
47
189
|
<svg
|
|
48
190
|
viewBox="0 0 24 24"
|
|
49
|
-
width="
|
|
50
|
-
height="
|
|
191
|
+
width="${CLOSE_ICON_SIZE}"
|
|
192
|
+
height="${CLOSE_ICON_SIZE}"
|
|
51
193
|
stroke="currentColor"
|
|
52
194
|
stroke-width="1.5"
|
|
53
195
|
fill="none"
|
|
@@ -60,7 +202,6 @@ function createPopupElement(opts) {
|
|
|
60
202
|
</div>
|
|
61
203
|
</div>
|
|
62
204
|
<div class="pp-dev-info__popup-content">${opts.content}</div>
|
|
63
|
-
<div class="pp-dev-info__popup-progress"></div>
|
|
64
205
|
</div>
|
|
65
206
|
`;
|
|
66
207
|
$popup.innerHTML = template;
|
|
@@ -72,7 +213,10 @@ function updatePopupPositions() {
|
|
|
72
213
|
// Update popup positions
|
|
73
214
|
popups.forEach((popup, index) => {
|
|
74
215
|
const top = POPUP_OFFSET + index * (POPUP_HEIGHT + POPUP_OFFSET);
|
|
75
|
-
popup.
|
|
216
|
+
const $popupContent = popup.querySelector('.pp-dev-info__popup');
|
|
217
|
+
if ($popupContent) {
|
|
218
|
+
$popupContent.style.top = `${top}px`;
|
|
219
|
+
}
|
|
76
220
|
});
|
|
77
221
|
// Ensure dev panel stays at the bottom
|
|
78
222
|
if ($devPanel) {
|
|
@@ -82,7 +226,7 @@ function updatePopupPositions() {
|
|
|
82
226
|
}
|
|
83
227
|
function animatePopup($popup, type) {
|
|
84
228
|
return new Promise((resolve) => {
|
|
85
|
-
const $popupContent = $popup.querySelector('.pp-dev-
|
|
229
|
+
const $popupContent = $popup.querySelector('.pp-dev-info__popup');
|
|
86
230
|
if (!$popupContent) {
|
|
87
231
|
return resolve();
|
|
88
232
|
}
|
|
@@ -105,7 +249,6 @@ function animatePopup($popup, type) {
|
|
|
105
249
|
function infoPopup(opts) {
|
|
106
250
|
const $popup = createPopupElement(opts);
|
|
107
251
|
const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');
|
|
108
|
-
const $progressBar = $popup.querySelector('.pp-dev-info__popup-progress');
|
|
109
252
|
const removePopup = async () => {
|
|
110
253
|
await animatePopup($popup, 'exit');
|
|
111
254
|
$popup.remove();
|
|
@@ -122,8 +265,7 @@ function infoPopup(opts) {
|
|
|
122
265
|
let remainingTime = duration;
|
|
123
266
|
let lastUpdate = Date.now();
|
|
124
267
|
let isVisible = true;
|
|
125
|
-
|
|
126
|
-
const updateProgress = () => {
|
|
268
|
+
const scheduleDismiss = () => {
|
|
127
269
|
if (!isVisible) {
|
|
128
270
|
return;
|
|
129
271
|
}
|
|
@@ -135,22 +277,17 @@ function infoPopup(opts) {
|
|
|
135
277
|
removePopup();
|
|
136
278
|
return;
|
|
137
279
|
}
|
|
138
|
-
|
|
139
|
-
if ($progressBar) {
|
|
140
|
-
$progressBar.style.width = `${progress}%`;
|
|
141
|
-
}
|
|
142
|
-
requestAnimationFrame(updateProgress);
|
|
280
|
+
requestAnimationFrame(scheduleDismiss);
|
|
143
281
|
};
|
|
144
282
|
// Handle visibility change
|
|
145
283
|
document.addEventListener('visibilitychange', () => {
|
|
146
284
|
isVisible = !document.hidden;
|
|
147
285
|
if (isVisible) {
|
|
148
286
|
lastUpdate = Date.now();
|
|
149
|
-
requestAnimationFrame(
|
|
287
|
+
requestAnimationFrame(scheduleDismiss);
|
|
150
288
|
}
|
|
151
289
|
});
|
|
152
|
-
|
|
153
|
-
requestAnimationFrame(updateProgress);
|
|
290
|
+
requestAnimationFrame(scheduleDismiss);
|
|
154
291
|
}
|
|
155
292
|
}
|
|
156
293
|
function closeAllConfirmModals() {
|
|
@@ -205,8 +342,17 @@ function confirmModal(opts) {
|
|
|
205
342
|
document.body.appendChild($overlay);
|
|
206
343
|
});
|
|
207
344
|
}
|
|
208
|
-
|
|
209
|
-
|
|
345
|
+
// ── Inspector console banner ──────────────────────────────────────────────────
|
|
346
|
+
// Logged once on page load so it is visible in DevTools history when the console
|
|
347
|
+
// is opened. The message is harmless if the inspector is disabled.
|
|
348
|
+
(function printInspectorBanner() {
|
|
349
|
+
const url = window.location.origin + '/@pp-dev/inspector';
|
|
350
|
+
console.log('%cpp-dev%c 🔍 Request Inspector → %c%s', 'background:#6e8efb;color:#fff;padding:2px 8px;border-radius:4px;font-weight:700;font-size:11px', 'color:#a0a0b8;font-size:11px', 'color:#a78bfa;font-size:11px;text-decoration:underline', url);
|
|
351
|
+
})();
|
|
352
|
+
// Use Vite's HMR context when available; otherwise fall back to a raw-WebSocket
|
|
353
|
+
// shim so the dev panel also works under the `pp-dev next` server (no Vite HMR).
|
|
354
|
+
const hot = import.meta.hot ?? createPPDevHotContext();
|
|
355
|
+
if (hot) {
|
|
210
356
|
const CLOSED_CLASS = 'closed';
|
|
211
357
|
const CLOSED_CLASS_STORAGE_KEY = 'pp-dev-info-closed';
|
|
212
358
|
hot.on('redirect', (data) => {
|
|
@@ -252,7 +398,8 @@ if (import.meta.hot) {
|
|
|
252
398
|
const $syncButton = document.getElementById('sync-template');
|
|
253
399
|
if ($syncButton) {
|
|
254
400
|
hot.on('template:sync:action-required', async (payload) => {
|
|
255
|
-
|
|
401
|
+
// Keep the sync spinner running while a confirmation modal is shown — the sync
|
|
402
|
+
// process is still in progress and only ends on `template:sync:response`.
|
|
256
403
|
const approved = await confirmModal({
|
|
257
404
|
title: payload.title,
|
|
258
405
|
content: payload.content,
|
|
@@ -263,9 +410,6 @@ if (import.meta.hot) {
|
|
|
263
410
|
requestId: payload.requestId,
|
|
264
411
|
approved,
|
|
265
412
|
});
|
|
266
|
-
if (approved) {
|
|
267
|
-
$syncButton.classList.add('syncing');
|
|
268
|
-
}
|
|
269
413
|
});
|
|
270
414
|
hot.on('template:sync:response', (payload) => {
|
|
271
415
|
closeAllConfirmModals();
|
|
@@ -274,7 +418,6 @@ if (import.meta.hot) {
|
|
|
274
418
|
infoPopup({
|
|
275
419
|
title: 'Sync cancelled',
|
|
276
420
|
content: payload.message,
|
|
277
|
-
className: 'pp-dev-info__popup--warning',
|
|
278
421
|
type: 'warning',
|
|
279
422
|
});
|
|
280
423
|
}
|
|
@@ -282,7 +425,7 @@ if (import.meta.hot) {
|
|
|
282
425
|
infoPopup({
|
|
283
426
|
title: 'Sync error',
|
|
284
427
|
content: payload.error,
|
|
285
|
-
|
|
428
|
+
type: 'danger',
|
|
286
429
|
});
|
|
287
430
|
if (payload.refresh) {
|
|
288
431
|
setTimeout(() => {
|
|
@@ -299,7 +442,7 @@ if (import.meta.hot) {
|
|
|
299
442
|
infoPopup({
|
|
300
443
|
title: 'Sync success',
|
|
301
444
|
content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.<br />Backup filename: ${payload.backupFilename}`,
|
|
302
|
-
|
|
445
|
+
type: 'success',
|
|
303
446
|
});
|
|
304
447
|
}
|
|
305
448
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../src/client/index.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport './assets/css/client.scss';\nimport './index.html';\n\nfunction checkLocalStorage() {\n try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction setStorageItem(key: string, value: string) {\n if (checkLocalStorage()) {\n localStorage.setItem(key, value);\n }\n}\n\nfunction getStorageItem(key: string) {\n if (checkLocalStorage()) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nfunction removeStorageItem(key: string) {\n if (checkLocalStorage()) {\n localStorage.removeItem(key);\n }\n}\n\ninterface InfoPopupOptions {\n title: string;\n content: string;\n style?: string;\n className?: string;\n duration?: number;\n onClose?: () => void;\n type?: 'success' | 'danger' | 'info' | 'warning';\n}\n\ninterface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ninterface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\nlet activePopups = 0;\nconst POPUP_OFFSET = 10;\nconst POPUP_HEIGHT = 100;\nconst ANIMATION_DURATION = 300;\nconst CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay';\n\nconst activeConfirmModals = new Map<\n HTMLDivElement,\n { resolve: (value: boolean) => void; onKeyDown: (event: KeyboardEvent) => void }\n>();\n\nfunction teardownConfirmModal(overlay: HTMLDivElement, result: boolean) {\n const entry = activeConfirmModals.get(overlay);\n\n if (!entry) {\n return;\n }\n\n document.removeEventListener('keydown', entry.onKeyDown);\n \n activeConfirmModals.delete(overlay);\n overlay.remove();\n entry.resolve(result);\n}\n\nfunction createPopupElement(opts: InfoPopupOptions): HTMLDivElement {\n const $popup = document.createElement('div');\n\n $popup.classList.add('pp-dev-info-namespace');\n\n const typeClass = opts.type ? `pp-dev-info__popup--${opts.type}` : '';\n\n const template = `\n <div class=\"pp-dev-info__popup ${typeClass} ${opts.className || ''}\" style=\"${opts.style || ''}\">\n <div class=\"pp-dev-info__popup-title\">\n <div class=\"pp-dev-info__popup-title-text\">${opts.title}</div>\n <div class=\"pp-dev-info__popup-title-close\">\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18\"></path>\n <path d=\"M6 6l12 12\"></path>\n </svg>\n </div>\n </div>\n <div class=\"pp-dev-info__popup-content\">${opts.content}</div>\n <div class=\"pp-dev-info__popup-progress\"></div>\n </div>\n `;\n\n $popup.innerHTML = template;\n\n return $popup;\n}\n\nfunction updatePopupPositions() {\n const popups = document.querySelectorAll<HTMLElement>('.pp-dev-info-namespace:not(.pp-dev-info)');\n const $devPanel = document.querySelector('.pp-dev-info');\n\n // Update popup positions\n popups.forEach((popup, index: number) => {\n const top = POPUP_OFFSET + index * (POPUP_HEIGHT + POPUP_OFFSET);\n popup.style.top = `${top}px`;\n });\n\n // Ensure dev panel stays at the bottom\n if ($devPanel) {\n ($devPanel as HTMLElement).style.top = 'auto';\n ($devPanel as HTMLElement).style.bottom = '0';\n }\n}\n\nfunction animatePopup($popup: HTMLDivElement, type: 'enter' | 'exit') {\n return new Promise<void>((resolve) => {\n const $popupContent = $popup.querySelector('.pp-dev-info-namespace');\n\n if (!$popupContent) {\n return resolve();\n }\n\n if (type === 'enter') {\n $popupContent.classList.add('entering');\n\n requestAnimationFrame(() => {\n $popupContent.classList.remove('entering');\n\n resolve();\n });\n } else {\n $popupContent.classList.add('exiting');\n\n setTimeout(() => {\n $popupContent.classList.remove('exiting');\n\n resolve();\n }, ANIMATION_DURATION);\n }\n });\n}\n\nfunction infoPopup(opts: InfoPopupOptions) {\n const $popup = createPopupElement(opts);\n const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');\n const $progressBar = $popup.querySelector('.pp-dev-info__popup-progress');\n\n const removePopup = async () => {\n await animatePopup($popup, 'exit');\n\n $popup.remove();\n\n activePopups--;\n\n updatePopupPositions();\n\n opts.onClose?.();\n };\n\n $closeButton?.addEventListener('click', removePopup);\n document.body.appendChild($popup);\n\n // Position the popup\n activePopups++;\n updatePopupPositions();\n\n // Animate entrance\n animatePopup($popup, 'enter');\n\n const duration = opts.duration ?? 10000;\n\n if (duration > 0) {\n let remainingTime = duration;\n let lastUpdate = Date.now();\n let isVisible = true;\n\n // Update progress bar\n const updateProgress = () => {\n if (!isVisible) {\n return;\n }\n\n const now = Date.now();\n const elapsed = now - lastUpdate;\n remainingTime -= elapsed;\n lastUpdate = now;\n\n if (remainingTime <= 0) {\n removePopup();\n\n return;\n }\n\n const progress = (remainingTime / duration) * 100;\n if ($progressBar) {\n ($progressBar as HTMLElement).style.width = `${progress}%`;\n }\n\n requestAnimationFrame(updateProgress);\n };\n\n // Handle visibility change\n document.addEventListener('visibilitychange', () => {\n isVisible = !document.hidden;\n\n if (isVisible) {\n lastUpdate = Date.now();\n requestAnimationFrame(updateProgress);\n }\n });\n\n // Start progress bar animation\n requestAnimationFrame(updateProgress);\n }\n}\n\nfunction closeAllConfirmModals() {\n for (const overlay of [...activeConfirmModals.keys()]) {\n teardownConfirmModal(overlay, false);\n }\n}\n\nfunction confirmModal(opts: ConfirmModalOptions): Promise<boolean> {\n closeAllConfirmModals();\n\n return new Promise<boolean>((resolve) => {\n const $overlay = document.createElement('div');\n\n $overlay.classList.add('pp-dev-info-namespace', CONFIRM_MODAL_OVERLAY_CLASS);\n\n const $confirm = document.createElement('div');\n\n $confirm.classList.add('pp-dev-info__confirm');\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__confirm-title');\n $title.textContent = opts.title;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__confirm-content');\n $content.textContent = opts.content;\n\n const $actions = document.createElement('div');\n\n $actions.classList.add('pp-dev-info__confirm-actions');\n\n const $cancelButton = document.createElement('button');\n\n $cancelButton.type = 'button';\n $cancelButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--cancel');\n $cancelButton.textContent = opts.cancelText;\n\n const $confirmButton = document.createElement('button');\n\n $confirmButton.type = 'button';\n $confirmButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--confirm');\n $confirmButton.textContent = opts.confirmText;\n\n $actions.append($cancelButton, $confirmButton);\n $confirm.append($title, $content, $actions);\n $overlay.appendChild($confirm);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n teardownConfirmModal($overlay, false);\n }\n };\n\n activeConfirmModals.set($overlay, { resolve, onKeyDown });\n\n $confirmButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, true);\n });\n\n $cancelButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, false);\n });\n\n $overlay.addEventListener('click', (event) => {\n if (event.target === $overlay) {\n teardownConfirmModal($overlay, false);\n }\n });\n\n document.addEventListener('keydown', onKeyDown);\n document.body.appendChild($overlay);\n });\n}\n\nif (import.meta.hot) {\n const { hot } = import.meta;\n\n const CLOSED_CLASS = 'closed';\n const CLOSED_CLASS_STORAGE_KEY = 'pp-dev-info-closed';\n\n hot.on('redirect', (data: { url: string }) => {\n window.location.href = data.url;\n });\n\n hot.on('client:config:update', (data: { config: { [key: string]: any } }) => {\n if (typeof data.config?.canSync === 'boolean') {\n if (data.config.canSync) {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = false;\n $syncButton.classList.remove('disabled');\n $syncButton.title = 'Sync template';\n }\n } else {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n }\n }\n });\n\n let isClosed = getStorageItem(CLOSED_CLASS_STORAGE_KEY) === 'true' || false;\n\n const $infoPanel = document.querySelector('.pp-dev-info');\n\n const $minimizeButtonWrap = document.querySelector('.pp-dev-info__wrap-btn');\n const $minimizeButtonSVG = $minimizeButtonWrap?.querySelector('svg');\n\n if ($infoPanel && $minimizeButtonWrap && $minimizeButtonSVG) {\n if (isClosed) {\n $infoPanel.classList.add(CLOSED_CLASS);\n $minimizeButtonSVG.classList.add(CLOSED_CLASS);\n }\n\n $minimizeButtonWrap.addEventListener('click', (e: Event) => {\n e.preventDefault();\n\n $infoPanel.classList.toggle(CLOSED_CLASS);\n $minimizeButtonSVG.classList.toggle(CLOSED_CLASS);\n\n isClosed = !isClosed;\n\n setStorageItem(CLOSED_CLASS_STORAGE_KEY, isClosed ? 'true' : 'false');\n });\n }\n\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n hot.on('template:sync:action-required', async (payload: SyncActionRequiredPayload) => {\n $syncButton.classList.remove('syncing');\n\n const approved = await confirmModal({\n title: payload.title,\n content: payload.content,\n confirmText: payload.confirmText,\n cancelText: payload.cancelText,\n });\n\n hot.send('template:sync:action-response', {\n requestId: payload.requestId,\n approved,\n });\n\n if (approved) {\n $syncButton.classList.add('syncing');\n }\n });\n\n hot.on(\n 'template:sync:response',\n (\n payload:\n | { syncedAt: string; currentHash: string; backupFilename: string }\n | { error: string; config?: { [p: string]: any }; refresh?: boolean }\n | { cancelled: boolean; message: string },\n ) => {\n closeAllConfirmModals();\n $syncButton.classList.remove('syncing');\n\n if ('cancelled' in payload && payload.cancelled) {\n infoPopup({\n title: 'Sync cancelled',\n content: payload.message,\n className: 'pp-dev-info__popup--warning',\n type: 'warning',\n });\n } else if ('error' in payload && typeof payload.error !== 'undefined') {\n infoPopup({\n title: 'Sync error',\n content: payload.error,\n className: 'pp-dev-info__popup--danger',\n });\n\n if (payload.refresh) {\n setTimeout(() => {\n window.location.reload();\n });\n } else {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n } else if ('syncedAt' in payload && typeof payload.syncedAt !== 'undefined') {\n infoPopup({\n title: 'Sync success',\n content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.<br />Backup filename: ${\n payload.backupFilename\n }`,\n className: 'pp-dev-info__popup--success',\n });\n }\n },\n );\n\n $syncButton.addEventListener('click', (ev: Event) => {\n ev.preventDefault();\n\n $syncButton.classList.add('syncing');\n\n hot.send('template:sync', {});\n });\n }\n}\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../src/client/hot-context.ts","../../src/client/index.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\n\n/**\n * Minimal `import.meta.hot`-compatible context for environments without Vite HMR\n * (e.g. the `pp-dev next` server). The dev-panel client only uses `hot.on()` and\n * `hot.send()`; this shim implements those over a raw WebSocket using the same\n * custom-event wire shape Vite uses: `{ type: 'custom', event, data }`.\n *\n * Used only as a fallback: when `import.meta.hot` exists (Vite), that is used\n * instead and this code never runs.\n */\n\n/**\n * WebSocket path the pp-dev Next.js server listens on for dev-panel messages.\n * Kept in sync with `PP_DEV_HMR_WS_PATH` in `src/constants.ts` (server side).\n */\nconst PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\ntype CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\ntype Handler = (payload: any) => void;\n\nconst MAX_OUTBOX_SIZE = 50;\n\nfunction resolveWebSocketUrl(): string {\n const { protocol, host } = window.location;\n const wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';\n\n return `${wsProtocol}//${host}${PP_DEV_HMR_WS_PATH}`;\n}\n\nexport function createPPDevHotContext(): ViteHotContext {\n const handlers = new Map<string, Set<Handler>>();\n /** Outgoing messages queued while the socket is not OPEN; flushed on connect. */\n const outbox: string[] = [];\n\n let socket: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let reconnectDelay = 1_000;\n const MAX_RECONNECT_DELAY = 10_000;\n\n const flushOutbox = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n while (outbox.length > 0) {\n socket.send(outbox.shift()!);\n }\n };\n\n const dispatch = (event: string, data: unknown) => {\n const eventHandlers = handlers.get(event);\n\n if (!eventHandlers) {\n return;\n }\n\n for (const handler of eventHandlers) {\n try {\n handler(data);\n } catch (err) {\n // A failing handler must not break dispatch to the others.\n console.error(`[pp-dev] hot handler for \"${event}\" failed`, err);\n }\n }\n };\n\n const connect = () => {\n try {\n socket = new WebSocket(resolveWebSocketUrl());\n } catch (err) {\n console.error('[pp-dev] failed to open dev-panel WebSocket', err);\n scheduleReconnect();\n\n return;\n }\n\n socket.addEventListener('open', () => {\n reconnectDelay = 1_000;\n flushOutbox();\n });\n\n socket.addEventListener('message', (ev) => {\n let message: CustomMessage;\n\n try {\n message = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n } catch {\n return;\n }\n\n if (message && message.type === 'custom' && typeof message.event === 'string') {\n dispatch(message.event, message.data);\n }\n });\n\n socket.addEventListener('close', () => {\n socket = null;\n scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n // `close` follows `error`; reconnect is scheduled there.\n socket?.close();\n });\n };\n\n const scheduleReconnect = () => {\n if (reconnectTimer) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);\n connect();\n }, reconnectDelay);\n };\n\n connect();\n\n const noop = () => {};\n\n const context: Pick<ViteHotContext, 'on' | 'off' | 'send'> & Partial<ViteHotContext> = {\n on(event, cb) {\n let set = handlers.get(event);\n\n if (!set) {\n set = new Set();\n handlers.set(event, set);\n }\n\n set.add(cb as Handler);\n },\n off(event, cb) {\n handlers.get(event)?.delete(cb as Handler);\n },\n send(event, data) {\n const payload = JSON.stringify({ type: 'custom', event, data } satisfies CustomMessage);\n\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(payload);\n } else {\n if (outbox.length >= MAX_OUTBOX_SIZE) {\n outbox.shift();\n }\n\n outbox.push(payload);\n }\n },\n // Unused by the dev-panel client; provided as no-ops to satisfy the shape.\n accept: noop as ViteHotContext['accept'],\n acceptExports: noop as ViteHotContext['acceptExports'],\n dispose: noop,\n prune: noop,\n invalidate: noop,\n data: {},\n };\n\n return context as ViteHotContext;\n}\n","/// <reference types=\"vite/client\" />\nimport './assets/css/client.scss';\nimport './index.html';\nimport { createPPDevHotContext } from './hot-context.js';\n\nfunction checkLocalStorage() {\n try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction setStorageItem(key: string, value: string) {\n if (checkLocalStorage()) {\n localStorage.setItem(key, value);\n }\n}\n\nfunction getStorageItem(key: string) {\n if (checkLocalStorage()) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nfunction removeStorageItem(key: string) {\n if (checkLocalStorage()) {\n localStorage.removeItem(key);\n }\n}\n\ninterface InfoPopupOptions {\n title: string;\n content: string;\n style?: string;\n className?: string;\n duration?: number;\n onClose?: () => void;\n type?: 'success' | 'danger' | 'info' | 'warning';\n}\n\ninterface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ninterface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\nlet activePopups = 0;\nconst POPUP_OFFSET = 10;\nconst POPUP_HEIGHT = 100;\nconst ANIMATION_DURATION = 300;\nconst CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay';\n\nconst activeConfirmModals = new Map<\n HTMLDivElement,\n { resolve: (value: boolean) => void; onKeyDown: (event: KeyboardEvent) => void }\n>();\n\nconst ICON_SIZE = 16;\nconst CLOSE_ICON_SIZE = 12;\n\nfunction teardownConfirmModal(overlay: HTMLDivElement, result: boolean) {\n const entry = activeConfirmModals.get(overlay);\n\n if (!entry) {\n return;\n }\n\n document.removeEventListener('keydown', entry.onKeyDown);\n\n activeConfirmModals.delete(overlay);\n overlay.remove();\n entry.resolve(result);\n}\n\nconst TYPE_ICONS: Record<NonNullable<InfoPopupOptions['type']>, string> = {\n success: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m9 12 2 2 4-4\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 8v4\"/><path d=\"M12 16h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n info: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`,\n};\n\nfunction createPopupElement(opts: InfoPopupOptions): HTMLDivElement {\n const $popup = document.createElement('div');\n\n $popup.classList.add('pp-dev-info-namespace');\n\n const typeClass = opts.type ? `pp-dev-info__popup--${opts.type}` : '';\n const iconHtml = opts.type ? `<div class=\"pp-dev-info__popup-title-icon\">${TYPE_ICONS[opts.type]}</div>` : '';\n\n const template = `\n <div class=\"pp-dev-info__popup ${typeClass} ${opts.className || ''}\" style=\"${opts.style || ''}\">\n <div class=\"pp-dev-info__popup-title\">\n ${iconHtml}\n <div class=\"pp-dev-info__popup-title-text\">${opts.title}</div>\n <div class=\"pp-dev-info__popup-title-close\">\n <svg\n viewBox=\"0 0 24 24\"\n width=\"${CLOSE_ICON_SIZE}\"\n height=\"${CLOSE_ICON_SIZE}\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18\"></path>\n <path d=\"M6 6l12 12\"></path>\n </svg>\n </div>\n </div>\n <div class=\"pp-dev-info__popup-content\">${opts.content}</div>\n </div>\n `;\n\n $popup.innerHTML = template;\n\n return $popup;\n}\n\nfunction updatePopupPositions() {\n const popups = document.querySelectorAll<HTMLElement>('.pp-dev-info-namespace:not(.pp-dev-info)');\n const $devPanel = document.querySelector('.pp-dev-info');\n\n // Update popup positions\n popups.forEach((popup, index: number) => {\n const top = POPUP_OFFSET + index * (POPUP_HEIGHT + POPUP_OFFSET);\n const $popupContent = popup.querySelector<HTMLElement>('.pp-dev-info__popup');\n\n if ($popupContent) {\n $popupContent.style.top = `${top}px`;\n }\n });\n\n // Ensure dev panel stays at the bottom\n if ($devPanel) {\n ($devPanel as HTMLElement).style.top = 'auto';\n ($devPanel as HTMLElement).style.bottom = '0';\n }\n}\n\nfunction animatePopup($popup: HTMLDivElement, type: 'enter' | 'exit') {\n return new Promise<void>((resolve) => {\n const $popupContent = $popup.querySelector('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return resolve();\n }\n\n if (type === 'enter') {\n $popupContent.classList.add('entering');\n\n requestAnimationFrame(() => {\n $popupContent.classList.remove('entering');\n\n resolve();\n });\n } else {\n $popupContent.classList.add('exiting');\n\n setTimeout(() => {\n $popupContent.classList.remove('exiting');\n\n resolve();\n }, ANIMATION_DURATION);\n }\n });\n}\n\nfunction infoPopup(opts: InfoPopupOptions) {\n const $popup = createPopupElement(opts);\n const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');\n\n const removePopup = async () => {\n await animatePopup($popup, 'exit');\n\n $popup.remove();\n\n activePopups--;\n\n updatePopupPositions();\n\n opts.onClose?.();\n };\n\n $closeButton?.addEventListener('click', removePopup);\n document.body.appendChild($popup);\n\n // Position the popup\n activePopups++;\n updatePopupPositions();\n\n // Animate entrance\n animatePopup($popup, 'enter');\n\n const duration = opts.duration ?? 10000;\n\n if (duration > 0) {\n let remainingTime = duration;\n let lastUpdate = Date.now();\n let isVisible = true;\n\n const scheduleDismiss = () => {\n if (!isVisible) {\n return;\n }\n\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n remainingTime -= elapsed;\n lastUpdate = now;\n\n if (remainingTime <= 0) {\n removePopup();\n\n return;\n }\n\n requestAnimationFrame(scheduleDismiss);\n };\n\n // Handle visibility change\n document.addEventListener('visibilitychange', () => {\n isVisible = !document.hidden;\n\n if (isVisible) {\n lastUpdate = Date.now();\n requestAnimationFrame(scheduleDismiss);\n }\n });\n\n requestAnimationFrame(scheduleDismiss);\n }\n}\n\nfunction closeAllConfirmModals() {\n for (const overlay of [...activeConfirmModals.keys()]) {\n teardownConfirmModal(overlay, false);\n }\n}\n\nfunction confirmModal(opts: ConfirmModalOptions): Promise<boolean> {\n closeAllConfirmModals();\n\n return new Promise<boolean>((resolve) => {\n const $overlay = document.createElement('div');\n\n $overlay.classList.add('pp-dev-info-namespace', CONFIRM_MODAL_OVERLAY_CLASS);\n\n const $confirm = document.createElement('div');\n\n $confirm.classList.add('pp-dev-info__confirm');\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__confirm-title');\n $title.textContent = opts.title;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__confirm-content');\n $content.textContent = opts.content;\n\n const $actions = document.createElement('div');\n\n $actions.classList.add('pp-dev-info__confirm-actions');\n\n const $cancelButton = document.createElement('button');\n\n $cancelButton.type = 'button';\n $cancelButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--cancel');\n $cancelButton.textContent = opts.cancelText;\n\n const $confirmButton = document.createElement('button');\n\n $confirmButton.type = 'button';\n $confirmButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--confirm');\n $confirmButton.textContent = opts.confirmText;\n\n $actions.append($cancelButton, $confirmButton);\n $confirm.append($title, $content, $actions);\n $overlay.appendChild($confirm);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n teardownConfirmModal($overlay, false);\n }\n };\n\n activeConfirmModals.set($overlay, { resolve, onKeyDown });\n\n $confirmButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, true);\n });\n\n $cancelButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, false);\n });\n\n $overlay.addEventListener('click', (event) => {\n if (event.target === $overlay) {\n teardownConfirmModal($overlay, false);\n }\n });\n\n document.addEventListener('keydown', onKeyDown);\n document.body.appendChild($overlay);\n });\n}\n\n// ── Inspector console banner ──────────────────────────────────────────────────\n// Logged once on page load so it is visible in DevTools history when the console\n// is opened. The message is harmless if the inspector is disabled.\n(function printInspectorBanner() {\n const url = window.location.origin + '/@pp-dev/inspector';\n\n console.log(\n '%cpp-dev%c 🔍 Request Inspector → %c%s',\n 'background:#6e8efb;color:#fff;padding:2px 8px;border-radius:4px;font-weight:700;font-size:11px',\n 'color:#a0a0b8;font-size:11px',\n 'color:#a78bfa;font-size:11px;text-decoration:underline',\n url,\n );\n})();\n\n// Use Vite's HMR context when available; otherwise fall back to a raw-WebSocket\n// shim so the dev panel also works under the `pp-dev next` server (no Vite HMR).\nconst hot = import.meta.hot ?? createPPDevHotContext();\n\nif (hot) {\n const CLOSED_CLASS = 'closed';\n const CLOSED_CLASS_STORAGE_KEY = 'pp-dev-info-closed';\n\n hot.on('redirect', (data: { url: string }) => {\n window.location.href = data.url;\n });\n\n hot.on('client:config:update', (data: { config: { [key: string]: any } }) => {\n if (typeof data.config?.canSync === 'boolean') {\n if (data.config.canSync) {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = false;\n $syncButton.classList.remove('disabled');\n $syncButton.title = 'Sync template';\n }\n } else {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n }\n }\n });\n\n let isClosed = getStorageItem(CLOSED_CLASS_STORAGE_KEY) === 'true' || false;\n\n const $infoPanel = document.querySelector('.pp-dev-info');\n\n const $minimizeButtonWrap = document.querySelector('.pp-dev-info__wrap-btn');\n const $minimizeButtonSVG = $minimizeButtonWrap?.querySelector('svg');\n\n if ($infoPanel && $minimizeButtonWrap && $minimizeButtonSVG) {\n if (isClosed) {\n $infoPanel.classList.add(CLOSED_CLASS);\n $minimizeButtonSVG.classList.add(CLOSED_CLASS);\n }\n\n $minimizeButtonWrap.addEventListener('click', (e: Event) => {\n e.preventDefault();\n\n $infoPanel.classList.toggle(CLOSED_CLASS);\n $minimizeButtonSVG.classList.toggle(CLOSED_CLASS);\n\n isClosed = !isClosed;\n\n setStorageItem(CLOSED_CLASS_STORAGE_KEY, isClosed ? 'true' : 'false');\n });\n }\n\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n hot.on('template:sync:action-required', async (payload: SyncActionRequiredPayload) => {\n // Keep the sync spinner running while a confirmation modal is shown — the sync\n // process is still in progress and only ends on `template:sync:response`.\n const approved = await confirmModal({\n title: payload.title,\n content: payload.content,\n confirmText: payload.confirmText,\n cancelText: payload.cancelText,\n });\n\n hot.send('template:sync:action-response', {\n requestId: payload.requestId,\n approved,\n });\n });\n\n hot.on(\n 'template:sync:response',\n (\n payload:\n | { syncedAt: string; currentHash: string; backupFilename: string }\n | { error: string; config?: { [p: string]: any }; refresh?: boolean }\n | { cancelled: boolean; message: string },\n ) => {\n closeAllConfirmModals();\n $syncButton.classList.remove('syncing');\n\n if ('cancelled' in payload && payload.cancelled) {\n infoPopup({\n title: 'Sync cancelled',\n content: payload.message,\n type: 'warning',\n });\n } else if ('error' in payload && typeof payload.error !== 'undefined') {\n infoPopup({\n title: 'Sync error',\n content: payload.error,\n type: 'danger',\n });\n\n if (payload.refresh) {\n setTimeout(() => {\n window.location.reload();\n });\n } else {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n } else if ('syncedAt' in payload && typeof payload.syncedAt !== 'undefined') {\n infoPopup({\n title: 'Sync success',\n content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.<br />Backup filename: ${\n payload.backupFilename\n }`,\n type: 'success',\n });\n }\n },\n );\n\n $syncButton.addEventListener('click', (ev: Event) => {\n ev.preventDefault();\n\n $syncButton.classList.add('syncing');\n\n hot.send('template:sync', {});\n });\n }\n}\n"],"names":[],"mappings":"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","x_google_ignoreList":[0,1]}
|