@masterteam/timeline 0.0.2 → 0.0.4

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,2 +1,2 @@
1
- /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--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}}}@layer theme{:root,:host{--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-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-semibold:600;--animate-spin:spin 1s linear infinite;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;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);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{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-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}: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)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}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{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.z-0{z-index:0}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mt-3{margin-top:calc(var(--spacing) * 3)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-16{height:calc(var(--spacing) * 16)}.h-full{height:100%}.min-h-56{min-height:calc(var(--spacing) * 56)}.w-0{width:calc(var(--spacing) * 0)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-44{width:calc(var(--spacing) * 44)}.w-\[22\.5rem\]{width:22.5rem}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-surface{border-color:var(--p-content-border-color)}.border-surface-200{border-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.border-surface-200{border-color:color-mix(in srgb, var(--p-surface-200) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.bg-white{background-color:var(--color-white)}.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)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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))}.text-\[10px\]{font-size:10px}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-black{color:var(--color-black)}.text-surface-500{color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.text-surface-500{color:color-mix(in srgb, var(--p-surface-500) calc(100% * 1), transparent)}}.text-surface-600{color:var(--p-surface-600)}@supports (color:color-mix(in lab, red, red)){.text-surface-600{color:color-mix(in srgb, var(--p-surface-600) calc(100% * 1), transparent)}}.uppercase{text-transform:uppercase}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{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-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 spin{to{transform:rotate(360deg)}}
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--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}}}@layer theme{:root,:host{--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-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-semibold:600;--animate-spin:spin 1s linear infinite;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;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);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{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-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}: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)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}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{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.z-0{z-index:0}.z-\[1\]{z-index:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mt-3{margin-top:calc(var(--spacing) * 3)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-16{height:calc(var(--spacing) * 16)}.h-full{height:100%}.min-h-56{min-height:calc(var(--spacing) * 56)}.w-0{width:calc(var(--spacing) * 0)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-44{width:calc(var(--spacing) * 44)}.w-\[22\.5rem\]{width:22.5rem}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-surface{border-color:var(--p-content-border-color)}.border-surface-200{border-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.border-surface-200{border-color:color-mix(in srgb, var(--p-surface-200) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.bg-white{background-color:var(--color-white)}.p-3{padding:calc(var(--spacing) * 3)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-inline:calc(var(--spacing) * 2)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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))}.text-\[10px\]{font-size:10px}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-black{color:var(--color-black)}.text-surface-500{color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.text-surface-500{color:color-mix(in srgb, var(--p-surface-500) calc(100% * 1), transparent)}}.text-surface-600{color:var(--p-surface-600)}@supports (color:color-mix(in lab, red, red)){.text-surface-600{color:color-mix(in srgb, var(--p-surface-600) calc(100% * 1), transparent)}}.uppercase{text-transform:uppercase}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{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-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 spin{to{transform:rotate(360deg)}}
@@ -2,7 +2,6 @@ import * as i1 from '@angular/common';
2
2
  import { CommonModule, NgTemplateOutlet } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
4
  import { inject, TemplateRef, Directive, Input, input, output, Component, signal, computed, ViewChild, model, contentChild, contentChildren } from '@angular/core';
5
- import { Card } from '@masterteam/components/card';
6
5
  import { Popover } from 'primeng/popover';
7
6
  import { Icon } from '@masterteam/icons';
8
7
  import * as i1$1 from '@angular/forms';
@@ -271,11 +270,11 @@ class TimelineGanttRow {
271
270
  }, item);
272
271
  }
273
272
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: TimelineGanttRow, deps: [], target: i0.ɵɵFactoryTarget.Component });
274
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: TimelineGanttRow, isStandalone: true, selector: "mt-timeline-gantt-row", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, resolvedColumns: { classPropertyName: "resolvedColumns", publicName: "resolvedColumns", isSignal: true, isRequired: false, transformFunction: null }, ganttCanvasWidth: { classPropertyName: "ganttCanvasWidth", publicName: "ganttCanvasWidth", isSignal: true, isRequired: false, transformFunction: null }, laneInsetPx: { classPropertyName: "laneInsetPx", publicName: "laneInsetPx", isSignal: true, isRequired: false, transformFunction: null }, renderColumns: { classPropertyName: "renderColumns", publicName: "renderColumns", isSignal: true, isRequired: false, transformFunction: null }, renderTimeline: { classPropertyName: "renderTimeline", publicName: "renderTimeline", isSignal: true, isRequired: false, transformFunction: null }, columnTemplatesByKey: { classPropertyName: "columnTemplatesByKey", publicName: "columnTemplatesByKey", isSignal: true, isRequired: false, transformFunction: null }, progressTemplateDirective: { classPropertyName: "progressTemplateDirective", publicName: "progressTemplateDirective", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleCollapse: "toggleCollapse", progressClick: "progressClick" }, host: { classAttribute: "block min-w-0" }, ngImport: i0, template: "<!-- One gantt data row: sticky metadata cells + progress lane. -->\r\n<div class=\"relative flex\">\r\n <!-- Left sticky metadata cells. -->\r\n @if (renderColumns()) {\r\n @for (column of resolvedColumns(); track $index) {\r\n <div\r\n class=\"flex h-16 shrink-0 items-center overflow-hidden border-e border-b border-surface bg-content p-3\"\r\n [style.width.px]=\"column.widthPx\"\r\n [ngClass]=\"resolveColumnAlignClass(column)\"\r\n >\r\n <!-- Per-column custom template, when provided by consumer. -->\r\n @if (resolveColumnTemplate(column); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"getColumnTemplateContext(column, item())\"\r\n ></ng-container>\r\n } @else {\r\n <!-- Built-in fallback renderers by column configuration. -->\r\n @if (column.isTreeColumn) {\r\n <div\r\n class=\"flex min-w-0 items-center gap-2\"\r\n [style.padding-inline-start.px]=\"item().levelDepth * 16\"\r\n >\r\n @if (item().hasChildren) {\r\n <mt-icon\r\n class=\"cursor-pointer\"\r\n (click)=\"onToggleCollapse(item())\"\r\n [icon]=\"collapseIcon(item())\"\r\n ></mt-icon>\r\n } @else {\r\n <span class=\"inline-block w-5\"></span>\r\n }\r\n <span class=\"truncate text-sm font-semibold\">\r\n {{ resolveColumnText(column, item()) }}\r\n </span>\r\n </div>\r\n } @else {\r\n <span class=\"truncate text-sm\">\r\n {{ resolveColumnText(column, item()) }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Right timeline canvas cell for progress track/fill. -->\r\n @if (renderTimeline()) {\n <div\n class=\"relative z-0 h-16 shrink-0 overflow-hidden border-b border-surface py-4\"\n [style.width.px]=\"ganttCanvasWidth()\"\n [style.z-index]=\"1\"\n >\n <div class=\"h-8\"></div>\n <!-- Consumer custom progress template. -->\r\n @if (progressTemplateDirective(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template.templateRef\"\r\n [ngTemplateOutletContext]=\"getProgressTemplateContext(item())\"\r\n ></ng-container>\r\n } @else {\r\n <!-- Built-in progress renderer. -->\r\n <div\n class=\"absolute top-1/2 h-7 -translate-y-1/2 cursor-pointer rounded-full\"\n [style.left.px]=\"isRtl() ? null : item().startOffsetPx + laneInsetPx()\"\n [style.right.px]=\"isRtl() ? item().startOffsetPx + laneInsetPx() : null\"\n [style.width.px]=\"item().trackWidthPx\"\n [style.background-color]=\"item().progressTrackColor\"\n [style.z-index]=\"1\"\n [attr.title]=\"item().progressLabel\"\r\n (click)=\"onProgressClick(item(), $event)\"\r\n >\r\n <div\r\n class=\"relative h-full overflow-hidden rounded-full\"\r\n [style.width.px]=\"item().progressFillWidthPx\"\r\n [style.background-color]=\"item().statusColor\"\r\n >\r\n @if (item().progressFillWidthPx > 0) {\r\n <span\r\n class=\"pointer-events-none absolute top-1/2 rounded-full bg-white px-2 py-0.5 text-[10px] font-semibold text-black shadow-sm -translate-y-1/2\"\r\n [style.left.px]=\"isRtl() ? null : 8\"\r\n [style.right.px]=\"isRtl() ? 8 : null\"\r\n [attr.title]=\"item().progressLabel\"\r\n >\r\n {{ item().progressLabel }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }] });
273
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: TimelineGanttRow, isStandalone: true, selector: "mt-timeline-gantt-row", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, resolvedColumns: { classPropertyName: "resolvedColumns", publicName: "resolvedColumns", isSignal: true, isRequired: false, transformFunction: null }, ganttCanvasWidth: { classPropertyName: "ganttCanvasWidth", publicName: "ganttCanvasWidth", isSignal: true, isRequired: false, transformFunction: null }, laneInsetPx: { classPropertyName: "laneInsetPx", publicName: "laneInsetPx", isSignal: true, isRequired: false, transformFunction: null }, renderColumns: { classPropertyName: "renderColumns", publicName: "renderColumns", isSignal: true, isRequired: false, transformFunction: null }, renderTimeline: { classPropertyName: "renderTimeline", publicName: "renderTimeline", isSignal: true, isRequired: false, transformFunction: null }, columnTemplatesByKey: { classPropertyName: "columnTemplatesByKey", publicName: "columnTemplatesByKey", isSignal: true, isRequired: false, transformFunction: null }, progressTemplateDirective: { classPropertyName: "progressTemplateDirective", publicName: "progressTemplateDirective", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleCollapse: "toggleCollapse", progressClick: "progressClick" }, host: { classAttribute: "block min-w-0" }, ngImport: i0, template: "<!-- One gantt data row: sticky metadata cells + progress lane. -->\n<div class=\"relative flex\">\n <!-- Left sticky metadata cells. -->\n @if (renderColumns()) {\n @for (column of resolvedColumns(); track $index) {\n <div\n class=\"flex h-16 shrink-0 items-center overflow-hidden border-e border-b border-surface bg-content p-3\"\n [style.width.px]=\"column.widthPx\"\n [ngClass]=\"resolveColumnAlignClass(column)\"\n >\n <!-- Per-column custom template, when provided by consumer. -->\n @if (resolveColumnTemplate(column); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"getColumnTemplateContext(column, item())\"\n ></ng-container>\n } @else {\n <!-- Built-in fallback renderers by column configuration. -->\n @if (column.isTreeColumn) {\n <div\n class=\"flex min-w-0 items-center gap-2\"\n [style.padding-inline-start.px]=\"item().levelDepth * 16\"\n >\n @if (item().hasChildren) {\n <mt-icon\n class=\"cursor-pointer\"\n (click)=\"onToggleCollapse(item())\"\n [icon]=\"collapseIcon(item())\"\n ></mt-icon>\n } @else {\n <span class=\"inline-block w-5\"></span>\n }\n <span class=\"truncate text-sm font-semibold\">\n {{ resolveColumnText(column, item()) }}\n </span>\n </div>\n } @else {\n <span class=\"truncate text-sm\">\n {{ resolveColumnText(column, item()) }}\n </span>\n }\n }\n </div>\n }\n }\n\n <!-- Right timeline canvas cell for progress track/fill. -->\n @if (renderTimeline()) {\n <div\n class=\"relative z-0 h-16 shrink-0 overflow-hidden border-b border-surface py-4\"\n [style.width.px]=\"ganttCanvasWidth()\"\n [style.z-index]=\"1\"\n >\n <div class=\"h-8\"></div>\n <!-- Consumer custom progress template. -->\n @if (progressTemplateDirective(); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"getProgressTemplateContext(item())\"\n ></ng-container>\n } @else {\n <!-- Built-in progress renderer. -->\n <div\n class=\"absolute top-1/2 h-7 -translate-y-1/2 cursor-pointer rounded-full\"\n [style.left.px]=\"\n isRtl() ? null : item().startOffsetPx + laneInsetPx()\n \"\n [style.right.px]=\"\n isRtl() ? item().startOffsetPx + laneInsetPx() : null\n \"\n [style.width.px]=\"item().trackWidthPx\"\n [style.background-color]=\"item().progressTrackColor\"\n [style.z-index]=\"1\"\n [attr.title]=\"item().progressLabel\"\n (click)=\"onProgressClick(item(), $event)\"\n >\n @if (item().progressFillWidthPx > 0) {\n <div\n class=\"h-full rounded-full\"\n [style.width.px]=\"item().progressFillWidthPx\"\n [style.background-color]=\"item().statusColor\"\n ></div>\n }\n\n <span\n class=\"pointer-events-none absolute top-1/2 z-[1] -translate-y-1/2 rounded-full bg-white px-2 py-0.5 text-[10px] font-semibold text-black shadow-sm\"\n [style.left.px]=\"isRtl() ? null : 8\"\n [style.right.px]=\"isRtl() ? 8 : null\"\n [attr.title]=\"item().progressLabel\"\n >\n {{ item().progressLabel }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }] });
275
274
  }
276
275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: TimelineGanttRow, decorators: [{
277
276
  type: Component,
278
- args: [{ selector: 'mt-timeline-gantt-row', standalone: true, imports: [CommonModule, Icon, NgTemplateOutlet], host: { class: 'block min-w-0' }, template: "<!-- One gantt data row: sticky metadata cells + progress lane. -->\r\n<div class=\"relative flex\">\r\n <!-- Left sticky metadata cells. -->\r\n @if (renderColumns()) {\r\n @for (column of resolvedColumns(); track $index) {\r\n <div\r\n class=\"flex h-16 shrink-0 items-center overflow-hidden border-e border-b border-surface bg-content p-3\"\r\n [style.width.px]=\"column.widthPx\"\r\n [ngClass]=\"resolveColumnAlignClass(column)\"\r\n >\r\n <!-- Per-column custom template, when provided by consumer. -->\r\n @if (resolveColumnTemplate(column); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"getColumnTemplateContext(column, item())\"\r\n ></ng-container>\r\n } @else {\r\n <!-- Built-in fallback renderers by column configuration. -->\r\n @if (column.isTreeColumn) {\r\n <div\r\n class=\"flex min-w-0 items-center gap-2\"\r\n [style.padding-inline-start.px]=\"item().levelDepth * 16\"\r\n >\r\n @if (item().hasChildren) {\r\n <mt-icon\r\n class=\"cursor-pointer\"\r\n (click)=\"onToggleCollapse(item())\"\r\n [icon]=\"collapseIcon(item())\"\r\n ></mt-icon>\r\n } @else {\r\n <span class=\"inline-block w-5\"></span>\r\n }\r\n <span class=\"truncate text-sm font-semibold\">\r\n {{ resolveColumnText(column, item()) }}\r\n </span>\r\n </div>\r\n } @else {\r\n <span class=\"truncate text-sm\">\r\n {{ resolveColumnText(column, item()) }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Right timeline canvas cell for progress track/fill. -->\r\n @if (renderTimeline()) {\n <div\n class=\"relative z-0 h-16 shrink-0 overflow-hidden border-b border-surface py-4\"\n [style.width.px]=\"ganttCanvasWidth()\"\n [style.z-index]=\"1\"\n >\n <div class=\"h-8\"></div>\n <!-- Consumer custom progress template. -->\r\n @if (progressTemplateDirective(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template.templateRef\"\r\n [ngTemplateOutletContext]=\"getProgressTemplateContext(item())\"\r\n ></ng-container>\r\n } @else {\r\n <!-- Built-in progress renderer. -->\r\n <div\n class=\"absolute top-1/2 h-7 -translate-y-1/2 cursor-pointer rounded-full\"\n [style.left.px]=\"isRtl() ? null : item().startOffsetPx + laneInsetPx()\"\n [style.right.px]=\"isRtl() ? item().startOffsetPx + laneInsetPx() : null\"\n [style.width.px]=\"item().trackWidthPx\"\n [style.background-color]=\"item().progressTrackColor\"\n [style.z-index]=\"1\"\n [attr.title]=\"item().progressLabel\"\r\n (click)=\"onProgressClick(item(), $event)\"\r\n >\r\n <div\r\n class=\"relative h-full overflow-hidden rounded-full\"\r\n [style.width.px]=\"item().progressFillWidthPx\"\r\n [style.background-color]=\"item().statusColor\"\r\n >\r\n @if (item().progressFillWidthPx > 0) {\r\n <span\r\n class=\"pointer-events-none absolute top-1/2 rounded-full bg-white px-2 py-0.5 text-[10px] font-semibold text-black shadow-sm -translate-y-1/2\"\r\n [style.left.px]=\"isRtl() ? null : 8\"\r\n [style.right.px]=\"isRtl() ? 8 : null\"\r\n [attr.title]=\"item().progressLabel\"\r\n >\r\n {{ item().progressLabel }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n" }]
277
+ args: [{ selector: 'mt-timeline-gantt-row', standalone: true, imports: [CommonModule, Icon, NgTemplateOutlet], host: { class: 'block min-w-0' }, template: "<!-- One gantt data row: sticky metadata cells + progress lane. -->\n<div class=\"relative flex\">\n <!-- Left sticky metadata cells. -->\n @if (renderColumns()) {\n @for (column of resolvedColumns(); track $index) {\n <div\n class=\"flex h-16 shrink-0 items-center overflow-hidden border-e border-b border-surface bg-content p-3\"\n [style.width.px]=\"column.widthPx\"\n [ngClass]=\"resolveColumnAlignClass(column)\"\n >\n <!-- Per-column custom template, when provided by consumer. -->\n @if (resolveColumnTemplate(column); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"getColumnTemplateContext(column, item())\"\n ></ng-container>\n } @else {\n <!-- Built-in fallback renderers by column configuration. -->\n @if (column.isTreeColumn) {\n <div\n class=\"flex min-w-0 items-center gap-2\"\n [style.padding-inline-start.px]=\"item().levelDepth * 16\"\n >\n @if (item().hasChildren) {\n <mt-icon\n class=\"cursor-pointer\"\n (click)=\"onToggleCollapse(item())\"\n [icon]=\"collapseIcon(item())\"\n ></mt-icon>\n } @else {\n <span class=\"inline-block w-5\"></span>\n }\n <span class=\"truncate text-sm font-semibold\">\n {{ resolveColumnText(column, item()) }}\n </span>\n </div>\n } @else {\n <span class=\"truncate text-sm\">\n {{ resolveColumnText(column, item()) }}\n </span>\n }\n }\n </div>\n }\n }\n\n <!-- Right timeline canvas cell for progress track/fill. -->\n @if (renderTimeline()) {\n <div\n class=\"relative z-0 h-16 shrink-0 overflow-hidden border-b border-surface py-4\"\n [style.width.px]=\"ganttCanvasWidth()\"\n [style.z-index]=\"1\"\n >\n <div class=\"h-8\"></div>\n <!-- Consumer custom progress template. -->\n @if (progressTemplateDirective(); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"getProgressTemplateContext(item())\"\n ></ng-container>\n } @else {\n <!-- Built-in progress renderer. -->\n <div\n class=\"absolute top-1/2 h-7 -translate-y-1/2 cursor-pointer rounded-full\"\n [style.left.px]=\"\n isRtl() ? null : item().startOffsetPx + laneInsetPx()\n \"\n [style.right.px]=\"\n isRtl() ? item().startOffsetPx + laneInsetPx() : null\n \"\n [style.width.px]=\"item().trackWidthPx\"\n [style.background-color]=\"item().progressTrackColor\"\n [style.z-index]=\"1\"\n [attr.title]=\"item().progressLabel\"\n (click)=\"onProgressClick(item(), $event)\"\n >\n @if (item().progressFillWidthPx > 0) {\n <div\n class=\"h-full rounded-full\"\n [style.width.px]=\"item().progressFillWidthPx\"\n [style.background-color]=\"item().statusColor\"\n ></div>\n }\n\n <span\n class=\"pointer-events-none absolute top-1/2 z-[1] -translate-y-1/2 rounded-full bg-white px-2 py-0.5 text-[10px] font-semibold text-black shadow-sm\"\n [style.left.px]=\"isRtl() ? null : 8\"\n [style.right.px]=\"isRtl() ? 8 : null\"\n [attr.title]=\"item().progressLabel\"\n >\n {{ item().progressLabel }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n" }]
279
278
  }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], resolvedColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "resolvedColumns", required: false }] }], ganttCanvasWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttCanvasWidth", required: false }] }], laneInsetPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "laneInsetPx", required: false }] }], renderColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderColumns", required: false }] }], renderTimeline: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderTimeline", required: false }] }], columnTemplatesByKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnTemplatesByKey", required: false }] }], progressTemplateDirective: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressTemplateDirective", required: false }] }], toggleCollapse: [{ type: i0.Output, args: ["toggleCollapse"] }], progressClick: [{ type: i0.Output, args: ["progressClick"] }] } });
280
279
 
281
280
  /**
@@ -314,7 +313,7 @@ class TimelineGantt {
314
313
  columnsPaneUserWidthPx = signal(null, ...(ngDevMode ? [{ debugName: "columnsPaneUserWidthPx" }] : []));
315
314
  lastExpandedColumnsPaneWidthPx = signal(null, ...(ngDevMode ? [{ debugName: "lastExpandedColumnsPaneWidthPx" }] : []));
316
315
  isColumnsResizing = signal(false, ...(ngDevMode ? [{ debugName: "isColumnsResizing" }] : []));
317
- canResizeColumnsPane = computed(() => this.resolvedColumns().length > 0, ...(ngDevMode ? [{ debugName: "canResizeColumnsPane" }] : []));
316
+ canResizeColumnsPane = computed(() => this.baseResolvedColumns().length > 0, ...(ngDevMode ? [{ debugName: "canResizeColumnsPane" }] : []));
318
317
  resizeStartClientX = 0;
319
318
  resizeStartColumnsPaneWidthPx = 0;
320
319
  timelineMode = input('quarterly', ...(ngDevMode ? [{ debugName: "timelineMode" }] : []));
@@ -325,6 +324,7 @@ class TimelineGantt {
325
324
  ganttStatusColumnWidthPx = input(160, ...(ngDevMode ? [{ debugName: "ganttStatusColumnWidthPx" }] : []));
326
325
  showGanttStatusColumn = input(false, ...(ngDevMode ? [{ debugName: "showGanttStatusColumn" }] : []));
327
326
  ganttSegmentWidthPx = input(96, ...(ngDevMode ? [{ debugName: "ganttSegmentWidthPx" }] : []));
327
+ defaultVisibleColumns = input(4, ...(ngDevMode ? [{ debugName: "defaultVisibleColumns" }] : []));
328
328
  columnsPaneMinWidthPx = input(0, ...(ngDevMode ? [{ debugName: "columnsPaneMinWidthPx" }] : []));
329
329
  columnsPaneMaxWidthPx = input(null, ...(ngDevMode ? [{ debugName: "columnsPaneMaxWidthPx" }] : []));
330
330
  mappedGanttNodes = input([], ...(ngDevMode ? [{ debugName: "mappedGanttNodes" }] : []));
@@ -334,27 +334,58 @@ class TimelineGantt {
334
334
  progressTemplateDirective = input(null, ...(ngDevMode ? [{ debugName: "progressTemplateDirective" }] : []));
335
335
  toggleCollapse = output();
336
336
  progressClick = output();
337
- // Builds sticky metadata columns and computes their sticky offsets.
338
- resolvedColumns = computed(() => {
337
+ // Resolves the base columns contract before splitter-specific layout is applied.
338
+ baseResolvedColumns = computed(() => {
339
339
  const providedColumns = this.columns();
340
340
  const baseColumns = providedColumns === null ? this.buildLegacyColumns() : providedColumns;
341
341
  const resolvedTreeColumnIndex = Math.max(0, baseColumns.findIndex((column) => column.tree === true));
342
342
  return baseColumns.map((column, index) => {
343
- const widthPx = Math.max(0, Math.floor(column.widthPx ?? this.ganttInitiativeColumnWidthPx()));
343
+ const baseWidthPx = Math.max(0, Math.floor(column.widthPx ?? this.ganttInitiativeColumnWidthPx()));
344
344
  const resolvedColumn = {
345
345
  ...column,
346
346
  header: column.header ?? column.key,
347
- widthPx,
347
+ baseWidthPx,
348
+ widthPx: baseWidthPx,
348
349
  position: column.position ?? 'start',
349
350
  isTreeColumn: index === resolvedTreeColumnIndex,
350
351
  };
351
352
  return resolvedColumn;
352
353
  });
354
+ }, ...(ngDevMode ? [{ debugName: "baseResolvedColumns" }] : []));
355
+ baseColumnsWidthPx = computed(() => this.baseResolvedColumns().reduce((total, column) => total + column.baseWidthPx, 0), ...(ngDevMode ? [{ debugName: "baseColumnsWidthPx" }] : []));
356
+ preferredDefaultColumnsPaneWidthPx = computed(() => {
357
+ const columns = this.baseResolvedColumns();
358
+ if (!columns.length) {
359
+ return 0;
360
+ }
361
+ const visibleColumns = this.defaultVisibleColumns();
362
+ if (visibleColumns === null || visibleColumns === undefined) {
363
+ return this.baseColumnsWidthPx();
364
+ }
365
+ const normalizedVisibleColumns = Math.max(0, Math.floor(visibleColumns));
366
+ if (normalizedVisibleColumns <= 0) {
367
+ return 0;
368
+ }
369
+ return columns
370
+ .slice(0, Math.min(normalizedVisibleColumns, columns.length))
371
+ .reduce((total, column) => total + column.baseWidthPx, 0);
372
+ }, ...(ngDevMode ? [{ debugName: "preferredDefaultColumnsPaneWidthPx" }] : []));
373
+ // Column viewport and column content width are treated separately:
374
+ // - splitter controls the viewport width
375
+ // - columns keep base widths until there is extra space to relax into
376
+ resolvedColumns = computed(() => {
377
+ const columns = this.baseResolvedColumns();
378
+ const paneWidthPx = this.resolvedColumnsPaneWidthPx();
379
+ const totalBaseWidthPx = this.baseColumnsWidthPx();
380
+ if (paneWidthPx <= totalBaseWidthPx) {
381
+ return columns;
382
+ }
383
+ return this.stretchColumnsToWidth(columns, paneWidthPx);
353
384
  }, ...(ngDevMode ? [{ debugName: "resolvedColumns" }] : []));
354
- stickyColumnsWidth = computed(() => this.resolvedColumns().reduce((total, column) => total + column.widthPx, 0), ...(ngDevMode ? [{ debugName: "stickyColumnsWidth" }] : []));
385
+ columnsContentWidthPx = computed(() => this.resolvedColumns().reduce((total, column) => total + column.widthPx, 0), ...(ngDevMode ? [{ debugName: "columnsContentWidthPx" }] : []));
355
386
  resolvedColumnsPaneWidthPx = computed(() => {
356
387
  const userWidth = this.columnsPaneUserWidthPx();
357
- const preferredWidth = userWidth ?? this.stickyColumnsWidth();
388
+ const preferredWidth = userWidth ?? this.preferredDefaultColumnsPaneWidthPx();
358
389
  return this.clampColumnsPaneWidth(preferredWidth);
359
390
  }, ...(ngDevMode ? [{ debugName: "resolvedColumnsPaneWidthPx" }] : []));
360
391
  // Segment width expands to fill viewport when possible but never goes below base width.
@@ -534,7 +565,8 @@ class TimelineGantt {
534
565
  this.applyColumnsPaneWidth(0);
535
566
  return;
536
567
  }
537
- const restoreWidth = this.lastExpandedColumnsPaneWidthPx() ?? this.stickyColumnsWidth();
568
+ const restoreWidth = this.lastExpandedColumnsPaneWidthPx() ??
569
+ this.preferredDefaultColumnsPaneWidthPx();
538
570
  this.applyColumnsPaneWidth(restoreWidth);
539
571
  }
540
572
  // Legacy fallback columns when consumer does not provide `columns`.
@@ -631,6 +663,32 @@ class TimelineGantt {
631
663
  }
632
664
  return Math.max(0, Math.min(100, value));
633
665
  }
666
+ stretchColumnsToWidth(columns, targetWidthPx) {
667
+ const totalBaseWidthPx = columns.reduce((total, column) => total + column.baseWidthPx, 0);
668
+ if (!columns.length || totalBaseWidthPx <= 0) {
669
+ return columns;
670
+ }
671
+ const normalizedTargetWidthPx = Math.max(totalBaseWidthPx, Math.floor(targetWidthPx));
672
+ let assignedWidthPx = 0;
673
+ let assignedBaseWidthPx = 0;
674
+ return columns.map((column, index) => {
675
+ if (index === columns.length - 1) {
676
+ return {
677
+ ...column,
678
+ widthPx: Math.max(column.baseWidthPx, normalizedTargetWidthPx - assignedWidthPx),
679
+ };
680
+ }
681
+ const remainingTargetWidthPx = normalizedTargetWidthPx - assignedWidthPx;
682
+ const remainingBaseWidthPx = totalBaseWidthPx - assignedBaseWidthPx;
683
+ const widthPx = Math.max(column.baseWidthPx, Math.floor((remainingTargetWidthPx * column.baseWidthPx) / remainingBaseWidthPx));
684
+ assignedWidthPx += widthPx;
685
+ assignedBaseWidthPx += column.baseWidthPx;
686
+ return {
687
+ ...column,
688
+ widthPx,
689
+ };
690
+ });
691
+ }
634
692
  columnsPaneMaxAllowedWidthPx() {
635
693
  const containerWidth = this.ganttContainerWidth();
636
694
  if (containerWidth <= 0) {
@@ -662,18 +720,18 @@ class TimelineGantt {
662
720
  return dir.toLowerCase() === 'rtl';
663
721
  }
664
722
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: TimelineGantt, deps: [], target: i0.ɵɵFactoryTarget.Component });
665
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: TimelineGantt, isStandalone: true, selector: "mt-timeline-gantt", inputs: { timelineMode: { classPropertyName: "timelineMode", publicName: "timelineMode", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, ganttTitleColumnLabel: { classPropertyName: "ganttTitleColumnLabel", publicName: "ganttTitleColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnLabel: { classPropertyName: "ganttStatusColumnLabel", publicName: "ganttStatusColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttInitiativeColumnWidthPx: { classPropertyName: "ganttInitiativeColumnWidthPx", publicName: "ganttInitiativeColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnWidthPx: { classPropertyName: "ganttStatusColumnWidthPx", publicName: "ganttStatusColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, showGanttStatusColumn: { classPropertyName: "showGanttStatusColumn", publicName: "showGanttStatusColumn", isSignal: true, isRequired: false, transformFunction: null }, ganttSegmentWidthPx: { classPropertyName: "ganttSegmentWidthPx", publicName: "ganttSegmentWidthPx", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMinWidthPx: { classPropertyName: "columnsPaneMinWidthPx", publicName: "columnsPaneMinWidthPx", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMaxWidthPx: { classPropertyName: "columnsPaneMaxWidthPx", publicName: "columnsPaneMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, mappedGanttNodes: { classPropertyName: "mappedGanttNodes", publicName: "mappedGanttNodes", isSignal: true, isRequired: false, transformFunction: null }, orderedGanttSegments: { classPropertyName: "orderedGanttSegments", publicName: "orderedGanttSegments", isSignal: true, isRequired: false, transformFunction: null }, collapsedGanttIds: { classPropertyName: "collapsedGanttIds", publicName: "collapsedGanttIds", isSignal: true, isRequired: false, transformFunction: null }, columnTemplatesByKey: { classPropertyName: "columnTemplatesByKey", publicName: "columnTemplatesByKey", isSignal: true, isRequired: false, transformFunction: null }, progressTemplateDirective: { classPropertyName: "progressTemplateDirective", publicName: "progressTemplateDirective", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleCollapse: "toggleCollapse", progressClick: "progressClick" }, viewQueries: [{ propertyName: "ganttSplitContainerRef", first: true, predicate: ["ganttSplitContainer"], descendants: true }, { propertyName: "ganttScrollViewportRef", first: true, predicate: ["ganttScrollViewport"], descendants: true }], ngImport: i0, template: "<!-- Gantt view shell: scroll viewport + sized timeline table. -->\r\n<div class=\"min-h-56 min-w-0 overflow-hidden p-4\">\r\n <div\r\n class=\"flex min-w-0 border border-surface bg-content\"\r\n #ganttSplitContainer\r\n >\r\n <!-- Fixed metadata columns pane. -->\r\n <div\r\n class=\"shrink-0 overflow-hidden\"\r\n [style.width.px]=\"resolvedColumnsPaneWidthPx()\"\r\n >\r\n <mt-timeline-gantt-header\r\n [timelineMode]=\"timelineMode()\"\r\n [resolvedColumns]=\"resolvedColumns()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [ganttCanvasWidth]=\"0\"\r\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\r\n [renderTimeline]=\"false\"\r\n />\r\n\r\n <div>\r\n @for (item of resolvedGanttItems(); track $index) {\r\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"resolvedColumns()\"\n [ganttCanvasWidth]=\"0\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderTimeline]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (canResizeColumnsPane()) {\r\n <button\r\n type=\"button\"\r\n class=\"mt-timeline-splitter shrink-0\"\r\n [class.mt-timeline-splitter-active]=\"isColumnsResizing()\"\r\n (pointerdown)=\"onSplitterPointerDown($event)\"\r\n (dblclick)=\"onSplitterDoubleClick()\"\r\n (keydown)=\"onSplitterKeyDown($event)\"\r\n aria-label=\"Resize columns pane\"\r\n title=\"Drag to resize. Double-click to collapse/restore.\"\r\n ></button>\r\n }\r\n\r\n <!-- Scrollable timeline pane (horizontal scroll is limited to this area). -->\r\n <div\r\n class=\"mt-timeline-scroll min-w-0 flex-1 overflow-x-auto overflow-y-hidden\"\r\n #ganttScrollViewport\r\n >\r\n <div class=\"min-w-full\" [style.width.px]=\"ganttCanvasWidth()\">\r\n <mt-timeline-gantt-header\r\n [timelineMode]=\"timelineMode()\"\r\n [resolvedColumns]=\"resolvedColumns()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\r\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\r\n [renderColumns]=\"false\"\r\n />\r\n\r\n <div>\r\n @for (item of resolvedGanttItems(); track $index) {\r\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"[]\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderColumns]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;min-width:0;max-width:100%}.mt-timeline-scroll{min-width:0;scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-timeline-scroll::-webkit-scrollbar{height:10px}.mt-timeline-scroll::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p-surface-200) 30%,transparent);border-radius:9999px}.mt-timeline-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-500) 60%,transparent);border-radius:9999px;border:2px solid transparent;background-clip:content-box}.mt-timeline-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 65%,transparent);background-clip:content-box}.mt-timeline-splitter{position:relative;width:10px;min-width:10px;border:0;border-inline:1px solid color-mix(in srgb,var(--p-surface-300) 60%,transparent);background:color-mix(in srgb,var(--p-surface-50) 50%,transparent);cursor:col-resize;touch-action:none;transition:background-color .12s ease}.mt-timeline-splitter:before{content:\"\";position:absolute;top:8px;bottom:8px;inset-inline-start:50%;width:2px;transform:translate(-50%);border-radius:9999px;background:color-mix(in srgb,var(--p-surface-500) 45%,transparent);transition:background-color .12s ease}.mt-timeline-splitter:hover:before,.mt-timeline-splitter-active:before{background:color-mix(in srgb,var(--p-primary-color) 70%,var(--p-surface-400))}.mt-timeline-splitter:hover{background:color-mix(in srgb,var(--p-surface-100) 60%,transparent)}.mt-timeline-splitter:focus-visible{outline:2px solid color-mix(in srgb,var(--p-primary-color) 60%,transparent);outline-offset:-1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TimelineGanttHeader, selector: "mt-timeline-gantt-header", inputs: ["timelineMode", "resolvedColumns", "orderedGanttSegments", "ganttCanvasWidth", "effectiveGanttSegmentWidthPx", "renderColumns", "renderTimeline"] }, { kind: "component", type: TimelineGanttRow, selector: "mt-timeline-gantt-row", inputs: ["item", "resolvedColumns", "ganttCanvasWidth", "laneInsetPx", "renderColumns", "renderTimeline", "columnTemplatesByKey", "progressTemplateDirective"], outputs: ["toggleCollapse", "progressClick"] }] });
723
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: TimelineGantt, isStandalone: true, selector: "mt-timeline-gantt", inputs: { timelineMode: { classPropertyName: "timelineMode", publicName: "timelineMode", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, ganttTitleColumnLabel: { classPropertyName: "ganttTitleColumnLabel", publicName: "ganttTitleColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnLabel: { classPropertyName: "ganttStatusColumnLabel", publicName: "ganttStatusColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttInitiativeColumnWidthPx: { classPropertyName: "ganttInitiativeColumnWidthPx", publicName: "ganttInitiativeColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnWidthPx: { classPropertyName: "ganttStatusColumnWidthPx", publicName: "ganttStatusColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, showGanttStatusColumn: { classPropertyName: "showGanttStatusColumn", publicName: "showGanttStatusColumn", isSignal: true, isRequired: false, transformFunction: null }, ganttSegmentWidthPx: { classPropertyName: "ganttSegmentWidthPx", publicName: "ganttSegmentWidthPx", isSignal: true, isRequired: false, transformFunction: null }, defaultVisibleColumns: { classPropertyName: "defaultVisibleColumns", publicName: "defaultVisibleColumns", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMinWidthPx: { classPropertyName: "columnsPaneMinWidthPx", publicName: "columnsPaneMinWidthPx", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMaxWidthPx: { classPropertyName: "columnsPaneMaxWidthPx", publicName: "columnsPaneMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, mappedGanttNodes: { classPropertyName: "mappedGanttNodes", publicName: "mappedGanttNodes", isSignal: true, isRequired: false, transformFunction: null }, orderedGanttSegments: { classPropertyName: "orderedGanttSegments", publicName: "orderedGanttSegments", isSignal: true, isRequired: false, transformFunction: null }, collapsedGanttIds: { classPropertyName: "collapsedGanttIds", publicName: "collapsedGanttIds", isSignal: true, isRequired: false, transformFunction: null }, columnTemplatesByKey: { classPropertyName: "columnTemplatesByKey", publicName: "columnTemplatesByKey", isSignal: true, isRequired: false, transformFunction: null }, progressTemplateDirective: { classPropertyName: "progressTemplateDirective", publicName: "progressTemplateDirective", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleCollapse: "toggleCollapse", progressClick: "progressClick" }, viewQueries: [{ propertyName: "ganttSplitContainerRef", first: true, predicate: ["ganttSplitContainer"], descendants: true }, { propertyName: "ganttScrollViewportRef", first: true, predicate: ["ganttScrollViewport"], descendants: true }], ngImport: i0, template: "<!-- Gantt view shell: scroll viewport + sized timeline table. -->\n<div class=\"min-h-56 min-w-0 overflow-hidden py-2\">\n <div\n class=\"flex min-w-0 border border-surface bg-content\"\n #ganttSplitContainer\n >\n <!-- Fixed metadata columns pane. -->\n <div\n class=\"shrink-0 overflow-hidden\"\n [style.width.px]=\"resolvedColumnsPaneWidthPx()\"\n >\n <div class=\"mt-timeline-scroll h-full overflow-x-auto overflow-y-hidden\">\n <div class=\"min-w-full\" [style.width.px]=\"columnsContentWidthPx()\">\n <mt-timeline-gantt-header\n [timelineMode]=\"timelineMode()\"\n [resolvedColumns]=\"resolvedColumns()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [ganttCanvasWidth]=\"0\"\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\n [renderTimeline]=\"false\"\n />\n\n <div>\n @for (item of resolvedGanttItems(); track $index) {\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"resolvedColumns()\"\n [ganttCanvasWidth]=\"0\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderTimeline]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n\n @if (canResizeColumnsPane()) {\n <button\n type=\"button\"\n class=\"mt-timeline-splitter shrink-0\"\n [class.mt-timeline-splitter-active]=\"isColumnsResizing()\"\n (pointerdown)=\"onSplitterPointerDown($event)\"\n (dblclick)=\"onSplitterDoubleClick()\"\n (keydown)=\"onSplitterKeyDown($event)\"\n aria-label=\"Resize columns pane\"\n title=\"Drag to resize. Double-click to collapse/restore.\"\n ></button>\n }\n\n <!-- Scrollable timeline pane (horizontal scroll is limited to this area). -->\n <div\n class=\"mt-timeline-scroll min-w-0 flex-1 overflow-x-auto overflow-y-hidden\"\n #ganttScrollViewport\n >\n <div class=\"min-w-full\" [style.width.px]=\"ganttCanvasWidth()\">\n <mt-timeline-gantt-header\n [timelineMode]=\"timelineMode()\"\n [resolvedColumns]=\"resolvedColumns()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\n [renderColumns]=\"false\"\n />\n\n <div>\n @for (item of resolvedGanttItems(); track $index) {\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"[]\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderColumns]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;min-width:0;max-width:100%}.mt-timeline-scroll{min-width:0;scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-timeline-scroll::-webkit-scrollbar{height:10px}.mt-timeline-scroll::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p-surface-200) 30%,transparent);border-radius:9999px}.mt-timeline-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-500) 60%,transparent);border-radius:9999px;border:2px solid transparent;background-clip:content-box}.mt-timeline-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 65%,transparent);background-clip:content-box}.mt-timeline-splitter{position:relative;width:10px;min-width:10px;border:0;overflow:visible;background:linear-gradient(90deg,transparent 0,transparent calc(50% - 4px),color-mix(in srgb,var(--p-surface-300) 45%,transparent) calc(50% - 4px),color-mix(in srgb,var(--p-surface-300) 45%,transparent) calc(50% + 4px),transparent calc(50% + 4px),transparent 100%),linear-gradient(90deg,transparent 0,transparent calc(50% - 1px),color-mix(in srgb,var(--p-surface-500) 72%,white 28%) calc(50% - 1px),color-mix(in srgb,var(--p-surface-500) 72%,white 28%) calc(50% + 1px),transparent calc(50% + 1px),transparent 100%);cursor:col-resize;touch-action:none;transition:background .14s ease,opacity .14s ease,filter .14s ease}.mt-timeline-splitter:hover,.mt-timeline-splitter-active,.mt-timeline-splitter:focus-visible{background:linear-gradient(90deg,transparent 0,transparent calc(50% - 4px),color-mix(in srgb,var(--p-primary-color) 22%,transparent) calc(50% - 4px),color-mix(in srgb,var(--p-primary-color) 22%,transparent) calc(50% + 4px),transparent calc(50% + 4px),transparent 100%),linear-gradient(90deg,transparent 0,transparent calc(50% - 1px),color-mix(in srgb,var(--p-primary-color) 88%,white 12%) calc(50% - 1px),color-mix(in srgb,var(--p-primary-color) 88%,white 12%) calc(50% + 1px),transparent calc(50% + 1px),transparent 100%)}.mt-timeline-splitter:before{content:\"\";position:absolute;top:50%;inset-inline-start:50%;width:16px;height:42px;transform:translate(-50%,-50%) scale(1);opacity:1;border-radius:9999px;border:1px solid color-mix(in srgb,var(--p-surface-300) 72%,transparent);background:var(--p-surface-0);box-shadow:0 6px 16px -14px color-mix(in srgb,var(--p-surface-400) 18%,transparent),0 2px 6px -4px color-mix(in srgb,black 16%,transparent);pointer-events:none;transition:opacity .14s ease,transform .14s ease,border-color .14s ease,box-shadow .14s ease}.mt-timeline-splitter:after{content:\"\";position:absolute;top:50%;inset-inline-start:50%;width:6px;height:16px;transform:translate(-50%,-50%) scale(1);opacity:1;border-radius:9999px;background:linear-gradient(90deg,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 0,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 2px,transparent 2px,transparent 4px,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 4px,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 6px);pointer-events:none;transition:opacity .14s ease,transform .14s ease,background .14s ease}.mt-timeline-splitter:hover:before,.mt-timeline-splitter-active:before,.mt-timeline-splitter:focus-visible:before{border-color:color-mix(in srgb,var(--p-primary-color) 18%,var(--p-surface-200));box-shadow:0 8px 18px -16px color-mix(in srgb,var(--p-primary-color) 28%,transparent),0 4px 8px -6px color-mix(in srgb,black 18%,transparent)}.mt-timeline-splitter:hover:after,.mt-timeline-splitter-active:after,.mt-timeline-splitter:focus-visible:after{background:linear-gradient(90deg,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 0,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 2px,transparent 2px,transparent 4px,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 4px,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 6px)}.mt-timeline-splitter:hover{filter:saturate(1.03)}.mt-timeline-splitter:focus-visible{outline:none}.mt-timeline-splitter:focus-visible:before{box-shadow:0 0 0 3px color-mix(in srgb,var(--p-primary-color) 14%,transparent),0 8px 18px -16px color-mix(in srgb,var(--p-primary-color) 28%,transparent),0 4px 8px -6px color-mix(in srgb,black 18%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TimelineGanttHeader, selector: "mt-timeline-gantt-header", inputs: ["timelineMode", "resolvedColumns", "orderedGanttSegments", "ganttCanvasWidth", "effectiveGanttSegmentWidthPx", "renderColumns", "renderTimeline"] }, { kind: "component", type: TimelineGanttRow, selector: "mt-timeline-gantt-row", inputs: ["item", "resolvedColumns", "ganttCanvasWidth", "laneInsetPx", "renderColumns", "renderTimeline", "columnTemplatesByKey", "progressTemplateDirective"], outputs: ["toggleCollapse", "progressClick"] }] });
666
724
  }
667
725
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: TimelineGantt, decorators: [{
668
726
  type: Component,
669
- args: [{ selector: 'mt-timeline-gantt', standalone: true, imports: [CommonModule, TimelineGanttHeader, TimelineGanttRow], template: "<!-- Gantt view shell: scroll viewport + sized timeline table. -->\r\n<div class=\"min-h-56 min-w-0 overflow-hidden p-4\">\r\n <div\r\n class=\"flex min-w-0 border border-surface bg-content\"\r\n #ganttSplitContainer\r\n >\r\n <!-- Fixed metadata columns pane. -->\r\n <div\r\n class=\"shrink-0 overflow-hidden\"\r\n [style.width.px]=\"resolvedColumnsPaneWidthPx()\"\r\n >\r\n <mt-timeline-gantt-header\r\n [timelineMode]=\"timelineMode()\"\r\n [resolvedColumns]=\"resolvedColumns()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [ganttCanvasWidth]=\"0\"\r\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\r\n [renderTimeline]=\"false\"\r\n />\r\n\r\n <div>\r\n @for (item of resolvedGanttItems(); track $index) {\r\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"resolvedColumns()\"\n [ganttCanvasWidth]=\"0\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderTimeline]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (canResizeColumnsPane()) {\r\n <button\r\n type=\"button\"\r\n class=\"mt-timeline-splitter shrink-0\"\r\n [class.mt-timeline-splitter-active]=\"isColumnsResizing()\"\r\n (pointerdown)=\"onSplitterPointerDown($event)\"\r\n (dblclick)=\"onSplitterDoubleClick()\"\r\n (keydown)=\"onSplitterKeyDown($event)\"\r\n aria-label=\"Resize columns pane\"\r\n title=\"Drag to resize. Double-click to collapse/restore.\"\r\n ></button>\r\n }\r\n\r\n <!-- Scrollable timeline pane (horizontal scroll is limited to this area). -->\r\n <div\r\n class=\"mt-timeline-scroll min-w-0 flex-1 overflow-x-auto overflow-y-hidden\"\r\n #ganttScrollViewport\r\n >\r\n <div class=\"min-w-full\" [style.width.px]=\"ganttCanvasWidth()\">\r\n <mt-timeline-gantt-header\r\n [timelineMode]=\"timelineMode()\"\r\n [resolvedColumns]=\"resolvedColumns()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\r\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\r\n [renderColumns]=\"false\"\r\n />\r\n\r\n <div>\r\n @for (item of resolvedGanttItems(); track $index) {\r\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"[]\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderColumns]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;min-width:0;max-width:100%}.mt-timeline-scroll{min-width:0;scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-timeline-scroll::-webkit-scrollbar{height:10px}.mt-timeline-scroll::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p-surface-200) 30%,transparent);border-radius:9999px}.mt-timeline-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-500) 60%,transparent);border-radius:9999px;border:2px solid transparent;background-clip:content-box}.mt-timeline-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 65%,transparent);background-clip:content-box}.mt-timeline-splitter{position:relative;width:10px;min-width:10px;border:0;border-inline:1px solid color-mix(in srgb,var(--p-surface-300) 60%,transparent);background:color-mix(in srgb,var(--p-surface-50) 50%,transparent);cursor:col-resize;touch-action:none;transition:background-color .12s ease}.mt-timeline-splitter:before{content:\"\";position:absolute;top:8px;bottom:8px;inset-inline-start:50%;width:2px;transform:translate(-50%);border-radius:9999px;background:color-mix(in srgb,var(--p-surface-500) 45%,transparent);transition:background-color .12s ease}.mt-timeline-splitter:hover:before,.mt-timeline-splitter-active:before{background:color-mix(in srgb,var(--p-primary-color) 70%,var(--p-surface-400))}.mt-timeline-splitter:hover{background:color-mix(in srgb,var(--p-surface-100) 60%,transparent)}.mt-timeline-splitter:focus-visible{outline:2px solid color-mix(in srgb,var(--p-primary-color) 60%,transparent);outline-offset:-1px}\n"] }]
727
+ args: [{ selector: 'mt-timeline-gantt', standalone: true, imports: [CommonModule, TimelineGanttHeader, TimelineGanttRow], template: "<!-- Gantt view shell: scroll viewport + sized timeline table. -->\n<div class=\"min-h-56 min-w-0 overflow-hidden py-2\">\n <div\n class=\"flex min-w-0 border border-surface bg-content\"\n #ganttSplitContainer\n >\n <!-- Fixed metadata columns pane. -->\n <div\n class=\"shrink-0 overflow-hidden\"\n [style.width.px]=\"resolvedColumnsPaneWidthPx()\"\n >\n <div class=\"mt-timeline-scroll h-full overflow-x-auto overflow-y-hidden\">\n <div class=\"min-w-full\" [style.width.px]=\"columnsContentWidthPx()\">\n <mt-timeline-gantt-header\n [timelineMode]=\"timelineMode()\"\n [resolvedColumns]=\"resolvedColumns()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [ganttCanvasWidth]=\"0\"\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\n [renderTimeline]=\"false\"\n />\n\n <div>\n @for (item of resolvedGanttItems(); track $index) {\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"resolvedColumns()\"\n [ganttCanvasWidth]=\"0\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderTimeline]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n\n @if (canResizeColumnsPane()) {\n <button\n type=\"button\"\n class=\"mt-timeline-splitter shrink-0\"\n [class.mt-timeline-splitter-active]=\"isColumnsResizing()\"\n (pointerdown)=\"onSplitterPointerDown($event)\"\n (dblclick)=\"onSplitterDoubleClick()\"\n (keydown)=\"onSplitterKeyDown($event)\"\n aria-label=\"Resize columns pane\"\n title=\"Drag to resize. Double-click to collapse/restore.\"\n ></button>\n }\n\n <!-- Scrollable timeline pane (horizontal scroll is limited to this area). -->\n <div\n class=\"mt-timeline-scroll min-w-0 flex-1 overflow-x-auto overflow-y-hidden\"\n #ganttScrollViewport\n >\n <div class=\"min-w-full\" [style.width.px]=\"ganttCanvasWidth()\">\n <mt-timeline-gantt-header\n [timelineMode]=\"timelineMode()\"\n [resolvedColumns]=\"resolvedColumns()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\n [renderColumns]=\"false\"\n />\n\n <div>\n @for (item of resolvedGanttItems(); track $index) {\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"[]\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderColumns]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;min-width:0;max-width:100%}.mt-timeline-scroll{min-width:0;scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-timeline-scroll::-webkit-scrollbar{height:10px}.mt-timeline-scroll::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p-surface-200) 30%,transparent);border-radius:9999px}.mt-timeline-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-500) 60%,transparent);border-radius:9999px;border:2px solid transparent;background-clip:content-box}.mt-timeline-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 65%,transparent);background-clip:content-box}.mt-timeline-splitter{position:relative;width:10px;min-width:10px;border:0;overflow:visible;background:linear-gradient(90deg,transparent 0,transparent calc(50% - 4px),color-mix(in srgb,var(--p-surface-300) 45%,transparent) calc(50% - 4px),color-mix(in srgb,var(--p-surface-300) 45%,transparent) calc(50% + 4px),transparent calc(50% + 4px),transparent 100%),linear-gradient(90deg,transparent 0,transparent calc(50% - 1px),color-mix(in srgb,var(--p-surface-500) 72%,white 28%) calc(50% - 1px),color-mix(in srgb,var(--p-surface-500) 72%,white 28%) calc(50% + 1px),transparent calc(50% + 1px),transparent 100%);cursor:col-resize;touch-action:none;transition:background .14s ease,opacity .14s ease,filter .14s ease}.mt-timeline-splitter:hover,.mt-timeline-splitter-active,.mt-timeline-splitter:focus-visible{background:linear-gradient(90deg,transparent 0,transparent calc(50% - 4px),color-mix(in srgb,var(--p-primary-color) 22%,transparent) calc(50% - 4px),color-mix(in srgb,var(--p-primary-color) 22%,transparent) calc(50% + 4px),transparent calc(50% + 4px),transparent 100%),linear-gradient(90deg,transparent 0,transparent calc(50% - 1px),color-mix(in srgb,var(--p-primary-color) 88%,white 12%) calc(50% - 1px),color-mix(in srgb,var(--p-primary-color) 88%,white 12%) calc(50% + 1px),transparent calc(50% + 1px),transparent 100%)}.mt-timeline-splitter:before{content:\"\";position:absolute;top:50%;inset-inline-start:50%;width:16px;height:42px;transform:translate(-50%,-50%) scale(1);opacity:1;border-radius:9999px;border:1px solid color-mix(in srgb,var(--p-surface-300) 72%,transparent);background:var(--p-surface-0);box-shadow:0 6px 16px -14px color-mix(in srgb,var(--p-surface-400) 18%,transparent),0 2px 6px -4px color-mix(in srgb,black 16%,transparent);pointer-events:none;transition:opacity .14s ease,transform .14s ease,border-color .14s ease,box-shadow .14s ease}.mt-timeline-splitter:after{content:\"\";position:absolute;top:50%;inset-inline-start:50%;width:6px;height:16px;transform:translate(-50%,-50%) scale(1);opacity:1;border-radius:9999px;background:linear-gradient(90deg,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 0,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 2px,transparent 2px,transparent 4px,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 4px,color-mix(in srgb,var(--p-surface-500) 78%,white 22%) 6px);pointer-events:none;transition:opacity .14s ease,transform .14s ease,background .14s ease}.mt-timeline-splitter:hover:before,.mt-timeline-splitter-active:before,.mt-timeline-splitter:focus-visible:before{border-color:color-mix(in srgb,var(--p-primary-color) 18%,var(--p-surface-200));box-shadow:0 8px 18px -16px color-mix(in srgb,var(--p-primary-color) 28%,transparent),0 4px 8px -6px color-mix(in srgb,black 18%,transparent)}.mt-timeline-splitter:hover:after,.mt-timeline-splitter-active:after,.mt-timeline-splitter:focus-visible:after{background:linear-gradient(90deg,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 0,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 2px,transparent 2px,transparent 4px,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 4px,color-mix(in srgb,var(--p-primary-color) 88%,white 12%) 6px)}.mt-timeline-splitter:hover{filter:saturate(1.03)}.mt-timeline-splitter:focus-visible{outline:none}.mt-timeline-splitter:focus-visible:before{box-shadow:0 0 0 3px color-mix(in srgb,var(--p-primary-color) 14%,transparent),0 8px 18px -16px color-mix(in srgb,var(--p-primary-color) 28%,transparent),0 4px 8px -6px color-mix(in srgb,black 18%,transparent)}\n"] }]
670
728
  }], propDecorators: { ganttSplitContainerRef: [{
671
729
  type: ViewChild,
672
730
  args: ['ganttSplitContainer']
673
731
  }], ganttScrollViewportRef: [{
674
732
  type: ViewChild,
675
733
  args: ['ganttScrollViewport']
676
- }], timelineMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "timelineMode", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], ganttTitleColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttTitleColumnLabel", required: false }] }], ganttStatusColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnLabel", required: false }] }], ganttInitiativeColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttInitiativeColumnWidthPx", required: false }] }], ganttStatusColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnWidthPx", required: false }] }], showGanttStatusColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGanttStatusColumn", required: false }] }], ganttSegmentWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttSegmentWidthPx", required: false }] }], columnsPaneMinWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMinWidthPx", required: false }] }], columnsPaneMaxWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMaxWidthPx", required: false }] }], mappedGanttNodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "mappedGanttNodes", required: false }] }], orderedGanttSegments: [{ type: i0.Input, args: [{ isSignal: true, alias: "orderedGanttSegments", required: false }] }], collapsedGanttIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedGanttIds", required: false }] }], columnTemplatesByKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnTemplatesByKey", required: false }] }], progressTemplateDirective: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressTemplateDirective", required: false }] }], toggleCollapse: [{ type: i0.Output, args: ["toggleCollapse"] }], progressClick: [{ type: i0.Output, args: ["progressClick"] }] } });
734
+ }], timelineMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "timelineMode", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], ganttTitleColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttTitleColumnLabel", required: false }] }], ganttStatusColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnLabel", required: false }] }], ganttInitiativeColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttInitiativeColumnWidthPx", required: false }] }], ganttStatusColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnWidthPx", required: false }] }], showGanttStatusColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGanttStatusColumn", required: false }] }], ganttSegmentWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttSegmentWidthPx", required: false }] }], defaultVisibleColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultVisibleColumns", required: false }] }], columnsPaneMinWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMinWidthPx", required: false }] }], columnsPaneMaxWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMaxWidthPx", required: false }] }], mappedGanttNodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "mappedGanttNodes", required: false }] }], orderedGanttSegments: [{ type: i0.Input, args: [{ isSignal: true, alias: "orderedGanttSegments", required: false }] }], collapsedGanttIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedGanttIds", required: false }] }], columnTemplatesByKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnTemplatesByKey", required: false }] }], progressTemplateDirective: [{ type: i0.Input, args: [{ isSignal: true, alias: "progressTemplateDirective", required: false }] }], toggleCollapse: [{ type: i0.Output, args: ["toggleCollapse"] }], progressClick: [{ type: i0.Output, args: ["progressClick"] }] } });
677
735
 
678
736
  /**
679
737
  * Shared timeline header.
@@ -742,6 +800,7 @@ class Timeline {
742
800
  // Null means "legacy defaults". Empty array means "progress-only" mode.
743
801
  columns = input(null, ...(ngDevMode ? [{ debugName: "columns" }] : []));
744
802
  ganttSegmentWidthPx = input(96, ...(ngDevMode ? [{ debugName: "ganttSegmentWidthPx" }] : []));
803
+ defaultVisibleColumns = input(4, ...(ngDevMode ? [{ debugName: "defaultVisibleColumns" }] : []));
745
804
  columnsPaneMinWidthPx = input(0, ...(ngDevMode ? [{ debugName: "columnsPaneMinWidthPx" }] : []));
746
805
  columnsPaneMaxWidthPx = input(null, ...(ngDevMode ? [{ debugName: "columnsPaneMaxWidthPx" }] : []));
747
806
  // Backward-compatible defaults when `columns` is null.
@@ -1077,26 +1136,25 @@ class Timeline {
1077
1136
  return anchor;
1078
1137
  }
1079
1138
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Timeline, deps: [], target: i0.ɵɵFactoryTarget.Component });
1080
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: Timeline, isStandalone: true, selector: "mt-timeline", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, timelineMode: { classPropertyName: "timelineMode", publicName: "timelineMode", isSignal: true, isRequired: false, transformFunction: null }, timelineModeOptions: { classPropertyName: "timelineModeOptions", publicName: "timelineModeOptions", isSignal: true, isRequired: false, transformFunction: null }, ganttData: { classPropertyName: "ganttData", publicName: "ganttData", isSignal: true, isRequired: false, transformFunction: null }, ganttMapping: { classPropertyName: "ganttMapping", publicName: "ganttMapping", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, ganttSegmentWidthPx: { classPropertyName: "ganttSegmentWidthPx", publicName: "ganttSegmentWidthPx", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMinWidthPx: { classPropertyName: "columnsPaneMinWidthPx", publicName: "columnsPaneMinWidthPx", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMaxWidthPx: { classPropertyName: "columnsPaneMaxWidthPx", publicName: "columnsPaneMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, ganttTitleColumnLabel: { classPropertyName: "ganttTitleColumnLabel", publicName: "ganttTitleColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnLabel: { classPropertyName: "ganttStatusColumnLabel", publicName: "ganttStatusColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttInitiativeColumnWidthPx: { classPropertyName: "ganttInitiativeColumnWidthPx", publicName: "ganttInitiativeColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnWidthPx: { classPropertyName: "ganttStatusColumnWidthPx", publicName: "ganttStatusColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, showGanttStatusColumn: { classPropertyName: "showGanttStatusColumn", publicName: "showGanttStatusColumn", isSignal: true, isRequired: false, transformFunction: null }, showGanttDetailsPopup: { classPropertyName: "showGanttDetailsPopup", publicName: "showGanttDetailsPopup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { timelineMode: "timelineModeChange", timelineModeChangeEvent: "timelineModeChangeEvent", ganttItemClick: "ganttItemClick" }, host: { classAttribute: "block" }, queries: [{ propertyName: "ganttTemplate", first: true, predicate: TimelineGanttTemplateDirective, descendants: true, isSignal: true }, { propertyName: "columnTemplates", predicate: (TimelineColumnTemplateDirective), isSignal: true }, { propertyName: "popoverTemplate", first: true, predicate: (TimelinePopoverTemplateDirective), descendants: true, isSignal: true }, { propertyName: "progressTemplate", first: true, predicate: (TimelineProgressTemplateDirective), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "detailsPopover", first: true, predicate: ["detailsPopover"], descendants: true }, { propertyName: "detailsPopoverClickAnchor", first: true, predicate: ["detailsPopoverClickAnchor"], descendants: true }], ngImport: i0, template: "<mt-card class=\"mt-3 block overflow-hidden\">\r\n <!-- Optional top header (title + timeline mode selector). -->\r\n @if (showHeader()) {\r\n <mt-timeline-header\r\n [title]=\"title()\"\r\n [timelineMode]=\"timelineMode()\"\r\n [timelineModeOptions]=\"timelineModeOptions()\"\r\n (timelineModeChange)=\"onTimelineModeChange($event)\"\r\n />\r\n }\r\n\r\n <!-- Loading state. -->\r\n @if (isLoading()) {\r\n <div class=\"flex min-h-56 items-center justify-center p-8\">\r\n <div\r\n class=\"h-8 w-8 animate-spin rounded-full border-2 border-surface-200\"\r\n style=\"border-top-color: var(--p-primary-color)\"\r\n ></div>\r\n </div>\r\n } @else if (ganttTemplate(); as template) {\r\n <!-- Full custom gantt-body override. -->\r\n <div class=\"min-h-56 p-4\">\r\n <ng-container [ngTemplateOutlet]=\"template.templateRef\"></ng-container>\r\n </div>\r\n } @else if (\r\n mappedGanttNodes().length > 0 && orderedGanttSegments().length > 0\r\n ) {\r\n <!-- Built-in gantt renderer. -->\r\n <mt-timeline-gantt\r\n [timelineMode]=\"timelineMode()\"\r\n [columns]=\"columns()\"\r\n [ganttTitleColumnLabel]=\"ganttTitleColumnLabel()\"\r\n [ganttStatusColumnLabel]=\"ganttStatusColumnLabel()\"\r\n [ganttInitiativeColumnWidthPx]=\"ganttInitiativeColumnWidthPx()\"\r\n [ganttStatusColumnWidthPx]=\"ganttStatusColumnWidthPx()\"\r\n [showGanttStatusColumn]=\"showGanttStatusColumn()\"\r\n [ganttSegmentWidthPx]=\"ganttSegmentWidthPx()\"\r\n [columnsPaneMinWidthPx]=\"columnsPaneMinWidthPx()\"\r\n [columnsPaneMaxWidthPx]=\"columnsPaneMaxWidthPx()\"\r\n [mappedGanttNodes]=\"mappedGanttNodes()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [collapsedGanttIds]=\"collapsedGanttIds()\"\r\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\r\n [progressTemplateDirective]=\"progressTemplate()\"\r\n (toggleCollapse)=\"toggleGanttCollapse($event)\"\r\n (progressClick)=\"onGanttProgressClick($event.item, $event.event)\"\r\n />\r\n } @else {\r\n <!-- Empty state. -->\r\n <div\r\n class=\"flex min-h-56 items-center justify-center p-8 text-sm text-surface-500\"\r\n >\r\n {{ emptyMessage() }}\r\n </div>\r\n }\r\n\r\n <!-- Details popover host (custom template or built-in fallback). -->\r\n <p-popover #detailsPopover appendTo=\"body\" (onHide)=\"onDetailsPopoverHide()\">\r\n @if (showGanttDetailsPopup() && selectedGanttItem(); as item) {\r\n @if (popoverTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template.templateRef\"\r\n [ngTemplateOutletContext]=\"getPopoverTemplateContext(item)\"\r\n ></ng-container>\r\n } @else {\r\n <mt-timeline-default-popover\r\n [item]=\"item\"\r\n (requestClose)=\"hideDetailsPopover()\"\r\n />\r\n }\r\n }\r\n </p-popover>\r\n\r\n <!-- Point anchor used to place the popover exactly where user clicked. -->\r\n <span\r\n #detailsPopoverClickAnchor\r\n class=\"pointer-events-none fixed h-0 w-0\"\r\n [style.left.px]=\"-9999\"\r\n [style.top.px]=\"-9999\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n</mt-card>\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: TimelineHeader, selector: "mt-timeline-header", inputs: ["title", "timelineMode", "timelineModeOptions"], outputs: ["timelineModeChange"] }, { kind: "component", type: TimelineGantt, selector: "mt-timeline-gantt", inputs: ["timelineMode", "columns", "ganttTitleColumnLabel", "ganttStatusColumnLabel", "ganttInitiativeColumnWidthPx", "ganttStatusColumnWidthPx", "showGanttStatusColumn", "ganttSegmentWidthPx", "columnsPaneMinWidthPx", "columnsPaneMaxWidthPx", "mappedGanttNodes", "orderedGanttSegments", "collapsedGanttIds", "columnTemplatesByKey", "progressTemplateDirective"], outputs: ["toggleCollapse", "progressClick"] }, { kind: "component", type: TimelineDefaultPopover, selector: "mt-timeline-default-popover", inputs: ["item"], outputs: ["requestClose"] }, { kind: "component", type: Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }] });
1139
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: Timeline, isStandalone: true, selector: "mt-timeline", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, timelineMode: { classPropertyName: "timelineMode", publicName: "timelineMode", isSignal: true, isRequired: false, transformFunction: null }, timelineModeOptions: { classPropertyName: "timelineModeOptions", publicName: "timelineModeOptions", isSignal: true, isRequired: false, transformFunction: null }, ganttData: { classPropertyName: "ganttData", publicName: "ganttData", isSignal: true, isRequired: false, transformFunction: null }, ganttMapping: { classPropertyName: "ganttMapping", publicName: "ganttMapping", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, ganttSegmentWidthPx: { classPropertyName: "ganttSegmentWidthPx", publicName: "ganttSegmentWidthPx", isSignal: true, isRequired: false, transformFunction: null }, defaultVisibleColumns: { classPropertyName: "defaultVisibleColumns", publicName: "defaultVisibleColumns", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMinWidthPx: { classPropertyName: "columnsPaneMinWidthPx", publicName: "columnsPaneMinWidthPx", isSignal: true, isRequired: false, transformFunction: null }, columnsPaneMaxWidthPx: { classPropertyName: "columnsPaneMaxWidthPx", publicName: "columnsPaneMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, ganttTitleColumnLabel: { classPropertyName: "ganttTitleColumnLabel", publicName: "ganttTitleColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnLabel: { classPropertyName: "ganttStatusColumnLabel", publicName: "ganttStatusColumnLabel", isSignal: true, isRequired: false, transformFunction: null }, ganttInitiativeColumnWidthPx: { classPropertyName: "ganttInitiativeColumnWidthPx", publicName: "ganttInitiativeColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, ganttStatusColumnWidthPx: { classPropertyName: "ganttStatusColumnWidthPx", publicName: "ganttStatusColumnWidthPx", isSignal: true, isRequired: false, transformFunction: null }, showGanttStatusColumn: { classPropertyName: "showGanttStatusColumn", publicName: "showGanttStatusColumn", isSignal: true, isRequired: false, transformFunction: null }, showGanttDetailsPopup: { classPropertyName: "showGanttDetailsPopup", publicName: "showGanttDetailsPopup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { timelineMode: "timelineModeChange", timelineModeChangeEvent: "timelineModeChangeEvent", ganttItemClick: "ganttItemClick" }, host: { classAttribute: "block" }, queries: [{ propertyName: "ganttTemplate", first: true, predicate: TimelineGanttTemplateDirective, descendants: true, isSignal: true }, { propertyName: "columnTemplates", predicate: (TimelineColumnTemplateDirective), isSignal: true }, { propertyName: "popoverTemplate", first: true, predicate: (TimelinePopoverTemplateDirective), descendants: true, isSignal: true }, { propertyName: "progressTemplate", first: true, predicate: (TimelineProgressTemplateDirective), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "detailsPopover", first: true, predicate: ["detailsPopover"], descendants: true }, { propertyName: "detailsPopoverClickAnchor", first: true, predicate: ["detailsPopoverClickAnchor"], descendants: true }], ngImport: i0, template: "<div class=\"mt-3 block overflow-hidden\">\n <!-- Optional top header (title + timeline mode selector). -->\n @if (showHeader()) {\n <mt-timeline-header\n [title]=\"title()\"\n [timelineMode]=\"timelineMode()\"\n [timelineModeOptions]=\"timelineModeOptions()\"\n (timelineModeChange)=\"onTimelineModeChange($event)\"\n />\n }\n\n <!-- Loading state. -->\n @if (isLoading()) {\n <div class=\"flex min-h-56 items-center justify-center p-8\">\n <div\n class=\"h-8 w-8 animate-spin rounded-full border-2 border-surface-200\"\n style=\"border-top-color: var(--p-primary-color)\"\n ></div>\n </div>\n } @else if (ganttTemplate(); as template) {\n <!-- Full custom gantt-body override. -->\n <div class=\"min-h-56 py-4\">\n <ng-container [ngTemplateOutlet]=\"template.templateRef\"></ng-container>\n </div>\n } @else if (\n mappedGanttNodes().length > 0 && orderedGanttSegments().length > 0\n ) {\n <!-- Built-in gantt renderer. -->\n <mt-timeline-gantt\n [timelineMode]=\"timelineMode()\"\n [columns]=\"columns()\"\n [ganttTitleColumnLabel]=\"ganttTitleColumnLabel()\"\n [ganttStatusColumnLabel]=\"ganttStatusColumnLabel()\"\n [ganttInitiativeColumnWidthPx]=\"ganttInitiativeColumnWidthPx()\"\n [ganttStatusColumnWidthPx]=\"ganttStatusColumnWidthPx()\"\n [showGanttStatusColumn]=\"showGanttStatusColumn()\"\n [ganttSegmentWidthPx]=\"ganttSegmentWidthPx()\"\n [defaultVisibleColumns]=\"defaultVisibleColumns()\"\n [columnsPaneMinWidthPx]=\"columnsPaneMinWidthPx()\"\n [columnsPaneMaxWidthPx]=\"columnsPaneMaxWidthPx()\"\n [mappedGanttNodes]=\"mappedGanttNodes()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [collapsedGanttIds]=\"collapsedGanttIds()\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplate()\"\n (toggleCollapse)=\"toggleGanttCollapse($event)\"\n (progressClick)=\"onGanttProgressClick($event.item, $event.event)\"\n />\n } @else {\n <!-- Empty state. -->\n <div\n class=\"flex min-h-56 items-center justify-center p-8 text-sm text-surface-500\"\n >\n {{ emptyMessage() }}\n </div>\n }\n\n <!-- Details popover host (custom template or built-in fallback). -->\n <p-popover #detailsPopover appendTo=\"body\" (onHide)=\"onDetailsPopoverHide()\">\n @if (showGanttDetailsPopup() && selectedGanttItem(); as item) {\n @if (popoverTemplate(); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"getPopoverTemplateContext(item)\"\n ></ng-container>\n } @else {\n <mt-timeline-default-popover\n [item]=\"item\"\n (requestClose)=\"hideDetailsPopover()\"\n />\n }\n }\n </p-popover>\n\n <!-- Point anchor used to place the popover exactly where user clicked. -->\n <span\n #detailsPopoverClickAnchor\n class=\"pointer-events-none fixed h-0 w-0\"\n [style.left.px]=\"-9999\"\n [style.top.px]=\"-9999\"\n aria-hidden=\"true\"\n ></span>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TimelineHeader, selector: "mt-timeline-header", inputs: ["title", "timelineMode", "timelineModeOptions"], outputs: ["timelineModeChange"] }, { kind: "component", type: TimelineGantt, selector: "mt-timeline-gantt", inputs: ["timelineMode", "columns", "ganttTitleColumnLabel", "ganttStatusColumnLabel", "ganttInitiativeColumnWidthPx", "ganttStatusColumnWidthPx", "showGanttStatusColumn", "ganttSegmentWidthPx", "defaultVisibleColumns", "columnsPaneMinWidthPx", "columnsPaneMaxWidthPx", "mappedGanttNodes", "orderedGanttSegments", "collapsedGanttIds", "columnTemplatesByKey", "progressTemplateDirective"], outputs: ["toggleCollapse", "progressClick"] }, { kind: "component", type: TimelineDefaultPopover, selector: "mt-timeline-default-popover", inputs: ["item"], outputs: ["requestClose"] }, { kind: "component", type: Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }] });
1081
1140
  }
1082
1141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Timeline, decorators: [{
1083
1142
  type: Component,
1084
1143
  args: [{ selector: 'mt-timeline', standalone: true, imports: [
1085
1144
  CommonModule,
1086
- Card,
1087
1145
  TimelineHeader,
1088
1146
  TimelineGantt,
1089
1147
  TimelineDefaultPopover,
1090
1148
  Popover,
1091
1149
  NgTemplateOutlet,
1092
- ], host: { class: 'block' }, template: "<mt-card class=\"mt-3 block overflow-hidden\">\r\n <!-- Optional top header (title + timeline mode selector). -->\r\n @if (showHeader()) {\r\n <mt-timeline-header\r\n [title]=\"title()\"\r\n [timelineMode]=\"timelineMode()\"\r\n [timelineModeOptions]=\"timelineModeOptions()\"\r\n (timelineModeChange)=\"onTimelineModeChange($event)\"\r\n />\r\n }\r\n\r\n <!-- Loading state. -->\r\n @if (isLoading()) {\r\n <div class=\"flex min-h-56 items-center justify-center p-8\">\r\n <div\r\n class=\"h-8 w-8 animate-spin rounded-full border-2 border-surface-200\"\r\n style=\"border-top-color: var(--p-primary-color)\"\r\n ></div>\r\n </div>\r\n } @else if (ganttTemplate(); as template) {\r\n <!-- Full custom gantt-body override. -->\r\n <div class=\"min-h-56 p-4\">\r\n <ng-container [ngTemplateOutlet]=\"template.templateRef\"></ng-container>\r\n </div>\r\n } @else if (\r\n mappedGanttNodes().length > 0 && orderedGanttSegments().length > 0\r\n ) {\r\n <!-- Built-in gantt renderer. -->\r\n <mt-timeline-gantt\r\n [timelineMode]=\"timelineMode()\"\r\n [columns]=\"columns()\"\r\n [ganttTitleColumnLabel]=\"ganttTitleColumnLabel()\"\r\n [ganttStatusColumnLabel]=\"ganttStatusColumnLabel()\"\r\n [ganttInitiativeColumnWidthPx]=\"ganttInitiativeColumnWidthPx()\"\r\n [ganttStatusColumnWidthPx]=\"ganttStatusColumnWidthPx()\"\r\n [showGanttStatusColumn]=\"showGanttStatusColumn()\"\r\n [ganttSegmentWidthPx]=\"ganttSegmentWidthPx()\"\r\n [columnsPaneMinWidthPx]=\"columnsPaneMinWidthPx()\"\r\n [columnsPaneMaxWidthPx]=\"columnsPaneMaxWidthPx()\"\r\n [mappedGanttNodes]=\"mappedGanttNodes()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [collapsedGanttIds]=\"collapsedGanttIds()\"\r\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\r\n [progressTemplateDirective]=\"progressTemplate()\"\r\n (toggleCollapse)=\"toggleGanttCollapse($event)\"\r\n (progressClick)=\"onGanttProgressClick($event.item, $event.event)\"\r\n />\r\n } @else {\r\n <!-- Empty state. -->\r\n <div\r\n class=\"flex min-h-56 items-center justify-center p-8 text-sm text-surface-500\"\r\n >\r\n {{ emptyMessage() }}\r\n </div>\r\n }\r\n\r\n <!-- Details popover host (custom template or built-in fallback). -->\r\n <p-popover #detailsPopover appendTo=\"body\" (onHide)=\"onDetailsPopoverHide()\">\r\n @if (showGanttDetailsPopup() && selectedGanttItem(); as item) {\r\n @if (popoverTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template.templateRef\"\r\n [ngTemplateOutletContext]=\"getPopoverTemplateContext(item)\"\r\n ></ng-container>\r\n } @else {\r\n <mt-timeline-default-popover\r\n [item]=\"item\"\r\n (requestClose)=\"hideDetailsPopover()\"\r\n />\r\n }\r\n }\r\n </p-popover>\r\n\r\n <!-- Point anchor used to place the popover exactly where user clicked. -->\r\n <span\r\n #detailsPopoverClickAnchor\r\n class=\"pointer-events-none fixed h-0 w-0\"\r\n [style.left.px]=\"-9999\"\r\n [style.top.px]=\"-9999\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n</mt-card>\r\n", styles: [":host{display:block}\n"] }]
1150
+ ], host: { class: 'block' }, template: "<div class=\"mt-3 block overflow-hidden\">\n <!-- Optional top header (title + timeline mode selector). -->\n @if (showHeader()) {\n <mt-timeline-header\n [title]=\"title()\"\n [timelineMode]=\"timelineMode()\"\n [timelineModeOptions]=\"timelineModeOptions()\"\n (timelineModeChange)=\"onTimelineModeChange($event)\"\n />\n }\n\n <!-- Loading state. -->\n @if (isLoading()) {\n <div class=\"flex min-h-56 items-center justify-center p-8\">\n <div\n class=\"h-8 w-8 animate-spin rounded-full border-2 border-surface-200\"\n style=\"border-top-color: var(--p-primary-color)\"\n ></div>\n </div>\n } @else if (ganttTemplate(); as template) {\n <!-- Full custom gantt-body override. -->\n <div class=\"min-h-56 py-4\">\n <ng-container [ngTemplateOutlet]=\"template.templateRef\"></ng-container>\n </div>\n } @else if (\n mappedGanttNodes().length > 0 && orderedGanttSegments().length > 0\n ) {\n <!-- Built-in gantt renderer. -->\n <mt-timeline-gantt\n [timelineMode]=\"timelineMode()\"\n [columns]=\"columns()\"\n [ganttTitleColumnLabel]=\"ganttTitleColumnLabel()\"\n [ganttStatusColumnLabel]=\"ganttStatusColumnLabel()\"\n [ganttInitiativeColumnWidthPx]=\"ganttInitiativeColumnWidthPx()\"\n [ganttStatusColumnWidthPx]=\"ganttStatusColumnWidthPx()\"\n [showGanttStatusColumn]=\"showGanttStatusColumn()\"\n [ganttSegmentWidthPx]=\"ganttSegmentWidthPx()\"\n [defaultVisibleColumns]=\"defaultVisibleColumns()\"\n [columnsPaneMinWidthPx]=\"columnsPaneMinWidthPx()\"\n [columnsPaneMaxWidthPx]=\"columnsPaneMaxWidthPx()\"\n [mappedGanttNodes]=\"mappedGanttNodes()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [collapsedGanttIds]=\"collapsedGanttIds()\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplate()\"\n (toggleCollapse)=\"toggleGanttCollapse($event)\"\n (progressClick)=\"onGanttProgressClick($event.item, $event.event)\"\n />\n } @else {\n <!-- Empty state. -->\n <div\n class=\"flex min-h-56 items-center justify-center p-8 text-sm text-surface-500\"\n >\n {{ emptyMessage() }}\n </div>\n }\n\n <!-- Details popover host (custom template or built-in fallback). -->\n <p-popover #detailsPopover appendTo=\"body\" (onHide)=\"onDetailsPopoverHide()\">\n @if (showGanttDetailsPopup() && selectedGanttItem(); as item) {\n @if (popoverTemplate(); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"getPopoverTemplateContext(item)\"\n ></ng-container>\n } @else {\n <mt-timeline-default-popover\n [item]=\"item\"\n (requestClose)=\"hideDetailsPopover()\"\n />\n }\n }\n </p-popover>\n\n <!-- Point anchor used to place the popover exactly where user clicked. -->\n <span\n #detailsPopoverClickAnchor\n class=\"pointer-events-none fixed h-0 w-0\"\n [style.left.px]=\"-9999\"\n [style.top.px]=\"-9999\"\n aria-hidden=\"true\"\n ></span>\n</div>\n", styles: [":host{display:block}\n"] }]
1093
1151
  }], propDecorators: { detailsPopover: [{
1094
1152
  type: ViewChild,
1095
1153
  args: ['detailsPopover']
1096
1154
  }], detailsPopoverClickAnchor: [{
1097
1155
  type: ViewChild,
1098
1156
  args: ['detailsPopoverClickAnchor']
1099
- }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], timelineMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "timelineMode", required: false }] }, { type: i0.Output, args: ["timelineModeChange"] }], timelineModeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "timelineModeOptions", required: false }] }], ganttData: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttData", required: false }] }], ganttMapping: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttMapping", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], ganttSegmentWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttSegmentWidthPx", required: false }] }], columnsPaneMinWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMinWidthPx", required: false }] }], columnsPaneMaxWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMaxWidthPx", required: false }] }], ganttTitleColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttTitleColumnLabel", required: false }] }], ganttStatusColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnLabel", required: false }] }], ganttInitiativeColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttInitiativeColumnWidthPx", required: false }] }], ganttStatusColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnWidthPx", required: false }] }], showGanttStatusColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGanttStatusColumn", required: false }] }], showGanttDetailsPopup: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGanttDetailsPopup", required: false }] }], timelineModeChangeEvent: [{ type: i0.Output, args: ["timelineModeChangeEvent"] }], ganttItemClick: [{ type: i0.Output, args: ["ganttItemClick"] }], ganttTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TimelineGanttTemplateDirective), { isSignal: true }] }], columnTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TimelineColumnTemplateDirective), { isSignal: true }] }], popoverTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TimelinePopoverTemplateDirective), { isSignal: true }] }], progressTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TimelineProgressTemplateDirective), { isSignal: true }] }] } });
1157
+ }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], timelineMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "timelineMode", required: false }] }, { type: i0.Output, args: ["timelineModeChange"] }], timelineModeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "timelineModeOptions", required: false }] }], ganttData: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttData", required: false }] }], ganttMapping: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttMapping", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], ganttSegmentWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttSegmentWidthPx", required: false }] }], defaultVisibleColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultVisibleColumns", required: false }] }], columnsPaneMinWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMinWidthPx", required: false }] }], columnsPaneMaxWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsPaneMaxWidthPx", required: false }] }], ganttTitleColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttTitleColumnLabel", required: false }] }], ganttStatusColumnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnLabel", required: false }] }], ganttInitiativeColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttInitiativeColumnWidthPx", required: false }] }], ganttStatusColumnWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "ganttStatusColumnWidthPx", required: false }] }], showGanttStatusColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGanttStatusColumn", required: false }] }], showGanttDetailsPopup: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGanttDetailsPopup", required: false }] }], timelineModeChangeEvent: [{ type: i0.Output, args: ["timelineModeChangeEvent"] }], ganttItemClick: [{ type: i0.Output, args: ["ganttItemClick"] }], ganttTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TimelineGanttTemplateDirective), { isSignal: true }] }], columnTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TimelineColumnTemplateDirective), { isSignal: true }] }], popoverTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TimelinePopoverTemplateDirective), { isSignal: true }] }], progressTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TimelineProgressTemplateDirective), { isSignal: true }] }] } });
1100
1158
 
1101
1159
  /**
1102
1160
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-timeline.mjs","sources":["../../../../packages/masterteam/timeline/src/lib/timeline/timeline-gantt-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/timeline-column-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/timeline-popover-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/timeline-progress-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-default-popover/timeline-default-popover.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-default-popover/timeline-default-popover.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-header/timeline-gantt-header.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-header/timeline-gantt-header.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-row/timeline-gantt-row.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-row/timeline-gantt-row.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt/timeline-gantt.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt/timeline-gantt.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-header/timeline-header.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-header/timeline-header.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline/timeline.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline/timeline.html","../../../../packages/masterteam/timeline/src/masterteam-timeline.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelineGantt]',\r\n standalone: true,\r\n})\r\nexport class TimelineGanttTemplateDirective {\r\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","import { Directive, inject, Input, TemplateRef } from '@angular/core';\r\nimport { TimelineColumnConfig } from './timeline.models';\r\n\r\nexport interface TimelineColumnTemplateContext<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n $implicit: TItem;\r\n item: TItem;\r\n resolved: TResolved;\r\n column: TimelineColumnConfig<TItem, TResolved>;\r\n value: unknown;\r\n canToggle: boolean;\r\n isCollapsed: boolean;\r\n toggle: () => void;\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelineColumn]',\r\n standalone: true,\r\n})\r\nexport class TimelineColumnTemplateDirective<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n @Input('mtTimelineColumn') key = '';\r\n\r\n readonly templateRef =\r\n inject<TemplateRef<TimelineColumnTemplateContext<TItem, TResolved>>>(\r\n TemplateRef,\r\n );\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\nexport interface TimelinePopoverTemplateContext<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n $implicit: TItem;\r\n item: TItem;\r\n resolved: TResolved;\r\n close: () => void;\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelinePopover]',\r\n standalone: true,\r\n})\r\nexport class TimelinePopoverTemplateDirective<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n readonly templateRef =\r\n inject<TemplateRef<TimelinePopoverTemplateContext<TItem, TResolved>>>(\r\n TemplateRef,\r\n );\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\nexport interface TimelineProgressTemplateContext<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n $implicit: TItem;\r\n item: TItem;\r\n resolved: TResolved;\r\n startOffsetPx: number;\r\n trackWidthPx: number;\r\n fillWidthPx: number;\r\n progressValue: number;\r\n progressLabel: string;\r\n color: string;\r\n trackColor: string;\r\n isRtl: boolean;\r\n onSelect: (event: MouseEvent) => void;\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelineProgress]',\r\n standalone: true,\r\n})\r\nexport class TimelineProgressTemplateDirective<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n readonly templateRef =\r\n inject<TemplateRef<TimelineProgressTemplateContext<TItem, TResolved>>>(\r\n TemplateRef,\r\n );\r\n}\r\n","import { Component, input, output } from '@angular/core';\r\nimport { TimelineResolvedItem } from '../../timeline.interfaces';\r\n\r\n/**\r\n * Built-in details popover body used when no custom `mtTimelinePopover`\r\n * template is provided by the consumer.\r\n *\r\n * This component is intentionally dumb/presentational: it only receives a\r\n * resolved row item and exposes a close event.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-default-popover',\r\n standalone: true,\r\n templateUrl: './timeline-default-popover.html',\r\n})\r\nexport class TimelineDefaultPopover {\r\n // Resolved timeline row currently selected by user.\r\n readonly item = input.required<TimelineResolvedItem>();\r\n\r\n // Requests parent popover host to close.\r\n readonly requestClose = output<void>();\r\n}\r\n","<!-- Default details view shown inside PrimeNG popover. -->\r\n<div class=\"w-[22.5rem]\">\r\n <div class=\"mb-3 flex items-center justify-between\">\r\n <h4 class=\"text-sm font-semibold\">Level Details</h4>\r\n <button\r\n type=\"button\"\r\n class=\"rounded border border-surface px-2 py-1 text-xs\"\r\n (click)=\"requestClose.emit()\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n\r\n <div class=\"grid gap-2 text-sm sm:grid-cols-2\">\r\n <div><span class=\"font-semibold\">Name:</span> {{ item().title }}</div>\r\n <div>\r\n <span class=\"font-semibold\">Level:</span>\r\n {{ item().levelDescription }}\r\n </div>\r\n <div><span class=\"font-semibold\">Owner:</span> {{ item().owner }}</div>\r\n <div>\r\n <span class=\"font-semibold\">Status:</span>\r\n <span [style.color]=\"item().statusColor\">{{ item().statusName }}</span>\r\n </div>\r\n <div>\r\n <span class=\"font-semibold\">Progress:</span>\r\n {{ item().progressLabel }}\r\n </div>\r\n <div><span class=\"font-semibold\">Range:</span> {{ item().phase }}</div>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input } from '@angular/core';\r\nimport {\r\n TimelineResolvedColumn,\r\n TimelineResolvedSegment,\r\n} from '../../timeline.interfaces';\r\nimport { TimelineScaleMode } from '../../timeline.models';\r\n\r\n/**\r\n * Header renderer for the Gantt table:\r\n * - left sticky metadata columns\r\n * - right timeline segment columns\r\n *\r\n * Kept separate to reduce template and logic noise in the Gantt container.\r\n */\r\n@Component({\n selector: 'mt-timeline-gantt-header',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './timeline-gantt-header.html',\n host: { class: 'block min-w-0' },\n})\nexport class TimelineGanttHeader {\n private readonly monthLabels = [\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec',\r\n ];\r\n\r\n readonly timelineMode = input<TimelineScaleMode>('quarterly');\r\n readonly resolvedColumns = input<TimelineResolvedColumn[]>([]);\r\n readonly orderedGanttSegments = input<TimelineResolvedSegment[]>([]);\r\n readonly ganttCanvasWidth = input<number>(0);\r\n readonly effectiveGanttSegmentWidthPx = input<number>(96);\r\n readonly renderColumns = input<boolean>(true);\r\n readonly renderTimeline = input<boolean>(true);\r\n\r\n // Converts monthly segments from \"M N\" to calendar abbreviations.\r\n resolveSegmentTitle(segment: TimelineResolvedSegment): string {\r\n if (this.timelineMode() !== 'monthly') {\r\n return segment.title;\r\n }\r\n\r\n const month = Number(String(segment.title).replace(/\\D/g, ''));\r\n return Number.isFinite(month) && month >= 1 && month <= 12\r\n ? this.monthLabels[month - 1]\r\n : segment.title;\r\n }\r\n\r\n resolveHeaderAlignClass(\r\n column: TimelineResolvedColumn,\r\n ): Record<string, boolean> {\r\n return {\r\n 'text-start': column.position === 'start',\r\n 'text-center': column.position === 'center',\r\n 'text-end': column.position === 'end',\r\n };\r\n }\r\n}\r\n","<!-- Sticky metadata columns + timeline period header. -->\r\n<div class=\"flex border-b border-surface bg-surface-50\">\r\n <!-- Left sticky columns (title/status/custom columns). -->\r\n @if (renderColumns()) {\r\n @for (column of resolvedColumns(); track $index) {\r\n <div\r\n class=\"shrink-0 border-e border-surface bg-surface-50 p-3 text-xs font-semibold uppercase text-surface-600\"\r\n [style.width.px]=\"column.widthPx\"\r\n [ngClass]=\"resolveHeaderAlignClass(column)\"\r\n >\r\n {{ column.header }}\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Time scale columns (month/quarter/half/year). -->\r\n @if (renderTimeline()) {\r\n <div\r\n class=\"flex shrink-0 items-center bg-surface-50\"\r\n [style.width.px]=\"ganttCanvasWidth()\"\r\n >\r\n @for (column of orderedGanttSegments(); track $index) {\r\n <div\r\n class=\"shrink-0 border-e border-surface px-2 py-3 text-center text-xs font-semibold uppercase text-surface-600\"\r\n [style.width.px]=\"effectiveGanttSegmentWidthPx()\"\r\n >\r\n {{ resolveSegmentTitle(column) }}\r\n @if (column.year !== undefined && column.year !== null) {\r\n {{ column.year }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, input, output, TemplateRef } from '@angular/core';\r\nimport { Icon } from '@masterteam/icons';\r\nimport {\r\n TimelineColumnTemplateContext,\r\n TimelineColumnTemplateDirective,\r\n} from '../../timeline-column-template.directive';\r\nimport {\r\n TimelineResolvedColumn,\r\n TimelineResolvedItem,\r\n} from '../../timeline.interfaces';\r\nimport {\r\n TimelineProgressTemplateContext,\r\n TimelineProgressTemplateDirective,\r\n} from '../../timeline-progress-template.directive';\r\n\r\n/**\r\n * Emitted when user clicks a progress bar for a specific row.\r\n */\r\nexport interface TimelineRowProgressClickEvent {\r\n item: TimelineResolvedItem;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * Single-row renderer for the Gantt body.\r\n *\r\n * Responsibilities:\r\n * - Render sticky metadata cells for one row.\r\n * - Render progress lane (default or custom progress template).\r\n * - Emit row-level events (collapse + progress selection).\r\n *\r\n * Keep heavy computations out of this component. Parent components should pass\r\n * already-resolved row geometry and style values.\r\n */\r\n@Component({\n selector: 'mt-timeline-gantt-row',\n standalone: true,\n imports: [CommonModule, Icon, NgTemplateOutlet],\n templateUrl: './timeline-gantt-row.html',\n host: { class: 'block min-w-0' },\n})\nexport class TimelineGanttRow {\n readonly item = input.required<TimelineResolvedItem>();\n readonly resolvedColumns = input<TimelineResolvedColumn[]>([]);\n readonly ganttCanvasWidth = input<number>(0);\n readonly laneInsetPx = input<number>(12);\n readonly renderColumns = input<boolean>(true);\n readonly renderTimeline = input<boolean>(true);\n\r\n readonly columnTemplatesByKey = input<\r\n ReadonlyMap<\r\n string,\r\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>\r\n >\r\n >(new Map());\r\n\r\n readonly progressTemplateDirective = input<TimelineProgressTemplateDirective<\r\n unknown,\r\n TimelineResolvedItem\r\n > | null>(null);\r\n\r\n readonly toggleCollapse = output<TimelineResolvedItem>();\r\n readonly progressClick = output<TimelineRowProgressClickEvent>();\r\n\r\n // Forwards collapse toggles to container component.\r\n onToggleCollapse(item: TimelineResolvedItem): void {\r\n this.toggleCollapse.emit(item);\r\n }\r\n\r\n // Forwards progress-bar click with original mouse event for popover anchoring.\r\n onProgressClick(item: TimelineResolvedItem, event: MouseEvent): void {\r\n this.progressClick.emit({ item, event });\r\n }\r\n\r\n collapseIcon(item: TimelineResolvedItem): string {\r\n if (!item.isCollapsed) {\r\n return 'arrow.chevron-down';\r\n }\r\n\r\n return this.isRtl() ? 'arrow.chevron-left' : 'arrow.chevron-right';\r\n }\r\n\r\n resolveColumnTemplate(\r\n column: TimelineResolvedColumn,\r\n ): TemplateRef<\r\n TimelineColumnTemplateContext<unknown, TimelineResolvedItem>\r\n > | null {\r\n return this.columnTemplatesByKey().get(column.key)?.templateRef ?? null;\r\n }\r\n\r\n resolveColumnText(\r\n column: TimelineResolvedColumn,\r\n item: TimelineResolvedItem,\r\n ): string {\r\n const value = this.resolveColumnValue(column, item);\r\n if (value === null || value === undefined || value === '') {\r\n if (column.isTreeColumn) {\r\n return item.title;\r\n }\r\n return '-';\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n resolveColumnValue(\r\n column: TimelineResolvedColumn,\r\n item: TimelineResolvedItem,\r\n ): unknown {\r\n const source = item.source ?? item;\r\n\r\n if (column.value) {\r\n if (typeof column.value === 'function') {\r\n return column.value({ item: source, resolved: item });\r\n }\r\n\r\n return this.path(source, column.value);\r\n }\r\n\r\n if (column.isTreeColumn) {\r\n return item.title;\r\n }\r\n\r\n const sourceValue = this.path(source, column.key);\r\n if (sourceValue !== undefined && sourceValue !== null) {\r\n return sourceValue;\r\n }\r\n\r\n return this.path(item, column.key);\r\n }\r\n\r\n resolveColumnAlignClass(\r\n column: TimelineResolvedColumn,\r\n ): Record<string, boolean> {\r\n return {\r\n 'justify-start': column.position === 'start',\r\n 'justify-center': column.position === 'center',\r\n 'justify-end': column.position === 'end',\r\n };\r\n }\r\n\r\n getColumnTemplateContext(\r\n column: TimelineResolvedColumn,\r\n item: TimelineResolvedItem,\r\n ): TimelineColumnTemplateContext<unknown, TimelineResolvedItem> {\r\n const source = item.source ?? item;\r\n\r\n return {\r\n $implicit: source,\r\n item: source,\r\n resolved: item,\r\n column,\r\n value: this.resolveColumnValue(column, item),\r\n canToggle: item.hasChildren,\r\n isCollapsed: item.isCollapsed,\r\n toggle: () => this.onToggleCollapse(item),\r\n };\r\n }\r\n\r\n getProgressTemplateContext(\r\n item: TimelineResolvedItem,\r\n ): TimelineProgressTemplateContext<unknown, TimelineResolvedItem> {\r\n const source = item.source ?? item;\n return {\n $implicit: source,\n item: source,\n resolved: item,\n startOffsetPx: item.startOffsetPx + this.laneInsetPx(),\n trackWidthPx: item.trackWidthPx,\n fillWidthPx: item.progressFillWidthPx,\n progressValue: item.progressValue,\n progressLabel: item.progressLabel,\r\n color: item.statusColor,\r\n trackColor: item.progressTrackColor,\r\n isRtl: this.isRtl(),\r\n onSelect: (event) => this.onProgressClick(item, event),\r\n };\r\n }\r\n\r\n // Reads document direction to support sticky offsets and progress alignment.\r\n protected isRtl(): boolean {\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n const dir =\r\n document.documentElement.getAttribute('dir') ??\r\n document.body?.getAttribute('dir') ??\r\n 'ltr';\r\n\r\n return dir.toLowerCase() === 'rtl';\r\n }\r\n\r\n // Local safe deep accessor used by dynamic column value path mapping.\r\n private path(item: unknown, value: string): unknown {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n return value\r\n .replace(/\\[(\\d+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n .reduce<unknown>((current, key) => {\r\n if (\r\n current === null ||\r\n current === undefined ||\r\n typeof current !== 'object'\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return (current as Record<string, unknown>)[key];\r\n }, item);\r\n }\r\n}\r\n","<!-- One gantt data row: sticky metadata cells + progress lane. -->\r\n<div class=\"relative flex\">\r\n <!-- Left sticky metadata cells. -->\r\n @if (renderColumns()) {\r\n @for (column of resolvedColumns(); track $index) {\r\n <div\r\n class=\"flex h-16 shrink-0 items-center overflow-hidden border-e border-b border-surface bg-content p-3\"\r\n [style.width.px]=\"column.widthPx\"\r\n [ngClass]=\"resolveColumnAlignClass(column)\"\r\n >\r\n <!-- Per-column custom template, when provided by consumer. -->\r\n @if (resolveColumnTemplate(column); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"getColumnTemplateContext(column, item())\"\r\n ></ng-container>\r\n } @else {\r\n <!-- Built-in fallback renderers by column configuration. -->\r\n @if (column.isTreeColumn) {\r\n <div\r\n class=\"flex min-w-0 items-center gap-2\"\r\n [style.padding-inline-start.px]=\"item().levelDepth * 16\"\r\n >\r\n @if (item().hasChildren) {\r\n <mt-icon\r\n class=\"cursor-pointer\"\r\n (click)=\"onToggleCollapse(item())\"\r\n [icon]=\"collapseIcon(item())\"\r\n ></mt-icon>\r\n } @else {\r\n <span class=\"inline-block w-5\"></span>\r\n }\r\n <span class=\"truncate text-sm font-semibold\">\r\n {{ resolveColumnText(column, item()) }}\r\n </span>\r\n </div>\r\n } @else {\r\n <span class=\"truncate text-sm\">\r\n {{ resolveColumnText(column, item()) }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Right timeline canvas cell for progress track/fill. -->\r\n @if (renderTimeline()) {\n <div\n class=\"relative z-0 h-16 shrink-0 overflow-hidden border-b border-surface py-4\"\n [style.width.px]=\"ganttCanvasWidth()\"\n [style.z-index]=\"1\"\n >\n <div class=\"h-8\"></div>\n <!-- Consumer custom progress template. -->\r\n @if (progressTemplateDirective(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template.templateRef\"\r\n [ngTemplateOutletContext]=\"getProgressTemplateContext(item())\"\r\n ></ng-container>\r\n } @else {\r\n <!-- Built-in progress renderer. -->\r\n <div\n class=\"absolute top-1/2 h-7 -translate-y-1/2 cursor-pointer rounded-full\"\n [style.left.px]=\"isRtl() ? null : item().startOffsetPx + laneInsetPx()\"\n [style.right.px]=\"isRtl() ? item().startOffsetPx + laneInsetPx() : null\"\n [style.width.px]=\"item().trackWidthPx\"\n [style.background-color]=\"item().progressTrackColor\"\n [style.z-index]=\"1\"\n [attr.title]=\"item().progressLabel\"\r\n (click)=\"onProgressClick(item(), $event)\"\r\n >\r\n <div\r\n class=\"relative h-full overflow-hidden rounded-full\"\r\n [style.width.px]=\"item().progressFillWidthPx\"\r\n [style.background-color]=\"item().statusColor\"\r\n >\r\n @if (item().progressFillWidthPx > 0) {\r\n <span\r\n class=\"pointer-events-none absolute top-1/2 rounded-full bg-white px-2 py-0.5 text-[10px] font-semibold text-black shadow-sm -translate-y-1/2\"\r\n [style.left.px]=\"isRtl() ? null : 8\"\r\n [style.right.px]=\"isRtl() ? 8 : null\"\r\n [attr.title]=\"item().progressLabel\"\r\n >\r\n {{ item().progressLabel }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n OnDestroy,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { TimelineColumnTemplateDirective } from '../../timeline-column-template.directive';\r\nimport {\r\n TimelineMappedNode,\r\n TimelineResolvedColumn,\r\n TimelineResolvedItem,\r\n TimelineResolvedSegment,\r\n} from '../../timeline.interfaces';\r\nimport { TimelineColumnConfig, TimelineScaleMode } from '../../timeline.models';\r\nimport { TimelineProgressTemplateDirective } from '../../timeline-progress-template.directive';\r\nimport { TimelineGanttHeader } from '../timeline-gantt-header/timeline-gantt-header';\r\nimport {\r\n TimelineGanttRow,\r\n TimelineRowProgressClickEvent,\r\n} from '../timeline-gantt-row/timeline-gantt-row';\r\n\r\n/**\r\n * Event emitted when a row progress bar is selected.\r\n * Parent uses this to emit public click event and anchor popover.\r\n */\r\nexport interface TimelineProgressClickEvent {\r\n item: TimelineResolvedItem;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * Gantt view orchestrator.\r\n *\r\n * Responsibilities:\r\n * - Resolve dynamic/legacy columns.\r\n * - Compute table/canvas geometry based on viewport width + segment count.\r\n * - Flatten mapped tree data into render-ready rows.\r\n * - Coordinate child header/row components and re-emit row events.\r\n *\r\n * Non-responsibilities:\r\n * - Raw data mapping from consumer models (handled by parent timeline component).\r\n * - Popover state and selection management (handled by parent timeline component).\r\n */\r\n@Component({\r\n selector: 'mt-timeline-gantt',\r\n standalone: true,\r\n imports: [CommonModule, TimelineGanttHeader, TimelineGanttRow],\r\n templateUrl: './timeline-gantt.html',\r\n styleUrl: './timeline-gantt.scss',\r\n})\r\nexport class TimelineGantt implements AfterViewInit, OnDestroy {\r\n @ViewChild('ganttSplitContainer')\r\n set ganttSplitContainerRef(value: ElementRef<HTMLElement> | undefined) {\r\n this.ganttSplitContainer = value;\r\n this.bindSplitResizeObserver();\r\n }\r\n\r\n @ViewChild('ganttScrollViewport')\r\n set ganttScrollViewportRef(value: ElementRef<HTMLElement> | undefined) {\r\n this.ganttScrollViewport = value;\r\n this.bindResizeObserver();\r\n }\r\n\r\n private ganttSplitContainer?: ElementRef<HTMLElement>;\r\n private ganttScrollViewport?: ElementRef<HTMLElement>;\r\n private resizeObserver?: ResizeObserver;\r\n private splitResizeObserver?: ResizeObserver;\r\n\r\n // Width of the visible horizontal viewport used for adaptive segment sizing.\r\n private readonly ganttViewportWidth = signal(0);\r\n private readonly ganttContainerWidth = signal(0);\r\n\r\n private readonly splitterWidthPx = 10;\n private readonly timelineLaneInsetPx = 12;\n private readonly adaptiveSegmentMaxWidthPx = 320;\n readonly laneInsetPx = this.timelineLaneInsetPx;\n private readonly columnsPaneUserWidthPx = signal<number | null>(null);\n private readonly lastExpandedColumnsPaneWidthPx = signal<number | null>(null);\n readonly isColumnsResizing = signal(false);\n readonly canResizeColumnsPane = computed(\r\n () => this.resolvedColumns().length > 0,\r\n );\r\n\r\n private resizeStartClientX = 0;\r\n private resizeStartColumnsPaneWidthPx = 0;\r\n\r\n readonly timelineMode = input<TimelineScaleMode>('quarterly');\r\n\r\n readonly columns = input<\r\n TimelineColumnConfig<unknown, TimelineResolvedItem>[] | null\r\n >(null);\r\n readonly ganttTitleColumnLabel = input<string>('Portfolio Name');\r\n readonly ganttStatusColumnLabel = input<string>('Status');\r\n readonly ganttInitiativeColumnWidthPx = input<number>(288);\r\n readonly ganttStatusColumnWidthPx = input<number>(160);\r\n readonly showGanttStatusColumn = input<boolean>(false);\r\n readonly ganttSegmentWidthPx = input<number>(96);\r\n readonly columnsPaneMinWidthPx = input<number>(0);\r\n readonly columnsPaneMaxWidthPx = input<number | null>(null);\r\n\r\n readonly mappedGanttNodes = input<TimelineMappedNode[]>([]);\r\n readonly orderedGanttSegments = input<TimelineResolvedSegment[]>([]);\r\n readonly collapsedGanttIds = input<Set<string | number>>(new Set());\r\n\r\n readonly columnTemplatesByKey = input<\r\n ReadonlyMap<\r\n string,\r\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>\r\n >\r\n >(new Map());\r\n\r\n readonly progressTemplateDirective = input<TimelineProgressTemplateDirective<\r\n unknown,\r\n TimelineResolvedItem\r\n > | null>(null);\r\n\r\n readonly toggleCollapse = output<TimelineResolvedItem>();\r\n readonly progressClick = output<TimelineProgressClickEvent>();\r\n\r\n // Builds sticky metadata columns and computes their sticky offsets.\r\n readonly resolvedColumns = computed<TimelineResolvedColumn[]>(() => {\r\n const providedColumns = this.columns();\r\n const baseColumns =\r\n providedColumns === null ? this.buildLegacyColumns() : providedColumns;\r\n const resolvedTreeColumnIndex = Math.max(\r\n 0,\r\n baseColumns.findIndex((column) => column.tree === true),\r\n );\r\n\r\n return baseColumns.map((column, index) => {\r\n const widthPx = Math.max(\r\n 0,\r\n Math.floor(column.widthPx ?? this.ganttInitiativeColumnWidthPx()),\r\n );\r\n\r\n const resolvedColumn: TimelineResolvedColumn = {\r\n ...column,\r\n header: column.header ?? column.key,\r\n widthPx,\r\n position: column.position ?? 'start',\r\n isTreeColumn: index === resolvedTreeColumnIndex,\r\n };\r\n\r\n return resolvedColumn;\r\n });\r\n });\r\n\r\n readonly stickyColumnsWidth = computed(() =>\r\n this.resolvedColumns().reduce((total, column) => total + column.widthPx, 0),\r\n );\r\n\r\n readonly resolvedColumnsPaneWidthPx = computed(() => {\r\n const userWidth = this.columnsPaneUserWidthPx();\r\n const preferredWidth = userWidth ?? this.stickyColumnsWidth();\r\n return this.clampColumnsPaneWidth(preferredWidth);\r\n });\r\n\r\n // Segment width expands to fill viewport when possible but never goes below base width.\r\n readonly effectiveGanttSegmentWidthPx = computed(() => {\n const segmentCount = this.orderedGanttSegments().length;\n const baseWidth = this.ganttSegmentWidthPx();\n\r\n if (!segmentCount) {\r\n return baseWidth;\r\n }\r\n\r\n const availableWidth = this.ganttViewportWidth();\n if (availableWidth <= 0) {\n return baseWidth;\n }\n\n const candidateWidth = Math.floor(availableWidth / segmentCount);\n return Math.max(\n baseWidth,\n Math.min(candidateWidth, this.adaptiveSegmentMaxWidthPx),\n );\n });\n\r\n readonly ganttCanvasWidth = computed(\r\n () =>\r\n this.orderedGanttSegments().length * this.effectiveGanttSegmentWidthPx(),\r\n );\r\n\r\n // Flattens the mapped hierarchy into rows using current collapse state.\r\n readonly resolvedGanttItems = computed<TimelineResolvedItem[]>(() => {\r\n const segments = this.orderedGanttSegments();\r\n if (!segments.length) {\r\n return [];\r\n }\r\n\r\n const firstSeq = segments[0].seq;\r\n const lastSeq = segments[segments.length - 1].seq;\r\n const out: TimelineResolvedItem[] = [];\r\n\r\n this.flattenMapped(\r\n this.mappedGanttNodes(),\r\n 0,\r\n segments,\r\n firstSeq,\r\n lastSeq,\r\n this.collapsedGanttIds(),\r\n out,\r\n );\r\n\r\n return out;\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n this.bindResizeObserver();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resizeObserver?.disconnect();\r\n this.splitResizeObserver?.disconnect();\r\n this.detachResizeListeners();\r\n }\r\n\r\n onToggleCollapse(item: TimelineResolvedItem): void {\r\n this.toggleCollapse.emit(item);\r\n }\r\n\r\n // Bridges row-level click event to parent timeline component.\r\n onRowProgressClick(payload: TimelineRowProgressClickEvent): void {\r\n this.progressClick.emit(payload);\r\n }\r\n\r\n onSplitterPointerDown(event: PointerEvent): void {\r\n if (event.button !== 0 || !this.canResizeColumnsPane()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.isColumnsResizing.set(true);\r\n this.resizeStartClientX = event.clientX;\r\n this.resizeStartColumnsPaneWidthPx = this.resolvedColumnsPaneWidthPx();\r\n\r\n const target = event.currentTarget as HTMLElement | null;\r\n target?.setPointerCapture?.(event.pointerId);\r\n\r\n window.addEventListener('pointermove', this.onSplitterPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener('pointerup', this.onSplitterPointerUp);\r\n window.addEventListener('pointercancel', this.onSplitterPointerUp);\r\n }\r\n\r\n onSplitterKeyDown(event: KeyboardEvent): void {\r\n if (!this.canResizeColumnsPane()) {\r\n return;\r\n }\r\n\r\n const currentWidth = this.resolvedColumnsPaneWidthPx();\r\n const direction = this.isRtl() ? -1 : 1;\r\n const stepPx = event.shiftKey ? 48 : 16;\r\n\r\n switch (event.key) {\r\n case 'ArrowLeft': {\r\n event.preventDefault();\r\n this.applyColumnsPaneWidth(currentWidth - direction * stepPx);\r\n return;\r\n }\r\n case 'ArrowRight': {\r\n event.preventDefault();\r\n this.applyColumnsPaneWidth(currentWidth + direction * stepPx);\r\n return;\r\n }\r\n case 'Home': {\r\n event.preventDefault();\r\n this.applyColumnsPaneWidth(0);\r\n return;\r\n }\r\n case 'End': {\r\n event.preventDefault();\r\n this.applyColumnsPaneWidth(this.columnsPaneMaxAllowedWidthPx());\r\n return;\r\n }\r\n case 'Enter':\r\n case ' ': {\r\n event.preventDefault();\r\n this.toggleColumnsPaneCollapsed();\r\n return;\r\n }\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n onSplitterDoubleClick(): void {\r\n if (!this.canResizeColumnsPane()) {\r\n return;\r\n }\r\n\r\n this.toggleColumnsPaneCollapsed();\r\n }\r\n\r\n // Observes viewport size changes so timeline columns can adapt width.\r\n private bindResizeObserver(): void {\r\n const viewport = this.ganttScrollViewport?.nativeElement;\r\n if (!viewport) {\r\n this.resizeObserver?.disconnect();\r\n return;\r\n }\r\n\r\n this.ganttViewportWidth.set(viewport.clientWidth);\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.resizeObserver?.disconnect();\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const width =\r\n entries[0]?.contentRect.width ??\r\n this.ganttScrollViewport?.nativeElement.clientWidth ??\r\n 0;\r\n\r\n this.ganttViewportWidth.set(width);\r\n });\r\n\r\n this.resizeObserver.observe(viewport);\r\n }\r\n\r\n private bindSplitResizeObserver(): void {\r\n const container = this.ganttSplitContainer?.nativeElement;\r\n if (!container) {\r\n this.splitResizeObserver?.disconnect();\r\n return;\r\n }\r\n\r\n this.ganttContainerWidth.set(container.clientWidth);\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.splitResizeObserver?.disconnect();\r\n this.splitResizeObserver = new ResizeObserver((entries) => {\r\n const width =\r\n entries[0]?.contentRect.width ??\r\n this.ganttSplitContainer?.nativeElement.clientWidth ??\r\n 0;\r\n\r\n this.ganttContainerWidth.set(width);\r\n });\r\n\r\n this.splitResizeObserver.observe(container);\r\n }\r\n\r\n private readonly onSplitterPointerMove = (event: PointerEvent): void => {\r\n if (!this.isColumnsResizing()) {\r\n return;\r\n }\r\n\r\n const deltaPx = this.isRtl()\r\n ? this.resizeStartClientX - event.clientX\r\n : event.clientX - this.resizeStartClientX;\r\n\r\n this.applyColumnsPaneWidth(this.resizeStartColumnsPaneWidthPx + deltaPx);\r\n };\r\n\r\n private readonly onSplitterPointerUp = (): void => {\r\n if (!this.isColumnsResizing()) {\r\n return;\r\n }\r\n\r\n this.isColumnsResizing.set(false);\r\n this.detachResizeListeners();\r\n };\r\n\r\n private detachResizeListeners(): void {\r\n window.removeEventListener('pointermove', this.onSplitterPointerMove);\r\n window.removeEventListener('pointerup', this.onSplitterPointerUp);\r\n window.removeEventListener('pointercancel', this.onSplitterPointerUp);\r\n }\r\n\r\n private applyColumnsPaneWidth(widthPx: number): void {\r\n const clampedWidthPx = this.clampColumnsPaneWidth(widthPx);\r\n this.columnsPaneUserWidthPx.set(clampedWidthPx);\r\n\r\n if (clampedWidthPx > 0) {\r\n this.lastExpandedColumnsPaneWidthPx.set(clampedWidthPx);\r\n }\r\n }\r\n\r\n private toggleColumnsPaneCollapsed(): void {\r\n const currentWidth = this.resolvedColumnsPaneWidthPx();\r\n if (currentWidth > 0) {\r\n this.lastExpandedColumnsPaneWidthPx.set(currentWidth);\r\n this.applyColumnsPaneWidth(0);\r\n return;\r\n }\r\n\r\n const restoreWidth =\r\n this.lastExpandedColumnsPaneWidthPx() ?? this.stickyColumnsWidth();\r\n this.applyColumnsPaneWidth(restoreWidth);\r\n }\r\n\r\n // Legacy fallback columns when consumer does not provide `columns`.\r\n private buildLegacyColumns(): TimelineColumnConfig[] {\r\n const columns: TimelineColumnConfig[] = [\r\n {\r\n key: 'title',\r\n header: this.ganttTitleColumnLabel(),\r\n widthPx: this.ganttInitiativeColumnWidthPx(),\r\n tree: true,\r\n },\r\n ];\r\n\r\n if (this.showGanttStatusColumn()) {\r\n columns.push({\r\n key: 'status',\r\n header: this.ganttStatusColumnLabel(),\r\n widthPx: this.ganttStatusColumnWidthPx(),\r\n position: 'center',\r\n });\r\n }\r\n\r\n return columns;\r\n }\r\n\r\n private flattenMapped(\r\n nodes: TimelineMappedNode[],\r\n levelDepth: number,\r\n segments: TimelineResolvedSegment[],\r\n firstSeq: number,\r\n lastSeq: number,\r\n collapsed: Set<string | number>,\r\n out: TimelineResolvedItem[],\r\n ): void {\r\n // Pre-order flatten preserves parent-child visual grouping.\r\n for (const node of nodes) {\r\n const startSegment =\r\n this.segmentByTime(node.startAt ?? node.endAt, segments) ?? segments[0];\r\n const endSegment =\r\n this.segmentByTime(node.endAt ?? node.startAt, segments) ??\r\n segments[segments.length - 1];\r\n\r\n const startLabel =\r\n startSegment.year !== undefined\r\n ? `${startSegment.title} ${startSegment.year}`\r\n : startSegment.title;\r\n const endLabel =\r\n endSegment.year !== undefined\r\n ? `${endSegment.title} ${endSegment.year}`\r\n : endSegment.title;\r\n\r\n const resolved = this.createResolvedItem(\r\n node,\r\n startSegment.seq,\r\n endSegment.seq,\r\n `${startLabel} - ${endLabel}`,\r\n levelDepth,\r\n collapsed,\r\n firstSeq,\r\n lastSeq,\r\n );\r\n\r\n out.push(resolved);\r\n\r\n if (node.children.length && !resolved.isCollapsed) {\r\n this.flattenMapped(\r\n node.children,\r\n levelDepth + 1,\r\n segments,\r\n firstSeq,\r\n lastSeq,\r\n collapsed,\r\n out,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Converts one mapped node into a fully resolved row model.\r\n private createResolvedItem(\r\n node: TimelineMappedNode,\r\n startSeqRaw: number,\r\n endSeqRaw: number,\r\n phaseFallback: string,\r\n levelDepth: number,\r\n collapsed: Set<string | number>,\r\n firstSeq: number,\r\n lastSeq: number,\r\n ): TimelineResolvedItem {\r\n const startSeq = Number.isFinite(startSeqRaw) ? startSeqRaw : firstSeq;\r\n const endSeq = Number.isFinite(endSeqRaw) ? endSeqRaw : lastSeq;\r\n const normalizedStartSeq = Math.max(firstSeq, Math.min(startSeq, endSeq));\r\n const normalizedEndSeq = Math.min(lastSeq, Math.max(startSeq, endSeq));\r\n\r\n const widthSegments = normalizedEndSeq - normalizedStartSeq + 1;\r\n const widthPx = Math.max(\r\n this.effectiveGanttSegmentWidthPx(),\r\n widthSegments * this.effectiveGanttSegmentWidthPx(),\r\n );\r\n\r\n const trackWidthPx = Math.max(\n 0,\n widthPx - this.timelineLaneInsetPx * 2,\n );\n const progressValue = this.clampProgress(node.progress.value);\r\n const statusColor = this.resolveBaseColor(\r\n node.color ?? node.progress.color ?? null,\r\n );\r\n\r\n return {\r\n id: node.id,\r\n source: node.source,\r\n title: node.title,\r\n startSeq: normalizedStartSeq,\r\n endSeq: normalizedEndSeq,\r\n progressValue,\r\n progressLabel: node.progress.label ?? `${Math.round(progressValue)}%`,\r\n statusKey: node.statusKey ?? undefined,\r\n statusName: node.statusName ?? node.statusKey ?? '-',\r\n statusColor,\r\n progressTrackColor: this.resolveTrackColor(statusColor),\r\n owner: node.owner ?? '-',\r\n phase: node.phase ?? phaseFallback,\r\n levelDescription: node.levelDescription ?? 'Level',\r\n levelColor: node.levelColor ?? '#94a3b8',\r\n levelDepth,\r\n hasChildren: node.children.length > 0,\r\n isCollapsed: collapsed.has(node.id),\r\n startOffsetPx:\r\n (normalizedStartSeq - firstSeq) * this.effectiveGanttSegmentWidthPx(),\r\n trackWidthPx,\r\n progressFillWidthPx: (trackWidthPx * progressValue) / 100,\r\n };\r\n }\r\n\r\n private segmentByTime(\r\n value: number | null,\r\n segments: TimelineResolvedSegment[],\r\n ): TimelineResolvedSegment | undefined {\r\n if (value === null) {\r\n return undefined;\r\n }\r\n\r\n return segments.find(\r\n (segment) => value >= segment.startAt && value <= segment.endAt,\r\n );\r\n }\r\n\r\n // Applies fallback theme color when item does not specify one.\r\n private resolveBaseColor(color?: string | null): string {\r\n return color ?? 'var(--p-primary-color)';\r\n }\r\n\r\n // Generates lighter track color from fill color for visual contrast.\r\n private resolveTrackColor(color: string): string {\r\n return `color-mix(in srgb, ${color} 22%, white)`;\r\n }\r\n\r\n private clampProgress(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.max(0, Math.min(100, value));\r\n }\r\n\r\n private columnsPaneMaxAllowedWidthPx(): number {\r\n const containerWidth = this.ganttContainerWidth();\r\n if (containerWidth <= 0) {\r\n return Number.POSITIVE_INFINITY;\r\n }\r\n\r\n const maxByContainer = Math.max(0, containerWidth - this.splitterWidthPx);\r\n const configuredMax = this.columnsPaneMaxWidthPx();\r\n if (configuredMax === null || configuredMax === undefined) {\r\n return maxByContainer;\r\n }\r\n\r\n return Math.max(0, Math.min(maxByContainer, configuredMax));\r\n }\r\n\r\n private clampColumnsPaneWidth(widthPx: number): number {\r\n if (!Number.isFinite(widthPx)) {\r\n return 0;\r\n }\r\n\r\n const maxWidth = this.columnsPaneMaxAllowedWidthPx();\r\n const minWidth = Math.max(0, this.columnsPaneMinWidthPx());\r\n const effectiveMin = Math.min(minWidth, maxWidth);\r\n\r\n return Math.max(effectiveMin, Math.min(widthPx, maxWidth));\r\n }\r\n\r\n private isRtl(): boolean {\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n const dir =\r\n document.documentElement.getAttribute('dir') ??\r\n document.body?.getAttribute('dir') ??\r\n 'ltr';\r\n\r\n return dir.toLowerCase() === 'rtl';\r\n }\r\n}\r\n","<!-- Gantt view shell: scroll viewport + sized timeline table. -->\r\n<div class=\"min-h-56 min-w-0 overflow-hidden p-4\">\r\n <div\r\n class=\"flex min-w-0 border border-surface bg-content\"\r\n #ganttSplitContainer\r\n >\r\n <!-- Fixed metadata columns pane. -->\r\n <div\r\n class=\"shrink-0 overflow-hidden\"\r\n [style.width.px]=\"resolvedColumnsPaneWidthPx()\"\r\n >\r\n <mt-timeline-gantt-header\r\n [timelineMode]=\"timelineMode()\"\r\n [resolvedColumns]=\"resolvedColumns()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [ganttCanvasWidth]=\"0\"\r\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\r\n [renderTimeline]=\"false\"\r\n />\r\n\r\n <div>\r\n @for (item of resolvedGanttItems(); track $index) {\r\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"resolvedColumns()\"\n [ganttCanvasWidth]=\"0\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderTimeline]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (canResizeColumnsPane()) {\r\n <button\r\n type=\"button\"\r\n class=\"mt-timeline-splitter shrink-0\"\r\n [class.mt-timeline-splitter-active]=\"isColumnsResizing()\"\r\n (pointerdown)=\"onSplitterPointerDown($event)\"\r\n (dblclick)=\"onSplitterDoubleClick()\"\r\n (keydown)=\"onSplitterKeyDown($event)\"\r\n aria-label=\"Resize columns pane\"\r\n title=\"Drag to resize. Double-click to collapse/restore.\"\r\n ></button>\r\n }\r\n\r\n <!-- Scrollable timeline pane (horizontal scroll is limited to this area). -->\r\n <div\r\n class=\"mt-timeline-scroll min-w-0 flex-1 overflow-x-auto overflow-y-hidden\"\r\n #ganttScrollViewport\r\n >\r\n <div class=\"min-w-full\" [style.width.px]=\"ganttCanvasWidth()\">\r\n <mt-timeline-gantt-header\r\n [timelineMode]=\"timelineMode()\"\r\n [resolvedColumns]=\"resolvedColumns()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\r\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\r\n [renderColumns]=\"false\"\r\n />\r\n\r\n <div>\r\n @for (item of resolvedGanttItems(); track $index) {\r\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"[]\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderColumns]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, input, output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { TimelineScaleMode, TimelineScaleOption } from '../../timeline.models';\r\n\r\n/**\r\n * Shared timeline header.\r\n *\r\n * Responsibilities:\r\n * - Render title + mode picker UI.\r\n * - Emit the selected scale mode to parent orchestration.\r\n *\r\n * Notes for maintainers:\r\n * - Keep this component presentation-focused. Business logic should remain in\r\n * the parent timeline container.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-header',\r\n standalone: true,\r\n imports: [FormsModule, SelectField, Icon],\r\n templateUrl: './timeline-header.html',\r\n})\r\nexport class TimelineHeader {\r\n readonly title = input<string>('Timeline');\r\n readonly timelineMode = input<TimelineScaleMode>('quarterly');\r\n readonly timelineModeOptions = input<TimelineScaleOption[]>([]);\r\n\r\n readonly timelineModeChange = output<TimelineScaleMode>();\r\n\r\n // Re-emits selector changes so parent owns state updates.\r\n onTimelineModeChange(mode: TimelineScaleMode): void {\r\n this.timelineModeChange.emit(mode);\r\n }\r\n}\r\n","<!-- Timeline title + scale mode selector. -->\r\n<div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-icon icon=\"custom.timeline-point\" class=\"text-base\"></mt-icon>\r\n <h3 class=\"text-base font-semibold\">{{ title() }}</h3>\r\n </div>\r\n\r\n <!-- Scale mode switcher (monthly/quarterly/etc.). -->\r\n <div class=\"flex flex-wrap items-center justify-end gap-2\">\r\n <div class=\"w-44\">\r\n <mt-select-field\r\n [field]=\"false\"\r\n [options]=\"timelineModeOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [showClear]=\"false\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n placeholder=\"Timeline mode\"\r\n [ngModel]=\"timelineMode()\"\r\n (onChange)=\"onTimelineModeChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n contentChild,\r\n contentChildren,\r\n ElementRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Popover } from 'primeng/popover';\r\nimport {\r\n TimelineAccessor,\r\n TimelineColumnConfig,\r\n TimelineGanttMapping,\r\n TimelineProgressAccessorValue,\r\n TimelineProgressValue,\r\n TimelineScaleMode,\r\n TimelineScaleOption,\r\n} from '../../timeline.models';\r\nimport {\r\n TimelineMappedNode,\r\n TimelineResolvedItem,\r\n TimelineResolvedSegment,\r\n} from '../../timeline.interfaces';\r\nimport { TimelineGanttTemplateDirective } from '../../timeline-gantt-template.directive';\r\nimport { TimelineColumnTemplateDirective } from '../../timeline-column-template.directive';\r\nimport {\r\n TimelinePopoverTemplateContext,\r\n TimelinePopoverTemplateDirective,\r\n} from '../../timeline-popover-template.directive';\r\nimport { TimelineProgressTemplateDirective } from '../../timeline-progress-template.directive';\r\nimport { TimelineDefaultPopover } from '../timeline-default-popover/timeline-default-popover';\r\nimport { TimelineGantt } from '../timeline-gantt/timeline-gantt';\r\nimport { TimelineHeader } from '../timeline-header/timeline-header';\r\n\r\n// Default scale options shown in the timeline mode dropdown.\r\nconst DEFAULT_TIMELINE_MODES: TimelineScaleOption[] = [\r\n { label: 'Monthly', value: 'monthly' },\r\n { label: 'Quarterly', value: 'quarterly' },\r\n { label: 'Semi Annual', value: 'biannually' },\r\n { label: 'Annually', value: 'annually' },\r\n];\r\n\r\n/**\r\n * Dynamic Gantt timeline component.\r\n *\r\n * Data flow:\r\n * 1) Raw input nodes are mapped via `ganttMapping` to `TimelineMappedNode`.\r\n * 2) Timeline range is derived from min start/max end across the mapped tree.\r\n * 3) Time segments are generated from range + selected scale.\r\n * 4) Tree nodes are flattened into render-ready rows with pixel geometry.\r\n *\r\n * Column system:\r\n * - `columns = null` uses legacy defaults (title + optional status).\r\n * - `columns = []` renders progress-only mode with no leading columns.\r\n * - `columns = [...]` renders provided columns and supports per-column templates.\r\n */\r\n@Component({\r\n selector: 'mt-timeline',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Card,\r\n TimelineHeader,\r\n TimelineGantt,\r\n TimelineDefaultPopover,\r\n Popover,\r\n NgTemplateOutlet,\r\n ],\r\n templateUrl: './timeline.html',\r\n styleUrl: './timeline.scss',\r\n host: { class: 'block' },\r\n})\r\nexport default class Timeline {\r\n // PrimeNG popover instance controlling row details overlay.\r\n @ViewChild('detailsPopover') detailsPopover?: Popover;\r\n // Invisible anchor used to position popover at exact mouse click coordinates.\r\n @ViewChild('detailsPopoverClickAnchor')\r\n detailsPopoverClickAnchor?: ElementRef<HTMLElement>;\r\n\r\n readonly title = input<string>('Timeline');\r\n readonly emptyMessage = input<string>('No data to display');\r\n readonly isLoading = input<boolean>(false);\r\n readonly showHeader = input<boolean>(true);\r\n\r\n readonly timelineMode = model<TimelineScaleMode>('quarterly');\r\n readonly timelineModeOptions = input<TimelineScaleOption[]>([\r\n ...DEFAULT_TIMELINE_MODES,\r\n ]);\r\n\r\n readonly ganttData = input<unknown[]>([]);\r\n readonly ganttMapping = input<TimelineGanttMapping | null>(null);\r\n\r\n // Null means \"legacy defaults\". Empty array means \"progress-only\" mode.\r\n readonly columns = input<\r\n TimelineColumnConfig<unknown, TimelineResolvedItem>[] | null\r\n >(null);\r\n\r\n readonly ganttSegmentWidthPx = input<number>(96);\r\n readonly columnsPaneMinWidthPx = input<number>(0);\r\n readonly columnsPaneMaxWidthPx = input<number | null>(null);\r\n\r\n // Backward-compatible defaults when `columns` is null.\r\n readonly ganttTitleColumnLabel = input<string>('Portfolio Name');\r\n readonly ganttStatusColumnLabel = input<string>('Status');\r\n readonly ganttInitiativeColumnWidthPx = input<number>(288);\r\n readonly ganttStatusColumnWidthPx = input<number>(160);\r\n readonly showGanttStatusColumn = input<boolean>(false);\r\n\r\n readonly showGanttDetailsPopup = input<boolean>(true);\r\n\r\n // Public events exposed to consumers.\r\n readonly timelineModeChangeEvent = output<TimelineScaleMode>();\r\n readonly ganttItemClick = output<unknown>();\r\n\r\n // Optional full-template override for the Gantt body.\r\n readonly ganttTemplate = contentChild(TimelineGanttTemplateDirective);\r\n\r\n // Optional cell template override for a specific column key.\r\n readonly columnTemplates = contentChildren(\r\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>,\r\n );\r\n\r\n // Optional popup content override (clicked progress item details).\r\n readonly popoverTemplate = contentChild(\r\n TimelinePopoverTemplateDirective<unknown, TimelineResolvedItem>,\r\n );\r\n\r\n // Optional progress bar renderer override.\r\n readonly progressTemplate = contentChild(\r\n TimelineProgressTemplateDirective<unknown, TimelineResolvedItem>,\r\n );\r\n\r\n readonly collapsedGanttIds = signal<Set<string | number>>(new Set());\r\n readonly selectedGanttItem = signal<TimelineResolvedItem | null>(null);\r\n\r\n // Maps `mtTimelineColumn` templates by key for fast lookup in row rendering.\r\n readonly columnTemplatesByKey = computed(() => {\r\n const map = new Map<\r\n string,\r\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>\r\n >();\r\n\r\n for (const template of this.columnTemplates()) {\r\n if (template.key) {\r\n map.set(template.key, template);\r\n }\r\n }\r\n\r\n return map;\r\n });\r\n\r\n readonly mappedGanttNodes = computed<TimelineMappedNode[]>(() => {\r\n const mapping = this.ganttMapping();\r\n const data = this.ganttData();\r\n\r\n if (!mapping || !data.length) {\r\n return [];\r\n }\r\n\r\n const state = { nextId: 1 };\r\n return data\r\n .map((item) => this.mapNode(item, mapping, state))\r\n .filter((item): item is TimelineMappedNode => item !== null);\r\n });\r\n\r\n // Builds time columns from the mapped data date range and selected mode.\r\n readonly orderedGanttSegments = computed<TimelineResolvedSegment[]>(() => {\r\n const nodes = this.mappedGanttNodes();\r\n if (!nodes.length) {\r\n return [];\r\n }\r\n\r\n const range = this.resolveDateRange(nodes);\r\n if (!range) {\r\n return [];\r\n }\r\n\r\n return this.buildSegments(range.startAt, range.endAt, this.timelineMode());\r\n });\r\n\r\n // Timeline mode is controlled by parent model signal to keep it externally bindable.\r\n onTimelineModeChange(mode: TimelineScaleMode): void {\r\n if (!mode || this.timelineMode() === mode) {\r\n return;\r\n }\r\n\r\n this.timelineMode.set(mode);\r\n this.timelineModeChangeEvent.emit(mode);\r\n }\r\n\r\n // Handles row progress clicks: emits public event and opens details popover.\r\n onGanttProgressClick(item: TimelineResolvedItem, event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.ganttItemClick.emit(item.source ?? item);\r\n\r\n if (!this.showGanttDetailsPopup()) {\r\n return;\r\n }\r\n\r\n this.selectedGanttItem.set(item);\r\n\r\n const popover = this.detailsPopover;\r\n if (!popover) {\r\n return;\r\n }\r\n\r\n const clickTarget = this.positionPopoverClickAnchor(event);\r\n\r\n // If popover is already open, reopen it at the new anchor event.\r\n if (popover.overlayVisible) {\r\n popover.hide();\r\n setTimeout(() => popover.show(event, clickTarget), 0);\r\n return;\r\n }\r\n\r\n popover.show(event, clickTarget);\r\n }\r\n\r\n onDetailsPopoverHide(): void {\r\n this.selectedGanttItem.set(null);\r\n }\r\n\r\n // Closes popover and clears selected row context.\r\n hideDetailsPopover(): void {\r\n this.detailsPopover?.hide();\r\n this.selectedGanttItem.set(null);\r\n }\r\n\r\n // Maintains collapse state for hierarchical rows.\r\n toggleGanttCollapse(item: TimelineResolvedItem): void {\r\n if (!item.hasChildren) {\r\n return;\r\n }\r\n\r\n this.collapsedGanttIds.update((current) => {\r\n const next = new Set(current);\r\n\r\n if (next.has(item.id)) {\r\n next.delete(item.id);\r\n } else {\r\n next.add(item.id);\r\n }\r\n\r\n return next;\r\n });\r\n }\r\n\r\n getPopoverTemplateContext(\r\n item: TimelineResolvedItem,\r\n ): TimelinePopoverTemplateContext<unknown, TimelineResolvedItem> {\r\n const source = item.source ?? item;\r\n return {\r\n $implicit: source,\r\n item: source,\r\n resolved: item,\r\n close: () => this.hideDetailsPopover(),\r\n };\r\n }\r\n\r\n // Recursively maps consumer item shape using accessors from `ganttMapping`.\r\n private mapNode(\r\n source: unknown,\r\n mapping: TimelineGanttMapping,\r\n state: { nextId: number },\r\n ): TimelineMappedNode | null {\r\n const title = this.resolveString(source, mapping.title) ?? 'Untitled';\r\n\r\n const idRaw = this.resolveAccessor(source, mapping.id);\r\n const id =\r\n idRaw !== null && idRaw !== undefined && String(idRaw).length\r\n ? (idRaw as string | number)\r\n : `item-${state.nextId++}`;\r\n\r\n const progress = this.normalizeProgress(\r\n this.resolveAccessor(source, mapping.progress),\r\n );\r\n\r\n const childrenValue =\r\n this.resolveAccessor(source, mapping.children) ??\r\n this.path(source, 'children');\r\n\r\n const children = (Array.isArray(childrenValue) ? childrenValue : [])\r\n .map((child) => this.mapNode(child, mapping, state))\r\n .filter((item): item is TimelineMappedNode => item !== null);\r\n\r\n return {\r\n source,\r\n id,\r\n title,\r\n startAt: this.toTime(this.resolveAccessor(source, mapping.dateFrom)),\r\n endAt: this.toTime(this.resolveAccessor(source, mapping.dateTo)),\r\n progress,\r\n color: this.resolveColor(source, mapping.color),\r\n statusKey: this.resolveString(source, mapping.statusKey),\r\n statusName: this.resolveString(source, mapping.statusName),\r\n owner: this.resolveString(source, mapping.owner),\r\n phase: this.resolveString(source, mapping.phase),\r\n levelDescription: this.resolveString(source, mapping.levelDescription),\r\n levelColor: this.resolveString(source, mapping.levelColor),\r\n children,\r\n };\r\n }\r\n\r\n // Finds min/max timestamps in the mapped tree to define timeline bounds.\r\n private resolveDateRange(\r\n nodes: TimelineMappedNode[],\r\n ): { startAt: number; endAt: number } | null {\r\n let min = Number.POSITIVE_INFINITY;\r\n let max = Number.NEGATIVE_INFINITY;\r\n\r\n const visit = (items: TimelineMappedNode[]) => {\r\n for (const item of items) {\r\n if (item.startAt !== null) {\r\n min = Math.min(min, item.startAt);\r\n max = Math.max(max, item.startAt);\r\n }\r\n\r\n if (item.endAt !== null) {\r\n min = Math.min(min, item.endAt);\r\n max = Math.max(max, item.endAt);\r\n }\r\n\r\n if (item.children.length) {\r\n visit(item.children);\r\n }\r\n }\r\n };\r\n\r\n visit(nodes);\r\n\r\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\r\n return null;\r\n }\r\n\r\n return { startAt: min, endAt: max };\r\n }\r\n\r\n // Dispatcher for segment generation by selected scale mode.\r\n private buildSegments(\r\n startAt: number,\r\n endAt: number,\r\n mode: TimelineScaleMode,\r\n ): TimelineResolvedSegment[] {\r\n switch (mode) {\r\n case 'monthly':\r\n return this.genSegments(\r\n startAt,\r\n endAt,\r\n 1,\r\n (month) => `M ${month + 1}`,\r\n 'M',\r\n );\r\n case 'quarterly':\r\n return this.genSegments(\r\n startAt,\r\n endAt,\r\n 3,\r\n (month) => `Q ${Math.floor(month / 3) + 1}`,\r\n 'Q',\r\n );\r\n case 'biannually':\r\n return this.genSegments(\r\n startAt,\r\n endAt,\r\n 6,\r\n (month) => `H ${month < 6 ? 1 : 2}`,\r\n 'H',\r\n );\r\n case 'annually':\r\n return this.genSegments(startAt, endAt, 12, () => 'Y', 'Y');\r\n default:\r\n return this.genSegments(\r\n startAt,\r\n endAt,\r\n 3,\r\n (month) => `Q ${Math.floor(month / 3) + 1}`,\r\n 'Q',\r\n );\r\n }\r\n }\r\n\r\n // Generates contiguous segments between range boundaries.\r\n private genSegments(\r\n startAt: number,\r\n endAt: number,\r\n stepMonths: number,\r\n title: (monthIndex: number) => string,\r\n prefix: string,\r\n ): TimelineResolvedSegment[] {\r\n const segments: TimelineResolvedSegment[] = [];\r\n const start = new Date(startAt);\r\n const end = new Date(endAt);\r\n\r\n let year = start.getUTCFullYear();\r\n let month = start.getUTCMonth();\r\n let seq = 0;\r\n\r\n if (stepMonths > 1) {\r\n month = Math.floor(month / stepMonths) * stepMonths;\r\n }\r\n\r\n while (\r\n year < end.getUTCFullYear() ||\r\n (year === end.getUTCFullYear() && month <= end.getUTCMonth())\r\n ) {\r\n segments.push({\r\n id: `${prefix}${month + 1}_${year}`,\r\n title: title(month),\r\n seq,\r\n year,\r\n startAt: Date.UTC(year, month, 1),\r\n endAt: Date.UTC(year, month + stepMonths, 0, 23, 59, 59, 999),\r\n });\r\n\r\n seq += 1;\r\n month += stepMonths;\r\n\r\n if (month > 11) {\r\n year += Math.floor(month / 12);\r\n month %= 12;\r\n }\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n // Supports both dot-path accessors and function accessors.\r\n private resolveAccessor<TValue>(\r\n item: unknown,\r\n accessor: TimelineAccessor<unknown, TValue> | undefined,\r\n ): TValue | undefined {\r\n if (!accessor) {\r\n return undefined;\r\n }\r\n\r\n if (typeof accessor === 'function') {\r\n return accessor(item);\r\n }\r\n\r\n return this.path(item, accessor) as TValue | undefined;\r\n }\r\n\r\n private resolveString(\r\n item: unknown,\r\n accessor: TimelineAccessor<unknown, string | null | undefined> | undefined,\r\n ): string | null {\r\n const value = this.resolveAccessor(item, accessor);\r\n\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n // Robust color resolution for string/object return shapes.\r\n private resolveColor(\r\n item: unknown,\r\n accessor: TimelineAccessor<unknown, string | null | undefined> | undefined,\r\n ): string | null {\r\n const value = this.resolveAccessor(item, accessor);\r\n\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const color = (value as Record<string, unknown>)['color'];\r\n if (typeof color === 'string') {\r\n return color;\r\n }\r\n\r\n const detailsColor = this.path(value, 'details.color');\r\n if (typeof detailsColor === 'string') {\r\n return detailsColor;\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n // Safe deep property accessor (supports bracket and dot notation).\r\n private path(item: unknown, value: string): unknown {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n return value\r\n .replace(/\\[(\\d+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n .reduce<unknown>((current, key) => {\r\n if (\r\n current === null ||\r\n current === undefined ||\r\n typeof current !== 'object'\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return (current as Record<string, unknown>)[key];\r\n }, item);\r\n }\r\n\r\n // Normalizes all supported progress input shapes into a single object model.\r\n private normalizeProgress(\r\n value: TimelineProgressAccessorValue,\r\n ): TimelineProgressValue {\r\n if (value === null || value === undefined) {\r\n return { value: 0, label: '0%' };\r\n }\r\n\r\n if (typeof value === 'number') {\r\n const safeValue = this.clampProgress(value);\r\n return { value: safeValue, label: `${Math.round(safeValue)}%` };\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const safeValue = this.clampProgress(\r\n Number(value.replace(/[^\\d.-]/g, '')),\r\n );\r\n return {\r\n value: safeValue,\r\n label: value.trim().length ? value : `${Math.round(safeValue)}%`,\r\n };\r\n }\r\n\r\n const safeValue = this.clampProgress(value.value);\r\n return {\r\n value: safeValue,\r\n label: value.label ?? `${Math.round(safeValue)}%`,\r\n color: value.color,\r\n };\r\n }\r\n\r\n // Accepts date values as Date, timestamp, ISO string, or `{ actualValue }`.\r\n private toTime(value: unknown): number | null {\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n\r\n if (value instanceof Date) {\r\n return Number.isFinite(value.getTime()) ? value.getTime() : null;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const time = new Date(value).getTime();\r\n return Number.isFinite(time) ? time : null;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const actualValue = (value as Record<string, unknown>)['actualValue'];\r\n if (actualValue !== undefined) {\r\n return this.toTime(actualValue);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private clampProgress(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.max(0, Math.min(100, value));\r\n }\r\n\r\n private positionPopoverClickAnchor(\r\n event: MouseEvent,\r\n ): HTMLElement | undefined {\r\n const anchor = this.detailsPopoverClickAnchor?.nativeElement;\r\n if (!anchor) {\r\n return undefined;\r\n }\r\n\r\n anchor.style.left = `${event.clientX}px`;\r\n anchor.style.top = `${event.clientY}px`;\r\n return anchor;\r\n }\r\n}\r\n","<mt-card class=\"mt-3 block overflow-hidden\">\r\n <!-- Optional top header (title + timeline mode selector). -->\r\n @if (showHeader()) {\r\n <mt-timeline-header\r\n [title]=\"title()\"\r\n [timelineMode]=\"timelineMode()\"\r\n [timelineModeOptions]=\"timelineModeOptions()\"\r\n (timelineModeChange)=\"onTimelineModeChange($event)\"\r\n />\r\n }\r\n\r\n <!-- Loading state. -->\r\n @if (isLoading()) {\r\n <div class=\"flex min-h-56 items-center justify-center p-8\">\r\n <div\r\n class=\"h-8 w-8 animate-spin rounded-full border-2 border-surface-200\"\r\n style=\"border-top-color: var(--p-primary-color)\"\r\n ></div>\r\n </div>\r\n } @else if (ganttTemplate(); as template) {\r\n <!-- Full custom gantt-body override. -->\r\n <div class=\"min-h-56 p-4\">\r\n <ng-container [ngTemplateOutlet]=\"template.templateRef\"></ng-container>\r\n </div>\r\n } @else if (\r\n mappedGanttNodes().length > 0 && orderedGanttSegments().length > 0\r\n ) {\r\n <!-- Built-in gantt renderer. -->\r\n <mt-timeline-gantt\r\n [timelineMode]=\"timelineMode()\"\r\n [columns]=\"columns()\"\r\n [ganttTitleColumnLabel]=\"ganttTitleColumnLabel()\"\r\n [ganttStatusColumnLabel]=\"ganttStatusColumnLabel()\"\r\n [ganttInitiativeColumnWidthPx]=\"ganttInitiativeColumnWidthPx()\"\r\n [ganttStatusColumnWidthPx]=\"ganttStatusColumnWidthPx()\"\r\n [showGanttStatusColumn]=\"showGanttStatusColumn()\"\r\n [ganttSegmentWidthPx]=\"ganttSegmentWidthPx()\"\r\n [columnsPaneMinWidthPx]=\"columnsPaneMinWidthPx()\"\r\n [columnsPaneMaxWidthPx]=\"columnsPaneMaxWidthPx()\"\r\n [mappedGanttNodes]=\"mappedGanttNodes()\"\r\n [orderedGanttSegments]=\"orderedGanttSegments()\"\r\n [collapsedGanttIds]=\"collapsedGanttIds()\"\r\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\r\n [progressTemplateDirective]=\"progressTemplate()\"\r\n (toggleCollapse)=\"toggleGanttCollapse($event)\"\r\n (progressClick)=\"onGanttProgressClick($event.item, $event.event)\"\r\n />\r\n } @else {\r\n <!-- Empty state. -->\r\n <div\r\n class=\"flex min-h-56 items-center justify-center p-8 text-sm text-surface-500\"\r\n >\r\n {{ emptyMessage() }}\r\n </div>\r\n }\r\n\r\n <!-- Details popover host (custom template or built-in fallback). -->\r\n <p-popover #detailsPopover appendTo=\"body\" (onHide)=\"onDetailsPopoverHide()\">\r\n @if (showGanttDetailsPopup() && selectedGanttItem(); as item) {\r\n @if (popoverTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template.templateRef\"\r\n [ngTemplateOutletContext]=\"getPopoverTemplateContext(item)\"\r\n ></ng-container>\r\n } @else {\r\n <mt-timeline-default-popover\r\n [item]=\"item\"\r\n (requestClose)=\"hideDetailsPopover()\"\r\n />\r\n }\r\n }\r\n </p-popover>\r\n\r\n <!-- Point anchor used to place the popover exactly where user clicked. -->\r\n <span\r\n #detailsPopoverClickAnchor\r\n class=\"pointer-events-none fixed h-0 w-0\"\r\n [style.left.px]=\"-9999\"\r\n [style.top.px]=\"-9999\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n</mt-card>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-timeline.mjs","sources":["../../../../packages/masterteam/timeline/src/lib/timeline/timeline-gantt-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/timeline-column-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/timeline-popover-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/timeline-progress-template.directive.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-default-popover/timeline-default-popover.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-default-popover/timeline-default-popover.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-header/timeline-gantt-header.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-header/timeline-gantt-header.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-row/timeline-gantt-row.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt-row/timeline-gantt-row.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt/timeline-gantt.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-gantt/timeline-gantt.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-header/timeline-header.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline-header/timeline-header.html","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline/timeline.ts","../../../../packages/masterteam/timeline/src/lib/timeline/components/timeline/timeline.html","../../../../packages/masterteam/timeline/src/masterteam-timeline.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelineGantt]',\r\n standalone: true,\r\n})\r\nexport class TimelineGanttTemplateDirective {\r\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","import { Directive, inject, Input, TemplateRef } from '@angular/core';\r\nimport { TimelineColumnConfig } from './timeline.models';\r\n\r\nexport interface TimelineColumnTemplateContext<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n $implicit: TItem;\r\n item: TItem;\r\n resolved: TResolved;\r\n column: TimelineColumnConfig<TItem, TResolved>;\r\n value: unknown;\r\n canToggle: boolean;\r\n isCollapsed: boolean;\r\n toggle: () => void;\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelineColumn]',\r\n standalone: true,\r\n})\r\nexport class TimelineColumnTemplateDirective<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n @Input('mtTimelineColumn') key = '';\r\n\r\n readonly templateRef =\r\n inject<TemplateRef<TimelineColumnTemplateContext<TItem, TResolved>>>(\r\n TemplateRef,\r\n );\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\nexport interface TimelinePopoverTemplateContext<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n $implicit: TItem;\r\n item: TItem;\r\n resolved: TResolved;\r\n close: () => void;\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelinePopover]',\r\n standalone: true,\r\n})\r\nexport class TimelinePopoverTemplateDirective<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n readonly templateRef =\r\n inject<TemplateRef<TimelinePopoverTemplateContext<TItem, TResolved>>>(\r\n TemplateRef,\r\n );\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\nexport interface TimelineProgressTemplateContext<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n $implicit: TItem;\r\n item: TItem;\r\n resolved: TResolved;\r\n startOffsetPx: number;\r\n trackWidthPx: number;\r\n fillWidthPx: number;\r\n progressValue: number;\r\n progressLabel: string;\r\n color: string;\r\n trackColor: string;\r\n isRtl: boolean;\r\n onSelect: (event: MouseEvent) => void;\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[mtTimelineProgress]',\r\n standalone: true,\r\n})\r\nexport class TimelineProgressTemplateDirective<\r\n TItem = unknown,\r\n TResolved = unknown,\r\n> {\r\n readonly templateRef =\r\n inject<TemplateRef<TimelineProgressTemplateContext<TItem, TResolved>>>(\r\n TemplateRef,\r\n );\r\n}\r\n","import { Component, input, output } from '@angular/core';\r\nimport { TimelineResolvedItem } from '../../timeline.interfaces';\r\n\r\n/**\r\n * Built-in details popover body used when no custom `mtTimelinePopover`\r\n * template is provided by the consumer.\r\n *\r\n * This component is intentionally dumb/presentational: it only receives a\r\n * resolved row item and exposes a close event.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-default-popover',\r\n standalone: true,\r\n templateUrl: './timeline-default-popover.html',\r\n})\r\nexport class TimelineDefaultPopover {\r\n // Resolved timeline row currently selected by user.\r\n readonly item = input.required<TimelineResolvedItem>();\r\n\r\n // Requests parent popover host to close.\r\n readonly requestClose = output<void>();\r\n}\r\n","<!-- Default details view shown inside PrimeNG popover. -->\r\n<div class=\"w-[22.5rem]\">\r\n <div class=\"mb-3 flex items-center justify-between\">\r\n <h4 class=\"text-sm font-semibold\">Level Details</h4>\r\n <button\r\n type=\"button\"\r\n class=\"rounded border border-surface px-2 py-1 text-xs\"\r\n (click)=\"requestClose.emit()\"\r\n >\r\n Close\r\n </button>\r\n </div>\r\n\r\n <div class=\"grid gap-2 text-sm sm:grid-cols-2\">\r\n <div><span class=\"font-semibold\">Name:</span> {{ item().title }}</div>\r\n <div>\r\n <span class=\"font-semibold\">Level:</span>\r\n {{ item().levelDescription }}\r\n </div>\r\n <div><span class=\"font-semibold\">Owner:</span> {{ item().owner }}</div>\r\n <div>\r\n <span class=\"font-semibold\">Status:</span>\r\n <span [style.color]=\"item().statusColor\">{{ item().statusName }}</span>\r\n </div>\r\n <div>\r\n <span class=\"font-semibold\">Progress:</span>\r\n {{ item().progressLabel }}\r\n </div>\r\n <div><span class=\"font-semibold\">Range:</span> {{ item().phase }}</div>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input } from '@angular/core';\r\nimport {\r\n TimelineResolvedColumn,\r\n TimelineResolvedSegment,\r\n} from '../../timeline.interfaces';\r\nimport { TimelineScaleMode } from '../../timeline.models';\r\n\r\n/**\r\n * Header renderer for the Gantt table:\r\n * - left sticky metadata columns\r\n * - right timeline segment columns\r\n *\r\n * Kept separate to reduce template and logic noise in the Gantt container.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-gantt-header',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './timeline-gantt-header.html',\r\n host: { class: 'block min-w-0' },\r\n})\r\nexport class TimelineGanttHeader {\r\n private readonly monthLabels = [\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec',\r\n ];\r\n\r\n readonly timelineMode = input<TimelineScaleMode>('quarterly');\r\n readonly resolvedColumns = input<TimelineResolvedColumn[]>([]);\r\n readonly orderedGanttSegments = input<TimelineResolvedSegment[]>([]);\r\n readonly ganttCanvasWidth = input<number>(0);\r\n readonly effectiveGanttSegmentWidthPx = input<number>(96);\r\n readonly renderColumns = input<boolean>(true);\r\n readonly renderTimeline = input<boolean>(true);\r\n\r\n // Converts monthly segments from \"M N\" to calendar abbreviations.\r\n resolveSegmentTitle(segment: TimelineResolvedSegment): string {\r\n if (this.timelineMode() !== 'monthly') {\r\n return segment.title;\r\n }\r\n\r\n const month = Number(String(segment.title).replace(/\\D/g, ''));\r\n return Number.isFinite(month) && month >= 1 && month <= 12\r\n ? this.monthLabels[month - 1]\r\n : segment.title;\r\n }\r\n\r\n resolveHeaderAlignClass(\r\n column: TimelineResolvedColumn,\r\n ): Record<string, boolean> {\r\n return {\r\n 'text-start': column.position === 'start',\r\n 'text-center': column.position === 'center',\r\n 'text-end': column.position === 'end',\r\n };\r\n }\r\n}\r\n","<!-- Sticky metadata columns + timeline period header. -->\r\n<div class=\"flex border-b border-surface bg-surface-50\">\r\n <!-- Left sticky columns (title/status/custom columns). -->\r\n @if (renderColumns()) {\r\n @for (column of resolvedColumns(); track $index) {\r\n <div\r\n class=\"shrink-0 border-e border-surface bg-surface-50 p-3 text-xs font-semibold uppercase text-surface-600\"\r\n [style.width.px]=\"column.widthPx\"\r\n [ngClass]=\"resolveHeaderAlignClass(column)\"\r\n >\r\n {{ column.header }}\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Time scale columns (month/quarter/half/year). -->\r\n @if (renderTimeline()) {\r\n <div\r\n class=\"flex shrink-0 items-center bg-surface-50\"\r\n [style.width.px]=\"ganttCanvasWidth()\"\r\n >\r\n @for (column of orderedGanttSegments(); track $index) {\r\n <div\r\n class=\"shrink-0 border-e border-surface px-2 py-3 text-center text-xs font-semibold uppercase text-surface-600\"\r\n [style.width.px]=\"effectiveGanttSegmentWidthPx()\"\r\n >\r\n {{ resolveSegmentTitle(column) }}\r\n @if (column.year !== undefined && column.year !== null) {\r\n {{ column.year }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, input, output, TemplateRef } from '@angular/core';\r\nimport { Icon } from '@masterteam/icons';\r\nimport {\r\n TimelineColumnTemplateContext,\r\n TimelineColumnTemplateDirective,\r\n} from '../../timeline-column-template.directive';\r\nimport {\r\n TimelineResolvedColumn,\r\n TimelineResolvedItem,\r\n} from '../../timeline.interfaces';\r\nimport {\r\n TimelineProgressTemplateContext,\r\n TimelineProgressTemplateDirective,\r\n} from '../../timeline-progress-template.directive';\r\n\r\n/**\r\n * Emitted when user clicks a progress bar for a specific row.\r\n */\r\nexport interface TimelineRowProgressClickEvent {\r\n item: TimelineResolvedItem;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * Single-row renderer for the Gantt body.\r\n *\r\n * Responsibilities:\r\n * - Render sticky metadata cells for one row.\r\n * - Render progress lane (default or custom progress template).\r\n * - Emit row-level events (collapse + progress selection).\r\n *\r\n * Keep heavy computations out of this component. Parent components should pass\r\n * already-resolved row geometry and style values.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-gantt-row',\r\n standalone: true,\r\n imports: [CommonModule, Icon, NgTemplateOutlet],\r\n templateUrl: './timeline-gantt-row.html',\r\n host: { class: 'block min-w-0' },\r\n})\r\nexport class TimelineGanttRow {\r\n readonly item = input.required<TimelineResolvedItem>();\r\n readonly resolvedColumns = input<TimelineResolvedColumn[]>([]);\r\n readonly ganttCanvasWidth = input<number>(0);\r\n readonly laneInsetPx = input<number>(12);\r\n readonly renderColumns = input<boolean>(true);\r\n readonly renderTimeline = input<boolean>(true);\r\n\r\n readonly columnTemplatesByKey = input<\r\n ReadonlyMap<\r\n string,\r\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>\r\n >\r\n >(new Map());\r\n\r\n readonly progressTemplateDirective = input<TimelineProgressTemplateDirective<\r\n unknown,\r\n TimelineResolvedItem\r\n > | null>(null);\r\n\r\n readonly toggleCollapse = output<TimelineResolvedItem>();\r\n readonly progressClick = output<TimelineRowProgressClickEvent>();\r\n\r\n // Forwards collapse toggles to container component.\r\n onToggleCollapse(item: TimelineResolvedItem): void {\r\n this.toggleCollapse.emit(item);\r\n }\r\n\r\n // Forwards progress-bar click with original mouse event for popover anchoring.\r\n onProgressClick(item: TimelineResolvedItem, event: MouseEvent): void {\r\n this.progressClick.emit({ item, event });\r\n }\r\n\r\n collapseIcon(item: TimelineResolvedItem): string {\r\n if (!item.isCollapsed) {\r\n return 'arrow.chevron-down';\r\n }\r\n\r\n return this.isRtl() ? 'arrow.chevron-left' : 'arrow.chevron-right';\r\n }\r\n\r\n resolveColumnTemplate(\r\n column: TimelineResolvedColumn,\r\n ): TemplateRef<\r\n TimelineColumnTemplateContext<unknown, TimelineResolvedItem>\r\n > | null {\r\n return this.columnTemplatesByKey().get(column.key)?.templateRef ?? null;\r\n }\r\n\r\n resolveColumnText(\r\n column: TimelineResolvedColumn,\r\n item: TimelineResolvedItem,\r\n ): string {\r\n const value = this.resolveColumnValue(column, item);\r\n if (value === null || value === undefined || value === '') {\r\n if (column.isTreeColumn) {\r\n return item.title;\r\n }\r\n return '-';\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n resolveColumnValue(\r\n column: TimelineResolvedColumn,\r\n item: TimelineResolvedItem,\r\n ): unknown {\r\n const source = item.source ?? item;\r\n\r\n if (column.value) {\r\n if (typeof column.value === 'function') {\r\n return column.value({ item: source, resolved: item });\r\n }\r\n\r\n return this.path(source, column.value);\r\n }\r\n\r\n if (column.isTreeColumn) {\r\n return item.title;\r\n }\r\n\r\n const sourceValue = this.path(source, column.key);\r\n if (sourceValue !== undefined && sourceValue !== null) {\r\n return sourceValue;\r\n }\r\n\r\n return this.path(item, column.key);\r\n }\r\n\r\n resolveColumnAlignClass(\r\n column: TimelineResolvedColumn,\r\n ): Record<string, boolean> {\r\n return {\r\n 'justify-start': column.position === 'start',\r\n 'justify-center': column.position === 'center',\r\n 'justify-end': column.position === 'end',\r\n };\r\n }\r\n\r\n getColumnTemplateContext(\r\n column: TimelineResolvedColumn,\r\n item: TimelineResolvedItem,\r\n ): TimelineColumnTemplateContext<unknown, TimelineResolvedItem> {\r\n const source = item.source ?? item;\r\n\r\n return {\r\n $implicit: source,\r\n item: source,\r\n resolved: item,\r\n column,\r\n value: this.resolveColumnValue(column, item),\r\n canToggle: item.hasChildren,\r\n isCollapsed: item.isCollapsed,\r\n toggle: () => this.onToggleCollapse(item),\r\n };\r\n }\r\n\r\n getProgressTemplateContext(\r\n item: TimelineResolvedItem,\r\n ): TimelineProgressTemplateContext<unknown, TimelineResolvedItem> {\r\n const source = item.source ?? item;\r\n return {\r\n $implicit: source,\r\n item: source,\r\n resolved: item,\r\n startOffsetPx: item.startOffsetPx + this.laneInsetPx(),\r\n trackWidthPx: item.trackWidthPx,\r\n fillWidthPx: item.progressFillWidthPx,\r\n progressValue: item.progressValue,\r\n progressLabel: item.progressLabel,\r\n color: item.statusColor,\r\n trackColor: item.progressTrackColor,\r\n isRtl: this.isRtl(),\r\n onSelect: (event) => this.onProgressClick(item, event),\r\n };\r\n }\r\n\r\n // Reads document direction to support sticky offsets and progress alignment.\r\n protected isRtl(): boolean {\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n const dir =\r\n document.documentElement.getAttribute('dir') ??\r\n document.body?.getAttribute('dir') ??\r\n 'ltr';\r\n\r\n return dir.toLowerCase() === 'rtl';\r\n }\r\n\r\n // Local safe deep accessor used by dynamic column value path mapping.\r\n private path(item: unknown, value: string): unknown {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n return value\r\n .replace(/\\[(\\d+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n .reduce<unknown>((current, key) => {\r\n if (\r\n current === null ||\r\n current === undefined ||\r\n typeof current !== 'object'\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return (current as Record<string, unknown>)[key];\r\n }, item);\r\n }\r\n}\r\n","<!-- One gantt data row: sticky metadata cells + progress lane. -->\n<div class=\"relative flex\">\n <!-- Left sticky metadata cells. -->\n @if (renderColumns()) {\n @for (column of resolvedColumns(); track $index) {\n <div\n class=\"flex h-16 shrink-0 items-center overflow-hidden border-e border-b border-surface bg-content p-3\"\n [style.width.px]=\"column.widthPx\"\n [ngClass]=\"resolveColumnAlignClass(column)\"\n >\n <!-- Per-column custom template, when provided by consumer. -->\n @if (resolveColumnTemplate(column); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"getColumnTemplateContext(column, item())\"\n ></ng-container>\n } @else {\n <!-- Built-in fallback renderers by column configuration. -->\n @if (column.isTreeColumn) {\n <div\n class=\"flex min-w-0 items-center gap-2\"\n [style.padding-inline-start.px]=\"item().levelDepth * 16\"\n >\n @if (item().hasChildren) {\n <mt-icon\n class=\"cursor-pointer\"\n (click)=\"onToggleCollapse(item())\"\n [icon]=\"collapseIcon(item())\"\n ></mt-icon>\n } @else {\n <span class=\"inline-block w-5\"></span>\n }\n <span class=\"truncate text-sm font-semibold\">\n {{ resolveColumnText(column, item()) }}\n </span>\n </div>\n } @else {\n <span class=\"truncate text-sm\">\n {{ resolveColumnText(column, item()) }}\n </span>\n }\n }\n </div>\n }\n }\n\n <!-- Right timeline canvas cell for progress track/fill. -->\n @if (renderTimeline()) {\n <div\n class=\"relative z-0 h-16 shrink-0 overflow-hidden border-b border-surface py-4\"\n [style.width.px]=\"ganttCanvasWidth()\"\n [style.z-index]=\"1\"\n >\n <div class=\"h-8\"></div>\n <!-- Consumer custom progress template. -->\n @if (progressTemplateDirective(); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"getProgressTemplateContext(item())\"\n ></ng-container>\n } @else {\n <!-- Built-in progress renderer. -->\n <div\n class=\"absolute top-1/2 h-7 -translate-y-1/2 cursor-pointer rounded-full\"\n [style.left.px]=\"\n isRtl() ? null : item().startOffsetPx + laneInsetPx()\n \"\n [style.right.px]=\"\n isRtl() ? item().startOffsetPx + laneInsetPx() : null\n \"\n [style.width.px]=\"item().trackWidthPx\"\n [style.background-color]=\"item().progressTrackColor\"\n [style.z-index]=\"1\"\n [attr.title]=\"item().progressLabel\"\n (click)=\"onProgressClick(item(), $event)\"\n >\n @if (item().progressFillWidthPx > 0) {\n <div\n class=\"h-full rounded-full\"\n [style.width.px]=\"item().progressFillWidthPx\"\n [style.background-color]=\"item().statusColor\"\n ></div>\n }\n\n <span\n class=\"pointer-events-none absolute top-1/2 z-[1] -translate-y-1/2 rounded-full bg-white px-2 py-0.5 text-[10px] font-semibold text-black shadow-sm\"\n [style.left.px]=\"isRtl() ? null : 8\"\n [style.right.px]=\"isRtl() ? 8 : null\"\n [attr.title]=\"item().progressLabel\"\n >\n {{ item().progressLabel }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n input,\n OnDestroy,\n output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { TimelineColumnTemplateDirective } from '../../timeline-column-template.directive';\nimport {\n TimelineMappedNode,\n TimelineResolvedColumn,\n TimelineResolvedItem,\n TimelineResolvedSegment,\n} from '../../timeline.interfaces';\nimport { TimelineColumnConfig, TimelineScaleMode } from '../../timeline.models';\nimport { TimelineProgressTemplateDirective } from '../../timeline-progress-template.directive';\nimport { TimelineGanttHeader } from '../timeline-gantt-header/timeline-gantt-header';\nimport {\n TimelineGanttRow,\n TimelineRowProgressClickEvent,\n} from '../timeline-gantt-row/timeline-gantt-row';\n\n/**\n * Event emitted when a row progress bar is selected.\n * Parent uses this to emit public click event and anchor popover.\n */\nexport interface TimelineProgressClickEvent {\n item: TimelineResolvedItem;\n event: MouseEvent;\n}\n\n/**\n * Gantt view orchestrator.\n *\n * Responsibilities:\n * - Resolve dynamic/legacy columns.\n * - Compute table/canvas geometry based on viewport width + segment count.\n * - Flatten mapped tree data into render-ready rows.\n * - Coordinate child header/row components and re-emit row events.\n *\n * Non-responsibilities:\n * - Raw data mapping from consumer models (handled by parent timeline component).\n * - Popover state and selection management (handled by parent timeline component).\n */\n@Component({\n selector: 'mt-timeline-gantt',\n standalone: true,\n imports: [CommonModule, TimelineGanttHeader, TimelineGanttRow],\n templateUrl: './timeline-gantt.html',\n styleUrl: './timeline-gantt.scss',\n})\nexport class TimelineGantt implements AfterViewInit, OnDestroy {\n @ViewChild('ganttSplitContainer')\n set ganttSplitContainerRef(value: ElementRef<HTMLElement> | undefined) {\n this.ganttSplitContainer = value;\n this.bindSplitResizeObserver();\n }\n\n @ViewChild('ganttScrollViewport')\n set ganttScrollViewportRef(value: ElementRef<HTMLElement> | undefined) {\n this.ganttScrollViewport = value;\n this.bindResizeObserver();\n }\n\n private ganttSplitContainer?: ElementRef<HTMLElement>;\n private ganttScrollViewport?: ElementRef<HTMLElement>;\n private resizeObserver?: ResizeObserver;\n private splitResizeObserver?: ResizeObserver;\n\n // Width of the visible horizontal viewport used for adaptive segment sizing.\n private readonly ganttViewportWidth = signal(0);\n private readonly ganttContainerWidth = signal(0);\n\n private readonly splitterWidthPx = 10;\n private readonly timelineLaneInsetPx = 12;\n private readonly adaptiveSegmentMaxWidthPx = 320;\n readonly laneInsetPx = this.timelineLaneInsetPx;\n private readonly columnsPaneUserWidthPx = signal<number | null>(null);\n private readonly lastExpandedColumnsPaneWidthPx = signal<number | null>(null);\n readonly isColumnsResizing = signal(false);\n readonly canResizeColumnsPane = computed(\n () => this.baseResolvedColumns().length > 0,\n );\n\n private resizeStartClientX = 0;\n private resizeStartColumnsPaneWidthPx = 0;\n\n readonly timelineMode = input<TimelineScaleMode>('quarterly');\n\n readonly columns = input<\n TimelineColumnConfig<unknown, TimelineResolvedItem>[] | null\n >(null);\n readonly ganttTitleColumnLabel = input<string>('Portfolio Name');\n readonly ganttStatusColumnLabel = input<string>('Status');\n readonly ganttInitiativeColumnWidthPx = input<number>(288);\n readonly ganttStatusColumnWidthPx = input<number>(160);\n readonly showGanttStatusColumn = input<boolean>(false);\n readonly ganttSegmentWidthPx = input<number>(96);\n readonly defaultVisibleColumns = input<number | null>(4);\n readonly columnsPaneMinWidthPx = input<number>(0);\n readonly columnsPaneMaxWidthPx = input<number | null>(null);\n\n readonly mappedGanttNodes = input<TimelineMappedNode[]>([]);\n readonly orderedGanttSegments = input<TimelineResolvedSegment[]>([]);\n readonly collapsedGanttIds = input<Set<string | number>>(new Set());\n\n readonly columnTemplatesByKey = input<\n ReadonlyMap<\n string,\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>\n >\n >(new Map());\n\n readonly progressTemplateDirective = input<TimelineProgressTemplateDirective<\n unknown,\n TimelineResolvedItem\n > | null>(null);\n\n readonly toggleCollapse = output<TimelineResolvedItem>();\n readonly progressClick = output<TimelineProgressClickEvent>();\n\n // Resolves the base columns contract before splitter-specific layout is applied.\n readonly baseResolvedColumns = computed<TimelineResolvedColumn[]>(() => {\n const providedColumns = this.columns();\n const baseColumns =\n providedColumns === null ? this.buildLegacyColumns() : providedColumns;\n const resolvedTreeColumnIndex = Math.max(\n 0,\n baseColumns.findIndex((column) => column.tree === true),\n );\n\n return baseColumns.map((column, index) => {\n const baseWidthPx = Math.max(\n 0,\n Math.floor(column.widthPx ?? this.ganttInitiativeColumnWidthPx()),\n );\n\n const resolvedColumn: TimelineResolvedColumn = {\n ...column,\n header: column.header ?? column.key,\n baseWidthPx,\n widthPx: baseWidthPx,\n position: column.position ?? 'start',\n isTreeColumn: index === resolvedTreeColumnIndex,\n };\n\n return resolvedColumn;\n });\n });\n\n readonly baseColumnsWidthPx = computed(() =>\n this.baseResolvedColumns().reduce(\n (total, column) => total + column.baseWidthPx,\n 0,\n ),\n );\n\n readonly preferredDefaultColumnsPaneWidthPx = computed(() => {\n const columns = this.baseResolvedColumns();\n if (!columns.length) {\n return 0;\n }\n\n const visibleColumns = this.defaultVisibleColumns();\n if (visibleColumns === null || visibleColumns === undefined) {\n return this.baseColumnsWidthPx();\n }\n\n const normalizedVisibleColumns = Math.max(0, Math.floor(visibleColumns));\n if (normalizedVisibleColumns <= 0) {\n return 0;\n }\n\n return columns\n .slice(0, Math.min(normalizedVisibleColumns, columns.length))\n .reduce((total, column) => total + column.baseWidthPx, 0);\n });\n\n // Column viewport and column content width are treated separately:\n // - splitter controls the viewport width\n // - columns keep base widths until there is extra space to relax into\n readonly resolvedColumns = computed<TimelineResolvedColumn[]>(() => {\n const columns = this.baseResolvedColumns();\n const paneWidthPx = this.resolvedColumnsPaneWidthPx();\n const totalBaseWidthPx = this.baseColumnsWidthPx();\n\n if (paneWidthPx <= totalBaseWidthPx) {\n return columns;\n }\n\n return this.stretchColumnsToWidth(columns, paneWidthPx);\n });\n\n readonly columnsContentWidthPx = computed(() =>\n this.resolvedColumns().reduce((total, column) => total + column.widthPx, 0),\n );\n\n readonly resolvedColumnsPaneWidthPx = computed(() => {\n const userWidth = this.columnsPaneUserWidthPx();\n const preferredWidth =\n userWidth ?? this.preferredDefaultColumnsPaneWidthPx();\n return this.clampColumnsPaneWidth(preferredWidth);\n });\n\n // Segment width expands to fill viewport when possible but never goes below base width.\n readonly effectiveGanttSegmentWidthPx = computed(() => {\n const segmentCount = this.orderedGanttSegments().length;\n const baseWidth = this.ganttSegmentWidthPx();\n\n if (!segmentCount) {\n return baseWidth;\n }\n\n const availableWidth = this.ganttViewportWidth();\n if (availableWidth <= 0) {\n return baseWidth;\n }\n\n const candidateWidth = Math.floor(availableWidth / segmentCount);\n return Math.max(\n baseWidth,\n Math.min(candidateWidth, this.adaptiveSegmentMaxWidthPx),\n );\n });\n\n readonly ganttCanvasWidth = computed(\n () =>\n this.orderedGanttSegments().length * this.effectiveGanttSegmentWidthPx(),\n );\n\n // Flattens the mapped hierarchy into rows using current collapse state.\n readonly resolvedGanttItems = computed<TimelineResolvedItem[]>(() => {\n const segments = this.orderedGanttSegments();\n if (!segments.length) {\n return [];\n }\n\n const firstSeq = segments[0].seq;\n const lastSeq = segments[segments.length - 1].seq;\n const out: TimelineResolvedItem[] = [];\n\n this.flattenMapped(\n this.mappedGanttNodes(),\n 0,\n segments,\n firstSeq,\n lastSeq,\n this.collapsedGanttIds(),\n out,\n );\n\n return out;\n });\n\n ngAfterViewInit(): void {\n this.bindResizeObserver();\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n this.splitResizeObserver?.disconnect();\n this.detachResizeListeners();\n }\n\n onToggleCollapse(item: TimelineResolvedItem): void {\n this.toggleCollapse.emit(item);\n }\n\n // Bridges row-level click event to parent timeline component.\n onRowProgressClick(payload: TimelineRowProgressClickEvent): void {\n this.progressClick.emit(payload);\n }\n\n onSplitterPointerDown(event: PointerEvent): void {\n if (event.button !== 0 || !this.canResizeColumnsPane()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.isColumnsResizing.set(true);\n this.resizeStartClientX = event.clientX;\n this.resizeStartColumnsPaneWidthPx = this.resolvedColumnsPaneWidthPx();\n\n const target = event.currentTarget as HTMLElement | null;\n target?.setPointerCapture?.(event.pointerId);\n\n window.addEventListener('pointermove', this.onSplitterPointerMove, {\n passive: true,\n });\n window.addEventListener('pointerup', this.onSplitterPointerUp);\n window.addEventListener('pointercancel', this.onSplitterPointerUp);\n }\n\n onSplitterKeyDown(event: KeyboardEvent): void {\n if (!this.canResizeColumnsPane()) {\n return;\n }\n\n const currentWidth = this.resolvedColumnsPaneWidthPx();\n const direction = this.isRtl() ? -1 : 1;\n const stepPx = event.shiftKey ? 48 : 16;\n\n switch (event.key) {\n case 'ArrowLeft': {\n event.preventDefault();\n this.applyColumnsPaneWidth(currentWidth - direction * stepPx);\n return;\n }\n case 'ArrowRight': {\n event.preventDefault();\n this.applyColumnsPaneWidth(currentWidth + direction * stepPx);\n return;\n }\n case 'Home': {\n event.preventDefault();\n this.applyColumnsPaneWidth(0);\n return;\n }\n case 'End': {\n event.preventDefault();\n this.applyColumnsPaneWidth(this.columnsPaneMaxAllowedWidthPx());\n return;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n this.toggleColumnsPaneCollapsed();\n return;\n }\n default:\n return;\n }\n }\n\n onSplitterDoubleClick(): void {\n if (!this.canResizeColumnsPane()) {\n return;\n }\n\n this.toggleColumnsPaneCollapsed();\n }\n\n // Observes viewport size changes so timeline columns can adapt width.\n private bindResizeObserver(): void {\n const viewport = this.ganttScrollViewport?.nativeElement;\n if (!viewport) {\n this.resizeObserver?.disconnect();\n return;\n }\n\n this.ganttViewportWidth.set(viewport.clientWidth);\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.resizeObserver?.disconnect();\n this.resizeObserver = new ResizeObserver((entries) => {\n const width =\n entries[0]?.contentRect.width ??\n this.ganttScrollViewport?.nativeElement.clientWidth ??\n 0;\n\n this.ganttViewportWidth.set(width);\n });\n\n this.resizeObserver.observe(viewport);\n }\n\n private bindSplitResizeObserver(): void {\n const container = this.ganttSplitContainer?.nativeElement;\n if (!container) {\n this.splitResizeObserver?.disconnect();\n return;\n }\n\n this.ganttContainerWidth.set(container.clientWidth);\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.splitResizeObserver?.disconnect();\n this.splitResizeObserver = new ResizeObserver((entries) => {\n const width =\n entries[0]?.contentRect.width ??\n this.ganttSplitContainer?.nativeElement.clientWidth ??\n 0;\n\n this.ganttContainerWidth.set(width);\n });\n\n this.splitResizeObserver.observe(container);\n }\n\n private readonly onSplitterPointerMove = (event: PointerEvent): void => {\n if (!this.isColumnsResizing()) {\n return;\n }\n\n const deltaPx = this.isRtl()\n ? this.resizeStartClientX - event.clientX\n : event.clientX - this.resizeStartClientX;\n\n this.applyColumnsPaneWidth(this.resizeStartColumnsPaneWidthPx + deltaPx);\n };\n\n private readonly onSplitterPointerUp = (): void => {\n if (!this.isColumnsResizing()) {\n return;\n }\n\n this.isColumnsResizing.set(false);\n this.detachResizeListeners();\n };\n\n private detachResizeListeners(): void {\n window.removeEventListener('pointermove', this.onSplitterPointerMove);\n window.removeEventListener('pointerup', this.onSplitterPointerUp);\n window.removeEventListener('pointercancel', this.onSplitterPointerUp);\n }\n\n private applyColumnsPaneWidth(widthPx: number): void {\n const clampedWidthPx = this.clampColumnsPaneWidth(widthPx);\n this.columnsPaneUserWidthPx.set(clampedWidthPx);\n\n if (clampedWidthPx > 0) {\n this.lastExpandedColumnsPaneWidthPx.set(clampedWidthPx);\n }\n }\n\n private toggleColumnsPaneCollapsed(): void {\n const currentWidth = this.resolvedColumnsPaneWidthPx();\n if (currentWidth > 0) {\n this.lastExpandedColumnsPaneWidthPx.set(currentWidth);\n this.applyColumnsPaneWidth(0);\n return;\n }\n\n const restoreWidth =\n this.lastExpandedColumnsPaneWidthPx() ??\n this.preferredDefaultColumnsPaneWidthPx();\n this.applyColumnsPaneWidth(restoreWidth);\n }\n\n // Legacy fallback columns when consumer does not provide `columns`.\n private buildLegacyColumns(): TimelineColumnConfig[] {\n const columns: TimelineColumnConfig[] = [\n {\n key: 'title',\n header: this.ganttTitleColumnLabel(),\n widthPx: this.ganttInitiativeColumnWidthPx(),\n tree: true,\n },\n ];\n\n if (this.showGanttStatusColumn()) {\n columns.push({\n key: 'status',\n header: this.ganttStatusColumnLabel(),\n widthPx: this.ganttStatusColumnWidthPx(),\n position: 'center',\n });\n }\n\n return columns;\n }\n\n private flattenMapped(\n nodes: TimelineMappedNode[],\n levelDepth: number,\n segments: TimelineResolvedSegment[],\n firstSeq: number,\n lastSeq: number,\n collapsed: Set<string | number>,\n out: TimelineResolvedItem[],\n ): void {\n // Pre-order flatten preserves parent-child visual grouping.\n for (const node of nodes) {\n const startSegment =\n this.segmentByTime(node.startAt ?? node.endAt, segments) ?? segments[0];\n const endSegment =\n this.segmentByTime(node.endAt ?? node.startAt, segments) ??\n segments[segments.length - 1];\n\n const startLabel =\n startSegment.year !== undefined\n ? `${startSegment.title} ${startSegment.year}`\n : startSegment.title;\n const endLabel =\n endSegment.year !== undefined\n ? `${endSegment.title} ${endSegment.year}`\n : endSegment.title;\n\n const resolved = this.createResolvedItem(\n node,\n startSegment.seq,\n endSegment.seq,\n `${startLabel} - ${endLabel}`,\n levelDepth,\n collapsed,\n firstSeq,\n lastSeq,\n );\n\n out.push(resolved);\n\n if (node.children.length && !resolved.isCollapsed) {\n this.flattenMapped(\n node.children,\n levelDepth + 1,\n segments,\n firstSeq,\n lastSeq,\n collapsed,\n out,\n );\n }\n }\n }\n\n // Converts one mapped node into a fully resolved row model.\n private createResolvedItem(\n node: TimelineMappedNode,\n startSeqRaw: number,\n endSeqRaw: number,\n phaseFallback: string,\n levelDepth: number,\n collapsed: Set<string | number>,\n firstSeq: number,\n lastSeq: number,\n ): TimelineResolvedItem {\n const startSeq = Number.isFinite(startSeqRaw) ? startSeqRaw : firstSeq;\n const endSeq = Number.isFinite(endSeqRaw) ? endSeqRaw : lastSeq;\n const normalizedStartSeq = Math.max(firstSeq, Math.min(startSeq, endSeq));\n const normalizedEndSeq = Math.min(lastSeq, Math.max(startSeq, endSeq));\n\n const widthSegments = normalizedEndSeq - normalizedStartSeq + 1;\n const widthPx = Math.max(\n this.effectiveGanttSegmentWidthPx(),\n widthSegments * this.effectiveGanttSegmentWidthPx(),\n );\n\n const trackWidthPx = Math.max(0, widthPx - this.timelineLaneInsetPx * 2);\n const progressValue = this.clampProgress(node.progress.value);\n const statusColor = this.resolveBaseColor(\n node.color ?? node.progress.color ?? null,\n );\n\n return {\n id: node.id,\n source: node.source,\n title: node.title,\n startSeq: normalizedStartSeq,\n endSeq: normalizedEndSeq,\n progressValue,\n progressLabel: node.progress.label ?? `${Math.round(progressValue)}%`,\n statusKey: node.statusKey ?? undefined,\n statusName: node.statusName ?? node.statusKey ?? '-',\n statusColor,\n progressTrackColor: this.resolveTrackColor(statusColor),\n owner: node.owner ?? '-',\n phase: node.phase ?? phaseFallback,\n levelDescription: node.levelDescription ?? 'Level',\n levelColor: node.levelColor ?? '#94a3b8',\n levelDepth,\n hasChildren: node.children.length > 0,\n isCollapsed: collapsed.has(node.id),\n startOffsetPx:\n (normalizedStartSeq - firstSeq) * this.effectiveGanttSegmentWidthPx(),\n trackWidthPx,\n progressFillWidthPx: (trackWidthPx * progressValue) / 100,\n };\n }\n\n private segmentByTime(\n value: number | null,\n segments: TimelineResolvedSegment[],\n ): TimelineResolvedSegment | undefined {\n if (value === null) {\n return undefined;\n }\n\n return segments.find(\n (segment) => value >= segment.startAt && value <= segment.endAt,\n );\n }\n\n // Applies fallback theme color when item does not specify one.\n private resolveBaseColor(color?: string | null): string {\n return color ?? 'var(--p-primary-color)';\n }\n\n // Generates lighter track color from fill color for visual contrast.\n private resolveTrackColor(color: string): string {\n return `color-mix(in srgb, ${color} 22%, white)`;\n }\n\n private clampProgress(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.min(100, value));\n }\n\n private stretchColumnsToWidth(\n columns: TimelineResolvedColumn[],\n targetWidthPx: number,\n ): TimelineResolvedColumn[] {\n const totalBaseWidthPx = columns.reduce(\n (total, column) => total + column.baseWidthPx,\n 0,\n );\n\n if (!columns.length || totalBaseWidthPx <= 0) {\n return columns;\n }\n\n const normalizedTargetWidthPx = Math.max(\n totalBaseWidthPx,\n Math.floor(targetWidthPx),\n );\n\n let assignedWidthPx = 0;\n let assignedBaseWidthPx = 0;\n\n return columns.map((column, index) => {\n if (index === columns.length - 1) {\n return {\n ...column,\n widthPx: Math.max(\n column.baseWidthPx,\n normalizedTargetWidthPx - assignedWidthPx,\n ),\n };\n }\n\n const remainingTargetWidthPx = normalizedTargetWidthPx - assignedWidthPx;\n const remainingBaseWidthPx = totalBaseWidthPx - assignedBaseWidthPx;\n const widthPx = Math.max(\n column.baseWidthPx,\n Math.floor(\n (remainingTargetWidthPx * column.baseWidthPx) / remainingBaseWidthPx,\n ),\n );\n\n assignedWidthPx += widthPx;\n assignedBaseWidthPx += column.baseWidthPx;\n\n return {\n ...column,\n widthPx,\n };\n });\n }\n\n private columnsPaneMaxAllowedWidthPx(): number {\n const containerWidth = this.ganttContainerWidth();\n if (containerWidth <= 0) {\n return Number.POSITIVE_INFINITY;\n }\n\n const maxByContainer = Math.max(0, containerWidth - this.splitterWidthPx);\n const configuredMax = this.columnsPaneMaxWidthPx();\n if (configuredMax === null || configuredMax === undefined) {\n return maxByContainer;\n }\n\n return Math.max(0, Math.min(maxByContainer, configuredMax));\n }\n\n private clampColumnsPaneWidth(widthPx: number): number {\n if (!Number.isFinite(widthPx)) {\n return 0;\n }\n\n const maxWidth = this.columnsPaneMaxAllowedWidthPx();\n const minWidth = Math.max(0, this.columnsPaneMinWidthPx());\n const effectiveMin = Math.min(minWidth, maxWidth);\n\n return Math.max(effectiveMin, Math.min(widthPx, maxWidth));\n }\n\n private isRtl(): boolean {\n if (typeof document === 'undefined') {\n return false;\n }\n\n const dir =\n document.documentElement.getAttribute('dir') ??\n document.body?.getAttribute('dir') ??\n 'ltr';\n\n return dir.toLowerCase() === 'rtl';\n }\n}\n","<!-- Gantt view shell: scroll viewport + sized timeline table. -->\n<div class=\"min-h-56 min-w-0 overflow-hidden py-2\">\n <div\n class=\"flex min-w-0 border border-surface bg-content\"\n #ganttSplitContainer\n >\n <!-- Fixed metadata columns pane. -->\n <div\n class=\"shrink-0 overflow-hidden\"\n [style.width.px]=\"resolvedColumnsPaneWidthPx()\"\n >\n <div class=\"mt-timeline-scroll h-full overflow-x-auto overflow-y-hidden\">\n <div class=\"min-w-full\" [style.width.px]=\"columnsContentWidthPx()\">\n <mt-timeline-gantt-header\n [timelineMode]=\"timelineMode()\"\n [resolvedColumns]=\"resolvedColumns()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [ganttCanvasWidth]=\"0\"\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\n [renderTimeline]=\"false\"\n />\n\n <div>\n @for (item of resolvedGanttItems(); track $index) {\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"resolvedColumns()\"\n [ganttCanvasWidth]=\"0\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderTimeline]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n\n @if (canResizeColumnsPane()) {\n <button\n type=\"button\"\n class=\"mt-timeline-splitter shrink-0\"\n [class.mt-timeline-splitter-active]=\"isColumnsResizing()\"\n (pointerdown)=\"onSplitterPointerDown($event)\"\n (dblclick)=\"onSplitterDoubleClick()\"\n (keydown)=\"onSplitterKeyDown($event)\"\n aria-label=\"Resize columns pane\"\n title=\"Drag to resize. Double-click to collapse/restore.\"\n ></button>\n }\n\n <!-- Scrollable timeline pane (horizontal scroll is limited to this area). -->\n <div\n class=\"mt-timeline-scroll min-w-0 flex-1 overflow-x-auto overflow-y-hidden\"\n #ganttScrollViewport\n >\n <div class=\"min-w-full\" [style.width.px]=\"ganttCanvasWidth()\">\n <mt-timeline-gantt-header\n [timelineMode]=\"timelineMode()\"\n [resolvedColumns]=\"resolvedColumns()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [effectiveGanttSegmentWidthPx]=\"effectiveGanttSegmentWidthPx()\"\n [renderColumns]=\"false\"\n />\n\n <div>\n @for (item of resolvedGanttItems(); track $index) {\n <mt-timeline-gantt-row\n [item]=\"item\"\n [resolvedColumns]=\"[]\"\n [ganttCanvasWidth]=\"ganttCanvasWidth()\"\n [laneInsetPx]=\"laneInsetPx\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplateDirective()\"\n [renderColumns]=\"false\"\n (toggleCollapse)=\"onToggleCollapse($event)\"\n (progressClick)=\"onRowProgressClick($event)\"\n />\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, input, output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { TimelineScaleMode, TimelineScaleOption } from '../../timeline.models';\r\n\r\n/**\r\n * Shared timeline header.\r\n *\r\n * Responsibilities:\r\n * - Render title + mode picker UI.\r\n * - Emit the selected scale mode to parent orchestration.\r\n *\r\n * Notes for maintainers:\r\n * - Keep this component presentation-focused. Business logic should remain in\r\n * the parent timeline container.\r\n */\r\n@Component({\r\n selector: 'mt-timeline-header',\r\n standalone: true,\r\n imports: [FormsModule, SelectField, Icon],\r\n templateUrl: './timeline-header.html',\r\n})\r\nexport class TimelineHeader {\r\n readonly title = input<string>('Timeline');\r\n readonly timelineMode = input<TimelineScaleMode>('quarterly');\r\n readonly timelineModeOptions = input<TimelineScaleOption[]>([]);\r\n\r\n readonly timelineModeChange = output<TimelineScaleMode>();\r\n\r\n // Re-emits selector changes so parent owns state updates.\r\n onTimelineModeChange(mode: TimelineScaleMode): void {\r\n this.timelineModeChange.emit(mode);\r\n }\r\n}\r\n","<!-- Timeline title + scale mode selector. -->\r\n<div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <div class=\"flex items-center gap-2\">\r\n <mt-icon icon=\"custom.timeline-point\" class=\"text-base\"></mt-icon>\r\n <h3 class=\"text-base font-semibold\">{{ title() }}</h3>\r\n </div>\r\n\r\n <!-- Scale mode switcher (monthly/quarterly/etc.). -->\r\n <div class=\"flex flex-wrap items-center justify-end gap-2\">\r\n <div class=\"w-44\">\r\n <mt-select-field\r\n [field]=\"false\"\r\n [options]=\"timelineModeOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [showClear]=\"false\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n placeholder=\"Timeline mode\"\r\n [ngModel]=\"timelineMode()\"\r\n (onChange)=\"onTimelineModeChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n contentChildren,\n ElementRef,\n input,\n model,\n output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { Popover } from 'primeng/popover';\nimport {\n TimelineAccessor,\n TimelineColumnConfig,\n TimelineGanttMapping,\n TimelineProgressAccessorValue,\n TimelineProgressValue,\n TimelineScaleMode,\n TimelineScaleOption,\n} from '../../timeline.models';\nimport {\n TimelineMappedNode,\n TimelineResolvedItem,\n TimelineResolvedSegment,\n} from '../../timeline.interfaces';\nimport { TimelineGanttTemplateDirective } from '../../timeline-gantt-template.directive';\nimport { TimelineColumnTemplateDirective } from '../../timeline-column-template.directive';\nimport {\n TimelinePopoverTemplateContext,\n TimelinePopoverTemplateDirective,\n} from '../../timeline-popover-template.directive';\nimport { TimelineProgressTemplateDirective } from '../../timeline-progress-template.directive';\nimport { TimelineDefaultPopover } from '../timeline-default-popover/timeline-default-popover';\nimport { TimelineGantt } from '../timeline-gantt/timeline-gantt';\nimport { TimelineHeader } from '../timeline-header/timeline-header';\n\n// Default scale options shown in the timeline mode dropdown.\nconst DEFAULT_TIMELINE_MODES: TimelineScaleOption[] = [\n { label: 'Monthly', value: 'monthly' },\n { label: 'Quarterly', value: 'quarterly' },\n { label: 'Semi Annual', value: 'biannually' },\n { label: 'Annually', value: 'annually' },\n];\n\n/**\n * Dynamic Gantt timeline component.\n *\n * Data flow:\n * 1) Raw input nodes are mapped via `ganttMapping` to `TimelineMappedNode`.\n * 2) Timeline range is derived from min start/max end across the mapped tree.\n * 3) Time segments are generated from range + selected scale.\n * 4) Tree nodes are flattened into render-ready rows with pixel geometry.\n *\n * Column system:\n * - `columns = null` uses legacy defaults (title + optional status).\n * - `columns = []` renders progress-only mode with no leading columns.\n * - `columns = [...]` renders provided columns and supports per-column templates.\n */\n@Component({\n selector: 'mt-timeline',\n standalone: true,\n imports: [\n CommonModule,\n TimelineHeader,\n TimelineGantt,\n TimelineDefaultPopover,\n Popover,\n NgTemplateOutlet,\n ],\n templateUrl: './timeline.html',\n styleUrl: './timeline.scss',\n host: { class: 'block' },\n})\nexport default class Timeline {\n // PrimeNG popover instance controlling row details overlay.\n @ViewChild('detailsPopover') detailsPopover?: Popover;\n // Invisible anchor used to position popover at exact mouse click coordinates.\n @ViewChild('detailsPopoverClickAnchor')\n detailsPopoverClickAnchor?: ElementRef<HTMLElement>;\n\n readonly title = input<string>('Timeline');\n readonly emptyMessage = input<string>('No data to display');\n readonly isLoading = input<boolean>(false);\n readonly showHeader = input<boolean>(true);\n\n readonly timelineMode = model<TimelineScaleMode>('quarterly');\n readonly timelineModeOptions = input<TimelineScaleOption[]>([\n ...DEFAULT_TIMELINE_MODES,\n ]);\n\n readonly ganttData = input<unknown[]>([]);\n readonly ganttMapping = input<TimelineGanttMapping | null>(null);\n\n // Null means \"legacy defaults\". Empty array means \"progress-only\" mode.\n readonly columns = input<\n TimelineColumnConfig<unknown, TimelineResolvedItem>[] | null\n >(null);\n\n readonly ganttSegmentWidthPx = input<number>(96);\n readonly defaultVisibleColumns = input<number | null>(4);\n readonly columnsPaneMinWidthPx = input<number>(0);\n readonly columnsPaneMaxWidthPx = input<number | null>(null);\n\n // Backward-compatible defaults when `columns` is null.\n readonly ganttTitleColumnLabel = input<string>('Portfolio Name');\n readonly ganttStatusColumnLabel = input<string>('Status');\n readonly ganttInitiativeColumnWidthPx = input<number>(288);\n readonly ganttStatusColumnWidthPx = input<number>(160);\n readonly showGanttStatusColumn = input<boolean>(false);\n\n readonly showGanttDetailsPopup = input<boolean>(true);\n\n // Public events exposed to consumers.\n readonly timelineModeChangeEvent = output<TimelineScaleMode>();\n readonly ganttItemClick = output<unknown>();\n\n // Optional full-template override for the Gantt body.\n readonly ganttTemplate = contentChild(TimelineGanttTemplateDirective);\n\n // Optional cell template override for a specific column key.\n readonly columnTemplates = contentChildren(\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>,\n );\n\n // Optional popup content override (clicked progress item details).\n readonly popoverTemplate = contentChild(\n TimelinePopoverTemplateDirective<unknown, TimelineResolvedItem>,\n );\n\n // Optional progress bar renderer override.\n readonly progressTemplate = contentChild(\n TimelineProgressTemplateDirective<unknown, TimelineResolvedItem>,\n );\n\n readonly collapsedGanttIds = signal<Set<string | number>>(new Set());\n readonly selectedGanttItem = signal<TimelineResolvedItem | null>(null);\n\n // Maps `mtTimelineColumn` templates by key for fast lookup in row rendering.\n readonly columnTemplatesByKey = computed(() => {\n const map = new Map<\n string,\n TimelineColumnTemplateDirective<unknown, TimelineResolvedItem>\n >();\n\n for (const template of this.columnTemplates()) {\n if (template.key) {\n map.set(template.key, template);\n }\n }\n\n return map;\n });\n\n readonly mappedGanttNodes = computed<TimelineMappedNode[]>(() => {\n const mapping = this.ganttMapping();\n const data = this.ganttData();\n\n if (!mapping || !data.length) {\n return [];\n }\n\n const state = { nextId: 1 };\n return data\n .map((item) => this.mapNode(item, mapping, state))\n .filter((item): item is TimelineMappedNode => item !== null);\n });\n\n // Builds time columns from the mapped data date range and selected mode.\n readonly orderedGanttSegments = computed<TimelineResolvedSegment[]>(() => {\n const nodes = this.mappedGanttNodes();\n if (!nodes.length) {\n return [];\n }\n\n const range = this.resolveDateRange(nodes);\n if (!range) {\n return [];\n }\n\n return this.buildSegments(range.startAt, range.endAt, this.timelineMode());\n });\n // Timeline mode is controlled by parent model signal to keep it externally bindable.\n onTimelineModeChange(mode: TimelineScaleMode): void {\n if (!mode || this.timelineMode() === mode) {\n return;\n }\n\n this.timelineMode.set(mode);\n this.timelineModeChangeEvent.emit(mode);\n }\n\n // Handles row progress clicks: emits public event and opens details popover.\n onGanttProgressClick(item: TimelineResolvedItem, event: MouseEvent): void {\n event.stopPropagation();\n this.ganttItemClick.emit(item.source ?? item);\n\n if (!this.showGanttDetailsPopup()) {\n return;\n }\n\n this.selectedGanttItem.set(item);\n\n const popover = this.detailsPopover;\n if (!popover) {\n return;\n }\n\n const clickTarget = this.positionPopoverClickAnchor(event);\n\n // If popover is already open, reopen it at the new anchor event.\n if (popover.overlayVisible) {\n popover.hide();\n setTimeout(() => popover.show(event, clickTarget), 0);\n return;\n }\n\n popover.show(event, clickTarget);\n }\n\n onDetailsPopoverHide(): void {\n this.selectedGanttItem.set(null);\n }\n\n // Closes popover and clears selected row context.\n hideDetailsPopover(): void {\n this.detailsPopover?.hide();\n this.selectedGanttItem.set(null);\n }\n\n // Maintains collapse state for hierarchical rows.\n toggleGanttCollapse(item: TimelineResolvedItem): void {\n if (!item.hasChildren) {\n return;\n }\n\n this.collapsedGanttIds.update((current) => {\n const next = new Set(current);\n\n if (next.has(item.id)) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n\n return next;\n });\n }\n\n getPopoverTemplateContext(\n item: TimelineResolvedItem,\n ): TimelinePopoverTemplateContext<unknown, TimelineResolvedItem> {\n const source = item.source ?? item;\n return {\n $implicit: source,\n item: source,\n resolved: item,\n close: () => this.hideDetailsPopover(),\n };\n }\n\n // Recursively maps consumer item shape using accessors from `ganttMapping`.\n private mapNode(\n source: unknown,\n mapping: TimelineGanttMapping,\n state: { nextId: number },\n ): TimelineMappedNode | null {\n const title = this.resolveString(source, mapping.title) ?? 'Untitled';\n\n const idRaw = this.resolveAccessor(source, mapping.id);\n const id =\n idRaw !== null && idRaw !== undefined && String(idRaw).length\n ? (idRaw as string | number)\n : `item-${state.nextId++}`;\n\n const progress = this.normalizeProgress(\n this.resolveAccessor(source, mapping.progress),\n );\n\n const childrenValue =\n this.resolveAccessor(source, mapping.children) ??\n this.path(source, 'children');\n\n const children = (Array.isArray(childrenValue) ? childrenValue : [])\n .map((child) => this.mapNode(child, mapping, state))\n .filter((item): item is TimelineMappedNode => item !== null);\n\n return {\n source,\n id,\n title,\n startAt: this.toTime(this.resolveAccessor(source, mapping.dateFrom)),\n endAt: this.toTime(this.resolveAccessor(source, mapping.dateTo)),\n progress,\n color: this.resolveColor(source, mapping.color),\n statusKey: this.resolveString(source, mapping.statusKey),\n statusName: this.resolveString(source, mapping.statusName),\n owner: this.resolveString(source, mapping.owner),\n phase: this.resolveString(source, mapping.phase),\n levelDescription: this.resolveString(source, mapping.levelDescription),\n levelColor: this.resolveString(source, mapping.levelColor),\n children,\n };\n }\n\n // Finds min/max timestamps in the mapped tree to define timeline bounds.\n private resolveDateRange(\n nodes: TimelineMappedNode[],\n ): { startAt: number; endAt: number } | null {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n const visit = (items: TimelineMappedNode[]) => {\n for (const item of items) {\n if (item.startAt !== null) {\n min = Math.min(min, item.startAt);\n max = Math.max(max, item.startAt);\n }\n\n if (item.endAt !== null) {\n min = Math.min(min, item.endAt);\n max = Math.max(max, item.endAt);\n }\n\n if (item.children.length) {\n visit(item.children);\n }\n }\n };\n\n visit(nodes);\n\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return null;\n }\n\n return { startAt: min, endAt: max };\n }\n\n // Dispatcher for segment generation by selected scale mode.\n private buildSegments(\n startAt: number,\n endAt: number,\n mode: TimelineScaleMode,\n ): TimelineResolvedSegment[] {\n switch (mode) {\n case 'monthly':\n return this.genSegments(\n startAt,\n endAt,\n 1,\n (month) => `M ${month + 1}`,\n 'M',\n );\n case 'quarterly':\n return this.genSegments(\n startAt,\n endAt,\n 3,\n (month) => `Q ${Math.floor(month / 3) + 1}`,\n 'Q',\n );\n case 'biannually':\n return this.genSegments(\n startAt,\n endAt,\n 6,\n (month) => `H ${month < 6 ? 1 : 2}`,\n 'H',\n );\n case 'annually':\n return this.genSegments(startAt, endAt, 12, () => 'Y', 'Y');\n default:\n return this.genSegments(\n startAt,\n endAt,\n 3,\n (month) => `Q ${Math.floor(month / 3) + 1}`,\n 'Q',\n );\n }\n }\n\n // Generates contiguous segments between range boundaries.\n private genSegments(\n startAt: number,\n endAt: number,\n stepMonths: number,\n title: (monthIndex: number) => string,\n prefix: string,\n ): TimelineResolvedSegment[] {\n const segments: TimelineResolvedSegment[] = [];\n const start = new Date(startAt);\n const end = new Date(endAt);\n\n let year = start.getUTCFullYear();\n let month = start.getUTCMonth();\n let seq = 0;\n\n if (stepMonths > 1) {\n month = Math.floor(month / stepMonths) * stepMonths;\n }\n\n while (\n year < end.getUTCFullYear() ||\n (year === end.getUTCFullYear() && month <= end.getUTCMonth())\n ) {\n segments.push({\n id: `${prefix}${month + 1}_${year}`,\n title: title(month),\n seq,\n year,\n startAt: Date.UTC(year, month, 1),\n endAt: Date.UTC(year, month + stepMonths, 0, 23, 59, 59, 999),\n });\n\n seq += 1;\n month += stepMonths;\n\n if (month > 11) {\n year += Math.floor(month / 12);\n month %= 12;\n }\n }\n\n return segments;\n }\n\n // Supports both dot-path accessors and function accessors.\n private resolveAccessor<TValue>(\n item: unknown,\n accessor: TimelineAccessor<unknown, TValue> | undefined,\n ): TValue | undefined {\n if (!accessor) {\n return undefined;\n }\n\n if (typeof accessor === 'function') {\n return accessor(item);\n }\n\n return this.path(item, accessor) as TValue | undefined;\n }\n\n private resolveString(\n item: unknown,\n accessor: TimelineAccessor<unknown, string | null | undefined> | undefined,\n ): string | null {\n const value = this.resolveAccessor(item, accessor);\n\n if (value === null || value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n // Robust color resolution for string/object return shapes.\n private resolveColor(\n item: unknown,\n accessor: TimelineAccessor<unknown, string | null | undefined> | undefined,\n ): string | null {\n const value = this.resolveAccessor(item, accessor);\n\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (typeof value === 'object') {\n const color = (value as Record<string, unknown>)['color'];\n if (typeof color === 'string') {\n return color;\n }\n\n const detailsColor = this.path(value, 'details.color');\n if (typeof detailsColor === 'string') {\n return detailsColor;\n }\n }\n\n return String(value);\n }\n\n // Safe deep property accessor (supports bracket and dot notation).\n private path(item: unknown, value: string): unknown {\n if (!value) {\n return undefined;\n }\n\n return value\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean)\n .reduce<unknown>((current, key) => {\n if (\n current === null ||\n current === undefined ||\n typeof current !== 'object'\n ) {\n return undefined;\n }\n\n return (current as Record<string, unknown>)[key];\n }, item);\n }\n\n // Normalizes all supported progress input shapes into a single object model.\n private normalizeProgress(\n value: TimelineProgressAccessorValue,\n ): TimelineProgressValue {\n if (value === null || value === undefined) {\n return { value: 0, label: '0%' };\n }\n\n if (typeof value === 'number') {\n const safeValue = this.clampProgress(value);\n return { value: safeValue, label: `${Math.round(safeValue)}%` };\n }\n\n if (typeof value === 'string') {\n const safeValue = this.clampProgress(\n Number(value.replace(/[^\\d.-]/g, '')),\n );\n return {\n value: safeValue,\n label: value.trim().length ? value : `${Math.round(safeValue)}%`,\n };\n }\n\n const safeValue = this.clampProgress(value.value);\n return {\n value: safeValue,\n label: value.label ?? `${Math.round(safeValue)}%`,\n color: value.color,\n };\n }\n\n // Accepts date values as Date, timestamp, ISO string, or `{ actualValue }`.\n private toTime(value: unknown): number | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (value instanceof Date) {\n return Number.isFinite(value.getTime()) ? value.getTime() : null;\n }\n\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n\n if (typeof value === 'string') {\n const time = new Date(value).getTime();\n return Number.isFinite(time) ? time : null;\n }\n\n if (typeof value === 'object') {\n const actualValue = (value as Record<string, unknown>)['actualValue'];\n if (actualValue !== undefined) {\n return this.toTime(actualValue);\n }\n }\n\n return null;\n }\n\n private clampProgress(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.min(100, value));\n }\n\n private positionPopoverClickAnchor(\n event: MouseEvent,\n ): HTMLElement | undefined {\n const anchor = this.detailsPopoverClickAnchor?.nativeElement;\n if (!anchor) {\n return undefined;\n }\n\n anchor.style.left = `${event.clientX}px`;\n anchor.style.top = `${event.clientY}px`;\n return anchor;\n }\n}\n","<div class=\"mt-3 block overflow-hidden\">\n <!-- Optional top header (title + timeline mode selector). -->\n @if (showHeader()) {\n <mt-timeline-header\n [title]=\"title()\"\n [timelineMode]=\"timelineMode()\"\n [timelineModeOptions]=\"timelineModeOptions()\"\n (timelineModeChange)=\"onTimelineModeChange($event)\"\n />\n }\n\n <!-- Loading state. -->\n @if (isLoading()) {\n <div class=\"flex min-h-56 items-center justify-center p-8\">\n <div\n class=\"h-8 w-8 animate-spin rounded-full border-2 border-surface-200\"\n style=\"border-top-color: var(--p-primary-color)\"\n ></div>\n </div>\n } @else if (ganttTemplate(); as template) {\n <!-- Full custom gantt-body override. -->\n <div class=\"min-h-56 py-4\">\n <ng-container [ngTemplateOutlet]=\"template.templateRef\"></ng-container>\n </div>\n } @else if (\n mappedGanttNodes().length > 0 && orderedGanttSegments().length > 0\n ) {\n <!-- Built-in gantt renderer. -->\n <mt-timeline-gantt\n [timelineMode]=\"timelineMode()\"\n [columns]=\"columns()\"\n [ganttTitleColumnLabel]=\"ganttTitleColumnLabel()\"\n [ganttStatusColumnLabel]=\"ganttStatusColumnLabel()\"\n [ganttInitiativeColumnWidthPx]=\"ganttInitiativeColumnWidthPx()\"\n [ganttStatusColumnWidthPx]=\"ganttStatusColumnWidthPx()\"\n [showGanttStatusColumn]=\"showGanttStatusColumn()\"\n [ganttSegmentWidthPx]=\"ganttSegmentWidthPx()\"\n [defaultVisibleColumns]=\"defaultVisibleColumns()\"\n [columnsPaneMinWidthPx]=\"columnsPaneMinWidthPx()\"\n [columnsPaneMaxWidthPx]=\"columnsPaneMaxWidthPx()\"\n [mappedGanttNodes]=\"mappedGanttNodes()\"\n [orderedGanttSegments]=\"orderedGanttSegments()\"\n [collapsedGanttIds]=\"collapsedGanttIds()\"\n [columnTemplatesByKey]=\"columnTemplatesByKey()\"\n [progressTemplateDirective]=\"progressTemplate()\"\n (toggleCollapse)=\"toggleGanttCollapse($event)\"\n (progressClick)=\"onGanttProgressClick($event.item, $event.event)\"\n />\n } @else {\n <!-- Empty state. -->\n <div\n class=\"flex min-h-56 items-center justify-center p-8 text-sm text-surface-500\"\n >\n {{ emptyMessage() }}\n </div>\n }\n\n <!-- Details popover host (custom template or built-in fallback). -->\n <p-popover #detailsPopover appendTo=\"body\" (onHide)=\"onDetailsPopoverHide()\">\n @if (showGanttDetailsPopup() && selectedGanttItem(); as item) {\n @if (popoverTemplate(); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template.templateRef\"\n [ngTemplateOutletContext]=\"getPopoverTemplateContext(item)\"\n ></ng-container>\n } @else {\n <mt-timeline-default-popover\n [item]=\"item\"\n (requestClose)=\"hideDetailsPopover()\"\n />\n }\n }\n </p-popover>\n\n <!-- Point anchor used to place the popover exactly where user clicked. -->\n <span\n #detailsPopoverClickAnchor\n class=\"pointer-events-none fixed h-0 w-0\"\n [style.left.px]=\"-9999\"\n [style.top.px]=\"-9999\"\n aria-hidden=\"true\"\n ></span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":";;;;;;;;;;MAMa,8BAA8B,CAAA;AAChC,IAAA,WAAW,GAAG,MAAM,CAAuB,WAAW,CAAC;uGADrD,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCgBY,+BAA+B,CAAA;IAIf,GAAG,GAAG,EAAE;AAE1B,IAAA,WAAW,GAClB,MAAM,CACJ,WAAW,CACZ;uGATQ,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,CAAA,kBAAA,EAAA,KAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAJ3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,+BAA+B;AACzC,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAKE,KAAK;uBAAC,kBAAkB;;;MCTd,gCAAgC,CAAA;AAIlC,IAAA,WAAW,GAClB,MAAM,CACJ,WAAW,CACZ;uGAPQ,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhC,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhC,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAJ5C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gCAAgC;AAC1C,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCSY,iCAAiC,CAAA;AAInC,IAAA,WAAW,GAClB,MAAM,CACJ,WAAW,CACZ;uGAPQ,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAjC,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAJ7C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iCAAiC;AAC3C,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACpBD;;;;;;AAMG;MAMU,sBAAsB,CAAA;;AAExB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAwB;;IAG7C,YAAY,GAAG,MAAM,EAAQ;uGAL3B,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,kQCfnC,wnCA+BA,EAAA,CAAA;;2FDhBa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,cAC3B,IAAI,EAAA,QAAA,EAAA,wnCAAA,EAAA;;;AEJlB;;;;;;AAMG;MAQU,mBAAmB,CAAA;AACb,IAAA,WAAW,GAAG;QAC7B,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;KACN;AAEQ,IAAA,YAAY,GAAG,KAAK,CAAoB,WAAW,wDAAC;AACpD,IAAA,eAAe,GAAG,KAAK,CAA2B,EAAE,2DAAC;AACrD,IAAA,oBAAoB,GAAG,KAAK,CAA4B,EAAE,gEAAC;AAC3D,IAAA,gBAAgB,GAAG,KAAK,CAAS,CAAC,4DAAC;AACnC,IAAA,4BAA4B,GAAG,KAAK,CAAS,EAAE,wEAAC;AAChD,IAAA,aAAa,GAAG,KAAK,CAAU,IAAI,yDAAC;AACpC,IAAA,cAAc,GAAG,KAAK,CAAU,IAAI,0DAAC;;AAG9C,IAAA,mBAAmB,CAAC,OAAgC,EAAA;AAClD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,SAAS,EAAE;YACrC,OAAO,OAAO,CAAC,KAAK;QACtB;AAEA,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9D,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI;cACpD,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC;AAC5B,cAAE,OAAO,CAAC,KAAK;IACnB;AAEA,IAAA,uBAAuB,CACrB,MAA8B,EAAA;QAE9B,OAAO;AACL,YAAA,YAAY,EAAE,MAAM,CAAC,QAAQ,KAAK,OAAO;AACzC,YAAA,aAAa,EAAE,MAAM,CAAC,QAAQ,KAAK,QAAQ;AAC3C,YAAA,UAAU,EAAE,MAAM,CAAC,QAAQ,KAAK,KAAK;SACtC;IACH;uGA5CW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBhC,+yCAmCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,IAAA,EAEjB,EAAE,KAAK,EAAE,eAAe,EAAE,EAAA,QAAA,EAAA,+yCAAA,EAAA;;;AEIlC;;;;;;;;;;AAUG;MAQU,gBAAgB,CAAA;AAClB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAwB;AAC7C,IAAA,eAAe,GAAG,KAAK,CAA2B,EAAE,2DAAC;AACrD,IAAA,gBAAgB,GAAG,KAAK,CAAS,CAAC,4DAAC;AACnC,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,aAAa,GAAG,KAAK,CAAU,IAAI,yDAAC;AACpC,IAAA,cAAc,GAAG,KAAK,CAAU,IAAI,0DAAC;AAErC,IAAA,oBAAoB,GAAG,KAAK,CAKnC,IAAI,GAAG,EAAE,gEAAC;AAEH,IAAA,yBAAyB,GAAG,KAAK,CAGhC,IAAI,qEAAC;IAEN,cAAc,GAAG,MAAM,EAAwB;IAC/C,aAAa,GAAG,MAAM,EAAiC;;AAGhE,IAAA,gBAAgB,CAAC,IAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC;;IAGA,eAAe,CAAC,IAA0B,EAAE,KAAiB,EAAA;QAC3D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1C;AAEA,IAAA,YAAY,CAAC,IAA0B,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,YAAA,OAAO,oBAAoB;QAC7B;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,oBAAoB,GAAG,qBAAqB;IACpE;AAEA,IAAA,qBAAqB,CACnB,MAA8B,EAAA;AAI9B,QAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,IAAI,IAAI;IACzE;IAEA,iBAAiB,CACf,MAA8B,EAC9B,IAA0B,EAAA;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;AACnD,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,YAAA,IAAI,MAAM,CAAC,YAAY,EAAE;gBACvB,OAAO,IAAI,CAAC,KAAK;YACnB;AACA,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;IAEA,kBAAkB,CAChB,MAA8B,EAC9B,IAA0B,EAAA;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI;AAElC,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE;AACtC,gBAAA,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACvD;YAEA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACxC;AAEA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,OAAO,IAAI,CAAC,KAAK;QACnB;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;QACjD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE;AACrD,YAAA,OAAO,WAAW;QACpB;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;IACpC;AAEA,IAAA,uBAAuB,CACrB,MAA8B,EAAA;QAE9B,OAAO;AACL,YAAA,eAAe,EAAE,MAAM,CAAC,QAAQ,KAAK,OAAO;AAC5C,YAAA,gBAAgB,EAAE,MAAM,CAAC,QAAQ,KAAK,QAAQ;AAC9C,YAAA,aAAa,EAAE,MAAM,CAAC,QAAQ,KAAK,KAAK;SACzC;IACH;IAEA,wBAAwB,CACtB,MAA8B,EAC9B,IAA0B,EAAA;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI;QAElC,OAAO;AACL,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,IAAI;YACd,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,WAAW;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;SAC1C;IACH;AAEA,IAAA,0BAA0B,CACxB,IAA0B,EAAA;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI;QAClC,OAAO;AACL,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE;YACtD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,mBAAmB;YACrC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,UAAU,EAAE,IAAI,CAAC,kBAAkB;AACnC,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,QAAQ,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;SACvD;IACH;;IAGU,KAAK,GAAA;AACb,QAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACnC,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,GAAG,GACP,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;AAC5C,YAAA,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC;AAClC,YAAA,KAAK;AAEP,QAAA,OAAO,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK;IACpC;;IAGQ,IAAI,CAAC,IAAa,EAAE,KAAa,EAAA;QACvC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,YAAY,EAAE,KAAK;aAC3B,KAAK,CAAC,GAAG;aACT,MAAM,CAAC,OAAO;AACd,aAAA,MAAM,CAAU,CAAC,OAAO,EAAE,GAAG,KAAI;YAChC,IACE,OAAO,KAAK,IAAI;AAChB,gBAAA,OAAO,KAAK,SAAS;AACrB,gBAAA,OAAO,OAAO,KAAK,QAAQ,EAC3B;AACA,gBAAA,OAAO,SAAS;YAClB;AAEA,YAAA,OAAQ,OAAmC,CAAC,GAAG,CAAC;QAClD,CAAC,EAAE,IAAI,CAAC;IACZ;uGA7KW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1C7B,+qHAiGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3DY,YAAY,oSAAE,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIjB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAA,IAAA,EAEzC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAA,QAAA,EAAA,+qHAAA,EAAA;;;AEJlC;;;;;;;;;;;;AAYG;MAQU,aAAa,CAAA;IACxB,IACI,sBAAsB,CAAC,KAA0C,EAAA;AACnE,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAChC,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAEA,IACI,sBAAsB,CAAC,KAA0C,EAAA;AACnE,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAChC,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEQ,IAAA,mBAAmB;AACnB,IAAA,mBAAmB;AACnB,IAAA,cAAc;AACd,IAAA,mBAAmB;;AAGV,IAAA,kBAAkB,GAAG,MAAM,CAAC,CAAC,8DAAC;AAC9B,IAAA,mBAAmB,GAAG,MAAM,CAAC,CAAC,+DAAC;IAE/B,eAAe,GAAG,EAAE;IACpB,mBAAmB,GAAG,EAAE;IACxB,yBAAyB,GAAG,GAAG;AACvC,IAAA,WAAW,GAAG,IAAI,CAAC,mBAAmB;AAC9B,IAAA,sBAAsB,GAAG,MAAM,CAAgB,IAAI,kEAAC;AACpD,IAAA,8BAA8B,GAAG,MAAM,CAAgB,IAAI,0EAAC;AACpE,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,6DAAC;AACjC,IAAA,oBAAoB,GAAG,QAAQ,CACtC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,GAAG,CAAC,gEAC5C;IAEO,kBAAkB,GAAG,CAAC;IACtB,6BAA6B,GAAG,CAAC;AAEhC,IAAA,YAAY,GAAG,KAAK,CAAoB,WAAW,wDAAC;AAEpD,IAAA,OAAO,GAAG,KAAK,CAEtB,IAAI,mDAAC;AACE,IAAA,qBAAqB,GAAG,KAAK,CAAS,gBAAgB,iEAAC;AACvD,IAAA,sBAAsB,GAAG,KAAK,CAAS,QAAQ,kEAAC;AAChD,IAAA,4BAA4B,GAAG,KAAK,CAAS,GAAG,wEAAC;AACjD,IAAA,wBAAwB,GAAG,KAAK,CAAS,GAAG,oEAAC;AAC7C,IAAA,qBAAqB,GAAG,KAAK,CAAU,KAAK,iEAAC;AAC7C,IAAA,mBAAmB,GAAG,KAAK,CAAS,EAAE,+DAAC;AACvC,IAAA,qBAAqB,GAAG,KAAK,CAAgB,CAAC,iEAAC;AAC/C,IAAA,qBAAqB,GAAG,KAAK,CAAS,CAAC,iEAAC;AACxC,IAAA,qBAAqB,GAAG,KAAK,CAAgB,IAAI,iEAAC;AAElD,IAAA,gBAAgB,GAAG,KAAK,CAAuB,EAAE,4DAAC;AAClD,IAAA,oBAAoB,GAAG,KAAK,CAA4B,EAAE,gEAAC;AAC3D,IAAA,iBAAiB,GAAG,KAAK,CAAuB,IAAI,GAAG,EAAE,6DAAC;AAE1D,IAAA,oBAAoB,GAAG,KAAK,CAKnC,IAAI,GAAG,EAAE,gEAAC;AAEH,IAAA,yBAAyB,GAAG,KAAK,CAGhC,IAAI,qEAAC;IAEN,cAAc,GAAG,MAAM,EAAwB;IAC/C,aAAa,GAAG,MAAM,EAA8B;;AAGpD,IAAA,mBAAmB,GAAG,QAAQ,CAA2B,MAAK;AACrE,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;AACtC,QAAA,MAAM,WAAW,GACf,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,eAAe;QACxE,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CACtC,CAAC,EACD,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CACxD;QAED,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAClE;AAED,YAAA,MAAM,cAAc,GAA2B;AAC7C,gBAAA,GAAG,MAAM;AACT,gBAAA,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG;gBACnC,WAAW;AACX,gBAAA,OAAO,EAAE,WAAW;AACpB,gBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,OAAO;gBACpC,YAAY,EAAE,KAAK,KAAK,uBAAuB;aAChD;AAED,YAAA,OAAO,cAAc;AACvB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,+DAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,CAAC,WAAW,EAC7C,CAAC,CACF,8DACF;AAEQ,IAAA,kCAAkC,GAAG,QAAQ,CAAC,MAAK;AAC1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACnB,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,EAAE;QACnD,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,SAAS,EAAE;AAC3D,YAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE;QAClC;AAEA,QAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AACxE,QAAA,IAAI,wBAAwB,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO;AACJ,aAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,MAAM,CAAC;AAC3D,aAAA,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7D,IAAA,CAAC,8EAAC;;;;AAKO,IAAA,eAAe,GAAG,QAAQ,CAA2B,MAAK;AACjE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC1C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,EAAE;AACrD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAElD,QAAA,IAAI,WAAW,IAAI,gBAAgB,EAAE;AACnC,YAAA,OAAO,OAAO;QAChB;QAEA,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,WAAW,CAAC;AACzD,IAAA,CAAC,2DAAC;AAEO,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,iEAC5E;AAEQ,IAAA,0BAA0B,GAAG,QAAQ,CAAC,MAAK;AAClD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAC/C,MAAM,cAAc,GAClB,SAAS,IAAI,IAAI,CAAC,kCAAkC,EAAE;AACxD,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC;AACnD,IAAA,CAAC,sEAAC;;AAGO,IAAA,4BAA4B,GAAG,QAAQ,CAAC,MAAK;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM;AACvD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE;QAE5C,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,cAAc,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;AAChE,QAAA,OAAO,IAAI,CAAC,GAAG,CACb,SAAS,EACT,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,yBAAyB,CAAC,CACzD;AACH,IAAA,CAAC,wEAAC;AAEO,IAAA,gBAAgB,GAAG,QAAQ,CAClC,MACE,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,4BAA4B,EAAE,4DAC3E;;AAGQ,IAAA,kBAAkB,GAAG,QAAQ,CAAyB,MAAK;AAClE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC5C,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACpB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG;AAChC,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;QACjD,MAAM,GAAG,GAA2B,EAAE;QAEtC,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,gBAAgB,EAAE,EACvB,CAAC,EACD,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,IAAI,CAAC,iBAAiB,EAAE,EACxB,GAAG,CACJ;AAED,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,8DAAC;IAEF,eAAe,GAAA;QACb,IAAI,CAAC,kBAAkB,EAAE;IAC3B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;AACjC,QAAA,IAAI,CAAC,mBAAmB,EAAE,UAAU,EAAE;QACtC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;AAEA,IAAA,gBAAgB,CAAC,IAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC;;AAGA,IAAA,kBAAkB,CAAC,OAAsC,EAAA;AACvD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC;AAEA,IAAA,qBAAqB,CAAC,KAAmB,EAAA;AACvC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;YACtD;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,OAAO;AACvC,QAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,0BAA0B,EAAE;AAEtE,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAmC;QACxD,MAAM,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;QAE5C,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,qBAAqB,EAAE;AACjE,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC9D,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACpE;AAEA,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAChC;QACF;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,EAAE;AACtD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;AACvC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE;AAEvC,QAAA,QAAQ,KAAK,CAAC,GAAG;YACf,KAAK,WAAW,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,qBAAqB,CAAC,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;gBAC7D;YACF;YACA,KAAK,YAAY,EAAE;gBACjB,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,qBAAqB,CAAC,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;gBAC7D;YACF;YACA,KAAK,MAAM,EAAE;gBACX,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBAC7B;YACF;YACA,KAAK,KAAK,EAAE;gBACV,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBAC/D;YACF;AACA,YAAA,KAAK,OAAO;YACZ,KAAK,GAAG,EAAE;gBACR,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,0BAA0B,EAAE;gBACjC;YACF;AACA,YAAA;gBACE;;IAEN;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAChC;QACF;QAEA,IAAI,CAAC,0BAA0B,EAAE;IACnC;;IAGQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE,aAAa;QACxD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;YACjC;QACF;QAEA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;AAEjD,QAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;YACzC;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;QACjC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;YACnD,MAAM,KAAK,GACT,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK;AAC7B,gBAAA,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,WAAW;AACnD,gBAAA,CAAC;AAEH,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;IACvC;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,aAAa;QACzD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,IAAI,CAAC,mBAAmB,EAAE,UAAU,EAAE;YACtC;QACF;QAEA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC;AAEnD,QAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;YACzC;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,EAAE,UAAU,EAAE;QACtC,IAAI,CAAC,mBAAmB,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;YACxD,MAAM,KAAK,GACT,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK;AAC7B,gBAAA,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,WAAW;AACnD,gBAAA,CAAC;AAEH,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC;IAC7C;AAEiB,IAAA,qBAAqB,GAAG,CAAC,KAAmB,KAAU;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC7B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK;AACxB,cAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;cAChC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB;QAE3C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,6BAA6B,GAAG,OAAO,CAAC;AAC1E,IAAA,CAAC;IAEgB,mBAAmB,GAAG,MAAW;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,qBAAqB,EAAE;AAC9B,IAAA,CAAC;IAEO,qBAAqB,GAAA;QAC3B,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,qBAAqB,CAAC;QACrE,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC;QACjE,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACvE;AAEQ,IAAA,qBAAqB,CAAC,OAAe,EAAA;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;AAC1D,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,cAAc,CAAC;AAE/C,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,cAAc,CAAC;QACzD;IACF;IAEQ,0BAA0B,GAAA;AAChC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,EAAE;AACtD,QAAA,IAAI,YAAY,GAAG,CAAC,EAAE;AACpB,YAAA,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,YAAY,CAAC;AACrD,YAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC7B;QACF;AAEA,QAAA,MAAM,YAAY,GAChB,IAAI,CAAC,8BAA8B,EAAE;YACrC,IAAI,CAAC,kCAAkC,EAAE;AAC3C,QAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;IAC1C;;IAGQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,OAAO,GAA2B;AACtC,YAAA;AACE,gBAAA,GAAG,EAAE,OAAO;AACZ,gBAAA,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE;AACpC,gBAAA,OAAO,EAAE,IAAI,CAAC,4BAA4B,EAAE;AAC5C,gBAAA,IAAI,EAAE,IAAI;AACX,aAAA;SACF;AAED,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAChC,OAAO,CAAC,IAAI,CAAC;AACX,gBAAA,GAAG,EAAE,QAAQ;AACb,gBAAA,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE;AACrC,gBAAA,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE;AACxC,gBAAA,QAAQ,EAAE,QAAQ;AACnB,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,aAAa,CACnB,KAA2B,EAC3B,UAAkB,EAClB,QAAmC,EACnC,QAAgB,EAChB,OAAe,EACf,SAA+B,EAC/B,GAA2B,EAAA;;AAG3B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,YAAY,GAChB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;AACzE,YAAA,MAAM,UAAU,GACd,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;AACxD,gBAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AAE/B,YAAA,MAAM,UAAU,GACd,YAAY,CAAC,IAAI,KAAK;kBAClB,GAAG,YAAY,CAAC,KAAK,CAAA,CAAA,EAAI,YAAY,CAAC,IAAI,CAAA;AAC5C,kBAAE,YAAY,CAAC,KAAK;AACxB,YAAA,MAAM,QAAQ,GACZ,UAAU,CAAC,IAAI,KAAK;kBAChB,GAAG,UAAU,CAAC,KAAK,CAAA,CAAA,EAAI,UAAU,CAAC,IAAI,CAAA;AACxC,kBAAE,UAAU,CAAC,KAAK;AAEtB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CACtC,IAAI,EACJ,YAAY,CAAC,GAAG,EAChB,UAAU,CAAC,GAAG,EACd,CAAA,EAAG,UAAU,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE,EAC7B,UAAU,EACV,SAAS,EACT,QAAQ,EACR,OAAO,CACR;AAED,YAAA,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAElB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;gBACjD,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,QAAQ,EACb,UAAU,GAAG,CAAC,EACd,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,SAAS,EACT,GAAG,CACJ;YACH;QACF;IACF;;AAGQ,IAAA,kBAAkB,CACxB,IAAwB,EACxB,WAAmB,EACnB,SAAiB,EACjB,aAAqB,EACrB,UAAkB,EAClB,SAA+B,EAC/B,QAAgB,EAChB,OAAe,EAAA;AAEf,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,QAAQ;AACtE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,OAAO;AAC/D,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACzE,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEtE,QAAA,MAAM,aAAa,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,CAAC;AAC/D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,IAAI,CAAC,4BAA4B,EAAE,EACnC,aAAa,GAAG,IAAI,CAAC,4BAA4B,EAAE,CACpD;AAED,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AACxE,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC7D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CACvC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAC1C;QAED,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,QAAQ,EAAE,kBAAkB;AAC5B,YAAA,MAAM,EAAE,gBAAgB;YACxB,aAAa;AACb,YAAA,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA,CAAA,CAAG;AACrE,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;YACtC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;YACpD,WAAW;AACX,YAAA,kBAAkB,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;AACvD,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;AACxB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,aAAa;AAClC,YAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,OAAO;AAClD,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;YACxC,UAAU;AACV,YAAA,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,aAAa,EACX,CAAC,kBAAkB,GAAG,QAAQ,IAAI,IAAI,CAAC,4BAA4B,EAAE;YACvE,YAAY;AACZ,YAAA,mBAAmB,EAAE,CAAC,YAAY,GAAG,aAAa,IAAI,GAAG;SAC1D;IACH;IAEQ,aAAa,CACnB,KAAoB,EACpB,QAAmC,EAAA;AAEnC,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAChE;IACH;;AAGQ,IAAA,gBAAgB,CAAC,KAAqB,EAAA;QAC5C,OAAO,KAAK,IAAI,wBAAwB;IAC1C;;AAGQ,IAAA,iBAAiB,CAAC,KAAa,EAAA;QACrC,OAAO,CAAA,mBAAA,EAAsB,KAAK,CAAA,YAAA,CAAc;IAClD;AAEQ,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C;IAEQ,qBAAqB,CAC3B,OAAiC,EACjC,aAAqB,EAAA;QAErB,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CACrC,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,CAAC,WAAW,EAC7C,CAAC,CACF;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,gBAAgB,IAAI,CAAC,EAAE;AAC5C,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CACtC,gBAAgB,EAChB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAC1B;QAED,IAAI,eAAe,GAAG,CAAC;QACvB,IAAI,mBAAmB,GAAG,CAAC;QAE3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;YACnC,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,OAAO;AACL,oBAAA,GAAG,MAAM;AACT,oBAAA,OAAO,EAAE,IAAI,CAAC,GAAG,CACf,MAAM,CAAC,WAAW,EAClB,uBAAuB,GAAG,eAAe,CAC1C;iBACF;YACH;AAEA,YAAA,MAAM,sBAAsB,GAAG,uBAAuB,GAAG,eAAe;AACxE,YAAA,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,mBAAmB;YACnE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,MAAM,CAAC,WAAW,EAClB,IAAI,CAAC,KAAK,CACR,CAAC,sBAAsB,GAAG,MAAM,CAAC,WAAW,IAAI,oBAAoB,CACrE,CACF;YAED,eAAe,IAAI,OAAO;AAC1B,YAAA,mBAAmB,IAAI,MAAM,CAAC,WAAW;YAEzC,OAAO;AACL,gBAAA,GAAG,MAAM;gBACT,OAAO;aACR;AACH,QAAA,CAAC,CAAC;IACJ;IAEQ,4BAA4B,GAAA;AAClC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACjD,QAAA,IAAI,cAAc,IAAI,CAAC,EAAE;YACvB,OAAO,MAAM,CAAC,iBAAiB;QACjC;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;AACzE,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE;QAClD,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS,EAAE;AACzD,YAAA,OAAO,cAAc;QACvB;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAC7D;AAEQ,IAAA,qBAAqB,CAAC,OAAe,EAAA;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC7B,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,EAAE;AACpD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAEjD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5D;IAEQ,KAAK,GAAA;AACX,QAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACnC,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,GAAG,GACP,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;AAC5C,YAAA,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC;AAClC,YAAA,KAAK;AAEP,QAAA,OAAO,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK;IACpC;uGAtoBW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,w9FCxD1B,m4GAwFA,EAAA,MAAA,EAAA,CAAA,onIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,iOAAE,gBAAgB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIlD,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,m4GAAA,EAAA,MAAA,EAAA,CAAA,onIAAA,CAAA,EAAA;;sBAK7D,SAAS;uBAAC,qBAAqB;;sBAM/B,SAAS;uBAAC,qBAAqB;;;AEzDlC;;;;;;;;;;AAUG;MAOU,cAAc,CAAA;AAChB,IAAA,KAAK,GAAG,KAAK,CAAS,UAAU,iDAAC;AACjC,IAAA,YAAY,GAAG,KAAK,CAAoB,WAAW,wDAAC;AACpD,IAAA,mBAAmB,GAAG,KAAK,CAAwB,EAAE,+DAAC;IAEtD,kBAAkB,GAAG,MAAM,EAAqB;;AAGzD,IAAA,oBAAoB,CAAC,IAAuB,EAAA;AAC1C,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpC;uGAVW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,wjBCvB3B,44BAwBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDJY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,0hBAAE,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAG7B,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,EAAA,QAAA,EAAA,44BAAA,EAAA;;;AEmB3C;AACA,MAAM,sBAAsB,GAA0B;AACpD,IAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,IAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;AAC1C,IAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE;AAC7C,IAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;CACzC;AAED;;;;;;;;;;;;;AAaG;AAgBW,MAAO,QAAQ,CAAA;;AAEE,IAAA,cAAc;;AAG3C,IAAA,yBAAyB;AAEhB,IAAA,KAAK,GAAG,KAAK,CAAS,UAAU,iDAAC;AACjC,IAAA,YAAY,GAAG,KAAK,CAAS,oBAAoB,wDAAC;AAClD,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAU,IAAI,sDAAC;AAEjC,IAAA,YAAY,GAAG,KAAK,CAAoB,WAAW,wDAAC;IACpD,mBAAmB,GAAG,KAAK,CAAwB;AAC1D,QAAA,GAAG,sBAAsB;AAC1B,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEO,IAAA,SAAS,GAAG,KAAK,CAAY,EAAE,qDAAC;AAChC,IAAA,YAAY,GAAG,KAAK,CAA8B,IAAI,wDAAC;;AAGvD,IAAA,OAAO,GAAG,KAAK,CAEtB,IAAI,mDAAC;AAEE,IAAA,mBAAmB,GAAG,KAAK,CAAS,EAAE,+DAAC;AACvC,IAAA,qBAAqB,GAAG,KAAK,CAAgB,CAAC,iEAAC;AAC/C,IAAA,qBAAqB,GAAG,KAAK,CAAS,CAAC,iEAAC;AACxC,IAAA,qBAAqB,GAAG,KAAK,CAAgB,IAAI,iEAAC;;AAGlD,IAAA,qBAAqB,GAAG,KAAK,CAAS,gBAAgB,iEAAC;AACvD,IAAA,sBAAsB,GAAG,KAAK,CAAS,QAAQ,kEAAC;AAChD,IAAA,4BAA4B,GAAG,KAAK,CAAS,GAAG,wEAAC;AACjD,IAAA,wBAAwB,GAAG,KAAK,CAAS,GAAG,oEAAC;AAC7C,IAAA,qBAAqB,GAAG,KAAK,CAAU,KAAK,iEAAC;AAE7C,IAAA,qBAAqB,GAAG,KAAK,CAAU,IAAI,iEAAC;;IAG5C,uBAAuB,GAAG,MAAM,EAAqB;IACrD,cAAc,GAAG,MAAM,EAAW;;AAGlC,IAAA,aAAa,GAAG,YAAY,CAAC,8BAA8B,yDAAC;;AAG5D,IAAA,eAAe,GAAG,eAAe,EACxC,+BAA8D,4DAC/D;;AAGQ,IAAA,eAAe,GAAG,YAAY,EACrC,gCAA+D,4DAChE;;AAGQ,IAAA,gBAAgB,GAAG,YAAY,EACtC,iCAAgE,6DACjE;AAEQ,IAAA,iBAAiB,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,6DAAC;AAC3D,IAAA,iBAAiB,GAAG,MAAM,CAA8B,IAAI,6DAAC;;AAG7D,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAGhB;QAEH,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC7C,YAAA,IAAI,QAAQ,CAAC,GAAG,EAAE;gBAChB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;YACjC;QACF;AAEA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,gEAAC;AAEO,IAAA,gBAAgB,GAAG,QAAQ,CAAuB,MAAK;AAC9D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;QAE7B,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;AAC3B,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;aAChD,MAAM,CAAC,CAAC,IAAI,KAAiC,IAAI,KAAK,IAAI,CAAC;AAChE,IAAA,CAAC,4DAAC;;AAGO,IAAA,oBAAoB,GAAG,QAAQ,CAA4B,MAAK;AACvE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACjB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC5E,IAAA,CAAC,gEAAC;;AAEF,IAAA,oBAAoB,CAAC,IAAuB,EAAA;QAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YACzC;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACzC;;IAGA,oBAAoB,CAAC,IAA0B,EAAE,KAAiB,EAAA;QAChE,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;AAE7C,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE;YACjC;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEhC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;;AAG1D,QAAA,IAAI,OAAO,CAAC,cAAc,EAAE;YAC1B,OAAO,CAAC,IAAI,EAAE;AACd,YAAA,UAAU,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;YACrD;QACF;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;IAClC;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;;AAGA,IAAA,mBAAmB,CAAC,IAA0B,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB;QACF;QAEA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACxC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;YAE7B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,yBAAyB,CACvB,IAA0B,EAAA;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI;QAClC,OAAO;AACL,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,KAAK,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;SACvC;IACH;;AAGQ,IAAA,OAAO,CACb,MAAe,EACf,OAA6B,EAC7B,KAAyB,EAAA;AAEzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU;AAErE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AACtD,QAAA,MAAM,EAAE,GACN,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACrD,cAAG;AACH,cAAE,CAAA,KAAA,EAAQ,KAAK,CAAC,MAAM,EAAE,EAAE;AAE9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CACrC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAC/C;QAED,MAAM,aAAa,GACjB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;AAC9C,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AAE/B,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,GAAG,EAAE;AAChE,aAAA,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;aAClD,MAAM,CAAC,CAAC,IAAI,KAAiC,IAAI,KAAK,IAAI,CAAC;QAE9D,OAAO;YACL,MAAM;YACN,EAAE;YACF,KAAK;AACL,YAAA,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpE,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAChE,QAAQ;YACR,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;YAC/C,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;YACxD,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;YAC1D,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;YAChD,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;YAChD,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC;YACtE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;YAC1D,QAAQ;SACT;IACH;;AAGQ,IAAA,gBAAgB,CACtB,KAA2B,EAAA;AAE3B,QAAA,IAAI,GAAG,GAAG,MAAM,CAAC,iBAAiB;AAClC,QAAA,IAAI,GAAG,GAAG,MAAM,CAAC,iBAAiB;AAElC,QAAA,MAAM,KAAK,GAAG,CAAC,KAA2B,KAAI;AAC5C,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE;oBACzB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;oBACjC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;gBACnC;AAEA,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;oBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;oBAC/B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;gBACjC;AAEA,gBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACxB,oBAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACtB;YACF;AACF,QAAA,CAAC;QAED,KAAK,CAAC,KAAK,CAAC;AAEZ,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAClD,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IACrC;;AAGQ,IAAA,aAAa,CACnB,OAAe,EACf,KAAa,EACb,IAAuB,EAAA;QAEvB,QAAQ,IAAI;AACV,YAAA,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,WAAW,CACrB,OAAO,EACP,KAAK,EACL,CAAC,EACD,CAAC,KAAK,KAAK,CAAA,EAAA,EAAK,KAAK,GAAG,CAAC,CAAA,CAAE,EAC3B,GAAG,CACJ;AACH,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,IAAI,CAAC,WAAW,CACrB,OAAO,EACP,KAAK,EACL,CAAC,EACD,CAAC,KAAK,KAAK,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA,CAAE,EAC3C,GAAG,CACJ;AACH,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,IAAI,CAAC,WAAW,CACrB,OAAO,EACP,KAAK,EACL,CAAC,EACD,CAAC,KAAK,KAAK,CAAA,EAAA,EAAK,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA,CAAE,EACnC,GAAG,CACJ;AACH,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC;AAC7D,YAAA;AACE,gBAAA,OAAO,IAAI,CAAC,WAAW,CACrB,OAAO,EACP,KAAK,EACL,CAAC,EACD,CAAC,KAAK,KAAK,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA,CAAE,EAC3C,GAAG,CACJ;;IAEP;;IAGQ,WAAW,CACjB,OAAe,EACf,KAAa,EACb,UAAkB,EAClB,KAAqC,EACrC,MAAc,EAAA;QAEd,MAAM,QAAQ,GAA8B,EAAE;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAE3B,QAAA,IAAI,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE;AACjC,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;QAC/B,IAAI,GAAG,GAAG,CAAC;AAEX,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;YAClB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,UAAU;QACrD;AAEA,QAAA,OACE,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE;AAC3B,aAAC,IAAI,KAAK,GAAG,CAAC,cAAc,EAAE,IAAI,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,EAC7D;YACA,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,GAAG,MAAM,CAAA,EAAG,KAAK,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;AACnC,gBAAA,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;gBACnB,GAAG;gBACH,IAAI;gBACJ,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAC9D,aAAA,CAAC;YAEF,GAAG,IAAI,CAAC;YACR,KAAK,IAAI,UAAU;AAEnB,YAAA,IAAI,KAAK,GAAG,EAAE,EAAE;gBACd,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC9B,KAAK,IAAI,EAAE;YACb;QACF;AAEA,QAAA,OAAO,QAAQ;IACjB;;IAGQ,eAAe,CACrB,IAAa,EACb,QAAuD,EAAA;QAEvD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAClC,YAAA,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAuB;IACxD;IAEQ,aAAa,CACnB,IAAa,EACb,QAA0E,EAAA;QAE1E,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;QAElD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;;IAGQ,YAAY,CAClB,IAAa,EACb,QAA0E,EAAA;QAE1E,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;QAElD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,KAAK,GAAI,KAAiC,CAAC,OAAO,CAAC;AACzD,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,OAAO,KAAK;YACd;YAEA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC;AACtD,YAAA,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;AACpC,gBAAA,OAAO,YAAY;YACrB;QACF;AAEA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;;IAGQ,IAAI,CAAC,IAAa,EAAE,KAAa,EAAA;QACvC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,YAAY,EAAE,KAAK;aAC3B,KAAK,CAAC,GAAG;aACT,MAAM,CAAC,OAAO;AACd,aAAA,MAAM,CAAU,CAAC,OAAO,EAAE,GAAG,KAAI;YAChC,IACE,OAAO,KAAK,IAAI;AAChB,gBAAA,OAAO,KAAK,SAAS;AACrB,gBAAA,OAAO,OAAO,KAAK,QAAQ,EAC3B;AACA,gBAAA,OAAO,SAAS;YAClB;AAEA,YAAA,OAAQ,OAAmC,CAAC,GAAG,CAAC;QAClD,CAAC,EAAE,IAAI,CAAC;IACZ;;AAGQ,IAAA,iBAAiB,CACvB,KAAoC,EAAA;QAEpC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;YACzC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;QAClC;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA,CAAA,CAAG,EAAE;QACjE;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CACtC;YACD,OAAO;AACL,gBAAA,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA,CAAA,CAAG;aACjE;QACH;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;QACjD,OAAO;AACL,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA,CAAA,CAAG;YACjD,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB;IACH;;AAGQ,IAAA,MAAM,CAAC,KAAc,EAAA;QAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,KAAK,YAAY,IAAI,EAAE;YACzB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI;QAClE;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI;QAC9C;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;AACtC,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;QAC5C;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,WAAW,GAAI,KAAiC,CAAC,aAAa,CAAC;AACrE,YAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC7B,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YACjC;QACF;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C;AAEQ,IAAA,0BAA0B,CAChC,KAAiB,EAAA;AAEjB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,EAAE,aAAa;QAC5D,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI;QACxC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI;AACvC,QAAA,OAAO,MAAM;IACf;uGAngBmB,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA4CW,8BAA8B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,GAIlE,+BAA8D,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,GAK9D,gCAA+D,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,GAK/D,iCAAgE,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,2BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtIpE,8lGAmFA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,cAAc,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,aAAa,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,8BAAA,EAAA,0BAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,sBAAsB,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAOU,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAf5B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,cAAc;wBACd,aAAa;wBACb,sBAAsB;wBACtB,OAAO;wBACP,gBAAgB;AACjB,qBAAA,EAAA,IAAA,EAGK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAA,QAAA,EAAA,8lGAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;sBAIvB,SAAS;uBAAC,gBAAgB;;sBAE1B,SAAS;uBAAC,2BAA2B;AAwCA,aAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,4BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,8BAA8B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAIlE,+BAA8D,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAK9D,gCAA+D,kGAK/D,iCAAgE,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEtIpE;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@masterteam/timeline",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/timeline",
6
6
  "linkDirectory": false,
7
7
  "access": "public"
8
8
  },
9
9
  "peerDependencies": {
10
- "@angular/common": "^21.0.3",
11
- "@angular/core": "^21.0.3",
12
- "@angular/forms": "^21.0.3",
13
- "@primeuix/themes": "^2.0.2",
14
- "@tailwindcss/postcss": "^4.1.17",
15
- "postcss": "^8.5.6",
16
- "primeng": "21.0.1",
17
- "rxjs": "^7.8.2",
18
- "tailwindcss": "^4.1.17",
19
- "tailwindcss-primeui": "^0.6.1",
20
- "@masterteam/icons": "^0.0.13",
21
- "@masterteam/components": "^0.0.91"
10
+ "@angular/common": "catalog:angular21",
11
+ "@angular/core": "catalog:angular21",
12
+ "@angular/forms": "catalog:angular21",
13
+ "@primeuix/themes": "catalog:",
14
+ "@tailwindcss/postcss": "catalog:",
15
+ "postcss": "catalog:",
16
+ "primeng": "catalog:",
17
+ "rxjs": "catalog:angular21",
18
+ "tailwindcss": "catalog:",
19
+ "tailwindcss-primeui": "catalog:",
20
+ "@masterteam/components": "workspace:^",
21
+ "@masterteam/icons": "workspace:^"
22
22
  },
23
23
  "sideEffects": false,
24
24
  "exports": {
@@ -36,6 +36,6 @@
36
36
  "module": "fesm2022/masterteam-timeline.mjs",
37
37
  "typings": "types/masterteam-timeline.d.ts",
38
38
  "dependencies": {
39
- "tslib": "^2.8.1"
39
+ "tslib": "catalog:angular21"
40
40
  }
41
41
  }
@@ -173,6 +173,7 @@ declare class Timeline {
173
173
  readonly ganttMapping: _angular_core.InputSignal<TimelineGanttMapping<unknown> | null>;
174
174
  readonly columns: _angular_core.InputSignal<TimelineColumnConfig<unknown, TimelineResolvedItem>[] | null>;
175
175
  readonly ganttSegmentWidthPx: _angular_core.InputSignal<number>;
176
+ readonly defaultVisibleColumns: _angular_core.InputSignal<number | null>;
176
177
  readonly columnsPaneMinWidthPx: _angular_core.InputSignal<number>;
177
178
  readonly columnsPaneMaxWidthPx: _angular_core.InputSignal<number | null>;
178
179
  readonly ganttTitleColumnLabel: _angular_core.InputSignal<string>;
@@ -211,7 +212,7 @@ declare class Timeline {
211
212
  private clampProgress;
212
213
  private positionPopoverClickAnchor;
213
214
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Timeline, never>;
214
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Timeline, "mt-timeline", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "timelineMode": { "alias": "timelineMode"; "required": false; "isSignal": true; }; "timelineModeOptions": { "alias": "timelineModeOptions"; "required": false; "isSignal": true; }; "ganttData": { "alias": "ganttData"; "required": false; "isSignal": true; }; "ganttMapping": { "alias": "ganttMapping"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "ganttSegmentWidthPx": { "alias": "ganttSegmentWidthPx"; "required": false; "isSignal": true; }; "columnsPaneMinWidthPx": { "alias": "columnsPaneMinWidthPx"; "required": false; "isSignal": true; }; "columnsPaneMaxWidthPx": { "alias": "columnsPaneMaxWidthPx"; "required": false; "isSignal": true; }; "ganttTitleColumnLabel": { "alias": "ganttTitleColumnLabel"; "required": false; "isSignal": true; }; "ganttStatusColumnLabel": { "alias": "ganttStatusColumnLabel"; "required": false; "isSignal": true; }; "ganttInitiativeColumnWidthPx": { "alias": "ganttInitiativeColumnWidthPx"; "required": false; "isSignal": true; }; "ganttStatusColumnWidthPx": { "alias": "ganttStatusColumnWidthPx"; "required": false; "isSignal": true; }; "showGanttStatusColumn": { "alias": "showGanttStatusColumn"; "required": false; "isSignal": true; }; "showGanttDetailsPopup": { "alias": "showGanttDetailsPopup"; "required": false; "isSignal": true; }; }, { "timelineMode": "timelineModeChange"; "timelineModeChangeEvent": "timelineModeChangeEvent"; "ganttItemClick": "ganttItemClick"; }, ["ganttTemplate", "columnTemplates", "popoverTemplate", "progressTemplate"], never, true, never>;
215
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Timeline, "mt-timeline", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "timelineMode": { "alias": "timelineMode"; "required": false; "isSignal": true; }; "timelineModeOptions": { "alias": "timelineModeOptions"; "required": false; "isSignal": true; }; "ganttData": { "alias": "ganttData"; "required": false; "isSignal": true; }; "ganttMapping": { "alias": "ganttMapping"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "ganttSegmentWidthPx": { "alias": "ganttSegmentWidthPx"; "required": false; "isSignal": true; }; "defaultVisibleColumns": { "alias": "defaultVisibleColumns"; "required": false; "isSignal": true; }; "columnsPaneMinWidthPx": { "alias": "columnsPaneMinWidthPx"; "required": false; "isSignal": true; }; "columnsPaneMaxWidthPx": { "alias": "columnsPaneMaxWidthPx"; "required": false; "isSignal": true; }; "ganttTitleColumnLabel": { "alias": "ganttTitleColumnLabel"; "required": false; "isSignal": true; }; "ganttStatusColumnLabel": { "alias": "ganttStatusColumnLabel"; "required": false; "isSignal": true; }; "ganttInitiativeColumnWidthPx": { "alias": "ganttInitiativeColumnWidthPx"; "required": false; "isSignal": true; }; "ganttStatusColumnWidthPx": { "alias": "ganttStatusColumnWidthPx"; "required": false; "isSignal": true; }; "showGanttStatusColumn": { "alias": "showGanttStatusColumn"; "required": false; "isSignal": true; }; "showGanttDetailsPopup": { "alias": "showGanttDetailsPopup"; "required": false; "isSignal": true; }; }, { "timelineMode": "timelineModeChange"; "timelineModeChangeEvent": "timelineModeChangeEvent"; "ganttItemClick": "ganttItemClick"; }, ["ganttTemplate", "columnTemplates", "popoverTemplate", "progressTemplate"], never, true, never>;
215
216
  }
216
217
 
217
218
  export { Timeline, TimelineColumnTemplateDirective, TimelineGanttTemplateDirective, TimelinePopoverTemplateDirective, TimelineProgressTemplateDirective };