dekit-cli 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,4 +6,4 @@
6
6
  * https://github.com/KingSora
7
7
  *
8
8
  * Released under the MIT license.
9
- */.os-size-observer,.os-size-observer-listener{scroll-behavior:auto!important;direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport]),[data-overlayscrollbars-viewport~=scrollbarHidden],html[data-overlayscrollbars-viewport~=scrollbarHidden]>body{scrollbar-width:none!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar,[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar-corner{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars]):not(html):not(body){overflow:auto}html[data-overlayscrollbars-body]{overflow:hidden}html[data-overlayscrollbars-body],html[data-overlayscrollbars-body]>body{width:100%;height:100%;margin:0}html[data-overlayscrollbars-body]>body{overflow:visible;margin:0}[data-overlayscrollbars]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;align-items:stretch!important;flex-direction:row!important;flex-wrap:nowrap!important;scroll-behavior:auto!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){box-sizing:inherit;position:relative;flex:auto;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){--os-vaw: 0;--os-vah: 0;outline:none}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]):focus{outline:none}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{overflow:hidden!important}[data-overlayscrollbars~=host][data-overlayscrollbars~=noClipping],[data-overlayscrollbars-padding~=noClipping]{overflow:visible!important}[data-overlayscrollbars-viewport]{--os-viewport-overflow-x: hidden;--os-viewport-overflow-y: hidden;overflow-x:var(--os-viewport-overflow-x);overflow-y:var(--os-viewport-overflow-y)}[data-overlayscrollbars-viewport~=overflowXVisible]{--os-viewport-overflow-x: visible}[data-overlayscrollbars-viewport~=overflowXHidden]{--os-viewport-overflow-x: hidden}[data-overlayscrollbars-viewport~=overflowXScroll]{--os-viewport-overflow-x: scroll}[data-overlayscrollbars-viewport~=overflowYVisible]{--os-viewport-overflow-y: visible}[data-overlayscrollbars-viewport~=overflowYHidden]{--os-viewport-overflow-y: hidden}[data-overlayscrollbars-viewport~=overflowYScroll]{--os-viewport-overflow-y: scroll}[data-overlayscrollbars-viewport~=overflowImportant]{overflow-x:var(--os-viewport-overflow-x)!important;overflow-y:var(--os-viewport-overflow-y)!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId){font-size:0!important;line-height:0!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):before,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):after,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)>*:not(#osFakeId){display:none!important;position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border-width:0!important}[data-overlayscrollbars-viewport~=measuring],[data-overlayscrollbars-viewport~=scrolling]{scroll-behavior:auto!important;scroll-snap-type:none!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowXVisible]{overflow-x:hidden!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowYVisible]{overflow-y:hidden!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-contents]:not(#osFakeId):not([data-overlayscrollbars-padding]):not([data-overlayscrollbars-viewport]):not([data-overlayscrollbars-content]){display:contents}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}@property --os-scroll-percent{syntax: "<number>"; inherits: true; initial-value: 0;}@property --os-viewport-percent{syntax: "<number>"; inherits: true; initial-value: 0;}.os-scrollbar{--os-viewport-percent: 0;--os-scroll-percent: 0;--os-scroll-direction: 0;--os-scroll-percent-directional: calc( var(--os-scroll-percent) - (var(--os-scroll-percent) + (1 - var(--os-scroll-percent)) * -1) * var(--os-scroll-direction) )}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none!important}.os-scrollbar-track{position:relative;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hide.os-scrollbar-auto-hide-hidden{opacity:0;visibility:hidden}.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important;transition:none!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0;left:calc(var(--os-scroll-percent-directional) * 100%);transform:translate(calc(var(--os-scroll-percent-directional) * -100%));width:calc(var(--os-viewport-percent) * 100%)}.os-scrollbar-vertical .os-scrollbar-handle{right:0;top:calc(var(--os-scroll-percent-directional) * 100%);transform:translateY(calc(var(--os-scroll-percent-directional) * -100%));height:calc(var(--os-viewport-percent) * 100%)}@supports (container-type: size){.os-scrollbar-track{container-type:size}.os-scrollbar-horizontal .os-scrollbar-handle{left:auto;transform:translate(calc(var(--os-scroll-percent-directional) * 100cqw + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-vertical .os-scrollbar-handle{top:auto;transform:translateY(calc(var(--os-scroll-percent-directional) * 100cqh + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-rtl.os-scrollbar-horizontal .os-scrollbar-handle{right:auto;left:0}}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}@media print{.os-scrollbar{display:none}}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-track:before,.os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-track:before{top:calc(var(--os-padding-perpendicular) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-track:before{left:calc(var(--os-padding-perpendicular) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars-viewport~=measuring]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden;height:100vh;background:#1e1e1e;color:#ccc}#root{height:100vh}.editor-layout{display:flex;height:100vh}.left-panel{width:240px;background:#252526;border-right:1px solid #4a4a4a;display:flex;flex-direction:column;overflow:hidden}.center-panel{flex:1;background:#1e1e1e;display:flex;flex-direction:column;align-items:stretch;padding:0;min-width:0}.right-panel{width:280px;background:#252526;border-left:1px solid #4a4a4a;display:flex;flex-direction:column;overflow:hidden}.right-panel-top{flex:0 0 35%;display:flex;flex-direction:column;overflow:hidden;border-bottom:1px solid #4a4a4a}.right-panel-top .layer-tree-scroll{flex:1}.right-panel-bottom{flex:1;display:flex;flex-direction:column;overflow:hidden}.right-panel-bottom .properties-scroll,.page-list-scroll{flex:1}.panel-header{height:28px;display:flex;align-items:center;padding:0 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:#969696;background:#3c3c3c;border-bottom:1px solid #4a4a4a;-webkit-user-select:none;user-select:none;flex-shrink:0}.page-list{list-style:none}.page-item{padding:6px 12px;cursor:pointer;font-size:13px;color:#ccc;-webkit-user-select:none;user-select:none}.page-item:hover,.page-item.active{background:#2a2d2e}.page-list.focused .page-item.active{background:#37373d;color:#fff}.page-list:focus{outline:none}.canvas-iframe{width:100%;height:100%;border:1px solid #3c3c3c;border-radius:4px;background:#fff}.layer-tree{padding:4px 0;font-size:13px}.layer-node{padding:3px 0;cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;color:#ccc}.layer-node:hover,.layer-node.selected{background:#2a2d2e}.layer-tree.focused .layer-node.selected{background:#37373d;color:#fff}.layer-tree:focus{outline:none}.layer-tag{color:#569cd6}.layer-class{color:#9cdcfe;margin-left:4px;font-size:11px}.property-section{padding:8px 12px;border-bottom:1px solid #3c3c3c}.node-ref{cursor:pointer;color:#e2c08d;white-space:nowrap}.node-ref:hover{color:#f5d9a0}.property-value.copyable{cursor:pointer}.property-value.copyable:hover{color:#e0a56a}.property-section-title{font-size:11px;font-weight:600;text-transform:uppercase;color:#969696;margin-bottom:6px}.property-row{display:flex;justify-content:space-between;padding:2px 0;font-size:12px}.property-key{color:#9cdcfe}.property-value{color:#ce9178;text-align:right;max-width:150px;overflow:hidden;text-overflow:ellipsis}.empty-state{padding:24px;text-align:center;color:#969696;font-size:13px}.device-toolbar{display:flex;align-items:center;justify-content:center;gap:12px;padding:0 16px;height:28px;background:#3c3c3c;border-bottom:1px solid #4a4a4a;font-size:12px;line-height:1;color:#ccc;-webkit-user-select:none;user-select:none;flex-shrink:0}.device-toolbar>*{flex-shrink:0}.device-toolbar select{background:transparent;border:none;color:#ccc;padding:0 4px;height:20px;font-size:12px;line-height:20px;outline:none;cursor:pointer}.device-toolbar select:hover{color:#fff}.device-toolbar select:focus{color:#fff}.device-toolbar .dim-input{background:transparent;border:none;border-bottom:1px solid transparent;color:#ccc;padding:0 2px;height:20px;text-align:center;font-size:12px;line-height:20px;outline:none;min-width:3ch}.device-toolbar .dim-input:hover:not(:disabled){border-bottom-color:#666}.device-toolbar .dim-input:focus:not(:disabled){color:#fff;border-bottom-color:#2563eb}.device-toolbar .dim-input:disabled{color:#999;cursor:default;-moz-appearance:textfield}.device-toolbar .dim-input::-webkit-inner-spin-button,.device-toolbar .dim-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.device-toolbar .dim-separator{color:#999;margin:0 -4px;flex-shrink:0}.device-toolbar .toolbar-btn{background:transparent;border:none;color:#999;padding:0 4px;height:20px;border-radius:3px;cursor:pointer;font-size:14px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.device-toolbar .toolbar-btn:hover{color:#fff}.device-toolbar .toolbar-btn.active{color:#2563eb}.device-toolbar .dpr-badge{font-size:11px;color:#999;height:20px;line-height:20px}.device-toolbar .toolbar-divider{width:1px;height:14px;background:#555;flex-shrink:0}.canvas-area{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;position:relative;padding:24px;min-height:0;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.15) transparent}.canvas-area::-webkit-scrollbar{width:6px;height:6px}.canvas-area::-webkit-scrollbar-track{background:transparent}.canvas-area::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}.canvas-area::-webkit-scrollbar-thumb:hover{background:#ffffff40}.canvas-area::-webkit-scrollbar-corner{background:transparent}.canvas-area.with-grid{background:repeating-conic-gradient(#1a1a1a,#1a1a1a 25%,#1e1e1e 0%,#1e1e1e 50%) 0 0 / 16px 16px}.iframe-wrapper{flex-shrink:0;overflow:hidden;border-radius:4px}.iframe-wrapper .canvas-iframe{display:block;width:100%;height:100%;border:none;border-radius:4px;background:#fff;box-shadow:0 2px 16px #0006}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:#fff3}.os-theme-dark>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:#ffffff59}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:#ffffff73}.os-theme-dark>.os-scrollbar{--os-size: 6px;--os-padding-perpendicular: 1px;--os-padding-axis: 1px}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{border:1px solid rgba(255,255,255,.15)}.context-menu{position:fixed;z-index:10000;background:#2d2d2d;border:1px solid #4a4a4a;border-radius:4px;padding:4px 0;min-width:120px;box-shadow:0 4px 12px #00000080}.context-menu-item{padding:6px 12px;font-size:12px;color:#ccc;cursor:pointer;-webkit-user-select:none;user-select:none}.context-menu-item:hover{background:#094771;color:#fff}
9
+ */.os-size-observer,.os-size-observer-listener{scroll-behavior:auto!important;direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport]),[data-overlayscrollbars-viewport~=scrollbarHidden],html[data-overlayscrollbars-viewport~=scrollbarHidden]>body{scrollbar-width:none!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar,[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar-corner{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars]):not(html):not(body){overflow:auto}html[data-overlayscrollbars-body]{overflow:hidden}html[data-overlayscrollbars-body],html[data-overlayscrollbars-body]>body{width:100%;height:100%;margin:0}html[data-overlayscrollbars-body]>body{overflow:visible;margin:0}[data-overlayscrollbars]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;align-items:stretch!important;flex-direction:row!important;flex-wrap:nowrap!important;scroll-behavior:auto!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){box-sizing:inherit;position:relative;flex:auto;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){--os-vaw: 0;--os-vah: 0;outline:none}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]):focus{outline:none}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{overflow:hidden!important}[data-overlayscrollbars~=host][data-overlayscrollbars~=noClipping],[data-overlayscrollbars-padding~=noClipping]{overflow:visible!important}[data-overlayscrollbars-viewport]{--os-viewport-overflow-x: hidden;--os-viewport-overflow-y: hidden;overflow-x:var(--os-viewport-overflow-x);overflow-y:var(--os-viewport-overflow-y)}[data-overlayscrollbars-viewport~=overflowXVisible]{--os-viewport-overflow-x: visible}[data-overlayscrollbars-viewport~=overflowXHidden]{--os-viewport-overflow-x: hidden}[data-overlayscrollbars-viewport~=overflowXScroll]{--os-viewport-overflow-x: scroll}[data-overlayscrollbars-viewport~=overflowYVisible]{--os-viewport-overflow-y: visible}[data-overlayscrollbars-viewport~=overflowYHidden]{--os-viewport-overflow-y: hidden}[data-overlayscrollbars-viewport~=overflowYScroll]{--os-viewport-overflow-y: scroll}[data-overlayscrollbars-viewport~=overflowImportant]{overflow-x:var(--os-viewport-overflow-x)!important;overflow-y:var(--os-viewport-overflow-y)!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId){font-size:0!important;line-height:0!important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):before,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId):after,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)>*:not(#osFakeId){display:none!important;position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border-width:0!important}[data-overlayscrollbars-viewport~=measuring],[data-overlayscrollbars-viewport~=scrolling]{scroll-behavior:auto!important;scroll-snap-type:none!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowXVisible]{overflow-x:hidden!important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowYVisible]{overflow-y:hidden!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-contents]:not(#osFakeId):not([data-overlayscrollbars-padding]):not([data-overlayscrollbars-viewport]):not([data-overlayscrollbars-content]){display:contents}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}@property --os-scroll-percent{syntax: "<number>"; inherits: true; initial-value: 0;}@property --os-viewport-percent{syntax: "<number>"; inherits: true; initial-value: 0;}.os-scrollbar{--os-viewport-percent: 0;--os-scroll-percent: 0;--os-scroll-direction: 0;--os-scroll-percent-directional: calc( var(--os-scroll-percent) - (var(--os-scroll-percent) + (1 - var(--os-scroll-percent)) * -1) * var(--os-scroll-direction) )}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none!important}.os-scrollbar-track{position:relative;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hide.os-scrollbar-auto-hide-hidden{opacity:0;visibility:hidden}.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important;transition:none!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0;left:calc(var(--os-scroll-percent-directional) * 100%);transform:translate(calc(var(--os-scroll-percent-directional) * -100%));width:calc(var(--os-viewport-percent) * 100%)}.os-scrollbar-vertical .os-scrollbar-handle{right:0;top:calc(var(--os-scroll-percent-directional) * 100%);transform:translateY(calc(var(--os-scroll-percent-directional) * -100%));height:calc(var(--os-viewport-percent) * 100%)}@supports (container-type: size){.os-scrollbar-track{container-type:size}.os-scrollbar-horizontal .os-scrollbar-handle{left:auto;transform:translate(calc(var(--os-scroll-percent-directional) * 100cqw + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-vertical .os-scrollbar-handle{top:auto;transform:translateY(calc(var(--os-scroll-percent-directional) * 100cqh + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-rtl.os-scrollbar-horizontal .os-scrollbar-handle{right:auto;left:0}}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}@media print{.os-scrollbar{display:none}}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-track:before,.os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-track:before{top:calc(var(--os-padding-perpendicular) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-track:before{left:calc(var(--os-padding-perpendicular) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars-viewport~=measuring]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden;height:100vh;background:#1e1e1e;color:#ccc}#root{height:100vh}.editor-layout{display:flex;height:100vh}.left-panel{width:240px;background:#252526;border-right:1px solid #4a4a4a;display:flex;flex-direction:column;overflow:hidden}.center-panel{flex:1;background:#1e1e1e;display:flex;flex-direction:column;align-items:stretch;padding:0;min-width:0}.right-panel{width:280px;background:#252526;border-left:1px solid #4a4a4a;display:flex;flex-direction:column;overflow:hidden}.right-panel-top{flex:0 0 35%;display:flex;flex-direction:column;overflow:hidden;border-bottom:1px solid #4a4a4a}.right-panel-top .layer-tree-scroll{flex:1}.right-panel-bottom{flex:1;display:flex;flex-direction:column;overflow:hidden}.right-panel-bottom .properties-scroll,.page-list-scroll{flex:1}.panel-header{height:28px;display:flex;align-items:center;padding:0 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:#969696;background:#3c3c3c;border-bottom:1px solid #4a4a4a;-webkit-user-select:none;user-select:none;flex-shrink:0}.page-list{list-style:none}.page-item{padding:6px 12px;cursor:pointer;font-size:13px;color:#ccc;-webkit-user-select:none;user-select:none}.page-item:hover{background:#2a2d2e}.page-item.active{background:#333639;color:#e0e0e0}.page-list.focused .page-item.active{background:#37373d;color:#fff}.page-list:focus{outline:none}.canvas-iframe{width:100%;height:100%;border:1px solid #3c3c3c;border-radius:4px;background:#fff}.layer-tree{padding:4px 0;font-size:13px}.layer-node{padding:3px 0;cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;color:#ccc}.layer-node:hover{background:#2a2d2e}.layer-node.selected{background:#333639;color:#e0e0e0}.layer-tree.focused .layer-node.selected{background:#37373d;color:#fff}.layer-tree:focus{outline:none}.layer-tag{color:#569cd6}.layer-class{color:#9cdcfe;margin-left:4px;font-size:11px}.property-section{padding:8px 12px;border-bottom:1px solid #3c3c3c}.node-ref{cursor:pointer;color:#e2c08d;white-space:nowrap}.node-ref:hover{color:#f5d9a0}.property-value.copyable{cursor:pointer}.property-value.copyable:hover{color:#e0a56a}.property-section-title{font-size:11px;font-weight:600;text-transform:uppercase;color:#969696;margin-bottom:6px}.property-row{display:flex;justify-content:space-between;padding:2px 0;font-size:12px}.property-key{color:#9cdcfe}.property-value{color:#ce9178;text-align:right;max-width:150px;overflow:hidden;text-overflow:ellipsis}.empty-state{padding:24px;text-align:center;color:#969696;font-size:13px}.device-toolbar{display:flex;align-items:center;justify-content:center;gap:12px;padding:0 16px;height:28px;background:#3c3c3c;border-bottom:1px solid #4a4a4a;font-size:12px;line-height:1;color:#ccc;-webkit-user-select:none;user-select:none;flex-shrink:0}.device-toolbar>*{flex-shrink:0}.device-toolbar select{background:transparent;border:none;color:#ccc;padding:0 4px;height:20px;font-size:12px;line-height:20px;outline:none;cursor:pointer}.device-toolbar select:hover{color:#fff}.device-toolbar select:focus{color:#fff}.device-toolbar .dim-input{background:transparent;border:none;border-bottom:1px solid transparent;color:#ccc;padding:0 2px;height:20px;text-align:center;font-size:12px;line-height:20px;outline:none;min-width:3ch}.device-toolbar .dim-input:hover:not(:disabled){border-bottom-color:#666}.device-toolbar .dim-input:focus:not(:disabled){color:#fff;border-bottom-color:#2563eb}.device-toolbar .dim-input:disabled{color:#999;cursor:default;-moz-appearance:textfield}.device-toolbar .dim-input::-webkit-inner-spin-button,.device-toolbar .dim-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.device-toolbar .dim-separator{color:#999;margin:0 -4px;flex-shrink:0}.device-toolbar .toolbar-btn{background:transparent;border:none;color:#999;padding:0 4px;height:20px;border-radius:3px;cursor:pointer;font-size:14px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.device-toolbar .toolbar-btn:hover{color:#fff}.device-toolbar .toolbar-btn.active{color:#2563eb}.device-toolbar .dpr-badge{font-size:11px;color:#999;height:20px;line-height:20px}.device-toolbar .toolbar-divider{width:1px;height:14px;background:#555;flex-shrink:0}.canvas-area{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;position:relative;padding:24px;min-height:0;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.15) transparent}.canvas-area::-webkit-scrollbar{width:6px;height:6px}.canvas-area::-webkit-scrollbar-track{background:transparent}.canvas-area::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}.canvas-area::-webkit-scrollbar-thumb:hover{background:#ffffff40}.canvas-area::-webkit-scrollbar-corner{background:transparent}.canvas-area.with-grid{background:repeating-conic-gradient(#1a1a1a,#1a1a1a 25%,#1e1e1e 0%,#1e1e1e 50%) 0 0 / 16px 16px}.iframe-wrapper{flex-shrink:0;overflow:hidden;border-radius:4px}.iframe-wrapper .canvas-iframe{display:block;width:100%;height:100%;border:none;border-radius:4px;background:#fff;box-shadow:0 2px 16px #0006}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:#fff3}.os-theme-dark>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:#ffffff59}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:#ffffff73}.os-theme-dark>.os-scrollbar{--os-size: 6px;--os-padding-perpendicular: 1px;--os-padding-axis: 1px}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{border:1px solid rgba(255,255,255,.15)}.context-menu{position:fixed;z-index:10000;background:#2d2d2d;border:1px solid #4a4a4a;border-radius:4px;padding:4px 0;min-width:120px;box-shadow:0 4px 12px #00000080}.context-menu-item{padding:6px 12px;font-size:12px;color:#ccc;cursor:pointer;-webkit-user-select:none;user-select:none}.context-menu-item:hover{background:#094771;color:#fff}
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Dekit Editor</title>
7
- <script type="module" crossorigin src="/assets/index-yt1AtkL3.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-Bx5YsS46.css">
7
+ <script type="module" crossorigin src="/assets/index-D16Bm-Rw.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-HLKs1tz-.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -67,10 +67,23 @@ export function App() {
67
67
  if (msg.type === "NODE_SELECTED") {
68
68
  setSelectedNode(msg.node);
69
69
  setSelectedPath(msg.node.path);
70
- if (inspectModeRef.current && currentPageRef.current) {
71
- navigator.clipboard.writeText(getNodeRef(currentPageRef.current, msg.node.cssSelector));
72
- iframeRef.current?.contentWindow?.postMessage({ type: "COPY_FEEDBACK" }, "*");
70
+ } else if (msg.type === "CONTEXT_MENU") {
71
+ setSelectedNode(msg.node);
72
+ setSelectedPath(msg.node.path);
73
+ // Convert iframe-local coordinates to editor coordinates
74
+ const iframe = iframeRef.current;
75
+ if (iframe) {
76
+ const iframeRect = iframe.getBoundingClientRect();
77
+ const sf = scaleFactor;
78
+ setContextMenu({
79
+ x: iframeRect.left + msg.x * sf,
80
+ y: iframeRect.top + msg.y * sf,
81
+ cssSelector: msg.node.cssSelector,
82
+ page: currentPageRef.current,
83
+ });
73
84
  }
85
+ } else if (msg.type === "DISMISS_CONTEXT_MENU") {
86
+ setContextMenu(null);
74
87
  } else if (msg.type === "DOM_TREE") {
75
88
  setDomTree(msg.tree);
76
89
  } else if (msg.type === "INSPECT_KEY") {
@@ -151,15 +164,18 @@ export function App() {
151
164
  currentPageRef.current = currentPage;
152
165
  }, [currentPage]);
153
166
 
154
- // Dismiss context menu on click or iframe focus
167
+ // Dismiss context menu on click, freeze iframe while open
155
168
  useEffect(() => {
156
169
  if (!contextMenu) return;
170
+ const iframeWin = iframeRef.current?.contentWindow;
171
+ iframeWin?.postMessage({ type: "SET_SCROLL_LOCK", enabled: true }, "*");
172
+ iframeWin?.postMessage({ type: "SET_FROZEN", enabled: true }, "*");
157
173
  function dismiss() { setContextMenu(null); }
158
174
  window.addEventListener("click", dismiss);
159
- window.addEventListener("blur", dismiss);
160
175
  return () => {
161
176
  window.removeEventListener("click", dismiss);
162
- window.removeEventListener("blur", dismiss);
177
+ iframeWin?.postMessage({ type: "SET_SCROLL_LOCK", enabled: false }, "*");
178
+ iframeWin?.postMessage({ type: "SET_FROZEN", enabled: false }, "*");
163
179
  };
164
180
  }, [contextMenu]);
165
181
 
@@ -601,10 +617,20 @@ function LayerTreeNode({
601
617
  onHover: (path: string | null) => void;
602
618
  onContextMenu: (path: string, x: number, y: number) => void;
603
619
  }) {
620
+ const isSelected = node.path === selectedPath;
621
+ const ref = useCallback(
622
+ (el: HTMLDivElement | null) => {
623
+ if (el && isSelected) {
624
+ el.scrollIntoView({ block: "nearest" });
625
+ }
626
+ },
627
+ [isSelected]
628
+ );
604
629
  return (
605
630
  <>
606
631
  <div
607
- className={`layer-node ${node.path === selectedPath ? "selected" : ""}`}
632
+ ref={ref}
633
+ className={`layer-node ${isSelected ? "selected" : ""}`}
608
634
  style={{ paddingLeft: 12 + depth * 16 }}
609
635
  onClick={() => onSelect(node.path)}
610
636
  onMouseEnter={() => onHover(node.path)}
@@ -109,7 +109,8 @@ body {
109
109
  }
110
110
 
111
111
  .page-item.active {
112
- background: #2a2d2e;
112
+ background: #333639;
113
+ color: #e0e0e0;
113
114
  }
114
115
 
115
116
  .page-list.focused .page-item.active {
@@ -148,7 +149,8 @@ body {
148
149
  }
149
150
 
150
151
  .layer-node.selected {
151
- background: #2a2d2e;
152
+ background: #333639;
153
+ color: #e0e0e0;
152
154
  }
153
155
 
154
156
  .layer-tree.focused .layer-node.selected {
@@ -8,4 +8,10 @@ export default defineConfig({
8
8
  outDir: "../dist/editor",
9
9
  emptyOutDir: true,
10
10
  },
11
+ server: {
12
+ port: 5173,
13
+ proxy: {
14
+ "/api": "http://localhost:7980",
15
+ },
16
+ },
11
17
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dekit-cli",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "A code-first design toolkit for agents and humans — create, preview, and screenshot HTML/CSS designs",
6
6
  "keywords": [
@@ -38,7 +38,8 @@
38
38
  "dekit": "./bin/dekit.js"
39
39
  },
40
40
  "scripts": {
41
- "dev": "node --import tsx bin/dekit.ts",
41
+ "dev": "node --import tsx bin/dekit.ts serve -c example/dekit.yaml",
42
+ "dev:editor": "vite dev --config editor/vite.config.ts",
42
43
  "build:editor": "vite build --config editor/vite.config.ts",
43
44
  "test": "vitest run",
44
45
  "prepublishOnly": "npm run build:editor"
@@ -3,15 +3,14 @@ import type { DesignConfig } from "./types.js";
3
3
  import { dekitPlugin } from "./vite-plugin-dekit.js";
4
4
 
5
5
  export async function startDesignServer(
6
- configRef: { current: DesignConfig },
7
- port: number
6
+ configRef: { current: DesignConfig }
8
7
  ): Promise<ViteDevServer> {
9
8
  const server = await createServer({
10
9
  configFile: false,
11
10
  root: configRef.current.baseDir,
12
11
  server: {
13
- port,
14
- strictPort: true,
12
+ port: 0,
13
+ strictPort: false,
15
14
  cors: true,
16
15
  },
17
16
  plugins: [dekitPlugin(configRef)],
@@ -19,6 +18,8 @@ export async function startDesignServer(
19
18
  });
20
19
 
21
20
  await server.listen();
21
+ const address = server.httpServer!.address();
22
+ const port = typeof address === "object" && address ? address.port : 0;
22
23
  console.log(` Design server running at http://localhost:${port}`);
23
24
  return server;
24
25
  }
@@ -4,6 +4,7 @@ export function generateInspectorScript(): string {
4
4
  let overlay = null;
5
5
  let selectedNode = null;
6
6
  let inspectEnabled = false;
7
+ let frozen = false;
7
8
  let pageName = '';
8
9
 
9
10
  function isOverlayEl(el) {
@@ -246,6 +247,12 @@ export function generateInspectorScript(): string {
246
247
  }
247
248
 
248
249
  document.addEventListener('click', function(e) {
250
+ if (frozen) {
251
+ e.preventDefault();
252
+ e.stopPropagation();
253
+ window.parent.postMessage({ type: 'DISMISS_CONTEXT_MENU' }, '*');
254
+ return;
255
+ }
249
256
  if (!inspectEnabled) return;
250
257
  e.preventDefault();
251
258
  e.stopPropagation();
@@ -256,8 +263,24 @@ export function generateInspectorScript(): string {
256
263
  window.parent.postMessage({ type: 'NODE_SELECTED', node: info }, '*');
257
264
  }, true);
258
265
 
266
+ document.addEventListener('contextmenu', function(e) {
267
+ e.preventDefault();
268
+ var node = e.target;
269
+ if (isOverlayEl(node)) return;
270
+ selectedNode = node;
271
+ frozen = true;
272
+ showOverlay(node);
273
+ var info = getNodeInfo(node);
274
+ window.parent.postMessage({
275
+ type: 'CONTEXT_MENU',
276
+ node: info,
277
+ x: e.clientX,
278
+ y: e.clientY
279
+ }, '*');
280
+ }, true);
281
+
259
282
  document.addEventListener('mouseover', function(e) {
260
- if (!inspectEnabled) return;
283
+ if (frozen || !inspectEnabled) return;
261
284
  const node = e.target;
262
285
  if (isOverlayEl(node)) return;
263
286
  showOverlay(node);
@@ -266,7 +289,7 @@ export function generateInspectorScript(): string {
266
289
  }, true);
267
290
 
268
291
  document.addEventListener('mouseout', function(e) {
269
- if (!inspectEnabled) return;
292
+ if (frozen || !inspectEnabled) return;
270
293
  const related = e.relatedTarget;
271
294
  if (related && isOverlayEl(related)) return;
272
295
  hideOverlay();
@@ -318,9 +341,20 @@ export function generateInspectorScript(): string {
318
341
  } else {
319
342
  if (touchStyle) touchStyle.remove();
320
343
  }
344
+ } else if (msg.type === 'SET_FROZEN') {
345
+ frozen = !!msg.enabled;
346
+ if (!frozen) {
347
+ hideOverlay();
348
+ }
349
+ } else if (msg.type === 'SET_SCROLL_LOCK') {
350
+ if (msg.enabled) {
351
+ document.body.style.overflow = 'hidden';
352
+ } else {
353
+ document.body.style.overflow = '';
354
+ }
321
355
  } else if (msg.type === 'SET_INSPECT_MODE') {
322
356
  inspectEnabled = !!msg.enabled;
323
- if (!inspectEnabled) {
357
+ if (!inspectEnabled && !frozen) {
324
358
  hideOverlay();
325
359
  }
326
360
  } else if (msg.type === 'SET_PAGE_NAME') {
package/src/server.ts CHANGED
@@ -1,27 +1,53 @@
1
1
  import type { DesignConfig } from "./types.js";
2
2
  import { startDesignServer } from "./design-server.js";
3
3
  import { startEditorServer } from "./editor-server.js";
4
+ import { createServer } from "node:net";
5
+
6
+ const DEFAULT_PORT = 7980;
4
7
 
5
8
  export interface ServerOptions {
6
9
  config: DesignConfig;
7
- port: number;
8
- designPort: number;
10
+ port?: number;
9
11
  noOpen?: boolean;
10
12
  }
11
13
 
14
+ async function findAvailablePort(preferred: number): Promise<number> {
15
+ return new Promise((resolve, reject) => {
16
+ const srv = createServer();
17
+ srv.listen(preferred, () => {
18
+ srv.close(() => resolve(preferred));
19
+ });
20
+ srv.on("error", () => {
21
+ // Preferred port taken, use random
22
+ const srv2 = createServer();
23
+ srv2.listen(0, () => {
24
+ const addr = srv2.address();
25
+ const port = typeof addr === "object" && addr ? addr.port : 0;
26
+ srv2.close(() => resolve(port));
27
+ });
28
+ srv2.on("error", reject);
29
+ });
30
+ });
31
+ }
32
+
12
33
  export async function startServers(options: ServerOptions) {
13
34
  const configRef = { current: options.config };
14
35
 
15
36
  console.log("\n Dekit Dev Server\n");
16
37
 
17
- const designServer = await startDesignServer(configRef, options.designPort);
38
+ const designServer = await startDesignServer(configRef);
39
+ const designAddr = designServer.httpServer!.address();
40
+ const designPort =
41
+ typeof designAddr === "object" && designAddr ? designAddr.port : 0;
42
+
43
+ const editorPort = await findAvailablePort(options.port ?? DEFAULT_PORT);
18
44
  const editorServer = await startEditorServer(
19
45
  configRef,
20
- options.port,
21
- options.designPort
46
+ editorPort,
47
+ designPort
22
48
  );
23
49
 
24
- const editorUrl = `http://localhost:${options.port}`;
50
+ const editorUrl = `http://localhost:${editorPort}`;
25
51
  console.log(`\n Open ${editorUrl} in your browser\n`);
26
52
 
27
53
  // Try to open browser
@@ -34,6 +34,7 @@ export async function assemblePageHtml(
34
34
  <head>
35
35
  <meta charset="UTF-8">
36
36
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
37
+ <script type="module" src="/@vite/client"></script>
37
38
  <link rel="stylesheet" href="/@design/${config.globalStyle}">
38
39
  <link rel="stylesheet" href="/@design/${pageDef.style}">
39
40
  </head>