@arpproject/recrate 0.1.21 → 0.1.23

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.
@@ -1,5 +1,17 @@
1
+ interface NavigationTabState {
2
+ scrollTop?: number;
3
+ expandedSections?: string[];
4
+ selectedItems?: string[];
5
+ }
6
+ interface NavigationState {
7
+ activeTab?: string;
8
+ tabStates?: Record<string, NavigationTabState>;
9
+ uiState?: Record<string, any>;
10
+ }
1
11
  interface State {
2
12
  id: string;
13
+ tab?: string;
14
+ navigationState?: NavigationState;
3
15
  [key: string]: any;
4
16
  }
5
17
  /**
@@ -14,9 +26,8 @@ export declare class EditorState {
14
26
  history: State[];
15
27
  current: number;
16
28
  constructor();
17
- /**
18
- * Reset the internal state
19
- */
29
+ private hydrate;
30
+ private persist;
20
31
  reset(): void;
21
32
  /**
22
33
  * Push a new state onto the history stack
@@ -47,6 +58,9 @@ export declare class EditorState {
47
58
  * @param {Object} an object to be merged into the current entry
48
59
  */
49
60
  update(newState: State): void;
61
+ updateNavigationState(navigationState: NavigationState): void;
62
+ getNavigationState(id?: string): NavigationState | undefined;
63
+ prune(validIds: Set<string>): void;
50
64
  /**
51
65
  * Delete a property from the current entry
52
66
  *
package/dist/recrate.css CHANGED
@@ -1,3 +1,3 @@
1
- .el-tabs__item{height:unset}.el-select-dropdown__wrap{max-height:500px!important}.el-select-group__title{font-size:14px!important}.scrollbar{overflow:overlay}.scrollbar::-webkit-scrollbar{background-color:#0000;height:16px;width:16px;z-index:999999}.scrollbar::-webkit-scrollbar-track{background-color:#0000}.scrollbar::-webkit-scrollbar-thumb{background-color:#0000;border:0 solid #fff;border-radius:16px}.scrollbar::-webkit-scrollbar-button{display:none}.scrollbar:hover::-webkit-scrollbar-thumb{background-color:#a0a0a5;border:4px solid #fff}.scrollbar::-webkit-scrollbar-thumb:hover{background-color:#a0a0a5;border:4px solid #f4f4f4}.cm-editor{font-size:12px;height:auto;max-height:none;overflow:visible}.cm-editor .cm-scroller{overflow:visible!important}.describo-tab-icon{align-items:center;display:flex;font-size:14px;font-weight:600;height:100%;justify-content:center;width:100%}.describo-add-only-tabs .ant-tabs-nav,.describo-add-only-tabs .ant-tabs-nav-wrap{height:100%}.describo-add-only-tabs .ant-tabs-nav-list{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center}.describo-add-only-tabs .ant-tabs-tab{justify-content:center}.describo-tabs-vertical-center-add .ant-tabs-nav,.describo-tabs-vertical-center-add .ant-tabs-nav-wrap{height:100%}.describo-tabs-vertical-center-add .ant-tabs-nav-list{height:100%;position:relative}.describo-tabs-vertical-center-add .ant-tabs-tab-add-button{align-items:center;display:flex;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.recrate,.recrate .recrate-ant{display:flex;flex-direction:column;height:100vh;min-height:100vh}.describo-editor-scroll{height:100%;overflow-y:auto;overscroll-behavior:contain}.recrate .ant-tabs-left .ant-tabs-nav,.recrate .ant-tabs-right .ant-tabs-nav{height:100%}.recrate .ant-tabs-left .ant-tabs-nav-wrap,.recrate .ant-tabs-right .ant-tabs-nav-wrap{overflow-y:auto}.recrate .ant-tabs-bottom .ant-tabs-nav-wrap,.recrate .ant-tabs-top .ant-tabs-nav-wrap{overflow-x:auto}
2
- /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-200:oklch(88.5% 0.062 18.334);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-700:oklch(50.5% 0.213 27.518);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-200:oklch(92.5% 0.084 155.995);--color-green-600:oklch(62.7% 0.194 149.214);--color-cyan-200:oklch(91.7% 0.08 205.041);--color-sky-100:oklch(95.1% 0.026 236.824);--color-sky-500:oklch(68.5% 0.169 237.323);--color-blue-100:oklch(93.2% 0.032 255.585);--color-blue-200:oklch(88.2% 0.059 254.128);--color-blue-300:oklch(80.9% 0.105 251.813);--color-blue-400:oklch(70.7% 0.165 254.624);--color-blue-500:oklch(62.3% 0.214 259.815);--color-blue-600:oklch(54.6% 0.245 262.881);--color-blue-700:oklch(48.8% 0.243 264.376);--color-indigo-200:oklch(87% 0.065 274.039);--color-purple-200:oklch(90.2% 0.063 306.703);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-700:oklch(37.2% 0.044 257.287);--color-gray-50:oklch(98.5% 0.002 247.839);--color-gray-200:oklch(92.8% 0.006 264.531);--color-gray-300:oklch(87.2% 0.01 258.338);--color-gray-400:oklch(70.7% 0.022 261.325);--color-gray-500:oklch(55.1% 0.027 264.364);--color-gray-600:oklch(44.6% 0.03 256.802);--color-gray-700:oklch(37.3% 0.034 259.733);--color-gray-800:oklch(27.8% 0.033 256.848);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--font-weight-light:300;--font-weight-medium:500;--font-weight-bold:700;--radius-lg:0.5rem;--animate-pulse:pulse 2s cubic-bezier(0.4,0,0.6,1) infinite;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:initial}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{background-color:initial;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,#0000)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:calc(var(--spacing)*0)}.z-50{z-index:50}.float-right{float:right}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.m-1{margin:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.m-4{margin:calc(var(--spacing)*4)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.h-1{height:calc(var(--spacing)*1)}.h-3{height:calc(var(--spacing)*3)}.h-8{height:calc(var(--spacing)*8)}.h-\[520px\]{height:520px}.h-full{height:100%}.w-1{width:calc(var(--spacing)*1)}.w-1\/2{width:50%}.w-1\/3{width:33.33333%}.w-2\/3{width:66.66667%}.w-2\/6{width:33.33333%}.w-3{width:calc(var(--spacing)*3)}.w-4\/6{width:66.66667%}.w-6{width:calc(var(--spacing)*6)}.w-12{width:calc(var(--spacing)*12)}.w-\[600px\]{width:600px}.w-full{width:100%}.w-screen{width:100vw}.max-w-\[715px\]{max-width:715px}.min-w-32{min-width:calc(var(--spacing)*32)}.flex-grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-between{place-content:space-between}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}}.space-y-2{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}}.space-y-4{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.space-x-1{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*1*var(--tw-space-x-reverse))}}.space-x-2{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*2*var(--tw-space-x-reverse))}}.space-x-4{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*4*var(--tw-space-x-reverse))}}.gap-y-2{row-gap:calc(var(--spacing)*2)}.divide-y{:where(&>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}}.divide-gray-300{:where(&>:not(:last-child)){border-color:var(--color-gray-300)}}.overflow-auto{overflow:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-solid{--tw-border-style:solid;border-style:solid}.border-black{border-color:var(--color-black)}.border-black\/20{border-color:color-mix(in srgb,#000 20%,#0000);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-black) 20%,#0000)}}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-700{border-color:var(--color-gray-700)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-700{border-color:var(--color-slate-700)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-700{background-color:var(--color-slate-700)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-1{padding-right:calc(var(--spacing)*1)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pl-1{padding-left:calc(var(--spacing)*1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-balance{text-wrap:balance}.text-nowrap{text-wrap:nowrap}.break-words{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.whitespace-pre-wrap{white-space:pre-wrap}.text-black{color:var(--color-black)}.text-blue-600{color:var(--color-blue-600)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-green-600{color:var(--color-green-600)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-50{opacity:50%}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.duration-1000{--tw-duration:1000ms;transition-duration:1s}.group-hover\:opacity-100{&:is(:where(.group):hover *){@media (hover:hover){opacity:100%}}}.hover\:scale-105{&:hover{@media (hover:hover){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.hover\:rounded{&:hover{@media (hover:hover){border-radius:.25rem}}}.hover\:rounded-r-none{&:hover{@media (hover:hover){border-bottom-right-radius:0;border-top-right-radius:0}}}.hover\:bg-blue-100{&:hover{@media (hover:hover){background-color:var(--color-blue-100)}}}.hover\:bg-blue-300{&:hover{@media (hover:hover){background-color:var(--color-blue-300)}}}.hover\:bg-blue-700{&:hover{@media (hover:hover){background-color:var(--color-blue-700)}}}.hover\:bg-cyan-200{&:hover{@media (hover:hover){background-color:var(--color-cyan-200)}}}.hover\:bg-green-200{&:hover{@media (hover:hover){background-color:var(--color-green-200)}}}.hover\:bg-red-700{&:hover{@media (hover:hover){background-color:var(--color-red-700)}}}.hover\:bg-sky-100{&:hover{@media (hover:hover){background-color:var(--color-sky-100)}}}.hover\:text-black{&:hover{@media (hover:hover){color:var(--color-black)}}}.focus\:border-2{&:focus{border-style:var(--tw-border-style);border-width:2px}}.focus\:border-green-600{&:focus{border-color:var(--color-green-600)}}.focus\:outline-none{&:focus{--tw-outline-style:none;outline-style:none}}.focus-visible\:ring-2{&:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\:ring-sky-500{&:focus-visible{--tw-ring-color:var(--color-sky-500)}}.focus-visible\:outline-none{&:focus-visible{--tw-outline-style:none;outline-style:none}}.active\:bg-blue-400{&:active{background-color:var(--color-blue-400)}}.xl\:w-1\/5{@media (width >= 80rem){width:20%}}.xl\:w-4\/5{@media (width >= 80rem){width:80%}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}
1
+ .el-tabs__item{height:unset}.el-select-dropdown__wrap{max-height:500px!important}.el-select-group__title{font-size:14px!important}.scrollbar{overflow:overlay}.scrollbar::-webkit-scrollbar{background-color:#0000;height:16px;width:16px;z-index:999999}.scrollbar::-webkit-scrollbar-track{background-color:#0000}.scrollbar::-webkit-scrollbar-thumb{background-color:#0000;border:0 solid #fff;border-radius:16px}.scrollbar::-webkit-scrollbar-button{display:none}.scrollbar:hover::-webkit-scrollbar-thumb{background-color:#a0a0a5;border:4px solid #fff}.scrollbar::-webkit-scrollbar-thumb:hover{background-color:#a0a0a5;border:4px solid #f4f4f4}.cm-editor{font-size:12px;height:auto;max-height:none}.describo-tab-icon{align-items:center;display:flex;font-size:14px;font-weight:600;height:100%;justify-content:center;width:100%}.describo-add-only-tabs .ant-tabs-nav,.describo-add-only-tabs .ant-tabs-nav-wrap{height:100%}.describo-add-only-tabs .ant-tabs-nav-list{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center}.describo-add-only-tabs .ant-tabs-tab{justify-content:center}.describo-tabs-vertical-center-add .ant-tabs-nav,.describo-tabs-vertical-center-add .ant-tabs-nav-wrap{height:100%}.describo-tabs-vertical-center-add .ant-tabs-nav-list{height:100%;position:relative}.describo-tabs-vertical-center-add .ant-tabs-tab-add-button{align-items:center;display:flex;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.recrate,.recrate .recrate-ant{display:flex;flex-direction:column;height:100vh;min-height:100vh}.describo-editor-scroll,.recrate .ant-tabs-left .ant-tabs-nav,.recrate .ant-tabs-right .ant-tabs-nav{height:100%}.recrate .ant-tabs-bottom .ant-tabs-nav-wrap,.recrate .ant-tabs-top .ant-tabs-nav-wrap{overflow-x:auto}
2
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-200:oklch(88.5% 0.062 18.334);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-700:oklch(50.5% 0.213 27.518);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-200:oklch(92.5% 0.084 155.995);--color-green-600:oklch(62.7% 0.194 149.214);--color-cyan-200:oklch(91.7% 0.08 205.041);--color-sky-100:oklch(95.1% 0.026 236.824);--color-sky-500:oklch(68.5% 0.169 237.323);--color-blue-100:oklch(93.2% 0.032 255.585);--color-blue-200:oklch(88.2% 0.059 254.128);--color-blue-300:oklch(80.9% 0.105 251.813);--color-blue-400:oklch(70.7% 0.165 254.624);--color-blue-500:oklch(62.3% 0.214 259.815);--color-blue-600:oklch(54.6% 0.245 262.881);--color-blue-700:oklch(48.8% 0.243 264.376);--color-indigo-200:oklch(87% 0.065 274.039);--color-purple-200:oklch(90.2% 0.063 306.703);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-700:oklch(37.2% 0.044 257.287);--color-gray-50:oklch(98.5% 0.002 247.839);--color-gray-200:oklch(92.8% 0.006 264.531);--color-gray-300:oklch(87.2% 0.01 258.338);--color-gray-400:oklch(70.7% 0.022 261.325);--color-gray-500:oklch(55.1% 0.027 264.364);--color-gray-600:oklch(44.6% 0.03 256.802);--color-gray-700:oklch(37.3% 0.034 259.733);--color-gray-800:oklch(27.8% 0.033 256.848);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--font-weight-light:300;--font-weight-medium:500;--font-weight-bold:700;--radius-lg:0.5rem;--animate-pulse:pulse 2s cubic-bezier(0.4,0,0.6,1) infinite;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:initial}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{background-color:initial;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,#0000)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:calc(var(--spacing)*0)}.z-50{z-index:50}.float-right{float:right}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.m-1{margin:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.m-4{margin:calc(var(--spacing)*4)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.h-1{height:calc(var(--spacing)*1)}.h-3{height:calc(var(--spacing)*3)}.h-8{height:calc(var(--spacing)*8)}.h-\[520px\]{height:520px}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.w-1{width:calc(var(--spacing)*1)}.w-1\/2{width:50%}.w-1\/3{width:33.33333%}.w-2\/3{width:66.66667%}.w-2\/6{width:33.33333%}.w-3{width:calc(var(--spacing)*3)}.w-4\/6{width:66.66667%}.w-6{width:calc(var(--spacing)*6)}.w-12{width:calc(var(--spacing)*12)}.w-\[600px\]{width:600px}.w-full{width:100%}.w-screen{width:100vw}.max-w-\[715px\]{max-width:715px}.min-w-32{min-width:calc(var(--spacing)*32)}.flex-1{flex:1}.flex-grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-between{place-content:space-between}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}}.space-y-2{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}}.space-y-4{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.space-x-1{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*1*var(--tw-space-x-reverse))}}.space-x-2{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*2*var(--tw-space-x-reverse))}}.space-x-4{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*4*var(--tw-space-x-reverse))}}.gap-y-2{row-gap:calc(var(--spacing)*2)}.divide-y{:where(&>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}}.divide-gray-300{:where(&>:not(:last-child)){border-color:var(--color-gray-300)}}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-solid{--tw-border-style:solid;border-style:solid}.border-black{border-color:var(--color-black)}.border-black\/20{border-color:color-mix(in srgb,#000 20%,#0000);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-black) 20%,#0000)}}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-700{border-color:var(--color-gray-700)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-700{border-color:var(--color-slate-700)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-700{background-color:var(--color-slate-700)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-1{padding-right:calc(var(--spacing)*1)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pl-1{padding-left:calc(var(--spacing)*1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-balance{text-wrap:balance}.text-nowrap{text-wrap:nowrap}.break-words{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.whitespace-pre-wrap{white-space:pre-wrap}.text-black{color:var(--color-black)}.text-blue-600{color:var(--color-blue-600)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-green-600{color:var(--color-green-600)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-50{opacity:50%}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.duration-1000{--tw-duration:1000ms;transition-duration:1s}.group-hover\:opacity-100{&:is(:where(.group):hover *){@media (hover:hover){opacity:100%}}}.hover\:scale-105{&:hover{@media (hover:hover){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.hover\:rounded{&:hover{@media (hover:hover){border-radius:.25rem}}}.hover\:rounded-r-none{&:hover{@media (hover:hover){border-bottom-right-radius:0;border-top-right-radius:0}}}.hover\:bg-blue-100{&:hover{@media (hover:hover){background-color:var(--color-blue-100)}}}.hover\:bg-blue-300{&:hover{@media (hover:hover){background-color:var(--color-blue-300)}}}.hover\:bg-blue-700{&:hover{@media (hover:hover){background-color:var(--color-blue-700)}}}.hover\:bg-cyan-200{&:hover{@media (hover:hover){background-color:var(--color-cyan-200)}}}.hover\:bg-green-200{&:hover{@media (hover:hover){background-color:var(--color-green-200)}}}.hover\:bg-red-700{&:hover{@media (hover:hover){background-color:var(--color-red-700)}}}.hover\:bg-sky-100{&:hover{@media (hover:hover){background-color:var(--color-sky-100)}}}.hover\:text-black{&:hover{@media (hover:hover){color:var(--color-black)}}}.focus\:border-2{&:focus{border-style:var(--tw-border-style);border-width:2px}}.focus\:border-green-600{&:focus{border-color:var(--color-green-600)}}.focus\:outline-none{&:focus{--tw-outline-style:none;outline-style:none}}.focus-visible\:ring-2{&:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\:ring-sky-500{&:focus-visible{--tw-ring-color:var(--color-sky-500)}}.focus-visible\:outline-none{&:focus-visible{--tw-outline-style:none;outline-style:none}}.active\:bg-blue-400{&:active{background-color:var(--color-blue-400)}}.xl\:w-1\/5{@media (width >= 80rem){width:20%}}.xl\:w-4\/5{@media (width >= 80rem){width:80%}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}
3
3
  .recrate{all:revert-layer}
@@ -67349,17 +67349,39 @@ function useStore(api2, selector = identity) {
67349
67349
  React__default.useDebugValue(slice2);
67350
67350
  return slice2;
67351
67351
  }
67352
+ const STORAGE_KEY = "recrate.editor-state.v1";
67352
67353
  let EditorState$1 = class EditorState {
67353
67354
  constructor() {
67354
- this.history = [];
67355
- this.current = 0;
67355
+ const hydrated = this.hydrate();
67356
+ this.history = (hydrated == null ? void 0 : hydrated.history) ?? [];
67357
+ this.current = (hydrated == null ? void 0 : hydrated.current) ?? 0;
67358
+ }
67359
+ hydrate() {
67360
+ if (typeof window === "undefined") return null;
67361
+ try {
67362
+ const raw = window.sessionStorage.getItem(STORAGE_KEY);
67363
+ if (!raw) return null;
67364
+ const data = JSON.parse(raw);
67365
+ if (!Array.isArray(data == null ? void 0 : data.history)) return null;
67366
+ return {
67367
+ history: data.history,
67368
+ current: Math.max(0, Math.min(Number(data.current) || 0, data.history.length - 1))
67369
+ };
67370
+ } catch {
67371
+ return null;
67372
+ }
67373
+ }
67374
+ persist() {
67375
+ if (typeof window === "undefined") return;
67376
+ try {
67377
+ window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ history: this.history, current: this.current }));
67378
+ } catch {
67379
+ }
67356
67380
  }
67357
- /**
67358
- * Reset the internal state
67359
- */
67360
67381
  reset() {
67361
67382
  this.history = [];
67362
67383
  this.current = 0;
67384
+ this.persist();
67363
67385
  }
67364
67386
  /**
67365
67387
  * Push a new state onto the history stack
@@ -67378,6 +67400,7 @@ let EditorState$1 = class EditorState {
67378
67400
  }
67379
67401
  this.history = [...this.history, { id: id2 }];
67380
67402
  this.current = this.history.length - 1;
67403
+ this.persist();
67381
67404
  }
67382
67405
  /**
67383
67406
  * Go back through the state
@@ -67385,6 +67408,7 @@ let EditorState$1 = class EditorState {
67385
67408
  back() {
67386
67409
  if (this.current === 0) return;
67387
67410
  this.current -= 1;
67411
+ this.persist();
67388
67412
  }
67389
67413
  /**
67390
67414
  * Go forward through the state
@@ -67392,6 +67416,7 @@ let EditorState$1 = class EditorState {
67392
67416
  forward() {
67393
67417
  if (this.current === this.history.length - 1) return;
67394
67418
  this.current += 1;
67419
+ this.persist();
67395
67420
  }
67396
67421
  /**
67397
67422
  * Return the current entry
@@ -67412,6 +67437,44 @@ let EditorState$1 = class EditorState {
67412
67437
  */
67413
67438
  update(newState) {
67414
67439
  this.history[this.current] = { ...this.history[this.current], ...newState };
67440
+ this.persist();
67441
+ }
67442
+ updateNavigationState(navigationState) {
67443
+ var _a2, _b;
67444
+ const latest = this.latest();
67445
+ if (!latest) return;
67446
+ this.update({
67447
+ ...latest,
67448
+ navigationState: {
67449
+ ...latest.navigationState ?? {},
67450
+ ...navigationState,
67451
+ tabStates: {
67452
+ ...((_a2 = latest.navigationState) == null ? void 0 : _a2.tabStates) ?? {},
67453
+ ...navigationState.tabStates ?? {}
67454
+ },
67455
+ uiState: {
67456
+ ...((_b = latest.navigationState) == null ? void 0 : _b.uiState) ?? {},
67457
+ ...navigationState.uiState ?? {}
67458
+ }
67459
+ }
67460
+ });
67461
+ }
67462
+ getNavigationState(id2) {
67463
+ var _a2;
67464
+ if (!id2) {
67465
+ return (_a2 = this.latest()) == null ? void 0 : _a2.navigationState;
67466
+ }
67467
+ for (let i = this.history.length - 1; i >= 0; i -= 1) {
67468
+ const entry = this.history[i];
67469
+ if ((entry == null ? void 0 : entry.id) !== id2) continue;
67470
+ if (entry.navigationState) return entry.navigationState;
67471
+ }
67472
+ return void 0;
67473
+ }
67474
+ prune(validIds) {
67475
+ this.history = this.history.filter((entry) => validIds.has(entry.id));
67476
+ this.current = this.history.length === 0 ? 0 : Math.min(this.current, this.history.length - 1);
67477
+ this.persist();
67415
67478
  }
67416
67479
  /**
67417
67480
  * Delete a property from the current entry
@@ -67421,6 +67484,7 @@ let EditorState$1 = class EditorState {
67421
67484
  */
67422
67485
  deleteFromState({ property }) {
67423
67486
  delete this.history[this.current][property];
67487
+ this.persist();
67424
67488
  }
67425
67489
  /**
67426
67490
  * Replace an id in the state
@@ -67435,13 +67499,8 @@ let EditorState$1 = class EditorState {
67435
67499
  replaceId({ id: id2, newId }) {
67436
67500
  this.history = this.history.slice(0, -1);
67437
67501
  this.current = this.history.length - 1;
67438
- this.history = this.history.map((e3, i) => {
67439
- if (e3.id === id2) {
67440
- return { ...e3, id: newId };
67441
- } else {
67442
- return e3;
67443
- }
67444
- });
67502
+ this.history = this.history.map((e3) => e3.id === id2 ? { ...e3, id: newId } : e3);
67503
+ this.persist();
67445
67504
  }
67446
67505
  };
67447
67506
  const createStateStore = () => createStore((set2) => ({
@@ -106637,6 +106696,7 @@ const RenderControls = ({
106637
106696
  var _a2, _b, _c, _d, _e2, _f;
106638
106697
  const { t: t2 } = useTranslation();
106639
106698
  const state = useStateStore();
106699
+ const debugNav = (...args) => console.log("[recrate-nav-debug][controls]", ...args);
106640
106700
  const [dialogs, setDialogs] = useState({
106641
106701
  previewCrate: false,
106642
106702
  editContext: false,
@@ -106666,17 +106726,25 @@ const RenderControls = ({
106666
106726
  const canGoForward = state.editorState.canForward();
106667
106727
  const handleBack = () => {
106668
106728
  if (!canGoBack) return;
106729
+ const before = state.editorState.latest();
106730
+ debugNav("back.click", { currentEntity: entity["@id"], before });
106669
106731
  onBack();
106670
106732
  const latest = state.editorState.latest();
106733
+ debugNav("back.afterPointerMove", { latest });
106671
106734
  if (latest == null ? void 0 : latest.id) {
106735
+ debugNav("back.loadEntity", { id: latest.id, updateState: false });
106672
106736
  onLoadEntity({ id: latest.id, updateState: false });
106673
106737
  }
106674
106738
  };
106675
106739
  const handleForward = () => {
106676
106740
  if (!canGoForward) return;
106741
+ const before = state.editorState.latest();
106742
+ debugNav("forward.click", { currentEntity: entity["@id"], before });
106677
106743
  onForward();
106678
106744
  const latest = state.editorState.latest();
106745
+ debugNav("forward.afterPointerMove", { latest });
106679
106746
  if (latest == null ? void 0 : latest.id) {
106747
+ debugNav("forward.loadEntity", { id: latest.id, updateState: false });
106680
106748
  onLoadEntity({ id: latest.id, updateState: false });
106681
106749
  }
106682
106750
  };
@@ -110557,26 +110625,93 @@ const RenderEntity = forwardRef((props, ref) => {
110557
110625
  const clamped = Math.max(minClamp, Math.min(maxClamp, Math.round(w2)));
110558
110626
  localStorage.setItem("recrate.verticalTabWidth", String(clamped));
110559
110627
  }, 200), [iconView]);
110560
- const [contentHeight, setContentHeight] = useState(0);
110628
+ const [scrollViewportHeight, setScrollViewportHeight] = useState(0);
110629
+ const [scrollRestoreNonce, setScrollRestoreNonce] = useState(0);
110561
110630
  const contentContainerRef = useRef(null);
110562
110631
  const activeContentRef = useRef(null);
110563
- const computeContentHeight = useMemo$1(() => debounce(() => {
110564
- const top2 = contentContainerRef.current ? contentContainerRef.current.getBoundingClientRect().top : 0;
110565
- const viewport = window.innerHeight - top2;
110566
- const content2 = activeContentRef.current ? activeContentRef.current.scrollHeight : 0;
110567
- const h = Math.max(200, viewport, content2);
110568
- setContentHeight(h);
110569
- }, 100), []);
110632
+ const editorPanelRef = useRef(null);
110633
+ const navigationRestoreReadyRef = useRef(false);
110634
+ const pendingRestoredTabRef = useRef(null);
110635
+ const debugNav = (...args) => console.log("[recrate-nav-debug][shell2]", ...args);
110636
+ const getVisibleContextMarkers = (selector, dataAttribute) => {
110637
+ const source = activeContentRef.current;
110638
+ if (!source) return [];
110639
+ return Array.from(source.querySelectorAll(selector)).map((node2) => node2.getAttribute(dataAttribute)).filter((value) => Boolean(value));
110640
+ };
110641
+ const captureViewContext = (tabName = activeTab, explicitScrollTop) => {
110642
+ var _a3, _b2, _c2, _d2, _e3;
110643
+ const entityId = contextEntity == null ? void 0 : contextEntity["@id"];
110644
+ if (!entityId || ((_a3 = state.editorState.latest()) == null ? void 0 : _a3.id) !== entityId) return;
110645
+ const previous = state.editorState.getNavigationState(entityId) ?? {};
110646
+ const scrollTop = typeof explicitScrollTop === "number" ? explicitScrollTop : ((_b2 = activeContentRef.current) == null ? void 0 : _b2.scrollTop) ?? ((_d2 = (_c2 = previous.tabStates) == null ? void 0 : _c2[tabName]) == null ? void 0 : _d2.scrollTop) ?? 0;
110647
+ const nextTabState = {
110648
+ scrollTop,
110649
+ expandedSections: getVisibleContextMarkers('[aria-expanded="true"],[data-expanded="true"]', "data-section-id"),
110650
+ selectedItems: getVisibleContextMarkers('[aria-selected="true"],[data-selected="true"]', "data-item-id")
110651
+ };
110652
+ debugNav("captureViewContext", {
110653
+ entityId,
110654
+ tabName,
110655
+ scrollTop,
110656
+ latestId: (_e3 = state.editorState.latest()) == null ? void 0 : _e3.id
110657
+ });
110658
+ state.editorState.updateNavigationState({
110659
+ activeTab: tabName,
110660
+ tabStates: { [tabName]: nextTabState },
110661
+ uiState: {
110662
+ showAddPanel,
110663
+ reverseSidebarVisible,
110664
+ highlightRequiredProperties,
110665
+ iconView,
110666
+ tabPaneWidth
110667
+ }
110668
+ });
110669
+ };
110670
+ const computeScrollViewportHeight = useMemo$1(() => debounce(() => {
110671
+ var _a3, _b2;
110672
+ const containerRect = (_a3 = contentContainerRef.current) == null ? void 0 : _a3.getBoundingClientRect();
110673
+ if (!containerRect) return;
110674
+ const panelRect = (_b2 = editorPanelRef.current) == null ? void 0 : _b2.getBoundingClientRect();
110675
+ const availableHeight = panelRect ? panelRect.bottom - containerRect.top - 8 : window.innerHeight - containerRect.top - 8;
110676
+ const nextHeight = Math.max(240, Math.floor(availableHeight));
110677
+ setScrollViewportHeight(nextHeight);
110678
+ }, 50), []);
110570
110679
  useEffect(() => {
110571
- computeContentHeight();
110572
- const ro = activeContentRef.current ? new ResizeObserver(() => computeContentHeight()) : null;
110573
- if (activeContentRef.current && ro) ro.observe(activeContentRef.current);
110574
- window.addEventListener("resize", computeContentHeight);
110680
+ var _a3;
110681
+ editorPanelRef.current = (_a3 = contentContainerRef.current) == null ? void 0 : _a3.closest(".rocrate-editor");
110682
+ computeScrollViewportHeight();
110683
+ const panelResizeObserver = editorPanelRef.current ? new ResizeObserver(() => computeScrollViewportHeight()) : null;
110684
+ if (editorPanelRef.current && panelResizeObserver) {
110685
+ panelResizeObserver.observe(editorPanelRef.current);
110686
+ }
110687
+ window.addEventListener("resize", computeScrollViewportHeight);
110688
+ return () => {
110689
+ window.removeEventListener("resize", computeScrollViewportHeight);
110690
+ if (panelResizeObserver) panelResizeObserver.disconnect();
110691
+ computeScrollViewportHeight.cancel();
110692
+ };
110693
+ }, [computeScrollViewportHeight]);
110694
+ useEffect(() => {
110695
+ computeScrollViewportHeight();
110696
+ const resizeObserver2 = new ResizeObserver(() => computeScrollViewportHeight());
110697
+ const mutationObserver = new MutationObserver(() => computeScrollViewportHeight());
110698
+ if (activeContentRef.current) {
110699
+ resizeObserver2.observe(activeContentRef.current);
110700
+ mutationObserver.observe(activeContentRef.current, {
110701
+ childList: true,
110702
+ subtree: true,
110703
+ attributes: true,
110704
+ characterData: true
110705
+ });
110706
+ }
110707
+ requestAnimationFrame(() => computeScrollViewportHeight());
110708
+ const delayedMeasure = window.setTimeout(() => computeScrollViewportHeight(), 120);
110575
110709
  return () => {
110576
- window.removeEventListener("resize", computeContentHeight);
110577
- if (ro) ro.disconnect();
110710
+ resizeObserver2.disconnect();
110711
+ mutationObserver.disconnect();
110712
+ window.clearTimeout(delayedMeasure);
110578
110713
  };
110579
- }, [computeContentHeight, renderTabs, reverseSidebarVisible, activeTab, tabs.length]);
110714
+ }, [computeScrollViewportHeight, activeTab, renderTabs, tabs.length, contextEntity == null ? void 0 : contextEntity["@id"], reverseSidebarVisible]);
110580
110715
  useImperativeHandle(ref, () => ({
110581
110716
  setTab: (tabName) => {
110582
110717
  setActiveTab(tabName);
@@ -110586,6 +110721,16 @@ const RenderEntity = forwardRef((props, ref) => {
110586
110721
  }
110587
110722
  }));
110588
110723
  useEffect(() => {
110724
+ navigationRestoreReadyRef.current = false;
110725
+ debugNav("entity.effect.start", {
110726
+ incomingEntityId: entity == null ? void 0 : entity["@id"],
110727
+ previousContextEntityId: contextEntity == null ? void 0 : contextEntity["@id"],
110728
+ activeTab,
110729
+ latest: state.editorState.latest()
110730
+ });
110731
+ if ((contextEntity == null ? void 0 : contextEntity["@id"]) && (entity == null ? void 0 : entity["@id"]) && contextEntity["@id"] !== entity["@id"]) {
110732
+ captureViewContext(activeTab);
110733
+ }
110589
110734
  setExtraProperties([]);
110590
110735
  init2({ entity });
110591
110736
  }, [entity]);
@@ -110596,10 +110741,10 @@ const RenderEntity = forwardRef((props, ref) => {
110596
110741
  }
110597
110742
  }, [profileManager == null ? void 0 : profileManager.$key]);
110598
110743
  const init2 = ({ entity: entity2 }) => {
110744
+ var _a3, _b2, _c2, _d2, _e3;
110599
110745
  if (!entity2["@id"]) return;
110600
- if (entity2["@id"] !== contextEntity["@id"]) {
110601
- window.scrollTo(0, 0);
110602
- }
110746
+ const latestEntry = state.editorState.latest();
110747
+ const isCurrentHistoryEntity = (latestEntry == null ? void 0 : latestEntry.id) === entity2["@id"];
110603
110748
  const layout = applyLayout({
110604
110749
  configuration: state.configuration,
110605
110750
  profileManager,
@@ -110610,24 +110755,153 @@ const RenderEntity = forwardRef((props, ref) => {
110610
110755
  setRenderTabs(layout.renderTabs);
110611
110756
  setMissingRequiredData(layout.missingRequiredData);
110612
110757
  setTabs(layout.tabs);
110613
- if (layout.renderTabs) {
110614
- state.editorState.update({ id: entity2["@id"], tab: activeTab });
110615
- } else {
110616
- state.editorState.deleteFromState({ property: "tab" });
110758
+ const navState = isCurrentHistoryEntity ? latestEntry == null ? void 0 : latestEntry.navigationState : state.editorState.getNavigationState(entity2["@id"]);
110759
+ const tabNames = layout.tabs.map((tab) => tab.name);
110760
+ const fallbackTab = tabNames.includes("about") ? "about" : tabNames[0] ?? "about";
110761
+ const restoredTab = layout.renderTabs && (navState == null ? void 0 : navState.activeTab) && tabNames.includes(navState.activeTab) ? navState.activeTab : fallbackTab;
110762
+ debugNav("init.restoreDecision", {
110763
+ entityId: entity2["@id"],
110764
+ latestEntry,
110765
+ isCurrentHistoryEntity,
110766
+ navActiveTab: navState == null ? void 0 : navState.activeTab,
110767
+ tabNames,
110768
+ restoredTab,
110769
+ fallbackTab
110770
+ });
110771
+ pendingRestoredTabRef.current = restoredTab;
110772
+ setActiveTab(restoredTab);
110773
+ if (typeof ((_a3 = navState == null ? void 0 : navState.uiState) == null ? void 0 : _a3.showAddPanel) === "boolean") setShowAddPanel(navState.uiState.showAddPanel);
110774
+ if (typeof ((_b2 = navState == null ? void 0 : navState.uiState) == null ? void 0 : _b2.reverseSidebarVisible) === "boolean") setReverseSidebarVisible(navState.uiState.reverseSidebarVisible);
110775
+ if (typeof ((_c2 = navState == null ? void 0 : navState.uiState) == null ? void 0 : _c2.highlightRequiredProperties) === "boolean") setHighlightRequiredProperties(navState.uiState.highlightRequiredProperties);
110776
+ if (typeof ((_d2 = navState == null ? void 0 : navState.uiState) == null ? void 0 : _d2.iconView) === "boolean") setIconView(navState.uiState.iconView);
110777
+ if (typeof ((_e3 = navState == null ? void 0 : navState.uiState) == null ? void 0 : _e3.tabPaneWidth) === "number") setTabPaneWidth(navState.uiState.tabPaneWidth);
110778
+ if (isCurrentHistoryEntity) {
110779
+ if (layout.renderTabs) {
110780
+ state.editorState.update({ id: entity2["@id"], tab: restoredTab });
110781
+ } else {
110782
+ state.editorState.deleteFromState({ property: "tab" });
110783
+ }
110617
110784
  }
110785
+ debugNav("init.deferReadyUntilTabCommit", {
110786
+ entityId: entity2["@id"],
110787
+ restoredTab
110788
+ });
110618
110789
  };
110619
110790
  const refresh = () => {
110620
110791
  const entityObj = crateManager.getEntity({ id: entity["@id"], link: false, materialise: false });
110621
110792
  init2({ entity: entityObj });
110622
110793
  };
110794
+ const handleLoadEntityWithContext = (params) => {
110795
+ debugNav("handleLoadEntityWithContext", {
110796
+ fromEntityId: contextEntity == null ? void 0 : contextEntity["@id"],
110797
+ activeTab,
110798
+ params,
110799
+ latest: state.editorState.latest()
110800
+ });
110801
+ captureViewContext(activeTab);
110802
+ onLoadEntity(params);
110803
+ };
110623
110804
  const saveTabToState = (tabName) => {
110624
- state.editorState.update({ id: entity["@id"], tab: tabName });
110805
+ var _a3;
110806
+ const activeEntityId = contextEntity == null ? void 0 : contextEntity["@id"];
110807
+ const latestId = (_a3 = state.editorState.latest()) == null ? void 0 : _a3.id;
110808
+ if (!activeEntityId || latestId !== activeEntityId) {
110809
+ debugNav("saveTabToState.skip", { tabName, activeEntityId, latestId });
110810
+ return;
110811
+ }
110812
+ debugNav("saveTabToState.apply", { tabName, activeEntityId });
110813
+ state.editorState.update({ id: activeEntityId, tab: tabName });
110814
+ state.editorState.updateNavigationState({ activeTab: tabName });
110625
110815
  };
110626
110816
  useEffect(() => {
110627
110817
  if (entity == null ? void 0 : entity["@id"]) {
110628
110818
  refresh();
110629
110819
  }
110630
110820
  }, [extraProperties]);
110821
+ useEffect(() => {
110822
+ var _a3, _b2, _c2;
110823
+ if (!navigationRestoreReadyRef.current) return;
110824
+ if (!(contextEntity == null ? void 0 : contextEntity["@id"])) return;
110825
+ const viewport = activeContentRef.current;
110826
+ if (!viewport) return;
110827
+ const restoreTarget = ((_c2 = (_b2 = (_a3 = state.editorState.getNavigationState(contextEntity["@id"])) == null ? void 0 : _a3.tabStates) == null ? void 0 : _b2[activeTab]) == null ? void 0 : _c2.scrollTop) ?? 0;
110828
+ debugNav("scroll.restore.start", {
110829
+ entityId: contextEntity["@id"],
110830
+ activeTab,
110831
+ restoreTarget,
110832
+ latest: state.editorState.latest()
110833
+ });
110834
+ let cancelled = false;
110835
+ let rafId = 0;
110836
+ let timerId = 0;
110837
+ let attempts = 0;
110838
+ const maxAttempts = 12;
110839
+ const attemptRestore = () => {
110840
+ if (cancelled) return;
110841
+ attempts += 1;
110842
+ const maxScrollable = Math.max(0, viewport.scrollHeight - viewport.clientHeight);
110843
+ const target = Math.min(restoreTarget, maxScrollable);
110844
+ viewport.scrollTop = target;
110845
+ debugNav("scroll.restore.attempt", {
110846
+ entityId: contextEntity["@id"],
110847
+ activeTab,
110848
+ attempt: attempts,
110849
+ restoreTarget,
110850
+ maxScrollable,
110851
+ appliedScrollTop: viewport.scrollTop
110852
+ });
110853
+ const done = Math.abs(viewport.scrollTop - target) <= 1;
110854
+ if (done || attempts >= maxAttempts) {
110855
+ debugNav("scroll.restore.applied", {
110856
+ entityId: contextEntity["@id"],
110857
+ activeTab,
110858
+ attempts,
110859
+ restoreTarget,
110860
+ appliedScrollTop: viewport.scrollTop
110861
+ });
110862
+ return;
110863
+ }
110864
+ timerId = window.setTimeout(() => {
110865
+ rafId = window.requestAnimationFrame(attemptRestore);
110866
+ }, 35);
110867
+ };
110868
+ rafId = window.requestAnimationFrame(attemptRestore);
110869
+ const handleScroll = () => captureViewContext(activeTab, viewport.scrollTop);
110870
+ viewport.addEventListener("scroll", handleScroll, { passive: true });
110871
+ return () => {
110872
+ cancelled = true;
110873
+ if (navigationRestoreReadyRef.current) {
110874
+ captureViewContext(activeTab, viewport.scrollTop);
110875
+ }
110876
+ viewport.removeEventListener("scroll", handleScroll);
110877
+ window.cancelAnimationFrame(rafId);
110878
+ window.clearTimeout(timerId);
110879
+ };
110880
+ }, [activeTab, contextEntity == null ? void 0 : contextEntity["@id"], renderTabs, tabs.length, scrollRestoreNonce]);
110881
+ useEffect(() => {
110882
+ const pendingTab = pendingRestoredTabRef.current;
110883
+ if (!(contextEntity == null ? void 0 : contextEntity["@id"])) return;
110884
+ if (pendingTab) {
110885
+ if (activeTab !== pendingTab) {
110886
+ debugNav("restore.waitingForCommittedTab", {
110887
+ entityId: contextEntity["@id"],
110888
+ pendingTab,
110889
+ activeTab
110890
+ });
110891
+ return;
110892
+ }
110893
+ navigationRestoreReadyRef.current = true;
110894
+ pendingRestoredTabRef.current = null;
110895
+ setScrollRestoreNonce((prev2) => prev2 + 1);
110896
+ debugNav("restore.tabCommitted", {
110897
+ entityId: contextEntity["@id"],
110898
+ activeTab
110899
+ });
110900
+ return;
110901
+ }
110902
+ if (!navigationRestoreReadyRef.current) return;
110903
+ captureViewContext(activeTab);
110904
+ }, [activeTab, showAddPanel, reverseSidebarVisible, highlightRequiredProperties, iconView, tabPaneWidth, contextEntity == null ? void 0 : contextEntity["@id"]]);
110631
110905
  const handleAddPropertyPlaceholder = (property) => {
110632
110906
  try {
110633
110907
  const newExtraProperties = [...extraProperties, property];
@@ -110682,7 +110956,7 @@ const RenderEntity = forwardRef((props, ref) => {
110682
110956
  ...data
110683
110957
  });
110684
110958
  if (updatedEntity["@id"] !== entity["@id"]) {
110685
- onLoadEntity({ id: updatedEntity["@id"] });
110959
+ handleLoadEntityWithContext({ id: updatedEntity["@id"] });
110686
110960
  } else {
110687
110961
  refresh();
110688
110962
  }
@@ -110787,7 +111061,7 @@ const RenderEntity = forwardRef((props, ref) => {
110787
111061
  const handleDeleteEntity = (data) => {
110788
111062
  try {
110789
111063
  crateManager.deleteEntity({ id: data.id });
110790
- onLoadEntity({ id: "./" });
111064
+ handleLoadEntityWithContext({ id: "./" });
110791
111065
  onSaveCrate();
110792
111066
  } catch (error2) {
110793
111067
  onError();
@@ -110900,7 +111174,7 @@ const RenderEntity = forwardRef((props, ref) => {
110900
111174
  RenderControls,
110901
111175
  {
110902
111176
  entity: contextEntity,
110903
- onLoadEntity,
111177
+ onLoadEntity: handleLoadEntityWithContext,
110904
111178
  onBack: () => state.editorState.back(),
110905
111179
  onForward: () => state.editorState.forward(),
110906
111180
  onAddPropertyPlaceholder: handleAddPropertyPlaceholder,
@@ -110925,7 +111199,7 @@ const RenderEntity = forwardRef((props, ref) => {
110925
111199
  }
110926
111200
  )
110927
111201
  ] }),
110928
- !renderTabs && (((_c = state.configuration) == null ? void 0 : _c.tabLocation) === "left" || ((_d = state.configuration) == null ? void 0 : _d.tabLocation) === "right" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: contentContainerRef, style: { height: contentHeight ? `${contentHeight}px` : "100vh" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Ve, { vertical: false, proportionalLayout: false, separator: !iconView, onChange: (sizes2) => {
111202
+ !renderTabs && (((_c = state.configuration) == null ? void 0 : _c.tabLocation) === "left" || ((_d = state.configuration) == null ? void 0 : _d.tabLocation) === "right" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: contentContainerRef, className: "min-h-0 overflow-hidden", style: { height: scrollViewportHeight ? `${scrollViewportHeight}px` : "calc(100vh - 200px)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Ve, { vertical: false, proportionalLayout: false, separator: !iconView, onChange: (sizes2) => {
110929
111203
  var _a3;
110930
111204
  const w2 = ((_a3 = state.configuration) == null ? void 0 : _a3.tabLocation) === "left" ? sizes2[0] : sizes2[1];
110931
111205
  setTabPaneWidth(w2);
@@ -110947,7 +111221,7 @@ const RenderEntity = forwardRef((props, ref) => {
110947
111221
  ),
110948
111222
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute right-0 top-0 bottom-0 w-1 bg-slate-300 opacity-0 group-hover:opacity-100" })
110949
111223
  ] }) }),
110950
- /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: "flex-grow p-3", children: [
111224
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: "flex-1 overflow-y-auto scroll-smooth min-h-0 p-3", children: [
110951
111225
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row space-x-2 my-2 p-2", children: [
110952
111226
  /* @__PURE__ */ jsxRuntimeExports.jsx(
110953
111227
  "div",
@@ -110969,7 +111243,7 @@ const RenderEntity = forwardRef((props, ref) => {
110969
111243
  /* @__PURE__ */ jsxRuntimeExports.jsx(
110970
111244
  "div",
110971
111245
  {
110972
- className: `my-2 p-2 describo-property describo-property-name-name ${savedProperty === "name" ? "bg-green-200 rounded p-1 my-1" : ""}`,
111246
+ className: `my-2 p-2 describo-property describo-property-name-name ${savedProperty === "name" ? "bg-green-200 rounded" : ""}`,
110973
111247
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(EntityName, { entity: contextEntity, onUpdate: handleUpdateEntity })
110974
111248
  }
110975
111249
  ),
@@ -110987,7 +111261,7 @@ const RenderEntity = forwardRef((props, ref) => {
110987
111261
  values: Array.isArray(contextEntity[property]) ? contextEntity[property] : [contextEntity[property]],
110988
111262
  highlightRequired: highlightRequiredProperties,
110989
111263
  savedProperty: savedProperty === property,
110990
- onLoadEntity,
111264
+ onLoadEntity: handleLoadEntityWithContext,
110991
111265
  onCreateEntity: handleCreateEntity,
110992
111266
  onLinkEntity: handleLinkEntity,
110993
111267
  onUnlinkEntity: handleUnlinkEntity,
@@ -111019,8 +111293,9 @@ const RenderEntity = forwardRef((props, ref) => {
111019
111293
  ),
111020
111294
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute left-0 top-0 bottom-0 w-1 bg-slate-300 opacity-0 group-hover:opacity-100" })
111021
111295
  ] }) })
111022
- ] }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex", style: {
111023
- flexDirection: "column"
111296
+ ] }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: contentContainerRef, className: "flex min-h-0 overflow-hidden", style: {
111297
+ flexDirection: "column",
111298
+ height: scrollViewportHeight ? `${scrollViewportHeight}px` : "calc(100vh - 200px)"
111024
111299
  }, children: [
111025
111300
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
111026
111301
  Tabs,
@@ -111034,7 +111309,7 @@ const RenderEntity = forwardRef((props, ref) => {
111034
111309
  tabBarStyle: { width: "100%" }
111035
111310
  }
111036
111311
  ) }),
111037
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: "flex-grow p-3", children: [
111312
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: "h-full overflow-y-auto scroll-smooth min-h-0 p-3", children: [
111038
111313
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row space-x-2 my-2 p-2", children: [
111039
111314
  /* @__PURE__ */ jsxRuntimeExports.jsx(
111040
111315
  "div",
@@ -111074,7 +111349,7 @@ const RenderEntity = forwardRef((props, ref) => {
111074
111349
  values: Array.isArray(contextEntity[property]) ? contextEntity[property] : [contextEntity[property]],
111075
111350
  highlightRequired: highlightRequiredProperties,
111076
111351
  savedProperty: savedProperty === property,
111077
- onLoadEntity,
111352
+ onLoadEntity: handleLoadEntityWithContext,
111078
111353
  onCreateEntity: handleCreateEntity,
111079
111354
  onLinkEntity: handleLinkEntity,
111080
111355
  onUnlinkEntity: handleUnlinkEntity,
@@ -111091,7 +111366,7 @@ const RenderEntity = forwardRef((props, ref) => {
111091
111366
  })
111092
111367
  ] })
111093
111368
  ] })),
111094
- renderTabs && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: contentContainerRef, style: { height: contentHeight ? `${contentHeight}px` : "100vh" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Ve, { vertical: false, proportionalLayout: false, separator: !iconView, onChange: (sizes2) => {
111369
+ renderTabs && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: contentContainerRef, className: "min-h-0 overflow-hidden", style: { height: scrollViewportHeight ? `${scrollViewportHeight}px` : "calc(100vh - 200px)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Ve, { vertical: false, proportionalLayout: false, separator: !iconView, onChange: (sizes2) => {
111095
111370
  var _a3;
111096
111371
  const w2 = ((_a3 = state.configuration) == null ? void 0 : _a3.tabLocation) === "left" ? sizes2[0] : sizes2[1];
111097
111372
  setTabPaneWidth(w2);
@@ -111104,6 +111379,7 @@ const RenderEntity = forwardRef((props, ref) => {
111104
111379
  className: "describo-tabs-vertical-center-add",
111105
111380
  activeKey: activeTab,
111106
111381
  onChange: (key) => {
111382
+ captureViewContext(activeTab);
111107
111383
  setActiveTab(key);
111108
111384
  saveTabToState(key);
111109
111385
  },
@@ -111115,7 +111391,7 @@ const RenderEntity = forwardRef((props, ref) => {
111115
111391
  ),
111116
111392
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute right-0 top-0 bottom-0 w-1 bg-slate-300 opacity-0 group-hover:opacity-100" })
111117
111393
  ] }) }),
111118
- /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: "flex-grow p-3", children: [
111394
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: "h-full overflow-y-auto scroll-smooth min-h-0 p-3", children: [
111119
111395
  !((_m = state.configuration) == null ? void 0 : _m.readonly) && ((_n = tabs.find((t22) => t22.name === activeTab)) == null ? void 0 : _n.missingRequiredData) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-red-600 float-right mb-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
111120
111396
  "button",
111121
111397
  {
@@ -111150,7 +111426,7 @@ const RenderEntity = forwardRef((props, ref) => {
111150
111426
  values: Array.isArray(contextEntity[input.name]) ? contextEntity[input.name] : [contextEntity[input.name]],
111151
111427
  highlightRequired: highlightRequiredProperties,
111152
111428
  savedProperty: savedProperty === input.name,
111153
- onLoadEntity,
111429
+ onLoadEntity: handleLoadEntityWithContext,
111154
111430
  onCreateEntity: handleCreateEntity,
111155
111431
  onLinkEntity: handleLinkEntity,
111156
111432
  onUnlinkEntity: handleUnlinkEntity,
@@ -111179,7 +111455,7 @@ const RenderEntity = forwardRef((props, ref) => {
111179
111455
  values: Array.isArray(contextEntity[input.name]) ? contextEntity[input.name] : [contextEntity[input.name]],
111180
111456
  highlightRequired: highlightRequiredProperties,
111181
111457
  savedProperty: savedProperty === input.name,
111182
- onLoadEntity,
111458
+ onLoadEntity: handleLoadEntityWithContext,
111183
111459
  onCreateEntity: handleCreateEntity,
111184
111460
  onLinkEntity: handleLinkEntity,
111185
111461
  onUnlinkEntity: handleUnlinkEntity,
@@ -111212,7 +111488,7 @@ const RenderEntity = forwardRef((props, ref) => {
111212
111488
  {
111213
111489
  entity: contextEntity,
111214
111490
  onLoadEntity: (data) => {
111215
- onLoadEntity(data);
111491
+ handleLoadEntityWithContext(data);
111216
111492
  setReverseSidebarVisible(false);
111217
111493
  }
111218
111494
  },
@@ -119545,7 +119821,7 @@ var EmotionCacheContext = /* @__PURE__ */ React.createContext(
119545
119821
  }) : null
119546
119822
  );
119547
119823
  var CacheProvider = EmotionCacheContext.Provider;
119548
- const version = "0.1.20";
119824
+ const version = "0.1.23";
119549
119825
  const pkg = {
119550
119826
  version
119551
119827
  };
@@ -119682,8 +119958,7 @@ function DescriboCrateBuilderInner(props) {
119682
119958
  const validIds = new Set(
119683
119959
  graph.filter((entry) => entry && typeof entry === "object" && typeof entry["@id"] === "string").map((entry) => String(entry["@id"]))
119684
119960
  );
119685
- state.editorState.history = state.editorState.history.filter((entry) => validIds.has(entry.id));
119686
- state.editorState.current = state.editorState.history.length === 0 ? 0 : Math.min(state.editorState.current, state.editorState.history.length - 1);
119961
+ state.editorState.prune(validIds);
119687
119962
  const candidateIds = [(_a2 = state.editorState.latest()) == null ? void 0 : _a2.id, entityId, "./"];
119688
119963
  let nextEntity = null;
119689
119964
  for (const candidateId of candidateIds) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arpproject/recrate",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "type": "module",
5
5
  "main": "./dist/recrate.es.js",
6
6
  "module": "./dist/recrate.es.js",