@daisychainapp/maily-to-core 0.0.2-2.1 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","#style-inject:#style-inject","../src/styles/index.css","../src/styles/preflight.css","../src/styles/tailwind.css","../src/editor/index.tsx","../src/editor/components/column-menu/columns-bubble-menu.tsx","../src/editor/utils/get-render-container.ts","../src/editor/utils/is-text-selected.ts","../src/editor/utils/columns.ts","../src/editor/utils/update-attribute.ts","../src/editor/nodes/columns/column.ts","../src/editor/components/column-menu/use-columns-state.tsx","../src/editor/utils/classname.ts","../src/editor/components/ui/divider.tsx","../src/editor/components/ui/tooltip.tsx","../src/editor/components/vertical-alignment-switch.tsx","../src/editor/components/base-button.tsx","../src/editor/components/bubble-menu-button.tsx","../src/editor/components/show-popover.tsx","../src/editor/components/popover.tsx","../src/editor/nodes/variable/variable-popover.tsx","../src/editor/utils/constants.ts","../src/editor/utils/use-outside-click.ts","../src/editor/components/ui/input-autocomplete.tsx","../src/editor/provider.tsx","../src/blocks/button.tsx","../src/blocks/image.tsx","../src/blocks/layout.tsx","../src/blocks/list.tsx","../src/blocks/typography.tsx","../src/editor/extensions/slash-command/default-slash-commands.ts","../src/editor/nodes/variable/variable-view.tsx","../src/editor/utils/variable.ts","../src/editor/components/column-menu/columns-width-config.tsx","../src/editor/components/ui/select.tsx","../src/editor/components/column-menu/columns-bubble-menu-content.tsx","../src/editor/utils/delete-node.ts","../src/editor/components/content-menu.tsx","../src/editor/plugins/drag-handle/drag-handle.tsx","../src/editor/plugins/drag-handle/drag-handle-plugin.ts","../src/editor/components/editor-menu-bar.tsx","../src/editor/components/for-menu/for-bubble-menu.tsx","../src/editor/components/for-menu/use-for-state.ts","../src/editor/components/image-menu/image-bubble-menu.tsx","../src/editor/components/alignment-switch.tsx","../src/editor/components/ui/link-input-popover.tsx","../src/editor/components/image-menu/image-size.tsx","../src/editor/nodes/logo/logo.ts","../src/editor/nodes/section/section.ts","../src/editor/nodes/logo/logo-view.tsx","../src/editor/utils/use-event.ts","../src/editor/nodes/image/image-view.tsx","../src/editor/components/image-menu/use-image-state.tsx","../src/editor/components/section-menu/section-bubble-menu.tsx","../src/editor/components/icons/border-color.tsx","../src/editor/components/icons/margin-icon.tsx","../src/editor/components/icons/padding-icon.tsx","../src/editor/components/ui/color-picker.tsx","../src/editor/components/section-menu/use-section-state.tsx","../src/editor/components/spacer-menu/spacer-bubble-menu.tsx","../src/editor/nodes/spacer.ts","../src/editor/components/spacer-menu/use-spacer-state.ts","../src/editor/components/text-menu/text-bubble-menu.tsx","../src/editor/components/text-menu/use-text-menu-state.tsx","../src/editor/extensions/horizontal-rule.tsx","../src/editor/utils/is-custom-node-selected.ts","../src/editor/extensions/link-card.ts","../src/editor/nodes/link-card.tsx","../src/editor/components/input.tsx","../src/editor/components/textarea.tsx","../src/editor/nodes/button/button.tsx","../src/editor/nodes/button/button-view.tsx","../src/editor/nodes/button/button-label-input.tsx","../src/editor/nodes/variable/variable.ts","../src/editor/nodes/image/image.ts","../src/editor/nodes/columns/columns.ts","../src/editor/nodes/for/for.ts","../src/editor/nodes/for/for-view.tsx","../src/editor/components/text-menu/turn-into-block.tsx","../src/editor/components/text-menu/use-turn-into-block-options.tsx","../src/editor/extensions/index.ts","../src/editor/extensions/color.ts","../src/editor/nodes/footer.ts","../src/editor/nodes/variable/variable-suggestions.tsx","../src/editor/extensions/slash-command/slash-command.ts","../src/editor/utils/update-scroll-view.ts","../src/editor/extensions/slash-command/slash-command-view.tsx","../src/editor/nodes/link.ts"],"sourcesContent":["import './styles/index.css';\nimport './styles/preflight.css';\nimport './styles/tailwind.css';\n\nexport * from './editor/index';\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root {\\n --placeholder-color: #adb5bd;\\n --bg-color: #ffffff;\\n --variable-icon-size: 12px;\\n --variable-icon-gap: 4px;\\n}\\n.mly-editor .mly-prose p:where([class~=text-sm]) {\\n font-size: 16px;\\n}\\n.mly-editor .mly-prose h1,\\n.mly-editor .mly-prose h2,\\n.mly-editor .mly-prose h3 {\\n margin-top: 0;\\n margin-bottom: 12px;\\n}\\n.mly-editor .mly-prose h1 {\\n font-size: 36px;\\n}\\n.mly-editor .mly-prose h2 {\\n font-size: 30px;\\n}\\n.mly-editor .mly-prose h3 {\\n font-size: 24px;\\n}\\n.mly-editor .mly-prose p {\\n font-size: 15px;\\n margin-bottom: 20px;\\n}\\n.mly-editor .mly-prose h1 + p,\\n.mly-editor .mly-prose h2 + p,\\n.mly-editor .mly-prose h3 + p,\\n.mly-editor .mly-prose hr + p,\\n.mly-editor .mly-prose table + p {\\n margin-top: 0;\\n}\\n.mly-editor .mly-prose ol,\\n.mly-editor .mly-prose ul {\\n margin-top: 0;\\n margin-bottom: 20px;\\n}\\n.mly-editor .mly-prose li:not(:last-child) {\\n margin-bottom: 8px;\\n}\\n.mly-editor .mly-prose li > p {\\n margin: 0;\\n}\\n.mly-editor .mly-prose img,\\n.mly-editor .mly-prose .node-logo {\\n margin-top: 0;\\n margin-bottom: 32px;\\n}\\n.mly-editor .mly-prose hr {\\n margin-block: 32px;\\n}\\n.mly-editor .mly-prose .footer {\\n display: block;\\n font-size: 13px;\\n margin-bottom: 20px;\\n color: rgb(100, 116, 139);\\n}\\n.mly-editor .mly-prose .spacer + * {\\n margin-top: 0;\\n}\\n.mly-editor .mly-prose p + .spacer {\\n margin-top: -20px;\\n}\\n.mly-editor .mly-prose blockquote + .spacer {\\n margin-top: -16px;\\n}\\n.mly-editor .mly-prose h1 + .spacer,\\n.mly-editor .mly-prose h2 + .spacer,\\n.mly-editor .mly-prose h3 + .spacer {\\n margin-top: -12px;\\n}\\n.mly-editor .mly-prose ol + .spacer,\\n.mly-editor .mly-prose ul + .spacer {\\n margin-top: -20px;\\n}\\n.mly-editor .mly-prose img + .spacer,\\n.mly-editor .mly-prose .node-logo + .spacer {\\n margin-top: -32px;\\n}\\n.mly-editor .mly-prose .node-button + .spacer,\\n.mly-editor .mly-prose .node-linkCard + .spacer,\\n.mly-editor .mly-prose footer + .spacer {\\n margin-top: -20px;\\n}\\n.mly-editor .mly-prose .node-button,\\n.mly-editor .mly-prose .node-linkCard {\\n margin-top: 0;\\n margin-bottom: 20px;\\n}\\n.mly-editor .mly-prose .node-image {\\n line-height: 0;\\n margin-top: 0;\\n margin-bottom: 32px;\\n outline: none;\\n}\\n.mly-editor .mly-prose .node-image + .spacer {\\n margin-top: -32px;\\n}\\n.mly-editor .mly-prose code::before,\\n.mly-editor .mly-prose code::after {\\n content: none;\\n}\\n.mly-no-scrollbar::-webkit-scrollbar {\\n display: none;\\n}\\n.mly-no-scrollbar {\\n -ms-overflow-style: none;\\n scrollbar-width: none;\\n}\\n.mly-editor .react-colorful__alpha {\\n border-radius: 0;\\n}\\n.mly-editor .react-colorful__saturation,\\n.mly-editor .react-colorful__hue,\\n.mly-editor .react-colorful__alpha {\\n border-radius: 8px;\\n}\\n.mly-editor .react-colorful__hue,\\n.mly-editor .react-colorful__alpha {\\n height: 16px;\\n}\\n.mly-editor .react-colorful__pointer {\\n width: 16px;\\n height: 16px;\\n}\\n.ProseMirror-selectednode::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: -2px;\\n pointer-events: none;\\n border-radius: 6px;\\n background: rgba(35, 131, 226, 0.14);\\n}\\n.mly-prose {\\n strong {\\n color: currentColor;\\n }\\n}\\n.ProseMirror {\\n position: relative;\\n word-wrap: break-word;\\n white-space: pre-wrap;\\n white-space: break-spaces;\\n font-variant-ligatures: none;\\n font-feature-settings: \\\"liga\\\" 0;\\n &:focus {\\n outline: none;\\n }\\n p {\\n margin-top: 0;\\n }\\n h1 {\\n --variable-icon-size: 28px;\\n }\\n h2 {\\n --variable-icon-size: 24px;\\n }\\n h3 {\\n --variable-icon-size: 20px;\\n }\\n h1,\\n h2,\\n h3 {\\n --variable-icon-gap: 8px;\\n }\\n .is-editor-empty:first-child:not([data-type=columns], [data-type=section], ul, li, ol)::before {\\n content: attr(data-placeholder);\\n float: left;\\n color: var(--placeholder-color);\\n pointer-events: none;\\n height: 0;\\n }\\n .is-empty:not([data-type=columns], [data-type=section], ol, ul, li)::before {\\n content: attr(data-placeholder);\\n float: left;\\n color: var(--placeholder-color);\\n pointer-events: none;\\n height: 0;\\n }\\n [data-type=columns] .is-empty::before,\\n [data-type=section] .is-empty::before {\\n --l-threshold: 0.66;\\n --diff: calc(var(--l-threshold) - l);\\n color: oklch(from var(--bg-color) clamp(0.05, max(min(var(--diff) * infinity, 1), 0), 0.95) c h) !important;\\n opacity: 0.6;\\n }\\n [data-type=columns] {\\n display: flex;\\n margin: 0;\\n padding: 0;\\n &.has-focus [data-type=column],\\n &:hover [data-type=column] {\\n outline: 1.5px solid #e9ecef;\\n outline-style: dashed;\\n }\\n [data-type=column].has-focus {\\n outline-style: solid;\\n }\\n }\\n [data-type=column] {\\n display: table-cell;\\n flex-basis: 0;\\n flex-grow: 1;\\n overflow: auto;\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n [data-type=section] {\\n margin: 0;\\n padding: 0;\\n [data-type=section-cell] {\\n padding: 0;\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n }\\n [data-type=for] {\\n [data-node-view-content] > div {\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n }\\n .node-for.has-focus [data-repeat-indicator] {\\n opacity: 1;\\n }\\n [data-type=show] {\\n [data-node-view-content] > div {\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n }\\n *:has(+ .ProseMirror-gapcursor) {\\n margin-bottom: 0 !important;\\n }\\n .ProseMirror-gapcursor {\\n &::after {\\n border: 1.5px solid gray;\\n width: 24px;\\n }\\n & + * {\\n margin-top: 0 !important;\\n }\\n }\\n}\\n.hide-number-controls {\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n &[type=number] {\\n -moz-appearance: textfield;\\n }\\n}\\n.hide-scrollbars {\\n scrollbar-width: none;\\n -ms-overflow-style: none;\\n &::-webkit-scrollbar {\\n display: none;\\n }\\n}\\n\")","import styleInject from '#style-inject';styleInject(\":where(.mly-editor),\\n:where(.mly-editor) ::before,\\n:where(.mly-editor) ::after {\\n box-sizing: border-box;\\n border-width: 0;\\n border-style: solid;\\n border-color: #e5e7eb;\\n}\\n:where(.mly-editor) ::before,\\n:where(.mly-editor) ::after {\\n --tw-content: \\\"\\\";\\n}\\n:where(.mly-editor) html {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n -moz-tab-size: 4;\\n -o-tab-size: 4;\\n tab-size: 4;\\n font-family:\\n ui-sans-serif,\\n system-ui,\\n sans-serif,\\n \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\",\\n \\\"Segoe UI Symbol\\\",\\n \\\"Noto Color Emoji\\\";\\n font-feature-settings: normal;\\n font-variation-settings: normal;\\n}\\n:where(.mly-editor) body {\\n margin: 0;\\n line-height: inherit;\\n}\\n:where(.mly-editor) hr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n}\\n:where(.mly-editor) abbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\n:where(.mly-editor) h1,\\n:where(.mly-editor) h2,\\n:where(.mly-editor) h3,\\n:where(.mly-editor) h4,\\n:where(.mly-editor) h5,\\n:where(.mly-editor) h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n:where(.mly-editor) a {\\n color: inherit;\\n text-decoration: inherit;\\n}\\n:where(.mly-editor) b,\\n:where(.mly-editor) strong {\\n font-weight: bolder;\\n}\\n:where(.mly-editor) code,\\n:where(.mly-editor) kbd,\\n:where(.mly-editor) samp,\\n:where(.mly-editor) pre {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n font-size: 1em;\\n}\\n:where(.mly-editor) small {\\n font-size: 80%;\\n}\\n:where(.mly-editor) sub,\\n:where(.mly-editor) sup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\n:where(.mly-editor) sub {\\n bottom: -0.25em;\\n}\\n:where(.mly-editor) sup {\\n top: -0.5em;\\n}\\n:where(.mly-editor) table {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) input,\\n:where(.mly-editor) optgroup,\\n:where(.mly-editor) select,\\n:where(.mly-editor) textarea {\\n font-family: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n font-size: 100%;\\n font-weight: inherit;\\n line-height: inherit;\\n color: inherit;\\n margin: 0;\\n padding: 0;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) select {\\n text-transform: none;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) [type=button],\\n:where(.mly-editor) [type=reset],\\n:where(.mly-editor) [type=submit] {\\n -webkit-appearance: button;\\n background-image: none;\\n}\\n:where(.mly-editor) :-moz-focusring {\\n outline: auto;\\n}\\n:where(.mly-editor) :-moz-ui-invalid {\\n box-shadow: none;\\n}\\n:where(.mly-editor) progress {\\n vertical-align: baseline;\\n}\\n:where(.mly-editor) ::-webkit-inner-spin-button,\\n:where(.mly-editor) ::-webkit-outer-spin-button {\\n height: auto;\\n}\\n:where(.mly-editor) [type=search] {\\n -webkit-appearance: textfield;\\n outline-offset: -2px;\\n}\\n:where(.mly-editor) ::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n:where(.mly-editor) ::-webkit-file-upload-button {\\n -webkit-appearance: button;\\n font: inherit;\\n}\\n:where(.mly-editor) summary {\\n display: list-item;\\n}\\n:where(.mly-editor) blockquote,\\n:where(.mly-editor) dl,\\n:where(.mly-editor) dd,\\n:where(.mly-editor) h1,\\n:where(.mly-editor) h2,\\n:where(.mly-editor) h3,\\n:where(.mly-editor) h4,\\n:where(.mly-editor) h5,\\n:where(.mly-editor) h6,\\n:where(.mly-editor) hr,\\n:where(.mly-editor) figure,\\n:where(.mly-editor) p,\\n:where(.mly-editor) pre {\\n margin: 0;\\n}\\n:where(.mly-editor) fieldset {\\n margin: 0;\\n padding: 0;\\n}\\n:where(.mly-editor) legend {\\n padding: 0;\\n}\\n:where(.mly-editor) ol,\\n:where(.mly-editor) ul,\\n:where(.mly-editor) menu {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\n:where(.mly-editor) dialog {\\n padding: 0;\\n}\\n:where(.mly-editor) textarea {\\n resize: vertical;\\n}\\n:where(.mly-editor) input::-moz-placeholder,\\n:where(.mly-editor) textarea::-moz-placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\n:where(.mly-editor) input::placeholder,\\n:where(.mly-editor) textarea::placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) [role=button] {\\n cursor: pointer;\\n}\\n:where(.mly-editor) :disabled {\\n cursor: default;\\n}\\n:where(.mly-editor) img,\\n:where(.mly-editor) svg,\\n:where(.mly-editor) video,\\n:where(.mly-editor) canvas,\\n:where(.mly-editor) audio,\\n:where(.mly-editor) iframe,\\n:where(.mly-editor) embed,\\n:where(.mly-editor) object {\\n display: block;\\n vertical-align: middle;\\n}\\n:where(.mly-editor) img,\\n:where(.mly-editor) video {\\n max-width: 100%;\\n height: auto;\\n}\\n:where(.mly-editor) [hidden] {\\n display: none;\\n}\\n\")","import styleInject from '#style-inject';styleInject(\"*,\\n::before,\\n::after {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n::backdrop {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n* {\\n scrollbar-color: initial;\\n scrollbar-width: initial;\\n}\\n.mly-prose {\\n color: var(--tw-prose-body);\\n max-width: 65ch;\\n}\\n.mly-prose :where(p):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where([class~=lead]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-lead);\\n font-size: 1.25em;\\n line-height: 1.6;\\n margin-top: 1.2em;\\n margin-bottom: 1.2em;\\n}\\n.mly-prose :where(a):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-links);\\n text-decoration: underline;\\n font-weight: 500;\\n}\\n.mly-prose :where(strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-bold);\\n font-weight: 600;\\n}\\n.mly-prose :where(a strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(blockquote strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(thead th strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(ol):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: decimal;\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n padding-inline-start: 1.625em;\\n}\\n.mly-prose :where(ol[type=A]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-alpha;\\n}\\n.mly-prose :where(ol[type=a]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-alpha;\\n}\\n.mly-prose :where(ol[type=A s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-alpha;\\n}\\n.mly-prose :where(ol[type=a s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-alpha;\\n}\\n.mly-prose :where(ol[type=I]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-roman;\\n}\\n.mly-prose :where(ol[type=i]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-roman;\\n}\\n.mly-prose :where(ol[type=I s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-roman;\\n}\\n.mly-prose :where(ol[type=i s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-roman;\\n}\\n.mly-prose :where(ol[type=\\\"1\\\"]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: decimal;\\n}\\n.mly-prose :where(ul):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: disc;\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n padding-inline-start: 1.625em;\\n}\\n.mly-prose :where(ol > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::marker {\\n font-weight: 400;\\n color: var(--tw-prose-counters);\\n}\\n.mly-prose :where(ul > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::marker {\\n color: var(--tw-prose-bullets);\\n}\\n.mly-prose :where(dt):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n margin-top: 1.25em;\\n}\\n.mly-prose :where(hr):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-color: var(--tw-prose-hr);\\n border-top-width: 1px;\\n margin-top: 3em;\\n margin-bottom: 3em;\\n}\\n.mly-prose :where(blockquote):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 500;\\n font-style: italic;\\n color: var(--tw-prose-quotes);\\n border-inline-start-width: 0.25rem;\\n border-inline-start-color: var(--tw-prose-quote-borders);\\n quotes: \\\"\\\\201c\\\"\\\"\\\\201d\\\"\\\"\\\\2018\\\"\\\"\\\\2019\\\";\\n margin-top: 1.6em;\\n margin-bottom: 1.6em;\\n padding-inline-start: 1em;\\n}\\n.mly-prose :where(blockquote p:first-of-type):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::before {\\n content: open-quote;\\n}\\n.mly-prose :where(blockquote p:last-of-type):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::after {\\n content: close-quote;\\n}\\n.mly-prose :where(h1):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 800;\\n font-size: 2.25em;\\n margin-top: 0;\\n margin-bottom: 0.8888889em;\\n line-height: 1.1111111;\\n}\\n.mly-prose :where(h1 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 900;\\n color: inherit;\\n}\\n.mly-prose :where(h2):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 700;\\n font-size: 1.5em;\\n margin-top: 2em;\\n margin-bottom: 1em;\\n line-height: 1.3333333;\\n}\\n.mly-prose :where(h2 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 800;\\n color: inherit;\\n}\\n.mly-prose :where(h3):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n font-size: 1.25em;\\n margin-top: 1.6em;\\n margin-bottom: 0.6em;\\n line-height: 1.6;\\n}\\n.mly-prose :where(h3 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 700;\\n color: inherit;\\n}\\n.mly-prose :where(h4):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n margin-top: 1.5em;\\n margin-bottom: 0.5em;\\n line-height: 1.5;\\n}\\n.mly-prose :where(h4 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 700;\\n color: inherit;\\n}\\n.mly-prose :where(img):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(picture):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n display: block;\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(video):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(kbd):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 500;\\n font-family: inherit;\\n color: var(--tw-prose-kbd);\\n box-shadow: 0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);\\n font-size: 0.875em;\\n border-radius: 0.3125rem;\\n padding-top: 0.1875em;\\n padding-inline-end: 0.375em;\\n padding-bottom: 0.1875em;\\n padding-inline-start: 0.375em;\\n}\\n.mly-prose :where(code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-code);\\n font-weight: 600;\\n font-size: 0.875em;\\n}\\n.mly-prose :where(code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::before {\\n content: \\\"`\\\";\\n}\\n.mly-prose :where(code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::after {\\n content: \\\"`\\\";\\n}\\n.mly-prose :where(a code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(h1 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(h2 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n font-size: 0.875em;\\n}\\n.mly-prose :where(h3 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n font-size: 0.9em;\\n}\\n.mly-prose :where(h4 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(blockquote code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(thead th code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(pre):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-pre-code);\\n background-color: var(--tw-prose-pre-bg);\\n overflow-x: auto;\\n font-weight: 400;\\n font-size: 0.875em;\\n line-height: 1.7142857;\\n margin-top: 1.7142857em;\\n margin-bottom: 1.7142857em;\\n border-radius: 0.375rem;\\n padding-top: 0.8571429em;\\n padding-inline-end: 1.1428571em;\\n padding-bottom: 0.8571429em;\\n padding-inline-start: 1.1428571em;\\n}\\n.mly-prose :where(pre code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n background-color: transparent;\\n border-width: 0;\\n border-radius: 0;\\n padding: 0;\\n font-weight: inherit;\\n color: inherit;\\n font-size: inherit;\\n font-family: inherit;\\n line-height: inherit;\\n}\\n.mly-prose :where(pre code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::before {\\n content: none;\\n}\\n.mly-prose :where(pre code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::after {\\n content: none;\\n}\\n.mly-prose :where(table):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n width: 100%;\\n table-layout: auto;\\n margin-top: 2em;\\n margin-bottom: 2em;\\n font-size: 0.875em;\\n line-height: 1.7142857;\\n}\\n.mly-prose :where(thead):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-bottom-width: 1px;\\n border-bottom-color: var(--tw-prose-th-borders);\\n}\\n.mly-prose :where(thead th):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n vertical-align: bottom;\\n padding-inline-end: 0.5714286em;\\n padding-bottom: 0.5714286em;\\n padding-inline-start: 0.5714286em;\\n}\\n.mly-prose :where(tbody tr):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-bottom-width: 1px;\\n border-bottom-color: var(--tw-prose-td-borders);\\n}\\n.mly-prose :where(tbody tr:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-bottom-width: 0;\\n}\\n.mly-prose :where(tbody td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n vertical-align: baseline;\\n}\\n.mly-prose :where(tfoot):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-top-width: 1px;\\n border-top-color: var(--tw-prose-th-borders);\\n}\\n.mly-prose :where(tfoot td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n vertical-align: top;\\n}\\n.mly-prose :where(th, td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n text-align: start;\\n}\\n.mly-prose :where(figure > *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n.mly-prose :where(figcaption):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-captions);\\n font-size: 0.875em;\\n line-height: 1.4285714;\\n margin-top: 0.8571429em;\\n}\\n.mly-prose {\\n --tw-prose-body: #374151;\\n --tw-prose-headings: #111827;\\n --tw-prose-lead: #4b5563;\\n --tw-prose-links: #111827;\\n --tw-prose-bold: #111827;\\n --tw-prose-counters: #6b7280;\\n --tw-prose-bullets: #d1d5db;\\n --tw-prose-hr: #e5e7eb;\\n --tw-prose-quotes: #111827;\\n --tw-prose-quote-borders: #e5e7eb;\\n --tw-prose-captions: #6b7280;\\n --tw-prose-kbd: #111827;\\n --tw-prose-kbd-shadows: 17 24 39;\\n --tw-prose-code: #111827;\\n --tw-prose-pre-code: #e5e7eb;\\n --tw-prose-pre-bg: #1f2937;\\n --tw-prose-th-borders: #d1d5db;\\n --tw-prose-td-borders: #e5e7eb;\\n --tw-prose-invert-body: #d1d5db;\\n --tw-prose-invert-headings: #fff;\\n --tw-prose-invert-lead: #9ca3af;\\n --tw-prose-invert-links: #fff;\\n --tw-prose-invert-bold: #fff;\\n --tw-prose-invert-counters: #9ca3af;\\n --tw-prose-invert-bullets: #4b5563;\\n --tw-prose-invert-hr: #374151;\\n --tw-prose-invert-quotes: #f3f4f6;\\n --tw-prose-invert-quote-borders: #374151;\\n --tw-prose-invert-captions: #9ca3af;\\n --tw-prose-invert-kbd: #fff;\\n --tw-prose-invert-kbd-shadows: 255 255 255;\\n --tw-prose-invert-code: #fff;\\n --tw-prose-invert-pre-code: #d1d5db;\\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\\n --tw-prose-invert-th-borders: #4b5563;\\n --tw-prose-invert-td-borders: #374151;\\n font-size: 1rem;\\n line-height: 1.75;\\n}\\n.mly-prose :where(picture > img):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n.mly-prose :where(li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.5em;\\n margin-bottom: 0.5em;\\n}\\n.mly-prose :where(ol > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0.375em;\\n}\\n.mly-prose :where(ul > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0.375em;\\n}\\n.mly-prose :where(.mly-prose > ul > li p):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.75em;\\n margin-bottom: 0.75em;\\n}\\n.mly-prose :where(.mly-prose > ul > li > p:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n}\\n.mly-prose :where(.mly-prose > ul > li > p:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where(.mly-prose > ol > li > p:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n}\\n.mly-prose :where(.mly-prose > ol > li > p:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.75em;\\n margin-bottom: 0.75em;\\n}\\n.mly-prose :where(dl):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where(dd):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.5em;\\n padding-inline-start: 1.625em;\\n}\\n.mly-prose :where(hr + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(h2 + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(h3 + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(h4 + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(thead th:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0;\\n}\\n.mly-prose :where(thead th:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-end: 0;\\n}\\n.mly-prose :where(tbody td, tfoot td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-top: 0.5714286em;\\n padding-inline-end: 0.5714286em;\\n padding-bottom: 0.5714286em;\\n padding-inline-start: 0.5714286em;\\n}\\n.mly-prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0;\\n}\\n.mly-prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-end: 0;\\n}\\n.mly-prose :where(figure):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(.mly-prose > :first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(.mly-prose > :last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-bottom: 0;\\n}\\n.mly-pointer-events-none {\\n pointer-events: none;\\n}\\n.mly-absolute {\\n position: absolute;\\n}\\n.mly-relative {\\n position: relative;\\n}\\n.mly-inset-y-0 {\\n top: 0px;\\n bottom: 0px;\\n}\\n.mly-left-0 {\\n left: 0px;\\n}\\n.mly-left-1\\\\.5 {\\n left: 0.375rem;\\n}\\n.mly-left-2 {\\n left: 0.5rem;\\n}\\n.mly-right-0 {\\n right: 0px;\\n}\\n.mly-right-1 {\\n right: 0.25rem;\\n}\\n.mly-top-0 {\\n top: 0px;\\n}\\n.mly-top-8 {\\n top: 2rem;\\n}\\n.mly-isolate {\\n isolation: isolate;\\n}\\n.mly-z-0 {\\n z-index: 0;\\n}\\n.mly-z-10 {\\n z-index: 10;\\n}\\n.mly-z-20 {\\n z-index: 20;\\n}\\n.mly-z-50 {\\n z-index: 50;\\n}\\n.mly-z-\\\\[1\\\\] {\\n z-index: 1;\\n}\\n.mly-z-\\\\[9999\\\\] {\\n z-index: 9999;\\n}\\n.\\\\!mly-my-0 {\\n margin-top: 0px !important;\\n margin-bottom: 0px !important;\\n}\\n.-mly-mx-4 {\\n margin-left: -1rem;\\n margin-right: -1rem;\\n}\\n.mly--mx-1 {\\n margin-left: -0.25rem;\\n margin-right: -0.25rem;\\n}\\n.mly-mx-0 {\\n margin-left: 0px;\\n margin-right: 0px;\\n}\\n.mly-mx-0\\\\.5 {\\n margin-left: 0.125rem;\\n margin-right: 0.125rem;\\n}\\n.mly-mx-1\\\\.5 {\\n margin-left: 0.375rem;\\n margin-right: 0.375rem;\\n}\\n.mly-my-0\\\\.5 {\\n margin-top: 0.125rem;\\n margin-bottom: 0.125rem;\\n}\\n.mly-my-1 {\\n margin-top: 0.25rem;\\n margin-bottom: 0.25rem;\\n}\\n.mly-my-2 {\\n margin-top: 0.5rem;\\n margin-bottom: 0.5rem;\\n}\\n.mly-my-4 {\\n margin-top: 1rem;\\n margin-bottom: 1rem;\\n}\\n.\\\\!mly-mb-0 {\\n margin-bottom: 0px !important;\\n}\\n.\\\\!mly-mb-1\\\\.5 {\\n margin-bottom: 0.375rem !important;\\n}\\n.-mly-ms-px {\\n margin-inline-start: -1px;\\n}\\n.mly-mb-1\\\\.5 {\\n margin-bottom: 0.375rem;\\n}\\n.mly-mb-2 {\\n margin-bottom: 0.5rem;\\n}\\n.mly-mb-4 {\\n margin-bottom: 1rem;\\n}\\n.mly-ml-1 {\\n margin-left: 0.25rem;\\n}\\n.mly-ml-auto {\\n margin-left: auto;\\n}\\n.mly-mt-1 {\\n margin-top: 0.25rem;\\n}\\n.mly-mt-2 {\\n margin-top: 0.5rem;\\n}\\n.mly-mt-4 {\\n margin-top: 1rem;\\n}\\n.mly-block {\\n display: block;\\n}\\n.mly-inline-block {\\n display: inline-block;\\n}\\n.mly-flex {\\n display: flex;\\n}\\n.mly-inline-flex {\\n display: inline-flex;\\n}\\n.mly-grid {\\n display: grid;\\n}\\n.mly-inline-grid {\\n display: inline-grid;\\n}\\n.mly-aspect-square {\\n aspect-ratio: 1 / 1;\\n}\\n.\\\\!mly-size-5 {\\n width: 1.25rem !important;\\n height: 1.25rem !important;\\n}\\n.\\\\!mly-size-7 {\\n width: 1.75rem !important;\\n height: 1.75rem !important;\\n}\\n.mly-size-3 {\\n width: 0.75rem;\\n height: 0.75rem;\\n}\\n.mly-size-3\\\\.5 {\\n width: 0.875rem;\\n height: 0.875rem;\\n}\\n.mly-size-4 {\\n width: 1rem;\\n height: 1rem;\\n}\\n.mly-size-5 {\\n width: 1.25rem;\\n height: 1.25rem;\\n}\\n.mly-size-7 {\\n width: 1.75rem;\\n height: 1.75rem;\\n}\\n.mly-size-\\\\[15px\\\\] {\\n width: 15px;\\n height: 15px;\\n}\\n.mly-size-\\\\[var\\\\(--variable-icon-size\\\\)\\\\] {\\n width: var(--variable-icon-size);\\n height: var(--variable-icon-size);\\n}\\n.\\\\!mly-h-7 {\\n height: 1.75rem !important;\\n}\\n.mly-h-10 {\\n height: 2.5rem;\\n}\\n.mly-h-11 {\\n height: 2.75rem;\\n}\\n.mly-h-3 {\\n height: 0.75rem;\\n}\\n.mly-h-4 {\\n height: 1rem;\\n}\\n.mly-h-5 {\\n height: 1.25rem;\\n}\\n.mly-h-6 {\\n height: 1.5rem;\\n}\\n.mly-h-7 {\\n height: 1.75rem;\\n}\\n.mly-h-8 {\\n height: 2rem;\\n}\\n.mly-h-9 {\\n height: 2.25rem;\\n}\\n.mly-h-\\\\[2px\\\\] {\\n height: 2px;\\n}\\n.mly-h-auto {\\n height: auto;\\n}\\n.mly-h-full {\\n height: 100%;\\n}\\n.mly-h-px {\\n height: 1px;\\n}\\n.mly-max-h-52 {\\n max-height: 13rem;\\n}\\n.mly-max-h-\\\\[330px\\\\] {\\n max-height: 330px;\\n}\\n.mly-min-h-24 {\\n min-height: 6rem;\\n}\\n.mly-min-h-7 {\\n min-height: 1.75rem;\\n}\\n.\\\\!mly-w-full {\\n width: 100% !important;\\n}\\n.mly-w-10 {\\n width: 2.5rem;\\n}\\n.mly-w-3 {\\n width: 0.75rem;\\n}\\n.mly-w-32 {\\n width: 8rem;\\n}\\n.mly-w-36 {\\n width: 9rem;\\n}\\n.mly-w-4 {\\n width: 1rem;\\n}\\n.mly-w-40 {\\n width: 10rem;\\n}\\n.mly-w-5 {\\n width: 1.25rem;\\n}\\n.mly-w-52 {\\n width: 13rem;\\n}\\n.mly-w-6 {\\n width: 1.5rem;\\n}\\n.mly-w-64 {\\n width: 16rem;\\n}\\n.mly-w-7 {\\n width: 1.75rem;\\n}\\n.mly-w-72 {\\n width: 18rem;\\n}\\n.mly-w-9 {\\n width: 2.25rem;\\n}\\n.mly-w-96 {\\n width: 24rem;\\n}\\n.mly-w-\\\\[1\\\\.5px\\\\] {\\n width: 1.5px;\\n}\\n.mly-w-\\\\[160px\\\\] {\\n width: 160px;\\n}\\n.mly-w-\\\\[300px\\\\] {\\n width: 300px;\\n}\\n.mly-w-fit {\\n width: -moz-fit-content;\\n width: fit-content;\\n}\\n.mly-w-full {\\n width: 100%;\\n}\\n.mly-w-max {\\n width: -moz-max-content;\\n width: max-content;\\n}\\n.mly-w-px {\\n width: 1px;\\n}\\n.mly-min-w-0 {\\n min-width: 0px;\\n}\\n.mly-min-w-28 {\\n min-width: 7rem;\\n}\\n.mly-min-w-\\\\[260px\\\\] {\\n min-width: 260px;\\n}\\n.mly-min-w-\\\\[8rem\\\\] {\\n min-width: 8rem;\\n}\\n.mly-min-w-full {\\n min-width: 100%;\\n}\\n.mly-max-w-12 {\\n max-width: 3rem;\\n}\\n.mly-max-w-20 {\\n max-width: 5rem;\\n}\\n.mly-max-w-28 {\\n max-width: 7rem;\\n}\\n.mly-max-w-\\\\[260px\\\\] {\\n max-width: 260px;\\n}\\n.mly-max-w-max {\\n max-width: -moz-max-content;\\n max-width: max-content;\\n}\\n.mly-max-w-xs {\\n max-width: 20rem;\\n}\\n.mly-shrink-0 {\\n flex-shrink: 0;\\n}\\n.mly-grow {\\n flex-grow: 1;\\n}\\n.mly-table-fixed {\\n table-layout: fixed;\\n}\\n.mly-border-separate {\\n border-collapse: separate;\\n}\\n.mly-translate-x-full {\\n --tw-translate-x: 100%;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.mly-transform {\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n@keyframes mly-spin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n.mly-animate-spin {\\n animation: mly-spin 1s linear infinite;\\n}\\n.mly-cursor-default {\\n cursor: default;\\n}\\n.mly-cursor-grab {\\n cursor: grab;\\n}\\n.mly-cursor-pointer {\\n cursor: pointer;\\n}\\n.mly-select-none {\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n user-select: none;\\n}\\n.mly-appearance-none {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n}\\n.mly-grid-cols-2 {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n}\\n.mly-grid-cols-\\\\[12px_1fr\\\\] {\\n grid-template-columns: 12px 1fr;\\n}\\n.mly-flex-col {\\n flex-direction: column;\\n}\\n.mly-flex-wrap {\\n flex-wrap: wrap;\\n}\\n.mly-items-center {\\n align-items: center;\\n}\\n.mly-items-stretch {\\n align-items: stretch;\\n}\\n.mly-justify-start {\\n justify-content: flex-start;\\n}\\n.mly-justify-center {\\n justify-content: center;\\n}\\n.mly-justify-between {\\n justify-content: space-between;\\n}\\n.mly-gap-0\\\\.5 {\\n gap: 0.125rem;\\n}\\n.mly-gap-1 {\\n gap: 0.25rem;\\n}\\n.mly-gap-1\\\\.5 {\\n gap: 0.375rem;\\n}\\n.mly-gap-2 {\\n gap: 0.5rem;\\n}\\n.mly-gap-3 {\\n gap: 0.75rem;\\n}\\n.mly-gap-4 {\\n gap: 1rem;\\n}\\n.mly-gap-\\\\[1px\\\\] {\\n gap: 1px;\\n}\\n.mly-gap-\\\\[var\\\\(--variable-icon-gap\\\\)\\\\] {\\n gap: var(--variable-icon-gap);\\n}\\n.mly-space-x-0\\\\.5 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-x-reverse: 0;\\n margin-right: calc(0.125rem * var(--tw-space-x-reverse));\\n margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse)));\\n}\\n.mly-space-x-2 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-x-reverse: 0;\\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\\n}\\n.mly-space-y-1 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\\n}\\n.mly-overflow-hidden {\\n overflow: hidden;\\n}\\n.mly-overflow-y-auto {\\n overflow-y: auto;\\n}\\n.mly-scroll-smooth {\\n scroll-behavior: smooth;\\n}\\n.mly-truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.\\\\!mly-rounded {\\n border-radius: 0.25rem !important;\\n}\\n.\\\\!mly-rounded-full {\\n border-radius: 9999px !important;\\n}\\n.\\\\!mly-rounded-md {\\n border-radius: 0.375rem !important;\\n}\\n.\\\\!mly-rounded-none {\\n border-radius: 0px !important;\\n}\\n.mly-rounded {\\n border-radius: 0.25rem;\\n}\\n.mly-rounded-full {\\n border-radius: 9999px;\\n}\\n.mly-rounded-lg {\\n border-radius: 0.5rem;\\n}\\n.mly-rounded-md {\\n border-radius: 0.375rem;\\n}\\n.mly-rounded-none {\\n border-radius: 0px;\\n}\\n.mly-rounded-sm {\\n border-radius: 0.125rem;\\n}\\n.mly-rounded-xl {\\n border-radius: 0.75rem;\\n}\\n.mly-rounded-s-lg {\\n border-start-start-radius: 0.5rem;\\n border-end-start-radius: 0.5rem;\\n}\\n.mly-rounded-s-none {\\n border-start-start-radius: 0px;\\n border-end-start-radius: 0px;\\n}\\n.mly-rounded-t-lg {\\n border-top-left-radius: 0.5rem;\\n border-top-right-radius: 0.5rem;\\n}\\n.mly-border {\\n border-width: 1px;\\n}\\n.mly-border-0 {\\n border-width: 0px;\\n}\\n.mly-border-2 {\\n border-width: 2px;\\n}\\n.mly-border-\\\\[1\\\\.5px\\\\] {\\n border-width: 1.5px;\\n}\\n.mly-border-b {\\n border-bottom-width: 1px;\\n}\\n.mly-border-l-4 {\\n border-left-width: 4px;\\n}\\n.mly-border-t {\\n border-top-width: 1px;\\n}\\n.mly-border-none {\\n border-style: none;\\n}\\n.mly-border-\\\\[var\\\\(--button-var-border-color\\\\)\\\\] {\\n border-color: var(--button-var-border-color);\\n}\\n.mly-border-gray-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-gray-300 {\\n --tw-border-opacity: 1;\\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-gray-700 {\\n --tw-border-opacity: 1;\\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-rose-400 {\\n --tw-border-opacity: 1;\\n border-color: rgb(251 113 133 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-slate-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-white {\\n --tw-border-opacity: 1;\\n border-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\\n}\\n.\\\\!mly-bg-transparent {\\n background-color: transparent !important;\\n}\\n.mly-bg-\\\\[\\\\#efefef\\\\] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 239 239 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-200 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-900 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-red-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-red-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-300 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(253 164 175 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 241 242 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 63 94 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-soft-gray {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-soft-gray\\\\/40 {\\n background-color: rgb(244 245 246 / 0.4);\\n}\\n.mly-bg-soft-gray\\\\/60 {\\n background-color: rgb(244 245 246 / 0.6);\\n}\\n.mly-bg-transparent {\\n background-color: transparent;\\n}\\n.mly-bg-white {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-yellow-200 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 240 138 / var(--tw-bg-opacity, 1));\\n}\\n.mly-stroke-midnight-gray {\\n stroke: #333333;\\n}\\n.mly-stroke-\\\\[1\\\\.2\\\\] {\\n stroke-width: 1.2;\\n}\\n.mly-stroke-\\\\[1\\\\] {\\n stroke-width: 1;\\n}\\n.mly-stroke-\\\\[2\\\\.5\\\\] {\\n stroke-width: 2.5;\\n}\\n.\\\\!mly-p-0 {\\n padding: 0px !important;\\n}\\n.\\\\!mly-p-0\\\\.5 {\\n padding: 0.125rem !important;\\n}\\n.mly-p-0 {\\n padding: 0px;\\n}\\n.mly-p-0\\\\.5 {\\n padding: 0.125rem;\\n}\\n.mly-p-1 {\\n padding: 0.25rem;\\n}\\n.mly-p-3 {\\n padding: 0.75rem;\\n}\\n.mly-p-4 {\\n padding: 1rem;\\n}\\n.mly-px-0\\\\.5 {\\n padding-left: 0.125rem;\\n padding-right: 0.125rem;\\n}\\n.mly-px-1 {\\n padding-left: 0.25rem;\\n padding-right: 0.25rem;\\n}\\n.mly-px-1\\\\.5 {\\n padding-left: 0.375rem;\\n padding-right: 0.375rem;\\n}\\n.mly-px-2 {\\n padding-left: 0.5rem;\\n padding-right: 0.5rem;\\n}\\n.mly-px-2\\\\.5 {\\n padding-left: 0.625rem;\\n padding-right: 0.625rem;\\n}\\n.mly-px-3 {\\n padding-left: 0.75rem;\\n padding-right: 0.75rem;\\n}\\n.mly-px-4 {\\n padding-left: 1rem;\\n padding-right: 1rem;\\n}\\n.mly-px-8 {\\n padding-left: 2rem;\\n padding-right: 2rem;\\n}\\n.mly-px-\\\\[26px\\\\] {\\n padding-left: 26px;\\n padding-right: 26px;\\n}\\n.mly-px-\\\\[32px\\\\] {\\n padding-left: 32px;\\n padding-right: 32px;\\n}\\n.mly-py-0\\\\.5 {\\n padding-top: 0.125rem;\\n padding-bottom: 0.125rem;\\n}\\n.mly-py-1 {\\n padding-top: 0.25rem;\\n padding-bottom: 0.25rem;\\n}\\n.mly-py-1\\\\.5 {\\n padding-top: 0.375rem;\\n padding-bottom: 0.375rem;\\n}\\n.mly-py-2 {\\n padding-top: 0.5rem;\\n padding-bottom: 0.5rem;\\n}\\n.mly-py-3 {\\n padding-top: 0.75rem;\\n padding-bottom: 0.75rem;\\n}\\n.mly-py-\\\\[20px\\\\] {\\n padding-top: 20px;\\n padding-bottom: 20px;\\n}\\n.mly-pe-8 {\\n padding-inline-end: 2rem;\\n}\\n.mly-pl-1 {\\n padding-left: 0.25rem;\\n}\\n.mly-pl-4 {\\n padding-left: 1rem;\\n}\\n.mly-pl-7 {\\n padding-left: 1.75rem;\\n}\\n.mly-pl-8 {\\n padding-left: 2rem;\\n}\\n.mly-pl-\\\\[26px\\\\] {\\n padding-left: 26px;\\n}\\n.mly-pr-1\\\\.5 {\\n padding-right: 0.375rem;\\n}\\n.mly-pr-6 {\\n padding-right: 1.5rem;\\n}\\n.mly-pr-7 {\\n padding-right: 1.75rem;\\n}\\n.mly-ps-3 {\\n padding-inline-start: 0.75rem;\\n}\\n.mly-text-left {\\n text-align: left;\\n}\\n.mly-text-center {\\n text-align: center;\\n}\\n.mly-font-mono {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n}\\n.\\\\!mly-text-base {\\n font-size: 1rem !important;\\n line-height: 1.5rem !important;\\n}\\n.\\\\!mly-text-lg {\\n font-size: 1.125rem !important;\\n line-height: 1.75rem !important;\\n}\\n.mly-text-\\\\[10px\\\\] {\\n font-size: 10px;\\n}\\n.mly-text-\\\\[13px\\\\] {\\n font-size: 13px;\\n}\\n.mly-text-sm {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n.mly-text-xs {\\n font-size: 0.75rem;\\n line-height: 1rem;\\n}\\n.mly-font-medium {\\n font-weight: 500;\\n}\\n.mly-font-normal {\\n font-weight: 400;\\n}\\n.mly-font-semibold {\\n font-weight: 600;\\n}\\n.mly-uppercase {\\n text-transform: uppercase;\\n}\\n.mly-capitalize {\\n text-transform: capitalize;\\n}\\n.mly-tabular-nums {\\n --tw-numeric-spacing: tabular-nums;\\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\\n}\\n.mly-leading-none {\\n line-height: 1;\\n}\\n.mly-tracking-normal {\\n letter-spacing: 0em;\\n}\\n.mly-tracking-widest {\\n letter-spacing: 0.1em;\\n}\\n.mly-text-gray-400 {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-50 {\\n --tw-text-opacity: 1;\\n color: rgb(249 250 251 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-500 {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-600 {\\n --tw-text-opacity: 1;\\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-700 {\\n --tw-text-opacity: 1;\\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-900 {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-950 {\\n --tw-text-opacity: 1;\\n color: rgb(3 7 18 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-midnight-gray {\\n --tw-text-opacity: 1;\\n color: rgb(51 51 51 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-midnight-gray\\\\/60 {\\n color: rgb(51 51 51 / 0.6);\\n}\\n.mly-text-red-500 {\\n --tw-text-opacity: 1;\\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-red-600 {\\n --tw-text-opacity: 1;\\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-rose-600 {\\n --tw-text-opacity: 1;\\n color: rgb(225 29 72 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-rose-800 {\\n --tw-text-opacity: 1;\\n color: rgb(159 18 57 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-400 {\\n --tw-text-opacity: 1;\\n color: rgb(148 163 184 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-500 {\\n --tw-text-opacity: 1;\\n color: rgb(100 116 139 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-600 {\\n --tw-text-opacity: 1;\\n color: rgb(71 85 105 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-700 {\\n --tw-text-opacity: 1;\\n color: rgb(51 65 85 / var(--tw-text-opacity, 1));\\n}\\n.mly-no-underline {\\n text-decoration-line: none;\\n}\\n.mly-underline-offset-4 {\\n text-underline-offset: 4px;\\n}\\n.mly-antialiased {\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.mly-opacity-60 {\\n opacity: 0.6;\\n}\\n.mly-shadow {\\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-lg {\\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-md {\\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-none {\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-sm {\\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-outline-none {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.mly-ring-offset-white {\\n --tw-ring-offset-color: #fff;\\n}\\n.mly-drop-shadow-md {\\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.mly-transition-all {\\n transition-property: all;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.mly-transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.mly-transition-shadow {\\n transition-property: box-shadow;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.mly-ease-out {\\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n}\\n@keyframes enter {\\n from {\\n opacity: var(--tw-enter-opacity, 1);\\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\\n }\\n}\\n@keyframes exit {\\n to {\\n opacity: var(--tw-exit-opacity, 1);\\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\\n }\\n}\\n.mly-animate-in {\\n animation-name: enter;\\n animation-duration: 150ms;\\n --tw-enter-opacity: initial;\\n --tw-enter-scale: initial;\\n --tw-enter-rotate: initial;\\n --tw-enter-translate-x: initial;\\n --tw-enter-translate-y: initial;\\n}\\n.mly-fade-in-0 {\\n --tw-enter-opacity: 0;\\n}\\n.mly-zoom-in-95 {\\n --tw-enter-scale: .95;\\n}\\n.mly-ease-out {\\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-track {\\n background-color: var(--scrollbar-track);\\n border-radius: var(--scrollbar-track-radius);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-track:hover {\\n background-color: var(--scrollbar-track-hover, var(--scrollbar-track));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-track:active {\\n background-color: var(--scrollbar-track-active, var(--scrollbar-track-hover, var(--scrollbar-track)));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-thumb {\\n background-color: var(--scrollbar-thumb);\\n border-radius: var(--scrollbar-thumb-radius);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-thumb:hover {\\n background-color: var(--scrollbar-thumb-hover, var(--scrollbar-thumb));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-thumb:active {\\n background-color: var(--scrollbar-thumb-active, var(--scrollbar-thumb-hover, var(--scrollbar-thumb)));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-corner {\\n background-color: var(--scrollbar-corner);\\n border-radius: var(--scrollbar-corner-radius);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-corner:hover {\\n background-color: var(--scrollbar-corner-hover, var(--scrollbar-corner));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-corner:active {\\n background-color: var(--scrollbar-corner-active, var(--scrollbar-corner-hover, var(--scrollbar-corner)));\\n}\\n.mly-scrollbar-thin {\\n scrollbar-width: thin;\\n scrollbar-color: var(--scrollbar-thumb, initial) var(--scrollbar-track, initial);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar {\\n display: block;\\n width: 8px;\\n height: 8px;\\n}\\n.mly-scrollbar-track-transparent {\\n --scrollbar-track: transparent !important;\\n}\\n.mly-scrollbar-thumb-gray-200 {\\n --scrollbar-thumb: #e5e7eb !important;\\n}\\n.\\\\[text-align\\\\:revert-layer\\\\] {\\n text-align: revert-layer;\\n}\\n.file\\\\:mly-border-0::file-selector-button {\\n border-width: 0px;\\n}\\n.file\\\\:mly-bg-transparent::file-selector-button {\\n background-color: transparent;\\n}\\n.file\\\\:mly-text-sm::file-selector-button {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n.file\\\\:mly-font-medium::file-selector-button {\\n font-weight: 500;\\n}\\n.placeholder\\\\:mly-text-gray-400::-moz-placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:mly-text-gray-400::placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:mly-text-gray-500::-moz-placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:mly-text-gray-500::placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.mly-peer:disabled ~ .peer-disabled\\\\:mly-opacity-50 {\\n opacity: 0.5;\\n}\\n.data-\\\\[disabled\\\\]\\\\:mly-pointer-events-none[data-disabled] {\\n pointer-events: none;\\n}\\n.data-\\\\[state\\\\=open\\\\]\\\\:mly-bg-rose-100[data-state=open] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));\\n}\\n.data-\\\\[state\\\\=open\\\\]\\\\:mly-bg-soft-gray[data-state=open] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.data-\\\\[state\\\\=true\\\\]\\\\:mly-bg-soft-gray[data-state=true] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.data-\\\\[state\\\\=true\\\\]\\\\:mly-text-gray-900[data-state=true] {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.data-\\\\[disabled\\\\]\\\\:mly-opacity-50[data-disabled] {\\n opacity: 0.5;\\n}\\n.hover\\\\:mly-bg-gray-100:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-gray-100\\\\/80:hover {\\n background-color: rgb(243 244 246 / 0.8);\\n}\\n.hover\\\\:mly-bg-red-200:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-red-500\\\\/90:hover {\\n background-color: rgb(239 68 68 / 0.9);\\n}\\n.hover\\\\:mly-bg-rose-100:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-soft-gray:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-soft-gray\\\\/60:hover {\\n background-color: rgb(244 245 246 / 0.6);\\n}\\n.hover\\\\:mly-text-black:hover {\\n --tw-text-opacity: 1;\\n color: rgb(0 0 0 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:mly-text-gray-900:hover {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:mly-text-midnight-gray:hover {\\n --tw-text-opacity: 1;\\n color: rgb(51 51 51 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:mly-underline:hover {\\n text-decoration-line: underline;\\n}\\n.focus\\\\:mly-z-10:focus {\\n z-index: 10;\\n}\\n.focus\\\\:mly-bg-gray-100:focus {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.focus\\\\:mly-bg-red-200:focus {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1));\\n}\\n.focus\\\\:mly-bg-soft-gray:focus {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.focus\\\\:mly-outline-none:focus {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus\\\\:mly-ring-1:focus {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus\\\\:mly-ring-midnight-gray\\\\/50:focus {\\n --tw-ring-color: rgb(51 51 51 / 0.5);\\n}\\n.focus-visible\\\\:mly-relative:focus-visible {\\n position: relative;\\n}\\n.focus-visible\\\\:mly-z-10:focus-visible {\\n z-index: 10;\\n}\\n.focus-visible\\\\:mly-border-gray-400:focus-visible {\\n --tw-border-opacity: 1;\\n border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));\\n}\\n.focus-visible\\\\:mly-outline-none:focus-visible {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus-visible\\\\:mly-ring-2:focus-visible {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus-visible\\\\:mly-ring-gray-400:focus-visible {\\n --tw-ring-opacity: 1;\\n --tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1));\\n}\\n.focus-visible\\\\:mly-ring-offset-2:focus-visible {\\n --tw-ring-offset-width: 2px;\\n}\\n.active\\\\:mly-bg-soft-gray:active {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.disabled\\\\:mly-pointer-events-none:disabled {\\n pointer-events: none;\\n}\\n.disabled\\\\:mly-cursor-not-allowed:disabled {\\n cursor: not-allowed;\\n}\\n.disabled\\\\:mly-opacity-50:disabled {\\n opacity: 0.5;\\n}\\n.\\\\[\\\\&_svg\\\\]\\\\:mly-pointer-events-none svg {\\n pointer-events: none;\\n}\\n\")","'use client';\n\nimport { Extension, FocusPosition, Editor as TiptapEditor } from '@tiptap/core';\nimport { EditorContent, JSONContent, useEditor } from '@tiptap/react';\n\nimport { useRef } from 'react';\nimport { ColumnsBubbleMenu } from './components/column-menu/columns-bubble-menu';\nimport { ContentMenu } from './components/content-menu';\nimport { EditorMenuBar } from './components/editor-menu-bar';\nimport { ForBubbleMenu } from './components/for-menu/for-bubble-menu';\nimport { ImageBubbleMenu } from './components/image-menu/image-bubble-menu';\nimport { SectionBubbleMenu } from './components/section-menu/section-bubble-menu';\nimport { SpacerBubbleMenu } from './components/spacer-menu/spacer-bubble-menu';\nimport { TextBubbleMenu } from './components/text-menu/text-bubble-menu';\nimport { extensions as defaultExtensions } from './extensions';\nimport { DEFAULT_SLASH_COMMANDS } from './extensions/slash-command/default-slash-commands';\nimport {\n DEFAULT_PLACEHOLDER_URL,\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n DEFAULT_VARIABLES,\n MailyContextType,\n MailyProvider,\n} from './provider';\nimport { cn } from './utils/classname';\n\ntype ParitialMailContextType = Partial<MailyContextType>;\n\nexport type EditorProps = {\n contentHtml?: string;\n contentJson?: JSONContent;\n onUpdate?: (editor: TiptapEditor) => void;\n onCreate?: (editor: TiptapEditor) => void;\n extensions?: Extension[];\n config?: {\n hasMenuBar?: boolean;\n spellCheck?: boolean;\n wrapClassName?: string;\n toolbarClassName?: string;\n contentClassName?: string;\n bodyClassName?: string;\n autofocus?: FocusPosition;\n immediatelyRender?: boolean;\n };\n} & ParitialMailContextType;\n\nexport function Editor(props: EditorProps) {\n const {\n config: {\n wrapClassName = '',\n contentClassName = '',\n bodyClassName = '',\n hasMenuBar = true,\n spellCheck = false,\n autofocus = 'end',\n immediatelyRender = false,\n } = {},\n onCreate,\n onUpdate,\n extensions,\n contentHtml,\n contentJson,\n variables = DEFAULT_VARIABLES,\n blocks = DEFAULT_SLASH_COMMANDS,\n variableTriggerCharacter = DEFAULT_VARIABLE_TRIGGER_CHAR,\n renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION,\n placeholderUrl = DEFAULT_PLACEHOLDER_URL\n } = props;\n\n let formattedContent: any = null;\n if (contentJson) {\n formattedContent =\n contentJson?.type === 'doc'\n ? contentJson\n : {\n type: 'doc',\n content: contentJson,\n };\n } else if (contentHtml) {\n formattedContent = contentHtml;\n } else {\n formattedContent = {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [],\n },\n ],\n };\n }\n\n const menuContainerRef = useRef(null);\n const editor = useEditor({\n editorProps: {\n attributes: {\n class: cn(`mly-prose mly-w-full`, contentClassName),\n spellCheck: spellCheck ? 'true' : 'false',\n },\n handleDOMEvents: {\n keydown: (_view, event) => {\n // prevent default event listeners from firing when slash command is active\n if (['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key)) {\n const slashCommand = document.querySelector('#slash-command');\n if (slashCommand) {\n return true;\n }\n }\n },\n },\n },\n immediatelyRender,\n onCreate: ({ editor }) => {\n onCreate?.(editor);\n },\n onUpdate: ({ editor }) => {\n onUpdate?.(editor);\n },\n extensions: [\n ...defaultExtensions({\n variables,\n blocks,\n variableTriggerCharacter,\n }),\n ...(extensions || []),\n ],\n content: formattedContent,\n autofocus,\n });\n\n if (!editor) {\n return null;\n }\n\n return (\n <MailyProvider\n variables={variables}\n blocks={blocks}\n variableTriggerCharacter={variableTriggerCharacter}\n renderVariable={renderVariable}\n placeholderUrl={placeholderUrl}\n >\n <div\n className={cn('mly-editor mly-antialiased', wrapClassName)}\n ref={menuContainerRef}\n >\n {hasMenuBar && <EditorMenuBar config={props.config} editor={editor} />}\n <div\n className={cn(\n 'mly-mt-4 mly-rounded mly-border mly-bg-white mly-p-4',\n bodyClassName\n )}\n >\n <TextBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <ImageBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <SpacerBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <EditorContent editor={editor} />\n <SectionBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <ColumnsBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <ContentMenu editor={editor} />\n <ForBubbleMenu editor={editor} appendTo={menuContainerRef} />\n </div>\n </div>\n </MailyProvider>\n );\n}\n","import { BubbleMenu } from '@tiptap/react';\nimport { useCallback } from 'react';\nimport { getRenderContainer } from '../../utils/get-render-container';\nimport { sticky } from 'tippy.js';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { ColumnsBubbleMenuContent } from './columns-bubble-menu-content';\n\nexport function ColumnsBubbleMenu(props: EditorBubbleMenuProps) {\n const { appendTo, editor } = props;\n if (!editor) {\n return null;\n }\n\n const getReferenceClientRect = useCallback(() => {\n const renderContainer = getRenderContainer(editor!, 'columns');\n const rect =\n renderContainer?.getBoundingClientRect() ||\n new DOMRect(-1000, -1000, 0, 0);\n\n return rect;\n }, [editor]);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n if (\n isTextSelected(editor) ||\n editor.isActive('section') ||\n editor.isActive('for')\n ) {\n return false;\n }\n\n return editor.isActive('columns');\n },\n tippyOptions: {\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n appendTo: () => appendTo?.current,\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: 'auto',\n },\n pluginKey: 'columnsBubbleMenu',\n };\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <ColumnsBubbleMenuContent editor={editor} />\n </BubbleMenu>\n );\n}\n","import { Editor } from '@tiptap/react';\n\nexport function getRenderContainer(editor: Editor, nodeType: string) {\n const {\n view,\n state: {\n selection: { from },\n },\n } = editor;\n\n const elements = document.querySelectorAll('.has-focus');\n const elementCount = elements.length;\n const innermostNode = elements[elementCount - 1];\n const element = innermostNode;\n\n if (\n (element &&\n element.getAttribute('data-type') &&\n element.getAttribute('data-type') === nodeType) ||\n (element &&\n element.classList &&\n (element.classList.contains(nodeType) ||\n element.classList.contains(`node-${nodeType}`)))\n ) {\n return element;\n }\n\n const node = view.domAtPos(from).node as HTMLElement;\n let container: HTMLElement | null = node;\n\n if (!container.tagName) {\n container = node.parentElement;\n }\n\n while (\n container &&\n !(\n container.getAttribute('data-type') &&\n container.getAttribute('data-type') === nodeType\n ) &&\n !container.classList.contains(nodeType)\n ) {\n container = container.parentElement;\n }\n\n return container;\n}\n","import { isTextSelection } from '@tiptap/core';\nimport { Editor } from '@tiptap/react';\n\nexport function isTextSelected(editor: Editor) {\n const {\n state: {\n doc,\n selection,\n selection: { empty, from, to },\n },\n } = editor;\n\n // Sometime check for `empty` is not enough.\n // Doubleclick an empty paragraph returns a node size of 2.\n // So we check also for an empty text size.\n const isEmptyTextBlock =\n !doc.textBetween(from, to).length && isTextSelection(selection);\n\n if (empty || isEmptyTextBlock || !editor.isEditable) {\n return false;\n }\n\n return true;\n}\n","import { Editor } from '@tiptap/react';\nimport { Fragment, Node } from '@tiptap/pm/model';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { v4 as uuid } from 'uuid';\nimport { findParentNode } from '@tiptap/core';\nimport { DEFAULT_COLUMN_WIDTH } from '../nodes/columns/column';\n\nexport function getColumnCount(editor: Editor) {\n return getClosestNodeByName(editor, 'columns')?.node?.childCount || 0;\n}\n\nexport function getClosestNodeByName(editor: Editor, name: string) {\n const { state } = editor.view;\n return findParentNode((node) => node.type.name === name)(state.selection);\n}\n\nexport function addColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const calculatedWidth = +Number(100 / (columnsNode.childCount + 1)).toFixed(\n 2\n );\n const newColumn = state.schema.nodes.column.create(\n {\n width: calculatedWidth,\n columnId: uuid(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n columnsNode.content.forEach((child, _, index) => {\n if (\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId\n ) {\n activeColumnIndex = index;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n updatedContent.splice(activeColumnIndex + 1, 0, newColumn);\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, activeColumnIndex + 1)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function removeColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n // If there is only one column, remove the entire columns node\n if (columnsNode.childCount === 1) {\n const transaction = tr.delete(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize\n );\n dispatch(transaction);\n editor.view.focus();\n return;\n }\n\n const calculatedWidth = +Number(100 / (columnsNode.childCount - 1)).toFixed(\n 2\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n let isRemoved = false;\n columnsNode.content.forEach((child, _, index) => {\n const isActiveColumn =\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId;\n if (isActiveColumn && !isRemoved) {\n activeColumnIndex = index;\n isRemoved = true;\n return;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n const isLastColumn = activeColumnIndex === columnsNode.childCount - 1;\n\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, isLastColumn ? activeColumnIndex - 1 : activeColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function goToColumn(editor: Editor, type: 'next' | 'previous') {\n const columnsNode = getClosestNodeByName(editor, 'columns');\n const columnNode = getClosestNodeByName(editor, 'column');\n if (!columnsNode || !columnNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const cols = columnsNode.node;\n let currColumnIndex = 0;\n cols.content.forEach((child, _, index) => {\n if (\n child.eq(columnNode.node) &&\n child?.attrs?.columnId === columnNode.node?.attrs?.columnId\n ) {\n currColumnIndex = index;\n }\n });\n\n const nextColumnIndex =\n type === 'next' ? currColumnIndex + 1 : currColumnIndex - 1;\n // if the next column index is out of bounds, return\n if (nextColumnIndex < 0 || nextColumnIndex >= cols.childCount) {\n return false;\n }\n\n let nextColumnPos = columnsNode.pos;\n cols.content.forEach((child, _, index) => {\n if (index < nextColumnIndex) {\n nextColumnPos += child.nodeSize;\n }\n });\n\n const tr = state.tr.setTime(Date.now());\n const textSelection = TextSelection.near(tr.doc.resolve(nextColumnPos));\n tr.setSelection(textSelection);\n\n dispatch(tr);\n return true;\n}\n\nexport function updateColumnWidth(\n editor: Editor,\n index: number,\n width: string = 'auto'\n) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: i === index ? width : child?.attrs?.width,\n },\n child.content\n )\n );\n });\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n dispatch(transaction);\n return true;\n}\n\nexport function addColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n // If the index is out of bounds, append the column to the end\n // of the columns node\n const columnIndex = index < 0 ? columnsNode.childCount : index;\n // Keep the original width of the columns\n // and set the new column width to auto\n const { state } = editor.view;\n const newColumn = state.schema.nodes.column.create(\n {\n width: DEFAULT_COLUMN_WIDTH,\n columnId: uuid(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n // append the new column to the columns node\n // at the specified index\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(child);\n if (i === columnIndex) {\n updatedContent.push(newColumn);\n }\n });\n\n if (index === -1) {\n updatedContent.push(newColumn);\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = state.tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the new column\n // if the index is out of bounds, set the selection\n // to the last column\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, columnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n editor.view.dispatch(transaction);\n return true;\n}\n\nexport function removeColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n if (i !== index) {\n updatedContent.push(child);\n }\n });\n\n if (index === -1) {\n updatedContent.pop();\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the next column\n // if the index is out of bounds, set the selection\n // to the last column\n const nextColumnIndex =\n index === columnsNode.childCount - 1 ? index - 1 : index;\n const nextColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, nextColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(nextColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n return true;\n}\n\nexport function getColumnWidths(editor: Editor): {\n id: string;\n width: string;\n}[] {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return [];\n }\n\n const columnsWidth: { id: string; width: string }[] = [];\n columnsNode.content.forEach((child) => {\n const { columnId, width } = child.attrs;\n columnsWidth.push({ id: columnId, width });\n });\n\n return columnsWidth;\n}\n","import { Command } from '@tiptap/core';\n\nexport function updateAttribute(\n type: string,\n attr: string,\n value: any\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n tr.setNodeAttribute(lastPos, attr, value);\n }\n }\n\n return true;\n });\n}\n\nexport function updateAttributes(\n type: string,\n attrs: Record<string, any>\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n const node = state.doc.nodeAt(lastPos);\n if (node) {\n tr.setNodeMarkup(lastPos, null, {\n ...node.attrs,\n ...attrs,\n });\n } else {\n for (const [key, value] of Object.entries(attrs)) {\n tr.setNodeAttribute(lastPos, key, value);\n }\n }\n }\n\n if (type === 'button') {\n tr.setSelection(tr.selection);\n }\n }\n\n return true;\n });\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { Node, mergeAttributes } from '@tiptap/core';\nimport { v4 as uuid } from 'uuid';\n\nexport const DEFAULT_COLUMN_WIDTH = 'auto';\n\nexport type AllowedColumnVerticalAlign = 'top' | 'middle' | 'bottom';\nexport const DEFAULT_COLUMN_VERTICAL_ALIGN: AllowedColumnVerticalAlign = 'top';\n\ninterface ColumnAttributes {\n verticalAlign: AllowedColumnVerticalAlign;\n backgroundColor: string;\n borderRadius: number;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n column: {\n updateColumn: (attrs: Partial<ColumnAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnExtension = Node.create({\n name: 'column',\n content: 'block+',\n isolating: true,\n\n addAttributes() {\n return {\n columnId: {\n default: null,\n parseHTML: (element) =>\n element.getAttribute('data-column-id') || uuid(),\n renderHTML: (attributes) => {\n if (!attributes.columnId) {\n return {\n 'data-column-id': uuid(),\n };\n }\n\n return {\n 'data-column-id': attributes.columnId,\n };\n },\n },\n width: {\n default: DEFAULT_COLUMN_WIDTH,\n parseHTML: (element) =>\n element.style.width.replace(/['\"]+/g, '') || DEFAULT_COLUMN_WIDTH,\n renderHTML: (attributes) => {\n if (!attributes.width || attributes.width === DEFAULT_COLUMN_WIDTH) {\n return {};\n }\n\n return {\n style: `width: ${attributes.width}%;max-width:${attributes.width}%`,\n };\n },\n },\n verticalAlign: {\n default: DEFAULT_COLUMN_VERTICAL_ALIGN,\n parseHTML: (element) => element?.style?.verticalAlign || 'top',\n renderHTML: (attributes) => {\n const { verticalAlign } = attributes;\n if (\n !verticalAlign ||\n verticalAlign === DEFAULT_COLUMN_VERTICAL_ALIGN\n ) {\n return {};\n }\n\n if (verticalAlign === 'middle') {\n return {\n style: `display: flex;flex-direction: column;justify-content: center;`,\n };\n } else if (verticalAlign === 'bottom') {\n return {\n style: `display: flex;flex-direction: column;justify-content: flex-end;`,\n };\n }\n },\n },\n };\n },\n\n addCommands() {\n return {\n updateColumn: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'column',\n class: 'hide-scrollbars',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"column\"]',\n },\n ];\n },\n});\n","import { getColumnCount, getColumnWidths } from '@/editor/utils/columns';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useColumnsState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n isSectionActive: ctx.editor.isActive('section'),\n isColumnActive: ctx.editor.isActive('column'),\n\n currentVerticalAlignment:\n ctx.editor.getAttributes('column')?.verticalAlign || 'top',\n\n currentShowIfKey: ctx.editor.getAttributes('columns')?.showIfKey || '',\n\n columnsCount: getColumnCount(ctx.editor),\n columnWidths: getColumnWidths(ctx.editor).map((c) => c.width),\n\n currentColumnsGap: ctx.editor.getAttributes('columns')?.gap || 0,\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n prefix: 'mly-',\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@/editor/utils/classname';\n\ntype Props = {\n type?: 'horizontal' | 'vertical';\n className?: string;\n};\n\nexport function Divider(props: Props) {\n const { type = 'vertical', className } = props;\n\n return (\n <div\n className={cn(\n 'mly-shrink-0 mly-bg-gray-200',\n type === 'vertical' ? 'mly-mx-0.5 mly-w-px' : 'mly-my-0.5 mly-h-px',\n className\n )}\n />\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '@/editor/utils/classname';\n\n// Explicit type annotations to avoid TS2742 errors\nconst TooltipProvider: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>\n> = TooltipPrimitive.Provider;\n\nconst Tooltip: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>\n> = TooltipPrimitive.Root;\n\nconst TooltipTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>\n> = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'mly-z-50 mly-overflow-hidden mly-rounded-md mly-border mly-bg-white mly-px-2 mly-py-1 mly-text-xs mly-animate-in mly-fade-in-0 mly-zoom-in-95',\n className\n )}\n {...props}\n />\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n>;\n\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import {\n AlignVerticalDistributeCenter,\n AlignVerticalDistributeEnd,\n AlignVerticalDistributeStart,\n} from 'lucide-react';\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { AllowedColumnVerticalAlign } from '../nodes/columns/column';\n\ntype VerticalAlignmentSwitchProps = {\n alignment: AllowedColumnVerticalAlign;\n onAlignmentChange: (alignment: AllowedColumnVerticalAlign) => void;\n};\n\nexport function VerticalAlignmentSwitch(props: VerticalAlignmentSwitchProps) {\n const { alignment = 'top', onAlignmentChange } = props;\n\n const activeAlignment = {\n top: {\n icon: AlignVerticalDistributeStart,\n tooltip: 'Align Top',\n onClick: () => {\n onAlignmentChange('middle');\n },\n },\n middle: {\n icon: AlignVerticalDistributeCenter,\n tooltip: 'Align Center',\n onClick: () => {\n onAlignmentChange('bottom');\n },\n },\n bottom: {\n icon: AlignVerticalDistributeEnd,\n tooltip: 'Align Bottom',\n onClick: () => {\n onAlignmentChange('top');\n },\n },\n }[alignment];\n\n return (\n <BubbleMenuButton\n icon={activeAlignment.icon}\n tooltip={activeAlignment.tooltip}\n command={activeAlignment.onClick}\n />\n );\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../utils/classname';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?:\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'\n | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst BaseButton = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : 'button';\n const baseClass =\n 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 focus-visible:mly-relative focus-visible:mly-z-10 disabled:mly-opacity-50 ';\n const variantClasses = {\n default: 'mly-bg-gray-900 mly-text-gray-50 hover:mly-bg-soft-gray',\n destructive: 'mly-bg-red-500 mly-text-gray-50 hover:mly-bg-red-500/90',\n outline:\n 'mly-border mly-border-gray-200 mly-bg-white hover:mly-bg-gray-100 hover:mly-text-gray-900',\n secondary: 'mly-bg-gray-100 mly-text-gray-900 hover:mly-bg-gray-100/80',\n ghost:\n 'hover:mly-bg-soft-gray bg-transparent hover:mly-text-gray-900 data-[state=true]:mly-bg-soft-gray data-[state=true]:mly-text-gray-900',\n link: 'mly-text-gray-900 mly-underline-offset-4 hover:mly-underline',\n };\n const sizeClasses = {\n default: 'mly-h-10 mly-px-4 mly-py-2',\n sm: 'mly-h-9 mly-rounded-md mly-px-3',\n lg: 'mly-h-11 mly-rounded-md mly-px-8',\n icon: 'mly-h-10 mly-w-10',\n };\n\n const classes = cn(\n 'mly-editor',\n baseClass,\n variantClasses[variant],\n sizeClasses[size],\n className\n );\n\n return <Comp className={classes} ref={ref} {...props} />;\n }\n);\n\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\n","import { BaseButton } from '@/editor/components/base-button';\nimport { cn } from '@/editor/utils/classname';\nimport { BubbleMenuItem } from './text-menu/text-bubble-menu';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\nexport function BubbleMenuButton(item: BubbleMenuItem) {\n const { tooltip } = item;\n\n const content = (\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n {...(item.command ? { onClick: item.command } : {})}\n data-state={item?.isActive?.()}\n className={cn(\n '!mly-size-7 mly-px-2.5 disabled:mly-cursor-not-allowed',\n item?.className\n )}\n type=\"button\"\n disabled={item.disbabled}\n >\n {item.icon ? (\n <item.icon\n className={cn(\n 'mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]',\n item?.iconClassName\n )}\n />\n ) : (\n <span\n className={cn(\n 'mly-text-sm mly-font-medium mly-text-slate-600',\n item?.nameClassName\n )}\n >\n {item.name}\n </span>\n )}\n </BaseButton>\n );\n\n if (tooltip) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n }\n\n return content;\n}\n","import { Braces, ChevronUp, CornerDownLeft, Eye } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { useRef, useState } from 'react';\nimport { cn } from '../utils/classname';\nimport { useEffect } from 'react';\nimport { InputAutocomplete } from './ui/input-autocomplete';\nimport { DEFAULT_RENDER_VARIABLE_FUNCTION, useMailyContext } from '../provider';\nimport { useMemo } from 'react';\nimport { ForExtension } from '../nodes/for/for';\nimport { memo } from 'react';\nimport { getClosestNodeByName } from '../utils/columns';\nimport { Editor } from '@tiptap/core';\nimport { processVariables } from '../utils/variable';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\ntype ShowPopoverProps = {\n showIfKey?: string;\n onShowIfKeyValueChange?: (when: string) => void;\n\n editor: Editor;\n};\n\nfunction _ShowPopover(props: ShowPopoverProps) {\n const { showIfKey = '', onShowIfKeyValueChange, editor } = props;\n\n const { variables = [], renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n const [isUpdatingKey, setIsUpdatingKey] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const autoCompleteOptions = useMemo(() => {\n return processVariables(variables, {\n query: showIfKey || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, showIfKey, editor]);\n\n const isValidWhenKey = showIfKey || autoCompleteOptions.includes(showIfKey);\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (open) {\n return;\n }\n\n setIsUpdatingKey(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly-flex mly-items-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2',\n showIfKey &&\n 'mly-bg-rose-100 mly-text-rose-800 data-[state=open]:mly-bg-rose-100 hover:mly-bg-rose-100'\n )}\n >\n <Eye className=\"mly-h-4 mly-w-4 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Show block conditionally</TooltipContent>\n </Tooltip>\n <PopoverContent\n className=\"mly-flex mly-w-max mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"end\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <span className=\"mly-flex mly-items-center mly-px-1.5 mly-text-sm mly-leading-none\">\n Show if\n </span>\n {!isUpdatingKey && (\n <button\n onClick={() => {\n setIsUpdatingKey(true);\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: showIfKey,\n valid: !!isValidWhenKey,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n {isUpdatingKey && (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setIsUpdatingKey(false);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setIsUpdatingKey(false);\n }\n }}\n >\n <InputAutocomplete\n value={showIfKey || ''}\n onValueChange={(value) => {\n onShowIfKeyValueChange?.(value);\n }}\n onOutsideClick={() => {\n setIsUpdatingKey(false);\n }}\n onSelectOption={(value) => {\n onShowIfKeyValueChange?.(value);\n setIsUpdatingKey(false);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={inputRef}\n />\n </form>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport const ShowPopover = memo(_ShowPopover);\n","'use client';\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\n\nimport { cn } from '../utils/classname';\n\nconst Popover: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>\n> = PopoverPrimitive.Root;\n\nconst PopoverTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger>\n> = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'mly-z-[9999] mly-w-72 mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-p-4 mly-text-gray-950 mly-shadow-md mly-outline-none',\n 'mly-editor',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof PopoverPrimitive.Content>>\n>;\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import { Variable } from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n Braces,\n CornerDownLeftIcon,\n} from 'lucide-react';\nimport {\n useImperativeHandle,\n forwardRef,\n useState,\n useEffect,\n useRef,\n} from 'react';\n\ntype VariablePopoverProps = {\n items: Variable[];\n onSelectItem: (item: Variable) => void;\n};\n\nexport type VariablePopoverRef = {\n moveUp: () => void;\n moveDown: () => void;\n select: () => void;\n};\n\nexport const VariablePopover = forwardRef<\n VariablePopoverRef,\n VariablePopoverProps\n>((props, ref) => {\n const { items, onSelectItem } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const scrollSelectedIntoView = (index: number) => {\n const container = scrollContainerRef.current;\n const selectedItem = itemRefs.current[index];\n\n if (!container || !selectedItem) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const itemRect = selectedItem.getBoundingClientRect();\n\n const padding = 4;\n if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom + padding;\n } else if (itemRect.top < containerRect.top) {\n container.scrollTop += itemRect.top - containerRect.top - padding;\n }\n };\n\n useEffect(() => {\n setSelectedIndex(0);\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n itemRefs.current = items.map(() => null);\n }, [items]);\n\n useEffect(() => {\n scrollSelectedIntoView(selectedIndex);\n }, [selectedIndex]);\n\n useImperativeHandle(ref, () => ({\n moveUp: () => {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n },\n moveDown: () => {\n setSelectedIndex((selectedIndex + 1) % items.length);\n },\n select: () => {\n const item = items[selectedIndex];\n if (!item) {\n return;\n }\n\n onSelectItem(item);\n },\n }));\n\n return (\n <div className=\"mly-z-50 mly-w-64 mly-rounded-lg mly-border mly-border-gray-200 mly-bg-white mly-shadow-md mly-transition-all\">\n <div className=\"mly-flex mly-items-center mly-justify-between mly-gap-2 mly-border-b mly-border-gray-200 mly-bg-soft-gray/40 mly-px-1 mly-py-1.5 mly-text-gray-500\">\n <span className=\"mly-text-xs mly-uppercase\">Variables</span>\n <VariableIcon>\n <Braces className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n </div>\n\n <div\n ref={scrollContainerRef}\n className=\"mly-max-h-52 mly-overflow-y-auto mly-scrollbar-thin mly-scrollbar-track-transparent mly-scrollbar-thumb-gray-200\"\n >\n <div className=\"mly-flex mly-w-fit mly-min-w-full mly-flex-col mly-gap-0.5 mly-p-1\">\n {items?.length ? (\n items?.map((item, index: number) => (\n <button\n key={index}\n ref={(el) => (itemRefs.current[index] = el)}\n onClick={() => onSelectItem(item)}\n className={cn(\n 'mly-flex mly-w-fit mly-min-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-font-mono mly-text-sm mly-text-gray-900 hover:mly-bg-soft-gray',\n index === selectedIndex ? 'mly-bg-soft-gray' : 'mly-bg-white'\n )}\n >\n <Braces className=\"mly-size-3 mly-stroke-[2.5] mly-text-rose-600\" />\n {item.name}\n </button>\n ))\n ) : (\n <div className=\"mly-flex mly-h-7 mly-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-font-mono mly-text-[13px] mly-text-gray-900 hover:mly-bg-soft-gray\">\n No result\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mly-flex mly-items-center mly-justify-between mly-gap-2 mly-border-t mly-border-gray-200 mly-px-1 mly-py-1.5 mly-text-gray-500\">\n <div className=\"mly-flex mly-items-center mly-gap-1\">\n <VariableIcon>\n <ArrowDownIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n <VariableIcon>\n <ArrowUpIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n <span className=\"mly-text-xs mly-text-gray-500\">Navigate</span>\n </div>\n <VariableIcon>\n <CornerDownLeftIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n </div>\n </div>\n );\n});\n\ntype VariableIconProps = {\n className?: string;\n children: React.ReactNode;\n};\n\nfunction VariableIcon(props: VariableIconProps) {\n const { className, children } = props;\n\n return (\n <div\n className={cn(\n 'mly-flex mly-size-5 mly-items-center mly-justify-center mly-rounded-md mly-border',\n className\n )}\n >\n {children}\n </div>\n );\n}\n","export const AUTOCOMPLETE_PASSWORD_MANAGERS_OFF = Object.freeze({\n autoComplete: 'off',\n 'data-1p-ignore': true,\n 'data-form-type': 'other',\n});\n","import { useCallback } from 'react';\nimport { useEffect } from 'react';\nimport { RefObject } from 'react';\n\nexport function useOutsideClick(\n ref: RefObject<HTMLElement>,\n callback: () => void\n) {\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n callback();\n }\n },\n [ref, callback]\n );\n\n useEffect(() => {\n document.addEventListener('mousedown', handleClick);\n document.addEventListener('touchstart', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n document.removeEventListener('touchstart', handleClick);\n };\n }, [handleClick]);\n}\n","import {\n VariablePopover,\n VariablePopoverRef,\n} from '@/editor/nodes/variable/variable-popover';\nimport { useMailyContext } from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { useOutsideClick } from '@/editor/utils/use-outside-click';\nimport { CornerDownLeft } from 'lucide-react';\nimport { forwardRef, HTMLAttributes, useMemo, useState, useRef } from 'react';\n\ntype InputAutocompleteProps = HTMLAttributes<HTMLInputElement> & {\n value: string;\n onValueChange: (value: string) => void;\n\n autoCompleteOptions?: string[];\n onSelectOption?: (option: string) => void;\n\n onOutsideClick?: () => void;\n triggerChar?: string;\n placeholder?: string;\n};\n\nexport const InputAutocomplete = forwardRef<\n HTMLInputElement,\n InputAutocompleteProps\n>((props, ref) => {\n const {\n value = '',\n onValueChange,\n className,\n onOutsideClick,\n onSelectOption,\n autoCompleteOptions = [],\n triggerChar = '',\n ...inputProps\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<VariablePopoverRef>(null);\n\n useOutsideClick(containerRef, () => {\n onOutsideClick?.();\n });\n\n const isTriggeringVariable = value.startsWith(triggerChar);\n\n return (\n <div className={cn('mly-relative')} ref={containerRef}>\n <label className=\"mly-relative\">\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n placeholder=\"e.g. items\"\n type=\"text\"\n {...inputProps}\n ref={ref}\n value={value}\n onChange={(e) => {\n onValueChange(e.target.value);\n }}\n className={cn(\n 'mly-h-7 mly-w-40 mly-rounded-md mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray hover:mly-bg-soft-gray focus:mly-bg-soft-gray focus:mly-outline-none',\n className\n )}\n onKeyDown={(e) => {\n if (!popoverRef.current || !isTriggeringVariable) {\n return;\n }\n const { moveUp, moveDown, select } = popoverRef.current;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n moveDown();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n moveUp();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n spellCheck={false}\n />\n <div className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center\">\n <CornerDownLeft className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n </label>\n\n {isTriggeringVariable && (\n <div className=\"mly-absolute mly-left-0 mly-top-8\">\n <VariablePopover\n items={autoCompleteOptions.map((option) => {\n return {\n name: option,\n };\n })}\n onSelectItem={(item) => {\n onSelectOption?.(item.name);\n }}\n ref={popoverRef}\n />\n </div>\n )}\n </div>\n );\n});\n\nInputAutocomplete.displayName = 'InputAutocomplete';\n","'use client';\n\nimport { BlockItem } from '@/blocks/types';\nimport { createContext, PropsWithChildren, useContext } from 'react';\nimport { DEFAULT_SLASH_COMMANDS } from './extensions/slash-command/default-slash-commands';\nimport { Editor } from '@tiptap/core';\nimport { DefaultRenderVariable } from './nodes/variable/variable-view';\n\nexport type Variable = {\n name: string;\n // Default is true\n required?: boolean;\n // default is true\n valid?: boolean;\n};\n\nexport type VariableFunctionOptions = {\n query: string;\n from: 'content-variable' | 'bubble-variable' | 'for-variable';\n editor: Editor;\n};\n\nexport type VariablesFunction = (\n opts: VariableFunctionOptions\n) => Array<Variable>;\n\nexport type Variables = Array<Variable> | VariablesFunction;\n\nexport type RenderVariableOptions = {\n variable: Variable;\n fallback?: string;\n editor: Editor;\n from: 'content-variable' | 'bubble-variable' | 'button-variable';\n};\n\nexport type RenderVariableFunction = (\n opts: RenderVariableOptions\n) => JSX.Element | null;\n\nexport const DEFAULT_PLACEHOLDER_URL = 'maily.to/'\n\nexport const DEFAULT_VARIABLE_TRIGGER_CHAR = '@';\nexport const DEFAULT_VARIABLES: Variables = [];\nexport const DEFAULT_RENDER_VARIABLE_FUNCTION: RenderVariableFunction =\n DefaultRenderVariable;\n\nexport type MailyContextType = {\n placeholderUrl?: string\n variableTriggerCharacter?: string;\n variables?: Variables;\n blocks?: BlockItem[];\n renderVariable?: RenderVariableFunction;\n};\n\nexport const MailyContext = createContext<MailyContextType>({\n placeholderUrl: DEFAULT_PLACEHOLDER_URL,\n variableTriggerCharacter: DEFAULT_VARIABLE_TRIGGER_CHAR,\n variables: DEFAULT_VARIABLES,\n blocks: DEFAULT_SLASH_COMMANDS,\n renderVariable: DEFAULT_RENDER_VARIABLE_FUNCTION,\n});\n\ntype MailyProviderProps = PropsWithChildren<MailyContextType>;\n\nexport function MailyProvider(props: MailyProviderProps) {\n const { children, ...defaultValues } = props;\n\n if (defaultValues.variableTriggerCharacter === '') {\n throw new Error('variableTriggerCharacter cannot be an empty string');\n }\n\n return (\n <MailyContext.Provider value={defaultValues}>\n {children}\n </MailyContext.Provider>\n );\n}\n\nexport function useMailyContext() {\n const values = useContext(MailyContext);\n if (!values) {\n throw new Error('Missing MailyContext.Provider in the component tree');\n }\n\n return values;\n}\n","import type { BlockItem } from './types';\nimport { MousePointer, ArrowUpRightSquare } from 'lucide-react';\n\nexport const button: BlockItem = {\n title: 'Button',\n description: 'Add a call to action button to email.',\n searchTerms: ['link', 'button', 'cta'],\n icon: <MousePointer className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setButton().run();\n },\n};\n\nexport const linkCard: BlockItem = {\n title: 'Link Card',\n description: 'Add a link card to email.',\n searchTerms: ['link', 'button', 'image'],\n icon: <ArrowUpRightSquare className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLinkCard().run();\n },\n};\n","import type { BlockItem } from './types';\nimport { ImageIcon } from 'lucide-react';\n\nexport const image: BlockItem = {\n title: 'Image',\n description: 'Full width image',\n searchTerms: ['image'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setImage({ src: '' }).run();\n },\n};\n\nexport const logo: BlockItem = {\n title: 'Logo',\n description: 'Add your brand logo',\n searchTerms: ['image', 'logo'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLogoImage({ src: '' }).run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n ColumnsIcon,\n Repeat2,\n MoveVertical,\n RectangleHorizontal,\n Minus,\n} from 'lucide-react';\n\nexport const columns: BlockItem = {\n title: 'Columns',\n description: 'Add columns to email.',\n searchTerms: ['layout', 'columns'],\n icon: <ColumnsIcon className=\"mly-h-4 mly-w-4\" />,\n shouldBeHidden: (editor) => {\n return editor.isActive('columns');\n },\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setColumns()\n .focus(editor.state.selection.head - 2)\n .run();\n },\n};\n\nexport const section: BlockItem = {\n title: 'Section',\n description: 'Add a section to email.',\n searchTerms: ['layout', 'section'],\n icon: <RectangleHorizontal className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSection().run();\n },\n};\n\nexport const forLoop: BlockItem = {\n title: 'For',\n description: 'Loop over an array of items.',\n searchTerms: ['for', 'loop'],\n icon: <Repeat2 className=\"mly-h-4 mly-w-4\" />,\n shouldBeHidden: (editor) => {\n return editor.isActive('for');\n },\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setFor().run();\n },\n};\n\nexport const spacer: BlockItem = {\n title: 'Spacer',\n description: 'Add space between blocks.',\n searchTerms: ['space', 'gap', 'divider'],\n icon: <MoveVertical className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSpacer({ height: 'sm' }).run();\n },\n};\n\nexport const divider: BlockItem = {\n title: 'Divider',\n description: 'Add a horizontal divider.',\n searchTerms: ['divider', 'line'],\n icon: <Minus className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHorizontalRule().run();\n },\n};\n","import type { BlockItem } from './types';\nimport { List, ListOrdered } from 'lucide-react';\n\nexport const bulletList: BlockItem = {\n title: 'Bullet List',\n description: 'Create a simple bullet list.',\n searchTerms: ['unordered', 'point'],\n icon: <List className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n};\n\nexport const orderedList: BlockItem = {\n title: 'Numbered List',\n description: 'Create a list with numbering.',\n searchTerms: ['ordered'],\n icon: <ListOrdered className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n Text,\n Heading1,\n Heading2,\n Heading3,\n DivideIcon,\n TextQuote,\n FootprintsIcon,\n EraserIcon,\n} from 'lucide-react';\n\nexport const text: BlockItem = {\n title: 'Text',\n description: 'Just start typing with plain text.',\n searchTerms: ['p', 'paragraph'],\n icon: <Text className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n};\n\nexport const heading1: BlockItem = {\n title: 'Heading 1',\n description: 'Big heading.',\n searchTerms: ['title', 'big', 'large'],\n icon: <Heading1 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n};\n\nexport const heading2: BlockItem = {\n title: 'Heading 2',\n description: 'Medium heading.',\n searchTerms: ['subtitle', 'medium'],\n icon: <Heading2 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n};\n\nexport const heading3: BlockItem = {\n title: 'Heading 3',\n description: 'Small heading.',\n searchTerms: ['subtitle', 'small'],\n icon: <Heading3 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n};\n\nexport const hardBreak: BlockItem = {\n title: 'Hard Break',\n description: 'Add a break between lines.',\n searchTerms: ['break', 'line'],\n icon: <DivideIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHardBreak().run();\n },\n};\n\nexport const blockquote: BlockItem = {\n title: 'Blockquote',\n description: 'Add blockquote.',\n searchTerms: ['quote', 'blockquote'],\n icon: <TextQuote className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBlockquote().run();\n },\n};\n\nexport const footer: BlockItem = {\n title: 'Footer',\n description: 'Add a footer text to email.',\n searchTerms: ['footer', 'text'],\n icon: <FootprintsIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setFooter().run();\n },\n};\n\nexport const clearLine: BlockItem = {\n title: 'Clear Line',\n description: 'Clear the current line.',\n searchTerms: ['clear', 'line'],\n icon: <EraserIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().selectParentNode().deleteSelection().run();\n },\n};\n","import { button, linkCard } from '@/blocks/button';\nimport { image, logo } from '@/blocks/image';\nimport { columns, divider, forLoop, section, spacer } from '@/blocks/layout';\nimport { bulletList, orderedList } from '@/blocks/list';\nimport { BlockItem } from '@/blocks/types';\nimport {\n blockquote,\n clearLine,\n footer,\n hardBreak,\n heading1,\n heading2,\n heading3,\n text,\n} from '@/blocks/typography';\n\nexport const DEFAULT_SLASH_COMMANDS: BlockItem[] = [\n text,\n heading1,\n heading2,\n heading3,\n bulletList,\n orderedList,\n image,\n logo,\n columns,\n section,\n forLoop,\n divider,\n spacer,\n button,\n linkCard,\n hardBreak,\n blockquote,\n footer,\n clearLine,\n];\n","import {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n RenderVariableFunction,\n useMailyContext,\n} from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { AlertTriangle, Braces, Pencil } from 'lucide-react';\n\nexport function VariableView(props: NodeViewProps) {\n const { node, updateAttributes, editor } = props;\n const { id, fallback, required } = node.attrs;\n\n const { renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n\n return (\n <NodeViewWrapper\n className=\"react-component mly-inline-block mly-leading-none\"\n draggable=\"false\"\n >\n <Popover>\n <PopoverTrigger>\n {renderVariable({\n variable: { name: id, required: required, valid: true },\n fallback,\n editor,\n from: 'content-variable',\n })}\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch mly-text-midnight-gray\">\n <label className=\"mly-relative\">\n <span className=\"mly-inline-block mly-px-2 mly-text-xs mly-text-midnight-gray\">\n Variable\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={id ?? ''}\n onChange={(e) => {\n updateAttributes({\n id: e.target.value,\n });\n }}\n placeholder=\"ie. name...\"\n className=\"mly-h-7 mly-w-36 mly-rounded-md mly-bg-soft-gray mly-px-2 mly-text-sm mly-text-midnight-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n />\n </label>\n\n <Divider className=\"mly-mx-1.5\" />\n\n <label className=\"mly-relative\">\n <span className=\"mly-inline-block mly-px-2 mly-pl-1 mly-text-xs mly-text-midnight-gray\">\n Default\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={fallback ?? ''}\n onChange={(e) => {\n updateAttributes({\n fallback: e.target.value,\n });\n }}\n placeholder=\"ie. John Doe...\"\n className=\"mly-h-7 mly-w-32 mly-rounded-md mly-bg-soft-gray mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n />\n <div className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center\">\n <Pencil className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n </label>\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\nexport const DefaultRenderVariable: RenderVariableFunction = (props) => {\n const { variable, fallback, from } = props;\n const { name, required, valid } = variable;\n\n if (from === 'button-variable') {\n return (\n <div className=\"mly-inline-grid mly-h-7 mly-max-w-xs mly-grid-cols-[12px_1fr] mly-items-center mly-gap-1.5 mly-rounded-md mly-border mly-border-[var(--button-var-border-color)] mly-px-2 mly-font-mono mly-text-sm\">\n <Braces className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n <span className=\"mly-min-w-0 mly-truncate mly-text-left\">{name}</span>\n </div>\n );\n }\n\n if (from === 'bubble-variable') {\n return (\n <div\n className={cn(\n 'mly-inline-grid mly-h-7 mly-min-w-28 mly-max-w-xs mly-grid-cols-[12px_1fr] mly-items-center mly-gap-1.5 mly-rounded-md mly-border mly-px-2 mly-font-mono mly-text-sm hover:mly-bg-soft-gray',\n !valid &&\n 'mly-border-rose-400 mly-bg-rose-50 mly-text-rose-600 hover:mly-bg-rose-100'\n )}\n >\n <Braces className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5] mly-text-rose-600\" />\n <span className=\"mly-min-w-0 mly-truncate mly-text-left\">{name}</span>\n </div>\n );\n }\n\n return (\n <span\n tabIndex={-1}\n className=\"mly-inline-flex mly-items-center mly-gap-[var(--variable-icon-gap)] mly-rounded-full mly-border mly-px-1.5 mly-py-0.5 mly-leading-none\"\n >\n <Braces className=\"mly-size-[var(--variable-icon-size)] mly-shrink-0 mly-stroke-[2.5] mly-text-rose-600\" />\n {name}\n {required && !fallback && (\n <AlertTriangle className=\"mly-size-[var(--variable-icon-size)] mly-shrink-0 mly-stroke-[2.5]\" />\n )}\n </span>\n );\n};\n","import { Variable, VariableFunctionOptions, Variables } from '../provider';\n\nexport function processVariables(\n variables: Variables,\n options: VariableFunctionOptions\n): Array<Variable> {\n const { query } = options;\n const queryLower = query.toLowerCase();\n\n let filteredVariables: Array<Variable> = [];\n if (Array.isArray(variables)) {\n filteredVariables = variables.filter((variable) =>\n variable.name.toLowerCase().startsWith(queryLower)\n );\n\n if (\n query.length > 0 &&\n !filteredVariables.some((variable) => variable.name === query)\n ) {\n filteredVariables.push({ name: query, required: true });\n }\n\n return filteredVariables;\n } else if (typeof variables === 'function') {\n return variables(options);\n } else {\n throw new Error(`Invalid variables type. Expected 'Array' or 'Function', but received '${typeof variables}'.\n\nYou can check out the documentation for more information: https://github.com/arikchakma/maily.to/blob/main/packages/core/readme.md`);\n }\n}\n","import { Columns2, SlidersVertical, Columns3 } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\n\ntype ColumnsWidthConfigProps = {\n columnsCount: number;\n onColumnsCountChange: (columns: number) => void;\n\n columnWidths: string[];\n onColumnWidthChange?: (column: number, width: string) => void;\n};\n\nexport function ColumnsWidthConfig(props: ColumnsWidthConfigProps) {\n const {\n columnsCount = 2,\n onColumnsCountChange,\n columnWidths,\n onColumnWidthChange,\n } = props;\n\n return (\n <Popover>\n <PopoverTrigger className=\"mly-flex mly-size-7 mly-items-center mly-justify-center mly-gap-1 mly-rounded-md mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray\">\n <SlidersVertical className=\"mly-h-3 mly-w-3 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n <PopoverContent\n className=\"mly-w-[300px] mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"center\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-1\">\n <SwitchButton\n onClick={() => onColumnsCountChange(2)}\n isActive={columnsCount === 2}\n >\n <Columns2 className=\"mly-h-4 mly-w-4 mly-stroke-[2.5]\" />\n <span>2 Columns</span>\n </SwitchButton>\n <SwitchButton\n onClick={() => onColumnsCountChange(3)}\n isActive={columnsCount === 3}\n >\n <Columns3 className=\"mly-h-4 mly-w-4 mly-stroke-[2.5]\" />\n <span>3 Columns</span>\n </SwitchButton>\n </div>\n\n <hr className=\"mly-my-0.5 mly-border-gray-200\" />\n\n <div\n className=\"mly-grid mly-gap-1 mly-p-1\"\n style={{ gridTemplateColumns: `repeat(${columnsCount}, 1fr)` }}\n >\n {Array.from({ length: columnsCount }).map((_, index) => {\n const value =\n columnWidths[index] === 'auto' ? '' : columnWidths[index];\n const label =\n columnsCount === 2\n ? index === 0\n ? 'Left'\n : 'Right'\n : index === 0\n ? 'Left'\n : index === 1\n ? 'Middle'\n : 'Right';\n\n return (\n <div className=\"mly-flex mly-flex-col mly-gap-1\" key={index}>\n <span className=\"mly-text-xs mly-text-gray-400\">{label}</span>\n\n <label className=\"mly-relative\">\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n placeholder=\"auto\"\n min={1}\n max={90}\n type=\"number\"\n className=\"hide-number-controls mly-w-full mly-appearance-none mly-rounded-md mly-bg-soft-gray mly-px-1.5 mly-py-1 mly-pr-6 mly-text-sm mly-tabular-nums mly-outline-none focus:mly-bg-soft-gray focus:mly-outline-none focus:mly-ring-1 focus:mly-ring-midnight-gray/50\"\n value={value}\n onChange={(e) => {\n const value = e.target.value;\n onColumnWidthChange?.(index, value);\n }}\n />\n <span className=\"mly-absolute mly-inset-y-0 mly-right-0 mly-flex mly-aspect-square mly-items-center mly-justify-center mly-text-xs mly-tabular-nums mly-text-gray-500\">\n %\n </span>\n </label>\n </div>\n );\n })}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype SwitchButtonProps = {\n isActive?: boolean;\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nfunction SwitchButton(props: SwitchButtonProps) {\n const { onClick, isActive = false, children } = props;\n\n return (\n <button\n className={cn(\n 'mly-flex mly-h-7 mly-items-center mly-gap-1 mly-rounded-md mly-px-2 mly-text-sm mly-text-gray-500 hover:mly-bg-soft-gray hover:mly-text-midnight-gray',\n isActive && 'mly-bg-soft-gray mly-text-midnight-gray'\n )}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n","import { useId } from 'react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ChevronDownIcon, LucideIcon } from 'lucide-react';\nimport { SVGIcon } from '../icons/grid-lines';\n\ntype SelectProps = {\n label: string;\n options: {\n value: string;\n label: string;\n }[];\n\n value: string;\n onValueChange: (value: string) => void;\n\n tooltip?: string;\n className?: string;\n\n icon?: LucideIcon | SVGIcon;\n iconClassName?: string;\n};\n\nexport function Select(props: SelectProps) {\n const {\n label,\n options,\n value,\n onValueChange,\n tooltip,\n className,\n icon: Icon,\n iconClassName,\n } = props;\n\n const selectId = `mly${useId()}`;\n\n const content = (\n <div className=\"relative\">\n <label htmlFor={selectId} className=\"sr-only\">\n {label}\n </label>\n\n {Icon && (\n <div className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-left-2 mly-z-20 mly-flex mly-items-center\">\n <Icon className={cn('mly-size-3', iconClassName)} />\n </div>\n )}\n\n <select\n id={selectId}\n className={cn(\n 'mly-flex mly-min-h-7 mly-max-w-max mly-appearance-none mly-items-center mly-rounded-md mly-px-1.5 mly-py-0.5 mly-pr-7 mly-text-sm mly-text-midnight-gray mly-ring-offset-white mly-transition-colors hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 active:mly-bg-soft-gray',\n !!Icon && 'mly-pl-7',\n className\n )}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <span className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-right-0 mly-z-10 mly-flex mly-h-full mly-w-7 mly-items-center mly-justify-center mly-text-gray-600 peer-disabled:mly-opacity-50\">\n <ChevronDownIcon\n size={16}\n strokeWidth={2}\n aria-hidden=\"true\"\n role=\"img\"\n />\n </span>\n </div>\n );\n\n if (!tooltip) {\n return content;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n","import { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { useColumnsState } from './use-columns-state';\nimport { Divider } from '../ui/divider';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { VerticalAlignmentSwitch } from '../vertical-alignment-switch';\nimport {\n addColumnByIndex,\n removeColumnByIndex,\n updateColumnWidth,\n} from '@/editor/utils/columns';\nimport { ShowPopover } from '../show-popover';\nimport { ColumnsWidthConfig } from './columns-width-config';\nimport { Select } from '../ui/select';\nimport { Space, Trash } from 'lucide-react';\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { deleteNode } from '@/editor/utils/delete-node';\n\ntype ColumnsBubbleMenuProps = {\n editor: EditorBubbleMenuProps['editor'];\n};\n\nexport function ColumnsBubbleMenuContent(props: ColumnsBubbleMenuProps) {\n const { editor } = props;\n if (!editor) {\n return null;\n }\n\n const state = useColumnsState(editor);\n\n const currentColumnCount = state.columnsCount;\n\n return (\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch\">\n {state.isColumnActive && (\n <>\n <ColumnsWidthConfig\n columnsCount={currentColumnCount}\n columnWidths={state.columnWidths}\n onColumnsCountChange={(count) => {\n if (count > currentColumnCount) {\n addColumnByIndex(editor);\n } else {\n removeColumnByIndex(editor);\n }\n }}\n onColumnWidthChange={(index, width) => {\n updateColumnWidth(editor, index, width);\n }}\n />\n\n <Divider />\n </>\n )}\n\n <VerticalAlignmentSwitch\n alignment={state.currentVerticalAlignment}\n onAlignmentChange={(value) => {\n editor.commands.updateColumn({\n verticalAlign: value,\n });\n }}\n />\n\n <Divider />\n\n <Select\n icon={Space}\n label=\"Columns Gap\"\n value={state.currentColumnsGap}\n options={[\n { value: '0', label: 'None' },\n { value: '4', label: 'Small' },\n { value: '8', label: 'Medium' },\n { value: '16', label: 'Large' },\n { value: '24', label: 'Extra Large' },\n ]}\n onValueChange={(value) => {\n editor.commands.updateColumns({\n gap: +value,\n });\n }}\n tooltip=\"Columns Gap\"\n />\n\n <Divider />\n\n <BubbleMenuButton\n icon={Trash}\n tooltip=\"Delete Columns\"\n command={() => {\n deleteNode(editor, 'columns');\n }}\n />\n\n <Divider />\n\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.updateColumns({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </div>\n </TooltipProvider>\n );\n}\n","import { findParentNode, type Editor } from '@tiptap/core';\n\nexport function deleteNode(editor: Editor, nodeType: string) {\n const { state } = editor.view;\n const associatedNode = findParentNode((node) => node.type.name === nodeType)(\n state.selection\n );\n\n if (!associatedNode) {\n return;\n }\n\n const from = associatedNode.pos;\n const to = from + associatedNode.node.nodeSize;\n\n const { tr } = state;\n const transaction = tr.delete(from, to);\n editor.view.dispatch(transaction);\n}\n","import type { Editor } from '@tiptap/core';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { NodeSelection } from '@tiptap/pm/state';\n\nimport type { Node } from '@tiptap/pm/model';\nimport { Copy, GripVertical, Plus, Trash2 } from 'lucide-react';\nimport { BaseButton } from './base-button';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './ui/tooltip';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { Divider } from './ui/divider';\nimport { DragHandle } from '../plugins/drag-handle/drag-handle';\n\nexport type ContentMenuProps = {\n editor: Editor;\n};\n\nexport function ContentMenu(props: ContentMenuProps) {\n const { editor } = props;\n\n const [menuOpen, setMenuOpen] = useState(false);\n const [currentNode, setCurrentNode] = useState<Node | null>(null);\n const [currentNodePos, setCurrentNodePos] = useState<number>(-1);\n\n const handleNodeChange = useCallback(\n (data: { node: Node | null; editor: Editor; pos: number }) => {\n if (data.node) {\n setCurrentNode(data.node);\n }\n\n setCurrentNodePos(data.pos);\n },\n [setCurrentNodePos, setCurrentNode]\n );\n\n function duplicateNode() {\n editor.commands.setNodeSelection(currentNodePos);\n const { $anchor } = editor.state.selection;\n const selectedNode =\n $anchor.node(1) || (editor.state.selection as NodeSelection).node;\n editor\n .chain()\n .setMeta('hideDragHandle', true)\n .insertContentAt(\n currentNodePos + (currentNode?.nodeSize || 0),\n selectedNode.toJSON()\n )\n .run();\n\n setMenuOpen(false);\n }\n\n function deleteCurrentNode() {\n editor\n .chain()\n .setMeta('hideDragHandle', true)\n .setNodeSelection(currentNodePos)\n .deleteSelection()\n .run();\n\n setMenuOpen(false);\n }\n\n function handleAddNewNode() {\n if (currentNodePos !== -1) {\n const currentNodeSize = currentNode?.nodeSize || 0;\n const insertPos = currentNodePos + currentNodeSize;\n const currentNodeIsEmptyParagraph =\n currentNode?.type.name === 'paragraph' &&\n currentNode?.content?.size === 0;\n const focusPos = currentNodeIsEmptyParagraph\n ? currentNodePos + 2\n : insertPos + 2;\n editor\n .chain()\n .command(({ dispatch, tr, state }: any) => {\n if (dispatch) {\n if (currentNodeIsEmptyParagraph) {\n tr.insertText('/', currentNodePos, currentNodePos + 1);\n } else {\n tr.insert(\n insertPos,\n state.schema.nodes.paragraph.create(null, [\n state.schema.text('/'),\n ])\n );\n }\n\n return dispatch(tr);\n }\n\n return true;\n })\n .focus(focusPos)\n .run();\n }\n }\n\n useEffect(() => {\n if (menuOpen) {\n editor.commands.setMeta('lockDragHandle', true);\n } else {\n editor.commands.setMeta('lockDragHandle', false);\n }\n\n return () => {\n editor.commands.setMeta('lockDragHandle', false);\n };\n }, [editor, menuOpen]);\n\n return (\n <DragHandle\n pluginKey=\"ContentMenu\"\n editor={editor}\n tippyOptions={{\n offset: [2, 0],\n zIndex: 99,\n }}\n onNodeChange={handleNodeChange}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-center mly-pr-1.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"!mly-size-5 mly-cursor-grab mly-text-gray-500 hover:mly-text-black\"\n onClick={handleAddNewNode}\n type=\"button\"\n >\n <Plus className=\"mly-size-3.5 mly-shrink-0\" />\n </BaseButton>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Add new node</TooltipContent>\n </Tooltip>\n <Popover open={menuOpen} onOpenChange={setMenuOpen}>\n <div className=\"mly-relative mly-flex mly-flex-col\">\n <Tooltip>\n <TooltipTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"mly-relative mly-z-[1] !mly-size-5 mly-cursor-grab mly-text-gray-500 hover:mly-text-black\"\n onClick={(e) => {\n e.preventDefault();\n setMenuOpen(true);\n editor.commands.setNodeSelection(currentNodePos);\n }}\n type=\"button\"\n >\n <GripVertical className=\"mly-size-3.5 mly-shrink-0\" />\n </BaseButton>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Node actions</TooltipContent>\n </Tooltip>\n <PopoverTrigger className=\"mly-absolute mly-left-0 mly-top-0 mly-z-0 mly-h-5 mly-w-5\" />\n </div>\n\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={8}\n className=\"mly-flex mly-w-max mly-flex-col mly-rounded-md mly-p-1\"\n >\n <BaseButton\n variant=\"ghost\"\n onClick={duplicateNode}\n className=\"mly-h-auto mly-justify-start mly-gap-2 !mly-rounded mly-px-2 mly-py-1 mly-text-sm mly-font-normal\"\n >\n <Copy className=\"mly-size-[15px] mly-shrink-0\" />\n Duplicate\n </BaseButton>\n <Divider type=\"horizontal\" />\n <BaseButton\n onClick={deleteCurrentNode}\n className=\"mly-h-auto mly-justify-start mly-gap-2 !mly-rounded mly-bg-red-100 mly-px-2 mly-py-1 mly-text-sm mly-font-normal mly-text-red-600 hover:mly-bg-red-200 focus:mly-bg-red-200\"\n >\n <Trash2 className=\"mly-size-[15px] mly-shrink-0\" />\n Delete\n </BaseButton>\n </PopoverContent>\n </Popover>\n </div>\n </TooltipProvider>\n </DragHandle>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\n\nimport { Node } from '@tiptap/pm/model';\nimport { ReactNode } from 'react';\nimport { Editor } from '@tiptap/core';\nimport { Props as TippyProps } from 'tippy.js';\nimport {\n DragHandlePlugin,\n dragHandlePluginDefaultKey,\n} from './drag-handle-plugin';\n\nexport type DragHandleProps = {\n editor: Editor;\n pluginKey?: string;\n className?: string;\n tippyOptions?: Partial<TippyProps>;\n onNodeChange?: (data: {\n node: Node | null;\n editor: Editor;\n pos: number;\n }) => void;\n children: ReactNode;\n};\n\nexport function DragHandle(props: DragHandleProps) {\n const {\n className = 'drag-handle',\n children,\n editor,\n pluginKey = dragHandlePluginDefaultKey,\n onNodeChange,\n tippyOptions = {},\n } = props;\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n const pluginRef = useRef<ReturnType<typeof DragHandlePlugin> | null>(null);\n\n useEffect(() => {\n if (!element) {\n return () => {\n pluginRef.current = null;\n };\n }\n\n if (editor.isDestroyed) {\n return () => {\n pluginRef.current = null;\n };\n }\n\n if (!pluginRef.current) {\n pluginRef.current = DragHandlePlugin({\n editor,\n element,\n pluginKey,\n tippyOptions,\n onNodeChange,\n });\n\n editor.registerPlugin(pluginRef.current);\n }\n\n return () => {\n editor.unregisterPlugin(pluginKey);\n pluginRef.current = null;\n };\n }, [element, editor, onNodeChange, pluginKey]);\n\n return (\n <div className={className} ref={setElement}>\n {children}\n </div>\n );\n}\n","/**\n * This plugin is a modified version of the package\n * LINK: https://www.npmjs.com/package/echo-drag-handle-plugin.\n * The original package was not working as expected while migrating.\n *\n * I will be building a new version from scratch for the drag handle plugin\n * for better usability and compatibility for me.\n * Until then, I will be using this modified version.\n */\n\nimport {\n SelectionRange,\n Selection,\n PluginKey,\n Plugin,\n EditorState,\n} from '@tiptap/pm/state';\nimport tippy, { Instance, Tippy } from 'tippy.js';\nimport {\n ySyncPluginKey,\n absolutePositionToRelativePosition,\n} from 'y-prosemirror';\nimport { NodeRange } from '@tiptap/pm/model';\nimport { ResolvedPos, Node as TNode } from '@tiptap/pm/model';\nimport { Mapping } from '@tiptap/pm/transform';\nimport { Editor } from '@tiptap/core';\nimport { Props as TippyProps } from 'tippy.js';\n\nfunction getSelectionRanges(\n state: ResolvedPos,\n range: ResolvedPos,\n depth?: number\n): SelectionRange[] {\n const ranges: SelectionRange[] = [];\n const root = state.node(0);\n depth =\n typeof depth === 'number' && depth >= 0\n ? depth\n : state.sameParent(range)\n ? Math.max(0, state.sharedDepth(range.pos) - 1)\n : state.sharedDepth(range.pos);\n const nodeRange = new NodeRange(state, range, depth);\n const startIndex =\n nodeRange.depth === 0 ? 0 : root.resolve(nodeRange.start).posAtIndex(0);\n nodeRange.parent.forEach((size, offset) => {\n const from = startIndex + offset;\n const to = from + size.nodeSize;\n if (from < nodeRange.start || from >= nodeRange.end) return;\n const selectionRange = new SelectionRange(\n root.resolve(from),\n root.resolve(to)\n );\n ranges.push(selectionRange);\n });\n return ranges;\n}\n\nclass NodeRangeBookmark {\n anchor: number;\n head: number;\n constructor(anchor: number, head: number) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping: Mapping) {\n return new NodeRangeBookmark(\n mapping.map(this.anchor),\n mapping.map(this.head)\n );\n }\n resolve(doc: TNode) {\n const e = doc.resolve(this.anchor);\n const o = doc.resolve(this.head);\n return new NodeRangeSelection(e, o);\n }\n}\n\nclass NodeRangeSelection extends Selection {\n depth: number | undefined;\n\n constructor(t: ResolvedPos, e: ResolvedPos, o?: number, s: number = 1) {\n const { doc: r } = t;\n const n = t === e;\n const i = t.pos === r.content.size && e.pos === r.content.size;\n const a = n && !i ? r.resolve(e.pos + (s > 0 ? 1 : -1)) : e;\n const c = n && i ? r.resolve(t.pos - (s > 0 ? 1 : -1)) : t;\n const d = getSelectionRanges(c.min(a), c.max(a), o);\n super(\n a.pos >= t.pos ? d[0].$from : d[d.length - 1].$to,\n a.pos >= t.pos ? d[d.length - 1].$to : d[0].$from,\n d\n );\n this.depth = o;\n }\n get $to() {\n return this.ranges[this.ranges.length - 1].$to;\n }\n eq(other: Selection): boolean {\n return (\n other instanceof NodeRangeSelection &&\n other.$from.pos === this.$from.pos &&\n other.$to.pos === this.$to.pos\n );\n }\n // @ts-ignore\n map(doc: TNode, mapping: Mapping) {\n const o = doc.resolve(mapping.map(this.anchor));\n const s = doc.resolve(mapping.map(this.head));\n return new NodeRangeSelection(o, s);\n }\n toJSON() {\n return { type: 'nodeRange', anchor: this.anchor, head: this.head };\n }\n get isForwards() {\n return this.head >= this.anchor;\n }\n get isBackwards() {\n return !this.isForwards;\n }\n extendBackwards() {\n const { doc: t } = this.$from;\n if (this.isForwards && this.ranges.length > 1) {\n const t = this.ranges.slice(0, -1);\n const e = t[0].$from;\n const o = t[t.length - 1].$to;\n return new NodeRangeSelection(e, o, this.depth);\n }\n const e = this.ranges[0];\n const o = t.resolve(Math.max(0, e.$from.pos - 1));\n return new NodeRangeSelection(this.$anchor, o, this.depth);\n }\n extendForwards() {\n const { doc: t } = this.$from;\n if (this.isBackwards && this.ranges.length > 1) {\n const t = this.ranges.slice(1);\n const e = t[0].$from;\n const o = t[t.length - 1].$to;\n return new NodeRangeSelection(o, e, this.depth);\n }\n const e = this.ranges[this.ranges.length - 1];\n const o = t.resolve(Math.min(t.content.size, e.$to.pos + 1));\n return new NodeRangeSelection(this.$anchor, o, this.depth);\n }\n static fromJSON(doc: TNode, json: any) {\n return new NodeRangeSelection(\n doc.resolve(json.anchor),\n doc.resolve(json.head)\n );\n }\n static create(\n doc: TNode,\n anchor: number,\n head: number,\n depth?: number,\n bias: number = 1\n ) {\n return new this(doc.resolve(anchor), doc.resolve(head), depth, bias);\n }\n // @ts-ignore\n getBookmark(): NodeRangeBookmark {\n return new NodeRangeBookmark(this.anchor, this.head);\n }\n}\n\nfunction cloneElement(node: HTMLElement) {\n const clonedNode = node.cloneNode(true) as HTMLElement;\n const originalElements = [\n node,\n ...Array.from(node.getElementsByTagName('*')),\n ];\n const clonedElements = [\n clonedNode,\n ...Array.from(clonedNode.getElementsByTagName('*')),\n ];\n\n originalElements.forEach((element, index) => {\n const clonedElement = clonedElements[index];\n\n if (\n clonedElement instanceof HTMLElement &&\n element instanceof HTMLElement\n ) {\n clonedElement.style.cssText = (function (element: HTMLElement) {\n let styles = '';\n const computedStyles = getComputedStyle(element);\n for (let i = 0; i < computedStyles.length; i += 1) {\n styles += `${computedStyles[i]}:${computedStyles.getPropertyValue(computedStyles[i])};`;\n }\n return styles;\n })(element);\n }\n });\n\n return clonedNode;\n}\n\nfunction getComputedStyles(node: Element, property: any) {\n return window.getComputedStyle(node)[property];\n}\nfunction minMax(value = 0, min = 0, max = 0) {\n return Math.min(Math.max(value, min), max);\n}\nfunction removeNode(node: HTMLElement) {\n if (node.parentNode !== null && node.parentNode !== undefined) {\n node.parentNode.removeChild(node);\n }\n}\n\nexport type FindElementNextToCoords = {\n x: number;\n y: number;\n direction?: 'left' | 'right';\n editor: Editor;\n};\n\nconst findElementNextToCoords = (options: FindElementNextToCoords) => {\n const { x, y, direction, editor } = options;\n let resultElement = null;\n let resultNode = null;\n let d = null;\n let l = x;\n for (; null === resultNode && l < window.innerWidth && l > 0; ) {\n const elements = document.elementsFromPoint(l, y);\n const index = elements.findIndex((el) =>\n el.classList.contains('ProseMirror')\n );\n const filteredElements = elements.slice(0, index);\n if (filteredElements.length > 0) {\n const element = filteredElements[0];\n resultElement = element;\n d = editor.view.posAtDOM(element, 0);\n if (d >= 0) {\n resultNode = editor.state.doc.nodeAt(Math.max(d - 1, 0));\n if (resultNode === null || resultNode.isText) {\n resultNode = editor.state.doc.nodeAt(Math.max(d - 1, 0));\n }\n if (!resultNode) {\n resultNode = editor.state.doc.nodeAt(Math.max(d, 0));\n }\n break;\n }\n }\n if (direction === 'left') {\n l -= 1;\n } else {\n l += 1;\n }\n }\n return { resultElement, resultNode, pos: d !== null ? d : null };\n};\n\nfunction getSelectionRangesNearCursor(e: MouseEvent, t: Editor) {\n const { doc: n } = t.view.state,\n o = findElementNextToCoords({\n editor: t,\n x: e.clientX,\n y: e.clientY,\n direction: 'right',\n });\n if (!o.resultNode || null === o.pos) return [];\n const r = e.clientX,\n i = (function (e, t, n) {\n const o = parseInt(getComputedStyles(e.dom, 'paddingLeft'), 10),\n r = parseInt(getComputedStyles(e.dom, 'paddingRight'), 10),\n i = parseInt(getComputedStyles(e.dom, 'borderLeftWidth'), 10),\n s = parseInt(getComputedStyles(e.dom, 'borderLeftWidth'), 10),\n d = e.dom.getBoundingClientRect();\n return { left: minMax(t, d.left + o + i, d.right - r - s), top: n };\n })(t.view, r, e.clientY),\n s = t.view.posAtCoords(i);\n if (!s) return [];\n const { pos: d } = s;\n if (!n.resolve(d).parent) return [];\n const a = n.resolve(o.pos),\n p = n.resolve(o.pos + 1);\n return getSelectionRanges(a, p, 0);\n}\nconst getPreviousNodeStartPosition = (e: TNode, t: number) => {\n const n = e.resolve(t),\n { depth: o } = n;\n if (0 === o) return t;\n return n.pos - n.parentOffset - 1;\n};\nconst getAncestorNodeAtDepth = (e: TNode, t: number) => {\n const n = e.nodeAt(t),\n o = e.resolve(t);\n let { depth: r } = o,\n i = n;\n for (; r > 0; ) {\n const e = o.node(r);\n (r -= 1), 0 === r && (i = e);\n }\n return i;\n};\nconst getOuterNode = (doc: EditorState, pos: number) => {\n const n = ySyncPluginKey.getState(doc);\n return n\n ? absolutePositionToRelativePosition(pos, n.type, n.binding.mapping)\n : null;\n};\n\n// @ts-ignore\nconst getOuterNodePos = (e, t) => {\n let n = t;\n for (; n && n.parentNode && n.parentNode !== e.dom; ) n = n.parentNode;\n return n;\n};\n\ntype DragHandlePluginOptions = {\n pluginKey?: PluginKey | string;\n element: HTMLElement;\n editor: Editor;\n tippyOptions?: Partial<TippyProps>;\n onNodeChange?: (data: {\n editor: Editor;\n node: TNode | null;\n pos: number;\n }) => void;\n};\n\nexport const dragHandlePluginDefaultKey = new PluginKey('dragHandle');\nexport function DragHandlePlugin(\n options: DragHandlePluginOptions\n): Plugin<{ locked: boolean }> {\n const {\n pluginKey: e = dragHandlePluginDefaultKey,\n element,\n editor,\n tippyOptions,\n onNodeChange,\n } = options;\n\n const container = document.createElement('div');\n let tippyInstance: Instance | null = null;\n let x = false;\n let currentNode: TNode | null = null;\n let lastNodePos = -1;\n element.addEventListener('dragstart', (e) => {\n const { view } = editor;\n if (!e.dataTransfer) return;\n const { empty, $from, $to } = view.state.selection;\n const s = getSelectionRangesNearCursor(e, editor);\n const d = getSelectionRanges($from, $to, 0);\n const c = d.some((e) =>\n s.find((t) => t.$from === e.$from && t.$to === e.$to)\n );\n const u = empty || !c ? s : d;\n if (!u.length) return;\n const { tr: g } = view.state;\n const h = document.createElement('div');\n const y = u[0].$from.pos;\n const v = u[u.length - 1].$to.pos;\n const C = NodeRangeSelection.create(view.state.doc, y, v);\n const E = C.content();\n u.forEach((e) => {\n const t = cloneElement(view?.nodeDOM(e.$from.pos) as HTMLElement);\n h.append(t);\n });\n h.style.position = 'absolute';\n h.style.top = '-10000px';\n document.body.append(h);\n e.dataTransfer.clearData();\n e.dataTransfer.setDragImage(h, 0, 0);\n view.dragging = { slice: E, move: true };\n g.setSelection(C as unknown as Selection);\n view.dispatch(g);\n document.addEventListener('drop', () => removeNode(h), { once: true });\n setTimeout(() => {\n element && (element.style.pointerEvents = 'none');\n }, 0);\n });\n element.addEventListener('dragend', () => {\n element && (element.style.pointerEvents = 'auto');\n });\n\n return new Plugin({\n key: typeof e === 'string' ? new PluginKey(e) : e,\n state: {\n init: () => ({ locked: false }) as { locked: boolean },\n apply(e, t, n, o) {\n const l = e.getMeta('lockDragHandle');\n const a = e.getMeta('hideDragHandle');\n if ((undefined !== l && (x = l), a && tippyInstance)) {\n return (\n tippyInstance?.hide(),\n (x = false),\n (currentNode = null),\n (lastNodePos = -1),\n null == onNodeChange ||\n onNodeChange({ editor: editor, node: null, pos: -1 }),\n t\n );\n }\n if (e.docChanged && -1 !== lastNodePos && element && tippyInstance) {\n const t = e.mapping.map(lastNodePos);\n t !== lastNodePos &&\n ((lastNodePos = t), getOuterNode(o, lastNodePos));\n }\n return t;\n },\n },\n view: (e) => {\n var t;\n return (\n (element.draggable = true),\n (element.style.pointerEvents = 'auto'),\n null === (t = editor.view.dom.parentElement) ||\n undefined === t ||\n t.appendChild(container),\n container.appendChild(element),\n (container.style.pointerEvents = 'none'),\n (container.style.position = 'absolute'),\n (container.style.top = '0'),\n (container.style.left = '0'),\n (tippyInstance = tippy(e.dom, {\n getReferenceClientRect: null,\n interactive: true,\n trigger: 'manual',\n placement: 'left-start',\n hideOnClick: false,\n duration: 100,\n zIndex: 10,\n popperOptions: {\n modifiers: [\n { name: 'flip', enabled: false },\n {\n name: 'preventOverflow',\n options: { rootBoundary: 'document', mainAxis: false },\n },\n ],\n },\n ...tippyOptions,\n appendTo: container,\n content: element,\n })),\n {\n update(t, n) {\n if (!element || !tippyInstance) return;\n if (\n ((element.draggable = !x),\n e.state.doc.eq(n.doc) || -1 === lastNodePos)\n )\n return;\n let o = e.nodeDOM(lastNodePos) as HTMLElement;\n if (((o = getOuterNodePos(e, o)), o === e.dom)) return;\n if (1 !== (null == o ? undefined : o.nodeType)) return;\n const r = e.posAtDOM(o, 0),\n s = getAncestorNodeAtDepth(editor.state.doc, r);\n if (s !== currentNode) {\n const t = getPreviousNodeStartPosition(editor.state.doc, r);\n (currentNode = s),\n (lastNodePos = t),\n getOuterNode(e.state, lastNodePos),\n null == onNodeChange ||\n onNodeChange({\n editor: editor,\n node: currentNode as TNode,\n pos: lastNodePos,\n }),\n tippyInstance.setProps({\n getReferenceClientRect: () => o?.getBoundingClientRect(),\n }),\n tippyInstance.show();\n }\n },\n destroy() {\n null == tippyInstance || tippyInstance.destroy(),\n element && removeNode(container);\n },\n }\n );\n },\n props: {\n handleDOMEvents: {\n mouseleave: (e, event) => (\n x ||\n (event.target &&\n !container.contains(event?.relatedTarget as Node) &&\n (null == tippyInstance || tippyInstance.hide(),\n (currentNode = null),\n (lastNodePos = -1),\n null == onNodeChange ||\n onNodeChange({ editor: editor, node: null, pos: -1 }))),\n false\n ),\n mousemove(e, t) {\n if (!element || !tippyInstance || x) return false;\n const n = findElementNextToCoords({\n x: t.clientX,\n y: t.clientY,\n direction: 'right',\n editor: editor,\n });\n if (!n.resultElement) return false;\n let o = n.resultElement;\n if (((o = getOuterNodePos(e, o)), o === e.dom)) return false;\n if (1 !== (null == o ? undefined : o.nodeType)) return false;\n const r = e.posAtDOM(o, 0),\n s = getAncestorNodeAtDepth(editor.state.doc, r);\n if (s !== currentNode) {\n const t = getPreviousNodeStartPosition(editor.state.doc, r);\n (currentNode = s),\n (lastNodePos = t),\n getOuterNode(e.state, lastNodePos),\n null == onNodeChange ||\n onNodeChange({\n editor: editor,\n node: currentNode,\n pos: lastNodePos,\n }),\n tippyInstance.setProps({\n getReferenceClientRect: () => o.getBoundingClientRect(),\n }),\n tippyInstance.show();\n }\n return false;\n },\n },\n },\n });\n}\n","import { useMemo } from 'react';\nimport { Editor as EditorType } from '@tiptap/core';\nimport {\n AlignCenter,\n AlignLeft,\n AlignRight,\n BoldIcon,\n EraserIcon,\n ItalicIcon,\n LinkIcon,\n SeparatorHorizontal,\n StrikethroughIcon,\n UnderlineIcon,\n} from 'lucide-react';\n\nimport { EditorProps } from '@/editor';\n\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { BubbleMenuItem } from './text-menu/text-bubble-menu';\n\ninterface EditorMenuItem extends BubbleMenuItem {\n group: 'alignment' | 'image' | 'mark' | 'custom' | 'email';\n}\n\ntype EditorMenuBarProps = {\n config: EditorProps['config'];\n editor: EditorType;\n};\n\nexport const EditorMenuBar = (props: EditorMenuBarProps) => {\n const { editor, config } = props;\n\n const items: EditorMenuItem[] = useMemo(\n () => [\n {\n name: 'bold',\n command: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive('bold'),\n group: 'mark',\n icon: BoldIcon,\n },\n {\n name: 'italic',\n command: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive('italic'),\n group: 'mark',\n icon: ItalicIcon,\n },\n {\n name: 'underline',\n command: () => editor.chain().focus().toggleUnderline().run(),\n isActive: () => editor.isActive('underline'),\n group: 'mark',\n icon: UnderlineIcon,\n },\n {\n name: 'strike',\n command: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive('strike'),\n group: 'mark',\n icon: StrikethroughIcon,\n },\n {\n name: 'delete-line',\n command: () =>\n editor.chain().focus().selectParentNode().deleteSelection().run(),\n isActive: () => false,\n group: 'mark',\n icon: EraserIcon,\n },\n {\n name: 'divider',\n command: () => editor.chain().focus().setHorizontalRule().run(),\n isActive: () => editor.isActive('horizontalRule'),\n group: 'custom',\n icon: SeparatorHorizontal,\n },\n {\n name: 'link',\n command: () => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt('URL', previousUrl);\n // If the user cancels the prompt, we don't want to toggle the link\n if (url === null) return;\n // If the user deletes the URL entirely, we'll unlink the selected text\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n\n // Otherwise, we set the link to the given URL\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: url })\n .run();\n },\n isActive: () => editor.isActive('link'),\n group: 'custom',\n icon: LinkIcon,\n },\n {\n name: 'left',\n command: () => editor.chain().focus().setTextAlign('left').run(),\n isActive: () => editor.isActive({ textAlign: 'left' }),\n group: 'alignment',\n icon: AlignLeft,\n },\n {\n name: 'center',\n command: () => editor.chain().focus().setTextAlign('center').run(),\n isActive: () => editor.isActive({ textAlign: 'center' }),\n group: 'alignment',\n icon: AlignCenter,\n },\n {\n name: 'right',\n command: () => editor.chain().focus().setTextAlign('right').run(),\n isActive: () => editor.isActive({ textAlign: 'right' }),\n group: 'alignment',\n icon: AlignRight,\n },\n ],\n [editor]\n );\n\n const groups = useMemo(\n () =>\n items.reduce((acc, item) => {\n if (!acc.includes(item.group)) {\n acc.push(item.group);\n }\n return acc;\n }, [] as string[]),\n [items]\n );\n\n if (!editor) {\n return null;\n }\n\n return (\n <div\n className={`mly-flex mly-items-center mly-gap-3 ${config?.toolbarClassName}`}\n >\n {groups.map((group, index) => (\n <div\n key={index}\n className=\"mly-flex mly-items-center mly-gap-1 mly-rounded-md mly-border mly-bg-white mly-p-1\"\n >\n {items\n .filter((item) => item.group === group)\n .map((item, index) => (\n <BubbleMenuButton key={index} {...item} />\n ))}\n </div>\n ))}\n </div>\n );\n};\n","import {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n useMailyContext,\n} from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { BubbleMenu, findChildren } from '@tiptap/react';\nimport {\n Braces,\n InfoIcon,\n TriangleAlert,\n TriangleAlertIcon,\n} from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { sticky } from 'tippy.js';\nimport { getRenderContainer } from '../../utils/get-render-container';\nimport { ShowPopover } from '../show-popover';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { Divider } from '../ui/divider';\nimport { InputAutocomplete } from '../ui/input-autocomplete';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../ui/tooltip';\nimport { useForState } from './use-for-state';\nimport { getClosestNodeByName } from '@/editor/utils/columns';\nimport { processVariables } from '@/editor/utils/variable';\n\nexport function ForBubbleMenu(props: EditorBubbleMenuProps) {\n const { appendTo, editor } = props;\n if (!editor) {\n return null;\n }\n\n const state = useForState(editor);\n\n const getReferenceClientRect = useCallback(() => {\n const renderContainer = getRenderContainer(editor!, 'for');\n const rect =\n renderContainer?.getBoundingClientRect() ||\n new DOMRect(-1000, -1000, 0, 0);\n\n return rect;\n }, [editor]);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n const activeForNode = getClosestNodeByName(editor, 'for');\n const sectionNodeChildren = activeForNode\n ? findChildren(activeForNode?.node, (node) => {\n return node.type.name === 'section';\n })?.[0]\n : null;\n const hasActiveSectionNodeChildren =\n sectionNodeChildren && editor.isActive('section');\n\n if (isTextSelected(editor) || hasActiveSectionNodeChildren) {\n return false;\n }\n\n return editor.isActive('for');\n },\n tippyOptions: {\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n appendTo: () => appendTo?.current,\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: 'auto',\n },\n pluginKey: 'forBubbleMenu',\n };\n\n const { variables = [], renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n const inputRef = useRef<HTMLInputElement>(null);\n const [isUpdatingKey, setIsUpdatingKey] = useState(false);\n\n const eachKey = state?.each || '';\n const autoCompleteOptions = useMemo(() => {\n return processVariables(variables, {\n query: eachKey || '',\n editor,\n from: 'for-variable',\n }).map((variable) => variable.name);\n }, [variables, eachKey, editor]);\n\n const isValidEachKey = eachKey;\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-items-stretch mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-center mly-gap-1.5 mly-px-1.5 mly-text-sm mly-leading-none\">\n For\n <Tooltip>\n <TooltipTrigger>\n <InfoIcon\n className={cn('mly-size-3 mly-stroke-[2.5] mly-text-gray-500')}\n />\n </TooltipTrigger>\n <TooltipContent\n sideOffset={14}\n className=\"mly-max-w-[260px]\"\n align=\"start\"\n >\n Ensure the selected variable is iterable, such as an array of\n objects.\n </TooltipContent>\n </Tooltip>\n </div>\n {!isUpdatingKey && (\n <button\n onClick={() => {\n setIsUpdatingKey(true);\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: state?.each,\n valid: isValidEachKey,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n {isUpdatingKey && (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setIsUpdatingKey(false);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setIsUpdatingKey(false);\n }\n }}\n >\n <InputAutocomplete\n placeholder=\"ie. payload.items\"\n value={state?.each || ''}\n onValueChange={(value) => {\n editor.commands.updateFor({\n each: value,\n });\n }}\n onOutsideClick={() => {\n setIsUpdatingKey(false);\n }}\n onSelectOption={(value) => {\n editor.commands.updateFor({\n each: value,\n });\n setIsUpdatingKey(false);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={inputRef}\n />\n </form>\n )}\n\n <Divider />\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.updateFor({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useForState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n each: ctx.editor.getAttributes('for')?.each,\n currentShowIfKey: ctx.editor.getAttributes('for')?.showIfKey || '',\n\n isSectionActive: ctx.editor.isActive('section'),\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { BubbleMenu } from '@tiptap/react';\nimport { ArrowUpRight, ImageDown } from 'lucide-react';\nimport { AlignmentSwitch } from '../alignment-switch';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { Divider } from '../ui/divider';\nimport { LinkInputPopover } from '../ui/link-input-popover';\nimport { Select } from '../ui/select';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { ImageSize } from './image-size';\nimport { useImageState } from './use-image-state';\nimport { ShowPopover } from '../show-popover';\nimport { AllowedLogoSize, allowedLogoSize } from '@/editor/nodes/logo/logo';\nimport { sticky } from 'tippy.js';\n\nexport function ImageBubbleMenu(props: EditorBubbleMenuProps) {\n const { editor, appendTo } = props;\n if (!editor) {\n return null;\n }\n\n const state = useImageState(editor);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n return editor.isActive('logo') || editor.isActive('image');\n },\n tippyOptions: {\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: '100%',\n },\n };\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n {state.isLogoActive && state.imageSrc && (\n <>\n <Select\n label=\"Size\"\n tooltip=\"Size\"\n value={state.logoSize}\n options={allowedLogoSize.map((size) => ({\n value: size,\n label: size,\n }))}\n onValueChange={(value) => {\n editor\n ?.chain()\n .focus()\n .setLogoAttributes({ size: value as AllowedLogoSize })\n .run();\n }}\n />\n\n <Divider />\n </>\n )}\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <AlignmentSwitch\n alignment={state.alignment}\n onAlignmentChange={(alignment) => {\n const isCurrentNodeImage = state.isImageActive;\n if (!isCurrentNodeImage) {\n editor?.chain().focus().setLogoAttributes({ alignment }).run();\n } else {\n editor\n ?.chain()\n .focus()\n .updateAttributes('image', { alignment })\n .run();\n }\n }}\n />\n\n <LinkInputPopover\n defaultValue={state?.imageSrc ?? ''}\n onValueChange={(value, isVariable) => {\n if (state.isLogoActive) {\n editor\n ?.chain()\n .setLogoAttributes({\n src: value,\n isSrcVariable: isVariable ?? false,\n })\n .run();\n } else {\n editor\n ?.chain()\n .updateAttributes('image', {\n src: value,\n isSrcVariable: isVariable ?? false,\n })\n .run();\n }\n }}\n tooltip=\"Source URL\"\n icon={ImageDown}\n editor={editor}\n isVariable={state.isSrcVariable}\n />\n\n {state.isImageActive && (\n <LinkInputPopover\n defaultValue={state?.imageExternalLink ?? ''}\n onValueChange={(value, isVariable) => {\n editor\n ?.chain()\n .updateAttributes('image', {\n externalLink: value,\n isExternalLinkVariable: isVariable ?? false,\n })\n .run();\n }}\n tooltip=\"External URL\"\n editor={editor}\n isVariable={state.isExternalLinkVariable}\n />\n )}\n </div>\n\n {state.isImageActive && state.imageSrc && (\n <>\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <ImageSize\n dimension=\"width\"\n value={state?.width ?? 0}\n onValueChange={(value) => {\n editor\n ?.chain()\n .updateAttributes('image', { width: value })\n .run();\n }}\n />\n <ImageSize\n dimension=\"height\"\n value={state?.height ?? 0}\n onValueChange={(value) => {\n editor\n ?.chain()\n .updateAttributes('image', { height: value })\n .run();\n }}\n />\n </div>\n </>\n )}\n\n <Divider />\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor\n ?.chain()\n .updateAttributes(state.isLogoActive ? 'logo' : 'image', {\n showIfKey: value,\n })\n .run();\n }}\n editor={editor}\n />\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { AlignCenter, AlignLeft, AlignRight } from 'lucide-react';\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { AllowedLogoAlignment } from '../nodes/logo/logo';\n\ntype AlignmentSwitchProps = {\n alignment: AllowedLogoAlignment;\n onAlignmentChange: (alignment: AllowedLogoAlignment) => void;\n};\n\nexport function AlignmentSwitch(props: AlignmentSwitchProps) {\n const { alignment = 'left', onAlignmentChange } = props;\n\n const activeAlignment = {\n left: {\n icon: AlignLeft,\n tooltip: 'Align Left',\n onClick: () => {\n onAlignmentChange('center');\n },\n },\n center: {\n icon: AlignCenter,\n tooltip: 'Align Center',\n onClick: () => {\n onAlignmentChange('right');\n },\n },\n right: {\n icon: AlignRight,\n tooltip: 'Align Right',\n onClick: () => {\n onAlignmentChange('left');\n },\n },\n }[alignment];\n\n return (\n <BubbleMenuButton\n icon={activeAlignment.icon}\n tooltip={activeAlignment.tooltip}\n command={activeAlignment.onClick}\n />\n );\n}\n","import {\n BracesIcon,\n ChevronDownIcon,\n CornerDownLeft,\n Link,\n LucideIcon,\n} from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { useRef, useState } from 'react';\nimport { Tooltip, TooltipTrigger, TooltipContent } from './tooltip';\nimport {\n DEFAULT_PLACEHOLDER_URL,\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n useMailyContext,\n} from '@/editor/provider';\nimport { InputAutocomplete } from './input-autocomplete';\nimport { processVariables } from '@/editor/utils/variable';\nimport { useMemo } from 'react';\nimport { Editor } from '@tiptap/core';\n\nconst LINK_PROTOCOL_REGEX = /https?:\\/\\//;\n\ntype LinkInputPopoverProps = {\n defaultValue?: string;\n isVariable?: boolean;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n\n icon?: LucideIcon;\n tooltip?: string;\n\n editor: Editor;\n};\n\nexport function LinkInputPopover(props: LinkInputPopoverProps) {\n const {\n defaultValue = '',\n onValueChange,\n tooltip,\n icon: Icon = Link,\n editor,\n\n isVariable,\n } = props;\n\n const defaultProtocol = defaultValue.match(LINK_PROTOCOL_REGEX)?.[0];\n const defaultUrlWithoutProtocol = defaultValue.replace(\n LINK_PROTOCOL_REGEX,\n ''\n );\n\n const [isOpen, setIsOpen] = useState(false);\n const [protocol, setProtocol] = useState(defaultProtocol || 'https://');\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n\n const {\n variables = [],\n variableTriggerCharacter = DEFAULT_VARIABLE_TRIGGER_CHAR,\n renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION,\n placeholderUrl = DEFAULT_PLACEHOLDER_URL\n } = useMailyContext();\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = defaultUrlWithoutProtocol.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, defaultUrlWithoutProtocol, editor]);\n\n const popoverButton = (\n <PopoverTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n data-state={!!defaultUrlWithoutProtocol}\n >\n <Icon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </BaseButton>\n </PopoverTrigger>\n );\n\n const normalizeProtocol = (value: string, p: string = protocol) => {\n // remove protocol if it's already there\n // and add the new one\n value = value?.replace(LINK_PROTOCOL_REGEX, '');\n return p + value;\n };\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly-w-max mly-rounded-none mly-border-none mly-bg-transparent !mly-p-0 mly-shadow-none\"\n sideOffset={8}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const input = linkInputRef.current;\n if (!input) {\n return;\n }\n\n let value = normalizeProtocol(input.value);\n onValueChange?.(value);\n setIsOpen(false);\n }}\n >\n <div className=\"mly-isolate mly-flex mly-rounded-lg\">\n {!isEditing && (\n <div className=\"mly-flex mly-h-8 mly-items-center mly-rounded-lg mly-border mly-border-gray-300 mly-bg-white mly-px-0.5\">\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: defaultUrlWithoutProtocol,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n </div>\n )}\n\n {isEditing && (\n <>\n <div className=\"mly-relative\">\n <select\n className=\"hover:text-accent-foreground mly-peer mly-inline-flex mly-h-full mly-appearance-none mly-items-center mly-rounded-none mly-rounded-s-lg mly-border mly-border-gray-300 mly-bg-gray-50 mly-pe-8 mly-ps-3 mly-text-sm mly-text-gray-700 mly-transition-shadow hover:mly-bg-gray-100 focus:mly-z-10 focus-visible:mly-outline-none disabled:mly-pointer-events-none disabled:mly-cursor-not-allowed disabled:mly-opacity-50\"\n aria-label=\"Protocol\"\n value={protocol}\n onChange={(e) => {\n const protocol = e.target.value;\n\n setProtocol(protocol);\n const newValue = normalizeProtocol(\n linkInputRef.current?.value || '',\n protocol\n );\n onValueChange?.(newValue);\n }}\n >\n <option value=\"https://\">https://</option>\n <option value=\"http://\">http://</option>\n </select>\n <span className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-right-0 mly-z-10 mly-flex mly-h-full mly-w-9 mly-items-center mly-justify-center mly-text-gray-600 peer-disabled:mly-opacity-50\">\n <ChevronDownIcon\n size={16}\n strokeWidth={2}\n aria-hidden=\"true\"\n role=\"img\"\n />\n </span>\n </div>\n\n <InputAutocomplete\n value={defaultUrlWithoutProtocol}\n onValueChange={(value) => {\n let newValue = normalizeProtocol(value);\n onValueChange?.(newValue);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder={placeholderUrl}\n className=\"-mly-ms-px mly-block mly-h-8 mly-w-52 mly-rounded-lg mly-rounded-s-none mly-border mly-border-gray-300 mly-px-2 mly-py-1.5 mly-pr-6 mly-text-sm mly-shadow-sm mly-outline-none placeholder:mly-text-gray-400\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable =\n autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n } else {\n value = normalizeProtocol(value);\n }\n\n onValueChange?.(value, isVariable);\n setIsOpen(false);\n }}\n />\n </>\n )}\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n","import { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\n\ntype ImageSizeProps = {\n value: string;\n onValueChange: (value: string) => void;\n dimension: 'width' | 'height';\n};\n\nexport function ImageSize(props: ImageSizeProps) {\n const { value, onValueChange, dimension } = props;\n\n return (\n <label className=\"mly-relative mly-flex mly-items-center\">\n <span className=\"mly-absolute mly-inset-y-0 mly-left-2 mly-flex mly-items-center mly-text-xs mly-leading-none mly-text-gray-400\">\n {dimension === 'width' ? 'W' : 'H'}\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n className=\"hide-number-controls mly-h-auto mly-max-w-20 mly-appearance-none mly-border-0 mly-border-none mly-p-1 mly-px-[26px] mly-text-sm mly-uppercase mly-tabular-nums mly-outline-none focus-visible:mly-outline-none\"\n type=\"number\"\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n />\n <span className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center mly-text-xs mly-leading-none mly-text-gray-400\">\n PX\n </span>\n </label>\n );\n}\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { LogoView } from './logo-view';\n\nexport const allowedLogoSize = ['sm', 'md', 'lg'] as const;\nexport type AllowedLogoSize = (typeof allowedLogoSize)[number];\n\nexport const allowedLogoAlignment = ['left', 'center', 'right'] as const;\nexport type AllowedLogoAlignment = (typeof allowedLogoAlignment)[number];\n\ninterface LogoOptions {\n src: string;\n alt?: string;\n title?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n}\n\nexport interface LogoAttributes {\n src?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n\n showIfKey: string;\n isSrcVariable?: boolean;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n logo: {\n setLogoImage: (options: LogoOptions) => ReturnType;\n setLogoAttributes: (attributes: Partial<LogoAttributes>) => ReturnType;\n };\n }\n}\n\nconst DEFAULT_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_LOGO_SIZE: AllowedLogoSize = 'sm';\n\nexport const logoSizes: Record<AllowedLogoSize, string> = {\n sm: '40px',\n md: '48px',\n lg: '64px',\n};\n\nfunction getAlignmentStyle(alignment: AllowedLogoAlignment): string[] {\n const alignments: Record<AllowedLogoAlignment, string[]> = {\n left: ['margin-right:auto', 'margin-left:0'],\n center: ['margin-right:auto', 'margin-left:auto'],\n right: ['margin-right:0', 'margin-left:auto'],\n };\n\n return alignments[alignment] || alignments[DEFAULT_ALIGNMENT];\n}\n\nexport const LogoExtension = TiptapImage.extend({\n name: 'logo',\n priority: 1000,\n\n addAttributes() {\n return {\n ...this.parent?.(),\n 'maily-component': {\n default: 'logo',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element: Element) =>\n element.getAttribute('data-maily-component'),\n },\n size: {\n default: DEFAULT_LOGO_SIZE,\n parseHTML: (element) =>\n element.getAttribute('data-size') as AllowedLogoSize,\n renderHTML: (attributes) => {\n return {\n 'data-size': attributes.size,\n };\n },\n },\n alignment: {\n default: DEFAULT_ALIGNMENT,\n parseHTML: (element) =>\n element.getAttribute('data-alignment') as AllowedLogoAlignment,\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n };\n },\n addCommands() {\n return {\n setLogoImage:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n setLogoAttributes:\n (attributes) =>\n ({ commands }) => {\n return commands.updateAttributes('logo', attributes);\n },\n };\n },\n parseHTML() {\n return [\n {\n tag: `img[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n addNodeView() {\n return ReactNodeViewRenderer(LogoView, {\n className: 'mly-relative',\n });\n },\n});\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes, Node } from '@tiptap/core';\n\nexport const DEFAULT_SECTION_BACKGROUND_COLOR = '#f7f7f7';\nexport const DEFAULT_SECTION_ALIGN = 'left';\nexport const DEFAULT_SECTION_BORDER_WIDTH = 2;\nexport const DEFAULT_SECTION_BORDER_COLOR = '#e2e2e2';\nexport const DEFAULT_SECTION_BORDER_RADIUS = 0;\n\nexport const DEFAULT_SECTION_MARGIN_TOP = 0;\nexport const DEFAULT_SECTION_MARGIN_RIGHT = 0;\nexport const DEFAULT_SECTION_MARGIN_BOTTOM = 0;\nexport const DEFAULT_SECTION_MARGIN_LEFT = 0;\n\nexport const DEFAULT_SECTION_PADDING_TOP = 5;\nexport const DEFAULT_SECTION_PADDING_RIGHT = 5;\nexport const DEFAULT_SECTION_PADDING_BOTTOM = 5;\nexport const DEFAULT_SECTION_PADDING_LEFT = 5;\n\nexport const DEFAULT_SECTION_SHOW_IF_KEY = null;\n\ntype SectionAttributes = {\n borderRadius: number;\n backgroundColor: string;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n marginTop: number;\n marginRight: number;\n marginBottom: number;\n marginLeft: number;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string | null;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n section: {\n setSection: () => ReturnType;\n updateSection: (attrs: Partial<SectionAttributes>) => ReturnType;\n };\n }\n}\n\nexport const SectionExtension = Node.create({\n name: 'section',\n group: 'block',\n content: '(block|columns)+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n borderRadius: {\n default: 0,\n parseHTML: (element) => {\n return Number(element?.style?.borderRadius?.replace(/['\"]+/g, ''));\n },\n renderHTML: (attributes) => {\n if (!attributes.borderRadius) {\n return {};\n }\n\n return {\n style: `border-radius: ${attributes.borderRadius}px`,\n };\n },\n },\n backgroundColor: {\n default: DEFAULT_SECTION_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return element.style.backgroundColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n\n return {\n style: `background-color: ${attributes.backgroundColor};--bg-color: ${attributes.backgroundColor}`,\n };\n },\n },\n align: {\n default: DEFAULT_SECTION_ALIGN,\n parseHTML: (element) => {\n return element.getAttribute('align') || DEFAULT_SECTION_ALIGN;\n },\n renderHTML(attributes) {\n if (!attributes.align) {\n return {};\n }\n\n return {\n align: attributes.align,\n };\n },\n },\n borderWidth: {\n default: DEFAULT_SECTION_BORDER_WIDTH,\n parseHTML: (element) => {\n return (\n Number(element?.style?.borderWidth?.replace(/['\"]+/g, '')) || 0\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.borderWidth) {\n return {};\n }\n\n return {\n style: `border-width: ${attributes.borderWidth}px`,\n };\n },\n },\n borderColor: {\n default: DEFAULT_SECTION_BORDER_COLOR,\n parseHTML: (element) => {\n return element.style.borderColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.borderColor) {\n return {};\n }\n\n return {\n style: `border-color: ${attributes.borderColor}`,\n };\n },\n },\n paddingTop: {\n default: DEFAULT_SECTION_PADDING_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.paddingTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.paddingTop) {\n return {};\n }\n\n return {\n style: `padding-top: ${attributes.paddingTop}px`,\n };\n },\n },\n paddingRight: {\n default: DEFAULT_SECTION_PADDING_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.paddingRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingRight) {\n return {};\n }\n\n return {\n style: `padding-right: ${attributes.paddingRight}px`,\n };\n },\n },\n paddingBottom: {\n default: DEFAULT_SECTION_PADDING_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.paddingBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingBottom) {\n return {};\n }\n\n return {\n style: `padding-bottom: ${attributes.paddingBottom}px`,\n };\n },\n },\n paddingLeft: {\n default: DEFAULT_SECTION_PADDING_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.paddingLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingLeft) {\n return {};\n }\n\n return {\n style: `padding-left: ${attributes.paddingLeft}px`,\n };\n },\n },\n marginTop: {\n default: DEFAULT_SECTION_MARGIN_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.marginTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.marginTop) {\n return {};\n }\n\n return {\n marginTop: attributes.marginTop,\n };\n },\n },\n marginRight: {\n default: DEFAULT_SECTION_MARGIN_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.marginRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginRight) {\n return {};\n }\n\n return {\n marginRight: attributes.marginRight,\n };\n },\n },\n marginBottom: {\n default: DEFAULT_SECTION_MARGIN_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.marginBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginBottom) {\n return {};\n }\n\n return {\n marginBottom: attributes.marginBottom,\n };\n },\n },\n marginLeft: {\n default: DEFAULT_SECTION_MARGIN_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.marginLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginLeft) {\n return {};\n }\n\n return {\n marginLeft: attributes.marginLeft,\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSection:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n type: this.name,\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateSection: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const {\n marginTop = 0,\n marginRight = 0,\n marginBottom = 0,\n marginLeft = 0,\n } = HTMLAttributes;\n\n return [\n 'table',\n {\n 'data-type': this.name,\n border: 0,\n cellpadding: 0,\n cellspacing: 0,\n class: 'mly-w-full mly-border-separate mly-relative mly-table-fixed',\n style: `margin-top: ${marginTop}px; margin-right: ${marginRight}px; margin-bottom: ${marginBottom}px; margin-left: ${marginLeft}px;`,\n },\n [\n 'tbody',\n {\n class: 'mly-w-full',\n },\n [\n 'tr',\n {\n class: 'mly-w-full',\n },\n [\n 'td',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'section-cell',\n style: 'border-style: solid',\n class: 'mly-w-full [text-align:revert-layer]',\n }),\n 0,\n ],\n ],\n ],\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'table[data-type=\"section\"]',\n },\n ];\n },\n});\n","import { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { useEffect } from 'react';\nimport { useState } from 'react';\nimport { LogoAttributes, logoSizes } from './logo';\nimport { ImageStatus, ImageStatusLabel } from '../image/image-view';\n\nexport function LogoView(props: NodeViewProps) {\n const { node } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n\n let {\n alignment = 'center',\n src: logoSrc,\n isSrcVariable,\n size = 'sm',\n } = (node.attrs || {}) as LogoAttributes;\n\n const hasImageSrc = !!logoSrc;\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!logoSrc) {\n return;\n }\n\n setStatus('loading');\n const img = new Image();\n img.src = logoSrc;\n img.onload = () => {\n setStatus('loaded');\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [logoSrc]);\n\n const logoSize = logoSizes[size];\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable\n data-drag-handle\n style={{\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n }}\n >\n {!hasImageSrc && <ImageStatusLabel status=\"idle\" />}\n {hasImageSrc && isSrcVariable && <ImageStatusLabel status=\"variable\" />}\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <img\n src={logoSrc}\n alt=\"Logo\"\n style={{\n height: logoSize,\n width: logoSize,\n cursor: 'default',\n marginBottom: 0,\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment] || {}),\n }}\n />\n )}\n </NodeViewWrapper>\n );\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react';\n\nexport const useEvent = <T extends (...args: any[]) => any>(handler: T): T => {\n const handlerRef = useRef<T | null>(null);\n\n useLayoutEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n return useCallback((...args: Parameters<T>): ReturnType<T> => {\n if (handlerRef.current === null) {\n throw new Error('Handler is not assigned');\n }\n return handlerRef.current(...args);\n }, []) as T;\n};\n","import { cn } from '@/editor/utils/classname';\nimport { useEvent } from '@/editor/utils/use-event';\nimport { type NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Ban, BracesIcon, ImageOffIcon, Loader2 } from 'lucide-react';\nimport { type CSSProperties, useEffect, useRef, useState } from 'react';\n\nconst MIN_WIDTH = 20;\nconst MAX_WIDTH = 600;\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport function ImageView(props: NodeViewProps) {\n const { node, updateAttributes, selected } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const [resizingStyle, setResizingStyle] = useState<\n Pick<CSSProperties, 'width' | 'height'> | undefined\n >();\n\n const handleMouseDown = useEvent(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const imageParent = document.querySelector(\n '.ProseMirror-selectednode'\n ) as HTMLDivElement;\n\n if (!imgRef.current || !imageParent || !selected) {\n return;\n }\n\n const imageParentWidth = Math.max(imageParent.offsetWidth, MAX_WIDTH);\n\n event.preventDefault();\n const direction = event.currentTarget.dataset.direction || '--';\n const initialXPosition = event.clientX;\n const currentWidth = imgRef.current.width;\n const currentHeight = imgRef.current.height;\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n const transform = direction[1] === 'w' ? -1 : 1;\n\n const removeListeners = () => {\n window.removeEventListener('mousemove', mouseMoveHandler);\n window.removeEventListener('mouseup', removeListeners);\n updateAttributes({ width: newWidth, height: newHeight });\n setResizingStyle(undefined);\n };\n\n const mouseMoveHandler = (event: MouseEvent) => {\n newWidth = Math.max(\n currentWidth + transform * (event.clientX - initialXPosition),\n MIN_WIDTH\n );\n\n if (newWidth > imageParentWidth) {\n newWidth = imageParentWidth;\n }\n\n newHeight = (newWidth / currentWidth) * currentHeight;\n\n setResizingStyle({ width: newWidth, height: newHeight });\n // If mouse is up, remove event listeners\n if (!event.buttons) {\n return removeListeners();\n }\n };\n\n window.addEventListener('mousemove', mouseMoveHandler);\n window.addEventListener('mouseup', removeListeners);\n }\n );\n\n function dragCornerButton(direction: string) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onMouseDown={handleMouseDown}\n data-direction={direction}\n className=\"mly-bg-rose-500\"\n style={{\n position: 'absolute',\n height: '10px',\n width: '10px',\n ...{ n: { top: 0 }, s: { bottom: 0 } }[direction[0]],\n ...{ w: { left: 0 }, e: { right: 0 } }[direction[1]],\n cursor: `${direction}-resize`,\n }}\n />\n );\n }\n\n let { alignment = 'center', width, height, src } = node.attrs || {};\n const {\n externalLink,\n isExternalLinkVariable,\n isSrcVariable,\n showIfKey,\n ...attrs\n } = node.attrs || {};\n\n const hasImageSrc = !!attrs.src;\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!src) {\n return;\n }\n\n setStatus('loading');\n const img = new Image();\n img.src = src;\n img.onload = () => {\n setStatus('loaded');\n // for some reason Apple Mail doesn't respect the width and height attributes\n // update the dimensions to ensure that the image is not stretched\n const { naturalWidth, naturalHeight } = img;\n const wrapper = wrapperRef?.current;\n if (!wrapper || width !== 'auto' || !naturalWidth) {\n return;\n }\n\n const wrapperWidth = wrapper.offsetWidth;\n const aspectRatio = naturalWidth / naturalHeight;\n const calculatedHeight = Math.min(\n wrapperWidth / aspectRatio,\n naturalHeight\n );\n\n updateAttributes({\n width: Math.min(wrapperWidth, naturalWidth),\n height: Math.min(calculatedHeight, naturalHeight),\n });\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [src]);\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable\n data-drag-handle\n style={{\n ...(hasImageSrc && status === 'loaded'\n ? {\n width: `${width}px`,\n height: `${height}px`,\n ...resizingStyle,\n }\n : {}),\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment as string] || {}),\n }}\n ref={wrapperRef}\n >\n {!hasImageSrc && <ImageStatusLabel status=\"idle\" />}\n {hasImageSrc && isSrcVariable && <ImageStatusLabel status=\"variable\" />}\n\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <>\n <img\n {...attrs}\n ref={imgRef}\n style={{\n ...resizingStyle,\n cursor: 'default',\n marginBottom: 0,\n }}\n />\n\n {selected && (\n <>\n {/* Don't use a simple border as it pushes other content around. */}\n {[\n { left: 0, top: 0, height: '100%', width: '1px' },\n { right: 0, top: 0, height: '100%', width: '1px' },\n { top: 0, left: 0, width: '100%', height: '1px' },\n { bottom: 0, left: 0, width: '100%', height: '1px' },\n ].map((style, i) => (\n <div\n key={i}\n className=\"mly-bg-rose-500\"\n style={{\n position: 'absolute',\n ...style,\n }}\n />\n ))}\n {dragCornerButton('nw')}\n {dragCornerButton('ne')}\n {dragCornerButton('sw')}\n {dragCornerButton('se')}\n </>\n )}\n </>\n )}\n </NodeViewWrapper>\n );\n}\n\ntype ImageStatusLabelProps = {\n status: ImageStatus | 'variable';\n};\n\nexport function ImageStatusLabel(props: ImageStatusLabelProps) {\n const { status } = props;\n return (\n <div\n className={cn(\n 'mly-flex mly-items-center mly-gap-2 mly-rounded-lg mly-bg-soft-gray mly-p-4 mly-text-sm mly-font-medium',\n {\n 'mly-text-gray-500 hover:mly-bg-soft-gray/60': status === 'loading',\n 'mly-text-red-500 hover:mly-bg-soft-gray/60': status === 'error',\n }\n )}\n >\n {status === 'idle' && (\n <>\n <ImageOffIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>No image selected</span>\n </>\n )}\n {status === 'loading' && (\n <>\n <Loader2 className=\"mly-size-4 mly-animate-spin mly-stroke-[2.5]\" />\n <span>Loading image...</span>\n </>\n )}\n {status === 'error' && (\n <>\n <Ban className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Error loading image</span>\n </>\n )}\n {status === 'variable' && (\n <>\n <BracesIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Variable Image URL</span>\n </>\n )}\n </div>\n );\n}\n","import { DEFAULT_LOGO_SIZE } from '@/editor/nodes/logo/logo';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useImageState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: ({ editor }) => {\n return {\n width: editor.getAttributes('image').width,\n height: editor.getAttributes('image').height,\n isImageActive: editor.isActive('image'),\n isLogoActive: editor.isActive('logo'),\n alignment:\n editor.getAttributes('image')?.alignment ||\n editor.getAttributes('logo')?.alignment,\n\n logoSize: editor.getAttributes('logo')?.size || DEFAULT_LOGO_SIZE,\n imageSrc:\n editor.getAttributes('image')?.src ||\n editor.getAttributes('logo')?.src ||\n '',\n isSrcVariable:\n editor.getAttributes('image')?.isSrcVariable ??\n editor.getAttributes('logo')?.isSrcVariable ??\n false,\n imageExternalLink: editor.getAttributes('image')?.externalLink || '',\n isExternalLinkVariable:\n editor.getAttributes('image')?.isExternalLinkVariable,\n\n currentShowIfKey:\n editor.getAttributes('image')?.showIfKey ||\n editor.getAttributes('logo')?.showIfKey ||\n '',\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { deleteNode } from '@/editor/utils/delete-node';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { BubbleMenu, findChildren } from '@tiptap/react';\nimport { ChevronUp, Trash } from 'lucide-react';\nimport { useCallback } from 'react';\nimport { sticky } from 'tippy.js';\nimport { getRenderContainer } from '../../utils/get-render-container';\nimport { AlignmentSwitch } from '../alignment-switch';\nimport { BaseButton } from '../base-button';\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { ColumnsBubbleMenuContent } from '../column-menu/columns-bubble-menu-content';\nimport { BorderColor } from '../icons/border-color';\nimport { MarginIcon } from '../icons/margin-icon';\nimport { PaddingIcon } from '../icons/padding-icon';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { ShowPopover } from '../show-popover';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { ColorPicker } from '../ui/color-picker';\nimport { Divider } from '../ui/divider';\nimport { Select } from '../ui/select';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { useSectionState } from './use-section-state';\nimport { getClosestNodeByName } from '@/editor/utils/columns';\n\nexport function SectionBubbleMenu(props: EditorBubbleMenuProps) {\n const { appendTo, editor } = props;\n if (!editor) {\n return null;\n }\n\n const getReferenceClientRect = useCallback(() => {\n const renderContainer = getRenderContainer(editor!, 'section');\n const rect =\n renderContainer?.getBoundingClientRect() ||\n new DOMRect(-1000, -1000, 0, 0);\n\n return rect;\n }, [editor]);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n const activeSectionNode = getClosestNodeByName(editor, 'section');\n const forNodeChildren = activeSectionNode\n ? findChildren(activeSectionNode?.node, (node) => {\n return node.type.name === 'for';\n })?.[0]\n : null;\n const hasActiveForNodeChildren =\n forNodeChildren && editor.isActive('for');\n\n if (isTextSelected(editor) || hasActiveForNodeChildren) {\n return false;\n }\n\n return editor.isActive('section');\n },\n tippyOptions: {\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n appendTo: () => appendTo?.current,\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: 'auto',\n },\n pluginKey: 'sectionBubbleMenu',\n };\n\n const state = useSectionState(editor);\n\n const borderRadiusOptions = [\n { value: '0', label: 'Sharp' },\n { value: '6', label: 'Smooth' },\n { value: '9999', label: 'Round' },\n ];\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-items-stretch mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n <AlignmentSwitch\n alignment={state.currentAlignment}\n onAlignmentChange={(alignment) => {\n editor?.commands?.updateSection({\n align: alignment,\n });\n }}\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <Select\n label=\"Border Radius\"\n value={String(state.currentBorderRadius)}\n options={borderRadiusOptions}\n onValueChange={(value) => {\n editor?.commands?.updateSection({\n borderRadius: Number(value),\n });\n }}\n tooltip=\"Border Radius\"\n className=\"mly-capitalize\"\n />\n\n <Select\n label=\"Border Width\"\n value={String(state.currentBorderWidth)}\n options={[\n { value: '0', label: 'None' },\n { value: '1', label: 'Thin' },\n { value: '2', label: 'Medium' },\n { value: '3', label: 'Thick' },\n ]}\n onValueChange={(value) => {\n editor?.commands?.updateSection({\n borderWidth: Number(value),\n });\n }}\n tooltip=\"Border Width\"\n className=\"mly-capitalize\"\n />\n </div>\n\n <Divider />\n\n <Select\n icon={MarginIcon}\n iconClassName=\"mly-stroke-[1.2] mly-size-3.5\"\n label=\"Margin\"\n value={String(state.currentMarginTop)}\n options={[\n { value: '0', label: 'None' },\n { value: '4', label: 'Small' },\n { value: '8', label: 'Medium' },\n { value: '12', label: 'Large' },\n ]}\n onValueChange={(_value) => {\n const value = Number(_value);\n editor?.commands?.updateSection({\n marginTop: value,\n marginRight: value,\n marginBottom: value,\n marginLeft: value,\n });\n }}\n tooltip=\"Margin\"\n className=\"mly-capitalize\"\n />\n\n <Divider />\n\n <Select\n icon={PaddingIcon}\n iconClassName=\"mly-stroke-[1]\"\n label=\"Padding\"\n value={String(state.currentPaddingTop)}\n options={[\n { value: '0', label: 'None' },\n { value: '4', label: 'Small' },\n { value: '8', label: 'Medium' },\n { value: '12', label: 'Large' },\n ]}\n onValueChange={(_value) => {\n const value = Number(_value);\n editor?.commands?.updateSection({\n paddingTop: value,\n paddingRight: value,\n paddingBottom: value,\n paddingLeft: value,\n });\n }}\n tooltip=\"Padding\"\n className=\"mly-capitalize\"\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <ColorPicker\n color={state.currentBorderColor}\n onColorChange={(color) => {\n editor?.commands?.updateSection({\n borderColor: color,\n });\n }}\n tooltip=\"Border Color\"\n >\n <BaseButton\n variant=\"ghost\"\n className=\"!mly-size-7 mly-shrink-0\"\n size=\"sm\"\n type=\"button\"\n >\n <BorderColor\n className=\"mly-size-3 mly-shrink-0\"\n topBarClassName=\"mly-stroke-midnight-gray\"\n style={{\n color: state.currentBorderColor,\n }}\n />\n </BaseButton>\n </ColorPicker>\n <ColorPicker\n color={state.currentBackgroundColor}\n onColorChange={(color) => {\n editor?.commands?.updateSection({\n backgroundColor: color,\n });\n }}\n backgroundColor={state.currentBackgroundColor}\n tooltip=\"Background Color\"\n className=\"mly-rounded-full mly-border-[1.5px] mly-border-white mly-shadow\"\n />\n </div>\n\n <Divider />\n\n <BubbleMenuButton\n icon={Trash}\n tooltip=\"Delete Section\"\n command={() => {\n deleteNode(editor, 'section');\n }}\n />\n\n <Divider />\n\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.updateSection({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n\n {state.isColumnsActive && (\n <>\n <Divider />\n <Popover>\n <PopoverTrigger className=\"mly-flex mly-items-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray\">\n Column\n <ChevronUp className=\"mly-h-3 mly-w-3\" />\n </PopoverTrigger>\n <PopoverContent\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"end\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <ColumnsBubbleMenuContent editor={editor} />\n </PopoverContent>\n </Popover>\n </>\n )}\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function BorderColor(\n props: SVGProps<SVGSVGElement> & { topBarClassName?: string }\n) {\n const { topBarClassName, ...rest } = props;\n\n return (\n <svg\n width={11}\n height={12}\n viewBox=\"0 0 11 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path d=\"M0 11H10.6667\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M0.666504 9V6.33333C0.666504 3.38781 3.05432 1 5.99984 1H10.6665\"\n strokeWidth=\"1.5\"\n className={topBarClassName}\n />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function MarginIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={12}\n height={12}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M10.5 10.499V1.49902M1.5 10.499V1.49902M4.5 5.99902C4.5 5.53308 4.5 5.30011 4.57612 5.11634C4.67761 4.87131 4.87229 4.67664 5.11732 4.57514C5.30109 4.49902 5.53406 4.49902 6 4.49902C6.46594 4.49902 6.69891 4.49902 6.88268 4.57514C7.12771 4.67664 7.32239 4.87131 7.42388 5.11634C7.5 5.30011 7.5 5.53308 7.5 5.99902C7.5 6.46496 7.5 6.69794 7.42388 6.88171C7.32239 7.12673 7.12771 7.32141 6.88268 7.4229C6.69891 7.49902 6.46594 7.49902 6 7.49902C5.53406 7.49902 5.30109 7.49902 5.11732 7.4229C4.87229 7.32141 4.67761 7.12673 4.57612 6.88171C4.5 6.69794 4.5 6.46496 4.5 5.99902Z\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function PaddingIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={10}\n height={10}\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.50244 0.501526L9.10244 0.501526C8.54239 0.501526 8.26236 0.501526 8.04845 0.610519C7.86029 0.706392 7.70731 0.859373 7.61144 1.04754C7.50244 1.26145 7.50244 1.54147 7.50244 2.10153V7.90153C7.50244 8.46158 7.50244 8.74161 7.61144 8.95552C7.70731 9.14368 7.86029 9.29666 8.04845 9.39253C8.26236 9.50153 8.54239 9.50153 9.10244 9.50153H9.50244M0.502441 0.501527L0.902441 0.501527C1.46249 0.501527 1.74252 0.501527 1.95643 0.61052C2.14459 0.706393 2.29757 0.859374 2.39345 1.04754C2.50244 1.26145 2.50244 1.54147 2.50244 2.10153L2.50244 7.90153C2.50244 8.46158 2.50244 8.74161 2.39345 8.95552C2.29757 9.14368 2.14459 9.29666 1.95643 9.39253C1.74252 9.50153 1.46249 9.50153 0.902442 9.50153H0.502442M4.99994 7.99903V1.99903\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","'use client';\n\nimport { HexColorPicker, HexColorInput } from 'react-colorful';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ReactNode } from 'react';\n\ntype ColorPickerProps = {\n color: string;\n onColorChange: (color: string) => void;\n\n borderColor?: string;\n backgroundColor?: string;\n tooltip?: string;\n className?: string;\n\n children?: ReactNode;\n onClose?: (color: string) => void;\n suggestedColors?: string[];\n};\n\nexport function ColorPicker(props: ColorPickerProps) {\n const {\n color,\n onColorChange,\n borderColor,\n backgroundColor,\n tooltip,\n className,\n\n children,\n onClose,\n\n suggestedColors = [],\n } = props;\n\n const handleColorChange = (color: string) => {\n // HACK: This is a workaround for a bug in tiptap\n // https://github.com/ueberdosis/tiptap/issues/3580\n //\n // ERROR: flushSync was called from inside a lifecycle\n //\n // To fix this, we need to make sure that the onChange\n // callback is run after the current execution context.\n queueMicrotask(() => {\n onColorChange(color);\n });\n };\n\n const popoverButton = (\n <PopoverTrigger asChild>\n {children || (\n <BaseButton\n variant=\"ghost\"\n className=\"!mly-size-7 mly-shrink-0\"\n size=\"sm\"\n type=\"button\"\n >\n <div\n className={cn(\n 'mly-h-4 mly-w-4 mly-shrink-0 mly-rounded mly-border-2 mly-border-gray-700',\n className\n )}\n style={{\n ...(borderColor ? { borderColor } : {}),\n backgroundColor: backgroundColor || 'transparent',\n }}\n />\n </BaseButton>\n )}\n </PopoverTrigger>\n );\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (!open) {\n onClose?.(color);\n }\n }}\n >\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n className=\"mly-w-full mly-rounded-none mly-border-0 !mly-bg-transparent !mly-p-0 mly-shadow-none mly-drop-shadow-md\"\n sideOffset={8}\n >\n <div className=\"mly-min-w-[260px] mly-rounded-xl mly-border mly-bg-white mly-p-4\">\n <HexColorPicker\n color={color}\n onChange={handleColorChange}\n className=\"mly-flex !mly-w-full mly-flex-col mly-gap-4\"\n />\n <HexColorInput\n alpha={true}\n color={color}\n onChange={handleColorChange}\n className=\"mly-mt-4 mly-w-full mly-min-w-0 mly-rounded-lg mly-border mly-px-2 mly-py-1.5 mly-text-sm mly-uppercase focus-visible:mly-border-gray-400 focus-visible:mly-outline-none\"\n prefixed\n />\n\n {suggestedColors.length > 0 && (\n <div>\n <div className=\"-mly-mx-4 mly-my-4 mly-h-px mly-bg-gray-200\" />\n\n <h2 className=\"mly-text-xs mly-text-gray-500\">Recently used</h2>\n\n <div className=\"mly-mt-2 mly-flex mly-flex-wrap mly-gap-0.5\">\n {suggestedColors.map((suggestedColor) => (\n <BaseButton\n key={suggestedColor}\n variant=\"ghost\"\n size=\"sm\"\n className=\"!mly-size-7 mly-shrink-0\"\n type=\"button\"\n onClick={() => handleColorChange(suggestedColor)}\n >\n <div\n className=\"mly-h-4 mly-w-4 mly-shrink-0 mly-rounded\"\n style={{\n backgroundColor: suggestedColor,\n }}\n />\n </BaseButton>\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import {\n DEFAULT_SECTION_BACKGROUND_COLOR,\n DEFAULT_SECTION_BORDER_COLOR,\n} from '@/editor/nodes/section/section';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useSectionState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n currentAlignment: ctx.editor.getAttributes('section')?.align || 'left',\n\n currentBorderRadius:\n Number(ctx.editor.getAttributes('section')?.borderRadius) || 0,\n currentBackgroundColor:\n ctx.editor.getAttributes('section')?.backgroundColor ||\n DEFAULT_SECTION_BACKGROUND_COLOR,\n\n currentBorderColor:\n ctx.editor.getAttributes('section')?.borderColor ||\n DEFAULT_SECTION_BORDER_COLOR,\n currentBorderWidth:\n Number(ctx.editor.getAttributes('section')?.borderWidth) || 0,\n\n currentMarginTop:\n Number(ctx.editor.getAttributes('section')?.marginTop) || 0,\n currentMarginRight:\n Number(ctx.editor.getAttributes('section')?.marginRight) || 0,\n currentMarginBottom:\n Number(ctx.editor.getAttributes('section')?.marginBottom) || 0,\n currentMarginLeft:\n Number(ctx.editor.getAttributes('section')?.marginLeft) || 0,\n\n currentPaddingTop:\n Number(ctx.editor.getAttributes('section')?.paddingTop) || 0,\n currentPaddingRight:\n Number(ctx.editor.getAttributes('section')?.paddingRight) || 0,\n currentPaddingBottom:\n Number(ctx.editor.getAttributes('section')?.paddingBottom) || 0,\n currentPaddingLeft:\n Number(ctx.editor.getAttributes('section')?.paddingLeft) || 0,\n\n isColumnsActive: ctx.editor.isActive('columns'),\n\n currentShowIfKey: ctx.editor.getAttributes('section')?.showIfKey || '',\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { BubbleMenu } from '@tiptap/react';\n\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { allowedSpacerSize } from '../../nodes/spacer';\nimport {\n BubbleMenuItem,\n EditorBubbleMenuProps,\n} from '../text-menu/text-bubble-menu';\nimport { Divider } from '../ui/divider';\nimport { useSpacerState } from './use-spacer-state';\nimport { ShowPopover } from '../show-popover';\nimport { TooltipProvider } from '../ui/tooltip';\n\nexport function SpacerBubbleMenu(props: EditorBubbleMenuProps) {\n const { editor, appendTo } = props;\n if (!editor) {\n return null;\n }\n\n const items: BubbleMenuItem[] = allowedSpacerSize.map((height) => ({\n name: height,\n isActive: () => editor?.isActive('spacer', { height })!,\n command: () => {\n editor?.chain().focus().setSpacer({ height }).run();\n },\n }));\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => editor.isActive('spacer'),\n tippyOptions: {\n maxWidth: '100%',\n moveTransition: 'mly-transform 0.15s mly-ease-out',\n },\n };\n\n const state = useSpacerState(editor);\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-gap-0.5 mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n {items.map((item, index) => (\n <BubbleMenuButton\n key={index}\n className=\"!mly-h-7 mly-w-7 mly-shrink-0 mly-p-0\"\n iconClassName=\"mly-w-3 mly-h-3\"\n nameClassName=\"mly-text-xs\"\n {...item}\n />\n ))}\n <Divider />\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.setSpacerShowIfKey(value);\n }}\n editor={editor}\n />\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from './section/section';\n\nexport const allowedSpacerSize = ['sm', 'md', 'lg', 'xl'] as const;\nexport type AllowedSpacerSize = (typeof allowedSpacerSize)[number];\n\nexport interface SpacerOptions {\n height: AllowedSpacerSize;\n showIfKey: string;\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n spacer: {\n setSpacer: (options: { height: AllowedSpacerSize }) => ReturnType;\n setSpacerSize: (height: AllowedSpacerSize) => ReturnType;\n setSpacerShowIfKey: (showIfKey: string) => ReturnType;\n unsetSpacer: () => ReturnType;\n };\n }\n}\n\nconst DEFAULT_HEIGHT: AllowedSpacerSize = 'sm';\n\nfunction getHeightStyle(height: AllowedSpacerSize): string {\n const heights = { sm: '8px', md: '16px', lg: '32px', xl: '64px' };\n\n return `width: 100%; height: ${heights[height] || heights[DEFAULT_HEIGHT]}`;\n}\n\nexport const Spacer = Node.create<SpacerOptions>({\n name: 'spacer',\n priority: 1000,\n\n group: 'block',\n draggable: true,\n addAttributes() {\n return {\n height: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-height'),\n renderHTML: (attributes) => {\n return {\n 'data-height': attributes.height,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSpacer:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n height: options.height,\n },\n });\n },\n\n setSpacerSize:\n (height) =>\n ({ commands }) => {\n if (!allowedSpacerSize.includes(height)) {\n throw new Error('Invalid spacer height');\n }\n return commands.updateAttributes('spacer', { height });\n },\n\n setSpacerShowIfKey:\n (showIfKey) =>\n ({ commands }) => {\n return commands.updateAttributes('spacer', { showIfKey });\n },\n\n unsetSpacer:\n () =>\n ({ commands }) => {\n return commands.deleteNode('spacer');\n },\n };\n },\n renderHTML({ HTMLAttributes, node }) {\n const { height } = node.attrs as SpacerOptions;\n HTMLAttributes.style = getHeightStyle(height);\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n this.options.HTMLAttributes,\n HTMLAttributes,\n {\n class: 'spacer mly-relative mly-z-50',\n contenteditable: false,\n }\n ),\n ];\n },\n parseHTML() {\n return [{ tag: `div[data-maily-component=\"${this.name}\"]` }];\n },\n});\n","import { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useSpacerState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n currentShowIfKey: ctx.editor.getAttributes('spacer')?.showIfKey || '',\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { BubbleMenu, BubbleMenuProps } from '@tiptap/react';\nimport {\n BoldIcon,\n CodeIcon,\n ItalicIcon,\n List,\n ListOrdered,\n LucideIcon,\n StrikethroughIcon,\n UnderlineIcon,\n} from 'lucide-react';\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { ColorPicker } from '../ui/color-picker';\nimport { BaseButton } from '../base-button';\nimport { useTextMenuState } from './use-text-menu-state';\nimport { isCustomNodeSelected } from '@/editor/utils/is-custom-node-selected';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { LinkInputPopover } from '../ui/link-input-popover';\nimport { Divider } from '../ui/divider';\nimport { AlignmentSwitch } from '../alignment-switch';\nimport { SVGIcon } from '../icons/grid-lines';\nimport { SectionExtension } from '@/editor/nodes/section/section';\nimport { ColumnExtension } from '@/editor/nodes/columns/column';\nimport { ColumnsExtension } from '@/editor/nodes/columns/columns';\nimport { ForExtension } from '@/editor/nodes/for/for';\nimport { TurnIntoBlock } from './turn-into-block';\nimport { useTurnIntoBlockOptions } from './use-turn-into-block-options';\n\nexport interface BubbleMenuItem {\n name?: string;\n isActive?: () => boolean;\n command?: () => void;\n shouldShow?: () => boolean;\n icon?: LucideIcon | SVGIcon;\n className?: string;\n iconClassName?: string;\n nameClassName?: string;\n disbabled?: boolean;\n\n tooltip?: string;\n}\n\nexport type EditorBubbleMenuProps = Omit<BubbleMenuProps, 'children'> & {\n appendTo?: React.RefObject<any>;\n};\n\nexport function TextBubbleMenu(props: EditorBubbleMenuProps) {\n const { editor, appendTo } = props;\n\n if (!editor) {\n return null;\n }\n\n const items: BubbleMenuItem[] = [\n {\n name: 'bold',\n isActive: () => editor?.isActive('bold')!,\n command: () => editor?.chain().focus().toggleBold().run()!,\n icon: BoldIcon,\n tooltip: 'Bold',\n },\n {\n name: 'italic',\n isActive: () => editor?.isActive('italic')!,\n command: () => editor?.chain().focus().toggleItalic().run()!,\n icon: ItalicIcon,\n tooltip: 'Italic',\n },\n {\n name: 'underline',\n isActive: () => editor?.isActive('underline')!,\n command: () => editor?.chain().focus().toggleUnderline().run()!,\n icon: UnderlineIcon,\n tooltip: 'Underline',\n },\n {\n name: 'strike',\n isActive: () => editor?.isActive('strike')!,\n command: () => editor?.chain().focus().toggleStrike().run()!,\n icon: StrikethroughIcon,\n tooltip: 'Strikethrough',\n },\n {\n name: 'code',\n isActive: () => editor?.isActive('code')!,\n command: () => editor?.chain().focus().toggleCode().run()!,\n icon: CodeIcon,\n tooltip: 'Code',\n },\n ];\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n pluginKey: 'textMenu',\n shouldShow: ({ editor, from, view }) => {\n if (!view || editor.view.dragging) {\n return false;\n }\n\n const domAtPos = view.domAtPos(from || 0).node as HTMLElement;\n const nodeDOM = view.nodeDOM(from || 0) as HTMLElement;\n const node = nodeDOM || domAtPos;\n\n if (isCustomNodeSelected(editor, node)) {\n return false;\n }\n\n const nestedNodes = [\n ForExtension.name,\n SectionExtension.name,\n ColumnsExtension.name,\n ColumnExtension.name,\n ];\n\n const isNestedNodeSelected =\n nestedNodes.some((name) => editor.isActive(name)) &&\n node?.classList?.contains('ProseMirror-selectednode');\n return isTextSelected(editor) && !isNestedNodeSelected;\n },\n tippyOptions: {\n popperOptions: {\n placement: 'top-start',\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n boundary: 'viewport',\n padding: 8,\n },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: ['bottom-start', 'top-end', 'bottom-end'],\n },\n },\n ],\n },\n maxWidth: '100%',\n },\n };\n\n const state = useTextMenuState(editor);\n const turnIntoBlockOptions = useTurnIntoBlockOptions(editor);\n const colors = editor?.storage.color.colors as Set<string>;\n const suggestedColors = Array?.from(colors)?.reverse()?.slice(0, 6) ?? [];\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-gap-0.5 mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n <TurnIntoBlock options={turnIntoBlockOptions} />\n\n <Divider className=\"mly-mx-0\" />\n\n {items.map((item, index) => (\n <BubbleMenuButton key={index} {...item} />\n ))}\n\n <AlignmentSwitch\n alignment={state.textAlign}\n onAlignmentChange={(alignment) => {\n editor?.chain().focus().setTextAlign(alignment).run();\n }}\n />\n\n {!state.isListActive && (\n <>\n <BubbleMenuButton\n icon={List}\n command={() => {\n editor.chain().focus().toggleBulletList().run();\n }}\n tooltip=\"Bullet List\"\n />\n <BubbleMenuButton\n icon={ListOrdered}\n command={() => {\n editor.chain().focus().toggleOrderedList().run();\n }}\n tooltip=\"Ordered List\"\n />\n </>\n )}\n\n <LinkInputPopover\n defaultValue={state?.linkUrl ?? ''}\n onValueChange={(value, isVariable) => {\n const defaultValueWithoutProtocol = value.replace(\n /https?:\\/\\//,\n ''\n );\n\n if (!defaultValueWithoutProtocol) {\n editor\n ?.chain()\n .focus()\n .extendMarkRange('link')\n .unsetLink()\n .unsetUnderline()\n .run();\n return;\n }\n\n editor\n ?.chain()\n .extendMarkRange('link')\n .setLink({ href: value })\n .setIsUrlVariable(isVariable ?? false)\n .setUnderline()\n .run()!;\n }}\n tooltip=\"External URL\"\n editor={editor}\n isVariable={state.isUrlVariable}\n />\n\n <Divider className=\"mly-mx-0\" />\n\n <ColorPicker\n color={state.currentTextColor}\n onColorChange={(color) => {\n editor?.chain().setColor(color).run();\n }}\n onClose={(color) => colors.add(color)}\n tooltip=\"Text Color\"\n suggestedColors={suggestedColors}\n >\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"!mly-h-7 mly-w-7 mly-shrink-0 mly-p-0\"\n >\n <div className=\"mly-flex mly-flex-col mly-items-center mly-justify-center mly-gap-[1px]\">\n <span className=\"mly-font-bolder mly-font-mono mly-text-xs mly-text-slate-700\">\n A\n </span>\n <div\n className=\"mly-h-[2px] mly-w-3\"\n style={{ backgroundColor: state.currentTextColor }}\n />\n </div>\n </BaseButton>\n </ColorPicker>\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { AllowedLogoAlignment } from '@/editor/nodes/logo/logo';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const DEFAULT_TEXT_COLOR = '#374151';\n\nexport const useTextMenuState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n currentTextColor:\n ctx.editor.getAttributes('textStyle').color || DEFAULT_TEXT_COLOR,\n\n linkUrl: ctx.editor?.getAttributes('link').href,\n textAlign: (ctx.editor?.isActive({ textAlign: 'left' })\n ? 'left'\n : ctx.editor?.isActive({ textAlign: 'center' })\n ? 'center'\n : ctx.editor?.isActive({ textAlign: 'right' })\n ? 'right'\n : ctx.editor?.isActive({ textAlign: 'justify' })\n ? 'justify'\n : 'left') as AllowedLogoAlignment,\n\n isListActive:\n ctx.editor.isActive('bulletList') ||\n ctx.editor.isActive('orderedList'),\n isUrlVariable: ctx.editor.getAttributes('link').isUrlVariable ?? false,\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { InputRule } from '@tiptap/core';\nimport { HorizontalRule as TipTapHorizontalRule } from '@tiptap/extension-horizontal-rule';\n\nexport const HorizontalRule = TipTapHorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({ state, range }) => {\n const attributes = {};\n\n const { tr } = state;\n const start = range.from;\n const end = range.to;\n\n tr.insert(start - 1, this.type.create(attributes)).delete(\n tr.mapping.map(start),\n tr.mapping.map(end)\n );\n },\n }),\n ];\n },\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n };\n },\n});\n","import { Editor } from '@tiptap/core';\nimport { HorizontalRule } from '../extensions/horizontal-rule';\nimport Image from '@tiptap/extension-image';\nimport { Spacer } from '../nodes/spacer';\nimport { LinkCardExtension } from '../extensions/link-card';\nimport { ButtonExtension } from '../nodes/button/button';\nimport { VariableExtension } from '../nodes/variable/variable';\nimport { ImageExtension } from '../nodes/image/image';\nimport { LogoExtension } from '../nodes/logo/logo';\n\nexport const isCustomNodeSelected = (editor: Editor, node: HTMLElement) => {\n const customNodes = [\n HorizontalRule.name,\n Image.name,\n Spacer.name,\n ImageExtension.name,\n VariableExtension.name,\n LinkCardExtension.name,\n LogoExtension.name,\n ButtonExtension.name,\n ];\n\n return customNodes.some((type) => editor.isActive(type));\n};\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { LinkCardComponent } from '../nodes/link-card';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n linkCard: {\n setLinkCard: () => ReturnType;\n };\n }\n}\n\nexport const LinkCardExtension = Node.create({\n name: 'linkCard',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n mailyComponent: {\n default: 'linkCard',\n },\n title: {\n default: '',\n },\n description: {\n default: '',\n },\n link: {\n default: '',\n },\n linkTitle: {\n default: '',\n },\n image: {\n default: '',\n },\n subTitle: {\n default: '',\n },\n badgeText: {\n default: '',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `a[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n HTMLAttributes\n ),\n ];\n },\n\n addCommands() {\n return {\n setLinkCard:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n mailyComponent: this.name,\n },\n });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(LinkCardComponent, {\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Input } from '../components/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../components/popover';\nimport { Textarea } from '../components/textarea';\nimport { cn } from '../utils/classname';\n\nexport function LinkCardComponent(props: NodeViewProps) {\n const { title, description, link, linkTitle, image, badgeText, subTitle } =\n props.node.attrs;\n const { getPos, editor } = props;\n\n return (\n <NodeViewWrapper\n className={`react-component ${\n props.selected && 'ProseMirror-selectednode'\n }`}\n draggable=\"true\"\n data-drag-handle=\"\"\n >\n <Popover open={props.selected}>\n <PopoverTrigger asChild>\n <div\n tabIndex={-1}\n onClick={(e) => {\n e.preventDefault();\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n <div className=\"mly-no-prose mly-flex mly-flex-col mly-rounded-lg mly-border mly-border-gray-300\">\n {image && (\n <div className=\"mly-relative mly-mb-1.5 mly-w-full mly-shrink-0\">\n <img\n src={image}\n alt=\"link-card\"\n className=\"mly-no-prose !mly-mb-0 mly-h-full mly-w-full mly-rounded-t-lg\"\n />\n </div>\n )}\n <div className=\"mly-flex mly-items-stretch mly-p-3\">\n <div className={cn('mly-flex mly-flex-col')}>\n <div className=\"!mly-mb-1.5 mly-flex mly-items-center mly-gap-1.5\">\n <h2 className=\"!mly-mb-0 !mly-text-lg mly-font-semibold\">\n {title}\n </h2>\n {badgeText && (\n <span className=\"!mly-font-base text-xs mly-rounded-md mly-bg-yellow-200 mly-px-2 mly-py-1 mly-font-semibold mly-leading-none\">\n {badgeText}\n </span>\n )}{' '}\n {subTitle && !badgeText && (\n <span className=\"!mly-font-base text-xs mly-font-regular mly-rounded-md mly-leading-none mly-text-gray-400\">\n {subTitle}\n </span>\n )}\n </div>\n <p className=\"!mly-my-0 !mly-text-base mly-text-gray-500\">\n {description}{' '}\n {linkTitle ? (\n <a href={link} className=\"mly-font-semibold\">\n {linkTitle}\n </a>\n ) : null}\n </p>\n </div>\n </div>\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"mly-flex mly-w-96 mly-flex-col mly-gap-2\"\n sideOffset={10}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Image\n </span>\n <Input\n placeholder=\"Add Image\"\n type=\"url\"\n value={image}\n onChange={(e) => {\n props.updateAttributes({\n image: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Title\n </span>\n <Input\n placeholder=\"Add title\"\n value={title}\n onChange={(e) => {\n props.updateAttributes({\n title: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Description\n </span>\n <Textarea\n placeholder=\"Add description here\"\n value={description}\n onChange={(e) => {\n props.updateAttributes({\n description: e.target.value,\n });\n }}\n />\n </label>\n\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-2\">\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Link Title\n </span>\n <Input\n placeholder=\"Add link title here\"\n value={linkTitle}\n onChange={(e) => {\n props.updateAttributes({\n linkTitle: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Link\n </span>\n <Input\n placeholder=\"Add link here\"\n value={link}\n onChange={(e) => {\n props.updateAttributes({\n link: e.target.value,\n });\n }}\n />\n </label>\n </div>\n\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-2\">\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Badge Text\n </span>\n <Input\n placeholder=\"Add badge text here\"\n value={badgeText}\n onChange={(e) => {\n props.updateAttributes({\n badgeText: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Sub Title\n </span>\n <Input\n placeholder=\"Add sub title here\"\n value={subTitle}\n onChange={(e) => {\n props.updateAttributes({\n subTitle: e.target.value,\n });\n }}\n />\n </label>\n </div>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '../utils/constants';\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n type={type}\n className={cn(\n 'mly-flex mly-h-10 mly-w-full mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-3 mly-py-2 mly-text-sm mly-ring-offset-white file:mly-border-0 file:mly-bg-transparent file:mly-text-sm file:mly-font-medium placeholder:mly-text-gray-500 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-cursor-not-allowed disabled:mly-opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\n\nexport interface TextAreaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextAreaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'mly-flex mly-min-h-24 mly-w-full mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-3 mly-py-2 mly-text-sm mly-ring-offset-white file:mly-border-0 file:mly-bg-transparent file:mly-text-sm file:mly-font-medium placeholder:mly-text-gray-500 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-cursor-not-allowed disabled:mly-opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { ButtonView } from './button-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { AllowedLogoAlignment } from '../logo/logo';\n\nexport const DEFAULT_BUTTON_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_BUTTON_VARIANT: AllowedButtonVariant = 'filled';\nexport const DEFAULT_BUTTON_BORDER_RADIUS: AllowedButtonBorderRadius = 'smooth';\nexport const DEFAULT_BUTTON_BACKGROUND_COLOR = '#000000';\nexport const DEFAULT_BUTTON_TEXT_COLOR = '#ffffff';\n\nexport const allowedButtonVariant = ['filled', 'outline'] as const;\nexport type AllowedButtonVariant = (typeof allowedButtonVariant)[number];\n\nexport const allowedButtonBorderRadius = ['sharp', 'smooth', 'round'] as const;\nexport type AllowedButtonBorderRadius =\n (typeof allowedButtonBorderRadius)[number];\n\ntype ButtonAttributes = {\n text: string;\n url: string;\n alignment: AllowedLogoAlignment;\n variant: AllowedButtonVariant;\n borderRadius: AllowedButtonBorderRadius;\n buttonColor: string;\n textColor: string;\n\n showIfKey: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n button: {\n setButton: () => ReturnType;\n updateButton: (attrs: Partial<ButtonAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ButtonExtension = Node.create({\n name: 'button',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n text: {\n default: 'Button',\n parseHTML: (element) => {\n return element.getAttribute('data-text') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-text': attributes.text,\n };\n },\n },\n isTextVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-text-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isTextVariable) {\n return {};\n }\n\n return {\n 'data-is-text-variable': 'true',\n };\n },\n },\n\n url: {\n default: '',\n parseHTML: (element) => {\n return element.getAttribute('data-url') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-url': attributes.url,\n };\n },\n },\n // Later we will remove this attribute\n // and use the `url` attribute instead when implement\n // the URL variable feature\n isUrlVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-url-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isUrlVariable) {\n return {};\n }\n\n return {\n 'data-is-url-variable': 'true',\n };\n },\n },\n\n alignment: {\n default: DEFAULT_BUTTON_ALIGNMENT,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-alignment') || DEFAULT_BUTTON_ALIGNMENT\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n variant: {\n default: DEFAULT_BUTTON_VARIANT,\n parseHTML: (element) => {\n return element.getAttribute('data-variant') || DEFAULT_BUTTON_VARIANT;\n },\n renderHTML: (attributes) => {\n return {\n 'data-variant': attributes.variant,\n };\n },\n },\n borderRadius: {\n default: DEFAULT_BUTTON_BORDER_RADIUS,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-border-radius') ||\n DEFAULT_BUTTON_BORDER_RADIUS\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-border-radius': attributes.borderRadius,\n };\n },\n },\n buttonColor: {\n default: DEFAULT_BUTTON_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-button-color') ||\n DEFAULT_BUTTON_BACKGROUND_COLOR\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-button-color': attributes.buttonColor,\n };\n },\n },\n textColor: {\n default: DEFAULT_BUTTON_TEXT_COLOR,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-text-color') || DEFAULT_BUTTON_TEXT_COLOR\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-text-color': attributes.textColor,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n ];\n },\n\n addCommands() {\n return {\n setButton:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [],\n });\n },\n updateButton: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ButtonView, {\n contentDOMElementTag: 'div',\n className: 'mly-relative',\n });\n },\n});\n","import { AlignmentSwitch } from '@/editor/components/alignment-switch';\nimport { BaseButton } from '@/editor/components/base-button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { ColorPicker } from '@/editor/components/ui/color-picker';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { LinkInputPopover } from '@/editor/components/ui/link-input-popover';\nimport { Select } from '@/editor/components/ui/select';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport {\n allowedButtonBorderRadius,\n AllowedButtonVariant,\n allowedButtonVariant,\n} from './button';\nimport { ShowPopover } from '@/editor/components/show-popover';\nimport { ButtonLabelInput } from './button-label-input';\nimport { DEFAULT_RENDER_VARIABLE_FUNCTION } from '@/editor/provider';\nimport { useMailyContext } from '@/editor/provider';\nimport { CSSProperties } from 'react';\n\nexport function ButtonView(props: NodeViewProps) {\n const { node, editor, getPos, updateAttributes } = props;\n const {\n text,\n isTextVariable,\n alignment,\n variant,\n borderRadius: _radius,\n buttonColor,\n textColor,\n url: externalLink,\n showIfKey = '',\n isUrlVariable,\n } = node.attrs;\n\n const { renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n\n return (\n <NodeViewWrapper\n draggable=\"true\"\n data-drag-handle=\"\"\n data-type=\"button\"\n style={{\n textAlign: alignment,\n }}\n >\n <Popover open={props.selected}>\n <PopoverTrigger asChild>\n <div>\n <button\n className={cn(\n 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors disabled:mly-pointer-events-none disabled:mly-opacity-50',\n 'mly-h-10 mly-px-4 mly-py-2',\n 'mly-px-[32px] mly-py-[20px] mly-font-semibold mly-no-underline',\n {\n '!mly-rounded-full': _radius === 'round',\n '!mly-rounded-md': _radius === 'smooth',\n '!mly-rounded-none': _radius === 'sharp',\n }\n )}\n tabIndex={-1}\n style={\n {\n backgroundColor:\n variant === 'filled' ? buttonColor : 'transparent',\n color: textColor,\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: buttonColor,\n // decrease the border color opacity to 80%\n // so that it's not too prominent\n '--button-var-border-color': `${textColor}80`,\n } as CSSProperties\n }\n onClick={(e) => {\n e.preventDefault();\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n {isTextVariable\n ? renderVariable({\n variable: { name: text, valid: true },\n fallback: text,\n from: 'button-variable',\n editor,\n })\n : text}\n </button>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch mly-text-midnight-gray\">\n <ButtonLabelInput\n value={text}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n text: value,\n isTextVariable: isVariable ?? false,\n });\n }}\n isVariable={isTextVariable}\n editor={editor}\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <Select\n label=\"Border Radius\"\n value={_radius}\n options={allowedButtonBorderRadius.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n borderRadius: value,\n });\n }}\n tooltip=\"Border Radius\"\n className=\"mly-capitalize\"\n />\n\n <Select\n label=\"Style\"\n value={variant}\n options={allowedButtonVariant.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n variant: value,\n });\n }}\n tooltip=\"Style\"\n className=\"mly-capitalize\"\n />\n </div>\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <AlignmentSwitch\n alignment={alignment}\n onAlignmentChange={(alignment) => {\n updateAttributes({\n alignment,\n });\n }}\n />\n\n <LinkInputPopover\n defaultValue={externalLink || ''}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n url: value,\n isUrlVariable: isVariable ?? false,\n });\n }}\n tooltip=\"Update External Link\"\n editor={editor}\n isVariable={isUrlVariable}\n />\n </div>\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <BackgroundColorPickerPopup\n variant={variant}\n color={buttonColor}\n onChange={(color) => {\n updateAttributes({\n buttonColor: color,\n });\n }}\n />\n\n <TextColorPickerPopup\n color={textColor}\n onChange={(color) => {\n updateAttributes({\n textColor: color,\n });\n }}\n />\n </div>\n\n <Divider />\n\n <ShowPopover\n showIfKey={showIfKey}\n onShowIfKeyValueChange={(value) => {\n updateAttributes({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\ntype ColorPickerProps = {\n variant?: AllowedButtonVariant;\n color: string;\n onChange: (color: string) => void;\n};\n\nfunction BackgroundColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange, variant } = props;\n\n return (\n <ColorPicker\n color={color}\n onColorChange={onChange}\n tooltip=\"Background Color\"\n >\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n >\n <div\n className=\"mly-h-4 mly-w-4 mly-shrink-0 mly-rounded-full mly-shadow\"\n style={{\n backgroundColor: variant === 'filled' ? color : 'transparent',\n borderStyle: 'solid',\n borderWidth: 2,\n borderColor: variant === 'filled' ? 'white' : color,\n }}\n />\n </BaseButton>\n </ColorPicker>\n );\n}\n\nfunction TextColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange } = props;\n\n return (\n <ColorPicker color={color} onColorChange={onChange} tooltip=\"Text Color\">\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n >\n <div className=\"mly-flex mly-flex-col mly-items-center mly-justify-center mly-gap-[1px]\">\n <span className=\"mly-font-bolder mly-font-mono mly-text-xs mly-text-midnight-gray\">\n A\n </span>\n <div\n className=\"mly-h-[2px] mly-w-3 mly-shrink-0 mly-rounded-md mly-shadow\"\n style={{ backgroundColor: color }}\n />\n </div>\n </BaseButton>\n </ColorPicker>\n );\n}\n","import { InputAutocomplete } from '@/editor/components/ui/input-autocomplete';\nimport {\n DEFAULT_PLACEHOLDER_URL,\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n useMailyContext,\n} from '@/editor/provider';\nimport { processVariables } from '@/editor/utils/variable';\nimport { Editor } from '@tiptap/core';\nimport { BracesIcon } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useState } from 'react';\nimport { useRef } from 'react';\n\ntype ButtonLabelInputProps = {\n value: string;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n isVariable?: boolean;\n\n editor: Editor;\n};\n\nexport function ButtonLabelInput(props: ButtonLabelInputProps) {\n const { value, onValueChange, isVariable, editor } = props;\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const {\n variables = [],\n variableTriggerCharacter = DEFAULT_VARIABLE_TRIGGER_CHAR,\n renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION,\n placeholderUrl = DEFAULT_PLACEHOLDER_URL,\n } = useMailyContext();\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = value.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, value, editor]);\n\n return (\n <div className=\"mly-isolate mly-flex mly-rounded-lg\">\n {!isEditing && (\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: value,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n\n {isEditing && (\n <InputAutocomplete\n value={value}\n onValueChange={(value) => {\n onValueChange?.(value);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder={placeholderUrl}\n className=\"mly-h-7 mly-w-40 mly-rounded-md mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray hover:mly-bg-soft-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable = autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n }\n onValueChange?.(value, isVariable);\n }}\n />\n )}\n </div>\n );\n}\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport { PluginKey } from '@tiptap/pm/state';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport Suggestion, { SuggestionOptions } from '@tiptap/suggestion';\nimport { VariableView } from './variable-view';\n\nexport type VariableOptions = {\n HTMLAttributes: Record<string, any>;\n renderLabel: (props: {\n options: VariableOptions;\n node: ProseMirrorNode;\n }) => string;\n suggestion: Omit<SuggestionOptions, 'editor'>;\n};\n\nexport const VariablePluginKey = new PluginKey('variable');\n\nexport const VariableExtension = Node.create<VariableOptions>({\n name: 'variable',\n group: 'inline',\n inline: true,\n selectable: true,\n atom: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n renderLabel({ options, node }) {\n return `${node.attrs.label ?? node.attrs.id}`;\n },\n suggestion: {\n char: '@',\n pluginKey: VariablePluginKey,\n command: ({ editor, range, props }) => {\n // increase range.to by one when the next node is of type \"text\"\n // and starts with a space character\n const nodeAfter = editor.view.state.selection.$to.nodeAfter;\n const overrideSpace = nodeAfter?.text?.startsWith(' ');\n\n if (overrideSpace) {\n range.to += 1;\n }\n\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: this.name,\n attrs: props,\n },\n {\n type: 'text',\n text: ' ',\n },\n ])\n .run();\n\n window.getSelection()?.collapseToEnd();\n },\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from);\n const type = state.schema.nodes[this.name];\n const allow = !!$from.parent.type.contentMatch.matchType(type);\n\n return allow;\n },\n },\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-id'),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n 'data-id': attributes.id,\n };\n },\n },\n\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-label'),\n renderHTML: (attributes) => {\n if (!attributes.label) {\n return {};\n }\n\n return {\n 'data-label': attributes.label,\n };\n },\n },\n\n fallback: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-fallback'),\n renderHTML: (attributes) => {\n if (!attributes.fallback) {\n return {};\n }\n\n return {\n 'data-fallback': attributes.fallback,\n };\n },\n },\n\n required: {\n default: true,\n parseHTML: (element) => element.hasAttribute('data-required'),\n renderHTML: (attributes) => {\n return {\n 'data-required': attributes?.required ?? true,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n { 'data-type': this.name },\n this.options.HTMLAttributes,\n HTMLAttributes\n ),\n this.options.renderLabel({\n options: this.options,\n node,\n }),\n ];\n },\n\n renderText({ node }) {\n return this.options.renderLabel({\n options: this.options,\n node,\n });\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\n this.options.suggestion.char || '',\n pos,\n pos + node.nodeSize\n );\n\n return false;\n }\n });\n\n return isMention;\n }),\n };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(VariableView, {\n className: 'mly-relative mly-inline-block',\n as: 'div',\n });\n },\n});\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { ImageView } from './image-view';\n\nexport const ImageExtension = TiptapImage.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: 'auto',\n parseHTML: (element) => {\n const width = element.style.width;\n return width ? { width } : null;\n },\n renderHTML: ({ width }) => ({ style: `width: ${width}` }),\n },\n height: {\n default: 'auto',\n parseHTML: (element) => {\n const height = element.style.height;\n return height ? { height } : null;\n },\n renderHTML: ({ height }) => ({ style: `height: ${height}` }),\n },\n alignment: {\n default: 'center',\n renderHTML: ({ alignment }) => ({ 'data-alignment': alignment }),\n parseHTML: (element) =>\n element.getAttribute('data-alignment') || 'center',\n },\n\n externalLink: {\n default: null,\n renderHTML: ({ externalLink }) => {\n if (!externalLink) {\n return {};\n }\n return {\n 'data-external-link': externalLink,\n };\n },\n parseHTML: (element) => {\n const externalLink = element.getAttribute('data-external-link');\n return externalLink ? { externalLink } : null;\n },\n },\n\n // Later we will remove this attribute\n // and use the `externalLink` attribute instead\n // when implement the URL variable feature\n isExternalLinkVariable: {\n default: false,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-is-external-link-variable') === 'true'\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.isExternalLinkVariable) {\n return {};\n }\n\n return {\n 'data-is-external-link-variable': 'true',\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ImageView, {\n className: 'mly-relative',\n });\n },\n});\n","import { goToColumn } from '@/editor/utils/columns';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes } from '@tiptap/core';\nimport { Node } from '@tiptap/core';\nimport { v4 as uuid } from 'uuid';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\nexport const DEFAULT_COLUMNS_GAP = 8;\n\ninterface ColumnsAttributes {\n showIfKey: string;\n gap: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n setColumns: () => ReturnType;\n updateColumns: (attrs: Partial<ColumnsAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnsExtension = Node.create({\n name: 'columns',\n group: 'columns',\n content: 'column+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n gap: {\n default: DEFAULT_COLUMNS_GAP,\n parseHTML: (element) => {\n return Number(element.style.gap) || DEFAULT_COLUMNS_GAP;\n },\n renderHTML(attributes) {\n if (!attributes.gap) {\n return {};\n }\n\n return {\n style: `gap: ${attributes.gap}px`,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setColumns:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'column',\n attrs: {\n columnId: uuid(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: uuid(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n ],\n });\n },\n updateColumns: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'columns',\n class: 'mly-relative',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"columns\"]',\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => {\n return goToColumn(this.editor, 'next');\n },\n 'Shift-Tab': () => {\n return goToColumn(this.editor, 'previous');\n },\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { ForView } from './for-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\ntype ForAttributes = {\n each: string;\n isUpdatingKey: boolean;\n showIfKey: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n for: {\n setFor: () => ReturnType;\n updateFor: (attrs: Partial<ForAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ForExtension = Node.create({\n name: 'for',\n group: 'block',\n content: '(block|columns)+',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n each: {\n default: 'items',\n parseHTML: (element) => {\n return element.getAttribute('each') || '';\n },\n renderHTML: (attributes) => {\n if (!attributes.each) {\n return {};\n }\n\n return {\n each: attributes.each,\n };\n },\n },\n isUpdatingKey: {\n default: false,\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n setFor:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateFor: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ForView, {\n contentDOMElementTag: 'div',\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper, NodeViewContent } from '@tiptap/react';\nimport { Repeat2 } from 'lucide-react';\n\nexport function ForView(props: NodeViewProps) {\n const { editor, getPos } = props;\n\n return (\n <NodeViewWrapper\n draggable=\"true\"\n data-drag-handle=\"\"\n data-type=\"for\"\n className=\"mly-relative\"\n >\n <NodeViewContent className=\"is-editable\" />\n\n <div\n role=\"button\"\n data-repeat-indicator=\"\"\n className=\"mly-absolute mly-inset-y-0 mly-right-0 mly-flex mly-translate-x-full mly-cursor-pointer mly-flex-col mly-items-center mly-gap-1 mly-opacity-60\"\n contentEditable={false}\n onClick={() => {\n editor.commands.setNodeSelection(getPos());\n }}\n >\n <Repeat2 className=\"mly-size-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n <div className=\"mly-w-[1.5px] mly-grow mly-rounded-full mly-bg-rose-300\" />\n </div>\n </NodeViewWrapper>\n );\n}\n","import { ChevronDownIcon, PilcrowIcon } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport {\n TurnIntoBlockCategory,\n TurnIntoBlockOptions,\n TurnIntoOptions,\n} from './use-turn-into-block-options';\nimport { useMemo } from 'react';\nimport { BaseButton } from '../base-button';\nimport { cn } from '@/editor/utils/classname';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\ntype TurnIntoBlockProps = {\n options: TurnIntoOptions;\n};\n\nconst isOption = (\n option: TurnIntoOptions[number]\n): option is TurnIntoBlockOptions => option.type === 'option';\nconst isCategory = (\n option: TurnIntoOptions[number]\n): option is TurnIntoBlockCategory => option.type === 'category';\n\nexport function TurnIntoBlock(props: TurnIntoBlockProps) {\n const { options } = props;\n\n const activeItem = useMemo(\n () =>\n options.find((option) => option.type === 'option' && option.isActive()),\n [options]\n ) as TurnIntoBlockOptions | undefined;\n const { icon: ActiveIcon = PilcrowIcon } = activeItem || {};\n\n return (\n <Popover>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly-flex mly-aspect-square mly-h-7 mly-items-center mly-justify-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2'\n )}\n >\n <ActiveIcon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n <ChevronDownIcon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Turn into</TooltipContent>\n </Tooltip>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={8}\n className=\"mly-flex mly-w-[160px] mly-flex-col mly-rounded-md mly-p-1\"\n >\n {options.map((option, index) => {\n if (isOption(option)) {\n return (\n <BaseButton\n key={option.id}\n onClick={option.onClick}\n variant=\"ghost\"\n className=\"mly-h-auto mly-justify-start mly-gap-2 !mly-rounded mly-px-2 mly-py-1 mly-text-sm mly-font-normal mly-text-midnight-gray\"\n >\n <option.icon className=\"mly-size-[15px] mly-shrink-0\" />\n {option.label}\n </BaseButton>\n );\n } else if (isCategory(option)) {\n return (\n <label\n key={option.id}\n className={cn(\n 'mly-px-2 mly-text-xs mly-font-medium mly-text-midnight-gray/60',\n index === 0 ? 'mly-mb-2 mly-mt-1' : 'mly-my-2'\n )}\n >\n {option.label}\n </label>\n );\n }\n })}\n </PopoverContent>\n </Popover>\n );\n}\n","import { Editor, useEditorState } from '@tiptap/react';\nimport {\n FootprintsIcon,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n ListIcon,\n ListOrderedIcon,\n LucideIcon,\n PilcrowIcon,\n} from 'lucide-react';\n\nexport type TurnIntoBlockOptions = {\n label: string;\n id: string;\n type: 'option';\n disabled: () => boolean;\n isActive: () => boolean;\n onClick: () => void;\n icon: LucideIcon;\n};\n\nexport type TurnIntoBlockCategory = {\n label: string;\n id: string;\n type: 'category';\n};\n\nexport type TurnIntoOptions = Array<\n TurnIntoBlockOptions | TurnIntoBlockCategory\n>;\n\nexport function useTurnIntoBlockOptions(editor: Editor) {\n return useEditorState({\n editor,\n selector: ({ editor }): TurnIntoOptions => [\n {\n type: 'category',\n label: 'Hierarchy',\n id: 'hierarchy',\n },\n {\n icon: PilcrowIcon,\n onClick: () =>\n editor.chain().focus().liftListItem('listItem').setParagraph().run(),\n id: 'paragraph',\n disabled: () => !editor.can().setParagraph(),\n isActive: () =>\n editor.isActive('paragraph') &&\n !editor.isActive('orderedList') &&\n !editor.isActive('bulletList') &&\n !editor.isActive('taskList'),\n label: 'Paragraph',\n type: 'option',\n },\n {\n icon: Heading1Icon,\n onClick: () =>\n editor\n .chain()\n .focus()\n .liftListItem('listItem')\n .setHeading({ level: 1 })\n .run(),\n id: 'heading1',\n disabled: () => !editor.can().setHeading({ level: 1 }),\n isActive: () => editor.isActive('heading', { level: 1 }),\n label: 'Heading 1',\n type: 'option',\n },\n {\n icon: Heading2Icon,\n onClick: () =>\n editor\n .chain()\n .focus()\n .liftListItem('listItem')\n .setHeading({ level: 2 })\n .run(),\n id: 'heading2',\n disabled: () => !editor.can().setHeading({ level: 2 }),\n isActive: () => editor.isActive('heading', { level: 2 }),\n label: 'Heading 2',\n type: 'option',\n },\n {\n icon: Heading3Icon,\n onClick: () =>\n editor\n .chain()\n .focus()\n .liftListItem('listItem')\n .setHeading({ level: 3 })\n .run(),\n id: 'heading3',\n disabled: () => !editor.can().setHeading({ level: 3 }),\n isActive: () => editor.isActive('heading', { level: 3 }),\n label: 'Heading 3',\n type: 'option',\n },\n {\n id: 'footer',\n type: 'option',\n label: 'Footer',\n icon: FootprintsIcon,\n onClick: () => {\n editor.chain().focus().liftListItem('listItem').setFooter().run();\n },\n disabled: () => !editor.can().setFooter(),\n isActive: () => editor.isActive('footer'),\n },\n {\n type: 'category',\n label: 'Lists',\n id: 'lists',\n },\n {\n icon: ListIcon,\n onClick: () => editor.chain().focus().toggleBulletList().run(),\n id: 'bulletList',\n disabled: () => !editor.can().toggleBulletList(),\n isActive: () => editor.isActive('bulletList'),\n label: 'Bullet list',\n type: 'option',\n },\n {\n icon: ListOrderedIcon,\n onClick: () => editor.chain().focus().toggleOrderedList().run(),\n id: 'orderedList',\n disabled: () => !editor.can().toggleOrderedList(),\n isActive: () => editor.isActive('orderedList'),\n label: 'Numbered list',\n type: 'option',\n },\n ],\n });\n}\n","import StarterKit from '@tiptap/starter-kit';\nimport ListItem from '@tiptap/extension-list-item';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Heading from '@tiptap/extension-heading';\nimport Underline from '@tiptap/extension-underline';\nimport Document from '@tiptap/extension-document';\nimport Focus from '@tiptap/extension-focus';\nimport Dropcursor from '@tiptap/extension-dropcursor';\n\nimport { Color } from './color';\nimport { HorizontalRule } from './horizontal-rule';\nimport { Footer } from '../nodes/footer';\nimport { Spacer } from '../nodes/spacer';\nimport { MailyContextType } from '../provider';\nimport { LinkCardExtension } from './link-card';\nimport { ColumnsExtension } from '../nodes/columns/columns';\nimport { ColumnExtension } from '../nodes/columns/column';\nimport { SectionExtension } from '../nodes/section/section';\nimport { ForExtension } from '../nodes/for/for';\nimport { ButtonExtension } from '../nodes/button/button';\nimport { VariableExtension } from '../nodes/variable/variable';\nimport { getVariableSuggestions } from '../nodes/variable/variable-suggestions';\nimport { SlashCommand } from './slash-command/slash-command';\nimport { getSlashCommandSuggestions } from './slash-command/slash-command-view';\nimport { LogoExtension } from '../nodes/logo/logo';\nimport { ImageExtension } from '../nodes/image/image';\nimport { LinkExtension } from '../nodes/link';\n\ntype ExtensionsProps = Partial<MailyContextType> & {};\n\nexport function extensions(props: ExtensionsProps) {\n const { variables, blocks, variableTriggerCharacter } = props;\n\n return [\n Document.extend({\n content: '(block|columns)+',\n }),\n ColumnsExtension,\n ColumnExtension,\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n code: {\n HTMLAttributes: {\n class:\n 'mly-px-1 mly-relative mly-py-0.5 mly-bg-[#efefef] mly-text-sm mly-rounded-md mly-tracking-normal mly-font-normal',\n },\n },\n blockquote: {\n HTMLAttributes: {\n class:\n 'mly-not-prose mly-border-l-4 mly-border-gray-300 mly-pl-4 mly-mt-4 mly-mb-4 mly-relative',\n },\n },\n paragraph: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n horizontalRule: false,\n dropcursor: false,\n document: false,\n }),\n Underline,\n LogoExtension,\n Color.configure({ types: [TextStyle.name, ListItem.name] }),\n TextStyle.configure(),\n TextAlign.configure({ types: [Paragraph.name, Heading.name, Footer.name] }),\n HorizontalRule,\n Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === 'heading') {\n return `Heading ${node.attrs.level}`;\n } else if (\n [\n 'columns',\n 'column',\n 'section',\n 'for',\n 'show',\n 'blockquote',\n ].includes(node.type.name)\n ) {\n return '';\n }\n\n return 'Write something or / to see commands';\n },\n includeChildren: true,\n }),\n Spacer,\n Footer,\n SlashCommand.configure({\n suggestion: getSlashCommandSuggestions(blocks),\n }),\n LinkExtension.configure({\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly-no-underline',\n },\n openOnClick: false,\n }),\n ImageExtension,\n LinkCardExtension,\n Focus,\n SectionExtension,\n ForExtension,\n Dropcursor.configure({\n color: '#555',\n width: 3,\n class: 'ProseMirror-dropcursor',\n }),\n ButtonExtension,\n VariableExtension.configure({\n suggestion: getVariableSuggestions(variables, variableTriggerCharacter),\n }),\n ];\n}\n","import TiptapColor, { ColorOptions } from '@tiptap/extension-color';\n\ntype ColorStorage = {\n /**\n * Last 5 used colors\n */\n colors: Set<string>;\n};\n\nexport const Color = TiptapColor.extend<ColorOptions, ColorStorage>({\n addStorage() {\n return {\n colors: new Set(),\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\n\nexport interface FooterOptions {\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n footer: {\n setFooter: () => ReturnType;\n };\n }\n}\n\nexport const Footer = Node.create<FooterOptions>({\n name: 'footer',\n group: 'block',\n content: 'inline*',\n\n addAttributes() {\n return {\n 'maily-component': {\n default: 'footer',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element) => element?.getAttribute('data-maily-component'),\n },\n };\n },\n\n addCommands() {\n return {\n setFooter:\n () =>\n ({ commands }) => {\n return commands.setNode(this.name);\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'small[data-maily-component=\"footer\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'small',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class:\n 'footer mly-block mly-text-[13px] mly-text-slate-500 mly-relative',\n }),\n 0,\n ];\n },\n});\n","import {\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n DEFAULT_VARIABLES,\n Variable as VariableType,\n Variables,\n} from '@/editor/provider';\nimport { processVariables } from '@/editor/utils/variable';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport { forwardRef, useImperativeHandle, useState } from 'react';\nimport tippy, { GetReferenceClientRect } from 'tippy.js';\nimport { VariablePopover, VariablePopoverRef } from './variable-popover';\nimport { useRef } from 'react';\n\ntype VariableListProps = {\n command: (params: { id: string; required: boolean }) => void;\n items: VariableType[];\n};\n\nexport const VariableList = forwardRef((props: VariableListProps, ref) => {\n const { items = [] } = props;\n\n const popoverRef = useRef<VariablePopoverRef>(null);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!popoverRef.current) {\n return false;\n }\n\n const { moveUp, moveDown, select } = popoverRef.current || {};\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveUp();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveDown();\n return true;\n }\n\n if (event.key === 'Enter') {\n select();\n return true;\n }\n\n return false;\n },\n }));\n\n return (\n <VariablePopover\n items={items}\n onSelectItem={(value) => {\n props.command({\n id: value.name,\n required: value.required ?? true,\n });\n }}\n ref={popoverRef}\n />\n );\n});\n\nVariableList.displayName = 'VariableList';\n\nexport function getVariableSuggestions(\n variables: Variables = DEFAULT_VARIABLES,\n char: string = DEFAULT_VARIABLE_TRIGGER_CHAR\n): Omit<SuggestionOptions, 'editor'> {\n return {\n char,\n items: ({ query, editor }) => {\n return processVariables(variables, {\n query,\n editor,\n from: 'content-variable',\n });\n },\n\n render: () => {\n let component: ReactRenderer<any>;\n let popup: InstanceType<any> | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(VariableList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n });\n },\n\n onUpdate(props) {\n component.updateProps(props);\n\n if (!props.clientRect) {\n return;\n }\n\n popup?.[0]?.setProps({\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup?.[0].hide();\n return true;\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n popup?.[0].destroy();\n component.destroy();\n },\n };\n },\n };\n}\n","import { Editor, Extension } from '@tiptap/core';\nimport Suggestion from '@tiptap/suggestion';\n\nexport const SlashCommand = Extension.create({\n name: 'slash-command',\n addOptions() {\n return {\n suggestion: {\n char: '/',\n command: ({\n editor,\n range,\n props,\n }: {\n editor: Editor;\n range: Range;\n props: any;\n }) => {\n props.command({ editor, range });\n },\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n});\n","export const updateScrollView = (container: HTMLElement, item: HTMLElement) => {\n const containerHeight = container.offsetHeight;\n const itemHeight = item ? item.offsetHeight : 0;\n\n const top = item.offsetTop;\n const bottom = top + itemHeight;\n\n if (top < container.scrollTop) {\n container.scrollTop -= container.scrollTop - top + 5;\n } else if (bottom > containerHeight + container.scrollTop) {\n container.scrollTop += bottom - containerHeight - container.scrollTop + 5;\n }\n};\n","import { BlockItem } from '@/blocks/types';\nimport { cn } from '@/editor/utils/classname';\nimport { updateScrollView } from '@/editor/utils/update-scroll-view';\nimport { Editor } from '@tiptap/core';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport tippy, { GetReferenceClientRect } from 'tippy.js';\n\ninterface CommandItemProps {\n title: string;\n description: string;\n icon: ReactNode;\n}\n\ntype CommandListProps = {\n items: CommandItemProps[];\n command: (item: CommandItemProps) => void;\n editor: Editor;\n range: any;\n};\n\nfunction CommandList(props: CommandListProps) {\n const { items, command, editor } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const selectItem = useCallback(\n (index: number) => {\n const item = items[index];\n if (item) {\n command(item);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [command, editor, items]\n );\n\n useEffect(() => {\n const navigationKeys = ['ArrowUp', 'ArrowDown', 'Enter'];\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault();\n if (e.key === 'ArrowUp') {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n return true;\n }\n if (e.key === 'ArrowDown') {\n setSelectedIndex((selectedIndex + 1) % items.length);\n return true;\n }\n if (e.key === 'Enter') {\n selectItem(selectedIndex);\n return true;\n }\n return false;\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [items, selectedIndex, setSelectedIndex, selectItem]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [items]);\n\n const commandListContainer = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = commandListContainer?.current;\n\n const item = container?.children[selectedIndex] as HTMLElement;\n\n if (item && container) {\n updateScrollView(container, item);\n }\n }, [selectedIndex]);\n\n return items.length > 0 ? (\n <div className=\"mly-z-50 mly-w-72 mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-shadow-md mly-transition-all\">\n <div\n id=\"slash-command\"\n ref={commandListContainer}\n className=\"mly-no-scrollbar mly-h-auto mly-max-h-[330px] mly-overflow-y-auto mly-scroll-smooth mly-p-1\"\n >\n {items.map((item: CommandItemProps, index: number) => {\n return (\n <button\n className={cn(\n 'mly-flex mly-w-full mly-items-center mly-space-x-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-text-sm mly-text-gray-900 hover:mly-bg-gray-100 hover:mly-text-gray-900',\n index === selectedIndex\n ? 'mly-bg-gray-100 mly-text-gray-900'\n : 'mly-bg-transparent'\n )}\n key={index}\n onClick={() => selectItem(index)}\n type=\"button\"\n >\n <div className=\"mly-flex mly-h-6 mly-w-6 mly-shrink-0 mly-items-center mly-justify-center\">\n {item.icon}\n </div>\n <div>\n <p className=\"mly-font-medium\">{item.title}</p>\n <p className=\"mly-text-xs mly-text-gray-400\">\n {item.description}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n <div className=\"mly-border-t mly-border-gray-200 mly-px-1 mly-py-3 mly-pl-4\">\n <div className=\"mly-flex mly-items-center\">\n <p className=\"mly-text-center mly-text-xs mly-text-gray-400\">\n <kbd className=\"mly-rounded mly-border mly-p-1 mly-px-2 mly-font-medium\">\n ↑\n </kbd>\n <kbd className=\"mly-ml-1 mly-rounded mly-border mly-p-1 mly-px-2 mly-font-medium\">\n ↓\n </kbd>{' '}\n to navigate\n </p>\n <span aria-hidden=\"true\" className=\"mly-select-none mly-px-1\">\n ·\n </span>\n <p className=\"mly-text-center mly-text-xs mly-text-gray-400\">\n <kbd className=\"mly-rounded mly-border mly-p-1 mly-px-1.5 mly-font-medium\">\n Enter\n </kbd>{' '}\n to select\n </p>\n </div>\n </div>\n </div>\n ) : null;\n}\n\nexport function getSlashCommandSuggestions(\n commands: BlockItem[] = []\n): Omit<SuggestionOptions, 'editor'> {\n return {\n items: ({ query, editor }) => {\n return commands.filter((item) => {\n if (typeof query === 'string' && query.length > 0) {\n const search = query.toLowerCase();\n\n if (item?.shouldBeHidden?.(editor)) {\n return false;\n }\n\n return (\n item.title.toLowerCase().includes(search) ||\n item.description.toLowerCase().includes(search) ||\n (item.searchTerms &&\n item.searchTerms.some((term: string) => term.includes(search)))\n );\n }\n return true;\n });\n },\n render: () => {\n let component: ReactRenderer<any>;\n let popup: InstanceType<any> | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(CommandList, {\n props,\n editor: props.editor,\n });\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n });\n },\n onUpdate: (props) => {\n component?.updateProps(props);\n\n popup &&\n popup[0].setProps({\n getReferenceClientRect: props.clientRect,\n });\n },\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n popup?.[0].hide();\n\n return true;\n }\n\n return component?.ref?.onKeyDown(props);\n },\n onExit: () => {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n popup?.[0].destroy();\n component?.destroy();\n },\n };\n },\n };\n}\n","import TiptapLink from '@tiptap/extension-link';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n customLink: {\n setIsUrlVariable: (isUrlVariable: boolean) => ReturnType;\n };\n }\n}\n\nexport const LinkExtension = TiptapLink.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n isUrlVariable: {\n default: false,\n },\n };\n },\n addCommands() {\n return {\n ...this.parent?.(),\n\n setIsUrlVariable:\n (isUrlVariable) =>\n ({ chain }) => {\n return chain().setMark('link', { isUrlVariable }).run();\n },\n };\n },\n});\n"],"mappings":"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","names":["Editor","import_react","import_react","import_uuid","import_core","import_core","uuid","HTMLAttributes","uuid","deepEql","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","updateAttributes","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","value","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_core","import_jsx_runtime","import_jsx_runtime","editor","import_react","import_lucide_react","import_react","import_state","import_tippy","import_model","t","e","o","element","n","r","i","s","d","tippy","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","index","import_react","import_lucide_react","import_tippy","import_react","import_fast_deep_equal","deepEql","import_jsx_runtime","editor","import_react","import_lucide_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react","import_react","import_jsx_runtime","_a","protocol","isVariable","import_jsx_runtime","import_react","import_core","HTMLAttributes","import_react","import_react","import_react","import_lucide_react","import_jsx_runtime","updateAttributes","event","import_jsx_runtime","TiptapImage","import_react","import_fast_deep_equal","editor","deepEql","import_tippy","import_jsx_runtime","editor","import_react","import_lucide_react","import_tippy","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","color","import_react","import_fast_deep_equal","deepEql","import_jsx_runtime","editor","import_react","import_core","HTMLAttributes","import_react","import_fast_deep_equal","deepEql","import_jsx_runtime","editor","import_react","import_lucide_react","import_react","import_fast_deep_equal","deepEql","import_core","TipTapHorizontalRule","import_extension_image","import_core","import_react","import_react","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","image","HTMLAttributes","import_core","import_react","import_react","import_react","import_jsx_runtime","value","isVariable","import_jsx_runtime","updateAttributes","text","alignment","HTMLAttributes","import_core","import_state","import_react","HTMLAttributes","Suggestion","import_extension_image","import_react","TiptapImage","Image","import_core","import_uuid","uuid","HTMLAttributes","import_core","import_react","import_react","import_lucide_react","import_jsx_runtime","HTMLAttributes","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","editor","import_jsx_runtime","editor","_a","TiptapColor","import_core","HTMLAttributes","import_react","import_tippy","import_react","import_jsx_runtime","tippy","import_core","import_suggestion","Suggestion","import_react","import_tippy","import_jsx_runtime","tippy","TiptapLink","Document","StarterKit","Underline","TextStyle","ListItem","TextAlign","Paragraph","Heading","Placeholder","Focus","Dropcursor","import_jsx_runtime","Editor","extensions","editor"]}
1
+ {"version":3,"sources":["../src/index.ts","#style-inject:#style-inject","../src/styles/index.css","../src/styles/preflight.css","../src/styles/tailwind.css","../src/editor/index.tsx","../src/editor/components/column-menu/columns-bubble-menu.tsx","../src/editor/utils/get-render-container.ts","../src/editor/utils/is-text-selected.ts","../src/editor/utils/columns.ts","../src/editor/utils/update-attribute.ts","../src/editor/nodes/columns/column.ts","../src/editor/components/column-menu/use-columns-state.tsx","../src/editor/utils/classname.ts","../src/editor/components/ui/divider.tsx","../src/editor/components/ui/tooltip.tsx","../src/editor/components/vertical-alignment-switch.tsx","../src/editor/components/base-button.tsx","../src/editor/components/bubble-menu-button.tsx","../src/editor/components/show-popover.tsx","../src/editor/components/popover.tsx","../src/editor/nodes/variable/variable-popover.tsx","../src/editor/utils/constants.ts","../src/editor/utils/use-outside-click.ts","../src/editor/components/ui/input-autocomplete.tsx","../src/editor/provider.tsx","../src/blocks/button.tsx","../src/blocks/image.tsx","../src/blocks/layout.tsx","../src/blocks/list.tsx","../src/blocks/typography.tsx","../src/editor/extensions/slash-command/default-slash-commands.ts","../src/editor/nodes/variable/variable-view.tsx","../src/editor/utils/variable.ts","../src/editor/components/column-menu/columns-width-config.tsx","../src/editor/components/ui/select.tsx","../src/editor/components/column-menu/columns-bubble-menu-content.tsx","../src/editor/utils/delete-node.ts","../src/editor/components/content-menu.tsx","../src/editor/plugins/drag-handle/drag-handle.tsx","../src/editor/plugins/drag-handle/drag-handle-plugin.ts","../src/editor/components/editor-menu-bar.tsx","../src/editor/components/for-menu/for-bubble-menu.tsx","../src/editor/components/for-menu/use-for-state.ts","../src/editor/components/image-menu/image-bubble-menu.tsx","../src/editor/components/alignment-switch.tsx","../src/editor/components/ui/link-input-popover.tsx","../src/editor/components/image-menu/image-size.tsx","../src/editor/nodes/logo/logo.ts","../src/editor/nodes/section/section.ts","../src/editor/nodes/logo/logo-view.tsx","../src/editor/utils/use-event.ts","../src/editor/nodes/image/image-view.tsx","../src/editor/components/image-menu/use-image-state.tsx","../src/editor/components/section-menu/section-bubble-menu.tsx","../src/editor/components/icons/border-color.tsx","../src/editor/components/icons/margin-icon.tsx","../src/editor/components/icons/padding-icon.tsx","../src/editor/components/ui/color-picker.tsx","../src/editor/components/section-menu/use-section-state.tsx","../src/editor/components/spacer-menu/spacer-bubble-menu.tsx","../src/editor/nodes/spacer.ts","../src/editor/components/spacer-menu/use-spacer-state.ts","../src/editor/components/text-menu/text-bubble-menu.tsx","../src/editor/components/text-menu/use-text-menu-state.tsx","../src/editor/extensions/horizontal-rule.tsx","../src/editor/utils/is-custom-node-selected.ts","../src/editor/extensions/link-card.ts","../src/editor/nodes/link-card.tsx","../src/editor/components/input.tsx","../src/editor/components/textarea.tsx","../src/editor/nodes/button/button.tsx","../src/editor/nodes/button/button-view.tsx","../src/editor/nodes/button/button-label-input.tsx","../src/editor/nodes/variable/variable.ts","../src/editor/nodes/image/image.ts","../src/editor/nodes/columns/columns.ts","../src/editor/nodes/for/for.ts","../src/editor/nodes/for/for-view.tsx","../src/editor/components/text-menu/turn-into-block.tsx","../src/editor/components/text-menu/use-turn-into-block-options.tsx","../src/editor/extensions/index.ts","../src/editor/extensions/color.ts","../src/editor/nodes/footer.ts","../src/editor/nodes/variable/variable-suggestions.tsx","../src/editor/extensions/slash-command/slash-command.ts","../src/editor/utils/update-scroll-view.ts","../src/editor/extensions/slash-command/slash-command-view.tsx","../src/editor/nodes/link.ts"],"sourcesContent":["import './styles/index.css';\nimport './styles/preflight.css';\nimport './styles/tailwind.css';\n\nexport * from './editor/index';\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root {\\n --placeholder-color: #adb5bd;\\n --bg-color: #ffffff;\\n --variable-icon-size: 12px;\\n --variable-icon-gap: 4px;\\n}\\n.mly-editor .mly-prose p:where([class~=text-sm]) {\\n font-size: 16px;\\n}\\n.mly-editor .mly-prose h1,\\n.mly-editor .mly-prose h2,\\n.mly-editor .mly-prose h3 {\\n margin-top: 0;\\n margin-bottom: 12px;\\n}\\n.mly-editor .mly-prose h1 {\\n font-size: 36px;\\n}\\n.mly-editor .mly-prose h2 {\\n font-size: 30px;\\n}\\n.mly-editor .mly-prose h3 {\\n font-size: 24px;\\n}\\n.mly-editor .mly-prose p {\\n font-size: 15px;\\n margin-bottom: 20px;\\n}\\n.mly-editor .mly-prose h1 + p,\\n.mly-editor .mly-prose h2 + p,\\n.mly-editor .mly-prose h3 + p,\\n.mly-editor .mly-prose hr + p,\\n.mly-editor .mly-prose table + p {\\n margin-top: 0;\\n}\\n.mly-editor .mly-prose ol,\\n.mly-editor .mly-prose ul {\\n margin-top: 0;\\n margin-bottom: 20px;\\n}\\n.mly-editor .mly-prose li:not(:last-child) {\\n margin-bottom: 8px;\\n}\\n.mly-editor .mly-prose li > p {\\n margin: 0;\\n}\\n.mly-editor .mly-prose img,\\n.mly-editor .mly-prose .node-logo {\\n margin-top: 0;\\n margin-bottom: 32px;\\n}\\n.mly-editor .mly-prose hr {\\n margin-block: 32px;\\n}\\n.mly-editor .mly-prose .footer {\\n display: block;\\n font-size: 13px;\\n margin-bottom: 20px;\\n color: rgb(100, 116, 139);\\n}\\n.mly-editor .mly-prose .spacer + * {\\n margin-top: 0;\\n}\\n.mly-editor .mly-prose p + .spacer {\\n margin-top: -20px;\\n}\\n.mly-editor .mly-prose blockquote + .spacer {\\n margin-top: -16px;\\n}\\n.mly-editor .mly-prose h1 + .spacer,\\n.mly-editor .mly-prose h2 + .spacer,\\n.mly-editor .mly-prose h3 + .spacer {\\n margin-top: -12px;\\n}\\n.mly-editor .mly-prose ol + .spacer,\\n.mly-editor .mly-prose ul + .spacer {\\n margin-top: -20px;\\n}\\n.mly-editor .mly-prose img + .spacer,\\n.mly-editor .mly-prose .node-logo + .spacer {\\n margin-top: -32px;\\n}\\n.mly-editor .mly-prose .node-button + .spacer,\\n.mly-editor .mly-prose .node-linkCard + .spacer,\\n.mly-editor .mly-prose footer + .spacer {\\n margin-top: -20px;\\n}\\n.mly-editor .mly-prose .node-button,\\n.mly-editor .mly-prose .node-linkCard {\\n margin-top: 0;\\n margin-bottom: 20px;\\n}\\n.mly-editor .mly-prose .node-image {\\n line-height: 0;\\n margin-top: 0;\\n margin-bottom: 32px;\\n outline: none;\\n}\\n.mly-editor .mly-prose .node-image + .spacer {\\n margin-top: -32px;\\n}\\n.mly-editor .mly-prose code::before,\\n.mly-editor .mly-prose code::after {\\n content: none;\\n}\\n.mly-no-scrollbar::-webkit-scrollbar {\\n display: none;\\n}\\n.mly-no-scrollbar {\\n -ms-overflow-style: none;\\n scrollbar-width: none;\\n}\\n.mly-editor .react-colorful__alpha {\\n border-radius: 0;\\n}\\n.mly-editor .react-colorful__saturation,\\n.mly-editor .react-colorful__hue,\\n.mly-editor .react-colorful__alpha {\\n border-radius: 8px;\\n}\\n.mly-editor .react-colorful__hue,\\n.mly-editor .react-colorful__alpha {\\n height: 16px;\\n}\\n.mly-editor .react-colorful__pointer {\\n width: 16px;\\n height: 16px;\\n}\\n.ProseMirror-selectednode::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: -2px;\\n pointer-events: none;\\n border-radius: 6px;\\n background: rgba(35, 131, 226, 0.14);\\n}\\n.mly-prose {\\n strong {\\n color: currentColor;\\n }\\n}\\n.ProseMirror {\\n position: relative;\\n word-wrap: break-word;\\n white-space: pre-wrap;\\n white-space: break-spaces;\\n font-variant-ligatures: none;\\n font-feature-settings: \\\"liga\\\" 0;\\n &:focus {\\n outline: none;\\n }\\n p {\\n margin-top: 0;\\n }\\n h1 {\\n --variable-icon-size: 28px;\\n }\\n h2 {\\n --variable-icon-size: 24px;\\n }\\n h3 {\\n --variable-icon-size: 20px;\\n }\\n h1,\\n h2,\\n h3 {\\n --variable-icon-gap: 8px;\\n }\\n .is-editor-empty:first-child:not([data-type=columns], [data-type=section], ul, li, ol)::before {\\n content: attr(data-placeholder);\\n float: left;\\n color: var(--placeholder-color);\\n pointer-events: none;\\n height: 0;\\n }\\n .is-empty:not([data-type=columns], [data-type=section], ol, ul, li)::before {\\n content: attr(data-placeholder);\\n float: left;\\n color: var(--placeholder-color);\\n pointer-events: none;\\n height: 0;\\n }\\n [data-type=columns] .is-empty::before,\\n [data-type=section] .is-empty::before {\\n --l-threshold: 0.66;\\n --diff: calc(var(--l-threshold) - l);\\n color: oklch(from var(--bg-color) clamp(0.05, max(min(var(--diff) * infinity, 1), 0), 0.95) c h) !important;\\n opacity: 0.6;\\n }\\n [data-type=columns] {\\n display: flex;\\n margin: 0;\\n padding: 0;\\n &.has-focus [data-type=column],\\n &:hover [data-type=column] {\\n outline: 1.5px solid #e9ecef;\\n outline-style: dashed;\\n }\\n [data-type=column].has-focus {\\n outline-style: solid;\\n }\\n }\\n [data-type=column] {\\n display: table-cell;\\n flex-basis: 0;\\n flex-grow: 1;\\n overflow: auto;\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n [data-type=section] {\\n margin: 0;\\n padding: 0;\\n [data-type=section-cell] {\\n padding: 0;\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n }\\n [data-type=for] {\\n [data-node-view-content] > div {\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n }\\n .node-for.has-focus [data-repeat-indicator] {\\n opacity: 1;\\n }\\n [data-type=show] {\\n [data-node-view-content] > div {\\n & > *:first-child {\\n margin-top: 0;\\n }\\n & > *:last-child {\\n margin-bottom: 0;\\n }\\n }\\n }\\n *:has(+ .ProseMirror-gapcursor) {\\n margin-bottom: 0 !important;\\n }\\n .ProseMirror-gapcursor {\\n &::after {\\n border: 1.5px solid gray;\\n width: 24px;\\n }\\n & + * {\\n margin-top: 0 !important;\\n }\\n }\\n}\\n.hide-number-controls {\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n &[type=number] {\\n -moz-appearance: textfield;\\n }\\n}\\n.hide-scrollbars {\\n scrollbar-width: none;\\n -ms-overflow-style: none;\\n &::-webkit-scrollbar {\\n display: none;\\n }\\n}\\n\")","import styleInject from '#style-inject';styleInject(\":where(.mly-editor),\\n:where(.mly-editor) ::before,\\n:where(.mly-editor) ::after {\\n box-sizing: border-box;\\n border-width: 0;\\n border-style: solid;\\n border-color: #e5e7eb;\\n}\\n:where(.mly-editor) ::before,\\n:where(.mly-editor) ::after {\\n --tw-content: \\\"\\\";\\n}\\n:where(.mly-editor) html {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n -moz-tab-size: 4;\\n -o-tab-size: 4;\\n tab-size: 4;\\n font-family:\\n ui-sans-serif,\\n system-ui,\\n sans-serif,\\n \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\",\\n \\\"Segoe UI Symbol\\\",\\n \\\"Noto Color Emoji\\\";\\n font-feature-settings: normal;\\n font-variation-settings: normal;\\n}\\n:where(.mly-editor) body {\\n margin: 0;\\n line-height: inherit;\\n}\\n:where(.mly-editor) hr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n}\\n:where(.mly-editor) abbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\n:where(.mly-editor) h1,\\n:where(.mly-editor) h2,\\n:where(.mly-editor) h3,\\n:where(.mly-editor) h4,\\n:where(.mly-editor) h5,\\n:where(.mly-editor) h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n:where(.mly-editor) a {\\n color: inherit;\\n text-decoration: inherit;\\n}\\n:where(.mly-editor) b,\\n:where(.mly-editor) strong {\\n font-weight: bolder;\\n}\\n:where(.mly-editor) code,\\n:where(.mly-editor) kbd,\\n:where(.mly-editor) samp,\\n:where(.mly-editor) pre {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n font-size: 1em;\\n}\\n:where(.mly-editor) small {\\n font-size: 80%;\\n}\\n:where(.mly-editor) sub,\\n:where(.mly-editor) sup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\n:where(.mly-editor) sub {\\n bottom: -0.25em;\\n}\\n:where(.mly-editor) sup {\\n top: -0.5em;\\n}\\n:where(.mly-editor) table {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) input,\\n:where(.mly-editor) optgroup,\\n:where(.mly-editor) select,\\n:where(.mly-editor) textarea {\\n font-family: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n font-size: 100%;\\n font-weight: inherit;\\n line-height: inherit;\\n color: inherit;\\n margin: 0;\\n padding: 0;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) select {\\n text-transform: none;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) [type=button],\\n:where(.mly-editor) [type=reset],\\n:where(.mly-editor) [type=submit] {\\n -webkit-appearance: button;\\n background-image: none;\\n}\\n:where(.mly-editor) :-moz-focusring {\\n outline: auto;\\n}\\n:where(.mly-editor) :-moz-ui-invalid {\\n box-shadow: none;\\n}\\n:where(.mly-editor) progress {\\n vertical-align: baseline;\\n}\\n:where(.mly-editor) ::-webkit-inner-spin-button,\\n:where(.mly-editor) ::-webkit-outer-spin-button {\\n height: auto;\\n}\\n:where(.mly-editor) [type=search] {\\n -webkit-appearance: textfield;\\n outline-offset: -2px;\\n}\\n:where(.mly-editor) ::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n:where(.mly-editor) ::-webkit-file-upload-button {\\n -webkit-appearance: button;\\n font: inherit;\\n}\\n:where(.mly-editor) summary {\\n display: list-item;\\n}\\n:where(.mly-editor) blockquote,\\n:where(.mly-editor) dl,\\n:where(.mly-editor) dd,\\n:where(.mly-editor) h1,\\n:where(.mly-editor) h2,\\n:where(.mly-editor) h3,\\n:where(.mly-editor) h4,\\n:where(.mly-editor) h5,\\n:where(.mly-editor) h6,\\n:where(.mly-editor) hr,\\n:where(.mly-editor) figure,\\n:where(.mly-editor) p,\\n:where(.mly-editor) pre {\\n margin: 0;\\n}\\n:where(.mly-editor) fieldset {\\n margin: 0;\\n padding: 0;\\n}\\n:where(.mly-editor) legend {\\n padding: 0;\\n}\\n:where(.mly-editor) ol,\\n:where(.mly-editor) ul,\\n:where(.mly-editor) menu {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\n:where(.mly-editor) dialog {\\n padding: 0;\\n}\\n:where(.mly-editor) textarea {\\n resize: vertical;\\n}\\n:where(.mly-editor) input::-moz-placeholder,\\n:where(.mly-editor) textarea::-moz-placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\n:where(.mly-editor) input::placeholder,\\n:where(.mly-editor) textarea::placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\n:where(.mly-editor) button,\\n:where(.mly-editor) [role=button] {\\n cursor: pointer;\\n}\\n:where(.mly-editor) :disabled {\\n cursor: default;\\n}\\n:where(.mly-editor) img,\\n:where(.mly-editor) svg,\\n:where(.mly-editor) video,\\n:where(.mly-editor) canvas,\\n:where(.mly-editor) audio,\\n:where(.mly-editor) iframe,\\n:where(.mly-editor) embed,\\n:where(.mly-editor) object {\\n display: block;\\n vertical-align: middle;\\n}\\n:where(.mly-editor) img,\\n:where(.mly-editor) video {\\n max-width: 100%;\\n height: auto;\\n}\\n:where(.mly-editor) [hidden] {\\n display: none;\\n}\\n\")","import styleInject from '#style-inject';styleInject(\"*,\\n::before,\\n::after {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n::backdrop {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n* {\\n scrollbar-color: initial;\\n scrollbar-width: initial;\\n}\\n.mly-prose {\\n color: var(--tw-prose-body);\\n max-width: 65ch;\\n}\\n.mly-prose :where(p):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where([class~=lead]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-lead);\\n font-size: 1.25em;\\n line-height: 1.6;\\n margin-top: 1.2em;\\n margin-bottom: 1.2em;\\n}\\n.mly-prose :where(a):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-links);\\n text-decoration: underline;\\n font-weight: 500;\\n}\\n.mly-prose :where(strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-bold);\\n font-weight: 600;\\n}\\n.mly-prose :where(a strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(blockquote strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(thead th strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(ol):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: decimal;\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n padding-inline-start: 1.625em;\\n}\\n.mly-prose :where(ol[type=A]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-alpha;\\n}\\n.mly-prose :where(ol[type=a]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-alpha;\\n}\\n.mly-prose :where(ol[type=A s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-alpha;\\n}\\n.mly-prose :where(ol[type=a s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-alpha;\\n}\\n.mly-prose :where(ol[type=I]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-roman;\\n}\\n.mly-prose :where(ol[type=i]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-roman;\\n}\\n.mly-prose :where(ol[type=I s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: upper-roman;\\n}\\n.mly-prose :where(ol[type=i s]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: lower-roman;\\n}\\n.mly-prose :where(ol[type=\\\"1\\\"]):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: decimal;\\n}\\n.mly-prose :where(ul):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n list-style-type: disc;\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n padding-inline-start: 1.625em;\\n}\\n.mly-prose :where(ol > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::marker {\\n font-weight: 400;\\n color: var(--tw-prose-counters);\\n}\\n.mly-prose :where(ul > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::marker {\\n color: var(--tw-prose-bullets);\\n}\\n.mly-prose :where(dt):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n margin-top: 1.25em;\\n}\\n.mly-prose :where(hr):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-color: var(--tw-prose-hr);\\n border-top-width: 1px;\\n margin-top: 3em;\\n margin-bottom: 3em;\\n}\\n.mly-prose :where(blockquote):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 500;\\n font-style: italic;\\n color: var(--tw-prose-quotes);\\n border-inline-start-width: 0.25rem;\\n border-inline-start-color: var(--tw-prose-quote-borders);\\n quotes: \\\"\\\\201c\\\"\\\"\\\\201d\\\"\\\"\\\\2018\\\"\\\"\\\\2019\\\";\\n margin-top: 1.6em;\\n margin-bottom: 1.6em;\\n padding-inline-start: 1em;\\n}\\n.mly-prose :where(blockquote p:first-of-type):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::before {\\n content: open-quote;\\n}\\n.mly-prose :where(blockquote p:last-of-type):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::after {\\n content: close-quote;\\n}\\n.mly-prose :where(h1):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 800;\\n font-size: 2.25em;\\n margin-top: 0;\\n margin-bottom: 0.8888889em;\\n line-height: 1.1111111;\\n}\\n.mly-prose :where(h1 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 900;\\n color: inherit;\\n}\\n.mly-prose :where(h2):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 700;\\n font-size: 1.5em;\\n margin-top: 2em;\\n margin-bottom: 1em;\\n line-height: 1.3333333;\\n}\\n.mly-prose :where(h2 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 800;\\n color: inherit;\\n}\\n.mly-prose :where(h3):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n font-size: 1.25em;\\n margin-top: 1.6em;\\n margin-bottom: 0.6em;\\n line-height: 1.6;\\n}\\n.mly-prose :where(h3 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 700;\\n color: inherit;\\n}\\n.mly-prose :where(h4):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n margin-top: 1.5em;\\n margin-bottom: 0.5em;\\n line-height: 1.5;\\n}\\n.mly-prose :where(h4 strong):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 700;\\n color: inherit;\\n}\\n.mly-prose :where(img):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(picture):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n display: block;\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(video):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(kbd):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n font-weight: 500;\\n font-family: inherit;\\n color: var(--tw-prose-kbd);\\n box-shadow: 0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);\\n font-size: 0.875em;\\n border-radius: 0.3125rem;\\n padding-top: 0.1875em;\\n padding-inline-end: 0.375em;\\n padding-bottom: 0.1875em;\\n padding-inline-start: 0.375em;\\n}\\n.mly-prose :where(code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-code);\\n font-weight: 600;\\n font-size: 0.875em;\\n}\\n.mly-prose :where(code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::before {\\n content: \\\"`\\\";\\n}\\n.mly-prose :where(code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::after {\\n content: \\\"`\\\";\\n}\\n.mly-prose :where(a code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(h1 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(h2 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n font-size: 0.875em;\\n}\\n.mly-prose :where(h3 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n font-size: 0.9em;\\n}\\n.mly-prose :where(h4 code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(blockquote code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(thead th code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: inherit;\\n}\\n.mly-prose :where(pre):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-pre-code);\\n background-color: var(--tw-prose-pre-bg);\\n overflow-x: auto;\\n font-weight: 400;\\n font-size: 0.875em;\\n line-height: 1.7142857;\\n margin-top: 1.7142857em;\\n margin-bottom: 1.7142857em;\\n border-radius: 0.375rem;\\n padding-top: 0.8571429em;\\n padding-inline-end: 1.1428571em;\\n padding-bottom: 0.8571429em;\\n padding-inline-start: 1.1428571em;\\n}\\n.mly-prose :where(pre code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n background-color: transparent;\\n border-width: 0;\\n border-radius: 0;\\n padding: 0;\\n font-weight: inherit;\\n color: inherit;\\n font-size: inherit;\\n font-family: inherit;\\n line-height: inherit;\\n}\\n.mly-prose :where(pre code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::before {\\n content: none;\\n}\\n.mly-prose :where(pre code):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *))::after {\\n content: none;\\n}\\n.mly-prose :where(table):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n width: 100%;\\n table-layout: auto;\\n margin-top: 2em;\\n margin-bottom: 2em;\\n font-size: 0.875em;\\n line-height: 1.7142857;\\n}\\n.mly-prose :where(thead):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-bottom-width: 1px;\\n border-bottom-color: var(--tw-prose-th-borders);\\n}\\n.mly-prose :where(thead th):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-headings);\\n font-weight: 600;\\n vertical-align: bottom;\\n padding-inline-end: 0.5714286em;\\n padding-bottom: 0.5714286em;\\n padding-inline-start: 0.5714286em;\\n}\\n.mly-prose :where(tbody tr):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-bottom-width: 1px;\\n border-bottom-color: var(--tw-prose-td-borders);\\n}\\n.mly-prose :where(tbody tr:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-bottom-width: 0;\\n}\\n.mly-prose :where(tbody td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n vertical-align: baseline;\\n}\\n.mly-prose :where(tfoot):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n border-top-width: 1px;\\n border-top-color: var(--tw-prose-th-borders);\\n}\\n.mly-prose :where(tfoot td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n vertical-align: top;\\n}\\n.mly-prose :where(th, td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n text-align: start;\\n}\\n.mly-prose :where(figure > *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n.mly-prose :where(figcaption):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n color: var(--tw-prose-captions);\\n font-size: 0.875em;\\n line-height: 1.4285714;\\n margin-top: 0.8571429em;\\n}\\n.mly-prose {\\n --tw-prose-body: #374151;\\n --tw-prose-headings: #111827;\\n --tw-prose-lead: #4b5563;\\n --tw-prose-links: #111827;\\n --tw-prose-bold: #111827;\\n --tw-prose-counters: #6b7280;\\n --tw-prose-bullets: #d1d5db;\\n --tw-prose-hr: #e5e7eb;\\n --tw-prose-quotes: #111827;\\n --tw-prose-quote-borders: #e5e7eb;\\n --tw-prose-captions: #6b7280;\\n --tw-prose-kbd: #111827;\\n --tw-prose-kbd-shadows: 17 24 39;\\n --tw-prose-code: #111827;\\n --tw-prose-pre-code: #e5e7eb;\\n --tw-prose-pre-bg: #1f2937;\\n --tw-prose-th-borders: #d1d5db;\\n --tw-prose-td-borders: #e5e7eb;\\n --tw-prose-invert-body: #d1d5db;\\n --tw-prose-invert-headings: #fff;\\n --tw-prose-invert-lead: #9ca3af;\\n --tw-prose-invert-links: #fff;\\n --tw-prose-invert-bold: #fff;\\n --tw-prose-invert-counters: #9ca3af;\\n --tw-prose-invert-bullets: #4b5563;\\n --tw-prose-invert-hr: #374151;\\n --tw-prose-invert-quotes: #f3f4f6;\\n --tw-prose-invert-quote-borders: #374151;\\n --tw-prose-invert-captions: #9ca3af;\\n --tw-prose-invert-kbd: #fff;\\n --tw-prose-invert-kbd-shadows: 255 255 255;\\n --tw-prose-invert-code: #fff;\\n --tw-prose-invert-pre-code: #d1d5db;\\n --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);\\n --tw-prose-invert-th-borders: #4b5563;\\n --tw-prose-invert-td-borders: #374151;\\n font-size: 1rem;\\n line-height: 1.75;\\n}\\n.mly-prose :where(picture > img):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n.mly-prose :where(li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.5em;\\n margin-bottom: 0.5em;\\n}\\n.mly-prose :where(ol > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0.375em;\\n}\\n.mly-prose :where(ul > li):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0.375em;\\n}\\n.mly-prose :where(.mly-prose > ul > li p):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.75em;\\n margin-bottom: 0.75em;\\n}\\n.mly-prose :where(.mly-prose > ul > li > p:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n}\\n.mly-prose :where(.mly-prose > ul > li > p:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where(.mly-prose > ol > li > p:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n}\\n.mly-prose :where(.mly-prose > ol > li > p:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.75em;\\n margin-bottom: 0.75em;\\n}\\n.mly-prose :where(dl):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 1.25em;\\n margin-bottom: 1.25em;\\n}\\n.mly-prose :where(dd):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0.5em;\\n padding-inline-start: 1.625em;\\n}\\n.mly-prose :where(hr + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(h2 + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(h3 + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(h4 + *):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(thead th:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0;\\n}\\n.mly-prose :where(thead th:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-end: 0;\\n}\\n.mly-prose :where(tbody td, tfoot td):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-top: 0.5714286em;\\n padding-inline-end: 0.5714286em;\\n padding-bottom: 0.5714286em;\\n padding-inline-start: 0.5714286em;\\n}\\n.mly-prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-start: 0;\\n}\\n.mly-prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n padding-inline-end: 0;\\n}\\n.mly-prose :where(figure):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 2em;\\n margin-bottom: 2em;\\n}\\n.mly-prose :where(.mly-prose > :first-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-top: 0;\\n}\\n.mly-prose :where(.mly-prose > :last-child):not(:where([class~=mly-not-prose], [class~=mly-not-prose] *)) {\\n margin-bottom: 0;\\n}\\n.mly-pointer-events-none {\\n pointer-events: none;\\n}\\n.mly-absolute {\\n position: absolute;\\n}\\n.mly-relative {\\n position: relative;\\n}\\n.mly-inset-y-0 {\\n top: 0px;\\n bottom: 0px;\\n}\\n.mly-left-0 {\\n left: 0px;\\n}\\n.mly-left-1\\\\.5 {\\n left: 0.375rem;\\n}\\n.mly-left-2 {\\n left: 0.5rem;\\n}\\n.mly-right-0 {\\n right: 0px;\\n}\\n.mly-right-1 {\\n right: 0.25rem;\\n}\\n.mly-top-0 {\\n top: 0px;\\n}\\n.mly-top-8 {\\n top: 2rem;\\n}\\n.mly-isolate {\\n isolation: isolate;\\n}\\n.mly-z-0 {\\n z-index: 0;\\n}\\n.mly-z-10 {\\n z-index: 10;\\n}\\n.mly-z-20 {\\n z-index: 20;\\n}\\n.mly-z-50 {\\n z-index: 50;\\n}\\n.mly-z-\\\\[1\\\\] {\\n z-index: 1;\\n}\\n.mly-z-\\\\[9999\\\\] {\\n z-index: 9999;\\n}\\n.\\\\!mly-my-0 {\\n margin-top: 0px !important;\\n margin-bottom: 0px !important;\\n}\\n.-mly-mx-4 {\\n margin-left: -1rem;\\n margin-right: -1rem;\\n}\\n.mly--mx-1 {\\n margin-left: -0.25rem;\\n margin-right: -0.25rem;\\n}\\n.mly-mx-0 {\\n margin-left: 0px;\\n margin-right: 0px;\\n}\\n.mly-mx-0\\\\.5 {\\n margin-left: 0.125rem;\\n margin-right: 0.125rem;\\n}\\n.mly-mx-1\\\\.5 {\\n margin-left: 0.375rem;\\n margin-right: 0.375rem;\\n}\\n.mly-my-0\\\\.5 {\\n margin-top: 0.125rem;\\n margin-bottom: 0.125rem;\\n}\\n.mly-my-1 {\\n margin-top: 0.25rem;\\n margin-bottom: 0.25rem;\\n}\\n.mly-my-2 {\\n margin-top: 0.5rem;\\n margin-bottom: 0.5rem;\\n}\\n.mly-my-4 {\\n margin-top: 1rem;\\n margin-bottom: 1rem;\\n}\\n.\\\\!mly-mb-0 {\\n margin-bottom: 0px !important;\\n}\\n.\\\\!mly-mb-1\\\\.5 {\\n margin-bottom: 0.375rem !important;\\n}\\n.-mly-ms-px {\\n margin-inline-start: -1px;\\n}\\n.mly-mb-1\\\\.5 {\\n margin-bottom: 0.375rem;\\n}\\n.mly-mb-2 {\\n margin-bottom: 0.5rem;\\n}\\n.mly-mb-4 {\\n margin-bottom: 1rem;\\n}\\n.mly-ml-1 {\\n margin-left: 0.25rem;\\n}\\n.mly-ml-auto {\\n margin-left: auto;\\n}\\n.mly-mt-1 {\\n margin-top: 0.25rem;\\n}\\n.mly-mt-2 {\\n margin-top: 0.5rem;\\n}\\n.mly-mt-4 {\\n margin-top: 1rem;\\n}\\n.mly-block {\\n display: block;\\n}\\n.mly-inline-block {\\n display: inline-block;\\n}\\n.mly-flex {\\n display: flex;\\n}\\n.mly-inline-flex {\\n display: inline-flex;\\n}\\n.mly-grid {\\n display: grid;\\n}\\n.mly-inline-grid {\\n display: inline-grid;\\n}\\n.mly-aspect-square {\\n aspect-ratio: 1 / 1;\\n}\\n.\\\\!mly-size-5 {\\n width: 1.25rem !important;\\n height: 1.25rem !important;\\n}\\n.\\\\!mly-size-7 {\\n width: 1.75rem !important;\\n height: 1.75rem !important;\\n}\\n.mly-size-3 {\\n width: 0.75rem;\\n height: 0.75rem;\\n}\\n.mly-size-3\\\\.5 {\\n width: 0.875rem;\\n height: 0.875rem;\\n}\\n.mly-size-4 {\\n width: 1rem;\\n height: 1rem;\\n}\\n.mly-size-5 {\\n width: 1.25rem;\\n height: 1.25rem;\\n}\\n.mly-size-7 {\\n width: 1.75rem;\\n height: 1.75rem;\\n}\\n.mly-size-\\\\[15px\\\\] {\\n width: 15px;\\n height: 15px;\\n}\\n.mly-size-\\\\[var\\\\(--variable-icon-size\\\\)\\\\] {\\n width: var(--variable-icon-size);\\n height: var(--variable-icon-size);\\n}\\n.\\\\!mly-h-7 {\\n height: 1.75rem !important;\\n}\\n.mly-h-10 {\\n height: 2.5rem;\\n}\\n.mly-h-11 {\\n height: 2.75rem;\\n}\\n.mly-h-3 {\\n height: 0.75rem;\\n}\\n.mly-h-4 {\\n height: 1rem;\\n}\\n.mly-h-5 {\\n height: 1.25rem;\\n}\\n.mly-h-6 {\\n height: 1.5rem;\\n}\\n.mly-h-7 {\\n height: 1.75rem;\\n}\\n.mly-h-8 {\\n height: 2rem;\\n}\\n.mly-h-9 {\\n height: 2.25rem;\\n}\\n.mly-h-\\\\[2px\\\\] {\\n height: 2px;\\n}\\n.mly-h-auto {\\n height: auto;\\n}\\n.mly-h-full {\\n height: 100%;\\n}\\n.mly-h-px {\\n height: 1px;\\n}\\n.mly-max-h-52 {\\n max-height: 13rem;\\n}\\n.mly-max-h-\\\\[330px\\\\] {\\n max-height: 330px;\\n}\\n.mly-min-h-24 {\\n min-height: 6rem;\\n}\\n.mly-min-h-7 {\\n min-height: 1.75rem;\\n}\\n.\\\\!mly-w-full {\\n width: 100% !important;\\n}\\n.mly-w-10 {\\n width: 2.5rem;\\n}\\n.mly-w-3 {\\n width: 0.75rem;\\n}\\n.mly-w-32 {\\n width: 8rem;\\n}\\n.mly-w-36 {\\n width: 9rem;\\n}\\n.mly-w-4 {\\n width: 1rem;\\n}\\n.mly-w-40 {\\n width: 10rem;\\n}\\n.mly-w-5 {\\n width: 1.25rem;\\n}\\n.mly-w-52 {\\n width: 13rem;\\n}\\n.mly-w-6 {\\n width: 1.5rem;\\n}\\n.mly-w-64 {\\n width: 16rem;\\n}\\n.mly-w-7 {\\n width: 1.75rem;\\n}\\n.mly-w-72 {\\n width: 18rem;\\n}\\n.mly-w-9 {\\n width: 2.25rem;\\n}\\n.mly-w-96 {\\n width: 24rem;\\n}\\n.mly-w-\\\\[1\\\\.5px\\\\] {\\n width: 1.5px;\\n}\\n.mly-w-\\\\[160px\\\\] {\\n width: 160px;\\n}\\n.mly-w-\\\\[300px\\\\] {\\n width: 300px;\\n}\\n.mly-w-fit {\\n width: -moz-fit-content;\\n width: fit-content;\\n}\\n.mly-w-full {\\n width: 100%;\\n}\\n.mly-w-max {\\n width: -moz-max-content;\\n width: max-content;\\n}\\n.mly-w-px {\\n width: 1px;\\n}\\n.mly-min-w-0 {\\n min-width: 0px;\\n}\\n.mly-min-w-28 {\\n min-width: 7rem;\\n}\\n.mly-min-w-\\\\[260px\\\\] {\\n min-width: 260px;\\n}\\n.mly-min-w-\\\\[8rem\\\\] {\\n min-width: 8rem;\\n}\\n.mly-min-w-full {\\n min-width: 100%;\\n}\\n.mly-max-w-12 {\\n max-width: 3rem;\\n}\\n.mly-max-w-20 {\\n max-width: 5rem;\\n}\\n.mly-max-w-28 {\\n max-width: 7rem;\\n}\\n.mly-max-w-\\\\[260px\\\\] {\\n max-width: 260px;\\n}\\n.mly-max-w-max {\\n max-width: -moz-max-content;\\n max-width: max-content;\\n}\\n.mly-max-w-xs {\\n max-width: 20rem;\\n}\\n.mly-shrink-0 {\\n flex-shrink: 0;\\n}\\n.mly-grow {\\n flex-grow: 1;\\n}\\n.mly-table-fixed {\\n table-layout: fixed;\\n}\\n.mly-border-separate {\\n border-collapse: separate;\\n}\\n.mly-translate-x-full {\\n --tw-translate-x: 100%;\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.mly-transform {\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n@keyframes mly-spin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n.mly-animate-spin {\\n animation: mly-spin 1s linear infinite;\\n}\\n.mly-cursor-default {\\n cursor: default;\\n}\\n.mly-cursor-grab {\\n cursor: grab;\\n}\\n.mly-cursor-pointer {\\n cursor: pointer;\\n}\\n.mly-select-none {\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n user-select: none;\\n}\\n.mly-appearance-none {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n}\\n.mly-grid-cols-2 {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n}\\n.mly-grid-cols-\\\\[12px_1fr\\\\] {\\n grid-template-columns: 12px 1fr;\\n}\\n.mly-flex-col {\\n flex-direction: column;\\n}\\n.mly-flex-wrap {\\n flex-wrap: wrap;\\n}\\n.mly-items-center {\\n align-items: center;\\n}\\n.mly-items-stretch {\\n align-items: stretch;\\n}\\n.mly-justify-start {\\n justify-content: flex-start;\\n}\\n.mly-justify-center {\\n justify-content: center;\\n}\\n.mly-justify-between {\\n justify-content: space-between;\\n}\\n.mly-gap-0\\\\.5 {\\n gap: 0.125rem;\\n}\\n.mly-gap-1 {\\n gap: 0.25rem;\\n}\\n.mly-gap-1\\\\.5 {\\n gap: 0.375rem;\\n}\\n.mly-gap-2 {\\n gap: 0.5rem;\\n}\\n.mly-gap-3 {\\n gap: 0.75rem;\\n}\\n.mly-gap-4 {\\n gap: 1rem;\\n}\\n.mly-gap-\\\\[1px\\\\] {\\n gap: 1px;\\n}\\n.mly-gap-\\\\[var\\\\(--variable-icon-gap\\\\)\\\\] {\\n gap: var(--variable-icon-gap);\\n}\\n.mly-space-x-0\\\\.5 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-x-reverse: 0;\\n margin-right: calc(0.125rem * var(--tw-space-x-reverse));\\n margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse)));\\n}\\n.mly-space-x-2 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-x-reverse: 0;\\n margin-right: calc(0.5rem * var(--tw-space-x-reverse));\\n margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));\\n}\\n.mly-space-y-1 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-y-reverse: 0;\\n margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));\\n}\\n.mly-overflow-hidden {\\n overflow: hidden;\\n}\\n.mly-overflow-y-auto {\\n overflow-y: auto;\\n}\\n.mly-scroll-smooth {\\n scroll-behavior: smooth;\\n}\\n.mly-truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.\\\\!mly-rounded {\\n border-radius: 0.25rem !important;\\n}\\n.\\\\!mly-rounded-full {\\n border-radius: 9999px !important;\\n}\\n.\\\\!mly-rounded-md {\\n border-radius: 0.375rem !important;\\n}\\n.\\\\!mly-rounded-none {\\n border-radius: 0px !important;\\n}\\n.mly-rounded {\\n border-radius: 0.25rem;\\n}\\n.mly-rounded-full {\\n border-radius: 9999px;\\n}\\n.mly-rounded-lg {\\n border-radius: 0.5rem;\\n}\\n.mly-rounded-md {\\n border-radius: 0.375rem;\\n}\\n.mly-rounded-none {\\n border-radius: 0px;\\n}\\n.mly-rounded-sm {\\n border-radius: 0.125rem;\\n}\\n.mly-rounded-xl {\\n border-radius: 0.75rem;\\n}\\n.mly-rounded-s-lg {\\n border-start-start-radius: 0.5rem;\\n border-end-start-radius: 0.5rem;\\n}\\n.mly-rounded-s-none {\\n border-start-start-radius: 0px;\\n border-end-start-radius: 0px;\\n}\\n.mly-rounded-t-lg {\\n border-top-left-radius: 0.5rem;\\n border-top-right-radius: 0.5rem;\\n}\\n.mly-border {\\n border-width: 1px;\\n}\\n.mly-border-0 {\\n border-width: 0px;\\n}\\n.mly-border-2 {\\n border-width: 2px;\\n}\\n.mly-border-\\\\[1\\\\.5px\\\\] {\\n border-width: 1.5px;\\n}\\n.mly-border-b {\\n border-bottom-width: 1px;\\n}\\n.mly-border-l-4 {\\n border-left-width: 4px;\\n}\\n.mly-border-t {\\n border-top-width: 1px;\\n}\\n.mly-border-none {\\n border-style: none;\\n}\\n.mly-border-\\\\[var\\\\(--button-var-border-color\\\\)\\\\] {\\n border-color: var(--button-var-border-color);\\n}\\n.mly-border-gray-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-gray-300 {\\n --tw-border-opacity: 1;\\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-gray-700 {\\n --tw-border-opacity: 1;\\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-rose-400 {\\n --tw-border-opacity: 1;\\n border-color: rgb(251 113 133 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-slate-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));\\n}\\n.mly-border-white {\\n --tw-border-opacity: 1;\\n border-color: rgb(255 255 255 / var(--tw-border-opacity, 1));\\n}\\n.\\\\!mly-bg-transparent {\\n background-color: transparent !important;\\n}\\n.mly-bg-\\\\[\\\\#efefef\\\\] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 239 239 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-200 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-gray-900 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-red-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-red-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-300 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(253 164 175 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 241 242 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-rose-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 63 94 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-soft-gray {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-soft-gray\\\\/40 {\\n background-color: rgb(244 245 246 / 0.4);\\n}\\n.mly-bg-soft-gray\\\\/60 {\\n background-color: rgb(244 245 246 / 0.6);\\n}\\n.mly-bg-transparent {\\n background-color: transparent;\\n}\\n.mly-bg-white {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\\n}\\n.mly-bg-yellow-200 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 240 138 / var(--tw-bg-opacity, 1));\\n}\\n.mly-stroke-midnight-gray {\\n stroke: #333333;\\n}\\n.mly-stroke-\\\\[1\\\\.2\\\\] {\\n stroke-width: 1.2;\\n}\\n.mly-stroke-\\\\[1\\\\] {\\n stroke-width: 1;\\n}\\n.mly-stroke-\\\\[2\\\\.5\\\\] {\\n stroke-width: 2.5;\\n}\\n.\\\\!mly-p-0 {\\n padding: 0px !important;\\n}\\n.\\\\!mly-p-0\\\\.5 {\\n padding: 0.125rem !important;\\n}\\n.mly-p-0 {\\n padding: 0px;\\n}\\n.mly-p-0\\\\.5 {\\n padding: 0.125rem;\\n}\\n.mly-p-1 {\\n padding: 0.25rem;\\n}\\n.mly-p-3 {\\n padding: 0.75rem;\\n}\\n.mly-p-4 {\\n padding: 1rem;\\n}\\n.mly-px-0\\\\.5 {\\n padding-left: 0.125rem;\\n padding-right: 0.125rem;\\n}\\n.mly-px-1 {\\n padding-left: 0.25rem;\\n padding-right: 0.25rem;\\n}\\n.mly-px-1\\\\.5 {\\n padding-left: 0.375rem;\\n padding-right: 0.375rem;\\n}\\n.mly-px-2 {\\n padding-left: 0.5rem;\\n padding-right: 0.5rem;\\n}\\n.mly-px-2\\\\.5 {\\n padding-left: 0.625rem;\\n padding-right: 0.625rem;\\n}\\n.mly-px-3 {\\n padding-left: 0.75rem;\\n padding-right: 0.75rem;\\n}\\n.mly-px-4 {\\n padding-left: 1rem;\\n padding-right: 1rem;\\n}\\n.mly-px-8 {\\n padding-left: 2rem;\\n padding-right: 2rem;\\n}\\n.mly-px-\\\\[26px\\\\] {\\n padding-left: 26px;\\n padding-right: 26px;\\n}\\n.mly-px-\\\\[32px\\\\] {\\n padding-left: 32px;\\n padding-right: 32px;\\n}\\n.mly-py-0\\\\.5 {\\n padding-top: 0.125rem;\\n padding-bottom: 0.125rem;\\n}\\n.mly-py-1 {\\n padding-top: 0.25rem;\\n padding-bottom: 0.25rem;\\n}\\n.mly-py-1\\\\.5 {\\n padding-top: 0.375rem;\\n padding-bottom: 0.375rem;\\n}\\n.mly-py-2 {\\n padding-top: 0.5rem;\\n padding-bottom: 0.5rem;\\n}\\n.mly-py-3 {\\n padding-top: 0.75rem;\\n padding-bottom: 0.75rem;\\n}\\n.mly-py-\\\\[20px\\\\] {\\n padding-top: 20px;\\n padding-bottom: 20px;\\n}\\n.mly-pe-8 {\\n padding-inline-end: 2rem;\\n}\\n.mly-pl-1 {\\n padding-left: 0.25rem;\\n}\\n.mly-pl-4 {\\n padding-left: 1rem;\\n}\\n.mly-pl-7 {\\n padding-left: 1.75rem;\\n}\\n.mly-pl-8 {\\n padding-left: 2rem;\\n}\\n.mly-pl-\\\\[26px\\\\] {\\n padding-left: 26px;\\n}\\n.mly-pr-1\\\\.5 {\\n padding-right: 0.375rem;\\n}\\n.mly-pr-6 {\\n padding-right: 1.5rem;\\n}\\n.mly-pr-7 {\\n padding-right: 1.75rem;\\n}\\n.mly-ps-3 {\\n padding-inline-start: 0.75rem;\\n}\\n.mly-text-left {\\n text-align: left;\\n}\\n.mly-text-center {\\n text-align: center;\\n}\\n.mly-font-mono {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n}\\n.\\\\!mly-text-base {\\n font-size: 1rem !important;\\n line-height: 1.5rem !important;\\n}\\n.\\\\!mly-text-lg {\\n font-size: 1.125rem !important;\\n line-height: 1.75rem !important;\\n}\\n.mly-text-\\\\[10px\\\\] {\\n font-size: 10px;\\n}\\n.mly-text-\\\\[13px\\\\] {\\n font-size: 13px;\\n}\\n.mly-text-sm {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n.mly-text-xs {\\n font-size: 0.75rem;\\n line-height: 1rem;\\n}\\n.mly-font-medium {\\n font-weight: 500;\\n}\\n.mly-font-normal {\\n font-weight: 400;\\n}\\n.mly-font-semibold {\\n font-weight: 600;\\n}\\n.mly-uppercase {\\n text-transform: uppercase;\\n}\\n.mly-capitalize {\\n text-transform: capitalize;\\n}\\n.mly-tabular-nums {\\n --tw-numeric-spacing: tabular-nums;\\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\\n}\\n.mly-leading-none {\\n line-height: 1;\\n}\\n.mly-tracking-normal {\\n letter-spacing: 0em;\\n}\\n.mly-tracking-widest {\\n letter-spacing: 0.1em;\\n}\\n.mly-text-gray-400 {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-50 {\\n --tw-text-opacity: 1;\\n color: rgb(249 250 251 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-500 {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-600 {\\n --tw-text-opacity: 1;\\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-700 {\\n --tw-text-opacity: 1;\\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-900 {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-gray-950 {\\n --tw-text-opacity: 1;\\n color: rgb(3 7 18 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-midnight-gray {\\n --tw-text-opacity: 1;\\n color: rgb(51 51 51 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-midnight-gray\\\\/60 {\\n color: rgb(51 51 51 / 0.6);\\n}\\n.mly-text-red-500 {\\n --tw-text-opacity: 1;\\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-red-600 {\\n --tw-text-opacity: 1;\\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-rose-600 {\\n --tw-text-opacity: 1;\\n color: rgb(225 29 72 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-rose-800 {\\n --tw-text-opacity: 1;\\n color: rgb(159 18 57 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-400 {\\n --tw-text-opacity: 1;\\n color: rgb(148 163 184 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-500 {\\n --tw-text-opacity: 1;\\n color: rgb(100 116 139 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-600 {\\n --tw-text-opacity: 1;\\n color: rgb(71 85 105 / var(--tw-text-opacity, 1));\\n}\\n.mly-text-slate-700 {\\n --tw-text-opacity: 1;\\n color: rgb(51 65 85 / var(--tw-text-opacity, 1));\\n}\\n.mly-no-underline {\\n text-decoration-line: none;\\n}\\n.mly-underline-offset-4 {\\n text-underline-offset: 4px;\\n}\\n.mly-antialiased {\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.mly-opacity-60 {\\n opacity: 0.6;\\n}\\n.mly-shadow {\\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-lg {\\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-md {\\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-none {\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-shadow-sm {\\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.mly-outline-none {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.mly-ring-offset-white {\\n --tw-ring-offset-color: #fff;\\n}\\n.mly-drop-shadow-md {\\n --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.mly-transition-all {\\n transition-property: all;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.mly-transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.mly-transition-shadow {\\n transition-property: box-shadow;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.mly-ease-out {\\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n}\\n@keyframes enter {\\n from {\\n opacity: var(--tw-enter-opacity, 1);\\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\\n }\\n}\\n@keyframes exit {\\n to {\\n opacity: var(--tw-exit-opacity, 1);\\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\\n }\\n}\\n.mly-animate-in {\\n animation-name: enter;\\n animation-duration: 150ms;\\n --tw-enter-opacity: initial;\\n --tw-enter-scale: initial;\\n --tw-enter-rotate: initial;\\n --tw-enter-translate-x: initial;\\n --tw-enter-translate-y: initial;\\n}\\n.mly-fade-in-0 {\\n --tw-enter-opacity: 0;\\n}\\n.mly-zoom-in-95 {\\n --tw-enter-scale: .95;\\n}\\n.mly-ease-out {\\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-track {\\n background-color: var(--scrollbar-track);\\n border-radius: var(--scrollbar-track-radius);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-track:hover {\\n background-color: var(--scrollbar-track-hover, var(--scrollbar-track));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-track:active {\\n background-color: var(--scrollbar-track-active, var(--scrollbar-track-hover, var(--scrollbar-track)));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-thumb {\\n background-color: var(--scrollbar-thumb);\\n border-radius: var(--scrollbar-thumb-radius);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-thumb:hover {\\n background-color: var(--scrollbar-thumb-hover, var(--scrollbar-thumb));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-thumb:active {\\n background-color: var(--scrollbar-thumb-active, var(--scrollbar-thumb-hover, var(--scrollbar-thumb)));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-corner {\\n background-color: var(--scrollbar-corner);\\n border-radius: var(--scrollbar-corner-radius);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-corner:hover {\\n background-color: var(--scrollbar-corner-hover, var(--scrollbar-corner));\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar-corner:active {\\n background-color: var(--scrollbar-corner-active, var(--scrollbar-corner-hover, var(--scrollbar-corner)));\\n}\\n.mly-scrollbar-thin {\\n scrollbar-width: thin;\\n scrollbar-color: var(--scrollbar-thumb, initial) var(--scrollbar-track, initial);\\n}\\n.mly-scrollbar-thin::-webkit-scrollbar {\\n display: block;\\n width: 8px;\\n height: 8px;\\n}\\n.mly-scrollbar-track-transparent {\\n --scrollbar-track: transparent !important;\\n}\\n.mly-scrollbar-thumb-gray-200 {\\n --scrollbar-thumb: #e5e7eb !important;\\n}\\n.\\\\[text-align\\\\:revert-layer\\\\] {\\n text-align: revert-layer;\\n}\\n.file\\\\:mly-border-0::file-selector-button {\\n border-width: 0px;\\n}\\n.file\\\\:mly-bg-transparent::file-selector-button {\\n background-color: transparent;\\n}\\n.file\\\\:mly-text-sm::file-selector-button {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n.file\\\\:mly-font-medium::file-selector-button {\\n font-weight: 500;\\n}\\n.placeholder\\\\:mly-text-gray-400::-moz-placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:mly-text-gray-400::placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:mly-text-gray-500::-moz-placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.placeholder\\\\:mly-text-gray-500::placeholder {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.mly-peer:disabled ~ .peer-disabled\\\\:mly-opacity-50 {\\n opacity: 0.5;\\n}\\n.data-\\\\[disabled\\\\]\\\\:mly-pointer-events-none[data-disabled] {\\n pointer-events: none;\\n}\\n.data-\\\\[state\\\\=open\\\\]\\\\:mly-bg-rose-100[data-state=open] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));\\n}\\n.data-\\\\[state\\\\=open\\\\]\\\\:mly-bg-soft-gray[data-state=open] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.data-\\\\[state\\\\=true\\\\]\\\\:mly-bg-soft-gray[data-state=true] {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.data-\\\\[state\\\\=true\\\\]\\\\:mly-text-gray-900[data-state=true] {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.data-\\\\[disabled\\\\]\\\\:mly-opacity-50[data-disabled] {\\n opacity: 0.5;\\n}\\n.hover\\\\:mly-bg-gray-100:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-gray-100\\\\/80:hover {\\n background-color: rgb(243 244 246 / 0.8);\\n}\\n.hover\\\\:mly-bg-red-200:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-red-500\\\\/90:hover {\\n background-color: rgb(239 68 68 / 0.9);\\n}\\n.hover\\\\:mly-bg-rose-100:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-soft-gray:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:mly-bg-soft-gray\\\\/60:hover {\\n background-color: rgb(244 245 246 / 0.6);\\n}\\n.hover\\\\:mly-text-black:hover {\\n --tw-text-opacity: 1;\\n color: rgb(0 0 0 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:mly-text-gray-900:hover {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:mly-text-midnight-gray:hover {\\n --tw-text-opacity: 1;\\n color: rgb(51 51 51 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:mly-underline:hover {\\n text-decoration-line: underline;\\n}\\n.focus\\\\:mly-z-10:focus {\\n z-index: 10;\\n}\\n.focus\\\\:mly-bg-gray-100:focus {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.focus\\\\:mly-bg-red-200:focus {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1));\\n}\\n.focus\\\\:mly-bg-soft-gray:focus {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.focus\\\\:mly-outline-none:focus {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus\\\\:mly-ring-1:focus {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus\\\\:mly-ring-midnight-gray\\\\/50:focus {\\n --tw-ring-color: rgb(51 51 51 / 0.5);\\n}\\n.focus-visible\\\\:mly-relative:focus-visible {\\n position: relative;\\n}\\n.focus-visible\\\\:mly-z-10:focus-visible {\\n z-index: 10;\\n}\\n.focus-visible\\\\:mly-border-gray-400:focus-visible {\\n --tw-border-opacity: 1;\\n border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));\\n}\\n.focus-visible\\\\:mly-outline-none:focus-visible {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus-visible\\\\:mly-ring-2:focus-visible {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus-visible\\\\:mly-ring-gray-400:focus-visible {\\n --tw-ring-opacity: 1;\\n --tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1));\\n}\\n.focus-visible\\\\:mly-ring-offset-2:focus-visible {\\n --tw-ring-offset-width: 2px;\\n}\\n.active\\\\:mly-bg-soft-gray:active {\\n --tw-bg-opacity: 1;\\n background-color: rgb(244 245 246 / var(--tw-bg-opacity, 1));\\n}\\n.disabled\\\\:mly-pointer-events-none:disabled {\\n pointer-events: none;\\n}\\n.disabled\\\\:mly-cursor-not-allowed:disabled {\\n cursor: not-allowed;\\n}\\n.disabled\\\\:mly-opacity-50:disabled {\\n opacity: 0.5;\\n}\\n.\\\\[\\\\&_svg\\\\]\\\\:mly-pointer-events-none svg {\\n pointer-events: none;\\n}\\n\")","'use client';\n\nimport { Extension, FocusPosition, Editor as TiptapEditor } from '@tiptap/core';\nimport { EditorContent, JSONContent, useEditor } from '@tiptap/react';\n\nimport { useRef } from 'react';\nimport { ColumnsBubbleMenu } from './components/column-menu/columns-bubble-menu';\nimport { ContentMenu } from './components/content-menu';\nimport { EditorMenuBar } from './components/editor-menu-bar';\nimport { ForBubbleMenu } from './components/for-menu/for-bubble-menu';\nimport { ImageBubbleMenu } from './components/image-menu/image-bubble-menu';\nimport { SectionBubbleMenu } from './components/section-menu/section-bubble-menu';\nimport { SpacerBubbleMenu } from './components/spacer-menu/spacer-bubble-menu';\nimport { TextBubbleMenu } from './components/text-menu/text-bubble-menu';\nimport { extensions as defaultExtensions } from './extensions';\nimport { DEFAULT_SLASH_COMMANDS } from './extensions/slash-command/default-slash-commands';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n DEFAULT_VARIABLES,\n MailyContextType,\n MailyProvider,\n} from './provider';\nimport { cn } from './utils/classname';\n\ntype ParitialMailContextType = Partial<MailyContextType>;\n\nexport type EditorProps = {\n contentHtml?: string;\n contentJson?: JSONContent;\n onUpdate?: (editor: TiptapEditor) => void;\n onCreate?: (editor: TiptapEditor) => void;\n extensions?: Extension[];\n config?: {\n hasMenuBar?: boolean;\n spellCheck?: boolean;\n wrapClassName?: string;\n toolbarClassName?: string;\n contentClassName?: string;\n bodyClassName?: string;\n autofocus?: FocusPosition;\n immediatelyRender?: boolean;\n };\n} & ParitialMailContextType;\n\nexport function Editor(props: EditorProps) {\n const {\n config: {\n wrapClassName = '',\n contentClassName = '',\n bodyClassName = '',\n hasMenuBar = true,\n spellCheck = false,\n autofocus = 'end',\n immediatelyRender = false,\n } = {},\n onCreate,\n onUpdate,\n extensions,\n contentHtml,\n contentJson,\n variables = DEFAULT_VARIABLES,\n blocks = DEFAULT_SLASH_COMMANDS,\n variableTriggerCharacter = DEFAULT_VARIABLE_TRIGGER_CHAR,\n renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION,\n } = props;\n\n let formattedContent: any = null;\n if (contentJson) {\n formattedContent =\n contentJson?.type === 'doc'\n ? contentJson\n : {\n type: 'doc',\n content: contentJson,\n };\n } else if (contentHtml) {\n formattedContent = contentHtml;\n } else {\n formattedContent = {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [],\n },\n ],\n };\n }\n\n const menuContainerRef = useRef(null);\n const editor = useEditor({\n editorProps: {\n attributes: {\n class: cn(`mly-prose mly-w-full`, contentClassName),\n spellCheck: spellCheck ? 'true' : 'false',\n },\n handleDOMEvents: {\n keydown: (_view, event) => {\n // prevent default event listeners from firing when slash command is active\n if (['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key)) {\n const slashCommand = document.querySelector('#slash-command');\n if (slashCommand) {\n return true;\n }\n }\n },\n },\n },\n immediatelyRender,\n onCreate: ({ editor }) => {\n onCreate?.(editor);\n },\n onUpdate: ({ editor }) => {\n onUpdate?.(editor);\n },\n extensions: [\n ...defaultExtensions({\n variables,\n blocks,\n variableTriggerCharacter,\n }),\n ...(extensions || []),\n ],\n content: formattedContent,\n autofocus,\n });\n\n if (!editor) {\n return null;\n }\n\n return (\n <MailyProvider\n variables={variables}\n blocks={blocks}\n variableTriggerCharacter={variableTriggerCharacter}\n renderVariable={renderVariable}\n >\n <div\n className={cn('mly-editor mly-antialiased', wrapClassName)}\n ref={menuContainerRef}\n >\n {hasMenuBar && <EditorMenuBar config={props.config} editor={editor} />}\n <div\n className={cn(\n 'mly-mt-4 mly-rounded mly-border mly-bg-white mly-p-4',\n bodyClassName\n )}\n >\n <TextBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <ImageBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <SpacerBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <EditorContent editor={editor} />\n <SectionBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <ColumnsBubbleMenu editor={editor} appendTo={menuContainerRef} />\n <ContentMenu editor={editor} />\n <ForBubbleMenu editor={editor} appendTo={menuContainerRef} />\n </div>\n </div>\n </MailyProvider>\n );\n}\n","import { BubbleMenu } from '@tiptap/react';\nimport { useCallback } from 'react';\nimport { getRenderContainer } from '../../utils/get-render-container';\nimport { sticky } from 'tippy.js';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { ColumnsBubbleMenuContent } from './columns-bubble-menu-content';\n\nexport function ColumnsBubbleMenu(props: EditorBubbleMenuProps) {\n const { appendTo, editor } = props;\n if (!editor) {\n return null;\n }\n\n const getReferenceClientRect = useCallback(() => {\n const renderContainer = getRenderContainer(editor!, 'columns');\n const rect =\n renderContainer?.getBoundingClientRect() ||\n new DOMRect(-1000, -1000, 0, 0);\n\n return rect;\n }, [editor]);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n if (\n isTextSelected(editor) ||\n editor.isActive('section') ||\n editor.isActive('for')\n ) {\n return false;\n }\n\n return editor.isActive('columns');\n },\n tippyOptions: {\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n appendTo: () => appendTo?.current,\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: 'auto',\n },\n pluginKey: 'columnsBubbleMenu',\n };\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <ColumnsBubbleMenuContent editor={editor} />\n </BubbleMenu>\n );\n}\n","import { Editor } from '@tiptap/react';\n\nexport function getRenderContainer(editor: Editor, nodeType: string) {\n const {\n view,\n state: {\n selection: { from },\n },\n } = editor;\n\n const elements = document.querySelectorAll('.has-focus');\n const elementCount = elements.length;\n const innermostNode = elements[elementCount - 1];\n const element = innermostNode;\n\n if (\n (element &&\n element.getAttribute('data-type') &&\n element.getAttribute('data-type') === nodeType) ||\n (element &&\n element.classList &&\n (element.classList.contains(nodeType) ||\n element.classList.contains(`node-${nodeType}`)))\n ) {\n return element;\n }\n\n const node = view.domAtPos(from).node as HTMLElement;\n let container: HTMLElement | null = node;\n\n if (!container.tagName) {\n container = node.parentElement;\n }\n\n while (\n container &&\n !(\n container.getAttribute('data-type') &&\n container.getAttribute('data-type') === nodeType\n ) &&\n !container.classList.contains(nodeType)\n ) {\n container = container.parentElement;\n }\n\n return container;\n}\n","import { isTextSelection } from '@tiptap/core';\nimport { Editor } from '@tiptap/react';\n\nexport function isTextSelected(editor: Editor) {\n const {\n state: {\n doc,\n selection,\n selection: { empty, from, to },\n },\n } = editor;\n\n // Sometime check for `empty` is not enough.\n // Doubleclick an empty paragraph returns a node size of 2.\n // So we check also for an empty text size.\n const isEmptyTextBlock =\n !doc.textBetween(from, to).length && isTextSelection(selection);\n\n if (empty || isEmptyTextBlock || !editor.isEditable) {\n return false;\n }\n\n return true;\n}\n","import { Editor } from '@tiptap/react';\nimport { Fragment, Node } from '@tiptap/pm/model';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { v4 as uuid } from 'uuid';\nimport { findParentNode } from '@tiptap/core';\nimport { DEFAULT_COLUMN_WIDTH } from '../nodes/columns/column';\n\nexport function getColumnCount(editor: Editor) {\n return getClosestNodeByName(editor, 'columns')?.node?.childCount || 0;\n}\n\nexport function getClosestNodeByName(editor: Editor, name: string) {\n const { state } = editor.view;\n return findParentNode((node) => node.type.name === name)(state.selection);\n}\n\nexport function addColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const calculatedWidth = +Number(100 / (columnsNode.childCount + 1)).toFixed(\n 2\n );\n const newColumn = state.schema.nodes.column.create(\n {\n width: calculatedWidth,\n columnId: uuid(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n columnsNode.content.forEach((child, _, index) => {\n if (\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId\n ) {\n activeColumnIndex = index;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n updatedContent.splice(activeColumnIndex + 1, 0, newColumn);\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, activeColumnIndex + 1)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function removeColumn(editor: Editor) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return;\n }\n\n const { node: activeColumnNode, pos: activeColumnNodePos = 0 } =\n getClosestNodeByName(editor, 'column') || {};\n if (!activeColumnNode) {\n return;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n // If there is only one column, remove the entire columns node\n if (columnsNode.childCount === 1) {\n const transaction = tr.delete(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize\n );\n dispatch(transaction);\n editor.view.focus();\n return;\n }\n\n const calculatedWidth = +Number(100 / (columnsNode.childCount - 1)).toFixed(\n 2\n );\n\n let updatedContent: Node[] = [];\n let activeColumnIndex = 0;\n let isRemoved = false;\n columnsNode.content.forEach((child, _, index) => {\n const isActiveColumn =\n child.eq(activeColumnNode) &&\n child?.attrs?.columnId === activeColumnNode?.attrs?.columnId;\n if (isActiveColumn && !isRemoved) {\n activeColumnIndex = index;\n isRemoved = true;\n return;\n }\n\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: calculatedWidth,\n },\n child.content\n )\n );\n });\n\n const isLastColumn = activeColumnIndex === columnsNode.childCount - 1;\n\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, isLastColumn ? activeColumnIndex - 1 : activeColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Calculate the position of the new column by adding the new column's position\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n editor.view.focus();\n}\n\nexport function goToColumn(editor: Editor, type: 'next' | 'previous') {\n const columnsNode = getClosestNodeByName(editor, 'columns');\n const columnNode = getClosestNodeByName(editor, 'column');\n if (!columnsNode || !columnNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n // Get the current columns node position and add the columns size\n // to the end of the columns node\n const cols = columnsNode.node;\n let currColumnIndex = 0;\n cols.content.forEach((child, _, index) => {\n if (\n child.eq(columnNode.node) &&\n child?.attrs?.columnId === columnNode.node?.attrs?.columnId\n ) {\n currColumnIndex = index;\n }\n });\n\n const nextColumnIndex =\n type === 'next' ? currColumnIndex + 1 : currColumnIndex - 1;\n // if the next column index is out of bounds, return\n if (nextColumnIndex < 0 || nextColumnIndex >= cols.childCount) {\n return false;\n }\n\n let nextColumnPos = columnsNode.pos;\n cols.content.forEach((child, _, index) => {\n if (index < nextColumnIndex) {\n nextColumnPos += child.nodeSize;\n }\n });\n\n const tr = state.tr.setTime(Date.now());\n const textSelection = TextSelection.near(tr.doc.resolve(nextColumnPos));\n tr.setSelection(textSelection);\n\n dispatch(tr);\n return true;\n}\n\nexport function updateColumnWidth(\n editor: Editor,\n index: number,\n width: string = 'auto'\n) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(\n child.type.create(\n {\n ...child?.attrs,\n width: i === index ? width : child?.attrs?.width,\n },\n child.content\n )\n );\n });\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n dispatch(transaction);\n return true;\n}\n\nexport function addColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n // If the index is out of bounds, append the column to the end\n // of the columns node\n const columnIndex = index < 0 ? columnsNode.childCount : index;\n // Keep the original width of the columns\n // and set the new column width to auto\n const { state } = editor.view;\n const newColumn = state.schema.nodes.column.create(\n {\n width: DEFAULT_COLUMN_WIDTH,\n columnId: uuid(),\n },\n state.schema.nodes.paragraph.create(null)\n );\n\n // append the new column to the columns node\n // at the specified index\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n updatedContent.push(child);\n if (i === columnIndex) {\n updatedContent.push(newColumn);\n }\n });\n\n if (index === -1) {\n updatedContent.push(newColumn);\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = state.tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the new column\n // if the index is out of bounds, set the selection\n // to the last column\n const newColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, columnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(newColumnPos)\n );\n transaction.setSelection(textSelection);\n\n editor.view.dispatch(transaction);\n return true;\n}\n\nexport function removeColumnByIndex(editor: Editor, index: number = -1) {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n const updatedContent: Node[] = [];\n columnsNode.content.forEach((child, _, i) => {\n if (i !== index) {\n updatedContent.push(child);\n }\n });\n\n if (index === -1) {\n updatedContent.pop();\n }\n\n const updatedColumnsNode = columnsNode.copy(Fragment.from(updatedContent));\n const transaction = tr.replaceWith(\n columnsNodePos,\n columnsNodePos + columnsNode.nodeSize,\n updatedColumnsNode\n );\n\n // Set the selection to the next column\n // if the index is out of bounds, set the selection\n // to the last column\n const nextColumnIndex =\n index === columnsNode.childCount - 1 ? index - 1 : index;\n const nextColumnPos =\n columnsNodePos +\n updatedContent\n .slice(0, nextColumnIndex)\n .reduce((acc, node) => acc + node.nodeSize, 0);\n\n const textSelection = TextSelection.near(\n transaction.doc.resolve(nextColumnPos)\n );\n transaction.setSelection(textSelection);\n\n dispatch(transaction);\n return true;\n}\n\nexport function getColumnWidths(editor: Editor): {\n id: string;\n width: string;\n}[] {\n const { node: columnsNode, pos: columnsNodePos = 0 } =\n getClosestNodeByName(editor, 'columns') || {};\n if (!columnsNode) {\n return [];\n }\n\n const columnsWidth: { id: string; width: string }[] = [];\n columnsNode.content.forEach((child) => {\n const { columnId, width } = child.attrs;\n columnsWidth.push({ id: columnId, width });\n });\n\n return columnsWidth;\n}\n","import { Command } from '@tiptap/core';\n\nexport function updateAttribute(\n type: string,\n attr: string,\n value: any\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n tr.setNodeAttribute(lastPos, attr, value);\n }\n }\n\n return true;\n });\n}\n\nexport function updateAttributes(\n type: string,\n attrs: Record<string, any>\n): Command {\n return ({ commands }) =>\n commands.command(({ tr, state, dispatch }) => {\n if (dispatch) {\n let lastPos = null;\n\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(\n range.$from.pos,\n range.$to.pos,\n (node, pos) => {\n if (node.type.name === type) {\n lastPos = pos;\n }\n }\n );\n });\n\n if (lastPos !== null) {\n const node = state.doc.nodeAt(lastPos);\n if (node) {\n tr.setNodeMarkup(lastPos, null, {\n ...node.attrs,\n ...attrs,\n });\n } else {\n for (const [key, value] of Object.entries(attrs)) {\n tr.setNodeAttribute(lastPos, key, value);\n }\n }\n }\n\n if (type === 'button') {\n tr.setSelection(tr.selection);\n }\n }\n\n return true;\n });\n}\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { Node, mergeAttributes } from '@tiptap/core';\nimport { v4 as uuid } from 'uuid';\n\nexport const DEFAULT_COLUMN_WIDTH = 'auto';\n\nexport type AllowedColumnVerticalAlign = 'top' | 'middle' | 'bottom';\nexport const DEFAULT_COLUMN_VERTICAL_ALIGN: AllowedColumnVerticalAlign = 'top';\n\ninterface ColumnAttributes {\n verticalAlign: AllowedColumnVerticalAlign;\n backgroundColor: string;\n borderRadius: number;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n column: {\n updateColumn: (attrs: Partial<ColumnAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnExtension = Node.create({\n name: 'column',\n content: 'block+',\n isolating: true,\n\n addAttributes() {\n return {\n columnId: {\n default: null,\n parseHTML: (element) =>\n element.getAttribute('data-column-id') || uuid(),\n renderHTML: (attributes) => {\n if (!attributes.columnId) {\n return {\n 'data-column-id': uuid(),\n };\n }\n\n return {\n 'data-column-id': attributes.columnId,\n };\n },\n },\n width: {\n default: DEFAULT_COLUMN_WIDTH,\n parseHTML: (element) =>\n element.style.width.replace(/['\"]+/g, '') || DEFAULT_COLUMN_WIDTH,\n renderHTML: (attributes) => {\n if (!attributes.width || attributes.width === DEFAULT_COLUMN_WIDTH) {\n return {};\n }\n\n return {\n style: `width: ${attributes.width}%;max-width:${attributes.width}%`,\n };\n },\n },\n verticalAlign: {\n default: DEFAULT_COLUMN_VERTICAL_ALIGN,\n parseHTML: (element) => element?.style?.verticalAlign || 'top',\n renderHTML: (attributes) => {\n const { verticalAlign } = attributes;\n if (\n !verticalAlign ||\n verticalAlign === DEFAULT_COLUMN_VERTICAL_ALIGN\n ) {\n return {};\n }\n\n if (verticalAlign === 'middle') {\n return {\n style: `display: flex;flex-direction: column;justify-content: center;`,\n };\n } else if (verticalAlign === 'bottom') {\n return {\n style: `display: flex;flex-direction: column;justify-content: flex-end;`,\n };\n }\n },\n },\n };\n },\n\n addCommands() {\n return {\n updateColumn: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'column',\n class: 'hide-scrollbars',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"column\"]',\n },\n ];\n },\n});\n","import { getColumnCount, getColumnWidths } from '@/editor/utils/columns';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useColumnsState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n isSectionActive: ctx.editor.isActive('section'),\n isColumnActive: ctx.editor.isActive('column'),\n\n currentVerticalAlignment:\n ctx.editor.getAttributes('column')?.verticalAlign || 'top',\n\n currentShowIfKey: ctx.editor.getAttributes('columns')?.showIfKey || '',\n\n columnsCount: getColumnCount(ctx.editor),\n columnWidths: getColumnWidths(ctx.editor).map((c) => c.width),\n\n currentColumnsGap: ctx.editor.getAttributes('columns')?.gap || 0,\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst twMerge = extendTailwindMerge({\n prefix: 'mly-',\n});\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@/editor/utils/classname';\n\ntype Props = {\n type?: 'horizontal' | 'vertical';\n className?: string;\n};\n\nexport function Divider(props: Props) {\n const { type = 'vertical', className } = props;\n\n return (\n <div\n className={cn(\n 'mly-shrink-0 mly-bg-gray-200',\n type === 'vertical' ? 'mly-mx-0.5 mly-w-px' : 'mly-my-0.5 mly-h-px',\n className\n )}\n />\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '@/editor/utils/classname';\n\n// Explicit type annotations to avoid TS2742 errors\nconst TooltipProvider: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>\n> = TooltipPrimitive.Provider;\n\nconst Tooltip: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>\n> = TooltipPrimitive.Root;\n\nconst TooltipTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>\n> = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'mly-z-50 mly-overflow-hidden mly-rounded-md mly-border mly-bg-white mly-px-2 mly-py-1 mly-text-xs mly-animate-in mly-fade-in-0 mly-zoom-in-95',\n className\n )}\n {...props}\n />\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n>;\n\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import {\n AlignVerticalDistributeCenter,\n AlignVerticalDistributeEnd,\n AlignVerticalDistributeStart,\n} from 'lucide-react';\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { AllowedColumnVerticalAlign } from '../nodes/columns/column';\n\ntype VerticalAlignmentSwitchProps = {\n alignment: AllowedColumnVerticalAlign;\n onAlignmentChange: (alignment: AllowedColumnVerticalAlign) => void;\n};\n\nexport function VerticalAlignmentSwitch(props: VerticalAlignmentSwitchProps) {\n const { alignment = 'top', onAlignmentChange } = props;\n\n const activeAlignment = {\n top: {\n icon: AlignVerticalDistributeStart,\n tooltip: 'Align Top',\n onClick: () => {\n onAlignmentChange('middle');\n },\n },\n middle: {\n icon: AlignVerticalDistributeCenter,\n tooltip: 'Align Center',\n onClick: () => {\n onAlignmentChange('bottom');\n },\n },\n bottom: {\n icon: AlignVerticalDistributeEnd,\n tooltip: 'Align Bottom',\n onClick: () => {\n onAlignmentChange('top');\n },\n },\n }[alignment];\n\n return (\n <BubbleMenuButton\n icon={activeAlignment.icon}\n tooltip={activeAlignment.tooltip}\n command={activeAlignment.onClick}\n />\n );\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../utils/classname';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?:\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'\n | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst BaseButton = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : 'button';\n const baseClass =\n 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 focus-visible:mly-relative focus-visible:mly-z-10 disabled:mly-opacity-50 ';\n const variantClasses = {\n default: 'mly-bg-gray-900 mly-text-gray-50 hover:mly-bg-soft-gray',\n destructive: 'mly-bg-red-500 mly-text-gray-50 hover:mly-bg-red-500/90',\n outline:\n 'mly-border mly-border-gray-200 mly-bg-white hover:mly-bg-gray-100 hover:mly-text-gray-900',\n secondary: 'mly-bg-gray-100 mly-text-gray-900 hover:mly-bg-gray-100/80',\n ghost:\n 'hover:mly-bg-soft-gray bg-transparent hover:mly-text-gray-900 data-[state=true]:mly-bg-soft-gray data-[state=true]:mly-text-gray-900',\n link: 'mly-text-gray-900 mly-underline-offset-4 hover:mly-underline',\n };\n const sizeClasses = {\n default: 'mly-h-10 mly-px-4 mly-py-2',\n sm: 'mly-h-9 mly-rounded-md mly-px-3',\n lg: 'mly-h-11 mly-rounded-md mly-px-8',\n icon: 'mly-h-10 mly-w-10',\n };\n\n const classes = cn(\n 'mly-editor',\n baseClass,\n variantClasses[variant],\n sizeClasses[size],\n className\n );\n\n return <Comp className={classes} ref={ref} {...props} />;\n }\n);\n\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\n","import { BaseButton } from '@/editor/components/base-button';\nimport { cn } from '@/editor/utils/classname';\nimport { BubbleMenuItem } from './text-menu/text-bubble-menu';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\nexport function BubbleMenuButton(item: BubbleMenuItem) {\n const { tooltip } = item;\n\n const content = (\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n {...(item.command ? { onClick: item.command } : {})}\n data-state={item?.isActive?.()}\n className={cn(\n '!mly-size-7 mly-px-2.5 disabled:mly-cursor-not-allowed',\n item?.className\n )}\n type=\"button\"\n disabled={item.disbabled}\n >\n {item.icon ? (\n <item.icon\n className={cn(\n 'mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]',\n item?.iconClassName\n )}\n />\n ) : (\n <span\n className={cn(\n 'mly-text-sm mly-font-medium mly-text-slate-600',\n item?.nameClassName\n )}\n >\n {item.name}\n </span>\n )}\n </BaseButton>\n );\n\n if (tooltip) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n }\n\n return content;\n}\n","import { Braces, ChevronUp, CornerDownLeft, Eye } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { useRef, useState } from 'react';\nimport { cn } from '../utils/classname';\nimport { useEffect } from 'react';\nimport { InputAutocomplete } from './ui/input-autocomplete';\nimport { DEFAULT_RENDER_VARIABLE_FUNCTION, useMailyContext } from '../provider';\nimport { useMemo } from 'react';\nimport { ForExtension } from '../nodes/for/for';\nimport { memo } from 'react';\nimport { getClosestNodeByName } from '../utils/columns';\nimport { Editor } from '@tiptap/core';\nimport { processVariables } from '../utils/variable';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\ntype ShowPopoverProps = {\n showIfKey?: string;\n onShowIfKeyValueChange?: (when: string) => void;\n\n editor: Editor;\n};\n\nfunction _ShowPopover(props: ShowPopoverProps) {\n const { showIfKey = '', onShowIfKeyValueChange, editor } = props;\n\n const { variables = [], renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n const [isUpdatingKey, setIsUpdatingKey] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const autoCompleteOptions = useMemo(() => {\n return processVariables(variables, {\n query: showIfKey || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, showIfKey, editor]);\n\n const isValidWhenKey = showIfKey || autoCompleteOptions.includes(showIfKey);\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (open) {\n return;\n }\n\n setIsUpdatingKey(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly-flex mly-items-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2',\n showIfKey &&\n 'mly-bg-rose-100 mly-text-rose-800 data-[state=open]:mly-bg-rose-100 hover:mly-bg-rose-100'\n )}\n >\n <Eye className=\"mly-h-4 mly-w-4 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Show block conditionally</TooltipContent>\n </Tooltip>\n <PopoverContent\n className=\"mly-flex mly-w-max mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"end\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <span className=\"mly-flex mly-items-center mly-px-1.5 mly-text-sm mly-leading-none\">\n Show if\n </span>\n {!isUpdatingKey && (\n <button\n onClick={() => {\n setIsUpdatingKey(true);\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: showIfKey,\n valid: !!isValidWhenKey,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n {isUpdatingKey && (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setIsUpdatingKey(false);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setIsUpdatingKey(false);\n }\n }}\n >\n <InputAutocomplete\n value={showIfKey || ''}\n onValueChange={(value) => {\n onShowIfKeyValueChange?.(value);\n }}\n onOutsideClick={() => {\n setIsUpdatingKey(false);\n }}\n onSelectOption={(value) => {\n onShowIfKeyValueChange?.(value);\n setIsUpdatingKey(false);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={inputRef}\n />\n </form>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport const ShowPopover = memo(_ShowPopover);\n","'use client';\n\nimport * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\n\nimport { cn } from '../utils/classname';\n\nconst Popover: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>\n> = PopoverPrimitive.Root;\n\nconst PopoverTrigger: React.FC<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger>\n> = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'mly-z-[9999] mly-w-72 mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-p-4 mly-text-gray-950 mly-shadow-md mly-outline-none',\n 'mly-editor',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n)) as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> &\n React.RefAttributes<React.ElementRef<typeof PopoverPrimitive.Content>>\n>;\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import { Variable } from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n Braces,\n CornerDownLeftIcon,\n} from 'lucide-react';\nimport {\n useImperativeHandle,\n forwardRef,\n useState,\n useEffect,\n useRef,\n} from 'react';\n\ntype VariablePopoverProps = {\n items: Variable[];\n onSelectItem: (item: Variable) => void;\n};\n\nexport type VariablePopoverRef = {\n moveUp: () => void;\n moveDown: () => void;\n select: () => void;\n};\n\nexport const VariablePopover = forwardRef<\n VariablePopoverRef,\n VariablePopoverProps\n>((props, ref) => {\n const { items, onSelectItem } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const scrollSelectedIntoView = (index: number) => {\n const container = scrollContainerRef.current;\n const selectedItem = itemRefs.current[index];\n\n if (!container || !selectedItem) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const itemRect = selectedItem.getBoundingClientRect();\n\n const padding = 4;\n if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom + padding;\n } else if (itemRect.top < containerRect.top) {\n container.scrollTop += itemRect.top - containerRect.top - padding;\n }\n };\n\n useEffect(() => {\n setSelectedIndex(0);\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n itemRefs.current = items.map(() => null);\n }, [items]);\n\n useEffect(() => {\n scrollSelectedIntoView(selectedIndex);\n }, [selectedIndex]);\n\n useImperativeHandle(ref, () => ({\n moveUp: () => {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n },\n moveDown: () => {\n setSelectedIndex((selectedIndex + 1) % items.length);\n },\n select: () => {\n const item = items[selectedIndex];\n if (!item) {\n return;\n }\n\n onSelectItem(item);\n },\n }));\n\n return (\n <div className=\"mly-z-50 mly-w-64 mly-rounded-lg mly-border mly-border-gray-200 mly-bg-white mly-shadow-md mly-transition-all\">\n <div className=\"mly-flex mly-items-center mly-justify-between mly-gap-2 mly-border-b mly-border-gray-200 mly-bg-soft-gray/40 mly-px-1 mly-py-1.5 mly-text-gray-500\">\n <span className=\"mly-text-xs mly-uppercase\">Variables</span>\n <VariableIcon>\n <Braces className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n </div>\n\n <div\n ref={scrollContainerRef}\n className=\"mly-max-h-52 mly-overflow-y-auto mly-scrollbar-thin mly-scrollbar-track-transparent mly-scrollbar-thumb-gray-200\"\n >\n <div className=\"mly-flex mly-w-fit mly-min-w-full mly-flex-col mly-gap-0.5 mly-p-1\">\n {items?.length ? (\n items?.map((item, index: number) => (\n <button\n key={index}\n ref={(el) => (itemRefs.current[index] = el)}\n onClick={() => onSelectItem(item)}\n className={cn(\n 'mly-flex mly-w-fit mly-min-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-font-mono mly-text-sm mly-text-gray-900 hover:mly-bg-soft-gray',\n index === selectedIndex ? 'mly-bg-soft-gray' : 'mly-bg-white'\n )}\n >\n <Braces className=\"mly-size-3 mly-stroke-[2.5] mly-text-rose-600\" />\n {item.name}\n </button>\n ))\n ) : (\n <div className=\"mly-flex mly-h-7 mly-w-full mly-items-center mly-gap-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-font-mono mly-text-[13px] mly-text-gray-900 hover:mly-bg-soft-gray\">\n No result\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mly-flex mly-items-center mly-justify-between mly-gap-2 mly-border-t mly-border-gray-200 mly-px-1 mly-py-1.5 mly-text-gray-500\">\n <div className=\"mly-flex mly-items-center mly-gap-1\">\n <VariableIcon>\n <ArrowDownIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n <VariableIcon>\n <ArrowUpIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n <span className=\"mly-text-xs mly-text-gray-500\">Navigate</span>\n </div>\n <VariableIcon>\n <CornerDownLeftIcon className=\"mly-size-3 mly-stroke-[2.5]\" />\n </VariableIcon>\n </div>\n </div>\n );\n});\n\ntype VariableIconProps = {\n className?: string;\n children: React.ReactNode;\n};\n\nfunction VariableIcon(props: VariableIconProps) {\n const { className, children } = props;\n\n return (\n <div\n className={cn(\n 'mly-flex mly-size-5 mly-items-center mly-justify-center mly-rounded-md mly-border',\n className\n )}\n >\n {children}\n </div>\n );\n}\n","export const AUTOCOMPLETE_PASSWORD_MANAGERS_OFF = Object.freeze({\n autoComplete: 'off',\n 'data-1p-ignore': true,\n 'data-form-type': 'other',\n});\n","import { useCallback } from 'react';\nimport { useEffect } from 'react';\nimport { RefObject } from 'react';\n\nexport function useOutsideClick(\n ref: RefObject<HTMLElement>,\n callback: () => void\n) {\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n callback();\n }\n },\n [ref, callback]\n );\n\n useEffect(() => {\n document.addEventListener('mousedown', handleClick);\n document.addEventListener('touchstart', handleClick);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n document.removeEventListener('touchstart', handleClick);\n };\n }, [handleClick]);\n}\n","import {\n VariablePopover,\n VariablePopoverRef,\n} from '@/editor/nodes/variable/variable-popover';\nimport { useMailyContext } from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { useOutsideClick } from '@/editor/utils/use-outside-click';\nimport { CornerDownLeft } from 'lucide-react';\nimport { forwardRef, HTMLAttributes, useMemo, useState, useRef } from 'react';\n\ntype InputAutocompleteProps = HTMLAttributes<HTMLInputElement> & {\n value: string;\n onValueChange: (value: string) => void;\n\n autoCompleteOptions?: string[];\n onSelectOption?: (option: string) => void;\n\n onOutsideClick?: () => void;\n triggerChar?: string;\n placeholder?: string;\n};\n\nexport const InputAutocomplete = forwardRef<\n HTMLInputElement,\n InputAutocompleteProps\n>((props, ref) => {\n const {\n value = '',\n onValueChange,\n className,\n onOutsideClick,\n onSelectOption,\n autoCompleteOptions = [],\n triggerChar = '',\n ...inputProps\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<VariablePopoverRef>(null);\n\n useOutsideClick(containerRef, () => {\n onOutsideClick?.();\n });\n\n const isTriggeringVariable = value.startsWith(triggerChar);\n\n return (\n <div className={cn('mly-relative')} ref={containerRef}>\n <label className=\"mly-relative\">\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n placeholder=\"e.g. items\"\n type=\"text\"\n {...inputProps}\n ref={ref}\n value={value}\n onChange={(e) => {\n onValueChange(e.target.value);\n }}\n className={cn(\n 'mly-h-7 mly-w-40 mly-rounded-md mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray hover:mly-bg-soft-gray focus:mly-bg-soft-gray focus:mly-outline-none',\n className\n )}\n onKeyDown={(e) => {\n if (!popoverRef.current || !isTriggeringVariable) {\n return;\n }\n const { moveUp, moveDown, select } = popoverRef.current;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n moveDown();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n moveUp();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n select();\n }\n }}\n spellCheck={false}\n />\n <div className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center\">\n <CornerDownLeft className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n </label>\n\n {isTriggeringVariable && (\n <div className=\"mly-absolute mly-left-0 mly-top-8\">\n <VariablePopover\n items={autoCompleteOptions.map((option) => {\n return {\n name: option,\n };\n })}\n onSelectItem={(item) => {\n onSelectOption?.(item.name);\n }}\n ref={popoverRef}\n />\n </div>\n )}\n </div>\n );\n});\n\nInputAutocomplete.displayName = 'InputAutocomplete';\n","'use client';\n\nimport { BlockItem } from '@/blocks/types';\nimport { createContext, PropsWithChildren, useContext } from 'react';\nimport { DEFAULT_SLASH_COMMANDS } from './extensions/slash-command/default-slash-commands';\nimport { Editor } from '@tiptap/core';\nimport { DefaultRenderVariable } from './nodes/variable/variable-view';\n\nexport type Variable = {\n name: string;\n // Default is true\n required?: boolean;\n // default is true\n valid?: boolean;\n};\n\nexport type VariableFunctionOptions = {\n query: string;\n from: 'content-variable' | 'bubble-variable' | 'for-variable';\n editor: Editor;\n};\n\nexport type VariablesFunction = (\n opts: VariableFunctionOptions\n) => Array<Variable>;\n\nexport type Variables = Array<Variable> | VariablesFunction;\n\nexport type RenderVariableOptions = {\n variable: Variable;\n fallback?: string;\n editor: Editor;\n from: 'content-variable' | 'bubble-variable' | 'button-variable';\n};\n\nexport type RenderVariableFunction = (\n opts: RenderVariableOptions\n) => JSX.Element | null;\n\nexport const DEFAULT_VARIABLE_TRIGGER_CHAR = '@';\nexport const DEFAULT_VARIABLES: Variables = [];\nexport const DEFAULT_RENDER_VARIABLE_FUNCTION: RenderVariableFunction =\n DefaultRenderVariable;\n\nexport type MailyContextType = {\n variableTriggerCharacter?: string;\n variables?: Variables;\n blocks?: BlockItem[];\n renderVariable?: RenderVariableFunction;\n};\n\nexport const MailyContext = createContext<MailyContextType>({\n variableTriggerCharacter: DEFAULT_VARIABLE_TRIGGER_CHAR,\n variables: DEFAULT_VARIABLES,\n blocks: DEFAULT_SLASH_COMMANDS,\n renderVariable: DEFAULT_RENDER_VARIABLE_FUNCTION,\n});\n\ntype MailyProviderProps = PropsWithChildren<MailyContextType>;\n\nexport function MailyProvider(props: MailyProviderProps) {\n const { children, ...defaultValues } = props;\n\n if (defaultValues.variableTriggerCharacter === '') {\n throw new Error('variableTriggerCharacter cannot be an empty string');\n }\n\n return (\n <MailyContext.Provider value={defaultValues}>\n {children}\n </MailyContext.Provider>\n );\n}\n\nexport function useMailyContext() {\n const values = useContext(MailyContext);\n if (!values) {\n throw new Error('Missing MailyContext.Provider in the component tree');\n }\n\n return values;\n}\n","import type { BlockItem } from './types';\nimport { MousePointer, ArrowUpRightSquare } from 'lucide-react';\n\nexport const button: BlockItem = {\n title: 'Button',\n description: 'Add a call to action button to email.',\n searchTerms: ['link', 'button', 'cta'],\n icon: <MousePointer className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setButton().run();\n },\n};\n\nexport const linkCard: BlockItem = {\n title: 'Link Card',\n description: 'Add a link card to email.',\n searchTerms: ['link', 'button', 'image'],\n icon: <ArrowUpRightSquare className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLinkCard().run();\n },\n};\n","import type { BlockItem } from './types';\nimport { ImageIcon } from 'lucide-react';\n\nexport const image: BlockItem = {\n title: 'Image',\n description: 'Full width image',\n searchTerms: ['image'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setImage({ src: '' }).run();\n },\n};\n\nexport const logo: BlockItem = {\n title: 'Logo',\n description: 'Add your brand logo',\n searchTerms: ['image', 'logo'],\n icon: <ImageIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setLogoImage({ src: '' }).run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n ColumnsIcon,\n Repeat2,\n MoveVertical,\n RectangleHorizontal,\n Minus,\n} from 'lucide-react';\n\nexport const columns: BlockItem = {\n title: 'Columns',\n description: 'Add columns to email.',\n searchTerms: ['layout', 'columns'],\n icon: <ColumnsIcon className=\"mly-h-4 mly-w-4\" />,\n shouldBeHidden: (editor) => {\n return editor.isActive('columns');\n },\n command: ({ editor, range }) => {\n // @ts-ignore\n editor\n .chain()\n .focus()\n .deleteRange(range)\n // @ts-ignore\n .setColumns()\n .focus(editor.state.selection.head - 2)\n .run();\n },\n};\n\nexport const section: BlockItem = {\n title: 'Section',\n description: 'Add a section to email.',\n searchTerms: ['layout', 'section'],\n icon: <RectangleHorizontal className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSection().run();\n },\n};\n\nexport const forLoop: BlockItem = {\n title: 'For',\n description: 'Loop over an array of items.',\n searchTerms: ['for', 'loop'],\n icon: <Repeat2 className=\"mly-h-4 mly-w-4\" />,\n shouldBeHidden: (editor) => {\n return editor.isActive('for');\n },\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setFor().run();\n },\n};\n\nexport const spacer: BlockItem = {\n title: 'Spacer',\n description: 'Add space between blocks.',\n searchTerms: ['space', 'gap', 'divider'],\n icon: <MoveVertical className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setSpacer({ height: 'sm' }).run();\n },\n};\n\nexport const divider: BlockItem = {\n title: 'Divider',\n description: 'Add a horizontal divider.',\n searchTerms: ['divider', 'line'],\n icon: <Minus className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHorizontalRule().run();\n },\n};\n","import type { BlockItem } from './types';\nimport { List, ListOrdered } from 'lucide-react';\n\nexport const bulletList: BlockItem = {\n title: 'Bullet List',\n description: 'Create a simple bullet list.',\n searchTerms: ['unordered', 'point'],\n icon: <List className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n};\n\nexport const orderedList: BlockItem = {\n title: 'Numbered List',\n description: 'Create a list with numbering.',\n searchTerms: ['ordered'],\n icon: <ListOrdered className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n};\n","import type { BlockItem } from './types';\nimport {\n Text,\n Heading1,\n Heading2,\n Heading3,\n DivideIcon,\n TextQuote,\n FootprintsIcon,\n EraserIcon,\n} from 'lucide-react';\n\nexport const text: BlockItem = {\n title: 'Text',\n description: 'Just start typing with plain text.',\n searchTerms: ['p', 'paragraph'],\n icon: <Text className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n};\n\nexport const heading1: BlockItem = {\n title: 'Heading 1',\n description: 'Big heading.',\n searchTerms: ['title', 'big', 'large'],\n icon: <Heading1 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n};\n\nexport const heading2: BlockItem = {\n title: 'Heading 2',\n description: 'Medium heading.',\n searchTerms: ['subtitle', 'medium'],\n icon: <Heading2 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n};\n\nexport const heading3: BlockItem = {\n title: 'Heading 3',\n description: 'Small heading.',\n searchTerms: ['subtitle', 'small'],\n icon: <Heading3 className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n};\n\nexport const hardBreak: BlockItem = {\n title: 'Hard Break',\n description: 'Add a break between lines.',\n searchTerms: ['break', 'line'],\n icon: <DivideIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setHardBreak().run();\n },\n};\n\nexport const blockquote: BlockItem = {\n title: 'Blockquote',\n description: 'Add blockquote.',\n searchTerms: ['quote', 'blockquote'],\n icon: <TextQuote className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).toggleBlockquote().run();\n },\n};\n\nexport const footer: BlockItem = {\n title: 'Footer',\n description: 'Add a footer text to email.',\n searchTerms: ['footer', 'text'],\n icon: <FootprintsIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().deleteRange(range).setFooter().run();\n },\n};\n\nexport const clearLine: BlockItem = {\n title: 'Clear Line',\n description: 'Clear the current line.',\n searchTerms: ['clear', 'line'],\n icon: <EraserIcon className=\"mly-h-4 mly-w-4\" />,\n command: ({ editor, range }) => {\n // @ts-ignore\n editor.chain().focus().selectParentNode().deleteSelection().run();\n },\n};\n","import { button, linkCard } from '@/blocks/button';\nimport { image, logo } from '@/blocks/image';\nimport { columns, divider, forLoop, section, spacer } from '@/blocks/layout';\nimport { bulletList, orderedList } from '@/blocks/list';\nimport { BlockItem } from '@/blocks/types';\nimport {\n blockquote,\n clearLine,\n footer,\n hardBreak,\n heading1,\n heading2,\n heading3,\n text,\n} from '@/blocks/typography';\n\nexport const DEFAULT_SLASH_COMMANDS: BlockItem[] = [\n text,\n heading1,\n heading2,\n heading3,\n bulletList,\n orderedList,\n image,\n logo,\n columns,\n section,\n forLoop,\n divider,\n spacer,\n button,\n linkCard,\n hardBreak,\n blockquote,\n footer,\n clearLine,\n];\n","import {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n RenderVariableFunction,\n useMailyContext,\n} from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\nimport { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { AlertTriangle, Braces, Pencil } from 'lucide-react';\n\nexport function VariableView(props: NodeViewProps) {\n const { node, updateAttributes, editor } = props;\n const { id, fallback, required } = node.attrs;\n\n const { renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n\n return (\n <NodeViewWrapper\n className=\"react-component mly-inline-block mly-leading-none\"\n draggable=\"false\"\n >\n <Popover>\n <PopoverTrigger>\n {renderVariable({\n variable: { name: id, required: required, valid: true },\n fallback,\n editor,\n from: 'content-variable',\n })}\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch mly-text-midnight-gray\">\n <label className=\"mly-relative\">\n <span className=\"mly-inline-block mly-px-2 mly-text-xs mly-text-midnight-gray\">\n Variable\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={id ?? ''}\n onChange={(e) => {\n updateAttributes({\n id: e.target.value,\n });\n }}\n placeholder=\"ie. name...\"\n className=\"mly-h-7 mly-w-36 mly-rounded-md mly-bg-soft-gray mly-px-2 mly-text-sm mly-text-midnight-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n />\n </label>\n\n <Divider className=\"mly-mx-1.5\" />\n\n <label className=\"mly-relative\">\n <span className=\"mly-inline-block mly-px-2 mly-pl-1 mly-text-xs mly-text-midnight-gray\">\n Default\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n value={fallback ?? ''}\n onChange={(e) => {\n updateAttributes({\n fallback: e.target.value,\n });\n }}\n placeholder=\"ie. John Doe...\"\n className=\"mly-h-7 mly-w-32 mly-rounded-md mly-bg-soft-gray mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n />\n <div className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center\">\n <Pencil className=\"mly-h-3 mly-w-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </div>\n </label>\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\nexport const DefaultRenderVariable: RenderVariableFunction = (props) => {\n const { variable, fallback, from } = props;\n const { name, required, valid } = variable;\n\n if (from === 'button-variable') {\n return (\n <div className=\"mly-inline-grid mly-h-7 mly-max-w-xs mly-grid-cols-[12px_1fr] mly-items-center mly-gap-1.5 mly-rounded-md mly-border mly-border-[var(--button-var-border-color)] mly-px-2 mly-font-mono mly-text-sm\">\n <Braces className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n <span className=\"mly-min-w-0 mly-truncate mly-text-left\">{name}</span>\n </div>\n );\n }\n\n if (from === 'bubble-variable') {\n return (\n <div\n className={cn(\n 'mly-inline-grid mly-h-7 mly-min-w-28 mly-max-w-xs mly-grid-cols-[12px_1fr] mly-items-center mly-gap-1.5 mly-rounded-md mly-border mly-px-2 mly-font-mono mly-text-sm hover:mly-bg-soft-gray',\n !valid &&\n 'mly-border-rose-400 mly-bg-rose-50 mly-text-rose-600 hover:mly-bg-rose-100'\n )}\n >\n <Braces className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5] mly-text-rose-600\" />\n <span className=\"mly-min-w-0 mly-truncate mly-text-left\">{name}</span>\n </div>\n );\n }\n\n return (\n <span\n tabIndex={-1}\n className=\"mly-inline-flex mly-items-center mly-gap-[var(--variable-icon-gap)] mly-rounded-full mly-border mly-px-1.5 mly-py-0.5 mly-leading-none\"\n >\n <Braces className=\"mly-size-[var(--variable-icon-size)] mly-shrink-0 mly-stroke-[2.5] mly-text-rose-600\" />\n {name}\n {required && !fallback && (\n <AlertTriangle className=\"mly-size-[var(--variable-icon-size)] mly-shrink-0 mly-stroke-[2.5]\" />\n )}\n </span>\n );\n};\n","import { Variable, VariableFunctionOptions, Variables } from '../provider';\n\nexport function processVariables(\n variables: Variables,\n options: VariableFunctionOptions\n): Array<Variable> {\n const { query } = options;\n const queryLower = query.toLowerCase();\n\n let filteredVariables: Array<Variable> = [];\n if (Array.isArray(variables)) {\n filteredVariables = variables.filter((variable) =>\n variable.name.toLowerCase().startsWith(queryLower)\n );\n\n if (\n query.length > 0 &&\n !filteredVariables.some((variable) => variable.name === query)\n ) {\n filteredVariables.push({ name: query, required: true });\n }\n\n return filteredVariables;\n } else if (typeof variables === 'function') {\n return variables(options);\n } else {\n throw new Error(`Invalid variables type. Expected 'Array' or 'Function', but received '${typeof variables}'.\n\nYou can check out the documentation for more information: https://github.com/arikchakma/maily.to/blob/main/packages/core/readme.md`);\n }\n}\n","import { Columns2, SlidersVertical, Columns3 } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { cn } from '@/editor/utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\n\ntype ColumnsWidthConfigProps = {\n columnsCount: number;\n onColumnsCountChange: (columns: number) => void;\n\n columnWidths: string[];\n onColumnWidthChange?: (column: number, width: string) => void;\n};\n\nexport function ColumnsWidthConfig(props: ColumnsWidthConfigProps) {\n const {\n columnsCount = 2,\n onColumnsCountChange,\n columnWidths,\n onColumnWidthChange,\n } = props;\n\n return (\n <Popover>\n <PopoverTrigger className=\"mly-flex mly-size-7 mly-items-center mly-justify-center mly-gap-1 mly-rounded-md mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray\">\n <SlidersVertical className=\"mly-h-3 mly-w-3 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n <PopoverContent\n className=\"mly-w-[300px] mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"center\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-1\">\n <SwitchButton\n onClick={() => onColumnsCountChange(2)}\n isActive={columnsCount === 2}\n >\n <Columns2 className=\"mly-h-4 mly-w-4 mly-stroke-[2.5]\" />\n <span>2 Columns</span>\n </SwitchButton>\n <SwitchButton\n onClick={() => onColumnsCountChange(3)}\n isActive={columnsCount === 3}\n >\n <Columns3 className=\"mly-h-4 mly-w-4 mly-stroke-[2.5]\" />\n <span>3 Columns</span>\n </SwitchButton>\n </div>\n\n <hr className=\"mly-my-0.5 mly-border-gray-200\" />\n\n <div\n className=\"mly-grid mly-gap-1 mly-p-1\"\n style={{ gridTemplateColumns: `repeat(${columnsCount}, 1fr)` }}\n >\n {Array.from({ length: columnsCount }).map((_, index) => {\n const value =\n columnWidths[index] === 'auto' ? '' : columnWidths[index];\n const label =\n columnsCount === 2\n ? index === 0\n ? 'Left'\n : 'Right'\n : index === 0\n ? 'Left'\n : index === 1\n ? 'Middle'\n : 'Right';\n\n return (\n <div className=\"mly-flex mly-flex-col mly-gap-1\" key={index}>\n <span className=\"mly-text-xs mly-text-gray-400\">{label}</span>\n\n <label className=\"mly-relative\">\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n placeholder=\"auto\"\n min={1}\n max={90}\n type=\"number\"\n className=\"hide-number-controls mly-w-full mly-appearance-none mly-rounded-md mly-bg-soft-gray mly-px-1.5 mly-py-1 mly-pr-6 mly-text-sm mly-tabular-nums mly-outline-none focus:mly-bg-soft-gray focus:mly-outline-none focus:mly-ring-1 focus:mly-ring-midnight-gray/50\"\n value={value}\n onChange={(e) => {\n const value = e.target.value;\n onColumnWidthChange?.(index, value);\n }}\n />\n <span className=\"mly-absolute mly-inset-y-0 mly-right-0 mly-flex mly-aspect-square mly-items-center mly-justify-center mly-text-xs mly-tabular-nums mly-text-gray-500\">\n %\n </span>\n </label>\n </div>\n );\n })}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype SwitchButtonProps = {\n isActive?: boolean;\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nfunction SwitchButton(props: SwitchButtonProps) {\n const { onClick, isActive = false, children } = props;\n\n return (\n <button\n className={cn(\n 'mly-flex mly-h-7 mly-items-center mly-gap-1 mly-rounded-md mly-px-2 mly-text-sm mly-text-gray-500 hover:mly-bg-soft-gray hover:mly-text-midnight-gray',\n isActive && 'mly-bg-soft-gray mly-text-midnight-gray'\n )}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n","import { useId } from 'react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ChevronDownIcon, LucideIcon } from 'lucide-react';\nimport { SVGIcon } from '../icons/grid-lines';\n\ntype SelectProps = {\n label: string;\n options: {\n value: string;\n label: string;\n }[];\n\n value: string;\n onValueChange: (value: string) => void;\n\n tooltip?: string;\n className?: string;\n\n icon?: LucideIcon | SVGIcon;\n iconClassName?: string;\n};\n\nexport function Select(props: SelectProps) {\n const {\n label,\n options,\n value,\n onValueChange,\n tooltip,\n className,\n icon: Icon,\n iconClassName,\n } = props;\n\n const selectId = `mly${useId()}`;\n\n const content = (\n <div className=\"relative\">\n <label htmlFor={selectId} className=\"sr-only\">\n {label}\n </label>\n\n {Icon && (\n <div className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-left-2 mly-z-20 mly-flex mly-items-center\">\n <Icon className={cn('mly-size-3', iconClassName)} />\n </div>\n )}\n\n <select\n id={selectId}\n className={cn(\n 'mly-flex mly-min-h-7 mly-max-w-max mly-appearance-none mly-items-center mly-rounded-md mly-px-1.5 mly-py-0.5 mly-pr-7 mly-text-sm mly-text-midnight-gray mly-ring-offset-white mly-transition-colors hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 active:mly-bg-soft-gray',\n !!Icon && 'mly-pl-7',\n className\n )}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n\n <span className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-right-0 mly-z-10 mly-flex mly-h-full mly-w-7 mly-items-center mly-justify-center mly-text-gray-600 peer-disabled:mly-opacity-50\">\n <ChevronDownIcon\n size={16}\n strokeWidth={2}\n aria-hidden=\"true\"\n role=\"img\"\n />\n </span>\n </div>\n );\n\n if (!tooltip) {\n return content;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n","import { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { useColumnsState } from './use-columns-state';\nimport { Divider } from '../ui/divider';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { VerticalAlignmentSwitch } from '../vertical-alignment-switch';\nimport {\n addColumnByIndex,\n removeColumnByIndex,\n updateColumnWidth,\n} from '@/editor/utils/columns';\nimport { ShowPopover } from '../show-popover';\nimport { ColumnsWidthConfig } from './columns-width-config';\nimport { Select } from '../ui/select';\nimport { Space, Trash } from 'lucide-react';\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { deleteNode } from '@/editor/utils/delete-node';\n\ntype ColumnsBubbleMenuProps = {\n editor: EditorBubbleMenuProps['editor'];\n};\n\nexport function ColumnsBubbleMenuContent(props: ColumnsBubbleMenuProps) {\n const { editor } = props;\n if (!editor) {\n return null;\n }\n\n const state = useColumnsState(editor);\n\n const currentColumnCount = state.columnsCount;\n\n return (\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch\">\n {state.isColumnActive && (\n <>\n <ColumnsWidthConfig\n columnsCount={currentColumnCount}\n columnWidths={state.columnWidths}\n onColumnsCountChange={(count) => {\n if (count > currentColumnCount) {\n addColumnByIndex(editor);\n } else {\n removeColumnByIndex(editor);\n }\n }}\n onColumnWidthChange={(index, width) => {\n updateColumnWidth(editor, index, width);\n }}\n />\n\n <Divider />\n </>\n )}\n\n <VerticalAlignmentSwitch\n alignment={state.currentVerticalAlignment}\n onAlignmentChange={(value) => {\n editor.commands.updateColumn({\n verticalAlign: value,\n });\n }}\n />\n\n <Divider />\n\n <Select\n icon={Space}\n label=\"Columns Gap\"\n value={state.currentColumnsGap}\n options={[\n { value: '0', label: 'None' },\n { value: '4', label: 'Small' },\n { value: '8', label: 'Medium' },\n { value: '16', label: 'Large' },\n { value: '24', label: 'Extra Large' },\n ]}\n onValueChange={(value) => {\n editor.commands.updateColumns({\n gap: +value,\n });\n }}\n tooltip=\"Columns Gap\"\n />\n\n <Divider />\n\n <BubbleMenuButton\n icon={Trash}\n tooltip=\"Delete Columns\"\n command={() => {\n deleteNode(editor, 'columns');\n }}\n />\n\n <Divider />\n\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.updateColumns({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </div>\n </TooltipProvider>\n );\n}\n","import { findParentNode, type Editor } from '@tiptap/core';\n\nexport function deleteNode(editor: Editor, nodeType: string) {\n const { state } = editor.view;\n const associatedNode = findParentNode((node) => node.type.name === nodeType)(\n state.selection\n );\n\n if (!associatedNode) {\n return;\n }\n\n const from = associatedNode.pos;\n const to = from + associatedNode.node.nodeSize;\n\n const { tr } = state;\n const transaction = tr.delete(from, to);\n editor.view.dispatch(transaction);\n}\n","import type { Editor } from '@tiptap/core';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { NodeSelection } from '@tiptap/pm/state';\n\nimport type { Node } from '@tiptap/pm/model';\nimport { Copy, GripVertical, Plus, Trash2 } from 'lucide-react';\nimport { BaseButton } from './base-button';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './ui/tooltip';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { Divider } from './ui/divider';\nimport { DragHandle } from '../plugins/drag-handle/drag-handle';\n\nexport type ContentMenuProps = {\n editor: Editor;\n};\n\nexport function ContentMenu(props: ContentMenuProps) {\n const { editor } = props;\n\n const [menuOpen, setMenuOpen] = useState(false);\n const [currentNode, setCurrentNode] = useState<Node | null>(null);\n const [currentNodePos, setCurrentNodePos] = useState<number>(-1);\n\n const handleNodeChange = useCallback(\n (data: { node: Node | null; editor: Editor; pos: number }) => {\n if (data.node) {\n setCurrentNode(data.node);\n }\n\n setCurrentNodePos(data.pos);\n },\n [setCurrentNodePos, setCurrentNode]\n );\n\n function duplicateNode() {\n editor.commands.setNodeSelection(currentNodePos);\n const { $anchor } = editor.state.selection;\n const selectedNode =\n $anchor.node(1) || (editor.state.selection as NodeSelection).node;\n editor\n .chain()\n .setMeta('hideDragHandle', true)\n .insertContentAt(\n currentNodePos + (currentNode?.nodeSize || 0),\n selectedNode.toJSON()\n )\n .run();\n\n setMenuOpen(false);\n }\n\n function deleteCurrentNode() {\n editor\n .chain()\n .setMeta('hideDragHandle', true)\n .setNodeSelection(currentNodePos)\n .deleteSelection()\n .run();\n\n setMenuOpen(false);\n }\n\n function handleAddNewNode() {\n if (currentNodePos !== -1) {\n const currentNodeSize = currentNode?.nodeSize || 0;\n const insertPos = currentNodePos + currentNodeSize;\n const currentNodeIsEmptyParagraph =\n currentNode?.type.name === 'paragraph' &&\n currentNode?.content?.size === 0;\n const focusPos = currentNodeIsEmptyParagraph\n ? currentNodePos + 2\n : insertPos + 2;\n editor\n .chain()\n .command(({ dispatch, tr, state }: any) => {\n if (dispatch) {\n if (currentNodeIsEmptyParagraph) {\n tr.insertText('/', currentNodePos, currentNodePos + 1);\n } else {\n tr.insert(\n insertPos,\n state.schema.nodes.paragraph.create(null, [\n state.schema.text('/'),\n ])\n );\n }\n\n return dispatch(tr);\n }\n\n return true;\n })\n .focus(focusPos)\n .run();\n }\n }\n\n useEffect(() => {\n if (menuOpen) {\n editor.commands.setMeta('lockDragHandle', true);\n } else {\n editor.commands.setMeta('lockDragHandle', false);\n }\n\n return () => {\n editor.commands.setMeta('lockDragHandle', false);\n };\n }, [editor, menuOpen]);\n\n return (\n <DragHandle\n pluginKey=\"ContentMenu\"\n editor={editor}\n tippyOptions={{\n offset: [2, 0],\n zIndex: 99,\n }}\n onNodeChange={handleNodeChange}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-center mly-pr-1.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"!mly-size-5 mly-cursor-grab mly-text-gray-500 hover:mly-text-black\"\n onClick={handleAddNewNode}\n type=\"button\"\n >\n <Plus className=\"mly-size-3.5 mly-shrink-0\" />\n </BaseButton>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Add new node</TooltipContent>\n </Tooltip>\n <Popover open={menuOpen} onOpenChange={setMenuOpen}>\n <div className=\"mly-relative mly-flex mly-flex-col\">\n <Tooltip>\n <TooltipTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"mly-relative mly-z-[1] !mly-size-5 mly-cursor-grab mly-text-gray-500 hover:mly-text-black\"\n onClick={(e) => {\n e.preventDefault();\n setMenuOpen(true);\n editor.commands.setNodeSelection(currentNodePos);\n }}\n type=\"button\"\n >\n <GripVertical className=\"mly-size-3.5 mly-shrink-0\" />\n </BaseButton>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Node actions</TooltipContent>\n </Tooltip>\n <PopoverTrigger className=\"mly-absolute mly-left-0 mly-top-0 mly-z-0 mly-h-5 mly-w-5\" />\n </div>\n\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={8}\n className=\"mly-flex mly-w-max mly-flex-col mly-rounded-md mly-p-1\"\n >\n <BaseButton\n variant=\"ghost\"\n onClick={duplicateNode}\n className=\"mly-h-auto mly-justify-start mly-gap-2 !mly-rounded mly-px-2 mly-py-1 mly-text-sm mly-font-normal\"\n >\n <Copy className=\"mly-size-[15px] mly-shrink-0\" />\n Duplicate\n </BaseButton>\n <Divider type=\"horizontal\" />\n <BaseButton\n onClick={deleteCurrentNode}\n className=\"mly-h-auto mly-justify-start mly-gap-2 !mly-rounded mly-bg-red-100 mly-px-2 mly-py-1 mly-text-sm mly-font-normal mly-text-red-600 hover:mly-bg-red-200 focus:mly-bg-red-200\"\n >\n <Trash2 className=\"mly-size-[15px] mly-shrink-0\" />\n Delete\n </BaseButton>\n </PopoverContent>\n </Popover>\n </div>\n </TooltipProvider>\n </DragHandle>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\n\nimport { Node } from '@tiptap/pm/model';\nimport { ReactNode } from 'react';\nimport { Editor } from '@tiptap/core';\nimport { Props as TippyProps } from 'tippy.js';\nimport {\n DragHandlePlugin,\n dragHandlePluginDefaultKey,\n} from './drag-handle-plugin';\n\nexport type DragHandleProps = {\n editor: Editor;\n pluginKey?: string;\n className?: string;\n tippyOptions?: Partial<TippyProps>;\n onNodeChange?: (data: {\n node: Node | null;\n editor: Editor;\n pos: number;\n }) => void;\n children: ReactNode;\n};\n\nexport function DragHandle(props: DragHandleProps) {\n const {\n className = 'drag-handle',\n children,\n editor,\n pluginKey = dragHandlePluginDefaultKey,\n onNodeChange,\n tippyOptions = {},\n } = props;\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n const pluginRef = useRef<ReturnType<typeof DragHandlePlugin> | null>(null);\n\n useEffect(() => {\n if (!element) {\n return () => {\n pluginRef.current = null;\n };\n }\n\n if (editor.isDestroyed) {\n return () => {\n pluginRef.current = null;\n };\n }\n\n if (!pluginRef.current) {\n pluginRef.current = DragHandlePlugin({\n editor,\n element,\n pluginKey,\n tippyOptions,\n onNodeChange,\n });\n\n editor.registerPlugin(pluginRef.current);\n }\n\n return () => {\n editor.unregisterPlugin(pluginKey);\n pluginRef.current = null;\n };\n }, [element, editor, onNodeChange, pluginKey]);\n\n return (\n <div className={className} ref={setElement}>\n {children}\n </div>\n );\n}\n","/**\n * This plugin is a modified version of the package\n * LINK: https://www.npmjs.com/package/echo-drag-handle-plugin.\n * The original package was not working as expected while migrating.\n *\n * I will be building a new version from scratch for the drag handle plugin\n * for better usability and compatibility for me.\n * Until then, I will be using this modified version.\n */\n\nimport {\n SelectionRange,\n Selection,\n PluginKey,\n Plugin,\n EditorState,\n} from '@tiptap/pm/state';\nimport tippy, { Instance, Tippy } from 'tippy.js';\nimport {\n ySyncPluginKey,\n absolutePositionToRelativePosition,\n} from 'y-prosemirror';\nimport { NodeRange } from '@tiptap/pm/model';\nimport { ResolvedPos, Node as TNode } from '@tiptap/pm/model';\nimport { Mapping } from '@tiptap/pm/transform';\nimport { Editor } from '@tiptap/core';\nimport { Props as TippyProps } from 'tippy.js';\n\nfunction getSelectionRanges(\n state: ResolvedPos,\n range: ResolvedPos,\n depth?: number\n): SelectionRange[] {\n const ranges: SelectionRange[] = [];\n const root = state.node(0);\n depth =\n typeof depth === 'number' && depth >= 0\n ? depth\n : state.sameParent(range)\n ? Math.max(0, state.sharedDepth(range.pos) - 1)\n : state.sharedDepth(range.pos);\n const nodeRange = new NodeRange(state, range, depth);\n const startIndex =\n nodeRange.depth === 0 ? 0 : root.resolve(nodeRange.start).posAtIndex(0);\n nodeRange.parent.forEach((size, offset) => {\n const from = startIndex + offset;\n const to = from + size.nodeSize;\n if (from < nodeRange.start || from >= nodeRange.end) return;\n const selectionRange = new SelectionRange(\n root.resolve(from),\n root.resolve(to)\n );\n ranges.push(selectionRange);\n });\n return ranges;\n}\n\nclass NodeRangeBookmark {\n anchor: number;\n head: number;\n constructor(anchor: number, head: number) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping: Mapping) {\n return new NodeRangeBookmark(\n mapping.map(this.anchor),\n mapping.map(this.head)\n );\n }\n resolve(doc: TNode) {\n const e = doc.resolve(this.anchor);\n const o = doc.resolve(this.head);\n return new NodeRangeSelection(e, o);\n }\n}\n\nclass NodeRangeSelection extends Selection {\n depth: number | undefined;\n\n constructor(t: ResolvedPos, e: ResolvedPos, o?: number, s: number = 1) {\n const { doc: r } = t;\n const n = t === e;\n const i = t.pos === r.content.size && e.pos === r.content.size;\n const a = n && !i ? r.resolve(e.pos + (s > 0 ? 1 : -1)) : e;\n const c = n && i ? r.resolve(t.pos - (s > 0 ? 1 : -1)) : t;\n const d = getSelectionRanges(c.min(a), c.max(a), o);\n super(\n a.pos >= t.pos ? d[0].$from : d[d.length - 1].$to,\n a.pos >= t.pos ? d[d.length - 1].$to : d[0].$from,\n d\n );\n this.depth = o;\n }\n get $to() {\n return this.ranges[this.ranges.length - 1].$to;\n }\n eq(other: Selection): boolean {\n return (\n other instanceof NodeRangeSelection &&\n other.$from.pos === this.$from.pos &&\n other.$to.pos === this.$to.pos\n );\n }\n // @ts-ignore\n map(doc: TNode, mapping: Mapping) {\n const o = doc.resolve(mapping.map(this.anchor));\n const s = doc.resolve(mapping.map(this.head));\n return new NodeRangeSelection(o, s);\n }\n toJSON() {\n return { type: 'nodeRange', anchor: this.anchor, head: this.head };\n }\n get isForwards() {\n return this.head >= this.anchor;\n }\n get isBackwards() {\n return !this.isForwards;\n }\n extendBackwards() {\n const { doc: t } = this.$from;\n if (this.isForwards && this.ranges.length > 1) {\n const t = this.ranges.slice(0, -1);\n const e = t[0].$from;\n const o = t[t.length - 1].$to;\n return new NodeRangeSelection(e, o, this.depth);\n }\n const e = this.ranges[0];\n const o = t.resolve(Math.max(0, e.$from.pos - 1));\n return new NodeRangeSelection(this.$anchor, o, this.depth);\n }\n extendForwards() {\n const { doc: t } = this.$from;\n if (this.isBackwards && this.ranges.length > 1) {\n const t = this.ranges.slice(1);\n const e = t[0].$from;\n const o = t[t.length - 1].$to;\n return new NodeRangeSelection(o, e, this.depth);\n }\n const e = this.ranges[this.ranges.length - 1];\n const o = t.resolve(Math.min(t.content.size, e.$to.pos + 1));\n return new NodeRangeSelection(this.$anchor, o, this.depth);\n }\n static fromJSON(doc: TNode, json: any) {\n return new NodeRangeSelection(\n doc.resolve(json.anchor),\n doc.resolve(json.head)\n );\n }\n static create(\n doc: TNode,\n anchor: number,\n head: number,\n depth?: number,\n bias: number = 1\n ) {\n return new this(doc.resolve(anchor), doc.resolve(head), depth, bias);\n }\n // @ts-ignore\n getBookmark(): NodeRangeBookmark {\n return new NodeRangeBookmark(this.anchor, this.head);\n }\n}\n\nfunction cloneElement(node: HTMLElement) {\n const clonedNode = node.cloneNode(true) as HTMLElement;\n const originalElements = [\n node,\n ...Array.from(node.getElementsByTagName('*')),\n ];\n const clonedElements = [\n clonedNode,\n ...Array.from(clonedNode.getElementsByTagName('*')),\n ];\n\n originalElements.forEach((element, index) => {\n const clonedElement = clonedElements[index];\n\n if (\n clonedElement instanceof HTMLElement &&\n element instanceof HTMLElement\n ) {\n clonedElement.style.cssText = (function (element: HTMLElement) {\n let styles = '';\n const computedStyles = getComputedStyle(element);\n for (let i = 0; i < computedStyles.length; i += 1) {\n styles += `${computedStyles[i]}:${computedStyles.getPropertyValue(computedStyles[i])};`;\n }\n return styles;\n })(element);\n }\n });\n\n return clonedNode;\n}\n\nfunction getComputedStyles(node: Element, property: any) {\n return window.getComputedStyle(node)[property];\n}\nfunction minMax(value = 0, min = 0, max = 0) {\n return Math.min(Math.max(value, min), max);\n}\nfunction removeNode(node: HTMLElement) {\n if (node.parentNode !== null && node.parentNode !== undefined) {\n node.parentNode.removeChild(node);\n }\n}\n\nexport type FindElementNextToCoords = {\n x: number;\n y: number;\n direction?: 'left' | 'right';\n editor: Editor;\n};\n\nconst findElementNextToCoords = (options: FindElementNextToCoords) => {\n const { x, y, direction, editor } = options;\n let resultElement = null;\n let resultNode = null;\n let d = null;\n let l = x;\n for (; null === resultNode && l < window.innerWidth && l > 0; ) {\n const elements = document.elementsFromPoint(l, y);\n const index = elements.findIndex((el) =>\n el.classList.contains('ProseMirror')\n );\n const filteredElements = elements.slice(0, index);\n if (filteredElements.length > 0) {\n const element = filteredElements[0];\n resultElement = element;\n d = editor.view.posAtDOM(element, 0);\n if (d >= 0) {\n resultNode = editor.state.doc.nodeAt(Math.max(d - 1, 0));\n if (resultNode === null || resultNode.isText) {\n resultNode = editor.state.doc.nodeAt(Math.max(d - 1, 0));\n }\n if (!resultNode) {\n resultNode = editor.state.doc.nodeAt(Math.max(d, 0));\n }\n break;\n }\n }\n if (direction === 'left') {\n l -= 1;\n } else {\n l += 1;\n }\n }\n return { resultElement, resultNode, pos: d !== null ? d : null };\n};\n\nfunction getSelectionRangesNearCursor(e: MouseEvent, t: Editor) {\n const { doc: n } = t.view.state,\n o = findElementNextToCoords({\n editor: t,\n x: e.clientX,\n y: e.clientY,\n direction: 'right',\n });\n if (!o.resultNode || null === o.pos) return [];\n const r = e.clientX,\n i = (function (e, t, n) {\n const o = parseInt(getComputedStyles(e.dom, 'paddingLeft'), 10),\n r = parseInt(getComputedStyles(e.dom, 'paddingRight'), 10),\n i = parseInt(getComputedStyles(e.dom, 'borderLeftWidth'), 10),\n s = parseInt(getComputedStyles(e.dom, 'borderLeftWidth'), 10),\n d = e.dom.getBoundingClientRect();\n return { left: minMax(t, d.left + o + i, d.right - r - s), top: n };\n })(t.view, r, e.clientY),\n s = t.view.posAtCoords(i);\n if (!s) return [];\n const { pos: d } = s;\n if (!n.resolve(d).parent) return [];\n const a = n.resolve(o.pos),\n p = n.resolve(o.pos + 1);\n return getSelectionRanges(a, p, 0);\n}\nconst getPreviousNodeStartPosition = (e: TNode, t: number) => {\n const n = e.resolve(t),\n { depth: o } = n;\n if (0 === o) return t;\n return n.pos - n.parentOffset - 1;\n};\nconst getAncestorNodeAtDepth = (e: TNode, t: number) => {\n const n = e.nodeAt(t),\n o = e.resolve(t);\n let { depth: r } = o,\n i = n;\n for (; r > 0; ) {\n const e = o.node(r);\n (r -= 1), 0 === r && (i = e);\n }\n return i;\n};\nconst getOuterNode = (doc: EditorState, pos: number) => {\n const n = ySyncPluginKey.getState(doc);\n return n\n ? absolutePositionToRelativePosition(pos, n.type, n.binding.mapping)\n : null;\n};\n\n// @ts-ignore\nconst getOuterNodePos = (e, t) => {\n let n = t;\n for (; n && n.parentNode && n.parentNode !== e.dom; ) n = n.parentNode;\n return n;\n};\n\ntype DragHandlePluginOptions = {\n pluginKey?: PluginKey | string;\n element: HTMLElement;\n editor: Editor;\n tippyOptions?: Partial<TippyProps>;\n onNodeChange?: (data: {\n editor: Editor;\n node: TNode | null;\n pos: number;\n }) => void;\n};\n\nexport const dragHandlePluginDefaultKey = new PluginKey('dragHandle');\nexport function DragHandlePlugin(\n options: DragHandlePluginOptions\n): Plugin<{ locked: boolean }> {\n const {\n pluginKey: e = dragHandlePluginDefaultKey,\n element,\n editor,\n tippyOptions,\n onNodeChange,\n } = options;\n\n const container = document.createElement('div');\n let tippyInstance: Instance | null = null;\n let x = false;\n let currentNode: TNode | null = null;\n let lastNodePos = -1;\n element.addEventListener('dragstart', (e) => {\n const { view } = editor;\n if (!e.dataTransfer) return;\n const { empty, $from, $to } = view.state.selection;\n const s = getSelectionRangesNearCursor(e, editor);\n const d = getSelectionRanges($from, $to, 0);\n const c = d.some((e) =>\n s.find((t) => t.$from === e.$from && t.$to === e.$to)\n );\n const u = empty || !c ? s : d;\n if (!u.length) return;\n const { tr: g } = view.state;\n const h = document.createElement('div');\n const y = u[0].$from.pos;\n const v = u[u.length - 1].$to.pos;\n const C = NodeRangeSelection.create(view.state.doc, y, v);\n const E = C.content();\n u.forEach((e) => {\n const t = cloneElement(view?.nodeDOM(e.$from.pos) as HTMLElement);\n h.append(t);\n });\n h.style.position = 'absolute';\n h.style.top = '-10000px';\n document.body.append(h);\n e.dataTransfer.clearData();\n e.dataTransfer.setDragImage(h, 0, 0);\n view.dragging = { slice: E, move: true };\n g.setSelection(C as unknown as Selection);\n view.dispatch(g);\n document.addEventListener('drop', () => removeNode(h), { once: true });\n setTimeout(() => {\n element && (element.style.pointerEvents = 'none');\n }, 0);\n });\n element.addEventListener('dragend', () => {\n element && (element.style.pointerEvents = 'auto');\n });\n\n return new Plugin({\n key: typeof e === 'string' ? new PluginKey(e) : e,\n state: {\n init: () => ({ locked: false }) as { locked: boolean },\n apply(e, t, n, o) {\n const l = e.getMeta('lockDragHandle');\n const a = e.getMeta('hideDragHandle');\n if ((undefined !== l && (x = l), a && tippyInstance)) {\n return (\n tippyInstance?.hide(),\n (x = false),\n (currentNode = null),\n (lastNodePos = -1),\n null == onNodeChange ||\n onNodeChange({ editor: editor, node: null, pos: -1 }),\n t\n );\n }\n if (e.docChanged && -1 !== lastNodePos && element && tippyInstance) {\n const t = e.mapping.map(lastNodePos);\n t !== lastNodePos &&\n ((lastNodePos = t), getOuterNode(o, lastNodePos));\n }\n return t;\n },\n },\n view: (e) => {\n var t;\n return (\n (element.draggable = true),\n (element.style.pointerEvents = 'auto'),\n null === (t = editor.view.dom.parentElement) ||\n undefined === t ||\n t.appendChild(container),\n container.appendChild(element),\n (container.style.pointerEvents = 'none'),\n (container.style.position = 'absolute'),\n (container.style.top = '0'),\n (container.style.left = '0'),\n (tippyInstance = tippy(e.dom, {\n getReferenceClientRect: null,\n interactive: true,\n trigger: 'manual',\n placement: 'left-start',\n hideOnClick: false,\n duration: 100,\n zIndex: 10,\n popperOptions: {\n modifiers: [\n { name: 'flip', enabled: false },\n {\n name: 'preventOverflow',\n options: { rootBoundary: 'document', mainAxis: false },\n },\n ],\n },\n ...tippyOptions,\n appendTo: container,\n content: element,\n })),\n {\n update(t, n) {\n if (!element || !tippyInstance) return;\n if (\n ((element.draggable = !x),\n e.state.doc.eq(n.doc) || -1 === lastNodePos)\n )\n return;\n let o = e.nodeDOM(lastNodePos) as HTMLElement;\n if (((o = getOuterNodePos(e, o)), o === e.dom)) return;\n if (1 !== (null == o ? undefined : o.nodeType)) return;\n const r = e.posAtDOM(o, 0),\n s = getAncestorNodeAtDepth(editor.state.doc, r);\n if (s !== currentNode) {\n const t = getPreviousNodeStartPosition(editor.state.doc, r);\n (currentNode = s),\n (lastNodePos = t),\n getOuterNode(e.state, lastNodePos),\n null == onNodeChange ||\n onNodeChange({\n editor: editor,\n node: currentNode as TNode,\n pos: lastNodePos,\n }),\n tippyInstance.setProps({\n getReferenceClientRect: () => o?.getBoundingClientRect(),\n }),\n tippyInstance.show();\n }\n },\n destroy() {\n null == tippyInstance || tippyInstance.destroy(),\n element && removeNode(container);\n },\n }\n );\n },\n props: {\n handleDOMEvents: {\n mouseleave: (e, event) => (\n x ||\n (event.target &&\n !container.contains(event?.relatedTarget as Node) &&\n (null == tippyInstance || tippyInstance.hide(),\n (currentNode = null),\n (lastNodePos = -1),\n null == onNodeChange ||\n onNodeChange({ editor: editor, node: null, pos: -1 }))),\n false\n ),\n mousemove(e, t) {\n if (!element || !tippyInstance || x) return false;\n const n = findElementNextToCoords({\n x: t.clientX,\n y: t.clientY,\n direction: 'right',\n editor: editor,\n });\n if (!n.resultElement) return false;\n let o = n.resultElement;\n if (((o = getOuterNodePos(e, o)), o === e.dom)) return false;\n if (1 !== (null == o ? undefined : o.nodeType)) return false;\n const r = e.posAtDOM(o, 0),\n s = getAncestorNodeAtDepth(editor.state.doc, r);\n if (s !== currentNode) {\n const t = getPreviousNodeStartPosition(editor.state.doc, r);\n (currentNode = s),\n (lastNodePos = t),\n getOuterNode(e.state, lastNodePos),\n null == onNodeChange ||\n onNodeChange({\n editor: editor,\n node: currentNode,\n pos: lastNodePos,\n }),\n tippyInstance.setProps({\n getReferenceClientRect: () => o.getBoundingClientRect(),\n }),\n tippyInstance.show();\n }\n return false;\n },\n },\n },\n });\n}\n","import { useMemo } from 'react';\nimport { Editor as EditorType } from '@tiptap/core';\nimport {\n AlignCenter,\n AlignLeft,\n AlignRight,\n BoldIcon,\n EraserIcon,\n ItalicIcon,\n LinkIcon,\n SeparatorHorizontal,\n StrikethroughIcon,\n UnderlineIcon,\n} from 'lucide-react';\n\nimport { EditorProps } from '@/editor';\n\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { BubbleMenuItem } from './text-menu/text-bubble-menu';\n\ninterface EditorMenuItem extends BubbleMenuItem {\n group: 'alignment' | 'image' | 'mark' | 'custom' | 'email';\n}\n\ntype EditorMenuBarProps = {\n config: EditorProps['config'];\n editor: EditorType;\n};\n\nexport const EditorMenuBar = (props: EditorMenuBarProps) => {\n const { editor, config } = props;\n\n const items: EditorMenuItem[] = useMemo(\n () => [\n {\n name: 'bold',\n command: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive('bold'),\n group: 'mark',\n icon: BoldIcon,\n },\n {\n name: 'italic',\n command: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive('italic'),\n group: 'mark',\n icon: ItalicIcon,\n },\n {\n name: 'underline',\n command: () => editor.chain().focus().toggleUnderline().run(),\n isActive: () => editor.isActive('underline'),\n group: 'mark',\n icon: UnderlineIcon,\n },\n {\n name: 'strike',\n command: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive('strike'),\n group: 'mark',\n icon: StrikethroughIcon,\n },\n {\n name: 'delete-line',\n command: () =>\n editor.chain().focus().selectParentNode().deleteSelection().run(),\n isActive: () => false,\n group: 'mark',\n icon: EraserIcon,\n },\n {\n name: 'divider',\n command: () => editor.chain().focus().setHorizontalRule().run(),\n isActive: () => editor.isActive('horizontalRule'),\n group: 'custom',\n icon: SeparatorHorizontal,\n },\n {\n name: 'link',\n command: () => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt('URL', previousUrl);\n // If the user cancels the prompt, we don't want to toggle the link\n if (url === null) return;\n // If the user deletes the URL entirely, we'll unlink the selected text\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n\n // Otherwise, we set the link to the given URL\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: url })\n .run();\n },\n isActive: () => editor.isActive('link'),\n group: 'custom',\n icon: LinkIcon,\n },\n {\n name: 'left',\n command: () => editor.chain().focus().setTextAlign('left').run(),\n isActive: () => editor.isActive({ textAlign: 'left' }),\n group: 'alignment',\n icon: AlignLeft,\n },\n {\n name: 'center',\n command: () => editor.chain().focus().setTextAlign('center').run(),\n isActive: () => editor.isActive({ textAlign: 'center' }),\n group: 'alignment',\n icon: AlignCenter,\n },\n {\n name: 'right',\n command: () => editor.chain().focus().setTextAlign('right').run(),\n isActive: () => editor.isActive({ textAlign: 'right' }),\n group: 'alignment',\n icon: AlignRight,\n },\n ],\n [editor]\n );\n\n const groups = useMemo(\n () =>\n items.reduce((acc, item) => {\n if (!acc.includes(item.group)) {\n acc.push(item.group);\n }\n return acc;\n }, [] as string[]),\n [items]\n );\n\n if (!editor) {\n return null;\n }\n\n return (\n <div\n className={`mly-flex mly-items-center mly-gap-3 ${config?.toolbarClassName}`}\n >\n {groups.map((group, index) => (\n <div\n key={index}\n className=\"mly-flex mly-items-center mly-gap-1 mly-rounded-md mly-border mly-bg-white mly-p-1\"\n >\n {items\n .filter((item) => item.group === group)\n .map((item, index) => (\n <BubbleMenuButton key={index} {...item} />\n ))}\n </div>\n ))}\n </div>\n );\n};\n","import {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n useMailyContext,\n} from '@/editor/provider';\nimport { cn } from '@/editor/utils/classname';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { BubbleMenu, findChildren } from '@tiptap/react';\nimport {\n Braces,\n InfoIcon,\n TriangleAlert,\n TriangleAlertIcon,\n} from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { sticky } from 'tippy.js';\nimport { getRenderContainer } from '../../utils/get-render-container';\nimport { ShowPopover } from '../show-popover';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { Divider } from '../ui/divider';\nimport { InputAutocomplete } from '../ui/input-autocomplete';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../ui/tooltip';\nimport { useForState } from './use-for-state';\nimport { getClosestNodeByName } from '@/editor/utils/columns';\nimport { processVariables } from '@/editor/utils/variable';\n\nexport function ForBubbleMenu(props: EditorBubbleMenuProps) {\n const { appendTo, editor } = props;\n if (!editor) {\n return null;\n }\n\n const state = useForState(editor);\n\n const getReferenceClientRect = useCallback(() => {\n const renderContainer = getRenderContainer(editor!, 'for');\n const rect =\n renderContainer?.getBoundingClientRect() ||\n new DOMRect(-1000, -1000, 0, 0);\n\n return rect;\n }, [editor]);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n const activeForNode = getClosestNodeByName(editor, 'for');\n const sectionNodeChildren = activeForNode\n ? findChildren(activeForNode?.node, (node) => {\n return node.type.name === 'section';\n })?.[0]\n : null;\n const hasActiveSectionNodeChildren =\n sectionNodeChildren && editor.isActive('section');\n\n if (isTextSelected(editor) || hasActiveSectionNodeChildren) {\n return false;\n }\n\n return editor.isActive('for');\n },\n tippyOptions: {\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n appendTo: () => appendTo?.current,\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: 'auto',\n },\n pluginKey: 'forBubbleMenu',\n };\n\n const { variables = [], renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n const inputRef = useRef<HTMLInputElement>(null);\n const [isUpdatingKey, setIsUpdatingKey] = useState(false);\n\n const eachKey = state?.each || '';\n const autoCompleteOptions = useMemo(() => {\n return processVariables(variables, {\n query: eachKey || '',\n editor,\n from: 'for-variable',\n }).map((variable) => variable.name);\n }, [variables, eachKey, editor]);\n\n const isValidEachKey = eachKey;\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-items-stretch mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-center mly-gap-1.5 mly-px-1.5 mly-text-sm mly-leading-none\">\n For\n <Tooltip>\n <TooltipTrigger>\n <InfoIcon\n className={cn('mly-size-3 mly-stroke-[2.5] mly-text-gray-500')}\n />\n </TooltipTrigger>\n <TooltipContent\n sideOffset={14}\n className=\"mly-max-w-[260px]\"\n align=\"start\"\n >\n Ensure the selected variable is iterable, such as an array of\n objects.\n </TooltipContent>\n </Tooltip>\n </div>\n {!isUpdatingKey && (\n <button\n onClick={() => {\n setIsUpdatingKey(true);\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: state?.each,\n valid: isValidEachKey,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n {isUpdatingKey && (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setIsUpdatingKey(false);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setIsUpdatingKey(false);\n }\n }}\n >\n <InputAutocomplete\n placeholder=\"ie. payload.items\"\n value={state?.each || ''}\n onValueChange={(value) => {\n editor.commands.updateFor({\n each: value,\n });\n }}\n onOutsideClick={() => {\n setIsUpdatingKey(false);\n }}\n onSelectOption={(value) => {\n editor.commands.updateFor({\n each: value,\n });\n setIsUpdatingKey(false);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={inputRef}\n />\n </form>\n )}\n\n <Divider />\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.updateFor({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useForState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n each: ctx.editor.getAttributes('for')?.each,\n currentShowIfKey: ctx.editor.getAttributes('for')?.showIfKey || '',\n\n isSectionActive: ctx.editor.isActive('section'),\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { BubbleMenu } from '@tiptap/react';\nimport { ArrowUpRight, ImageDown } from 'lucide-react';\nimport { AlignmentSwitch } from '../alignment-switch';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { Divider } from '../ui/divider';\nimport { LinkInputPopover } from '../ui/link-input-popover';\nimport { Select } from '../ui/select';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { ImageSize } from './image-size';\nimport { useImageState } from './use-image-state';\nimport { ShowPopover } from '../show-popover';\nimport { AllowedLogoSize, allowedLogoSize } from '@/editor/nodes/logo/logo';\nimport { sticky } from 'tippy.js';\n\nexport function ImageBubbleMenu(props: EditorBubbleMenuProps) {\n const { editor, appendTo } = props;\n if (!editor) {\n return null;\n }\n\n const state = useImageState(editor);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n return editor.isActive('logo') || editor.isActive('image');\n },\n tippyOptions: {\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: '100%',\n },\n };\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n {state.isLogoActive && state.imageSrc && (\n <>\n <Select\n label=\"Size\"\n tooltip=\"Size\"\n value={state.logoSize}\n options={allowedLogoSize.map((size) => ({\n value: size,\n label: size,\n }))}\n onValueChange={(value) => {\n editor\n ?.chain()\n .focus()\n .setLogoAttributes({ size: value as AllowedLogoSize })\n .run();\n }}\n />\n\n <Divider />\n </>\n )}\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <AlignmentSwitch\n alignment={state.alignment}\n onAlignmentChange={(alignment) => {\n const isCurrentNodeImage = state.isImageActive;\n if (!isCurrentNodeImage) {\n editor?.chain().focus().setLogoAttributes({ alignment }).run();\n } else {\n editor\n ?.chain()\n .focus()\n .updateAttributes('image', { alignment })\n .run();\n }\n }}\n />\n\n <LinkInputPopover\n defaultValue={state?.imageSrc ?? ''}\n onValueChange={(value, isVariable) => {\n if (state.isLogoActive) {\n editor\n ?.chain()\n .setLogoAttributes({\n src: value,\n isSrcVariable: isVariable ?? false,\n })\n .run();\n } else {\n editor\n ?.chain()\n .updateAttributes('image', {\n src: value,\n isSrcVariable: isVariable ?? false,\n })\n .run();\n }\n }}\n tooltip=\"Source URL\"\n icon={ImageDown}\n editor={editor}\n isVariable={state.isSrcVariable}\n />\n\n {state.isImageActive && (\n <LinkInputPopover\n defaultValue={state?.imageExternalLink ?? ''}\n onValueChange={(value, isVariable) => {\n editor\n ?.chain()\n .updateAttributes('image', {\n externalLink: value,\n isExternalLinkVariable: isVariable ?? false,\n })\n .run();\n }}\n tooltip=\"External URL\"\n editor={editor}\n isVariable={state.isExternalLinkVariable}\n />\n )}\n </div>\n\n {state.isImageActive && state.imageSrc && (\n <>\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <ImageSize\n dimension=\"width\"\n value={state?.width ?? 0}\n onValueChange={(value) => {\n editor\n ?.chain()\n .updateAttributes('image', { width: value })\n .run();\n }}\n />\n <ImageSize\n dimension=\"height\"\n value={state?.height ?? 0}\n onValueChange={(value) => {\n editor\n ?.chain()\n .updateAttributes('image', { height: value })\n .run();\n }}\n />\n </div>\n </>\n )}\n\n <Divider />\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor\n ?.chain()\n .updateAttributes(state.isLogoActive ? 'logo' : 'image', {\n showIfKey: value,\n })\n .run();\n }}\n editor={editor}\n />\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { AlignCenter, AlignLeft, AlignRight } from 'lucide-react';\nimport { BubbleMenuButton } from './bubble-menu-button';\nimport { AllowedLogoAlignment } from '../nodes/logo/logo';\n\ntype AlignmentSwitchProps = {\n alignment: AllowedLogoAlignment;\n onAlignmentChange: (alignment: AllowedLogoAlignment) => void;\n};\n\nexport function AlignmentSwitch(props: AlignmentSwitchProps) {\n const { alignment = 'left', onAlignmentChange } = props;\n\n const activeAlignment = {\n left: {\n icon: AlignLeft,\n tooltip: 'Align Left',\n onClick: () => {\n onAlignmentChange('center');\n },\n },\n center: {\n icon: AlignCenter,\n tooltip: 'Align Center',\n onClick: () => {\n onAlignmentChange('right');\n },\n },\n right: {\n icon: AlignRight,\n tooltip: 'Align Right',\n onClick: () => {\n onAlignmentChange('left');\n },\n },\n }[alignment];\n\n return (\n <BubbleMenuButton\n icon={activeAlignment.icon}\n tooltip={activeAlignment.tooltip}\n command={activeAlignment.onClick}\n />\n );\n}\n","import {\n BracesIcon,\n ChevronDownIcon,\n CornerDownLeft,\n Link,\n LucideIcon,\n} from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { useRef, useState } from 'react';\nimport { Tooltip, TooltipTrigger, TooltipContent } from './tooltip';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n useMailyContext,\n} from '@/editor/provider';\nimport { InputAutocomplete } from './input-autocomplete';\nimport { processVariables } from '@/editor/utils/variable';\nimport { useMemo } from 'react';\nimport { Editor } from '@tiptap/core';\n\nconst LINK_PROTOCOL_REGEX = /https?:\\/\\//;\n\ntype LinkInputPopoverProps = {\n defaultValue?: string;\n isVariable?: boolean;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n\n icon?: LucideIcon;\n tooltip?: string;\n\n editor: Editor;\n};\n\nexport function LinkInputPopover(props: LinkInputPopoverProps) {\n const {\n defaultValue = '',\n onValueChange,\n tooltip,\n icon: Icon = Link,\n editor,\n\n isVariable,\n } = props;\n\n const defaultProtocol = defaultValue.match(LINK_PROTOCOL_REGEX)?.[0];\n const defaultUrlWithoutProtocol = defaultValue.replace(\n LINK_PROTOCOL_REGEX,\n ''\n );\n\n const [isOpen, setIsOpen] = useState(false);\n const [protocol, setProtocol] = useState(defaultProtocol || 'https://');\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n\n const {\n variables = [],\n variableTriggerCharacter = DEFAULT_VARIABLE_TRIGGER_CHAR,\n renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION,\n } = useMailyContext();\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = defaultUrlWithoutProtocol.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, defaultUrlWithoutProtocol, editor]);\n\n const popoverButton = (\n <PopoverTrigger asChild>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n data-state={!!defaultUrlWithoutProtocol}\n >\n <Icon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5] mly-text-midnight-gray\" />\n </BaseButton>\n </PopoverTrigger>\n );\n\n const normalizeProtocol = (value: string, p: string = protocol) => {\n // remove protocol if it's already there\n // and add the new one\n value = value?.replace(LINK_PROTOCOL_REGEX, '');\n return p + value;\n };\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly-w-max mly-rounded-none mly-border-none mly-bg-transparent !mly-p-0 mly-shadow-none\"\n sideOffset={8}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const input = linkInputRef.current;\n if (!input) {\n return;\n }\n\n let value = normalizeProtocol(input.value);\n onValueChange?.(value);\n setIsOpen(false);\n }}\n >\n <div className=\"mly-isolate mly-flex mly-rounded-lg\">\n {!isEditing && (\n <div className=\"mly-flex mly-h-8 mly-items-center mly-rounded-lg mly-border mly-border-gray-300 mly-bg-white mly-px-0.5\">\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: defaultUrlWithoutProtocol,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n </div>\n )}\n\n {isEditing && (\n <>\n <div className=\"mly-relative\">\n <select\n className=\"hover:text-accent-foreground mly-peer mly-inline-flex mly-h-full mly-appearance-none mly-items-center mly-rounded-none mly-rounded-s-lg mly-border mly-border-gray-300 mly-bg-gray-50 mly-pe-8 mly-ps-3 mly-text-sm mly-text-gray-700 mly-transition-shadow hover:mly-bg-gray-100 focus:mly-z-10 focus-visible:mly-outline-none disabled:mly-pointer-events-none disabled:mly-cursor-not-allowed disabled:mly-opacity-50\"\n aria-label=\"Protocol\"\n value={protocol}\n onChange={(e) => {\n const protocol = e.target.value;\n\n setProtocol(protocol);\n const newValue = normalizeProtocol(\n linkInputRef.current?.value || '',\n protocol\n );\n onValueChange?.(newValue);\n }}\n >\n <option value=\"https://\">https://</option>\n <option value=\"http://\">http://</option>\n </select>\n <span className=\"mly-pointer-events-none mly-absolute mly-inset-y-0 mly-right-0 mly-z-10 mly-flex mly-h-full mly-w-9 mly-items-center mly-justify-center mly-text-gray-600 peer-disabled:mly-opacity-50\">\n <ChevronDownIcon\n size={16}\n strokeWidth={2}\n aria-hidden=\"true\"\n role=\"img\"\n />\n </span>\n </div>\n\n <InputAutocomplete\n value={defaultUrlWithoutProtocol}\n onValueChange={(value) => {\n let newValue = normalizeProtocol(value);\n onValueChange?.(newValue);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder=\"maily.to/\"\n className=\"-mly-ms-px mly-block mly-h-8 mly-w-52 mly-rounded-lg mly-rounded-s-none mly-border mly-border-gray-300 mly-px-2 mly-py-1.5 mly-pr-6 mly-text-sm mly-shadow-sm mly-outline-none placeholder:mly-text-gray-400\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable =\n autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n } else {\n value = normalizeProtocol(value);\n }\n\n onValueChange?.(value, isVariable);\n setIsOpen(false);\n }}\n />\n </>\n )}\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n","import { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '@/editor/utils/constants';\n\ntype ImageSizeProps = {\n value: string;\n onValueChange: (value: string) => void;\n dimension: 'width' | 'height';\n};\n\nexport function ImageSize(props: ImageSizeProps) {\n const { value, onValueChange, dimension } = props;\n\n return (\n <label className=\"mly-relative mly-flex mly-items-center\">\n <span className=\"mly-absolute mly-inset-y-0 mly-left-2 mly-flex mly-items-center mly-text-xs mly-leading-none mly-text-gray-400\">\n {dimension === 'width' ? 'W' : 'H'}\n </span>\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n className=\"hide-number-controls mly-h-auto mly-max-w-20 mly-appearance-none mly-border-0 mly-border-none mly-p-1 mly-px-[26px] mly-text-sm mly-uppercase mly-tabular-nums mly-outline-none focus-visible:mly-outline-none\"\n type=\"number\"\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n />\n <span className=\"mly-absolute mly-inset-y-0 mly-right-1 mly-flex mly-items-center mly-text-xs mly-leading-none mly-text-gray-400\">\n PX\n </span>\n </label>\n );\n}\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { LogoView } from './logo-view';\n\nexport const allowedLogoSize = ['sm', 'md', 'lg'] as const;\nexport type AllowedLogoSize = (typeof allowedLogoSize)[number];\n\nexport const allowedLogoAlignment = ['left', 'center', 'right'] as const;\nexport type AllowedLogoAlignment = (typeof allowedLogoAlignment)[number];\n\ninterface LogoOptions {\n src: string;\n alt?: string;\n title?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n}\n\nexport interface LogoAttributes {\n src?: string;\n size?: AllowedLogoSize;\n alignment?: AllowedLogoAlignment;\n\n showIfKey: string;\n isSrcVariable?: boolean;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n logo: {\n setLogoImage: (options: LogoOptions) => ReturnType;\n setLogoAttributes: (attributes: Partial<LogoAttributes>) => ReturnType;\n };\n }\n}\n\nconst DEFAULT_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_LOGO_SIZE: AllowedLogoSize = 'sm';\n\nexport const logoSizes: Record<AllowedLogoSize, string> = {\n sm: '40px',\n md: '48px',\n lg: '64px',\n};\n\nfunction getAlignmentStyle(alignment: AllowedLogoAlignment): string[] {\n const alignments: Record<AllowedLogoAlignment, string[]> = {\n left: ['margin-right:auto', 'margin-left:0'],\n center: ['margin-right:auto', 'margin-left:auto'],\n right: ['margin-right:0', 'margin-left:auto'],\n };\n\n return alignments[alignment] || alignments[DEFAULT_ALIGNMENT];\n}\n\nexport const LogoExtension = TiptapImage.extend({\n name: 'logo',\n priority: 1000,\n\n addAttributes() {\n return {\n ...this.parent?.(),\n 'maily-component': {\n default: 'logo',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element: Element) =>\n element.getAttribute('data-maily-component'),\n },\n size: {\n default: DEFAULT_LOGO_SIZE,\n parseHTML: (element) =>\n element.getAttribute('data-size') as AllowedLogoSize,\n renderHTML: (attributes) => {\n return {\n 'data-size': attributes.size,\n };\n },\n },\n alignment: {\n default: DEFAULT_ALIGNMENT,\n parseHTML: (element) =>\n element.getAttribute('data-alignment') as AllowedLogoAlignment,\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n };\n },\n addCommands() {\n return {\n setLogoImage:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n setLogoAttributes:\n (attributes) =>\n ({ commands }) => {\n return commands.updateAttributes('logo', attributes);\n },\n };\n },\n parseHTML() {\n return [\n {\n tag: `img[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n addNodeView() {\n return ReactNodeViewRenderer(LogoView, {\n className: 'mly-relative',\n });\n },\n});\n","import { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes, Node } from '@tiptap/core';\n\nexport const DEFAULT_SECTION_BACKGROUND_COLOR = '#f7f7f7';\nexport const DEFAULT_SECTION_ALIGN = 'left';\nexport const DEFAULT_SECTION_BORDER_WIDTH = 2;\nexport const DEFAULT_SECTION_BORDER_COLOR = '#e2e2e2';\nexport const DEFAULT_SECTION_BORDER_RADIUS = 0;\n\nexport const DEFAULT_SECTION_MARGIN_TOP = 0;\nexport const DEFAULT_SECTION_MARGIN_RIGHT = 0;\nexport const DEFAULT_SECTION_MARGIN_BOTTOM = 0;\nexport const DEFAULT_SECTION_MARGIN_LEFT = 0;\n\nexport const DEFAULT_SECTION_PADDING_TOP = 5;\nexport const DEFAULT_SECTION_PADDING_RIGHT = 5;\nexport const DEFAULT_SECTION_PADDING_BOTTOM = 5;\nexport const DEFAULT_SECTION_PADDING_LEFT = 5;\n\nexport const DEFAULT_SECTION_SHOW_IF_KEY = null;\n\ntype SectionAttributes = {\n borderRadius: number;\n backgroundColor: string;\n align: string;\n borderWidth: number;\n borderColor: string;\n\n marginTop: number;\n marginRight: number;\n marginBottom: number;\n marginLeft: number;\n\n paddingTop: number;\n paddingRight: number;\n paddingBottom: number;\n paddingLeft: number;\n\n showIfKey: string | null;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n section: {\n setSection: () => ReturnType;\n updateSection: (attrs: Partial<SectionAttributes>) => ReturnType;\n };\n }\n}\n\nexport const SectionExtension = Node.create({\n name: 'section',\n group: 'block',\n content: '(block|columns)+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n borderRadius: {\n default: 0,\n parseHTML: (element) => {\n return Number(element?.style?.borderRadius?.replace(/['\"]+/g, ''));\n },\n renderHTML: (attributes) => {\n if (!attributes.borderRadius) {\n return {};\n }\n\n return {\n style: `border-radius: ${attributes.borderRadius}px`,\n };\n },\n },\n backgroundColor: {\n default: DEFAULT_SECTION_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return element.style.backgroundColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n\n return {\n style: `background-color: ${attributes.backgroundColor};--bg-color: ${attributes.backgroundColor}`,\n };\n },\n },\n align: {\n default: DEFAULT_SECTION_ALIGN,\n parseHTML: (element) => {\n return element.getAttribute('align') || DEFAULT_SECTION_ALIGN;\n },\n renderHTML(attributes) {\n if (!attributes.align) {\n return {};\n }\n\n return {\n align: attributes.align,\n };\n },\n },\n borderWidth: {\n default: DEFAULT_SECTION_BORDER_WIDTH,\n parseHTML: (element) => {\n return (\n Number(element?.style?.borderWidth?.replace(/['\"]+/g, '')) || 0\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.borderWidth) {\n return {};\n }\n\n return {\n style: `border-width: ${attributes.borderWidth}px`,\n };\n },\n },\n borderColor: {\n default: DEFAULT_SECTION_BORDER_COLOR,\n parseHTML: (element) => {\n return element.style.borderColor;\n },\n renderHTML: (attributes) => {\n if (!attributes.borderColor) {\n return {};\n }\n\n return {\n style: `border-color: ${attributes.borderColor}`,\n };\n },\n },\n paddingTop: {\n default: DEFAULT_SECTION_PADDING_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.paddingTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.paddingTop) {\n return {};\n }\n\n return {\n style: `padding-top: ${attributes.paddingTop}px`,\n };\n },\n },\n paddingRight: {\n default: DEFAULT_SECTION_PADDING_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.paddingRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingRight) {\n return {};\n }\n\n return {\n style: `padding-right: ${attributes.paddingRight}px`,\n };\n },\n },\n paddingBottom: {\n default: DEFAULT_SECTION_PADDING_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.paddingBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingBottom) {\n return {};\n }\n\n return {\n style: `padding-bottom: ${attributes.paddingBottom}px`,\n };\n },\n },\n paddingLeft: {\n default: DEFAULT_SECTION_PADDING_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.paddingLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.paddingLeft) {\n return {};\n }\n\n return {\n style: `padding-left: ${attributes.paddingLeft}px`,\n };\n },\n },\n marginTop: {\n default: DEFAULT_SECTION_MARGIN_TOP,\n parseHTML: (element) => {\n return Number(element?.style?.marginTop?.replace(/['\"]+/g, '')) || 0;\n },\n renderHTML: (attributes) => {\n if (!attributes.marginTop) {\n return {};\n }\n\n return {\n marginTop: attributes.marginTop,\n };\n },\n },\n marginRight: {\n default: DEFAULT_SECTION_MARGIN_RIGHT,\n parseHTML: (element) =>\n Number(element?.style?.marginRight?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginRight) {\n return {};\n }\n\n return {\n marginRight: attributes.marginRight,\n };\n },\n },\n marginBottom: {\n default: DEFAULT_SECTION_MARGIN_BOTTOM,\n parseHTML: (element) =>\n Number(element?.style?.marginBottom?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginBottom) {\n return {};\n }\n\n return {\n marginBottom: attributes.marginBottom,\n };\n },\n },\n marginLeft: {\n default: DEFAULT_SECTION_MARGIN_LEFT,\n parseHTML: (element) =>\n Number(element?.style?.marginLeft?.replace(/['\"]+/g, '')) || 0,\n renderHTML: (attributes) => {\n if (!attributes.marginLeft) {\n return {};\n }\n\n return {\n marginLeft: attributes.marginLeft,\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSection:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n type: this.name,\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateSection: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const {\n marginTop = 0,\n marginRight = 0,\n marginBottom = 0,\n marginLeft = 0,\n } = HTMLAttributes;\n\n return [\n 'table',\n {\n 'data-type': this.name,\n border: 0,\n cellpadding: 0,\n cellspacing: 0,\n class: 'mly-w-full mly-border-separate mly-relative mly-table-fixed',\n style: `margin-top: ${marginTop}px; margin-right: ${marginRight}px; margin-bottom: ${marginBottom}px; margin-left: ${marginLeft}px;`,\n },\n [\n 'tbody',\n {\n class: 'mly-w-full',\n },\n [\n 'tr',\n {\n class: 'mly-w-full',\n },\n [\n 'td',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'section-cell',\n style: 'border-style: solid',\n class: 'mly-w-full [text-align:revert-layer]',\n }),\n 0,\n ],\n ],\n ],\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'table[data-type=\"section\"]',\n },\n ];\n },\n});\n","import { NodeViewProps } from '@tiptap/core';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { useEffect } from 'react';\nimport { useState } from 'react';\nimport { LogoAttributes, logoSizes } from './logo';\nimport { ImageStatus, ImageStatusLabel } from '../image/image-view';\n\nexport function LogoView(props: NodeViewProps) {\n const { node } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n\n let {\n alignment = 'center',\n src: logoSrc,\n isSrcVariable,\n size = 'sm',\n } = (node.attrs || {}) as LogoAttributes;\n\n const hasImageSrc = !!logoSrc;\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!logoSrc) {\n return;\n }\n\n setStatus('loading');\n const img = new Image();\n img.src = logoSrc;\n img.onload = () => {\n setStatus('loaded');\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [logoSrc]);\n\n const logoSize = logoSizes[size];\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable\n data-drag-handle\n style={{\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n }}\n >\n {!hasImageSrc && <ImageStatusLabel status=\"idle\" />}\n {hasImageSrc && isSrcVariable && <ImageStatusLabel status=\"variable\" />}\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <img\n src={logoSrc}\n alt=\"Logo\"\n style={{\n height: logoSize,\n width: logoSize,\n cursor: 'default',\n marginBottom: 0,\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment] || {}),\n }}\n />\n )}\n </NodeViewWrapper>\n );\n}\n","import { useCallback, useLayoutEffect, useRef } from 'react';\n\nexport const useEvent = <T extends (...args: any[]) => any>(handler: T): T => {\n const handlerRef = useRef<T | null>(null);\n\n useLayoutEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n return useCallback((...args: Parameters<T>): ReturnType<T> => {\n if (handlerRef.current === null) {\n throw new Error('Handler is not assigned');\n }\n return handlerRef.current(...args);\n }, []) as T;\n};\n","import { cn } from '@/editor/utils/classname';\nimport { useEvent } from '@/editor/utils/use-event';\nimport { type NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Ban, BracesIcon, ImageOffIcon, Loader2 } from 'lucide-react';\nimport { type CSSProperties, useEffect, useRef, useState } from 'react';\n\nconst MIN_WIDTH = 20;\nconst MAX_WIDTH = 600;\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport function ImageView(props: NodeViewProps) {\n const { node, updateAttributes, selected } = props;\n\n const [status, setStatus] = useState<ImageStatus>('idle');\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n const [resizingStyle, setResizingStyle] = useState<\n Pick<CSSProperties, 'width' | 'height'> | undefined\n >();\n\n const handleMouseDown = useEvent(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const imageParent = document.querySelector(\n '.ProseMirror-selectednode'\n ) as HTMLDivElement;\n\n if (!imgRef.current || !imageParent || !selected) {\n return;\n }\n\n const imageParentWidth = Math.max(imageParent.offsetWidth, MAX_WIDTH);\n\n event.preventDefault();\n const direction = event.currentTarget.dataset.direction || '--';\n const initialXPosition = event.clientX;\n const currentWidth = imgRef.current.width;\n const currentHeight = imgRef.current.height;\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n const transform = direction[1] === 'w' ? -1 : 1;\n\n const removeListeners = () => {\n window.removeEventListener('mousemove', mouseMoveHandler);\n window.removeEventListener('mouseup', removeListeners);\n updateAttributes({ width: newWidth, height: newHeight });\n setResizingStyle(undefined);\n };\n\n const mouseMoveHandler = (event: MouseEvent) => {\n newWidth = Math.max(\n currentWidth + transform * (event.clientX - initialXPosition),\n MIN_WIDTH\n );\n\n if (newWidth > imageParentWidth) {\n newWidth = imageParentWidth;\n }\n\n newHeight = (newWidth / currentWidth) * currentHeight;\n\n setResizingStyle({ width: newWidth, height: newHeight });\n // If mouse is up, remove event listeners\n if (!event.buttons) {\n return removeListeners();\n }\n };\n\n window.addEventListener('mousemove', mouseMoveHandler);\n window.addEventListener('mouseup', removeListeners);\n }\n );\n\n function dragCornerButton(direction: string) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onMouseDown={handleMouseDown}\n data-direction={direction}\n className=\"mly-bg-rose-500\"\n style={{\n position: 'absolute',\n height: '10px',\n width: '10px',\n ...{ n: { top: 0 }, s: { bottom: 0 } }[direction[0]],\n ...{ w: { left: 0 }, e: { right: 0 } }[direction[1]],\n cursor: `${direction}-resize`,\n }}\n />\n );\n }\n\n let { alignment = 'center', width, height, src } = node.attrs || {};\n const {\n externalLink,\n isExternalLinkVariable,\n isSrcVariable,\n showIfKey,\n ...attrs\n } = node.attrs || {};\n\n const hasImageSrc = !!attrs.src;\n\n // load the image using new Image() to avoid layout shift\n // then if the image is loaded, set the status to loaded\n useEffect(() => {\n if (!src) {\n return;\n }\n\n setStatus('loading');\n const img = new Image();\n img.src = src;\n img.onload = () => {\n setStatus('loaded');\n // for some reason Apple Mail doesn't respect the width and height attributes\n // update the dimensions to ensure that the image is not stretched\n const { naturalWidth, naturalHeight } = img;\n const wrapper = wrapperRef?.current;\n if (!wrapper || width !== 'auto' || !naturalWidth) {\n return;\n }\n\n const wrapperWidth = wrapper.offsetWidth;\n const aspectRatio = naturalWidth / naturalHeight;\n const calculatedHeight = Math.min(\n wrapperWidth / aspectRatio,\n naturalHeight\n );\n\n updateAttributes({\n width: Math.min(wrapperWidth, naturalWidth),\n height: Math.min(calculatedHeight, naturalHeight),\n });\n };\n img.onerror = () => {\n setStatus('error');\n };\n\n return () => {\n img.src = '';\n img.onload = null;\n img.onerror = null;\n };\n }, [src]);\n\n return (\n <NodeViewWrapper\n as=\"div\"\n draggable\n data-drag-handle\n style={{\n ...(hasImageSrc && status === 'loaded'\n ? {\n width: `${width}px`,\n height: `${height}px`,\n ...resizingStyle,\n }\n : {}),\n overflow: 'hidden',\n position: 'relative',\n // Weird! Basically tiptap/prose wraps this in a span and the line height causes an annoying buffer.\n lineHeight: '0px',\n display: 'block',\n ...({\n center: { marginLeft: 'auto', marginRight: 'auto' },\n left: { marginRight: 'auto' },\n right: { marginLeft: 'auto' },\n }[alignment as string] || {}),\n }}\n ref={wrapperRef}\n >\n {!hasImageSrc && <ImageStatusLabel status=\"idle\" />}\n {hasImageSrc && isSrcVariable && <ImageStatusLabel status=\"variable\" />}\n\n {hasImageSrc && status === 'loading' && !isSrcVariable && (\n <ImageStatusLabel status=\"loading\" />\n )}\n {hasImageSrc && status === 'error' && !isSrcVariable && (\n <ImageStatusLabel status=\"error\" />\n )}\n\n {hasImageSrc && status === 'loaded' && !isSrcVariable && (\n <>\n <img\n {...attrs}\n ref={imgRef}\n style={{\n ...resizingStyle,\n cursor: 'default',\n marginBottom: 0,\n }}\n />\n\n {selected && (\n <>\n {/* Don't use a simple border as it pushes other content around. */}\n {[\n { left: 0, top: 0, height: '100%', width: '1px' },\n { right: 0, top: 0, height: '100%', width: '1px' },\n { top: 0, left: 0, width: '100%', height: '1px' },\n { bottom: 0, left: 0, width: '100%', height: '1px' },\n ].map((style, i) => (\n <div\n key={i}\n className=\"mly-bg-rose-500\"\n style={{\n position: 'absolute',\n ...style,\n }}\n />\n ))}\n {dragCornerButton('nw')}\n {dragCornerButton('ne')}\n {dragCornerButton('sw')}\n {dragCornerButton('se')}\n </>\n )}\n </>\n )}\n </NodeViewWrapper>\n );\n}\n\ntype ImageStatusLabelProps = {\n status: ImageStatus | 'variable';\n};\n\nexport function ImageStatusLabel(props: ImageStatusLabelProps) {\n const { status } = props;\n return (\n <div\n className={cn(\n 'mly-flex mly-items-center mly-gap-2 mly-rounded-lg mly-bg-soft-gray mly-p-4 mly-text-sm mly-font-medium',\n {\n 'mly-text-gray-500 hover:mly-bg-soft-gray/60': status === 'loading',\n 'mly-text-red-500 hover:mly-bg-soft-gray/60': status === 'error',\n }\n )}\n >\n {status === 'idle' && (\n <>\n <ImageOffIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>No image selected</span>\n </>\n )}\n {status === 'loading' && (\n <>\n <Loader2 className=\"mly-size-4 mly-animate-spin mly-stroke-[2.5]\" />\n <span>Loading image...</span>\n </>\n )}\n {status === 'error' && (\n <>\n <Ban className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Error loading image</span>\n </>\n )}\n {status === 'variable' && (\n <>\n <BracesIcon className=\"mly-size-4 mly-stroke-[2.5]\" />\n <span>Variable Image URL</span>\n </>\n )}\n </div>\n );\n}\n","import { DEFAULT_LOGO_SIZE } from '@/editor/nodes/logo/logo';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useImageState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: ({ editor }) => {\n return {\n width: editor.getAttributes('image').width,\n height: editor.getAttributes('image').height,\n isImageActive: editor.isActive('image'),\n isLogoActive: editor.isActive('logo'),\n alignment:\n editor.getAttributes('image')?.alignment ||\n editor.getAttributes('logo')?.alignment,\n\n logoSize: editor.getAttributes('logo')?.size || DEFAULT_LOGO_SIZE,\n imageSrc:\n editor.getAttributes('image')?.src ||\n editor.getAttributes('logo')?.src ||\n '',\n isSrcVariable:\n editor.getAttributes('image')?.isSrcVariable ??\n editor.getAttributes('logo')?.isSrcVariable ??\n false,\n imageExternalLink: editor.getAttributes('image')?.externalLink || '',\n isExternalLinkVariable:\n editor.getAttributes('image')?.isExternalLinkVariable,\n\n currentShowIfKey:\n editor.getAttributes('image')?.showIfKey ||\n editor.getAttributes('logo')?.showIfKey ||\n '',\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { deleteNode } from '@/editor/utils/delete-node';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { BubbleMenu, findChildren } from '@tiptap/react';\nimport { ChevronUp, Trash } from 'lucide-react';\nimport { useCallback } from 'react';\nimport { sticky } from 'tippy.js';\nimport { getRenderContainer } from '../../utils/get-render-container';\nimport { AlignmentSwitch } from '../alignment-switch';\nimport { BaseButton } from '../base-button';\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { ColumnsBubbleMenuContent } from '../column-menu/columns-bubble-menu-content';\nimport { BorderColor } from '../icons/border-color';\nimport { MarginIcon } from '../icons/margin-icon';\nimport { PaddingIcon } from '../icons/padding-icon';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { ShowPopover } from '../show-popover';\nimport { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu';\nimport { ColorPicker } from '../ui/color-picker';\nimport { Divider } from '../ui/divider';\nimport { Select } from '../ui/select';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { useSectionState } from './use-section-state';\nimport { getClosestNodeByName } from '@/editor/utils/columns';\n\nexport function SectionBubbleMenu(props: EditorBubbleMenuProps) {\n const { appendTo, editor } = props;\n if (!editor) {\n return null;\n }\n\n const getReferenceClientRect = useCallback(() => {\n const renderContainer = getRenderContainer(editor!, 'section');\n const rect =\n renderContainer?.getBoundingClientRect() ||\n new DOMRect(-1000, -1000, 0, 0);\n\n return rect;\n }, [editor]);\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => {\n const activeSectionNode = getClosestNodeByName(editor, 'section');\n const forNodeChildren = activeSectionNode\n ? findChildren(activeSectionNode?.node, (node) => {\n return node.type.name === 'for';\n })?.[0]\n : null;\n const hasActiveForNodeChildren =\n forNodeChildren && editor.isActive('for');\n\n if (isTextSelected(editor) || hasActiveForNodeChildren) {\n return false;\n }\n\n return editor.isActive('section');\n },\n tippyOptions: {\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n appendTo: () => appendTo?.current,\n plugins: [sticky],\n sticky: 'popper',\n maxWidth: 'auto',\n },\n pluginKey: 'sectionBubbleMenu',\n };\n\n const state = useSectionState(editor);\n\n const borderRadiusOptions = [\n { value: '0', label: 'Sharp' },\n { value: '6', label: 'Smooth' },\n { value: '9999', label: 'Round' },\n ];\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-items-stretch mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n <AlignmentSwitch\n alignment={state.currentAlignment}\n onAlignmentChange={(alignment) => {\n editor?.commands?.updateSection({\n align: alignment,\n });\n }}\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <Select\n label=\"Border Radius\"\n value={String(state.currentBorderRadius)}\n options={borderRadiusOptions}\n onValueChange={(value) => {\n editor?.commands?.updateSection({\n borderRadius: Number(value),\n });\n }}\n tooltip=\"Border Radius\"\n className=\"mly-capitalize\"\n />\n\n <Select\n label=\"Border Width\"\n value={String(state.currentBorderWidth)}\n options={[\n { value: '0', label: 'None' },\n { value: '1', label: 'Thin' },\n { value: '2', label: 'Medium' },\n { value: '3', label: 'Thick' },\n ]}\n onValueChange={(value) => {\n editor?.commands?.updateSection({\n borderWidth: Number(value),\n });\n }}\n tooltip=\"Border Width\"\n className=\"mly-capitalize\"\n />\n </div>\n\n <Divider />\n\n <Select\n icon={MarginIcon}\n iconClassName=\"mly-stroke-[1.2] mly-size-3.5\"\n label=\"Margin\"\n value={String(state.currentMarginTop)}\n options={[\n { value: '0', label: 'None' },\n { value: '4', label: 'Small' },\n { value: '8', label: 'Medium' },\n { value: '12', label: 'Large' },\n ]}\n onValueChange={(_value) => {\n const value = Number(_value);\n editor?.commands?.updateSection({\n marginTop: value,\n marginRight: value,\n marginBottom: value,\n marginLeft: value,\n });\n }}\n tooltip=\"Margin\"\n className=\"mly-capitalize\"\n />\n\n <Divider />\n\n <Select\n icon={PaddingIcon}\n iconClassName=\"mly-stroke-[1]\"\n label=\"Padding\"\n value={String(state.currentPaddingTop)}\n options={[\n { value: '0', label: 'None' },\n { value: '4', label: 'Small' },\n { value: '8', label: 'Medium' },\n { value: '12', label: 'Large' },\n ]}\n onValueChange={(_value) => {\n const value = Number(_value);\n editor?.commands?.updateSection({\n paddingTop: value,\n paddingRight: value,\n paddingBottom: value,\n paddingLeft: value,\n });\n }}\n tooltip=\"Padding\"\n className=\"mly-capitalize\"\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <ColorPicker\n color={state.currentBorderColor}\n onColorChange={(color) => {\n editor?.commands?.updateSection({\n borderColor: color,\n });\n }}\n tooltip=\"Border Color\"\n >\n <BaseButton\n variant=\"ghost\"\n className=\"!mly-size-7 mly-shrink-0\"\n size=\"sm\"\n type=\"button\"\n >\n <BorderColor\n className=\"mly-size-3 mly-shrink-0\"\n topBarClassName=\"mly-stroke-midnight-gray\"\n style={{\n color: state.currentBorderColor,\n }}\n />\n </BaseButton>\n </ColorPicker>\n <ColorPicker\n color={state.currentBackgroundColor}\n onColorChange={(color) => {\n editor?.commands?.updateSection({\n backgroundColor: color,\n });\n }}\n backgroundColor={state.currentBackgroundColor}\n tooltip=\"Background Color\"\n className=\"mly-rounded-full mly-border-[1.5px] mly-border-white mly-shadow\"\n />\n </div>\n\n <Divider />\n\n <BubbleMenuButton\n icon={Trash}\n tooltip=\"Delete Section\"\n command={() => {\n deleteNode(editor, 'section');\n }}\n />\n\n <Divider />\n\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.updateSection({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n\n {state.isColumnsActive && (\n <>\n <Divider />\n <Popover>\n <PopoverTrigger className=\"mly-flex mly-items-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray\">\n Column\n <ChevronUp className=\"mly-h-3 mly-w-3\" />\n </PopoverTrigger>\n <PopoverContent\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n side=\"top\"\n sideOffset={8}\n align=\"end\"\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <ColumnsBubbleMenuContent editor={editor} />\n </PopoverContent>\n </Popover>\n </>\n )}\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function BorderColor(\n props: SVGProps<SVGSVGElement> & { topBarClassName?: string }\n) {\n const { topBarClassName, ...rest } = props;\n\n return (\n <svg\n width={11}\n height={12}\n viewBox=\"0 0 11 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path d=\"M0 11H10.6667\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M0.666504 9V6.33333C0.666504 3.38781 3.05432 1 5.99984 1H10.6665\"\n strokeWidth=\"1.5\"\n className={topBarClassName}\n />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function MarginIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={12}\n height={12}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M10.5 10.499V1.49902M1.5 10.499V1.49902M4.5 5.99902C4.5 5.53308 4.5 5.30011 4.57612 5.11634C4.67761 4.87131 4.87229 4.67664 5.11732 4.57514C5.30109 4.49902 5.53406 4.49902 6 4.49902C6.46594 4.49902 6.69891 4.49902 6.88268 4.57514C7.12771 4.67664 7.32239 4.87131 7.42388 5.11634C7.5 5.30011 7.5 5.53308 7.5 5.99902C7.5 6.46496 7.5 6.69794 7.42388 6.88171C7.32239 7.12673 7.12771 7.32141 6.88268 7.4229C6.69891 7.49902 6.46594 7.49902 6 7.49902C5.53406 7.49902 5.30109 7.49902 5.11732 7.4229C4.87229 7.32141 4.67761 7.12673 4.57612 6.88171C4.5 6.69794 4.5 6.46496 4.5 5.99902Z\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { SVGProps } from 'react';\n\nexport function PaddingIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={10}\n height={10}\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.50244 0.501526L9.10244 0.501526C8.54239 0.501526 8.26236 0.501526 8.04845 0.610519C7.86029 0.706392 7.70731 0.859373 7.61144 1.04754C7.50244 1.26145 7.50244 1.54147 7.50244 2.10153V7.90153C7.50244 8.46158 7.50244 8.74161 7.61144 8.95552C7.70731 9.14368 7.86029 9.29666 8.04845 9.39253C8.26236 9.50153 8.54239 9.50153 9.10244 9.50153H9.50244M0.502441 0.501527L0.902441 0.501527C1.46249 0.501527 1.74252 0.501527 1.95643 0.61052C2.14459 0.706393 2.29757 0.859374 2.39345 1.04754C2.50244 1.26145 2.50244 1.54147 2.50244 2.10153L2.50244 7.90153C2.50244 8.46158 2.50244 8.74161 2.39345 8.95552C2.29757 9.14368 2.14459 9.29666 1.95643 9.39253C1.74252 9.50153 1.46249 9.50153 0.902442 9.50153H0.502442M4.99994 7.99903V1.99903\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","'use client';\n\nimport { HexColorPicker, HexColorInput } from 'react-colorful';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { BaseButton } from '../base-button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { ReactNode } from 'react';\n\ntype ColorPickerProps = {\n color: string;\n onColorChange: (color: string) => void;\n\n borderColor?: string;\n backgroundColor?: string;\n tooltip?: string;\n className?: string;\n\n children?: ReactNode;\n onClose?: (color: string) => void;\n suggestedColors?: string[];\n};\n\nexport function ColorPicker(props: ColorPickerProps) {\n const {\n color,\n onColorChange,\n borderColor,\n backgroundColor,\n tooltip,\n className,\n\n children,\n onClose,\n\n suggestedColors = [],\n } = props;\n\n const handleColorChange = (color: string) => {\n // HACK: This is a workaround for a bug in tiptap\n // https://github.com/ueberdosis/tiptap/issues/3580\n //\n // ERROR: flushSync was called from inside a lifecycle\n //\n // To fix this, we need to make sure that the onChange\n // callback is run after the current execution context.\n queueMicrotask(() => {\n onColorChange(color);\n });\n };\n\n const popoverButton = (\n <PopoverTrigger asChild>\n {children || (\n <BaseButton\n variant=\"ghost\"\n className=\"!mly-size-7 mly-shrink-0\"\n size=\"sm\"\n type=\"button\"\n >\n <div\n className={cn(\n 'mly-h-4 mly-w-4 mly-shrink-0 mly-rounded mly-border-2 mly-border-gray-700',\n className\n )}\n style={{\n ...(borderColor ? { borderColor } : {}),\n backgroundColor: backgroundColor || 'transparent',\n }}\n />\n </BaseButton>\n )}\n </PopoverTrigger>\n );\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (!open) {\n onClose?.(color);\n }\n }}\n >\n {tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{popoverButton}</TooltipTrigger>\n <TooltipContent sideOffset={8}>{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n popoverButton\n )}\n\n <PopoverContent\n className=\"mly-w-full mly-rounded-none mly-border-0 !mly-bg-transparent !mly-p-0 mly-shadow-none mly-drop-shadow-md\"\n sideOffset={8}\n >\n <div className=\"mly-min-w-[260px] mly-rounded-xl mly-border mly-bg-white mly-p-4\">\n <HexColorPicker\n color={color}\n onChange={handleColorChange}\n className=\"mly-flex !mly-w-full mly-flex-col mly-gap-4\"\n />\n <HexColorInput\n alpha={true}\n color={color}\n onChange={handleColorChange}\n className=\"mly-mt-4 mly-w-full mly-min-w-0 mly-rounded-lg mly-border mly-px-2 mly-py-1.5 mly-text-sm mly-uppercase focus-visible:mly-border-gray-400 focus-visible:mly-outline-none\"\n prefixed\n />\n\n {suggestedColors.length > 0 && (\n <div>\n <div className=\"-mly-mx-4 mly-my-4 mly-h-px mly-bg-gray-200\" />\n\n <h2 className=\"mly-text-xs mly-text-gray-500\">Recently used</h2>\n\n <div className=\"mly-mt-2 mly-flex mly-flex-wrap mly-gap-0.5\">\n {suggestedColors.map((suggestedColor) => (\n <BaseButton\n key={suggestedColor}\n variant=\"ghost\"\n size=\"sm\"\n className=\"!mly-size-7 mly-shrink-0\"\n type=\"button\"\n onClick={() => handleColorChange(suggestedColor)}\n >\n <div\n className=\"mly-h-4 mly-w-4 mly-shrink-0 mly-rounded\"\n style={{\n backgroundColor: suggestedColor,\n }}\n />\n </BaseButton>\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import {\n DEFAULT_SECTION_BACKGROUND_COLOR,\n DEFAULT_SECTION_BORDER_COLOR,\n} from '@/editor/nodes/section/section';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useSectionState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n currentAlignment: ctx.editor.getAttributes('section')?.align || 'left',\n\n currentBorderRadius:\n Number(ctx.editor.getAttributes('section')?.borderRadius) || 0,\n currentBackgroundColor:\n ctx.editor.getAttributes('section')?.backgroundColor ||\n DEFAULT_SECTION_BACKGROUND_COLOR,\n\n currentBorderColor:\n ctx.editor.getAttributes('section')?.borderColor ||\n DEFAULT_SECTION_BORDER_COLOR,\n currentBorderWidth:\n Number(ctx.editor.getAttributes('section')?.borderWidth) || 0,\n\n currentMarginTop:\n Number(ctx.editor.getAttributes('section')?.marginTop) || 0,\n currentMarginRight:\n Number(ctx.editor.getAttributes('section')?.marginRight) || 0,\n currentMarginBottom:\n Number(ctx.editor.getAttributes('section')?.marginBottom) || 0,\n currentMarginLeft:\n Number(ctx.editor.getAttributes('section')?.marginLeft) || 0,\n\n currentPaddingTop:\n Number(ctx.editor.getAttributes('section')?.paddingTop) || 0,\n currentPaddingRight:\n Number(ctx.editor.getAttributes('section')?.paddingRight) || 0,\n currentPaddingBottom:\n Number(ctx.editor.getAttributes('section')?.paddingBottom) || 0,\n currentPaddingLeft:\n Number(ctx.editor.getAttributes('section')?.paddingLeft) || 0,\n\n isColumnsActive: ctx.editor.isActive('columns'),\n\n currentShowIfKey: ctx.editor.getAttributes('section')?.showIfKey || '',\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { BubbleMenu } from '@tiptap/react';\n\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { allowedSpacerSize } from '../../nodes/spacer';\nimport {\n BubbleMenuItem,\n EditorBubbleMenuProps,\n} from '../text-menu/text-bubble-menu';\nimport { Divider } from '../ui/divider';\nimport { useSpacerState } from './use-spacer-state';\nimport { ShowPopover } from '../show-popover';\nimport { TooltipProvider } from '../ui/tooltip';\n\nexport function SpacerBubbleMenu(props: EditorBubbleMenuProps) {\n const { editor, appendTo } = props;\n if (!editor) {\n return null;\n }\n\n const items: BubbleMenuItem[] = allowedSpacerSize.map((height) => ({\n name: height,\n isActive: () => editor?.isActive('spacer', { height })!,\n command: () => {\n editor?.chain().focus().setSpacer({ height }).run();\n },\n }));\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n shouldShow: ({ editor }) => editor.isActive('spacer'),\n tippyOptions: {\n maxWidth: '100%',\n moveTransition: 'mly-transform 0.15s mly-ease-out',\n },\n };\n\n const state = useSpacerState(editor);\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-gap-0.5 mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n {items.map((item, index) => (\n <BubbleMenuButton\n key={index}\n className=\"!mly-h-7 mly-w-7 mly-shrink-0 mly-p-0\"\n iconClassName=\"mly-w-3 mly-h-3\"\n nameClassName=\"mly-text-xs\"\n {...item}\n />\n ))}\n <Divider />\n <ShowPopover\n showIfKey={state.currentShowIfKey}\n onShowIfKeyValueChange={(value) => {\n editor.commands.setSpacerShowIfKey(value);\n }}\n editor={editor}\n />\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from './section/section';\n\nexport const allowedSpacerSize = ['sm', 'md', 'lg', 'xl'] as const;\nexport type AllowedSpacerSize = (typeof allowedSpacerSize)[number];\n\nexport interface SpacerOptions {\n height: AllowedSpacerSize;\n showIfKey: string;\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n spacer: {\n setSpacer: (options: { height: AllowedSpacerSize }) => ReturnType;\n setSpacerSize: (height: AllowedSpacerSize) => ReturnType;\n setSpacerShowIfKey: (showIfKey: string) => ReturnType;\n unsetSpacer: () => ReturnType;\n };\n }\n}\n\nconst DEFAULT_HEIGHT: AllowedSpacerSize = 'sm';\n\nfunction getHeightStyle(height: AllowedSpacerSize): string {\n const heights = { sm: '8px', md: '16px', lg: '32px', xl: '64px' };\n\n return `width: 100%; height: ${heights[height] || heights[DEFAULT_HEIGHT]}`;\n}\n\nexport const Spacer = Node.create<SpacerOptions>({\n name: 'spacer',\n priority: 1000,\n\n group: 'block',\n draggable: true,\n addAttributes() {\n return {\n height: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-height'),\n renderHTML: (attributes) => {\n return {\n 'data-height': attributes.height,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setSpacer:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n height: options.height,\n },\n });\n },\n\n setSpacerSize:\n (height) =>\n ({ commands }) => {\n if (!allowedSpacerSize.includes(height)) {\n throw new Error('Invalid spacer height');\n }\n return commands.updateAttributes('spacer', { height });\n },\n\n setSpacerShowIfKey:\n (showIfKey) =>\n ({ commands }) => {\n return commands.updateAttributes('spacer', { showIfKey });\n },\n\n unsetSpacer:\n () =>\n ({ commands }) => {\n return commands.deleteNode('spacer');\n },\n };\n },\n renderHTML({ HTMLAttributes, node }) {\n const { height } = node.attrs as SpacerOptions;\n HTMLAttributes.style = getHeightStyle(height);\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n this.options.HTMLAttributes,\n HTMLAttributes,\n {\n class: 'spacer mly-relative mly-z-50',\n contenteditable: false,\n }\n ),\n ];\n },\n parseHTML() {\n return [{ tag: `div[data-maily-component=\"${this.name}\"]` }];\n },\n});\n","import { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const useSpacerState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n currentShowIfKey: ctx.editor.getAttributes('spacer')?.showIfKey || '',\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { BubbleMenu, BubbleMenuProps } from '@tiptap/react';\nimport {\n BoldIcon,\n CodeIcon,\n ItalicIcon,\n List,\n ListOrdered,\n LucideIcon,\n StrikethroughIcon,\n UnderlineIcon,\n} from 'lucide-react';\nimport { BubbleMenuButton } from '../bubble-menu-button';\nimport { ColorPicker } from '../ui/color-picker';\nimport { BaseButton } from '../base-button';\nimport { useTextMenuState } from './use-text-menu-state';\nimport { isCustomNodeSelected } from '@/editor/utils/is-custom-node-selected';\nimport { isTextSelected } from '@/editor/utils/is-text-selected';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { LinkInputPopover } from '../ui/link-input-popover';\nimport { Divider } from '../ui/divider';\nimport { AlignmentSwitch } from '../alignment-switch';\nimport { SVGIcon } from '../icons/grid-lines';\nimport { SectionExtension } from '@/editor/nodes/section/section';\nimport { ColumnExtension } from '@/editor/nodes/columns/column';\nimport { ColumnsExtension } from '@/editor/nodes/columns/columns';\nimport { ForExtension } from '@/editor/nodes/for/for';\nimport { TurnIntoBlock } from './turn-into-block';\nimport { useTurnIntoBlockOptions } from './use-turn-into-block-options';\n\nexport interface BubbleMenuItem {\n name?: string;\n isActive?: () => boolean;\n command?: () => void;\n shouldShow?: () => boolean;\n icon?: LucideIcon | SVGIcon;\n className?: string;\n iconClassName?: string;\n nameClassName?: string;\n disbabled?: boolean;\n\n tooltip?: string;\n}\n\nexport type EditorBubbleMenuProps = Omit<BubbleMenuProps, 'children'> & {\n appendTo?: React.RefObject<any>;\n};\n\nexport function TextBubbleMenu(props: EditorBubbleMenuProps) {\n const { editor, appendTo } = props;\n\n if (!editor) {\n return null;\n }\n\n const items: BubbleMenuItem[] = [\n {\n name: 'bold',\n isActive: () => editor?.isActive('bold')!,\n command: () => editor?.chain().focus().toggleBold().run()!,\n icon: BoldIcon,\n tooltip: 'Bold',\n },\n {\n name: 'italic',\n isActive: () => editor?.isActive('italic')!,\n command: () => editor?.chain().focus().toggleItalic().run()!,\n icon: ItalicIcon,\n tooltip: 'Italic',\n },\n {\n name: 'underline',\n isActive: () => editor?.isActive('underline')!,\n command: () => editor?.chain().focus().toggleUnderline().run()!,\n icon: UnderlineIcon,\n tooltip: 'Underline',\n },\n {\n name: 'strike',\n isActive: () => editor?.isActive('strike')!,\n command: () => editor?.chain().focus().toggleStrike().run()!,\n icon: StrikethroughIcon,\n tooltip: 'Strikethrough',\n },\n {\n name: 'code',\n isActive: () => editor?.isActive('code')!,\n command: () => editor?.chain().focus().toggleCode().run()!,\n icon: CodeIcon,\n tooltip: 'Code',\n },\n ];\n\n const bubbleMenuProps: EditorBubbleMenuProps = {\n ...props,\n ...(appendTo ? { appendTo: appendTo.current } : {}),\n pluginKey: 'textMenu',\n shouldShow: ({ editor, from, view }) => {\n if (!view || editor.view.dragging) {\n return false;\n }\n\n const domAtPos = view.domAtPos(from || 0).node as HTMLElement;\n const nodeDOM = view.nodeDOM(from || 0) as HTMLElement;\n const node = nodeDOM || domAtPos;\n\n if (isCustomNodeSelected(editor, node)) {\n return false;\n }\n\n const nestedNodes = [\n ForExtension.name,\n SectionExtension.name,\n ColumnsExtension.name,\n ColumnExtension.name,\n ];\n\n const isNestedNodeSelected =\n nestedNodes.some((name) => editor.isActive(name)) &&\n node?.classList?.contains('ProseMirror-selectednode');\n return isTextSelected(editor) && !isNestedNodeSelected;\n },\n tippyOptions: {\n popperOptions: {\n placement: 'top-start',\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n boundary: 'viewport',\n padding: 8,\n },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: ['bottom-start', 'top-end', 'bottom-end'],\n },\n },\n ],\n },\n maxWidth: '100%',\n },\n };\n\n const state = useTextMenuState(editor);\n const turnIntoBlockOptions = useTurnIntoBlockOptions(editor);\n const colors = editor?.storage.color.colors as Set<string>;\n const suggestedColors = Array?.from(colors)?.reverse()?.slice(0, 6) ?? [];\n\n return (\n <BubbleMenu\n {...bubbleMenuProps}\n className=\"mly-flex mly-gap-0.5 mly-rounded-lg mly-border mly-border-slate-200 mly-bg-white mly-p-0.5 mly-shadow-md\"\n >\n <TooltipProvider>\n <TurnIntoBlock options={turnIntoBlockOptions} />\n\n <Divider className=\"mly-mx-0\" />\n\n {items.map((item, index) => (\n <BubbleMenuButton key={index} {...item} />\n ))}\n\n <AlignmentSwitch\n alignment={state.textAlign}\n onAlignmentChange={(alignment) => {\n editor?.chain().focus().setTextAlign(alignment).run();\n }}\n />\n\n {!state.isListActive && (\n <>\n <BubbleMenuButton\n icon={List}\n command={() => {\n editor.chain().focus().toggleBulletList().run();\n }}\n tooltip=\"Bullet List\"\n />\n <BubbleMenuButton\n icon={ListOrdered}\n command={() => {\n editor.chain().focus().toggleOrderedList().run();\n }}\n tooltip=\"Ordered List\"\n />\n </>\n )}\n\n <LinkInputPopover\n defaultValue={state?.linkUrl ?? ''}\n onValueChange={(value, isVariable) => {\n const defaultValueWithoutProtocol = value.replace(\n /https?:\\/\\//,\n ''\n );\n\n if (!defaultValueWithoutProtocol) {\n editor\n ?.chain()\n .focus()\n .extendMarkRange('link')\n .unsetLink()\n .unsetUnderline()\n .run();\n return;\n }\n\n editor\n ?.chain()\n .extendMarkRange('link')\n .setLink({ href: value })\n .setIsUrlVariable(isVariable ?? false)\n .setUnderline()\n .run()!;\n }}\n tooltip=\"External URL\"\n editor={editor}\n isVariable={state.isUrlVariable}\n />\n\n <Divider className=\"mly-mx-0\" />\n\n <ColorPicker\n color={state.currentTextColor}\n onColorChange={(color) => {\n editor?.chain().setColor(color).run();\n }}\n onClose={(color) => colors.add(color)}\n tooltip=\"Text Color\"\n suggestedColors={suggestedColors}\n >\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"!mly-h-7 mly-w-7 mly-shrink-0 mly-p-0\"\n >\n <div className=\"mly-flex mly-flex-col mly-items-center mly-justify-center mly-gap-[1px]\">\n <span className=\"mly-font-bolder mly-font-mono mly-text-xs mly-text-slate-700\">\n A\n </span>\n <div\n className=\"mly-h-[2px] mly-w-3\"\n style={{ backgroundColor: state.currentTextColor }}\n />\n </div>\n </BaseButton>\n </ColorPicker>\n </TooltipProvider>\n </BubbleMenu>\n );\n}\n","import { AllowedLogoAlignment } from '@/editor/nodes/logo/logo';\nimport { Editor, useEditorState } from '@tiptap/react';\nimport deepEql from 'fast-deep-equal';\n\nexport const DEFAULT_TEXT_COLOR = '#374151';\n\nexport const useTextMenuState = (editor: Editor) => {\n const states = useEditorState({\n editor,\n selector: (ctx) => {\n return {\n currentTextColor:\n ctx.editor.getAttributes('textStyle').color || DEFAULT_TEXT_COLOR,\n\n linkUrl: ctx.editor?.getAttributes('link').href,\n textAlign: (ctx.editor?.isActive({ textAlign: 'left' })\n ? 'left'\n : ctx.editor?.isActive({ textAlign: 'center' })\n ? 'center'\n : ctx.editor?.isActive({ textAlign: 'right' })\n ? 'right'\n : ctx.editor?.isActive({ textAlign: 'justify' })\n ? 'justify'\n : 'left') as AllowedLogoAlignment,\n\n isListActive:\n ctx.editor.isActive('bulletList') ||\n ctx.editor.isActive('orderedList'),\n isUrlVariable: ctx.editor.getAttributes('link').isUrlVariable ?? false,\n };\n },\n equalityFn: deepEql,\n });\n\n return states;\n};\n","import { InputRule } from '@tiptap/core';\nimport { HorizontalRule as TipTapHorizontalRule } from '@tiptap/extension-horizontal-rule';\n\nexport const HorizontalRule = TipTapHorizontalRule.extend({\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n handler: ({ state, range }) => {\n const attributes = {};\n\n const { tr } = state;\n const start = range.from;\n const end = range.to;\n\n tr.insert(start - 1, this.type.create(attributes)).delete(\n tr.mapping.map(start),\n tr.mapping.map(end)\n );\n },\n }),\n ];\n },\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n };\n },\n});\n","import { Editor } from '@tiptap/core';\nimport { HorizontalRule } from '../extensions/horizontal-rule';\nimport Image from '@tiptap/extension-image';\nimport { Spacer } from '../nodes/spacer';\nimport { LinkCardExtension } from '../extensions/link-card';\nimport { ButtonExtension } from '../nodes/button/button';\nimport { VariableExtension } from '../nodes/variable/variable';\nimport { ImageExtension } from '../nodes/image/image';\nimport { LogoExtension } from '../nodes/logo/logo';\n\nexport const isCustomNodeSelected = (editor: Editor, node: HTMLElement) => {\n const customNodes = [\n HorizontalRule.name,\n Image.name,\n Spacer.name,\n ImageExtension.name,\n VariableExtension.name,\n LinkCardExtension.name,\n LogoExtension.name,\n ButtonExtension.name,\n ];\n\n return customNodes.some((type) => editor.isActive(type));\n};\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { LinkCardComponent } from '../nodes/link-card';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n linkCard: {\n setLinkCard: () => ReturnType;\n };\n }\n}\n\nexport const LinkCardExtension = Node.create({\n name: 'linkCard',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n mailyComponent: {\n default: 'linkCard',\n },\n title: {\n default: '',\n },\n description: {\n default: '',\n },\n link: {\n default: '',\n },\n linkTitle: {\n default: '',\n },\n image: {\n default: '',\n },\n subTitle: {\n default: '',\n },\n badgeText: {\n default: '',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `a[data-maily-component=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n {\n 'data-maily-component': this.name,\n },\n HTMLAttributes\n ),\n ];\n },\n\n addCommands() {\n return {\n setLinkCard:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n mailyComponent: this.name,\n },\n });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(LinkCardComponent, {\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport { Input } from '../components/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../components/popover';\nimport { Textarea } from '../components/textarea';\nimport { cn } from '../utils/classname';\n\nexport function LinkCardComponent(props: NodeViewProps) {\n const { title, description, link, linkTitle, image, badgeText, subTitle } =\n props.node.attrs;\n const { getPos, editor } = props;\n\n return (\n <NodeViewWrapper\n className={`react-component ${\n props.selected && 'ProseMirror-selectednode'\n }`}\n draggable=\"true\"\n data-drag-handle=\"\"\n >\n <Popover open={props.selected}>\n <PopoverTrigger asChild>\n <div\n tabIndex={-1}\n onClick={(e) => {\n e.preventDefault();\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n <div className=\"mly-no-prose mly-flex mly-flex-col mly-rounded-lg mly-border mly-border-gray-300\">\n {image && (\n <div className=\"mly-relative mly-mb-1.5 mly-w-full mly-shrink-0\">\n <img\n src={image}\n alt=\"link-card\"\n className=\"mly-no-prose !mly-mb-0 mly-h-full mly-w-full mly-rounded-t-lg\"\n />\n </div>\n )}\n <div className=\"mly-flex mly-items-stretch mly-p-3\">\n <div className={cn('mly-flex mly-flex-col')}>\n <div className=\"!mly-mb-1.5 mly-flex mly-items-center mly-gap-1.5\">\n <h2 className=\"!mly-mb-0 !mly-text-lg mly-font-semibold\">\n {title}\n </h2>\n {badgeText && (\n <span className=\"!mly-font-base text-xs mly-rounded-md mly-bg-yellow-200 mly-px-2 mly-py-1 mly-font-semibold mly-leading-none\">\n {badgeText}\n </span>\n )}{' '}\n {subTitle && !badgeText && (\n <span className=\"!mly-font-base text-xs mly-font-regular mly-rounded-md mly-leading-none mly-text-gray-400\">\n {subTitle}\n </span>\n )}\n </div>\n <p className=\"!mly-my-0 !mly-text-base mly-text-gray-500\">\n {description}{' '}\n {linkTitle ? (\n <a href={link} className=\"mly-font-semibold\">\n {linkTitle}\n </a>\n ) : null}\n </p>\n </div>\n </div>\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"mly-flex mly-w-96 mly-flex-col mly-gap-2\"\n sideOffset={10}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Image\n </span>\n <Input\n placeholder=\"Add Image\"\n type=\"url\"\n value={image}\n onChange={(e) => {\n props.updateAttributes({\n image: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Title\n </span>\n <Input\n placeholder=\"Add title\"\n value={title}\n onChange={(e) => {\n props.updateAttributes({\n title: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Description\n </span>\n <Textarea\n placeholder=\"Add description here\"\n value={description}\n onChange={(e) => {\n props.updateAttributes({\n description: e.target.value,\n });\n }}\n />\n </label>\n\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-2\">\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Link Title\n </span>\n <Input\n placeholder=\"Add link title here\"\n value={linkTitle}\n onChange={(e) => {\n props.updateAttributes({\n linkTitle: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Link\n </span>\n <Input\n placeholder=\"Add link here\"\n value={link}\n onChange={(e) => {\n props.updateAttributes({\n link: e.target.value,\n });\n }}\n />\n </label>\n </div>\n\n <div className=\"mly-grid mly-grid-cols-2 mly-gap-2\">\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Badge Text\n </span>\n <Input\n placeholder=\"Add badge text here\"\n value={badgeText}\n onChange={(e) => {\n props.updateAttributes({\n badgeText: e.target.value,\n });\n }}\n />\n </label>\n\n <label className=\"mly-w-full mly-space-y-1\">\n <span className=\"mly-text-xs mly-font-normal mly-text-slate-400\">\n Sub Title\n </span>\n <Input\n placeholder=\"Add sub title here\"\n value={subTitle}\n onChange={(e) => {\n props.updateAttributes({\n subTitle: e.target.value,\n });\n }}\n />\n </label>\n </div>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\nimport { AUTOCOMPLETE_PASSWORD_MANAGERS_OFF } from '../utils/constants';\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n {...AUTOCOMPLETE_PASSWORD_MANAGERS_OFF}\n type={type}\n className={cn(\n 'mly-flex mly-h-10 mly-w-full mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-3 mly-py-2 mly-text-sm mly-ring-offset-white file:mly-border-0 file:mly-bg-transparent file:mly-text-sm file:mly-font-medium placeholder:mly-text-gray-500 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-cursor-not-allowed disabled:mly-opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\n\nimport { cn } from '../utils/classname';\n\nexport interface TextAreaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextAreaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'mly-flex mly-min-h-24 mly-w-full mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-px-3 mly-py-2 mly-text-sm mly-ring-offset-white file:mly-border-0 file:mly-bg-transparent file:mly-text-sm file:mly-font-medium placeholder:mly-text-gray-500 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-cursor-not-allowed disabled:mly-opacity-50',\n 'mly-editor',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { ButtonView } from './button-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { AllowedLogoAlignment } from '../logo/logo';\n\nexport const DEFAULT_BUTTON_ALIGNMENT: AllowedLogoAlignment = 'left';\nexport const DEFAULT_BUTTON_VARIANT: AllowedButtonVariant = 'filled';\nexport const DEFAULT_BUTTON_BORDER_RADIUS: AllowedButtonBorderRadius = 'smooth';\nexport const DEFAULT_BUTTON_BACKGROUND_COLOR = '#000000';\nexport const DEFAULT_BUTTON_TEXT_COLOR = '#ffffff';\n\nexport const allowedButtonVariant = ['filled', 'outline'] as const;\nexport type AllowedButtonVariant = (typeof allowedButtonVariant)[number];\n\nexport const allowedButtonBorderRadius = ['sharp', 'smooth', 'round'] as const;\nexport type AllowedButtonBorderRadius =\n (typeof allowedButtonBorderRadius)[number];\n\ntype ButtonAttributes = {\n text: string;\n url: string;\n alignment: AllowedLogoAlignment;\n variant: AllowedButtonVariant;\n borderRadius: AllowedButtonBorderRadius;\n buttonColor: string;\n textColor: string;\n\n showIfKey: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n button: {\n setButton: () => ReturnType;\n updateButton: (attrs: Partial<ButtonAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ButtonExtension = Node.create({\n name: 'button',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n text: {\n default: 'Button',\n parseHTML: (element) => {\n return element.getAttribute('data-text') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-text': attributes.text,\n };\n },\n },\n isTextVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-text-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isTextVariable) {\n return {};\n }\n\n return {\n 'data-is-text-variable': 'true',\n };\n },\n },\n\n url: {\n default: '',\n parseHTML: (element) => {\n return element.getAttribute('data-url') || '';\n },\n renderHTML: (attributes) => {\n return {\n 'data-url': attributes.url,\n };\n },\n },\n // Later we will remove this attribute\n // and use the `url` attribute instead when implement\n // the URL variable feature\n isUrlVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-url-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isUrlVariable) {\n return {};\n }\n\n return {\n 'data-is-url-variable': 'true',\n };\n },\n },\n\n alignment: {\n default: DEFAULT_BUTTON_ALIGNMENT,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-alignment') || DEFAULT_BUTTON_ALIGNMENT\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-alignment': attributes.alignment,\n };\n },\n },\n variant: {\n default: DEFAULT_BUTTON_VARIANT,\n parseHTML: (element) => {\n return element.getAttribute('data-variant') || DEFAULT_BUTTON_VARIANT;\n },\n renderHTML: (attributes) => {\n return {\n 'data-variant': attributes.variant,\n };\n },\n },\n borderRadius: {\n default: DEFAULT_BUTTON_BORDER_RADIUS,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-border-radius') ||\n DEFAULT_BUTTON_BORDER_RADIUS\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-border-radius': attributes.borderRadius,\n };\n },\n },\n buttonColor: {\n default: DEFAULT_BUTTON_BACKGROUND_COLOR,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-button-color') ||\n DEFAULT_BUTTON_BACKGROUND_COLOR\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-button-color': attributes.buttonColor,\n };\n },\n },\n textColor: {\n default: DEFAULT_BUTTON_TEXT_COLOR,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-text-color') || DEFAULT_BUTTON_TEXT_COLOR\n );\n },\n renderHTML: (attributes) => {\n return {\n 'data-text-color': attributes.textColor,\n };\n },\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n ];\n },\n\n addCommands() {\n return {\n setButton:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [],\n });\n },\n updateButton: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ButtonView, {\n contentDOMElementTag: 'div',\n className: 'mly-relative',\n });\n },\n});\n","import { AlignmentSwitch } from '@/editor/components/alignment-switch';\nimport { BaseButton } from '@/editor/components/base-button';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@/editor/components/popover';\nimport { ColorPicker } from '@/editor/components/ui/color-picker';\nimport { Divider } from '@/editor/components/ui/divider';\nimport { LinkInputPopover } from '@/editor/components/ui/link-input-popover';\nimport { Select } from '@/editor/components/ui/select';\nimport { TooltipProvider } from '@/editor/components/ui/tooltip';\nimport { cn } from '@/editor/utils/classname';\nimport { NodeViewProps, NodeViewWrapper } from '@tiptap/react';\nimport {\n allowedButtonBorderRadius,\n AllowedButtonVariant,\n allowedButtonVariant,\n} from './button';\nimport { ShowPopover } from '@/editor/components/show-popover';\nimport { ButtonLabelInput } from './button-label-input';\nimport { DEFAULT_RENDER_VARIABLE_FUNCTION } from '@/editor/provider';\nimport { useMailyContext } from '@/editor/provider';\nimport { CSSProperties } from 'react';\n\nexport function ButtonView(props: NodeViewProps) {\n const { node, editor, getPos, updateAttributes } = props;\n const {\n text,\n isTextVariable,\n alignment,\n variant,\n borderRadius: _radius,\n buttonColor,\n textColor,\n url: externalLink,\n showIfKey = '',\n isUrlVariable,\n } = node.attrs;\n\n const { renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION } =\n useMailyContext();\n\n return (\n <NodeViewWrapper\n draggable=\"true\"\n data-drag-handle=\"\"\n data-type=\"button\"\n style={{\n textAlign: alignment,\n }}\n >\n <Popover open={props.selected}>\n <PopoverTrigger asChild>\n <div>\n <button\n className={cn(\n 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors disabled:mly-pointer-events-none disabled:mly-opacity-50',\n 'mly-h-10 mly-px-4 mly-py-2',\n 'mly-px-[32px] mly-py-[20px] mly-font-semibold mly-no-underline',\n {\n '!mly-rounded-full': _radius === 'round',\n '!mly-rounded-md': _radius === 'smooth',\n '!mly-rounded-none': _radius === 'sharp',\n }\n )}\n tabIndex={-1}\n style={\n {\n backgroundColor:\n variant === 'filled' ? buttonColor : 'transparent',\n color: textColor,\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: buttonColor,\n // decrease the border color opacity to 80%\n // so that it's not too prominent\n '--button-var-border-color': `${textColor}80`,\n } as CSSProperties\n }\n onClick={(e) => {\n e.preventDefault();\n const pos = getPos();\n editor.commands.setNodeSelection(pos);\n }}\n >\n {isTextVariable\n ? renderVariable({\n variable: { name: text, valid: true },\n fallback: text,\n from: 'button-variable',\n editor,\n })\n : text}\n </button>\n </div>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n side=\"top\"\n className=\"mly-w-max mly-rounded-lg !mly-p-0.5\"\n sideOffset={8}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <TooltipProvider>\n <div className=\"mly-flex mly-items-stretch mly-text-midnight-gray\">\n <ButtonLabelInput\n value={text}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n text: value,\n isTextVariable: isVariable ?? false,\n });\n }}\n isVariable={isTextVariable}\n editor={editor}\n />\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <Select\n label=\"Border Radius\"\n value={_radius}\n options={allowedButtonBorderRadius.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n borderRadius: value,\n });\n }}\n tooltip=\"Border Radius\"\n className=\"mly-capitalize\"\n />\n\n <Select\n label=\"Style\"\n value={variant}\n options={allowedButtonVariant.map((value) => ({\n value,\n label: value,\n }))}\n onValueChange={(value) => {\n updateAttributes({\n variant: value,\n });\n }}\n tooltip=\"Style\"\n className=\"mly-capitalize\"\n />\n </div>\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <AlignmentSwitch\n alignment={alignment}\n onAlignmentChange={(alignment) => {\n updateAttributes({\n alignment,\n });\n }}\n />\n\n <LinkInputPopover\n defaultValue={externalLink || ''}\n onValueChange={(value, isVariable) => {\n updateAttributes({\n url: value,\n isUrlVariable: isVariable ?? false,\n });\n }}\n tooltip=\"Update External Link\"\n editor={editor}\n isVariable={isUrlVariable}\n />\n </div>\n\n <Divider />\n\n <div className=\"mly-flex mly-space-x-0.5\">\n <BackgroundColorPickerPopup\n variant={variant}\n color={buttonColor}\n onChange={(color) => {\n updateAttributes({\n buttonColor: color,\n });\n }}\n />\n\n <TextColorPickerPopup\n color={textColor}\n onChange={(color) => {\n updateAttributes({\n textColor: color,\n });\n }}\n />\n </div>\n\n <Divider />\n\n <ShowPopover\n showIfKey={showIfKey}\n onShowIfKeyValueChange={(value) => {\n updateAttributes({\n showIfKey: value,\n });\n }}\n editor={editor}\n />\n </div>\n </TooltipProvider>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n );\n}\n\ntype ColorPickerProps = {\n variant?: AllowedButtonVariant;\n color: string;\n onChange: (color: string) => void;\n};\n\nfunction BackgroundColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange, variant } = props;\n\n return (\n <ColorPicker\n color={color}\n onColorChange={onChange}\n tooltip=\"Background Color\"\n >\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n >\n <div\n className=\"mly-h-4 mly-w-4 mly-shrink-0 mly-rounded-full mly-shadow\"\n style={{\n backgroundColor: variant === 'filled' ? color : 'transparent',\n borderStyle: 'solid',\n borderWidth: 2,\n borderColor: variant === 'filled' ? 'white' : color,\n }}\n />\n </BaseButton>\n </ColorPicker>\n );\n}\n\nfunction TextColorPickerPopup(props: ColorPickerProps) {\n const { color, onChange } = props;\n\n return (\n <ColorPicker color={color} onColorChange={onChange} tooltip=\"Text Color\">\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className=\"mly-size-7\"\n >\n <div className=\"mly-flex mly-flex-col mly-items-center mly-justify-center mly-gap-[1px]\">\n <span className=\"mly-font-bolder mly-font-mono mly-text-xs mly-text-midnight-gray\">\n A\n </span>\n <div\n className=\"mly-h-[2px] mly-w-3 mly-shrink-0 mly-rounded-md mly-shadow\"\n style={{ backgroundColor: color }}\n />\n </div>\n </BaseButton>\n </ColorPicker>\n );\n}\n","import { InputAutocomplete } from '@/editor/components/ui/input-autocomplete';\nimport {\n DEFAULT_RENDER_VARIABLE_FUNCTION,\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n useMailyContext,\n} from '@/editor/provider';\nimport { processVariables } from '@/editor/utils/variable';\nimport { Editor } from '@tiptap/core';\nimport { BracesIcon } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useState } from 'react';\nimport { useRef } from 'react';\n\ntype ButtonLabelInputProps = {\n value: string;\n onValueChange?: (value: string, isVariable?: boolean) => void;\n isVariable?: boolean;\n\n editor: Editor;\n};\n\nexport function ButtonLabelInput(props: ButtonLabelInputProps) {\n const { value, onValueChange, isVariable, editor } = props;\n\n const linkInputRef = useRef<HTMLInputElement>(null);\n const [isEditing, setIsEditing] = useState(!isVariable);\n\n const {\n variables = [],\n variableTriggerCharacter = DEFAULT_VARIABLE_TRIGGER_CHAR,\n renderVariable = DEFAULT_RENDER_VARIABLE_FUNCTION,\n } = useMailyContext();\n\n const autoCompleteOptions = useMemo(() => {\n const withoutTrigger = value.replace(\n new RegExp(variableTriggerCharacter, 'g'),\n ''\n );\n\n return processVariables(variables, {\n query: withoutTrigger || '',\n from: 'bubble-variable',\n editor,\n }).map((variable) => variable.name);\n }, [variables, value, editor]);\n\n return (\n <div className=\"mly-isolate mly-flex mly-rounded-lg\">\n {!isEditing && (\n <button\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => {\n linkInputRef.current?.focus();\n }, 0);\n }}\n >\n {renderVariable({\n variable: {\n name: value,\n valid: true,\n },\n fallback: '',\n from: 'bubble-variable',\n editor,\n })}\n </button>\n )}\n\n {isEditing && (\n <InputAutocomplete\n value={value}\n onValueChange={(value) => {\n onValueChange?.(value);\n }}\n autoCompleteOptions={autoCompleteOptions}\n ref={linkInputRef}\n placeholder=\"maily.to/\"\n className=\"mly-h-7 mly-w-40 mly-rounded-md mly-px-2 mly-pr-6 mly-text-sm mly-text-midnight-gray hover:mly-bg-soft-gray focus:mly-bg-soft-gray focus:mly-outline-none\"\n triggerChar={variableTriggerCharacter}\n onSelectOption={(value) => {\n const isVariable = autoCompleteOptions.includes(value) ?? false;\n if (isVariable) {\n setIsEditing(false);\n }\n onValueChange?.(value, isVariable);\n }}\n />\n )}\n </div>\n );\n}\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport { PluginKey } from '@tiptap/pm/state';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport Suggestion, { SuggestionOptions } from '@tiptap/suggestion';\nimport { VariableView } from './variable-view';\n\nexport type VariableOptions = {\n HTMLAttributes: Record<string, any>;\n renderLabel: (props: {\n options: VariableOptions;\n node: ProseMirrorNode;\n }) => string;\n suggestion: Omit<SuggestionOptions, 'editor'>;\n};\n\nexport const VariablePluginKey = new PluginKey('variable');\n\nexport const VariableExtension = Node.create<VariableOptions>({\n name: 'variable',\n group: 'inline',\n inline: true,\n selectable: true,\n atom: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n renderLabel({ options, node }) {\n return `${node.attrs.label ?? node.attrs.id}`;\n },\n suggestion: {\n char: '@',\n pluginKey: VariablePluginKey,\n command: ({ editor, range, props }) => {\n // increase range.to by one when the next node is of type \"text\"\n // and starts with a space character\n const nodeAfter = editor.view.state.selection.$to.nodeAfter;\n const overrideSpace = nodeAfter?.text?.startsWith(' ');\n\n if (overrideSpace) {\n range.to += 1;\n }\n\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: this.name,\n attrs: props,\n },\n {\n type: 'text',\n text: ' ',\n },\n ])\n .run();\n\n window.getSelection()?.collapseToEnd();\n },\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from);\n const type = state.schema.nodes[this.name];\n const allow = !!$from.parent.type.contentMatch.matchType(type);\n\n return allow;\n },\n },\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-id'),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n 'data-id': attributes.id,\n };\n },\n },\n\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-label'),\n renderHTML: (attributes) => {\n if (!attributes.label) {\n return {};\n }\n\n return {\n 'data-label': attributes.label,\n };\n },\n },\n\n fallback: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-fallback'),\n renderHTML: (attributes) => {\n if (!attributes.fallback) {\n return {};\n }\n\n return {\n 'data-fallback': attributes.fallback,\n };\n },\n },\n\n required: {\n default: true,\n parseHTML: (element) => element.hasAttribute('data-required'),\n renderHTML: (attributes) => {\n return {\n 'data-required': attributes?.required ?? true,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n { 'data-type': this.name },\n this.options.HTMLAttributes,\n HTMLAttributes\n ),\n this.options.renderLabel({\n options: this.options,\n node,\n }),\n ];\n },\n\n renderText({ node }) {\n return this.options.renderLabel({\n options: this.options,\n node,\n });\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\n this.options.suggestion.char || '',\n pos,\n pos + node.nodeSize\n );\n\n return false;\n }\n });\n\n return isMention;\n }),\n };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(VariableView, {\n className: 'mly-relative mly-inline-block',\n as: 'div',\n });\n },\n});\n","import TiptapImage from '@tiptap/extension-image';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\nimport { ImageView } from './image-view';\n\nexport const ImageExtension = TiptapImage.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: 'auto',\n parseHTML: (element) => {\n const width = element.style.width;\n return width ? { width } : null;\n },\n renderHTML: ({ width }) => ({ style: `width: ${width}` }),\n },\n height: {\n default: 'auto',\n parseHTML: (element) => {\n const height = element.style.height;\n return height ? { height } : null;\n },\n renderHTML: ({ height }) => ({ style: `height: ${height}` }),\n },\n alignment: {\n default: 'center',\n renderHTML: ({ alignment }) => ({ 'data-alignment': alignment }),\n parseHTML: (element) =>\n element.getAttribute('data-alignment') || 'center',\n },\n\n externalLink: {\n default: null,\n renderHTML: ({ externalLink }) => {\n if (!externalLink) {\n return {};\n }\n return {\n 'data-external-link': externalLink,\n };\n },\n parseHTML: (element) => {\n const externalLink = element.getAttribute('data-external-link');\n return externalLink ? { externalLink } : null;\n },\n },\n\n // Later we will remove this attribute\n // and use the `externalLink` attribute instead\n // when implement the URL variable feature\n isExternalLinkVariable: {\n default: false,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-is-external-link-variable') === 'true'\n );\n },\n renderHTML: (attributes) => {\n if (!attributes.isExternalLinkVariable) {\n return {};\n }\n\n return {\n 'data-is-external-link-variable': 'true',\n };\n },\n },\n\n // Later we will remove this attribute\n // and use the `src` attribute instead when implement\n // the URL variable feature\n isSrcVariable: {\n default: false,\n parseHTML: (element) => {\n return element.getAttribute('data-is-src-variable') === 'true';\n },\n renderHTML: (attributes) => {\n if (!attributes.isSrcVariable) {\n return {};\n }\n\n return {\n 'data-is-src-variable': 'true',\n };\n },\n },\n\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ImageView, {\n className: 'mly-relative',\n });\n },\n});\n","import { goToColumn } from '@/editor/utils/columns';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { mergeAttributes } from '@tiptap/core';\nimport { Node } from '@tiptap/core';\nimport { v4 as uuid } from 'uuid';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\nexport const DEFAULT_COLUMNS_GAP = 8;\n\ninterface ColumnsAttributes {\n showIfKey: string;\n gap: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n setColumns: () => ReturnType;\n updateColumns: (attrs: Partial<ColumnsAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ColumnsExtension = Node.create({\n name: 'columns',\n group: 'columns',\n content: 'column+',\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n gap: {\n default: DEFAULT_COLUMNS_GAP,\n parseHTML: (element) => {\n return Number(element.style.gap) || DEFAULT_COLUMNS_GAP;\n },\n renderHTML(attributes) {\n if (!attributes.gap) {\n return {};\n }\n\n return {\n style: `gap: ${attributes.gap}px`,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setColumns:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'column',\n attrs: {\n columnId: uuid(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n {\n type: 'column',\n attrs: {\n columnId: uuid(),\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n },\n ],\n });\n },\n updateColumns: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'columns',\n class: 'mly-relative',\n }),\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"columns\"]',\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => {\n return goToColumn(this.editor, 'next');\n },\n 'Shift-Tab': () => {\n return goToColumn(this.editor, 'previous');\n },\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { ForView } from './for-view';\nimport { updateAttributes } from '@/editor/utils/update-attribute';\nimport { DEFAULT_SECTION_SHOW_IF_KEY } from '../section/section';\n\ntype ForAttributes = {\n each: string;\n isUpdatingKey: boolean;\n showIfKey: string;\n};\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n for: {\n setFor: () => ReturnType;\n updateFor: (attrs: Partial<ForAttributes>) => ReturnType;\n };\n }\n}\n\nexport const ForExtension = Node.create({\n name: 'for',\n group: 'block',\n content: '(block|columns)+',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n each: {\n default: 'items',\n parseHTML: (element) => {\n return element.getAttribute('each') || '';\n },\n renderHTML: (attributes) => {\n if (!attributes.each) {\n return {};\n }\n\n return {\n each: attributes.each,\n };\n },\n },\n isUpdatingKey: {\n default: false,\n },\n showIfKey: {\n default: DEFAULT_SECTION_SHOW_IF_KEY,\n parseHTML: (element) => {\n return (\n element.getAttribute('data-show-if-key') ||\n DEFAULT_SECTION_SHOW_IF_KEY\n );\n },\n renderHTML(attributes) {\n if (!attributes.showIfKey) {\n return {};\n }\n\n return {\n 'data-show-if-key': attributes.showIfKey,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': this.name,\n }),\n 0,\n ];\n },\n\n addCommands() {\n return {\n setFor:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {},\n content: [\n {\n type: 'paragraph',\n },\n ],\n });\n },\n updateFor: (attrs) => updateAttributes(this.name, attrs),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ForView, {\n contentDOMElementTag: 'div',\n className: 'mly-relative',\n });\n },\n});\n","import { NodeViewProps, NodeViewWrapper, NodeViewContent } from '@tiptap/react';\nimport { Repeat2 } from 'lucide-react';\n\nexport function ForView(props: NodeViewProps) {\n const { editor, getPos } = props;\n\n return (\n <NodeViewWrapper\n draggable=\"true\"\n data-drag-handle=\"\"\n data-type=\"for\"\n className=\"mly-relative\"\n >\n <NodeViewContent className=\"is-editable\" />\n\n <div\n role=\"button\"\n data-repeat-indicator=\"\"\n className=\"mly-absolute mly-inset-y-0 mly-right-0 mly-flex mly-translate-x-full mly-cursor-pointer mly-flex-col mly-items-center mly-gap-1 mly-opacity-60\"\n contentEditable={false}\n onClick={() => {\n editor.commands.setNodeSelection(getPos());\n }}\n >\n <Repeat2 className=\"mly-size-3 mly-stroke-[2.5] mly-text-midnight-gray\" />\n <div className=\"mly-w-[1.5px] mly-grow mly-rounded-full mly-bg-rose-300\" />\n </div>\n </NodeViewWrapper>\n );\n}\n","import { ChevronDownIcon, PilcrowIcon } from 'lucide-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport {\n TurnIntoBlockCategory,\n TurnIntoBlockOptions,\n TurnIntoOptions,\n} from './use-turn-into-block-options';\nimport { useMemo } from 'react';\nimport { BaseButton } from '../base-button';\nimport { cn } from '@/editor/utils/classname';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\ntype TurnIntoBlockProps = {\n options: TurnIntoOptions;\n};\n\nconst isOption = (\n option: TurnIntoOptions[number]\n): option is TurnIntoBlockOptions => option.type === 'option';\nconst isCategory = (\n option: TurnIntoOptions[number]\n): option is TurnIntoBlockCategory => option.type === 'category';\n\nexport function TurnIntoBlock(props: TurnIntoBlockProps) {\n const { options } = props;\n\n const activeItem = useMemo(\n () =>\n options.find((option) => option.type === 'option' && option.isActive()),\n [options]\n ) as TurnIntoBlockOptions | undefined;\n const { icon: ActiveIcon = PilcrowIcon } = activeItem || {};\n\n return (\n <Popover>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger\n className={cn(\n 'mly-flex mly-aspect-square mly-h-7 mly-items-center mly-justify-center mly-gap-1 mly-rounded-md mly-px-1.5 mly-text-sm data-[state=open]:mly-bg-soft-gray hover:mly-bg-soft-gray focus-visible:mly-relative focus-visible:mly-z-10 focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2'\n )}\n >\n <ActiveIcon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n <ChevronDownIcon className=\"mly-h-3 mly-w-3 mly-shrink-0 mly-stroke-[2.5]\" />\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent sideOffset={8}>Turn into</TooltipContent>\n </Tooltip>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={8}\n className=\"mly-flex mly-w-[160px] mly-flex-col mly-rounded-md mly-p-1\"\n >\n {options.map((option, index) => {\n if (isOption(option)) {\n return (\n <BaseButton\n key={option.id}\n onClick={option.onClick}\n variant=\"ghost\"\n className=\"mly-h-auto mly-justify-start mly-gap-2 !mly-rounded mly-px-2 mly-py-1 mly-text-sm mly-font-normal mly-text-midnight-gray\"\n >\n <option.icon className=\"mly-size-[15px] mly-shrink-0\" />\n {option.label}\n </BaseButton>\n );\n } else if (isCategory(option)) {\n return (\n <label\n key={option.id}\n className={cn(\n 'mly-px-2 mly-text-xs mly-font-medium mly-text-midnight-gray/60',\n index === 0 ? 'mly-mb-2 mly-mt-1' : 'mly-my-2'\n )}\n >\n {option.label}\n </label>\n );\n }\n })}\n </PopoverContent>\n </Popover>\n );\n}\n","import { Editor, useEditorState } from '@tiptap/react';\nimport {\n FootprintsIcon,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n ListIcon,\n ListOrderedIcon,\n LucideIcon,\n PilcrowIcon,\n} from 'lucide-react';\n\nexport type TurnIntoBlockOptions = {\n label: string;\n id: string;\n type: 'option';\n disabled: () => boolean;\n isActive: () => boolean;\n onClick: () => void;\n icon: LucideIcon;\n};\n\nexport type TurnIntoBlockCategory = {\n label: string;\n id: string;\n type: 'category';\n};\n\nexport type TurnIntoOptions = Array<\n TurnIntoBlockOptions | TurnIntoBlockCategory\n>;\n\nexport function useTurnIntoBlockOptions(editor: Editor) {\n return useEditorState({\n editor,\n selector: ({ editor }): TurnIntoOptions => [\n {\n type: 'category',\n label: 'Hierarchy',\n id: 'hierarchy',\n },\n {\n icon: PilcrowIcon,\n onClick: () =>\n editor.chain().focus().liftListItem('listItem').setParagraph().run(),\n id: 'paragraph',\n disabled: () => !editor.can().setParagraph(),\n isActive: () =>\n editor.isActive('paragraph') &&\n !editor.isActive('orderedList') &&\n !editor.isActive('bulletList') &&\n !editor.isActive('taskList'),\n label: 'Paragraph',\n type: 'option',\n },\n {\n icon: Heading1Icon,\n onClick: () =>\n editor\n .chain()\n .focus()\n .liftListItem('listItem')\n .setHeading({ level: 1 })\n .run(),\n id: 'heading1',\n disabled: () => !editor.can().setHeading({ level: 1 }),\n isActive: () => editor.isActive('heading', { level: 1 }),\n label: 'Heading 1',\n type: 'option',\n },\n {\n icon: Heading2Icon,\n onClick: () =>\n editor\n .chain()\n .focus()\n .liftListItem('listItem')\n .setHeading({ level: 2 })\n .run(),\n id: 'heading2',\n disabled: () => !editor.can().setHeading({ level: 2 }),\n isActive: () => editor.isActive('heading', { level: 2 }),\n label: 'Heading 2',\n type: 'option',\n },\n {\n icon: Heading3Icon,\n onClick: () =>\n editor\n .chain()\n .focus()\n .liftListItem('listItem')\n .setHeading({ level: 3 })\n .run(),\n id: 'heading3',\n disabled: () => !editor.can().setHeading({ level: 3 }),\n isActive: () => editor.isActive('heading', { level: 3 }),\n label: 'Heading 3',\n type: 'option',\n },\n {\n id: 'footer',\n type: 'option',\n label: 'Footer',\n icon: FootprintsIcon,\n onClick: () => {\n editor.chain().focus().liftListItem('listItem').setFooter().run();\n },\n disabled: () => !editor.can().setFooter(),\n isActive: () => editor.isActive('footer'),\n },\n {\n type: 'category',\n label: 'Lists',\n id: 'lists',\n },\n {\n icon: ListIcon,\n onClick: () => editor.chain().focus().toggleBulletList().run(),\n id: 'bulletList',\n disabled: () => !editor.can().toggleBulletList(),\n isActive: () => editor.isActive('bulletList'),\n label: 'Bullet list',\n type: 'option',\n },\n {\n icon: ListOrderedIcon,\n onClick: () => editor.chain().focus().toggleOrderedList().run(),\n id: 'orderedList',\n disabled: () => !editor.can().toggleOrderedList(),\n isActive: () => editor.isActive('orderedList'),\n label: 'Numbered list',\n type: 'option',\n },\n ],\n });\n}\n","import StarterKit from '@tiptap/starter-kit';\nimport ListItem from '@tiptap/extension-list-item';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Heading from '@tiptap/extension-heading';\nimport Underline from '@tiptap/extension-underline';\nimport Document from '@tiptap/extension-document';\nimport Focus from '@tiptap/extension-focus';\nimport Dropcursor from '@tiptap/extension-dropcursor';\n\nimport { Color } from './color';\nimport { HorizontalRule } from './horizontal-rule';\nimport { Footer } from '../nodes/footer';\nimport { Spacer } from '../nodes/spacer';\nimport { MailyContextType } from '../provider';\nimport { LinkCardExtension } from './link-card';\nimport { ColumnsExtension } from '../nodes/columns/columns';\nimport { ColumnExtension } from '../nodes/columns/column';\nimport { SectionExtension } from '../nodes/section/section';\nimport { ForExtension } from '../nodes/for/for';\nimport { ButtonExtension } from '../nodes/button/button';\nimport { VariableExtension } from '../nodes/variable/variable';\nimport { getVariableSuggestions } from '../nodes/variable/variable-suggestions';\nimport { SlashCommand } from './slash-command/slash-command';\nimport { getSlashCommandSuggestions } from './slash-command/slash-command-view';\nimport { LogoExtension } from '../nodes/logo/logo';\nimport { ImageExtension } from '../nodes/image/image';\nimport { LinkExtension } from '../nodes/link';\n\ntype ExtensionsProps = Partial<MailyContextType> & {};\n\nexport function extensions(props: ExtensionsProps) {\n const { variables, blocks, variableTriggerCharacter } = props;\n\n return [\n Document.extend({\n content: '(block|columns)+',\n }),\n ColumnsExtension,\n ColumnExtension,\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n code: {\n HTMLAttributes: {\n class:\n 'mly-px-1 mly-relative mly-py-0.5 mly-bg-[#efefef] mly-text-sm mly-rounded-md mly-tracking-normal mly-font-normal',\n },\n },\n blockquote: {\n HTMLAttributes: {\n class:\n 'mly-not-prose mly-border-l-4 mly-border-gray-300 mly-pl-4 mly-mt-4 mly-mb-4 mly-relative',\n },\n },\n paragraph: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'mly-relative',\n },\n },\n horizontalRule: false,\n dropcursor: false,\n document: false,\n }),\n Underline,\n LogoExtension,\n Color.configure({ types: [TextStyle.name, ListItem.name] }),\n TextStyle.configure(),\n TextAlign.configure({ types: [Paragraph.name, Heading.name, Footer.name] }),\n HorizontalRule,\n Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === 'heading') {\n return `Heading ${node.attrs.level}`;\n } else if (\n [\n 'columns',\n 'column',\n 'section',\n 'for',\n 'show',\n 'blockquote',\n ].includes(node.type.name)\n ) {\n return '';\n }\n\n return 'Write something or / to see commands';\n },\n includeChildren: true,\n }),\n Spacer,\n Footer,\n SlashCommand.configure({\n suggestion: getSlashCommandSuggestions(blocks),\n }),\n LinkExtension.configure({\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: 'mly-no-underline',\n },\n openOnClick: false,\n }),\n ImageExtension,\n LinkCardExtension,\n Focus,\n SectionExtension,\n ForExtension,\n Dropcursor.configure({\n color: '#555',\n width: 3,\n class: 'ProseMirror-dropcursor',\n }),\n ButtonExtension,\n VariableExtension.configure({\n suggestion: getVariableSuggestions(variables, variableTriggerCharacter),\n }),\n ];\n}\n","import TiptapColor, { ColorOptions } from '@tiptap/extension-color';\n\ntype ColorStorage = {\n /**\n * Last 5 used colors\n */\n colors: Set<string>;\n};\n\nexport const Color = TiptapColor.extend<ColorOptions, ColorStorage>({\n addStorage() {\n return {\n colors: new Set(),\n };\n },\n});\n","import { mergeAttributes, Node } from '@tiptap/core';\n\nexport interface FooterOptions {\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n footer: {\n setFooter: () => ReturnType;\n };\n }\n}\n\nexport const Footer = Node.create<FooterOptions>({\n name: 'footer',\n group: 'block',\n content: 'inline*',\n\n addAttributes() {\n return {\n 'maily-component': {\n default: 'footer',\n renderHTML: (attributes) => {\n return {\n 'data-maily-component': attributes['maily-component'],\n };\n },\n parseHTML: (element) => element?.getAttribute('data-maily-component'),\n },\n };\n },\n\n addCommands() {\n return {\n setFooter:\n () =>\n ({ commands }) => {\n return commands.setNode(this.name);\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'small[data-maily-component=\"footer\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'small',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class:\n 'footer mly-block mly-text-[13px] mly-text-slate-500 mly-relative',\n }),\n 0,\n ];\n },\n});\n","import {\n DEFAULT_VARIABLE_TRIGGER_CHAR,\n DEFAULT_VARIABLES,\n Variable as VariableType,\n Variables,\n} from '@/editor/provider';\nimport { processVariables } from '@/editor/utils/variable';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport { forwardRef, useImperativeHandle, useState } from 'react';\nimport tippy, { GetReferenceClientRect } from 'tippy.js';\nimport { VariablePopover, VariablePopoverRef } from './variable-popover';\nimport { useRef } from 'react';\n\ntype VariableListProps = {\n command: (params: { id: string; required: boolean }) => void;\n items: VariableType[];\n};\n\nexport const VariableList = forwardRef((props: VariableListProps, ref) => {\n const { items = [] } = props;\n\n const popoverRef = useRef<VariablePopoverRef>(null);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (!popoverRef.current) {\n return false;\n }\n\n const { moveUp, moveDown, select } = popoverRef.current || {};\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveUp();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveDown();\n return true;\n }\n\n if (event.key === 'Enter') {\n select();\n return true;\n }\n\n return false;\n },\n }));\n\n return (\n <VariablePopover\n items={items}\n onSelectItem={(value) => {\n props.command({\n id: value.name,\n required: value.required ?? true,\n });\n }}\n ref={popoverRef}\n />\n );\n});\n\nVariableList.displayName = 'VariableList';\n\nexport function getVariableSuggestions(\n variables: Variables = DEFAULT_VARIABLES,\n char: string = DEFAULT_VARIABLE_TRIGGER_CHAR\n): Omit<SuggestionOptions, 'editor'> {\n return {\n char,\n items: ({ query, editor }) => {\n return processVariables(variables, {\n query,\n editor,\n from: 'content-variable',\n });\n },\n\n render: () => {\n let component: ReactRenderer<any>;\n let popup: InstanceType<any> | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(VariableList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n });\n },\n\n onUpdate(props) {\n component.updateProps(props);\n\n if (!props.clientRect) {\n return;\n }\n\n popup?.[0]?.setProps({\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup?.[0].hide();\n return true;\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n popup?.[0].destroy();\n component.destroy();\n },\n };\n },\n };\n}\n","import { Editor, Extension } from '@tiptap/core';\nimport Suggestion from '@tiptap/suggestion';\n\nexport const SlashCommand = Extension.create({\n name: 'slash-command',\n addOptions() {\n return {\n suggestion: {\n char: '/',\n command: ({\n editor,\n range,\n props,\n }: {\n editor: Editor;\n range: Range;\n props: any;\n }) => {\n props.command({ editor, range });\n },\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n});\n","export const updateScrollView = (container: HTMLElement, item: HTMLElement) => {\n const containerHeight = container.offsetHeight;\n const itemHeight = item ? item.offsetHeight : 0;\n\n const top = item.offsetTop;\n const bottom = top + itemHeight;\n\n if (top < container.scrollTop) {\n container.scrollTop -= container.scrollTop - top + 5;\n } else if (bottom > containerHeight + container.scrollTop) {\n container.scrollTop += bottom - containerHeight - container.scrollTop + 5;\n }\n};\n","import { BlockItem } from '@/blocks/types';\nimport { cn } from '@/editor/utils/classname';\nimport { updateScrollView } from '@/editor/utils/update-scroll-view';\nimport { Editor } from '@tiptap/core';\nimport { ReactRenderer } from '@tiptap/react';\nimport { SuggestionOptions } from '@tiptap/suggestion';\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport tippy, { GetReferenceClientRect } from 'tippy.js';\n\ninterface CommandItemProps {\n title: string;\n description: string;\n icon: ReactNode;\n}\n\ntype CommandListProps = {\n items: CommandItemProps[];\n command: (item: CommandItemProps) => void;\n editor: Editor;\n range: any;\n};\n\nfunction CommandList(props: CommandListProps) {\n const { items, command, editor } = props;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const selectItem = useCallback(\n (index: number) => {\n const item = items[index];\n if (item) {\n command(item);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [command, editor, items]\n );\n\n useEffect(() => {\n const navigationKeys = ['ArrowUp', 'ArrowDown', 'Enter'];\n const onKeyDown = (e: KeyboardEvent) => {\n if (navigationKeys.includes(e.key)) {\n e.preventDefault();\n if (e.key === 'ArrowUp') {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n return true;\n }\n if (e.key === 'ArrowDown') {\n setSelectedIndex((selectedIndex + 1) % items.length);\n return true;\n }\n if (e.key === 'Enter') {\n selectItem(selectedIndex);\n return true;\n }\n return false;\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [items, selectedIndex, setSelectedIndex, selectItem]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [items]);\n\n const commandListContainer = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = commandListContainer?.current;\n\n const item = container?.children[selectedIndex] as HTMLElement;\n\n if (item && container) {\n updateScrollView(container, item);\n }\n }, [selectedIndex]);\n\n return items.length > 0 ? (\n <div className=\"mly-z-50 mly-w-72 mly-rounded-md mly-border mly-border-gray-200 mly-bg-white mly-shadow-md mly-transition-all\">\n <div\n id=\"slash-command\"\n ref={commandListContainer}\n className=\"mly-no-scrollbar mly-h-auto mly-max-h-[330px] mly-overflow-y-auto mly-scroll-smooth mly-p-1\"\n >\n {items.map((item: CommandItemProps, index: number) => {\n return (\n <button\n className={cn(\n 'mly-flex mly-w-full mly-items-center mly-space-x-2 mly-rounded-md mly-px-2 mly-py-1 mly-text-left mly-text-sm mly-text-gray-900 hover:mly-bg-gray-100 hover:mly-text-gray-900',\n index === selectedIndex\n ? 'mly-bg-gray-100 mly-text-gray-900'\n : 'mly-bg-transparent'\n )}\n key={index}\n onClick={() => selectItem(index)}\n type=\"button\"\n >\n <div className=\"mly-flex mly-h-6 mly-w-6 mly-shrink-0 mly-items-center mly-justify-center\">\n {item.icon}\n </div>\n <div>\n <p className=\"mly-font-medium\">{item.title}</p>\n <p className=\"mly-text-xs mly-text-gray-400\">\n {item.description}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n <div className=\"mly-border-t mly-border-gray-200 mly-px-1 mly-py-3 mly-pl-4\">\n <div className=\"mly-flex mly-items-center\">\n <p className=\"mly-text-center mly-text-xs mly-text-gray-400\">\n <kbd className=\"mly-rounded mly-border mly-p-1 mly-px-2 mly-font-medium\">\n ↑\n </kbd>\n <kbd className=\"mly-ml-1 mly-rounded mly-border mly-p-1 mly-px-2 mly-font-medium\">\n ↓\n </kbd>{' '}\n to navigate\n </p>\n <span aria-hidden=\"true\" className=\"mly-select-none mly-px-1\">\n ·\n </span>\n <p className=\"mly-text-center mly-text-xs mly-text-gray-400\">\n <kbd className=\"mly-rounded mly-border mly-p-1 mly-px-1.5 mly-font-medium\">\n Enter\n </kbd>{' '}\n to select\n </p>\n </div>\n </div>\n </div>\n ) : null;\n}\n\nexport function getSlashCommandSuggestions(\n commands: BlockItem[] = []\n): Omit<SuggestionOptions, 'editor'> {\n return {\n items: ({ query, editor }) => {\n return commands.filter((item) => {\n if (typeof query === 'string' && query.length > 0) {\n const search = query.toLowerCase();\n\n if (item?.shouldBeHidden?.(editor)) {\n return false;\n }\n\n return (\n item.title.toLowerCase().includes(search) ||\n item.description.toLowerCase().includes(search) ||\n (item.searchTerms &&\n item.searchTerms.some((term: string) => term.includes(search)))\n );\n }\n return true;\n });\n },\n render: () => {\n let component: ReactRenderer<any>;\n let popup: InstanceType<any> | null = null;\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(CommandList, {\n props,\n editor: props.editor,\n });\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as GetReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n });\n },\n onUpdate: (props) => {\n component?.updateProps(props);\n\n popup &&\n popup[0].setProps({\n getReferenceClientRect: props.clientRect,\n });\n },\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n popup?.[0].hide();\n\n return true;\n }\n\n return component?.ref?.onKeyDown(props);\n },\n onExit: () => {\n if (!popup || !popup?.[0] || !component) {\n return;\n }\n\n popup?.[0].destroy();\n component?.destroy();\n },\n };\n },\n };\n}\n","import TiptapLink from '@tiptap/extension-link';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n customLink: {\n setIsUrlVariable: (isUrlVariable: boolean) => ReturnType;\n };\n }\n}\n\nexport const LinkExtension = TiptapLink.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n isUrlVariable: {\n default: false,\n },\n };\n },\n addCommands() {\n return {\n ...this.parent?.(),\n\n setIsUrlVariable:\n (isUrlVariable) =>\n ({ chain }) => {\n return chain().setMark('link', { isUrlVariable }).run();\n },\n };\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,gBAAAA;AAAA;AAAA;;;ACCyB,SAAR,YAA6B,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG;AAC1D,MAAI,CAAC,OAAO,OAAO,aAAa,YAAa;AAE7C,QAAM,OAAO,SAAS,QAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC;AACrE,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AAEb,MAAI,aAAa,OAAO;AACtB,QAAI,KAAK,YAAY;AACnB,WAAK,aAAa,OAAO,KAAK,UAAU;AAAA,IAC1C,OAAO;AACL,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF,OAAO;AACL,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,MAAM,YAAY;AACpB,UAAM,WAAW,UAAU;AAAA,EAC7B,OAAO;AACL,UAAM,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,EAChD;AACF;;;ACvB8B,YAAY,whMAA4hM;;;ACAxiM,YAAY,4sJAA0tJ;;;ACAtuJ,YAAY,u/4CAAyg5C;;;ACG7j5C,IAAAC,iBAAsD;AAEtD,IAAAA,iBAAuB;;;ACLvB,IAAAC,iBAA2B;AAC3B,IAAAA,iBAA4B;;;ACCrB,SAAS,mBAAmB,QAAgB,UAAkB;AACnE,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACL,WAAW,EAAE,KAAK;AAAA,IACpB;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,SAAS,iBAAiB,YAAY;AACvD,QAAM,eAAe,SAAS;AAC9B,QAAM,gBAAgB,SAAS,eAAe,CAAC;AAC/C,QAAM,UAAU;AAEhB,MACG,WACC,QAAQ,aAAa,WAAW,KAChC,QAAQ,aAAa,WAAW,MAAM,YACvC,WACC,QAAQ,cACP,QAAQ,UAAU,SAAS,QAAQ,KAClC,QAAQ,UAAU,SAAS,QAAQ,QAAQ,EAAE,IACjD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,KAAK,SAAS,IAAI,EAAE;AACjC,MAAI,YAAgC;AAEpC,MAAI,CAAC,UAAU,SAAS;AACtB,gBAAY,KAAK;AAAA,EACnB;AAEA,SACE,aACA,EACE,UAAU,aAAa,WAAW,KAClC,UAAU,aAAa,WAAW,MAAM,aAE1C,CAAC,UAAU,UAAU,SAAS,QAAQ,GACtC;AACA,gBAAY,UAAU;AAAA,EACxB;AAEA,SAAO;AACT;;;AD3CA,mBAAuB;;;AEHvB,kBAAgC;AAGzB,SAAS,eAAe,QAAgB;AAC7C,QAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,EAAE,OAAO,MAAM,GAAG;AAAA,IAC/B;AAAA,EACF,IAAI;AAKJ,QAAM,mBACJ,CAAC,IAAI,YAAY,MAAM,EAAE,EAAE,cAAU,6BAAgB,SAAS;AAEhE,MAAI,SAAS,oBAAoB,CAAC,OAAO,YAAY;AACnD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACtBA,mBAA+B;AAC/B,mBAA8B;AAC9B,IAAAC,eAA2B;AAC3B,IAAAC,eAA+B;;;AC6BxB,SAAS,iBACd,MACA,OACS;AACT,SAAO,CAAC,EAAE,SAAS,MACjB,SAAS,QAAQ,CAAC,EAAE,IAAI,OAAO,SAAS,MAAM;AAC5C,QAAI,UAAU;AACZ,UAAI,UAAU;AAEd,SAAG,UAAU,OAAO,QAAQ,CAAC,UAAU;AACrC,cAAM,IAAI;AAAA,UACR,MAAM,MAAM;AAAA,UACZ,MAAM,IAAI;AAAA,UACV,CAAC,MAAM,QAAQ;AACb,gBAAI,KAAK,KAAK,SAAS,MAAM;AAC3B,wBAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI,YAAY,MAAM;AACpB,cAAM,OAAO,MAAM,IAAI,OAAO,OAAO;AACrC,YAAI,MAAM;AACR,aAAG,cAAc,SAAS,MAAM,kCAC3B,KAAK,QACL,MACJ;AAAA,QACH,OAAO;AACL,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,eAAG,iBAAiB,SAAS,KAAK,KAAK;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,UAAU;AACrB,WAAG,aAAa,GAAG,SAAS;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AACL;;;AC1EA,IAAAC,eAAsC;AACtC,kBAA2B;AAEpB,IAAM,uBAAuB;AAG7B,IAAM,gCAA4D;AA0BlE,IAAM,kBAAkB,kBAAK,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,aAAa,gBAAgB,SAAK,YAAAC,IAAK;AAAA,QACjD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,UAAU;AACxB,mBAAO;AAAA,cACL,sBAAkB,YAAAA,IAAK;AAAA,YACzB;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,kBAAkB,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,MAAM,MAAM,QAAQ,UAAU,EAAE,KAAK;AAAA,QAC/C,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,SAAS,WAAW,UAAU,sBAAsB;AAClE,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,UAAU,WAAW,KAAK,eAAe,WAAW,KAAK;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAxE7B;AAwEgC,2DAAS,UAAT,mBAAgB,kBAAiB;AAAA;AAAA,QACzD,YAAY,CAAC,eAAe;AAC1B,gBAAM,EAAE,cAAc,IAAI;AAC1B,cACE,CAAC,iBACD,kBAAkB,+BAClB;AACA,mBAAO,CAAC;AAAA,UACV;AAEA,cAAI,kBAAkB,UAAU;AAC9B,mBAAO;AAAA,cACL,OAAO;AAAA,YACT;AAAA,UACF,WAAW,kBAAkB,UAAU;AACrC,mBAAO;AAAA,cACL,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,cAAc,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,8BAAgBA,iBAAgB;AAAA,QAC9B,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AFjHM,SAAS,eAAe,QAAgB;AAP/C;AAQE,WAAO,gCAAqB,QAAQ,SAAS,MAAtC,mBAAyC,SAAzC,mBAA+C,eAAc;AACtE;AAEO,SAAS,qBAAqB,QAAgB,MAAc;AACjE,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,aAAO,6BAAe,CAAC,SAAS,KAAK,KAAK,SAAS,IAAI,EAAE,MAAM,SAAS;AAC1E;AA6JO,SAAS,WAAW,QAAgB,MAA2B;AACpE,QAAM,cAAc,qBAAqB,QAAQ,SAAS;AAC1D,QAAM,aAAa,qBAAqB,QAAQ,QAAQ;AACxD,MAAI,CAAC,eAAe,CAAC,YAAY;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,SAAS,IAAI,OAAO;AAGnC,QAAM,OAAO,YAAY;AACzB,MAAI,kBAAkB;AACtB,OAAK,QAAQ,QAAQ,CAAC,OAAO,GAAG,UAAU;AAvL5C;AAwLI,QACE,MAAM,GAAG,WAAW,IAAI,OACxB,oCAAO,UAAP,mBAAc,gBAAa,sBAAW,SAAX,mBAAiB,UAAjB,mBAAwB,WACnD;AACA,wBAAkB;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,kBACJ,SAAS,SAAS,kBAAkB,IAAI,kBAAkB;AAE5D,MAAI,kBAAkB,KAAK,mBAAmB,KAAK,YAAY;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,YAAY;AAChC,OAAK,QAAQ,QAAQ,CAAC,OAAO,GAAG,UAAU;AACxC,QAAI,QAAQ,iBAAiB;AAC3B,uBAAiB,MAAM;AAAA,IACzB;AAAA,EACF,CAAC;AAED,QAAM,KAAK,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC;AACtC,QAAM,gBAAgB,2BAAc,KAAK,GAAG,IAAI,QAAQ,aAAa,CAAC;AACtE,KAAG,aAAa,aAAa;AAE7B,WAAS,EAAE;AACX,SAAO;AACT;AAEO,SAAS,kBACd,QACA,OACA,QAAgB,QAChB;AACA,QAAM,EAAE,MAAM,aAAa,KAAK,iBAAiB,EAAE,IACjD,qBAAqB,QAAQ,SAAS,KAAK,CAAC;AAC9C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,SAAS,IAAI,OAAO;AACnC,QAAM,EAAE,GAAG,IAAI;AAEf,QAAM,iBAAyB,CAAC;AAChC,cAAY,QAAQ,QAAQ,CAAC,OAAO,GAAG,MAAM;AArO/C;AAsOI,mBAAe;AAAA,MACb,MAAM,KAAK;AAAA,QACT,iCACK,+BAAO,QADZ;AAAA,UAEE,OAAO,MAAM,QAAQ,SAAQ,oCAAO,UAAP,mBAAc;AAAA,QAC7C;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,qBAAqB,YAAY,KAAK,sBAAS,KAAK,cAAc,CAAC;AACzE,QAAM,cAAc,GAAG;AAAA,IACrB;AAAA,IACA,iBAAiB,YAAY;AAAA,IAC7B;AAAA,EACF;AAEA,WAAS,WAAW;AACpB,SAAO;AACT;AAEO,SAAS,iBAAiB,QAAgB,QAAgB,IAAI;AACnE,QAAM,EAAE,MAAM,aAAa,KAAK,iBAAiB,EAAE,IACjD,qBAAqB,QAAQ,SAAS,KAAK,CAAC;AAC9C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAIA,QAAM,cAAc,QAAQ,IAAI,YAAY,aAAa;AAGzD,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,QAAM,YAAY,MAAM,OAAO,MAAM,OAAO;AAAA,IAC1C;AAAA,MACE,OAAO;AAAA,MACP,cAAU,aAAAC,IAAK;AAAA,IACjB;AAAA,IACA,MAAM,OAAO,MAAM,UAAU,OAAO,IAAI;AAAA,EAC1C;AAIA,QAAM,iBAAyB,CAAC;AAChC,cAAY,QAAQ,QAAQ,CAAC,OAAO,GAAG,MAAM;AAC3C,mBAAe,KAAK,KAAK;AACzB,QAAI,MAAM,aAAa;AACrB,qBAAe,KAAK,SAAS;AAAA,IAC/B;AAAA,EACF,CAAC;AAED,MAAI,UAAU,IAAI;AAChB,mBAAe,KAAK,SAAS;AAAA,EAC/B;AAEA,QAAM,qBAAqB,YAAY,KAAK,sBAAS,KAAK,cAAc,CAAC;AACzE,QAAM,cAAc,MAAM,GAAG;AAAA,IAC3B;AAAA,IACA,iBAAiB,YAAY;AAAA,IAC7B;AAAA,EACF;AAKA,QAAM,eACJ,iBACA,eACG,MAAM,GAAG,WAAW,EACpB,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,UAAU,CAAC;AAEjD,QAAM,gBAAgB,2BAAc;AAAA,IAClC,YAAY,IAAI,QAAQ,YAAY;AAAA,EACtC;AACA,cAAY,aAAa,aAAa;AAEtC,SAAO,KAAK,SAAS,WAAW;AAChC,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAgB,QAAgB,IAAI;AACtE,QAAM,EAAE,MAAM,aAAa,KAAK,iBAAiB,EAAE,IACjD,qBAAqB,QAAQ,SAAS,KAAK,CAAC;AAC9C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,SAAS,IAAI,OAAO;AACnC,QAAM,EAAE,GAAG,IAAI;AAEf,QAAM,iBAAyB,CAAC;AAChC,cAAY,QAAQ,QAAQ,CAAC,OAAO,GAAG,MAAM;AAC3C,QAAI,MAAM,OAAO;AACf,qBAAe,KAAK,KAAK;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,MAAI,UAAU,IAAI;AAChB,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,qBAAqB,YAAY,KAAK,sBAAS,KAAK,cAAc,CAAC;AACzE,QAAM,cAAc,GAAG;AAAA,IACrB;AAAA,IACA,iBAAiB,YAAY;AAAA,IAC7B;AAAA,EACF;AAKA,QAAM,kBACJ,UAAU,YAAY,aAAa,IAAI,QAAQ,IAAI;AACrD,QAAM,gBACJ,iBACA,eACG,MAAM,GAAG,eAAe,EACxB,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,UAAU,CAAC;AAEjD,QAAM,gBAAgB,2BAAc;AAAA,IAClC,YAAY,IAAI,QAAQ,aAAa;AAAA,EACvC;AACA,cAAY,aAAa,aAAa;AAEtC,WAAS,WAAW;AACpB,SAAO;AACT;AAEO,SAAS,gBAAgB,QAG5B;AACF,QAAM,EAAE,MAAM,aAAa,KAAK,iBAAiB,EAAE,IACjD,qBAAqB,QAAQ,SAAS,KAAK,CAAC;AAC9C,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAgD,CAAC;AACvD,cAAY,QAAQ,QAAQ,CAAC,UAAU;AACrC,UAAM,EAAE,UAAU,MAAM,IAAI,MAAM;AAClC,iBAAa,KAAK,EAAE,IAAI,UAAU,MAAM,CAAC;AAAA,EAC3C,CAAC;AAED,SAAO;AACT;;;AGxXA,mBAAuC;AACvC,6BAAoB;AAEb,IAAM,kBAAkB,CAAC,WAAmB;AACjD,QAAM,aAAS,6BAAe;AAAA,IAC5B;AAAA,IACA,UAAU,CAAC,QAAQ;AAPvB;AAQM,aAAO;AAAA,QACL,iBAAiB,IAAI,OAAO,SAAS,SAAS;AAAA,QAC9C,gBAAgB,IAAI,OAAO,SAAS,QAAQ;AAAA,QAE5C,4BACE,SAAI,OAAO,cAAc,QAAQ,MAAjC,mBAAoC,kBAAiB;AAAA,QAEvD,oBAAkB,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,cAAa;AAAA,QAEpE,cAAc,eAAe,IAAI,MAAM;AAAA,QACvC,cAAc,gBAAgB,IAAI,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,QAE5D,qBAAmB,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,QAAO;AAAA,MACjE;AAAA,IACF;AAAA,IACA,YAAY,uBAAAC;AAAA,EACd,CAAC;AAED,SAAO;AACT;;;AC3BA,kBAAsC;AACtC,4BAAoC;AAEpC,IAAM,cAAU,2CAAoB;AAAA,EAClC,QAAQ;AACV,CAAC;AAEM,SAAS,MAAM,QAAsB;AAC1C,SAAO,YAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACEI;AAJG,SAAS,QAAQ,OAAc;AACpC,QAAM,EAAE,OAAO,YAAY,UAAU,IAAI;AAEzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS,aAAa,wBAAwB;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ACjBA,YAAuB;AACvB,uBAAkC;AAoBhC,IAAAC,sBAAA;AAhBF,IAAM,kBAEe;AAErB,IAAM,UAEe;AAErB,IAAM,iBAEe;AAErB,IAAM,iBAAuB,iBAG3B,CAAC,IAAyC,QAAK;AAA9C,eAAE,aAAW,aAAa,EAtB7B,IAsBG,IAAgC,kBAAhC,IAAgC,CAA9B,aAAW;AACd;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,OACI;AAAA,EACN;AAAA,CACD;AAKD,eAAe,cAA+B,yBAAQ;;;ACrCtD,0BAIO;;;ACJP,IAAAC,SAAuB;AACvB,wBAAqB;AAuDV,IAAAC,sBAAA;AAvCX,IAAM,aAAmB;AAAA,EACvB,CACE,IAOA,QACG;AARH,iBACE;AAAA;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IAvBhB,IAmBI,IAKK,kBALL,IAKK;AAAA,MAJH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAKF,UAAM,OAAO,UAAU,yBAAO;AAC9B,UAAM,YACJ;AACF,UAAM,iBAAiB;AAAA,MACrB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SACE;AAAA,MACF,WAAW;AAAA,MACX,OACE;AAAA,MACF,MAAM;AAAA,IACR;AACA,UAAM,cAAc;AAAA,MAClB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,eAAe,OAAO;AAAA,MACtB,YAAY,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,6CAAC,uBAAK,WAAW,SAAS,OAAc,MAAO;AAAA,EACxD;AACF;AAEA,WAAW,cAAc;;;ACtCjB,IAAAC,sBAAA;AAjBD,SAAS,iBAAiB,MAAsB;AALvD;AAME,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,UACJ;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,OACA,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC,IAHlD;AAAA,MAIC,eAAY,kCAAM,aAAN;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA,6BAAM;AAAA,MACR;AAAA,MACA,MAAK;AAAA,MACL,UAAU,KAAK;AAAA,MAEd,eAAK,OACJ;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,6BAAM;AAAA,UACR;AAAA;AAAA,MACF,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,6BAAM;AAAA,UACR;AAAA,UAEC,eAAK;AAAA;AAAA,MACR;AAAA;AAAA,EAEJ;AAGF,MAAI,SAAS;AACX,WACE,8CAAC,WACC;AAAA,mDAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,MACjC,6CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,OAC1C;AAAA,EAEJ;AAEA,SAAO;AACT;;;AFVI,IAAAC,sBAAA;AA5BG,SAAS,wBAAwB,OAAqC;AAC3E,QAAM,EAAE,YAAY,OAAO,kBAAkB,IAAI;AAEjD,QAAM,kBAAkB;AAAA,IACtB,KAAK;AAAA,MACH,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,EACF,EAAE,SAAS;AAEX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,gBAAgB;AAAA,MACtB,SAAS,gBAAgB;AAAA,MACzB,SAAS,gBAAgB;AAAA;AAAA,EAC3B;AAEJ;;;AG/CA,IAAAC,wBAAuD;;;ACEvD,IAAAC,SAAuB;AACvB,uBAAkC;AAiB9B,IAAAC,sBAAA;AAbJ,IAAM,UAEe;AAErB,IAAM,iBAEe;AAErB,IAAM,iBAAuB,kBAG3B,CAAC,IAA2D,QAAK;AAAhE,eAAE,aAAW,QAAQ,UAAU,aAAa,EAlB/C,IAkBG,IAAkD,kBAAlD,IAAkD,CAAhD,aAAW,SAAkB;AAChC,sDAAkB,yBAAjB,EACC;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,OACI;AAAA,EACN,GACF;AAAA,CACD;AAKD,eAAe,cAA+B,yBAAQ;;;ADnCtD,IAAAC,gBAAiC;;;AEAjC,IAAAC,uBAKO;AACP,IAAAC,gBAMO;AAyED,IAAAC,sBAAA;AA5DC,IAAM,sBAAkB,0BAG7B,CAAC,OAAO,QAAQ;AAChB,QAAM,EAAE,OAAO,aAAa,IAAI;AAEhC,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,CAAC;AACpD,QAAM,yBAAqB,sBAAuB,IAAI;AACtD,QAAM,eAAW,sBAAqC,CAAC,CAAC;AAExD,QAAM,yBAAyB,CAAC,UAAkB;AAChD,UAAM,YAAY,mBAAmB;AACrC,UAAM,eAAe,SAAS,QAAQ,KAAK;AAE3C,QAAI,CAAC,aAAa,CAAC,cAAc;AAC/B;AAAA,IACF;AAEA,UAAM,gBAAgB,UAAU,sBAAsB;AACtD,UAAM,WAAW,aAAa,sBAAsB;AAEpD,UAAM,UAAU;AAChB,QAAI,SAAS,SAAS,cAAc,QAAQ;AAC1C,gBAAU,aAAa,SAAS,SAAS,cAAc,SAAS;AAAA,IAClE,WAAW,SAAS,MAAM,cAAc,KAAK;AAC3C,gBAAU,aAAa,SAAS,MAAM,cAAc,MAAM;AAAA,IAC5D;AAAA,EACF;AAEA,+BAAU,MAAM;AACd,qBAAiB,CAAC;AAClB,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,YAAY;AAAA,IACzC;AACA,aAAS,UAAU,MAAM,IAAI,MAAM,IAAI;AAAA,EACzC,GAAG,CAAC,KAAK,CAAC;AAEV,+BAAU,MAAM;AACd,2BAAuB,aAAa;AAAA,EACtC,GAAG,CAAC,aAAa,CAAC;AAElB,yCAAoB,KAAK,OAAO;AAAA,IAC9B,QAAQ,MAAM;AACZ,wBAAkB,gBAAgB,MAAM,SAAS,KAAK,MAAM,MAAM;AAAA,IACpE;AAAA,IACA,UAAU,MAAM;AACd,wBAAkB,gBAAgB,KAAK,MAAM,MAAM;AAAA,IACrD;AAAA,IACA,QAAQ,MAAM;AACZ,YAAM,OAAO,MAAM,aAAa;AAChC,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AAEA,mBAAa,IAAI;AAAA,IACnB;AAAA,EACF,EAAE;AAEF,SACE,8CAAC,SAAI,WAAU,iHACb;AAAA,kDAAC,SAAI,WAAU,sJACb;AAAA,mDAAC,UAAK,WAAU,6BAA4B,uBAAS;AAAA,MACrD,6CAAC,gBACC,uDAAC,+BAAO,WAAU,+BAA8B,GAClD;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QAEV,uDAAC,SAAI,WAAU,sEACZ,0CAAO,UACN,+BAAO,IAAI,CAAC,MAAM,UAChB;AAAA,UAAC;AAAA;AAAA,YAEC,KAAK,CAAC,OAAQ,SAAS,QAAQ,KAAK,IAAI;AAAA,YACxC,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,WAAW;AAAA,cACT;AAAA,cACA,UAAU,gBAAgB,qBAAqB;AAAA,YACjD;AAAA,YAEA;AAAA,2DAAC,+BAAO,WAAU,iDAAgD;AAAA,cACjE,KAAK;AAAA;AAAA;AAAA,UATD;AAAA,QAUP,KAGF,6CAAC,SAAI,WAAU,gLAA+K,uBAE9L,GAEJ;AAAA;AAAA,IACF;AAAA,IAEA,8CAAC,SAAI,WAAU,kIACb;AAAA,oDAAC,SAAI,WAAU,uCACb;AAAA,qDAAC,gBACC,uDAAC,sCAAc,WAAU,+BAA8B,GACzD;AAAA,QACA,6CAAC,gBACC,uDAAC,oCAAY,WAAU,+BAA8B,GACvD;AAAA,QACA,6CAAC,UAAK,WAAU,iCAAgC,sBAAQ;AAAA,SAC1D;AAAA,MACA,6CAAC,gBACC,uDAAC,2CAAmB,WAAU,+BAA8B,GAC9D;AAAA,OACF;AAAA,KACF;AAEJ,CAAC;AAOD,SAAS,aAAa,OAA0B;AAC9C,QAAM,EAAE,WAAW,SAAS,IAAI;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AC9JO,IAAM,qCAAqC,OAAO,OAAO;AAAA,EAC9D,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AACpB,CAAC;;;ACJD,IAAAC,gBAA4B;AAC5B,IAAAA,gBAA0B;AAGnB,SAAS,gBACd,KACA,UACA;AACA,QAAM,kBAAc;AAAA,IAClB,CAAC,MAA+B;AAC9B,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAc,GAAG;AAC1D,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,CAAC,KAAK,QAAQ;AAAA,EAChB;AAEA,+BAAU,MAAM;AACd,aAAS,iBAAiB,aAAa,WAAW;AAClD,aAAS,iBAAiB,cAAc,WAAW;AACnD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,WAAW;AACrD,eAAS,oBAAoB,cAAc,WAAW;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAClB;;;ACjBA,IAAAC,uBAA+B;AAC/B,IAAAC,gBAAsE;AAwChE,IAAAC,sBAAA;AA1BC,IAAM,wBAAoB,0BAG/B,CAAC,OAAO,QAAQ;AAChB,QASI,YARF;AAAA,YAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,CAAC;AAAA,IACvB,cAAc;AAAA,EAlClB,IAoCM,IADC,uBACD,IADC;AAAA,IAPH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIF,QAAM,mBAAe,sBAAuB,IAAI;AAChD,QAAM,iBAAa,sBAA2B,IAAI;AAElD,kBAAgB,cAAc,MAAM;AAClC;AAAA,EACF,CAAC;AAED,QAAM,uBAAuB,MAAM,WAAW,WAAW;AAEzD,SACE,8CAAC,SAAI,WAAW,GAAG,cAAc,GAAG,KAAK,cACvC;AAAA,kDAAC,WAAM,WAAU,gBACf;AAAA;AAAA,QAAC;AAAA,sEACK,qCADL;AAAA,UAEC,aAAY;AAAA,UACZ,MAAK;AAAA,YACD,aAJL;AAAA,UAKC;AAAA,UACA;AAAA,UACA,UAAU,CAAC,MAAM;AACf,0BAAc,EAAE,OAAO,KAAK;AAAA,UAC9B;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,WAAW,CAAC,MAAM;AAChB,gBAAI,CAAC,WAAW,WAAW,CAAC,sBAAsB;AAChD;AAAA,YACF;AACA,kBAAM,EAAE,QAAQ,UAAU,OAAO,IAAI,WAAW;AAEhD,gBAAI,EAAE,QAAQ,aAAa;AACzB,gBAAE,eAAe;AACjB,uBAAS;AAAA,YACX,WAAW,EAAE,QAAQ,WAAW;AAC9B,gBAAE,eAAe;AACjB,qBAAO;AAAA,YACT,WAAW,EAAE,QAAQ,SAAS;AAC5B,gBAAE,eAAe;AACjB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA,YAAY;AAAA;AAAA,MACd;AAAA,MACA,6CAAC,SAAI,WAAU,oEACb,uDAAC,uCAAe,WAAU,2DAA0D,GACtF;AAAA,OACF;AAAA,IAEC,wBACC,6CAAC,SAAI,WAAU,qCACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,oBAAoB,IAAI,CAAC,WAAW;AACzC,iBAAO;AAAA,YACL,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,QACD,cAAc,CAAC,SAAS;AACtB,2DAAiB,KAAK;AAAA,QACxB;AAAA,QACA,KAAK;AAAA;AAAA,IACP,GACF;AAAA,KAEJ;AAEJ,CAAC;AAED,kBAAkB,cAAc;;;ACxGhC,IAAAC,gBAA6D;;;ACF7D,IAAAC,uBAAiD;AAMzC,IAAAC,sBAAA;AAJD,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,UAAU,KAAK;AAAA,EACrC,MAAM,6CAAC,qCAAa,WAAU,mBAAkB;AAAA,EAChD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,IAAI;AAAA,EAC5D;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,QAAQ,UAAU,OAAO;AAAA,EACvC,MAAM,6CAAC,2CAAmB,WAAU,mBAAkB;AAAA,EACtD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,YAAY,EAAE,IAAI;AAAA,EAC9D;AACF;;;ACtBA,IAAAC,uBAA0B;AAMlB,IAAAC,uBAAA;AAJD,IAAM,QAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,OAAO;AAAA,EACrB,MAAM,8CAAC,kCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI;AAAA,EACtE;AACF;AAEO,IAAM,OAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,MAAM;AAAA,EAC7B,MAAM,8CAAC,kCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,aAAa,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI;AAAA,EAC1E;AACF;;;ACtBA,IAAAC,uBAMO;AAMC,IAAAC,uBAAA;AAJD,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,SAAS;AAAA,EACjC,MAAM,8CAAC,oCAAY,WAAU,mBAAkB;AAAA,EAC/C,gBAAgB,CAAC,WAAW;AAC1B,WAAO,OAAO,SAAS,SAAS;AAAA,EAClC;AAAA,EACA,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EAEjB,WAAW,EACX,MAAM,OAAO,MAAM,UAAU,OAAO,CAAC,EACrC,IAAI;AAAA,EACT;AACF;AAEO,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,SAAS;AAAA,EACjC,MAAM,8CAAC,4CAAoB,WAAU,mBAAkB;AAAA,EACvD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,WAAW,EAAE,IAAI;AAAA,EAC7D;AACF;AAEO,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,OAAO,MAAM;AAAA,EAC3B,MAAM,8CAAC,gCAAQ,WAAU,mBAAkB;AAAA,EAC3C,gBAAgB,CAAC,WAAW;AAC1B,WAAO,OAAO,SAAS,KAAK;AAAA,EAC9B;AAAA,EACA,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,OAAO,EAAE,IAAI;AAAA,EACzD;AACF;AAEO,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,OAAO,SAAS;AAAA,EACvC,MAAM,8CAAC,qCAAa,WAAU,mBAAkB;AAAA,EAChD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,QAAQ,KAAK,CAAC,EAAE,IAAI;AAAA,EAC5E;AACF;AAEO,IAAM,UAAqB;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,WAAW,MAAM;AAAA,EAC/B,MAAM,8CAAC,8BAAM,WAAU,mBAAkB;AAAA,EACzC,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,kBAAkB,EAAE,IAAI;AAAA,EACpE;AACF;;;AC1EA,IAAAC,uBAAkC;AAM1B,IAAAC,uBAAA;AAJD,IAAM,aAAwB;AAAA,EACnC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,aAAa,OAAO;AAAA,EAClC,MAAM,8CAAC,6BAAK,WAAU,mBAAkB;AAAA,EACxC,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,iBAAiB,EAAE,IAAI;AAAA,EACnE;AACF;AAEO,IAAM,cAAyB;AAAA,EACpC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS;AAAA,EACvB,MAAM,8CAAC,oCAAY,WAAU,mBAAkB;AAAA,EAC/C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,kBAAkB,EAAE,IAAI;AAAA,EACpE;AACF;;;ACtBA,IAAAC,uBASO;AAMC,IAAAC,uBAAA;AAJD,IAAM,OAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,KAAK,WAAW;AAAA,EAC9B,MAAM,8CAAC,6BAAK,WAAU,mBAAkB;AAAA,EACxC,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,WAAW,aAAa,WAAW,EACnC,IAAI;AAAA,EACT;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,OAAO,OAAO;AAAA,EACrC,MAAM,8CAAC,iCAAS,WAAU,mBAAkB;AAAA,EAC5C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,QAAQ,WAAW,EAAE,OAAO,EAAE,CAAC,EAC/B,IAAI;AAAA,EACT;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,YAAY,QAAQ;AAAA,EAClC,MAAM,8CAAC,iCAAS,WAAU,mBAAkB;AAAA,EAC5C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,QAAQ,WAAW,EAAE,OAAO,EAAE,CAAC,EAC/B,IAAI;AAAA,EACT;AACF;AAEO,IAAM,WAAsB;AAAA,EACjC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,YAAY,OAAO;AAAA,EACjC,MAAM,8CAAC,iCAAS,WAAU,mBAAkB;AAAA,EAC5C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC9B,WACG,MAAM,EACN,MAAM,EACN,YAAY,KAAK,EACjB,QAAQ,WAAW,EAAE,OAAO,EAAE,CAAC,EAC/B,IAAI;AAAA,EACT;AACF;AAEO,IAAM,YAAuB;AAAA,EAClC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,MAAM;AAAA,EAC7B,MAAM,8CAAC,mCAAW,WAAU,mBAAkB;AAAA,EAC9C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,aAAa,EAAE,IAAI;AAAA,EAC/D;AACF;AAEO,IAAM,aAAwB;AAAA,EACnC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,YAAY;AAAA,EACnC,MAAM,8CAAC,kCAAU,WAAU,mBAAkB;AAAA,EAC7C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,iBAAiB,EAAE,IAAI;AAAA,EACnE;AACF;AAEO,IAAM,SAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,UAAU,MAAM;AAAA,EAC9B,MAAM,8CAAC,uCAAe,WAAU,mBAAkB;AAAA,EAClD,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,UAAU,EAAE,IAAI;AAAA,EAC5D;AACF;AAEO,IAAM,YAAuB;AAAA,EAClC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,MAAM;AAAA,EAC7B,MAAM,8CAAC,mCAAW,WAAU,mBAAkB;AAAA,EAC9C,SAAS,CAAC,EAAE,QAAQ,MAAM,MAAM;AAE9B,WAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,IAAI;AAAA,EAClE;AACF;;;AClGO,IAAM,yBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACrBA,IAAAC,gBAAgC;AAChC,IAAAC,uBAA8C;AAetC,IAAAC,uBAAA;AAbD,SAAS,aAAa,OAAsB;AACjD,QAAM,EAAE,MAAM,kBAAAC,mBAAkB,OAAO,IAAI;AAC3C,QAAM,EAAE,IAAI,UAAU,SAAS,IAAI,KAAK;AAExC,QAAM,EAAE,iBAAiB,iCAAiC,IACxD,gBAAgB;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,WAAU;AAAA,MAEV,yDAAC,WACC;AAAA,sDAAC,kBACE,yBAAe;AAAA,UACd,UAAU,EAAE,MAAM,IAAI,UAAoB,OAAO,KAAK;AAAA,UACtD;AAAA,UACA;AAAA,UACA,MAAM;AAAA,QACR,CAAC,GACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,YACzC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,YAE1C,wDAAC,mBACC,yDAAC,SAAI,WAAU,qDACb;AAAA,6DAAC,WAAM,WAAU,gBACf;AAAA,8DAAC,UAAK,WAAU,gEAA+D,sBAE/E;AAAA,gBACA;AAAA,kBAAC;AAAA,mDACK,qCADL;AAAA,oBAEC,OAAO,kBAAM;AAAA,oBACb,UAAU,CAAC,MAAM;AACf,sBAAAA,kBAAiB;AAAA,wBACf,IAAI,EAAE,OAAO;AAAA,sBACf,CAAC;AAAA,oBACH;AAAA,oBACA,aAAY;AAAA,oBACZ,WAAU;AAAA;AAAA,gBACZ;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ,WAAU,cAAa;AAAA,cAEhC,+CAAC,WAAM,WAAU,gBACf;AAAA,8DAAC,UAAK,WAAU,yEAAwE,qBAExF;AAAA,gBACA;AAAA,kBAAC;AAAA,mDACK,qCADL;AAAA,oBAEC,OAAO,8BAAY;AAAA,oBACnB,UAAU,CAAC,MAAM;AACf,sBAAAA,kBAAiB;AAAA,wBACf,UAAU,EAAE,OAAO;AAAA,sBACrB,CAAC;AAAA,oBACH;AAAA,oBACA,aAAY;AAAA,oBACZ,WAAU;AAAA;AAAA,gBACZ;AAAA,gBACA,8CAAC,SAAI,WAAU,oEACb,wDAAC,+BAAO,WAAU,2DAA0D,GAC9E;AAAA,iBACF;AAAA,eACF,GACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEO,IAAM,wBAAgD,CAAC,UAAU;AACtE,QAAM,EAAE,UAAU,UAAU,KAAK,IAAI;AACrC,QAAM,EAAE,MAAM,UAAU,MAAM,IAAI;AAElC,MAAI,SAAS,mBAAmB;AAC9B,WACE,+CAAC,SAAI,WAAU,uMACb;AAAA,oDAAC,+BAAO,WAAU,iDAAgD;AAAA,MAClE,8CAAC,UAAK,WAAU,0CAA0C,gBAAK;AAAA,OACjE;AAAA,EAEJ;AAEA,MAAI,SAAS,mBAAmB;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,CAAC,SACC;AAAA,QACJ;AAAA,QAEA;AAAA,wDAAC,+BAAO,WAAU,mEAAkE;AAAA,UACpF,8CAAC,UAAK,WAAU,0CAA0C,gBAAK;AAAA;AAAA;AAAA,IACjE;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,sDAAC,+BAAO,WAAU,wFAAuF;AAAA,QACxG;AAAA,QACA,YAAY,CAAC,YACZ,8CAAC,sCAAc,WAAU,sEAAqE;AAAA;AAAA;AAAA,EAElG;AAEJ;;;APnEI,IAAAC,uBAAA;AA7BG,IAAM,gCAAgC;AACtC,IAAM,oBAA+B,CAAC;AACtC,IAAM,mCACX;AASK,IAAM,mBAAe,6BAAgC;AAAA,EAC1D,0BAA0B;AAAA,EAC1B,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,gBAAgB;AAClB,CAAC;AAIM,SAAS,cAAc,OAA2B;AACvD,QAAuC,YAA/B,WA7DV,IA6DyC,IAAlB,0BAAkB,IAAlB,CAAb;AAER,MAAI,cAAc,6BAA6B,IAAI;AACjD,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,SACE,8CAAC,aAAa,UAAb,EAAsB,OAAO,eAC3B,UACH;AAEJ;AAEO,SAAS,kBAAkB;AAChC,QAAM,aAAS,0BAAW,YAAY;AACtC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,SAAO;AACT;;;AN1EA,IAAAC,gBAAwB;AAExB,IAAAA,iBAAqB;;;AcPd,SAAS,iBACd,WACA,SACiB;AACjB,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,oBAAqC,CAAC;AAC1C,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,wBAAoB,UAAU;AAAA,MAAO,CAAC,aACpC,SAAS,KAAK,YAAY,EAAE,WAAW,UAAU;AAAA,IACnD;AAEA,QACE,MAAM,SAAS,KACf,CAAC,kBAAkB,KAAK,CAAC,aAAa,SAAS,SAAS,KAAK,GAC7D;AACA,wBAAkB,KAAK,EAAE,MAAM,OAAO,UAAU,KAAK,CAAC;AAAA,IACxD;AAEA,WAAO;AAAA,EACT,WAAW,OAAO,cAAc,YAAY;AAC1C,WAAO,UAAU,OAAO;AAAA,EAC1B,OAAO;AACL,UAAM,IAAI,MAAM,yEAAyE,OAAO,SAAS;AAAA;AAAA,mIAEsB;AAAA,EACjI;AACF;;;AdoBM,IAAAC,uBAAA;AA5BN,SAAS,aAAa,OAAyB;AAC7C,QAAM,EAAE,YAAY,IAAI,wBAAwB,OAAO,IAAI;AAE3D,QAAM,EAAE,YAAY,CAAC,GAAG,iBAAiB,iCAAiC,IACxE,gBAAgB;AAClB,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,QAAM,eAAW,sBAAyB,IAAI;AAE9C,QAAM,0BAAsB,uBAAQ,MAAM;AACxC,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,aAAa;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,IACF,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,WAAW,MAAM,CAAC;AAEjC,QAAM,iBAAiB,aAAa,oBAAoB,SAAS,SAAS;AAE1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,CAAC,SAAS;AACtB,YAAI,MAAM;AACR;AAAA,QACF;AAEA,yBAAiB,KAAK;AAAA,MACxB;AAAA,MAEA;AAAA,uDAAC,WACC;AAAA,wDAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aACE;AAAA,cACJ;AAAA,cAEA,wDAAC,6BAAI,WAAU,oCAAmC;AAAA;AAAA,UACpD,GACF;AAAA,UACA,8CAAC,kBAAe,YAAY,GAAG,sCAAwB;AAAA,WACzD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,YAAY;AAAA,YACZ,OAAM;AAAA,YACN,iBAAiB,CAAC,MAAM;AACtB,gBAAE,eAAe;AAAA,YACnB;AAAA,YACA,kBAAkB,CAAC,MAAM;AACvB,gBAAE,eAAe;AAAA,YACnB;AAAA,YAEA;AAAA,4DAAC,UAAK,WAAU,qEAAoE,qBAEpF;AAAA,cACC,CAAC,iBACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM;AACb,qCAAiB,IAAI;AACrB,+BAAW,MAAM;AAnF/B;AAoFgB,qCAAS,YAAT,mBAAkB;AAAA,oBACpB,GAAG,CAAC;AAAA,kBACN;AAAA,kBAEC,yBAAe;AAAA,oBACd,UAAU;AAAA,sBACR,MAAM;AAAA,sBACN,OAAO,CAAC,CAAC;AAAA,oBACX;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,oBACN;AAAA,kBACF,CAAC;AAAA;AAAA,cACH;AAAA,cAED,iBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU,CAAC,MAAM;AACf,sBAAE,eAAe;AACjB,qCAAiB,KAAK;AAAA,kBACxB;AAAA,kBACA,WAAW,CAAC,MAAM;AAChB,wBAAI,EAAE,QAAQ,UAAU;AACtB,uCAAiB,KAAK;AAAA,oBACxB;AAAA,kBACF;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,aAAa;AAAA,sBACpB,eAAe,CAAC,UAAU;AACxB,yFAAyB;AAAA,sBAC3B;AAAA,sBACA,gBAAgB,MAAM;AACpB,yCAAiB,KAAK;AAAA,sBACxB;AAAA,sBACA,gBAAgB,CAAC,UAAU;AACzB,yFAAyB;AACzB,yCAAiB,KAAK;AAAA,sBACxB;AAAA,sBACA;AAAA,sBACA,KAAK;AAAA;AAAA,kBACP;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,IAAM,kBAAc,qBAAK,YAAY;;;AerI5C,IAAAC,wBAAoD;AAwB5C,IAAAC,uBAAA;AAXD,SAAS,mBAAmB,OAAgC;AACjE,QAAM;AAAA,IACJ,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SACE,+CAAC,WACC;AAAA,kDAAC,kBAAe,WAAU,0JACxB,wDAAC,yCAAgB,WAAU,oCAAmC,GAChE;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,OAAM;AAAA,QACN,iBAAiB,CAAC,MAAM;AACtB,YAAE,eAAe;AAAA,QACnB;AAAA,QACA,kBAAkB,CAAC,MAAM;AACvB,YAAE,eAAe;AAAA,QACnB;AAAA,QAEA;AAAA,yDAAC,SAAI,WAAU,sCACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,qBAAqB,CAAC;AAAA,gBACrC,UAAU,iBAAiB;AAAA,gBAE3B;AAAA,gEAAC,kCAAS,WAAU,oCAAmC;AAAA,kBACvD,8CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,YACjB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,qBAAqB,CAAC;AAAA,gBACrC,UAAU,iBAAiB;AAAA,gBAE3B;AAAA,gEAAC,kCAAS,WAAU,oCAAmC;AAAA,kBACvD,8CAAC,UAAK,uBAAS;AAAA;AAAA;AAAA,YACjB;AAAA,aACF;AAAA,UAEA,8CAAC,QAAG,WAAU,kCAAiC;AAAA,UAE/C;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,qBAAqB,UAAU,YAAY,SAAS;AAAA,cAE5D,gBAAM,KAAK,EAAE,QAAQ,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU;AACtD,sBAAM,QACJ,aAAa,KAAK,MAAM,SAAS,KAAK,aAAa,KAAK;AAC1D,sBAAM,QACJ,iBAAiB,IACb,UAAU,IACR,SACA,UACF,UAAU,IACR,SACA,UAAU,IACR,WACA;AAEV,uBACE,+CAAC,SAAI,WAAU,mCACb;AAAA,gEAAC,UAAK,WAAU,iCAAiC,iBAAM;AAAA,kBAEvD,+CAAC,WAAM,WAAU,gBACf;AAAA;AAAA,sBAAC;AAAA,uDACK,qCADL;AAAA,wBAEC,aAAY;AAAA,wBACZ,KAAK;AAAA,wBACL,KAAK;AAAA,wBACL,MAAK;AAAA,wBACL,WAAU;AAAA,wBACV;AAAA,wBACA,UAAU,CAAC,MAAM;AACf,gCAAMC,SAAQ,EAAE,OAAO;AACvB,qFAAsB,OAAOA;AAAA,wBAC/B;AAAA;AAAA,oBACF;AAAA,oBACA,8CAAC,UAAK,WAAU,wJAAuJ,eAEvK;AAAA,qBACF;AAAA,qBApBoD,KAqBtD;AAAA,cAEJ,CAAC;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAQA,SAAS,aAAa,OAA0B;AAC9C,QAAM,EAAE,SAAS,WAAW,OAAO,SAAS,IAAI;AAEhD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AC9HA,IAAAC,iBAAsB;AAGtB,IAAAC,wBAA4C;AAmCxC,IAAAC,uBAAA;AAfG,SAAS,OAAO,OAAoB;AACzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,UAAM,sBAAM,CAAC;AAE9B,QAAM,UACJ,+CAAC,SAAI,WAAU,YACb;AAAA,kDAAC,WAAM,SAAS,UAAU,WAAU,WACjC,iBACH;AAAA,IAEC,QACC,8CAAC,SAAI,WAAU,oGACb,wDAAC,QAAK,WAAW,GAAG,cAAc,aAAa,GAAG,GACpD;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,WAAW;AAAA,UACT;AAAA,UACA,CAAC,CAAC,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA,QACA,UAAU,CAAC,UAAU,cAAc,MAAM,OAAO,KAAK;AAAA,QAEpD,kBAAQ,IAAI,CAAC,WACZ,8CAAC,YAA0B,OAAO,OAAO,OACtC,iBAAO,SADG,OAAO,KAEpB,CACD;AAAA;AAAA,IACH;AAAA,IAEA,8CAAC,UAAK,WAAU,0LACd;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAY;AAAA,QACZ,MAAK;AAAA;AAAA,IACP,GACF;AAAA,KACF;AAGF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SACE,+CAAC,WACC;AAAA,kDAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,IACjC,8CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,KAC1C;AAEJ;;;AC1EA,IAAAC,wBAA6B;;;ACb7B,IAAAC,eAA4C;AAErC,SAAS,WAAW,QAAgB,UAAkB;AAC3D,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,QAAM,qBAAiB,6BAAe,CAAC,SAAS,KAAK,KAAK,SAAS,QAAQ;AAAA,IACzE,MAAM;AAAA,EACR;AAEA,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,eAAe;AAC5B,QAAM,KAAK,OAAO,eAAe,KAAK;AAEtC,QAAM,EAAE,GAAG,IAAI;AACf,QAAM,cAAc,GAAG,OAAO,MAAM,EAAE;AACtC,SAAO,KAAK,SAAS,WAAW;AAClC;;;ADiBU,IAAAC,uBAAA;AAdH,SAAS,yBAAyB,OAA+B;AACtE,QAAM,EAAE,OAAO,IAAI;AACnB,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,gBAAgB,MAAM;AAEpC,QAAM,qBAAqB,MAAM;AAEjC,SACE,8CAAC,mBACC,yDAAC,SAAI,WAAU,8BACZ;AAAA,UAAM,kBACL,gFACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAc;AAAA,UACd,cAAc,MAAM;AAAA,UACpB,sBAAsB,CAAC,UAAU;AAC/B,gBAAI,QAAQ,oBAAoB;AAC9B,+BAAiB,MAAM;AAAA,YACzB,OAAO;AACL,kCAAoB,MAAM;AAAA,YAC5B;AAAA,UACF;AAAA,UACA,qBAAqB,CAAC,OAAO,UAAU;AACrC,8BAAkB,QAAQ,OAAO,KAAK;AAAA,UACxC;AAAA;AAAA,MACF;AAAA,MAEA,8CAAC,WAAQ;AAAA,OACX;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,MAAM;AAAA,QACjB,mBAAmB,CAAC,UAAU;AAC5B,iBAAO,SAAS,aAAa;AAAA,YAC3B,eAAe;AAAA,UACjB,CAAC;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IAEA,8CAAC,WAAQ;AAAA,IAET;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,OAAM;AAAA,QACN,OAAO,MAAM;AAAA,QACb,SAAS;AAAA,UACP,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,UAC5B,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,UAC7B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,UAC9B,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,UAC9B,EAAE,OAAO,MAAM,OAAO,cAAc;AAAA,QACtC;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,iBAAO,SAAS,cAAc;AAAA,YAC5B,KAAK,CAAC;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,SAAQ;AAAA;AAAA,IACV;AAAA,IAEA,8CAAC,WAAQ;AAAA,IAET;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAQ;AAAA,QACR,SAAS,MAAM;AACb,qBAAW,QAAQ,SAAS;AAAA,QAC9B;AAAA;AAAA,IACF;AAAA,IAEA,8CAAC,WAAQ;AAAA,IAET;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,MAAM;AAAA,QACjB,wBAAwB,CAAC,UAAU;AACjC,iBAAO,SAAS,cAAc;AAAA,YAC5B,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;;;A9BrDM,IAAAC,uBAAA;AAhDC,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,6BAAyB,4BAAY,MAAM;AAC/C,UAAM,kBAAkB,mBAAmB,QAAS,SAAS;AAC7D,UAAM,QACJ,mDAAiB,4BACjB,IAAI,QAAQ,MAAO,MAAO,GAAG,CAAC;AAEhC,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAyC,gDAC1C,QACC,WAAW,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,IAFJ;AAAA,IAG7C,YAAY,CAAC,EAAE,QAAAC,QAAO,MAAM;AAC1B,UACE,eAAeA,OAAM,KACrBA,QAAO,SAAS,SAAS,KACzBA,QAAO,SAAS,KAAK,GACrB;AACA,eAAO;AAAA,MACT;AAEA,aAAOA,QAAO,SAAS,SAAS;AAAA,IAClC;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ,CAAC,GAAG,CAAC;AAAA,MACb,eAAe;AAAA,QACb,WAAW,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,UAAU,MAAM,qCAAU;AAAA,MAC1B,SAAS,CAAC,mBAAM;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,EACb;AAEA,SACE;AAAA,IAAC;AAAA,qCACK,kBADL;AAAA,MAEC,WAAU;AAAA,MAEV,wDAAC,4BAAyB,QAAgB;AAAA;AAAA,EAC5C;AAEJ;;;AgC1DA,IAAAC,iBAAiD;AAKjD,IAAAC,wBAAiD;;;ACNjD,IAAAC,iBAAmD;;;ACUnD,IAAAC,gBAMO;AACP,IAAAC,gBAAuC;AACvC,2BAGO;AACP,IAAAC,gBAA0B;AAM1B,SAAS,mBACP,OACA,OACA,OACkB;AAClB,QAAM,SAA2B,CAAC;AAClC,QAAM,OAAO,MAAM,KAAK,CAAC;AACzB,UACE,OAAO,UAAU,YAAY,SAAS,IAClC,QACA,MAAM,WAAW,KAAK,IACpB,KAAK,IAAI,GAAG,MAAM,YAAY,MAAM,GAAG,IAAI,CAAC,IAC5C,MAAM,YAAY,MAAM,GAAG;AACnC,QAAM,YAAY,IAAI,wBAAU,OAAO,OAAO,KAAK;AACnD,QAAM,aACJ,UAAU,UAAU,IAAI,IAAI,KAAK,QAAQ,UAAU,KAAK,EAAE,WAAW,CAAC;AACxE,YAAU,OAAO,QAAQ,CAAC,MAAM,WAAW;AACzC,UAAM,OAAO,aAAa;AAC1B,UAAM,KAAK,OAAO,KAAK;AACvB,QAAI,OAAO,UAAU,SAAS,QAAQ,UAAU,IAAK;AACrD,UAAM,iBAAiB,IAAI;AAAA,MACzB,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ,EAAE;AAAA,IACjB;AACA,WAAO,KAAK,cAAc;AAAA,EAC5B,CAAC;AACD,SAAO;AACT;AAEA,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAGtB,YAAY,QAAgB,MAAc;AACxC,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AAAA,EACA,IAAI,SAAkB;AACpB,WAAO,IAAI;AAAA,MACT,QAAQ,IAAI,KAAK,MAAM;AAAA,MACvB,QAAQ,IAAI,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EACA,QAAQ,KAAY;AAClB,UAAM,IAAI,IAAI,QAAQ,KAAK,MAAM;AACjC,UAAM,IAAI,IAAI,QAAQ,KAAK,IAAI;AAC/B,WAAO,IAAI,mBAAmB,GAAG,CAAC;AAAA,EACpC;AACF;AAEA,IAAM,qBAAN,MAAM,4BAA2B,wBAAU;AAAA,EAGzC,YAAY,GAAgB,GAAgB,GAAY,IAAY,GAAG;AACrE,UAAM,EAAE,KAAK,EAAE,IAAI;AACnB,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAC1D,UAAM,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AAC1D,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AACzD,UAAM,IAAI,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AAClD;AAAA,MACE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE;AAAA,MAC9C,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,IAAI,MAAM;AACR,WAAO,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,EAAE;AAAA,EAC7C;AAAA,EACA,GAAG,OAA2B;AAC5B,WACE,iBAAiB,uBACjB,MAAM,MAAM,QAAQ,KAAK,MAAM,OAC/B,MAAM,IAAI,QAAQ,KAAK,IAAI;AAAA,EAE/B;AAAA;AAAA,EAEA,IAAI,KAAY,SAAkB;AAChC,UAAM,IAAI,IAAI,QAAQ,QAAQ,IAAI,KAAK,MAAM,CAAC;AAC9C,UAAM,IAAI,IAAI,QAAQ,QAAQ,IAAI,KAAK,IAAI,CAAC;AAC5C,WAAO,IAAI,oBAAmB,GAAG,CAAC;AAAA,EACpC;AAAA,EACA,SAAS;AACP,WAAO,EAAE,MAAM,aAAa,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK;AAAA,EACnE;AAAA,EACA,IAAI,aAAa;AACf,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA,EACA,IAAI,cAAc;AAChB,WAAO,CAAC,KAAK;AAAA,EACf;AAAA,EACA,kBAAkB;AAChB,UAAM,EAAE,KAAK,EAAE,IAAI,KAAK;AACxB,QAAI,KAAK,cAAc,KAAK,OAAO,SAAS,GAAG;AAC7C,YAAMC,KAAI,KAAK,OAAO,MAAM,GAAG,EAAE;AACjC,YAAMC,KAAID,GAAE,CAAC,EAAE;AACf,YAAME,KAAIF,GAAEA,GAAE,SAAS,CAAC,EAAE;AAC1B,aAAO,IAAI,oBAAmBC,IAAGC,IAAG,KAAK,KAAK;AAAA,IAChD;AACA,UAAM,IAAI,KAAK,OAAO,CAAC;AACvB,UAAM,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,EAAE,MAAM,MAAM,CAAC,CAAC;AAChD,WAAO,IAAI,oBAAmB,KAAK,SAAS,GAAG,KAAK,KAAK;AAAA,EAC3D;AAAA,EACA,iBAAiB;AACf,UAAM,EAAE,KAAK,EAAE,IAAI,KAAK;AACxB,QAAI,KAAK,eAAe,KAAK,OAAO,SAAS,GAAG;AAC9C,YAAMF,KAAI,KAAK,OAAO,MAAM,CAAC;AAC7B,YAAMC,KAAID,GAAE,CAAC,EAAE;AACf,YAAME,KAAIF,GAAEA,GAAE,SAAS,CAAC,EAAE;AAC1B,aAAO,IAAI,oBAAmBE,IAAGD,IAAG,KAAK,KAAK;AAAA,IAChD;AACA,UAAM,IAAI,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC;AAC5C,UAAM,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,QAAQ,MAAM,EAAE,IAAI,MAAM,CAAC,CAAC;AAC3D,WAAO,IAAI,oBAAmB,KAAK,SAAS,GAAG,KAAK,KAAK;AAAA,EAC3D;AAAA,EACA,OAAO,SAAS,KAAY,MAAW;AACrC,WAAO,IAAI;AAAA,MACT,IAAI,QAAQ,KAAK,MAAM;AAAA,MACvB,IAAI,QAAQ,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EACA,OAAO,OACL,KACA,QACA,MACA,OACA,OAAe,GACf;AACA,WAAO,IAAI,KAAK,IAAI,QAAQ,MAAM,GAAG,IAAI,QAAQ,IAAI,GAAG,OAAO,IAAI;AAAA,EACrE;AAAA;AAAA,EAEA,cAAiC;AAC/B,WAAO,IAAI,kBAAkB,KAAK,QAAQ,KAAK,IAAI;AAAA,EACrD;AACF;AAEA,SAAS,aAAa,MAAmB;AACvC,QAAM,aAAa,KAAK,UAAU,IAAI;AACtC,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,GAAG,MAAM,KAAK,KAAK,qBAAqB,GAAG,CAAC;AAAA,EAC9C;AACA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,GAAG,MAAM,KAAK,WAAW,qBAAqB,GAAG,CAAC;AAAA,EACpD;AAEA,mBAAiB,QAAQ,CAAC,SAAS,UAAU;AAC3C,UAAM,gBAAgB,eAAe,KAAK;AAE1C,QACE,yBAAyB,eACzB,mBAAmB,aACnB;AACA,oBAAc,MAAM,UAAW,SAAUE,UAAsB;AAC7D,YAAI,SAAS;AACb,cAAM,iBAAiB,iBAAiBA,QAAO;AAC/C,iBAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;AACjD,oBAAU,GAAG,eAAe,CAAC,CAAC,IAAI,eAAe,iBAAiB,eAAe,CAAC,CAAC,CAAC;AAAA,QACtF;AACA,eAAO;AAAA,MACT,EAAG,OAAO;AAAA,IACZ;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAe,UAAe;AACvD,SAAO,OAAO,iBAAiB,IAAI,EAAE,QAAQ;AAC/C;AACA,SAAS,OAAO,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG;AAC3C,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AACA,SAAS,WAAW,MAAmB;AACrC,MAAI,KAAK,eAAe,QAAQ,KAAK,eAAe,QAAW;AAC7D,SAAK,WAAW,YAAY,IAAI;AAAA,EAClC;AACF;AASA,IAAM,0BAA0B,CAAC,YAAqC;AACpE,QAAM,EAAE,GAAG,GAAG,WAAW,OAAO,IAAI;AACpC,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,SAAS,cAAc,IAAI,OAAO,cAAc,IAAI,KAAK;AAC9D,UAAM,WAAW,SAAS,kBAAkB,GAAG,CAAC;AAChD,UAAM,QAAQ,SAAS;AAAA,MAAU,CAAC,OAChC,GAAG,UAAU,SAAS,aAAa;AAAA,IACrC;AACA,UAAM,mBAAmB,SAAS,MAAM,GAAG,KAAK;AAChD,QAAI,iBAAiB,SAAS,GAAG;AAC/B,YAAM,UAAU,iBAAiB,CAAC;AAClC,sBAAgB;AAChB,UAAI,OAAO,KAAK,SAAS,SAAS,CAAC;AACnC,UAAI,KAAK,GAAG;AACV,qBAAa,OAAO,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AACvD,YAAI,eAAe,QAAQ,WAAW,QAAQ;AAC5C,uBAAa,OAAO,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,QACzD;AACA,YAAI,CAAC,YAAY;AACf,uBAAa,OAAO,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC;AAAA,QACrD;AACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,cAAc,QAAQ;AACxB,WAAK;AAAA,IACP,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO,EAAE,eAAe,YAAY,KAAK,MAAM,OAAO,IAAI,KAAK;AACjE;AAEA,SAAS,6BAA6B,GAAe,GAAW;AAC9D,QAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,OACxB,IAAI,wBAAwB;AAAA,IAC1B,QAAQ;AAAA,IACR,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,WAAW;AAAA,EACb,CAAC;AACH,MAAI,CAAC,EAAE,cAAc,SAAS,EAAE,IAAK,QAAO,CAAC;AAC7C,QAAM,IAAI,EAAE,SACV,IAAK,SAAUF,IAAGD,IAAGI,IAAG;AACtB,UAAMF,KAAI,SAAS,kBAAkBD,GAAE,KAAK,aAAa,GAAG,EAAE,GAC5DI,KAAI,SAAS,kBAAkBJ,GAAE,KAAK,cAAc,GAAG,EAAE,GACzDK,KAAI,SAAS,kBAAkBL,GAAE,KAAK,iBAAiB,GAAG,EAAE,GAC5DM,KAAI,SAAS,kBAAkBN,GAAE,KAAK,iBAAiB,GAAG,EAAE,GAC5DO,KAAIP,GAAE,IAAI,sBAAsB;AAClC,WAAO,EAAE,MAAM,OAAOD,IAAGQ,GAAE,OAAON,KAAII,IAAGE,GAAE,QAAQH,KAAIE,EAAC,GAAG,KAAKH,GAAE;AAAA,EACpE,EAAG,EAAE,MAAM,GAAG,EAAE,OAAO,GACvB,IAAI,EAAE,KAAK,YAAY,CAAC;AAC1B,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,QAAM,EAAE,KAAK,EAAE,IAAI;AACnB,MAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAQ,QAAO,CAAC;AAClC,QAAM,IAAI,EAAE,QAAQ,EAAE,GAAG,GACvB,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;AACzB,SAAO,mBAAmB,GAAG,GAAG,CAAC;AACnC;AACA,IAAM,+BAA+B,CAAC,GAAU,MAAc;AAC5D,QAAM,IAAI,EAAE,QAAQ,CAAC,GACnB,EAAE,OAAO,EAAE,IAAI;AACjB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,EAAE,MAAM,EAAE,eAAe;AAClC;AACA,IAAM,yBAAyB,CAAC,GAAU,MAAc;AACtD,QAAM,IAAI,EAAE,OAAO,CAAC,GAClB,IAAI,EAAE,QAAQ,CAAC;AACjB,MAAI,EAAE,OAAO,EAAE,IAAI,GACjB,IAAI;AACN,SAAO,IAAI,KAAK;AACd,UAAMH,KAAI,EAAE,KAAK,CAAC;AAClB,IAAC,KAAK,GAAI,MAAM,MAAM,IAAIA;AAAA,EAC5B;AACA,SAAO;AACT;AACA,IAAM,eAAe,CAAC,KAAkB,QAAgB;AACtD,QAAM,IAAI,oCAAe,SAAS,GAAG;AACrC,SAAO,QACH,yDAAmC,KAAK,EAAE,MAAM,EAAE,QAAQ,OAAO,IACjE;AACN;AAGA,IAAM,kBAAkB,CAAC,GAAG,MAAM;AAChC,MAAI,IAAI;AACR,SAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAO,KAAI,EAAE;AAC5D,SAAO;AACT;AAcO,IAAM,6BAA6B,IAAI,wBAAU,YAAY;AAC7D,SAAS,iBACd,SAC6B;AAC7B,QAAM;AAAA,IACJ,WAAW,IAAI;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,MAAI,gBAAiC;AACrC,MAAI,IAAI;AACR,MAAI,cAA4B;AAChC,MAAI,cAAc;AAClB,UAAQ,iBAAiB,aAAa,CAACA,OAAM;AAC3C,UAAM,EAAE,KAAK,IAAI;AACjB,QAAI,CAACA,GAAE,aAAc;AACrB,UAAM,EAAE,OAAO,OAAO,IAAI,IAAI,KAAK,MAAM;AACzC,UAAM,IAAI,6BAA6BA,IAAG,MAAM;AAChD,UAAM,IAAI,mBAAmB,OAAO,KAAK,CAAC;AAC1C,UAAM,IAAI,EAAE;AAAA,MAAK,CAACA,OAChB,EAAE,KAAK,CAAC,MAAM,EAAE,UAAUA,GAAE,SAAS,EAAE,QAAQA,GAAE,GAAG;AAAA,IACtD;AACA,UAAM,IAAI,SAAS,CAAC,IAAI,IAAI;AAC5B,QAAI,CAAC,EAAE,OAAQ;AACf,UAAM,EAAE,IAAI,EAAE,IAAI,KAAK;AACvB,UAAM,IAAI,SAAS,cAAc,KAAK;AACtC,UAAM,IAAI,EAAE,CAAC,EAAE,MAAM;AACrB,UAAM,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI;AAC9B,UAAM,IAAI,mBAAmB,OAAO,KAAK,MAAM,KAAK,GAAG,CAAC;AACxD,UAAM,IAAI,EAAE,QAAQ;AACpB,MAAE,QAAQ,CAACA,OAAM;AACf,YAAM,IAAI,aAAa,6BAAM,QAAQA,GAAE,MAAM,IAAmB;AAChE,QAAE,OAAO,CAAC;AAAA,IACZ,CAAC;AACD,MAAE,MAAM,WAAW;AACnB,MAAE,MAAM,MAAM;AACd,aAAS,KAAK,OAAO,CAAC;AACtB,IAAAA,GAAE,aAAa,UAAU;AACzB,IAAAA,GAAE,aAAa,aAAa,GAAG,GAAG,CAAC;AACnC,SAAK,WAAW,EAAE,OAAO,GAAG,MAAM,KAAK;AACvC,MAAE,aAAa,CAAyB;AACxC,SAAK,SAAS,CAAC;AACf,aAAS,iBAAiB,QAAQ,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;AACrE,eAAW,MAAM;AACf,kBAAY,QAAQ,MAAM,gBAAgB;AAAA,IAC5C,GAAG,CAAC;AAAA,EACN,CAAC;AACD,UAAQ,iBAAiB,WAAW,MAAM;AACxC,gBAAY,QAAQ,MAAM,gBAAgB;AAAA,EAC5C,CAAC;AAED,SAAO,IAAI,qBAAO;AAAA,IAChB,KAAK,OAAO,MAAM,WAAW,IAAI,wBAAU,CAAC,IAAI;AAAA,IAChD,OAAO;AAAA,MACL,MAAM,OAAO,EAAE,QAAQ,MAAM;AAAA,MAC7B,MAAMA,IAAG,GAAG,GAAG,GAAG;AAChB,cAAM,IAAIA,GAAE,QAAQ,gBAAgB;AACpC,cAAM,IAAIA,GAAE,QAAQ,gBAAgB;AACpC,YAAK,WAAc,MAAM,IAAI,IAAI,KAAK,eAAgB;AACpD,iBACE,+CAAe,QACd,IAAI,OACJ,cAAc,MACd,cAAc,IACf,QAAQ,gBACN,aAAa,EAAE,QAAgB,MAAM,MAAM,KAAK,GAAG,CAAC,GACtD;AAAA,QAEJ;AACA,YAAIA,GAAE,cAAc,OAAO,eAAe,WAAW,eAAe;AAClE,gBAAMD,KAAIC,GAAE,QAAQ,IAAI,WAAW;AACnC,UAAAD,OAAM,gBACF,cAAcA,IAAI,aAAa,GAAG,WAAW;AAAA,QACnD;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,CAACC,OAAM;AACX,UAAI;AACJ,aACG,QAAQ,YAAY,MACpB,QAAQ,MAAM,gBAAgB,QAC/B,UAAU,IAAI,OAAO,KAAK,IAAI,kBAC5B,WAAc,KACd,EAAE,YAAY,SAAS,GACzB,UAAU,YAAY,OAAO,GAC5B,UAAU,MAAM,gBAAgB,QAChC,UAAU,MAAM,WAAW,YAC3B,UAAU,MAAM,MAAM,KACtB,UAAU,MAAM,OAAO,KACvB,oBAAgB,cAAAQ,SAAMR,GAAE,KAAK;AAAA,QAC5B,wBAAwB;AAAA,QACxB,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,eAAe;AAAA,UACb,WAAW;AAAA,YACT,EAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,YAC/B;AAAA,cACE,MAAM;AAAA,cACN,SAAS,EAAE,cAAc,YAAY,UAAU,MAAM;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA,SACG,eAjByB;AAAA,QAkB5B,UAAU;AAAA,QACV,SAAS;AAAA,MACX,EAAC,GACD;AAAA,QACE,OAAOD,IAAG,GAAG;AACX,cAAI,CAAC,WAAW,CAAC,cAAe;AAChC,cACI,QAAQ,YAAY,CAAC,GACvBC,GAAE,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,OAAO;AAEhC;AACF,cAAI,IAAIA,GAAE,QAAQ,WAAW;AAC7B,cAAM,IAAI,gBAAgBA,IAAG,CAAC,GAAI,MAAMA,GAAE,IAAM;AAChD,cAAI,OAAO,QAAQ,IAAI,SAAY,EAAE,UAAW;AAChD,gBAAM,IAAIA,GAAE,SAAS,GAAG,CAAC,GACvB,IAAI,uBAAuB,OAAO,MAAM,KAAK,CAAC;AAChD,cAAI,MAAM,aAAa;AACrB,kBAAMD,KAAI,6BAA6B,OAAO,MAAM,KAAK,CAAC;AAC1D,YAAC,cAAc,GACZ,cAAcA,IACf,aAAaC,GAAE,OAAO,WAAW,GACjC,QAAQ,gBACN,aAAa;AAAA,cACX;AAAA,cACA,MAAM;AAAA,cACN,KAAK;AAAA,YACP,CAAC,GACH,cAAc,SAAS;AAAA,cACrB,wBAAwB,MAAM,uBAAG;AAAA,YACnC,CAAC,GACD,cAAc,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,QACA,UAAU;AACR,kBAAQ,iBAAiB,cAAc,QAAQ,GAC7C,WAAW,WAAW,SAAS;AAAA,QACnC;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,OAAO;AAAA,MACL,iBAAiB;AAAA,QACf,YAAY,CAACA,IAAG,WACd,KACG,MAAM,UACL,CAAC,UAAU,SAAS,+BAAO,aAAqB,MAC/C,QAAQ,iBAAiB,cAAc,KAAK,GAC5C,cAAc,MACd,cAAc,IACf,QAAQ,gBACN,aAAa,EAAE,QAAgB,MAAM,MAAM,KAAK,GAAG,CAAC,IAC1D;AAAA,QAEF,UAAUA,IAAG,GAAG;AACd,cAAI,CAAC,WAAW,CAAC,iBAAiB,EAAG,QAAO;AAC5C,gBAAM,IAAI,wBAAwB;AAAA,YAChC,GAAG,EAAE;AAAA,YACL,GAAG,EAAE;AAAA,YACL,WAAW;AAAA,YACX;AAAA,UACF,CAAC;AACD,cAAI,CAAC,EAAE,cAAe,QAAO;AAC7B,cAAI,IAAI,EAAE;AACV,cAAM,IAAI,gBAAgBA,IAAG,CAAC,GAAI,MAAMA,GAAE,IAAM,QAAO;AACvD,cAAI,OAAO,QAAQ,IAAI,SAAY,EAAE,UAAW,QAAO;AACvD,gBAAM,IAAIA,GAAE,SAAS,GAAG,CAAC,GACvB,IAAI,uBAAuB,OAAO,MAAM,KAAK,CAAC;AAChD,cAAI,MAAM,aAAa;AACrB,kBAAMD,KAAI,6BAA6B,OAAO,MAAM,KAAK,CAAC;AAC1D,YAAC,cAAc,GACZ,cAAcA,IACf,aAAaC,GAAE,OAAO,WAAW,GACjC,QAAQ,gBACN,aAAa;AAAA,cACX;AAAA,cACA,MAAM;AAAA,cACN,KAAK;AAAA,YACP,CAAC,GACH,cAAc,SAAS;AAAA,cACrB,wBAAwB,MAAM,EAAE,sBAAsB;AAAA,YACxD,CAAC,GACD,cAAc,KAAK;AAAA,UACvB;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ADncI,IAAAS,uBAAA;AA7CG,SAAS,WAAW,OAAwB;AACjD,QAAM;AAAA,IACJ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,eAAe,CAAC;AAAA,EAClB,IAAI;AAEJ,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAgC,IAAI;AAClE,QAAM,gBAAY,uBAAmD,IAAI;AAEzE,gCAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM;AACX,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,OAAO,aAAa;AACtB,aAAO,MAAM;AACX,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,SAAS;AACtB,gBAAU,UAAU,iBAAiB;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO,eAAe,UAAU,OAAO;AAAA,IACzC;AAEA,WAAO,MAAM;AACX,aAAO,iBAAiB,SAAS;AACjC,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,cAAc,SAAS,CAAC;AAE7C,SACE,8CAAC,SAAI,WAAsB,KAAK,YAC7B,UACH;AAEJ;;;ADsDU,IAAAC,uBAAA;AAzGH,SAAS,YAAY,OAAyB;AACnD,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAsB,IAAI;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAiB,EAAE;AAE/D,QAAM,uBAAmB;AAAA,IACvB,CAAC,SAA6D;AAC5D,UAAI,KAAK,MAAM;AACb,uBAAe,KAAK,IAAI;AAAA,MAC1B;AAEA,wBAAkB,KAAK,GAAG;AAAA,IAC5B;AAAA,IACA,CAAC,mBAAmB,cAAc;AAAA,EACpC;AAEA,WAAS,gBAAgB;AACvB,WAAO,SAAS,iBAAiB,cAAc;AAC/C,UAAM,EAAE,QAAQ,IAAI,OAAO,MAAM;AACjC,UAAM,eACJ,QAAQ,KAAK,CAAC,KAAM,OAAO,MAAM,UAA4B;AAC/D,WACG,MAAM,EACN,QAAQ,kBAAkB,IAAI,EAC9B;AAAA,MACC,mBAAkB,2CAAa,aAAY;AAAA,MAC3C,aAAa,OAAO;AAAA,IACtB,EACC,IAAI;AAEP,gBAAY,KAAK;AAAA,EACnB;AAEA,WAAS,oBAAoB;AAC3B,WACG,MAAM,EACN,QAAQ,kBAAkB,IAAI,EAC9B,iBAAiB,cAAc,EAC/B,gBAAgB,EAChB,IAAI;AAEP,gBAAY,KAAK;AAAA,EACnB;AAEA,WAAS,mBAAmB;AApE9B;AAqEI,QAAI,mBAAmB,IAAI;AACzB,YAAM,mBAAkB,2CAAa,aAAY;AACjD,YAAM,YAAY,iBAAiB;AACnC,YAAM,+BACJ,2CAAa,KAAK,UAAS,iBAC3B,gDAAa,YAAb,mBAAsB,UAAS;AACjC,YAAM,WAAW,8BACb,iBAAiB,IACjB,YAAY;AAChB,aACG,MAAM,EACN,QAAQ,CAAC,EAAE,UAAU,IAAI,MAAM,MAAW;AACzC,YAAI,UAAU;AACZ,cAAI,6BAA6B;AAC/B,eAAG,WAAW,KAAK,gBAAgB,iBAAiB,CAAC;AAAA,UACvD,OAAO;AACL,eAAG;AAAA,cACD;AAAA,cACA,MAAM,OAAO,MAAM,UAAU,OAAO,MAAM;AAAA,gBACxC,MAAM,OAAO,KAAK,GAAG;AAAA,cACvB,CAAC;AAAA,YACH;AAAA,UACF;AAEA,iBAAO,SAAS,EAAE;AAAA,QACpB;AAEA,eAAO;AAAA,MACT,CAAC,EACA,MAAM,QAAQ,EACd,IAAI;AAAA,IACT;AAAA,EACF;AAEA,gCAAU,MAAM;AACd,QAAI,UAAU;AACZ,aAAO,SAAS,QAAQ,kBAAkB,IAAI;AAAA,IAChD,OAAO;AACL,aAAO,SAAS,QAAQ,kBAAkB,KAAK;AAAA,IACjD;AAEA,WAAO,MAAM;AACX,aAAO,SAAS,QAAQ,kBAAkB,KAAK;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA,cAAc;AAAA,QACZ,QAAQ,CAAC,GAAG,CAAC;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,cAAc;AAAA,MAEd,wDAAC,mBACC,yDAAC,SAAI,WAAU,wCACb;AAAA,uDAAC,WACC;AAAA,wDAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,MAAK;AAAA,cAEL,wDAAC,8BAAK,WAAU,6BAA4B;AAAA;AAAA,UAC9C,GACF;AAAA,UACA,8CAAC,kBAAe,YAAY,GAAG,0BAAY;AAAA,WAC7C;AAAA,QACA,+CAAC,WAAQ,MAAM,UAAU,cAAc,aACrC;AAAA,yDAAC,SAAI,WAAU,sCACb;AAAA,2DAAC,WACC;AAAA,4DAAC,kBAAe,SAAO,MACrB;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,CAAC,MAAM;AACd,sBAAE,eAAe;AACjB,gCAAY,IAAI;AAChB,2BAAO,SAAS,iBAAiB,cAAc;AAAA,kBACjD;AAAA,kBACA,MAAK;AAAA,kBAEL,wDAAC,sCAAa,WAAU,6BAA4B;AAAA;AAAA,cACtD,GACF;AAAA,cACA,8CAAC,kBAAe,YAAY,GAAG,0BAAY;AAAA,eAC7C;AAAA,YACA,8CAAC,kBAAe,WAAU,6DAA4D;AAAA,aACxF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,YAAY;AAAA,cACZ,WAAU;AAAA,cAEV;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,WAAU;AAAA,oBAEV;AAAA,oEAAC,8BAAK,WAAU,gCAA+B;AAAA,sBAAE;AAAA;AAAA;AAAA,gBAEnD;AAAA,gBACA,8CAAC,WAAQ,MAAK,cAAa;AAAA,gBAC3B;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,WAAU;AAAA,oBAEV;AAAA,oEAAC,gCAAO,WAAU,gCAA+B;AAAA,sBAAE;AAAA;AAAA;AAAA,gBAErD;AAAA;AAAA;AAAA,UACF;AAAA,WACF;AAAA,SACF,GACF;AAAA;AAAA,EACF;AAEJ;;;AGhMA,IAAAC,iBAAwB;AAExB,IAAAC,wBAWO;AA6IO,IAAAC,uBAAA;AA7HP,IAAM,gBAAgB,CAAC,UAA8B;AAC1D,QAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,QAAM,YAA0B;AAAA,IAC9B,MAAM;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,QACvD,UAAU,MAAM,OAAO,SAAS,MAAM;AAAA,QACtC,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,QACzD,UAAU,MAAM,OAAO,SAAS,QAAQ;AAAA,QACxC,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,QAC5D,UAAU,MAAM,OAAO,SAAS,WAAW;AAAA,QAC3C,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,QACzD,UAAU,MAAM,OAAO,SAAS,QAAQ;AAAA,QACxC,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MACP,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,IAAI;AAAA,QAClE,UAAU,MAAM;AAAA,QAChB,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,QAC9D,UAAU,MAAM,OAAO,SAAS,gBAAgB;AAAA,QAChD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM;AACb,gBAAM,cAAc,OAAO,cAAc,MAAM,EAAE;AACjD,gBAAM,MAAM,OAAO,OAAO,OAAO,WAAW;AAE5C,cAAI,QAAQ,KAAM;AAElB,cAAI,QAAQ,IAAI;AACd,mBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAC/D;AAAA,UACF;AAGA,iBACG,MAAM,EACN,MAAM,EACN,gBAAgB,MAAM,EACtB,QAAQ,EAAE,MAAM,IAAI,CAAC,EACrB,IAAI;AAAA,QACT;AAAA,QACA,UAAU,MAAM,OAAO,SAAS,MAAM;AAAA,QACtC,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI;AAAA,QAC/D,UAAU,MAAM,OAAO,SAAS,EAAE,WAAW,OAAO,CAAC;AAAA,QACrD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,QAAQ,EAAE,IAAI;AAAA,QACjE,UAAU,MAAM,OAAO,SAAS,EAAE,WAAW,SAAS,CAAC;AAAA,QACvD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,OAAO,EAAE,IAAI;AAAA,QAChE,UAAU,MAAM,OAAO,SAAS,EAAE,WAAW,QAAQ,CAAC;AAAA,QACtD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,aAAS;AAAA,IACb,MACE,MAAM,OAAO,CAAC,KAAK,SAAS;AAC1B,UAAI,CAAC,IAAI,SAAS,KAAK,KAAK,GAAG;AAC7B,YAAI,KAAK,KAAK,KAAK;AAAA,MACrB;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAa;AAAA,IACnB,CAAC,KAAK;AAAA,EACR;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,uCAAuC,iCAAQ,gBAAgB;AAAA,MAEzE,iBAAO,IAAI,CAAC,OAAO,UAClB;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAET,gBACE,OAAO,CAAC,SAAS,KAAK,UAAU,KAAK,EACrC,IAAI,CAAC,MAAMC,WACV,8CAAC,qCAAiC,OAAXA,MAAiB,CACzC;AAAA;AAAA,QAPE;AAAA,MAQP,CACD;AAAA;AAAA,EACH;AAEJ;;;AC1JA,IAAAC,iBAAyC;AACzC,IAAAC,wBAKO;AACP,IAAAD,iBAAuD;AACvD,IAAAE,gBAAuB;;;ACdvB,IAAAC,iBAAuC;AACvC,IAAAC,0BAAoB;AAEb,IAAM,cAAc,CAAC,WAAmB;AAC7C,QAAM,aAAS,+BAAe;AAAA,IAC5B;AAAA,IACA,UAAU,CAAC,QAAQ;AANvB;AAOM,aAAO;AAAA,QACL,OAAM,SAAI,OAAO,cAAc,KAAK,MAA9B,mBAAiC;AAAA,QACvC,oBAAkB,SAAI,OAAO,cAAc,KAAK,MAA9B,mBAAiC,cAAa;AAAA,QAEhE,iBAAiB,IAAI,OAAO,SAAS,SAAS;AAAA,MAChD;AAAA,IACF;AAAA,IACA,YAAY,wBAAAC;AAAA,EACd,CAAC;AAED,SAAO;AACT;;;ADsFU,IAAAC,uBAAA;AA1EH,SAAS,cAAc,OAA8B;AAC1D,QAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,MAAM;AAEhC,QAAM,6BAAyB,4BAAY,MAAM;AAC/C,UAAM,kBAAkB,mBAAmB,QAAS,KAAK;AACzD,UAAM,QACJ,mDAAiB,4BACjB,IAAI,QAAQ,MAAO,MAAO,GAAG,CAAC;AAEhC,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAyC,gDAC1C,QACC,WAAW,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,IAFJ;AAAA,IAG7C,YAAY,CAAC,EAAE,QAAAC,QAAO,MAAM;AAlDhC;AAmDM,YAAM,gBAAgB,qBAAqBA,SAAQ,KAAK;AACxD,YAAM,sBAAsB,iBACxB,sCAAa,+CAAe,MAAM,CAAC,SAAS;AAC1C,eAAO,KAAK,KAAK,SAAS;AAAA,MAC5B,CAAC,MAFD,mBAEK,KACL;AACJ,YAAM,+BACJ,uBAAuBA,QAAO,SAAS,SAAS;AAElD,UAAI,eAAeA,OAAM,KAAK,8BAA8B;AAC1D,eAAO;AAAA,MACT;AAEA,aAAOA,QAAO,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ,CAAC,GAAG,CAAC;AAAA,MACb,eAAe;AAAA,QACb,WAAW,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,UAAU,MAAM,qCAAU;AAAA,MAC1B,SAAS,CAAC,oBAAM;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,EACb;AAEA,QAAM,EAAE,YAAY,CAAC,GAAG,iBAAiB,iCAAiC,IACxE,gBAAgB;AAClB,QAAM,eAAW,uBAAyB,IAAI;AAC9C,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AAExD,QAAM,WAAU,+BAAO,SAAQ;AAC/B,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,WAAW;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,IACR,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,SAAS,MAAM,CAAC;AAE/B,QAAM,iBAAiB;AAEvB,SACE;AAAA,IAAC;AAAA,qCACK,kBADL;AAAA,MAEC,WAAU;AAAA,MAEV,yDAAC,mBACC;AAAA,uDAAC,SAAI,WAAU,iFAAgF;AAAA;AAAA,UAE7F,+CAAC,WACC;AAAA,0DAAC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,GAAG,+CAA+C;AAAA;AAAA,YAC/D,GACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,YAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,OAAM;AAAA,gBACP;AAAA;AAAA,YAGD;AAAA,aACF;AAAA,WACF;AAAA,QACC,CAAC,iBACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM;AACb,+BAAiB,IAAI;AACrB,yBAAW,MAAM;AA5H/B;AA6HgB,+BAAS,YAAT,mBAAkB;AAAA,cACpB,GAAG,CAAC;AAAA,YACN;AAAA,YAEC,yBAAe;AAAA,cACd,UAAU;AAAA,gBACR,MAAM,+BAAO;AAAA,gBACb,OAAO;AAAA,cACT;AAAA,cACA,UAAU;AAAA,cACV,MAAM;AAAA,cACN;AAAA,YACF,CAAC;AAAA;AAAA,QACH;AAAA,QAED,iBACC;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAC,MAAM;AACf,gBAAE,eAAe;AACjB,+BAAiB,KAAK;AAAA,YACxB;AAAA,YACA,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,UAAU;AACtB,iCAAiB,KAAK;AAAA,cACxB;AAAA,YACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,QAAO,+BAAO,SAAQ;AAAA,gBACtB,eAAe,CAAC,UAAU;AACxB,yBAAO,SAAS,UAAU;AAAA,oBACxB,MAAM;AAAA,kBACR,CAAC;AAAA,gBACH;AAAA,gBACA,gBAAgB,MAAM;AACpB,mCAAiB,KAAK;AAAA,gBACxB;AAAA,gBACA,gBAAgB,CAAC,UAAU;AACzB,yBAAO,SAAS,UAAU;AAAA,oBACxB,MAAM;AAAA,kBACR,CAAC;AACD,mCAAiB,KAAK;AAAA,gBACxB;AAAA,gBACA;AAAA,gBACA,KAAK;AAAA;AAAA,YACP;AAAA;AAAA,QACF;AAAA,QAGF,8CAAC,WAAQ;AAAA,QACT;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,wBAAwB,CAAC,UAAU;AACjC,qBAAO,SAAS,UAAU;AAAA,gBACxB,WAAW;AAAA,cACb,CAAC;AAAA,YACH;AAAA,YACA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AE5LA,IAAAC,iBAA2B;AAC3B,IAAAC,wBAAwC;;;ACDxC,IAAAC,wBAAmD;AAqC/C,IAAAC,uBAAA;AA5BG,SAAS,gBAAgB,OAA6B;AAC3D,QAAM,EAAE,YAAY,QAAQ,kBAAkB,IAAI;AAElD,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,MAAM;AACb,0BAAkB,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,EAAE,SAAS;AAEX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,gBAAgB;AAAA,MACtB,SAAS,gBAAgB;AAAA,MACzB,SAAS,gBAAgB;AAAA;AAAA,EAC3B;AAEJ;;;AC3CA,IAAAC,wBAMO;AAGP,IAAAC,iBAAiC;AASjC,IAAAC,iBAAwB;AAmEhB,IAAAC,uBAAA;AAhER,IAAM,sBAAsB;AAarB,SAAS,iBAAiB,OAA8B;AAlC/D;AAmCE,QAAM;AAAA,IACJ,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb;AAAA,IAEA;AAAA,EACF,IAAI;AAEJ,QAAM,mBAAkB,kBAAa,MAAM,mBAAmB,MAAtC,mBAA0C;AAClE,QAAM,4BAA4B,aAAa;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAEA,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,mBAAmB,UAAU;AACtE,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,CAAC,UAAU;AAEtD,QAAM,mBAAe,uBAAyB,IAAI;AAElD,QAAM;AAAA,IACJ,YAAY,CAAC;AAAA,IACb,2BAA2B;AAAA,IAC3B,iBAAiB;AAAA,EACnB,IAAI,gBAAgB;AAEpB,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,UAAM,iBAAiB,0BAA0B;AAAA,MAC/C,IAAI,OAAO,0BAA0B,GAAG;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,kBAAkB;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,IACF,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,2BAA2B,MAAM,CAAC;AAEjD,QAAM,gBACJ,8CAAC,kBAAe,SAAO,MACrB;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAU;AAAA,MACV,cAAY,CAAC,CAAC;AAAA,MAEd,wDAAC,QAAK,WAAU,wEAAuE;AAAA;AAAA,EACzF,GACF;AAGF,QAAM,oBAAoB,CAAC,OAAe,IAAY,aAAa;AAGjE,YAAQ,+BAAO,QAAQ,qBAAqB;AAC5C,WAAO,IAAI;AAAA,EACb;AAEA,SACE,+CAAC,WAAQ,MAAM,QAAQ,cAAc,WAClC;AAAA,cACC,+CAAC,WACC;AAAA,oDAAC,kBAAe,SAAO,MAAE,yBAAc;AAAA,MACvC,8CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,OAC1C,IAEA;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAK;AAAA,QACL,WAAU;AAAA,QACV,YAAY;AAAA,QACZ,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,QAE1C;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAC,MAAM;AACf,gBAAE,eAAe;AACjB,oBAAM,QAAQ,aAAa;AAC3B,kBAAI,CAAC,OAAO;AACV;AAAA,cACF;AAEA,kBAAI,QAAQ,kBAAkB,MAAM,KAAK;AACzC,6DAAgB;AAChB,wBAAU,KAAK;AAAA,YACjB;AAAA,YAEA,yDAAC,SAAI,WAAU,uCACZ;AAAA,eAAC,aACA,8CAAC,SAAI,WAAU,2GACb;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM;AACb,iCAAa,IAAI;AACjB,+BAAW,MAAM;AAtIrC,0BAAAC;AAuIsB,uBAAAA,MAAA,aAAa,YAAb,gBAAAA,IAAsB;AAAA,oBACxB,GAAG,CAAC;AAAA,kBACN;AAAA,kBAEC,yBAAe;AAAA,oBACd,UAAU;AAAA,sBACR,MAAM;AAAA,sBACN,OAAO;AAAA,oBACT;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,oBACN;AAAA,kBACF,CAAC;AAAA;AAAA,cACH,GACF;AAAA,cAGD,aACC,gFACE;AAAA,+DAAC,SAAI,WAAU,gBACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,cAAW;AAAA,sBACX,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AA/JrC,4BAAAA;AAgKsB,8BAAMC,YAAW,EAAE,OAAO;AAE1B,oCAAYA,SAAQ;AACpB,8BAAM,WAAW;AAAA,4BACfD,MAAA,aAAa,YAAb,gBAAAA,IAAsB,UAAS;AAAA,0BAC/BC;AAAA,wBACF;AACA,uEAAgB;AAAA,sBAClB;AAAA,sBAEA;AAAA,sEAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,wBACjC,8CAAC,YAAO,OAAM,WAAU,qBAAO;AAAA;AAAA;AAAA,kBACjC;AAAA,kBACA,8CAAC,UAAK,WAAU,0LACd;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM;AAAA,sBACN,aAAa;AAAA,sBACb,eAAY;AAAA,sBACZ,MAAK;AAAA;AAAA,kBACP,GACF;AAAA,mBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,eAAe,CAAC,UAAU;AACxB,0BAAI,WAAW,kBAAkB,KAAK;AACtC,qEAAgB;AAAA,oBAClB;AAAA,oBACA;AAAA,oBACA,KAAK;AAAA,oBACL,aAAY;AAAA,oBACZ,WAAU;AAAA,oBACV,aAAa;AAAA,oBACb,gBAAgB,CAAC,UAAU;AAlM7C,0BAAAD;AAmMoB,4BAAME,eACJF,MAAA,oBAAoB,SAAS,KAAK,MAAlC,OAAAA,MAAuC;AACzC,0BAAIE,aAAY;AACd,qCAAa,KAAK;AAAA,sBACpB,OAAO;AACL,gCAAQ,kBAAkB,KAAK;AAAA,sBACjC;AAEA,qEAAgB,OAAOA;AACvB,gCAAU,KAAK;AAAA,oBACjB;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,eAEJ;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AC1MI,IAAAC,uBAAA;AAJG,SAAS,UAAU,OAAuB;AAC/C,QAAM,EAAE,OAAO,eAAe,UAAU,IAAI;AAE5C,SACE,+CAAC,WAAM,WAAU,0CACf;AAAA,kDAAC,UAAK,WAAU,kHACb,wBAAc,UAAU,MAAM,KACjC;AAAA,IACA;AAAA,MAAC;AAAA,uCACK,qCADL;AAAA,QAEC,WAAU;AAAA,QACV,MAAK;AAAA,QACL;AAAA,QACA,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA;AAAA,IAC/C;AAAA,IACA,8CAAC,UAAK,WAAU,mHAAkH,gBAElI;AAAA,KACF;AAEJ;;;AC5BA,6BAAwB;AACxB,IAAAC,iBAAsC;;;ACAtC,IAAAC,eAAsC;AAE/B,IAAM,mCAAmC;AACzC,IAAM,wBAAwB;AAC9B,IAAM,+BAA+B;AACrC,IAAM,+BAA+B;AAGrC,IAAM,6BAA6B;AACnC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,8BAA8B;AAEpC,IAAM,8BAA8B;AACpC,IAAM,gCAAgC;AACtC,IAAM,iCAAiC;AACvC,IAAM,+BAA+B;AAErC,IAAM,8BAA8B;AA+BpC,IAAM,mBAAmB,kBAAK,OAAO;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA7DhC;AA8DU,iBAAO,QAAO,8CAAS,UAAT,mBAAgB,iBAAhB,mBAA8B,QAAQ,UAAU,GAAG;AAAA,QACnE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,cAAc;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,kBAAkB,WAAW,YAAY;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,iBAAiB;AAAA,QACf,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,MAAM;AAAA,QACvB;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,iBAAiB;AAC/B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,qBAAqB,WAAW,eAAe,gBAAgB,WAAW,eAAe;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,OAAO,KAAK;AAAA,QAC1C;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,WAAW;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA1GhC;AA2GU,iBACE,QAAO,8CAAS,UAAT,mBAAgB,gBAAhB,mBAA6B,QAAQ,UAAU,GAAG,KAAK;AAAA,QAElE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,iBAAiB,WAAW,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,MAAM;AAAA,QACvB;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,iBAAiB,WAAW,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AA1IhC;AA2IU,iBAAO,QAAO,8CAAS,UAAT,mBAAgB,eAAhB,mBAA4B,QAAQ,UAAU,GAAG,KAAK;AAAA,QACtE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,YAAY;AAC1B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,gBAAgB,WAAW,UAAU;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAzJ7B;AA0JU,yBAAO,8CAAS,UAAT,mBAAgB,iBAAhB,mBAA8B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QACjE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,cAAc;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,kBAAkB,WAAW,YAAY;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAvK7B;AAwKU,yBAAO,8CAAS,UAAT,mBAAgB,kBAAhB,mBAA+B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAClE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,mBAAmB,WAAW,aAAa;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AArL7B;AAsLU,yBAAO,8CAAS,UAAT,mBAAgB,gBAAhB,mBAA6B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAChE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,iBAAiB,WAAW,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AAnMhC;AAoMU,iBAAO,QAAO,8CAAS,UAAT,mBAAgB,cAAhB,mBAA2B,QAAQ,UAAU,GAAG,KAAK;AAAA,QACrE;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,WAAW,WAAW;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAlN7B;AAmNU,yBAAO,8CAAS,UAAT,mBAAgB,gBAAhB,mBAA6B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAChE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,aAAa;AAC3B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,aAAa,WAAW;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AAhO7B;AAiOU,yBAAO,8CAAS,UAAT,mBAAgB,iBAAhB,mBAA8B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QACjE,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,cAAc;AAC5B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,cAAc,WAAW;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,YAAS;AA9O7B;AA+OU,yBAAO,8CAAS,UAAT,mBAAgB,eAAhB,mBAA4B,QAAQ,UAAU,GAAG,KAAK;AAAA;AAAA,QAC/D,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,YAAY;AAC1B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,YAAY,WAAW;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,MAAM,KAAK;AAAA,UACb;AAAA,UACA,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACF,eAAe,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,aAAa;AAAA,IACf,IAAIA;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,aAAa,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,aAAa;AAAA,QACb,OAAO;AAAA,QACP,OAAO,eAAe,SAAS,qBAAqB,WAAW,sBAAsB,YAAY,oBAAoB,UAAU;AAAA,MACjI;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,UACE,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,YACE,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE;AAAA,gBACA,8BAAgBA,iBAAgB;AAAA,cAC9B,aAAa;AAAA,cACb,OAAO;AAAA,cACP,OAAO;AAAA,YACT,CAAC;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACrVD,IAAAC,iBAAgC;AAChC,IAAAA,iBAA0B;AAC1B,IAAAA,iBAAyB;;;ACHzB,IAAAC,iBAAqD;AAE9C,IAAM,WAAW,CAAoC,YAAkB;AAC5E,QAAM,iBAAa,uBAAiB,IAAI;AAExC,sCAAgB,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AAEZ,aAAO,4BAAY,IAAI,SAAuC;AAC5D,QAAI,WAAW,YAAY,MAAM;AAC/B,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,WAAO,WAAW,QAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC,CAAC;AACP;;;ACbA,IAAAC,iBAAoD;AACpD,IAAAC,wBAAuD;AACvD,IAAAD,iBAAgE;AAyE1D,IAAAE,uBAAA;AAvEN,IAAM,YAAY;AAClB,IAAM,YAAY;AAIX,SAAS,UAAU,OAAsB;AAC9C,QAAM,EAAE,MAAM,kBAAAC,mBAAkB,SAAS,IAAI;AAE7C,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAsB,MAAM;AAExD,QAAM,iBAAa,uBAAuB,IAAI;AAC9C,QAAM,aAAS,uBAAyB,IAAI;AAE5C,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAExC;AAEF,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAA4C;AAC3C,YAAM,cAAc,SAAS;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,WAAW,CAAC,eAAe,CAAC,UAAU;AAChD;AAAA,MACF;AAEA,YAAM,mBAAmB,KAAK,IAAI,YAAY,aAAa,SAAS;AAEpE,YAAM,eAAe;AACrB,YAAM,YAAY,MAAM,cAAc,QAAQ,aAAa;AAC3D,YAAM,mBAAmB,MAAM;AAC/B,YAAM,eAAe,OAAO,QAAQ;AACpC,YAAM,gBAAgB,OAAO,QAAQ;AACrC,UAAI,WAAW;AACf,UAAI,YAAY;AAChB,YAAM,YAAY,UAAU,CAAC,MAAM,MAAM,KAAK;AAE9C,YAAM,kBAAkB,MAAM;AAC5B,eAAO,oBAAoB,aAAa,gBAAgB;AACxD,eAAO,oBAAoB,WAAW,eAAe;AACrD,QAAAA,kBAAiB,EAAE,OAAO,UAAU,QAAQ,UAAU,CAAC;AACvD,yBAAiB,MAAS;AAAA,MAC5B;AAEA,YAAM,mBAAmB,CAACC,WAAsB;AAC9C,mBAAW,KAAK;AAAA,UACd,eAAe,aAAaA,OAAM,UAAU;AAAA,UAC5C;AAAA,QACF;AAEA,YAAI,WAAW,kBAAkB;AAC/B,qBAAW;AAAA,QACb;AAEA,oBAAa,WAAW,eAAgB;AAExC,yBAAiB,EAAE,OAAO,UAAU,QAAQ,UAAU,CAAC;AAEvD,YAAI,CAACA,OAAM,SAAS;AAClB,iBAAO,gBAAgB;AAAA,QACzB;AAAA,MACF;AAEA,aAAO,iBAAiB,aAAa,gBAAgB;AACrD,aAAO,iBAAiB,WAAW,eAAe;AAAA,IACpD;AAAA,EACF;AAEA,WAAS,iBAAiB,WAAmB;AAC3C,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,aAAa;AAAA,QACb,kBAAgB;AAAA,QAChB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,OAAO;AAAA,WACJ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,IAChD,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,IAL9C;AAAA,UAML,QAAQ,GAAG,SAAS;AAAA,QACtB;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,EAAE,YAAY,UAAU,OAAO,QAAQ,IAAI,IAAI,KAAK,SAAS,CAAC;AAClE,QAMI,UAAK,SAAS,CAAC,GALjB;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EApGJ,IAsGM,IADC,kBACD,IADC;AAAA,IAJH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAIF,QAAM,cAAc,CAAC,CAAC,MAAM;AAI5B,gCAAU,MAAM;AACd,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAEA,cAAU,SAAS;AACnB,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,MAAM;AACV,QAAI,SAAS,MAAM;AACjB,gBAAU,QAAQ;AAGlB,YAAM,EAAE,cAAc,cAAc,IAAI;AACxC,YAAM,UAAU,yCAAY;AAC5B,UAAI,CAAC,WAAW,UAAU,UAAU,CAAC,cAAc;AACjD;AAAA,MACF;AAEA,YAAM,eAAe,QAAQ;AAC7B,YAAM,cAAc,eAAe;AACnC,YAAM,mBAAmB,KAAK;AAAA,QAC5B,eAAe;AAAA,QACf;AAAA,MACF;AAEA,MAAAD,kBAAiB;AAAA,QACf,OAAO,KAAK,IAAI,cAAc,YAAY;AAAA,QAC1C,QAAQ,KAAK,IAAI,kBAAkB,aAAa;AAAA,MAClD,CAAC;AAAA,IACH;AACA,QAAI,UAAU,MAAM;AAClB,gBAAU,OAAO;AAAA,IACnB;AAEA,WAAO,MAAM;AACX,UAAI,MAAM;AACV,UAAI,SAAS;AACb,UAAI,UAAU;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAS;AAAA,MACT,oBAAgB;AAAA,MAChB,OAAO,gDACD,eAAe,WAAW,WAC1B;AAAA,QACE,OAAO,GAAG,KAAK;AAAA,QACf,QAAQ,GAAG,MAAM;AAAA,SACd,iBAEL,CAAC,IAPA;AAAA,QAQL,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,QAEV,YAAY;AAAA,QACZ,SAAS;AAAA,UACL;AAAA,QACF,QAAQ,EAAE,YAAY,QAAQ,aAAa,OAAO;AAAA,QAClD,MAAM,EAAE,aAAa,OAAO;AAAA,QAC5B,OAAO,EAAE,YAAY,OAAO;AAAA,MAC9B,EAAE,SAAmB,KAAK,CAAC;AAAA,MAE7B,KAAK;AAAA,MAEJ;AAAA,SAAC,eAAe,8CAAC,oBAAiB,QAAO,QAAO;AAAA,QAChD,eAAe,iBAAiB,8CAAC,oBAAiB,QAAO,YAAW;AAAA,QAEpE,eAAe,WAAW,aAAa,CAAC,iBACvC,8CAAC,oBAAiB,QAAO,WAAU;AAAA,QAEpC,eAAe,WAAW,WAAW,CAAC,iBACrC,8CAAC,oBAAiB,QAAO,SAAQ;AAAA,QAGlC,eAAe,WAAW,YAAY,CAAC,iBACtC,gFACE;AAAA;AAAA,YAAC;AAAA,6CACK,QADL;AAAA,cAEC,KAAK;AAAA,cACL,OAAO,iCACF,gBADE;AAAA,gBAEL,QAAQ;AAAA,gBACR,cAAc;AAAA,cAChB;AAAA;AAAA,UACF;AAAA,UAEC,YACC,gFAEG;AAAA;AAAA,cACC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,QAAQ,OAAO,MAAM;AAAA,cAChD,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,QAAQ,OAAO,MAAM;AAAA,cACjD,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,QAAQ,QAAQ,MAAM;AAAA,cAChD,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,QAAQ,QAAQ,MAAM;AAAA,YACrD,EAAE,IAAI,CAAC,OAAO,MACZ;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,UAAU;AAAA,mBACP;AAAA;AAAA,cAJA;AAAA,YAMP,CACD;AAAA,YACA,iBAAiB,IAAI;AAAA,YACrB,iBAAiB,IAAI;AAAA,YACrB,iBAAiB,IAAI;AAAA,YACrB,iBAAiB,IAAI;AAAA,aACxB;AAAA,WAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAMO,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,EAAE,OAAO,IAAI;AACnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,UACE,+CAA+C,WAAW;AAAA,UAC1D,8CAA8C,WAAW;AAAA,QAC3D;AAAA,MACF;AAAA,MAEC;AAAA,mBAAW,UACV,gFACE;AAAA,wDAAC,sCAAa,WAAU,+BAA8B;AAAA,UACtD,8CAAC,UAAK,+BAAiB;AAAA,WACzB;AAAA,QAED,WAAW,aACV,gFACE;AAAA,wDAAC,iCAAQ,WAAU,gDAA+C;AAAA,UAClE,8CAAC,UAAK,8BAAgB;AAAA,WACxB;AAAA,QAED,WAAW,WACV,gFACE;AAAA,wDAAC,6BAAI,WAAU,+BAA8B;AAAA,UAC7C,8CAAC,UAAK,iCAAmB;AAAA,WAC3B;AAAA,QAED,WAAW,cACV,gFACE;AAAA,wDAAC,oCAAW,WAAU,+BAA8B;AAAA,UACpD,8CAAC,UAAK,gCAAkB;AAAA,WAC1B;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AF7NI,IAAAE,uBAAA;AAzCG,SAAS,SAAS,OAAsB;AAC7C,QAAM,EAAE,KAAK,IAAI;AAEjB,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAsB,MAAM;AAExD,MAAI;AAAA,IACF,YAAY;AAAA,IACZ,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,EACT,IAAK,KAAK,SAAS,CAAC;AAEpB,QAAM,cAAc,CAAC,CAAC;AAItB,gCAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,cAAU,SAAS;AACnB,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,MAAM;AACV,QAAI,SAAS,MAAM;AACjB,gBAAU,QAAQ;AAAA,IACpB;AACA,QAAI,UAAU,MAAM;AAClB,gBAAU,OAAO;AAAA,IACnB;AAEA,WAAO,MAAM;AACX,UAAI,MAAM;AACV,UAAI,SAAS;AACb,UAAI,UAAU;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,WAAW,UAAU,IAAI;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAS;AAAA,MACT,oBAAgB;AAAA,MAChB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,QAEV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MAEC;AAAA,SAAC,eAAe,8CAAC,oBAAiB,QAAO,QAAO;AAAA,QAChD,eAAe,iBAAiB,8CAAC,oBAAiB,QAAO,YAAW;AAAA,QACpE,eAAe,WAAW,aAAa,CAAC,iBACvC,8CAAC,oBAAiB,QAAO,WAAU;AAAA,QAEpC,eAAe,WAAW,WAAW,CAAC,iBACrC,8CAAC,oBAAiB,QAAO,SAAQ;AAAA,QAGlC,eAAe,WAAW,YAAY,CAAC,iBACtC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,eACV;AAAA,cACF,QAAQ,EAAE,YAAY,QAAQ,aAAa,OAAO;AAAA,cAClD,MAAM,EAAE,aAAa,OAAO;AAAA,cAC5B,OAAO,EAAE,YAAY,OAAO;AAAA,YAC9B,EAAE,SAAS,KAAK,CAAC;AAAA;AAAA,QAErB;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AFnFO,IAAM,kBAAkB,CAAC,MAAM,MAAM,IAAI;AAgChD,IAAM,oBAA0C;AACzC,IAAM,oBAAqC;AAE3C,IAAM,YAA6C;AAAA,EACxD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAYO,IAAM,gBAAgB,uBAAAC,QAAY,OAAO;AAAA,EAC9C,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,gBAAgB;AA5DlB;AA6DI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,mBAAmB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,wBAAwB,WAAW,iBAAiB;AAAA,UACtD;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YACV,QAAQ,aAAa,sBAAsB;AAAA,MAC/C;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,aAAa,WAAW;AAAA,QAClC,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,aAAa,WAAW;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YACV,QAAQ,aAAa,gBAAgB;AAAA,QACvC,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,kBAAkB,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,sBAAsB,MAAM;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AACZ,WAAO;AAAA,MACL,cACE,CAAC,YACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACF,mBACE,CAAC,eACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,iBAAiB,QAAQ,UAAU;AAAA,MACrD;AAAA,IACJ;AAAA,EACF;AAAA,EACA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,6BAA6B,KAAK,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AACZ,eAAO,sCAAsB,UAAU;AAAA,MACrC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AKhKD,IAAAC,iBAAuC;AACvC,IAAAC,0BAAoB;AAEb,IAAM,gBAAgB,CAAC,WAAmB;AAC/C,QAAM,aAAS,+BAAe;AAAA,IAC5B;AAAA,IACA,UAAU,CAAC,EAAE,QAAAC,QAAO,MAAM;AAP9B;AAQM,aAAO;AAAA,QACL,OAAOA,QAAO,cAAc,OAAO,EAAE;AAAA,QACrC,QAAQA,QAAO,cAAc,OAAO,EAAE;AAAA,QACtC,eAAeA,QAAO,SAAS,OAAO;AAAA,QACtC,cAAcA,QAAO,SAAS,MAAM;AAAA,QACpC,aACE,KAAAA,QAAO,cAAc,OAAO,MAA5B,mBAA+B,gBAC/B,KAAAA,QAAO,cAAc,MAAM,MAA3B,mBAA8B;AAAA,QAEhC,YAAU,KAAAA,QAAO,cAAc,MAAM,MAA3B,mBAA8B,SAAQ;AAAA,QAChD,YACE,KAAAA,QAAO,cAAc,OAAO,MAA5B,mBAA+B,UAC/B,KAAAA,QAAO,cAAc,MAAM,MAA3B,mBAA8B,QAC9B;AAAA,QACF,gBACE,iBAAAA,QAAO,cAAc,OAAO,MAA5B,mBAA+B,kBAA/B,aACA,KAAAA,QAAO,cAAc,MAAM,MAA3B,mBAA8B,kBAD9B,YAEA;AAAA,QACF,qBAAmB,KAAAA,QAAO,cAAc,OAAO,MAA5B,mBAA+B,iBAAgB;AAAA,QAClE,yBACE,KAAAA,QAAO,cAAc,OAAO,MAA5B,mBAA+B;AAAA,QAEjC,oBACE,KAAAA,QAAO,cAAc,OAAO,MAA5B,mBAA+B,gBAC/B,KAAAA,QAAO,cAAc,MAAM,MAA3B,mBAA8B,cAC9B;AAAA,MACJ;AAAA,IACF;AAAA,IACA,YAAY,wBAAAC;AAAA,EACd,CAAC;AAED,SAAO;AACT;;;AT5BA,IAAAC,gBAAuB;AAiCb,IAAAC,uBAAA;AA/BH,SAAS,gBAAgB,OAA8B;AAd9D;AAeE,QAAM,EAAE,QAAQ,SAAS,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,cAAc,MAAM;AAElC,QAAM,kBAAyC,gDAC1C,QACC,WAAW,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,IAFJ;AAAA,IAG7C,YAAY,CAAC,EAAE,QAAAC,QAAO,MAAM;AAC1B,aAAOA,QAAO,SAAS,MAAM,KAAKA,QAAO,SAAS,OAAO;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACZ,eAAe;AAAA,QACb,WAAW,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC9C;AAAA,MACA,SAAS,CAAC,oBAAM;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA,qCACK,kBADL;AAAA,MAEC,WAAU;AAAA,MAEV,yDAAC,mBACE;AAAA,cAAM,gBAAgB,MAAM,YAC3B,gFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,SAAQ;AAAA,cACR,OAAO,MAAM;AAAA,cACb,SAAS,gBAAgB,IAAI,CAAC,UAAU;AAAA,gBACtC,OAAO;AAAA,gBACP,OAAO;AAAA,cACT,EAAE;AAAA,cACF,eAAe,CAAC,UAAU;AACxB,iDACI,QACD,QACA,kBAAkB,EAAE,MAAM,MAAyB,GACnD;AAAA,cACL;AAAA;AAAA,UACF;AAAA,UAEA,8CAAC,WAAQ;AAAA,WACX;AAAA,QAGF,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,MAAM;AAAA,cACjB,mBAAmB,CAAC,cAAc;AAChC,sBAAM,qBAAqB,MAAM;AACjC,oBAAI,CAAC,oBAAoB;AACvB,mDAAQ,QAAQ,QAAQ,kBAAkB,EAAE,UAAU,GAAG;AAAA,gBAC3D,OAAO;AACL,mDACI,QACD,QACA,iBAAiB,SAAS,EAAE,UAAU,GACtC;AAAA,gBACL;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,eAAc,oCAAO,aAAP,YAAmB;AAAA,cACjC,eAAe,CAAC,OAAO,eAAe;AACpC,oBAAI,MAAM,cAAc;AACtB,mDACI,QACD,kBAAkB;AAAA,oBACjB,KAAK;AAAA,oBACL,eAAe,kCAAc;AAAA,kBAC/B,GACC;AAAA,gBACL,OAAO;AACL,mDACI,QACD,iBAAiB,SAAS;AAAA,oBACzB,KAAK;AAAA,oBACL,eAAe,kCAAc;AAAA,kBAC/B,GACC;AAAA,gBACL;AAAA,cACF;AAAA,cACA,SAAQ;AAAA,cACR,MAAM;AAAA,cACN;AAAA,cACA,YAAY,MAAM;AAAA;AAAA,UACpB;AAAA,UAEC,MAAM,iBACL;AAAA,YAAC;AAAA;AAAA,cACC,eAAc,oCAAO,sBAAP,YAA4B;AAAA,cAC1C,eAAe,CAAC,OAAO,eAAe;AACpC,iDACI,QACD,iBAAiB,SAAS;AAAA,kBACzB,cAAc;AAAA,kBACd,wBAAwB,kCAAc;AAAA,gBACxC,GACC;AAAA,cACL;AAAA,cACA,SAAQ;AAAA,cACR;AAAA,cACA,YAAY,MAAM;AAAA;AAAA,UACpB;AAAA,WAEJ;AAAA,QAEC,MAAM,iBAAiB,MAAM,YAC5B,gFACE;AAAA,wDAAC,WAAQ;AAAA,UAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,QAAO,oCAAO,UAAP,YAAgB;AAAA,gBACvB,eAAe,CAAC,UAAU;AACxB,mDACI,QACD,iBAAiB,SAAS,EAAE,OAAO,MAAM,GACzC;AAAA,gBACL;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,QAAO,oCAAO,WAAP,YAAiB;AAAA,gBACxB,eAAe,CAAC,UAAU;AACxB,mDACI,QACD,iBAAiB,SAAS,EAAE,QAAQ,MAAM,GAC1C;AAAA,gBACL;AAAA;AAAA,YACF;AAAA,aACF;AAAA,WACF;AAAA,QAGF,8CAAC,WAAQ;AAAA,QACT;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,wBAAwB,CAAC,UAAU;AACjC,+CACI,QACD,iBAAiB,MAAM,eAAe,SAAS,SAAS;AAAA,gBACvD,WAAW;AAAA,cACb,GACC;AAAA,YACL;AAAA,YACA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AU7KA,IAAAC,iBAAyC;AACzC,IAAAC,wBAAiC;AACjC,IAAAD,iBAA4B;AAC5B,IAAAE,gBAAuB;;;ACGnB,IAAAC,uBAAA;AANG,SAAS,YACd,OACA;AACA,QAAqC,YAA7B,kBALV,IAKuC,IAAT,iBAAS,IAAT,CAApB;AAER,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,OACF,OANL;AAAA,MAQC;AAAA,sDAAC,UAAK,GAAE,iBAAgB,QAAO,gBAAe,aAAY,OAAM;AAAA,QAChE;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,aAAY;AAAA,YACZ,WAAW;AAAA;AAAA,QACb;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACZM,IAAAC,uBAAA;AAVC,SAAS,WAAW,OAAgC;AACzD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,OACF,QANL;AAAA,MAQC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;;;ACRM,IAAAC,uBAAA;AAVC,SAAS,YAAY,OAAgC;AAC1D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,OACF,QANL;AAAA,MAQC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;;;AClBA,4BAA8C;AA0DpC,IAAAC,uBAAA;AArCH,SAAS,YAAY,OAAyB;AACnD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IAEA,kBAAkB,CAAC;AAAA,EACrB,IAAI;AAEJ,QAAM,oBAAoB,CAACC,WAAkB;AAQ3C,mBAAe,MAAM;AACnB,oBAAcA,MAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,QAAM,gBACJ,8CAAC,kBAAe,SAAO,MACpB,sBACC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,MAAK;AAAA,MACL,MAAK;AAAA,MAEL;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAO,iCACD,cAAc,EAAE,YAAY,IAAI,CAAC,IADhC;AAAA,YAEL,iBAAiB,mBAAmB;AAAA,UACtC;AAAA;AAAA,MACF;AAAA;AAAA,EACF,GAEJ;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,CAAC,SAAS;AACtB,YAAI,CAAC,MAAM;AACT,6CAAU;AAAA,QACZ;AAAA,MACF;AAAA,MAEC;AAAA,kBACC,+CAAC,WACC;AAAA,wDAAC,kBAAe,SAAO,MAAE,yBAAc;AAAA,UACvC,8CAAC,kBAAe,YAAY,GAAI,mBAAQ;AAAA,WAC1C,IAEA;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,YAAY;AAAA,YAEZ,yDAAC,SAAI,WAAU,oEACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,UAAU;AAAA,kBACV,WAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP;AAAA,kBACA,UAAU;AAAA,kBACV,WAAU;AAAA,kBACV,UAAQ;AAAA;AAAA,cACV;AAAA,cAEC,gBAAgB,SAAS,KACxB,+CAAC,SACC;AAAA,8DAAC,SAAI,WAAU,+CAA8C;AAAA,gBAE7D,8CAAC,QAAG,WAAU,iCAAgC,2BAAa;AAAA,gBAE3D,8CAAC,SAAI,WAAU,+CACZ,0BAAgB,IAAI,CAAC,mBACpB;AAAA,kBAAC;AAAA;AAAA,oBAEC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,SAAS,MAAM,kBAAkB,cAAc;AAAA,oBAE/C;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO;AAAA,0BACL,iBAAiB;AAAA,wBACnB;AAAA;AAAA,oBACF;AAAA;AAAA,kBAZK;AAAA,gBAaP,CACD,GACH;AAAA,iBACF;AAAA,eAEJ;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACzIA,IAAAC,iBAAuC;AACvC,IAAAC,0BAAoB;AAEb,IAAM,kBAAkB,CAAC,WAAmB;AACjD,QAAM,aAAS,+BAAe;AAAA,IAC5B;AAAA,IACA,UAAU,CAAC,QAAQ;AAVvB;AAWM,aAAO;AAAA,QACL,oBAAkB,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,UAAS;AAAA,QAEhE,qBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,YAAY,KAAK;AAAA,QAC/D,0BACE,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,oBACrC;AAAA,QAEF,sBACE,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,gBACrC;AAAA,QACF,oBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,WAAW,KAAK;AAAA,QAE9D,kBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,SAAS,KAAK;AAAA,QAC5D,oBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,WAAW,KAAK;AAAA,QAC9D,qBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,YAAY,KAAK;AAAA,QAC/D,mBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,UAAU,KAAK;AAAA,QAE7D,mBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,UAAU,KAAK;AAAA,QAC7D,qBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,YAAY,KAAK;AAAA,QAC/D,sBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,aAAa,KAAK;AAAA,QAChE,oBACE,QAAO,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,WAAW,KAAK;AAAA,QAE9D,iBAAiB,IAAI,OAAO,SAAS,SAAS;AAAA,QAE9C,oBAAkB,SAAI,OAAO,cAAc,SAAS,MAAlC,mBAAqC,cAAa;AAAA,MACtE;AAAA,IACF;AAAA,IACA,YAAY,wBAAAC;AAAA,EACd,CAAC;AAED,SAAO;AACT;;;ALiCQ,IAAAC,uBAAA;AA9DD,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,6BAAyB,4BAAY,MAAM;AAC/C,UAAM,kBAAkB,mBAAmB,QAAS,SAAS;AAC7D,UAAM,QACJ,mDAAiB,4BACjB,IAAI,QAAQ,MAAO,MAAO,GAAG,CAAC;AAEhC,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAyC,gDAC1C,QACC,WAAW,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,IAFJ;AAAA,IAG7C,YAAY,CAAC,EAAE,QAAAC,QAAO,MAAM;AA1ChC;AA2CM,YAAM,oBAAoB,qBAAqBA,SAAQ,SAAS;AAChE,YAAM,kBAAkB,qBACpB,sCAAa,uDAAmB,MAAM,CAAC,SAAS;AAC9C,eAAO,KAAK,KAAK,SAAS;AAAA,MAC5B,CAAC,MAFD,mBAEK,KACL;AACJ,YAAM,2BACJ,mBAAmBA,QAAO,SAAS,KAAK;AAE1C,UAAI,eAAeA,OAAM,KAAK,0BAA0B;AACtD,eAAO;AAAA,MACT;AAEA,aAAOA,QAAO,SAAS,SAAS;AAAA,IAClC;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ,CAAC,GAAG,CAAC;AAAA,MACb,eAAe;AAAA,QACb,WAAW,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,UAAU,MAAM,qCAAU;AAAA,MAC1B,SAAS,CAAC,oBAAM;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,EACb;AAEA,QAAM,QAAQ,gBAAgB,MAAM;AAEpC,QAAM,sBAAsB;AAAA,IAC1B,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,IAC7B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,IAC9B,EAAE,OAAO,QAAQ,OAAO,QAAQ;AAAA,EAClC;AAEA,SACE;AAAA,IAAC;AAAA,qCACK,kBADL;AAAA,MAEC,WAAU;AAAA,MAEV,yDAAC,mBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,mBAAmB,CAAC,cAAc;AAxF5C;AAyFY,qDAAQ,aAAR,mBAAkB,cAAc;AAAA,gBAC9B,OAAO;AAAA,cACT;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,8CAAC,WAAQ;AAAA,QAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,OAAO,OAAO,MAAM,mBAAmB;AAAA,cACvC,SAAS;AAAA,cACT,eAAe,CAAC,UAAU;AAtGtC;AAuGc,uDAAQ,aAAR,mBAAkB,cAAc;AAAA,kBAC9B,cAAc,OAAO,KAAK;AAAA,gBAC5B;AAAA,cACF;AAAA,cACA,SAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,OAAO,OAAO,MAAM,kBAAkB;AAAA,cACtC,SAAS;AAAA,gBACP,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,gBAC5B,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,gBAC5B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,gBAC9B,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,cAC/B;AAAA,cACA,eAAe,CAAC,UAAU;AAxHtC;AAyHc,uDAAQ,aAAR,mBAAkB,cAAc;AAAA,kBAC9B,aAAa,OAAO,KAAK;AAAA,gBAC3B;AAAA,cACF;AAAA,cACA,SAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QAEA,8CAAC,WAAQ;AAAA,QAET;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,eAAc;AAAA,YACd,OAAM;AAAA,YACN,OAAO,OAAO,MAAM,gBAAgB;AAAA,YACpC,SAAS;AAAA,cACP,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,cAC5B,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,cAC7B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,cAC9B,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,YAChC;AAAA,YACA,eAAe,CAAC,WAAW;AA/IrC;AAgJY,oBAAM,QAAQ,OAAO,MAAM;AAC3B,qDAAQ,aAAR,mBAAkB,cAAc;AAAA,gBAC9B,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,cAAc;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,YACF;AAAA,YACA,SAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,QAEA,8CAAC,WAAQ;AAAA,QAET;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,eAAc;AAAA,YACd,OAAM;AAAA,YACN,OAAO,OAAO,MAAM,iBAAiB;AAAA,YACrC,SAAS;AAAA,cACP,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,cAC5B,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,cAC7B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,cAC9B,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,YAChC;AAAA,YACA,eAAe,CAAC,WAAW;AAzKrC;AA0KY,oBAAM,QAAQ,OAAO,MAAM;AAC3B,qDAAQ,aAAR,mBAAkB,cAAc;AAAA,gBAC9B,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,eAAe;AAAA,gBACf,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,SAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,QAEA,8CAAC,WAAQ;AAAA,QAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,MAAM;AAAA,cACb,eAAe,CAAC,UAAU;AA3LtC;AA4Lc,uDAAQ,aAAR,mBAAkB,cAAc;AAAA,kBAC9B,aAAa;AAAA,gBACf;AAAA,cACF;AAAA,cACA,SAAQ;AAAA,cAER;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,MAAK;AAAA,kBAEL;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,iBAAgB;AAAA,sBAChB,OAAO;AAAA,wBACL,OAAO,MAAM;AAAA,sBACf;AAAA;AAAA,kBACF;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,MAAM;AAAA,cACb,eAAe,CAAC,UAAU;AAnNtC;AAoNc,uDAAQ,aAAR,mBAAkB,cAAc;AAAA,kBAC9B,iBAAiB;AAAA,gBACnB;AAAA,cACF;AAAA,cACA,iBAAiB,MAAM;AAAA,cACvB,SAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QAEA,8CAAC,WAAQ;AAAA,QAET;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAQ;AAAA,YACR,SAAS,MAAM;AACb,yBAAW,QAAQ,SAAS;AAAA,YAC9B;AAAA;AAAA,QACF;AAAA,QAEA,8CAAC,WAAQ;AAAA,QAET;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,wBAAwB,CAAC,UAAU;AACjC,qBAAO,SAAS,cAAc;AAAA,gBAC5B,WAAW;AAAA,cACb,CAAC;AAAA,YACH;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QAEC,MAAM,mBACL,gFACE;AAAA,wDAAC,WAAQ;AAAA,UACT,+CAAC,WACC;AAAA,2DAAC,kBAAe,WAAU,uIAAsI;AAAA;AAAA,cAE9J,8CAAC,mCAAU,WAAU,mBAAkB;AAAA,eACzC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,OAAM;AAAA,gBACN,iBAAiB,CAAC,MAAM;AACtB,oBAAE,eAAe;AAAA,gBACnB;AAAA,gBACA,kBAAkB,CAAC,MAAM;AACvB,oBAAE,eAAe;AAAA,gBACnB;AAAA,gBAEA,wDAAC,4BAAyB,QAAgB;AAAA;AAAA,YAC5C;AAAA,aACF;AAAA,WACF;AAAA,SAEJ;AAAA;AAAA,EACF;AAEJ;;;AMhRA,IAAAC,iBAA2B;;;ACA3B,IAAAC,eAAsC;AAG/B,IAAM,oBAAoB,CAAC,MAAM,MAAM,MAAM,IAAI;AAoBxD,IAAM,iBAAoC;AAE1C,SAAS,eAAe,QAAmC;AACzD,QAAM,UAAU,EAAE,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO;AAEhE,SAAO,wBAAwB,QAAQ,MAAM,KAAK,QAAQ,cAAc,CAAC;AAC3E;AAEO,IAAM,SAAS,kBAAK,OAAsB;AAAA,EAC/C,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,gBAAgB;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,aAAa;AAAA,QAC1D,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,eAAe,WAAW;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,CAAC,YACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEF,eACE,CAAC,WACD,CAAC,EAAE,SAAS,MAAM;AAChB,YAAI,CAAC,kBAAkB,SAAS,MAAM,GAAG;AACvC,gBAAM,IAAI,MAAM,uBAAuB;AAAA,QACzC;AACA,eAAO,SAAS,iBAAiB,UAAU,EAAE,OAAO,CAAC;AAAA,MACvD;AAAA,MAEF,oBACE,CAAC,cACD,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,iBAAiB,UAAU,EAAE,UAAU,CAAC;AAAA,MAC1D;AAAA,MAEF,aACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,WAAW,QAAQ;AAAA,MACrC;AAAA,IACJ;AAAA,EACF;AAAA,EACA,WAAW,EAAE,gBAAAC,iBAAgB,KAAK,GAAG;AACnC,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,IAAAA,gBAAe,QAAQ,eAAe,MAAM;AAC5C,WAAO;AAAA,MACL;AAAA,UACA;AAAA,QACE;AAAA,UACE,wBAAwB,KAAK;AAAA,QAC/B;AAAA,QACA,KAAK,QAAQ;AAAA,QACbA;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,6BAA6B,KAAK,IAAI,KAAK,CAAC;AAAA,EAC7D;AACF,CAAC;;;AC7HD,IAAAC,iBAAuC;AACvC,IAAAC,0BAAoB;AAEb,IAAM,iBAAiB,CAAC,WAAmB;AAChD,QAAM,aAAS,+BAAe;AAAA,IAC5B;AAAA,IACA,UAAU,CAAC,QAAQ;AANvB;AAOM,aAAO;AAAA,QACL,oBAAkB,SAAI,OAAO,cAAc,QAAQ,MAAjC,mBAAoC,cAAa;AAAA,MACrE;AAAA,IACF;AAAA,IACA,YAAY,wBAAAC;AAAA,EACd,CAAC;AAED,SAAO;AACT;;;AF6BM,IAAAC,uBAAA;AA/BC,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,EAAE,QAAQ,SAAS,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,QAA0B,kBAAkB,IAAI,CAAC,YAAY;AAAA,IACjE,MAAM;AAAA,IACN,UAAU,MAAM,iCAAQ,SAAS,UAAU,EAAE,OAAO;AAAA,IACpD,SAAS,MAAM;AACb,uCAAQ,QAAQ,QAAQ,UAAU,EAAE,OAAO,GAAG;AAAA,IAChD;AAAA,EACF,EAAE;AAEF,QAAM,kBAAyC,gDAC1C,QACC,WAAW,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,IAFJ;AAAA,IAG7C,YAAY,CAAC,EAAE,QAAAC,QAAO,MAAMA,QAAO,SAAS,QAAQ;AAAA,IACpD,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,MAAM;AAEnC,SACE;AAAA,IAAC;AAAA,qCACK,kBADL;AAAA,MAEC,WAAU;AAAA,MAEV,yDAAC,mBACE;AAAA,cAAM,IAAI,CAAC,MAAM,UAChB;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,eAAc;AAAA,YACd,eAAc;AAAA,aACV;AAAA,UAJC;AAAA,QAKP,CACD;AAAA,QACD,8CAAC,WAAQ;AAAA,QACT;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,wBAAwB,CAAC,UAAU;AACjC,qBAAO,SAAS,mBAAmB,KAAK;AAAA,YAC1C;AAAA,YACA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AGjEA,IAAAC,iBAA4C;AAC5C,IAAAC,wBASO;;;ACTP,IAAAC,iBAAuC;AACvC,IAAAC,0BAAoB;AAEb,IAAM,qBAAqB;AAE3B,IAAM,mBAAmB,CAAC,WAAmB;AAClD,QAAM,aAAS,+BAAe;AAAA,IAC5B;AAAA,IACA,UAAU,CAAC,QAAQ;AATvB;AAUM,aAAO;AAAA,QACL,kBACE,IAAI,OAAO,cAAc,WAAW,EAAE,SAAS;AAAA,QAEjD,UAAS,SAAI,WAAJ,mBAAY,cAAc,QAAQ;AAAA,QAC3C,aAAY,SAAI,WAAJ,mBAAY,SAAS,EAAE,WAAW,OAAO,MACjD,WACA,SAAI,WAAJ,mBAAY,SAAS,EAAE,WAAW,SAAS,MACzC,aACA,SAAI,WAAJ,mBAAY,SAAS,EAAE,WAAW,QAAQ,MACxC,YACA,SAAI,WAAJ,mBAAY,SAAS,EAAE,WAAW,UAAU,MAC1C,YACA;AAAA,QAEV,cACE,IAAI,OAAO,SAAS,YAAY,KAChC,IAAI,OAAO,SAAS,aAAa;AAAA,QACnC,gBAAe,SAAI,OAAO,cAAc,MAAM,EAAE,kBAAjC,YAAkD;AAAA,MACnE;AAAA,IACF;AAAA,IACA,YAAY,wBAAAC;AAAA,EACd,CAAC;AAED,SAAO;AACT;;;ACnCA,IAAAC,eAA0B;AAC1B,uCAAuD;AAEhD,IAAM,iBAAiB,iCAAAC,eAAqB,OAAO;AAAA,EACxD,gBAAgB;AACd,WAAO;AAAA,MACL,IAAI,uBAAU;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,OAAO,MAAM,MAAM;AAC7B,gBAAM,aAAa,CAAC;AAEpB,gBAAM,EAAE,GAAG,IAAI;AACf,gBAAM,QAAQ,MAAM;AACpB,gBAAM,MAAM,MAAM;AAElB,aAAG,OAAO,QAAQ,GAAG,KAAK,KAAK,OAAO,UAAU,CAAC,EAAE;AAAA,YACjD,GAAG,QAAQ,IAAI,KAAK;AAAA,YACpB,GAAG,QAAQ,IAAI,GAAG;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,aAAa;AACX,WAAO;AAAA,MACL,gBAAgB;AAAA,QACd,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC5BD,IAAAC,0BAAkB;;;ACFlB,IAAAC,eAAsC;AACtC,IAAAC,iBAAsC;;;ACDtC,IAAAC,iBAA+C;;;ACA/C,IAAAC,SAAuB;AAWjB,IAAAC,uBAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,IAA+B,QAAQ;AAAvC,iBAAE,aAAW,KAThB,IASG,IAAsB,kBAAtB,IAAsB,CAApB,aAAW;AACZ,WACE;AAAA,MAAC;AAAA,sDACK,qCADL;AAAA,QAEC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,UACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;ACzBpB,IAAAC,SAAuB;AAUjB,IAAAC,uBAAA;AAHN,IAAM,WAAiB;AAAA,EACrB,CAAC,IAAyB,QAAQ;AAAjC,iBAAE,YARL,IAQG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;;;AFUL,IAAAC,uBAAA;AA1BX,SAAS,kBAAkB,OAAsB;AACtD,QAAM,EAAE,OAAO,aAAa,MAAM,WAAW,OAAAC,QAAO,WAAW,SAAS,IACtE,MAAM,KAAK;AACb,QAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,mBACT,MAAM,YAAY,0BACpB;AAAA,MACA,WAAU;AAAA,MACV,oBAAiB;AAAA,MAEjB,yDAAC,WAAQ,MAAM,MAAM,UACnB;AAAA,sDAAC,kBAAe,SAAO,MACrB;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,SAAS,CAAC,MAAM;AACd,gBAAE,eAAe;AACjB,oBAAM,MAAM,OAAO;AACnB,qBAAO,SAAS,iBAAiB,GAAG;AAAA,YACtC;AAAA,YAEA,yDAAC,SAAI,WAAU,oFACZ;AAAA,cAAAA,UACC,8CAAC,SAAI,WAAU,mDACb;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAKA;AAAA,kBACL,KAAI;AAAA,kBACJ,WAAU;AAAA;AAAA,cACZ,GACF;AAAA,cAEF,8CAAC,SAAI,WAAU,sCACb,yDAAC,SAAI,WAAW,GAAG,uBAAuB,GACxC;AAAA,+DAAC,SAAI,WAAU,qDACb;AAAA,gEAAC,QAAG,WAAU,4CACX,iBACH;AAAA,kBACC,aACC,8CAAC,UAAK,WAAU,gHACb,qBACH;AAAA,kBACC;AAAA,kBACF,YAAY,CAAC,aACZ,8CAAC,UAAK,WAAU,6FACb,oBACH;AAAA,mBAEJ;AAAA,gBACA,+CAAC,OAAE,WAAU,8CACV;AAAA;AAAA,kBAAa;AAAA,kBACb,YACC,8CAAC,OAAE,MAAM,MAAM,WAAU,qBACtB,qBACH,IACE;AAAA,mBACN;AAAA,iBACF,GACF;AAAA,eACF;AAAA;AAAA,QACF,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,YACzC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,YAE1C;AAAA,6DAAC,WAAM,WAAU,4BACf;AAAA,8DAAC,UAAK,WAAU,kDAAiD,mBAEjE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,MAAK;AAAA,oBACL,OAAOA;AAAA,oBACP,UAAU,CAAC,MAAM;AACf,4BAAM,iBAAiB;AAAA,wBACrB,OAAO,EAAE,OAAO;AAAA,sBAClB,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,+CAAC,WAAM,WAAU,4BACf;AAAA,8DAAC,UAAK,WAAU,kDAAiD,mBAEjE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM;AACf,4BAAM,iBAAiB;AAAA,wBACrB,OAAO,EAAE,OAAO;AAAA,sBAClB,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,+CAAC,WAAM,WAAU,4BACf;AAAA,8DAAC,UAAK,WAAU,kDAAiD,yBAEjE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM;AACf,4BAAM,iBAAiB;AAAA,wBACrB,aAAa,EAAE,OAAO;AAAA,sBACxB,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,+CAAC,SAAI,WAAU,sCACb;AAAA,+DAAC,WAAM,WAAU,4BACf;AAAA,gEAAC,UAAK,WAAU,kDAAiD,wBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,WAAW,EAAE,OAAO;AAAA,wBACtB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,gBAEA,+CAAC,WAAM,WAAU,4BACf;AAAA,gEAAC,UAAK,WAAU,kDAAiD,kBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,MAAM,EAAE,OAAO;AAAA,wBACjB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,iBACF;AAAA,cAEA,+CAAC,SAAI,WAAU,sCACb;AAAA,+DAAC,WAAM,WAAU,4BACf;AAAA,gEAAC,UAAK,WAAU,kDAAiD,wBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,WAAW,EAAE,OAAO;AAAA,wBACtB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,gBAEA,+CAAC,WAAM,WAAU,4BACf;AAAA,gEAAC,UAAK,WAAU,kDAAiD,uBAEjE;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM;AACf,8BAAM,iBAAiB;AAAA,0BACrB,UAAU,EAAE,OAAO;AAAA,wBACrB,CAAC;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ADjLO,IAAM,oBAAoB,kBAAK,OAAO;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,gBAAgB;AAAA,QACd,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,2BAA2B,KAAK,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA;AAAA,QACE;AAAA,UACE,wBAAwB,KAAK;AAAA,QAC/B;AAAA,QACAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,aACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,gBAAgB,KAAK;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,mBAAmB;AAAA,MAC9C,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AIvFD,IAAAC,eAAsC;AACtC,IAAAC,iBAAsC;;;ACYtC,IAAAC,iBAA+C;;;ACJ/C,IAAAC,iBAAwB;AACxB,IAAAA,iBAAyB;AACzB,IAAAA,iBAAuB;AAoCnB,IAAAC,uBAAA;AA1BG,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,EAAE,OAAO,eAAe,YAAY,OAAO,IAAI;AAErD,QAAM,mBAAe,uBAAyB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,CAAC,UAAU;AAEtD,QAAM;AAAA,IACJ,YAAY,CAAC;AAAA,IACb,2BAA2B;AAAA,IAC3B,iBAAiB;AAAA,EACnB,IAAI,gBAAgB;AAEpB,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,UAAM,iBAAiB,MAAM;AAAA,MAC3B,IAAI,OAAO,0BAA0B,GAAG;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW;AAAA,MACjC,OAAO,kBAAkB;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,IACF,CAAC,EAAE,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EACpC,GAAG,CAAC,WAAW,OAAO,MAAM,CAAC;AAE7B,SACE,+CAAC,SAAI,WAAU,uCACZ;AAAA,KAAC,aACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AACb,uBAAa,IAAI;AACjB,qBAAW,MAAM;AApD7B;AAqDc,+BAAa,YAAb,mBAAsB;AAAA,UACxB,GAAG,CAAC;AAAA,QACN;AAAA,QAEC,yBAAe;AAAA,UACd,UAAU;AAAA,YACR,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA;AAAA,IACH;AAAA,IAGD,aACC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAe,CAACC,WAAU;AACxB,yDAAgBA;AAAA,QAClB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,WAAU;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB,CAACA,WAAU;AAhFrC;AAiFY,gBAAMC,eAAa,yBAAoB,SAASD,MAAK,MAAlC,YAAuC;AAC1D,cAAIC,aAAY;AACd,yBAAa,KAAK;AAAA,UACpB;AACA,yDAAgBD,QAAOC;AAAA,QACzB;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;ADpCY,IAAAC,uBAAA;AA9BL,SAAS,WAAW,OAAsB;AAC/C,QAAM,EAAE,MAAM,QAAQ,QAAQ,kBAAAC,kBAAiB,IAAI;AACnD,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF,IAAI,KAAK;AAET,QAAM,EAAE,iBAAiB,iCAAiC,IACxD,gBAAgB;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,oBAAiB;AAAA,MACjB,aAAU;AAAA,MACV,OAAO;AAAA,QACL,WAAW;AAAA,MACb;AAAA,MAEA,yDAAC,WAAQ,MAAM,MAAM,UACnB;AAAA,sDAAC,kBAAe,SAAO,MACrB,wDAAC,SACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,gBACE,qBAAqB,YAAY;AAAA,gBACjC,mBAAmB,YAAY;AAAA,gBAC/B,qBAAqB,YAAY;AAAA,cACnC;AAAA,YACF;AAAA,YACA,UAAU;AAAA,YACV,OACE;AAAA,cACE,iBACE,YAAY,WAAW,cAAc;AAAA,cACvC,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,aAAa;AAAA;AAAA;AAAA,cAGb,6BAA6B,GAAG,SAAS;AAAA,YAC3C;AAAA,YAEF,SAAS,CAAC,MAAM;AACd,gBAAE,eAAe;AACjB,oBAAM,MAAM,OAAO;AACnB,qBAAO,SAAS,iBAAiB,GAAG;AAAA,YACtC;AAAA,YAEC,2BACG,eAAe;AAAA,cACb,UAAU,EAAE,MAAMA,OAAM,OAAO,KAAK;AAAA,cACpC,UAAUA;AAAA,cACV,MAAM;AAAA,cACN;AAAA,YACF,CAAC,IACDA;AAAA;AAAA,QACN,GACF,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,WAAU;AAAA,YACV,YAAY;AAAA,YACZ,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,YACzC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,YAE1C,wDAAC,mBACC,yDAAC,SAAI,WAAU,qDACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAOA;AAAA,kBACP,eAAe,CAAC,OAAO,eAAe;AACpC,oBAAAD,kBAAiB;AAAA,sBACf,MAAM;AAAA,sBACN,gBAAgB,kCAAc;AAAA,oBAChC,CAAC;AAAA,kBACH;AAAA,kBACA,YAAY;AAAA,kBACZ;AAAA;AAAA,cACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,oBACP,SAAS,0BAA0B,IAAI,CAAC,WAAW;AAAA,sBACjD;AAAA,sBACA,OAAO;AAAA,oBACT,EAAE;AAAA,oBACF,eAAe,CAAC,UAAU;AACxB,sBAAAA,kBAAiB;AAAA,wBACf,cAAc;AAAA,sBAChB,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA,oBACR,WAAU;AAAA;AAAA,gBACZ;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO;AAAA,oBACP,SAAS,qBAAqB,IAAI,CAAC,WAAW;AAAA,sBAC5C;AAAA,sBACA,OAAO;AAAA,oBACT,EAAE;AAAA,oBACF,eAAe,CAAC,UAAU;AACxB,sBAAAA,kBAAiB;AAAA,wBACf,SAAS;AAAA,sBACX,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA,oBACR,WAAU;AAAA;AAAA,gBACZ;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,mBAAmB,CAACE,eAAc;AAChC,sBAAAF,kBAAiB;AAAA,wBACf,WAAAE;AAAA,sBACF,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,cAAc,gBAAgB;AAAA,oBAC9B,eAAe,CAAC,OAAO,eAAe;AACpC,sBAAAF,kBAAiB;AAAA,wBACf,KAAK;AAAA,wBACL,eAAe,kCAAc;AAAA,sBAC/B,CAAC;AAAA,oBACH;AAAA,oBACA,SAAQ;AAAA,oBACR;AAAA,oBACA,YAAY;AAAA;AAAA,gBACd;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET,+CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,OAAO;AAAA,oBACP,UAAU,CAAC,UAAU;AACnB,sBAAAA,kBAAiB;AAAA,wBACf,aAAa;AAAA,sBACf,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,UAAU;AACnB,sBAAAA,kBAAiB;AAAA,wBACf,WAAW;AAAA,sBACb,CAAC;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,8CAAC,WAAQ;AAAA,cAET;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,wBAAwB,CAAC,UAAU;AACjC,oBAAAA,kBAAiB;AAAA,sBACf,WAAW;AAAA,oBACb,CAAC;AAAA,kBACH;AAAA,kBACA;AAAA;AAAA,cACF;AAAA,eACF,GACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAQA,SAAS,2BAA2B,OAAyB;AAC3D,QAAM,EAAE,OAAO,UAAU,QAAQ,IAAI;AAErC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAe;AAAA,MACf,SAAQ;AAAA,MAER;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAU;AAAA,UAEV;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,iBAAiB,YAAY,WAAW,QAAQ;AAAA,gBAChD,aAAa;AAAA,gBACb,aAAa;AAAA,gBACb,aAAa,YAAY,WAAW,UAAU;AAAA,cAChD;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,qBAAqB,OAAyB;AACrD,QAAM,EAAE,OAAO,SAAS,IAAI;AAE5B,SACE,8CAAC,eAAY,OAAc,eAAe,UAAU,SAAQ,cAC1D;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAU;AAAA,MAEV,yDAAC,SAAI,WAAU,2EACb;AAAA,sDAAC,UAAK,WAAU,oEAAmE,eAEnF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,MAAM;AAAA;AAAA,QAClC;AAAA,SACF;AAAA;AAAA,EACF,GACF;AAEJ;;;ADlRO,IAAM,2BAAiD;AACvD,IAAM,yBAA+C;AACrD,IAAM,+BAA0D;AAChE,IAAM,kCAAkC;AACxC,IAAM,4BAA4B;AAElC,IAAM,uBAAuB,CAAC,UAAU,SAAS;AAGjD,IAAM,4BAA4B,CAAC,SAAS,UAAU,OAAO;AAyB7D,IAAM,kBAAkB,kBAAK,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,WAAW,KAAK;AAAA,QAC9C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,aAAa,WAAW;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,uBAAuB,MAAM;AAAA,QAC3D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,gBAAgB;AAC9B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,yBAAyB;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,UAAU,KAAK;AAAA,QAC7C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,YAAY,WAAW;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAIA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,sBAAsB,MAAM;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,gBAAgB,KAAK;AAAA,QAE9C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,kBAAkB,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,cAAc,KAAK;AAAA,QACjD;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,gBAAgB,WAAW;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,oBAAoB,KACzC;AAAA,QAEJ;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,sBAAsB,WAAW;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,mBAAmB,KACxC;AAAA,QAEJ;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,qBAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,iBAAiB,KAAK;AAAA,QAE/C;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,mBAAmB,WAAW;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAG,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,8BAAgBA,iBAAgB;AAAA,QAC9B,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO,CAAC;AAAA,UACR,SAAS,CAAC;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,MACF,cAAc,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,YAAY;AAAA,MACvC,sBAAsB;AAAA,MACtB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AGtOD,IAAAC,gBAAsC;AAEtC,IAAAC,gBAA0B;AAC1B,IAAAC,iBAAsC;AACtC,wBAA8C;AAYvC,IAAM,oBAAoB,IAAI,wBAAU,UAAU;AAElD,IAAM,oBAAoB,mBAAK,OAAwB;AAAA,EAC5D,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,gBAAgB,CAAC;AAAA,MACjB,YAAY,EAAE,SAAS,KAAK,GAAG;AA5BrC;AA6BQ,eAAO,IAAG,UAAK,MAAM,UAAX,YAAoB,KAAK,MAAM,EAAE;AAAA,MAC7C;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,CAAC,EAAE,QAAQ,OAAO,MAAM,MAAM;AAlC/C;AAqCU,gBAAM,YAAY,OAAO,KAAK,MAAM,UAAU,IAAI;AAClD,gBAAM,iBAAgB,4CAAW,SAAX,mBAAiB,WAAW;AAElD,cAAI,eAAe;AACjB,kBAAM,MAAM;AAAA,UACd;AAEA,iBACG,MAAM,EACN,MAAM,EACN,gBAAgB,OAAO;AAAA,YACtB;AAAA,cACE,MAAM,KAAK;AAAA,cACX,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF,CAAC,EACA,IAAI;AAEP,uBAAO,aAAa,MAApB,mBAAuB;AAAA,QACzB;AAAA,QACA,OAAO,CAAC,EAAE,OAAO,MAAM,MAAM;AAC3B,gBAAM,QAAQ,MAAM,IAAI,QAAQ,MAAM,IAAI;AAC1C,gBAAM,OAAO,MAAM,OAAO,MAAM,KAAK,IAAI;AACzC,gBAAM,QAAQ,CAAC,CAAC,MAAM,OAAO,KAAK,aAAa,UAAU,IAAI;AAE7D,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,IAAI;AAAA,QACF,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,SAAS;AAAA,QACtD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,IAAI;AAClB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,WAAW,WAAW;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,YAAY;AAAA,QACzD,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,cAAc,WAAW;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,eAAe;AAAA,QAC5D,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,UAAU;AACxB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,iBAAiB,WAAW;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC,YAAY,QAAQ,aAAa,eAAe;AAAA,QAC5D,YAAY,CAAC,eAAe;AAvHpC;AAwHU,iBAAO;AAAA,YACL,kBAAiB,8CAAY,aAAZ,YAAwB;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,MAAM,gBAAAC,gBAAe,GAAG;AACnC,WAAO;AAAA,MACL;AAAA,UACA;AAAA,QACE,EAAE,aAAa,KAAK,KAAK;AAAA,QACzB,KAAK,QAAQ;AAAA,QACbA;AAAA,MACF;AAAA,MACA,KAAK,QAAQ,YAAY;AAAA,QACvB,SAAS,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,KAAK,GAAG;AACnB,WAAO,KAAK,QAAQ,YAAY;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,uBAAuB;AACrB,WAAO;AAAA,MACL,WAAW,MACT,KAAK,OAAO,SAAS,QAAQ,CAAC,EAAE,IAAI,MAAM,MAAM;AAC9C,YAAI,YAAY;AAChB,cAAM,EAAE,UAAU,IAAI;AACtB,cAAM,EAAE,OAAO,OAAO,IAAI;AAE1B,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AAEA,cAAM,IAAI,aAAa,SAAS,GAAG,QAAQ,CAAC,MAAM,QAAQ;AACxD,cAAI,KAAK,KAAK,SAAS,KAAK,MAAM;AAChC,wBAAY;AACZ,eAAG;AAAA,cACD,KAAK,QAAQ,WAAW,QAAQ;AAAA,cAChC;AAAA,cACA,MAAM,KAAK;AAAA,YACb;AAEA,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAED,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,wBAAwB;AACtB,WAAO;AAAA,UACL,kBAAAC,SAAW;AAAA,QACT,QAAQ,KAAK;AAAA,SACV,KAAK,QAAQ,WACjB;AAAA,IACH;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,cAAc;AAAA,MACzC,WAAW;AAAA,MACX,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACF,CAAC;;;AC3MD,IAAAC,0BAAwB;AACxB,IAAAC,iBAAsC;AAI/B,IAAM,iBAAiB,wBAAAC,QAAY,OAAO;AAAA,EAC/C,gBAAgB;AANlB;AAOI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,gBAAM,QAAQ,QAAQ,MAAM;AAC5B,iBAAO,QAAQ,EAAE,MAAM,IAAI;AAAA,QAC7B;AAAA,QACA,YAAY,CAAC,EAAE,MAAM,OAAO,EAAE,OAAO,UAAU,KAAK,GAAG;AAAA,MACzD;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,gBAAM,SAAS,QAAQ,MAAM;AAC7B,iBAAO,SAAS,EAAE,OAAO,IAAI;AAAA,QAC/B;AAAA,QACA,YAAY,CAAC,EAAE,OAAO,OAAO,EAAE,OAAO,WAAW,MAAM,GAAG;AAAA,MAC5D;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,YAAY,CAAC,EAAE,UAAU,OAAO,EAAE,kBAAkB,UAAU;AAAA,QAC9D,WAAW,CAAC,YACV,QAAQ,aAAa,gBAAgB,KAAK;AAAA,MAC9C;AAAA,MAEA,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,YAAY,CAAC,EAAE,aAAa,MAAM;AAChC,cAAI,CAAC,cAAc;AACjB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YAAY;AACtB,gBAAM,eAAe,QAAQ,aAAa,oBAAoB;AAC9D,iBAAO,eAAe,EAAE,aAAa,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB;AAAA,QACtB,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,gCAAgC,MAAM;AAAA,QAE/D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,wBAAwB;AACtC,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,kCAAkC;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,sBAAsB,MAAM;AAAA,QAC1D;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,eAAe;AAC7B,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AACZ,eAAO,sCAAsB,WAAW;AAAA,MACtC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;ATvGM,IAAM,uBAAuB,CAAC,QAAgB,SAAsB;AACzE,QAAM,cAAc;AAAA,IAClB,eAAe;AAAA,IACf,wBAAAC,QAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAEA,SAAO,YAAY,KAAK,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC;AACzD;;;AUrBA,IAAAC,gBAAgC;AAChC,IAAAA,gBAAqB;AACrB,IAAAC,eAA2B;AAGpB,IAAM,sBAAsB;AAgB5B,IAAM,mBAAmB,mBAAK,OAAO;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,OAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,QACtC;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,KAAK;AACnB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,OAAO,QAAQ,WAAW,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO,CAAC;AAAA,UACR,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,cAAU,aAAAC,IAAK;AAAA,cACjB;AAAA,cACA,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,cAAU,aAAAA,IAAK;AAAA,cACjB;AAAA,cACA,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACF,eAAe,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,+BAAgBA,iBAAgB;AAAA,QAC9B,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,WAAO;AAAA,MACL,KAAK,MAAM;AACT,eAAO,WAAW,KAAK,QAAQ,MAAM;AAAA,MACvC;AAAA,MACA,aAAa,MAAM;AACjB,eAAO,WAAW,KAAK,QAAQ,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACvID,IAAAC,gBAAsC;AACtC,IAAAC,iBAAsC;;;ACDtC,IAAAC,iBAAgE;AAChE,IAAAC,wBAAwB;AAYlB,IAAAC,uBAAA;AAVC,SAAS,QAAQ,OAAsB;AAC5C,QAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,oBAAiB;AAAA,MACjB,aAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,sDAAC,kCAAgB,WAAU,eAAc;AAAA,QAEzC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,yBAAsB;AAAA,YACtB,WAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,SAAS,MAAM;AACb,qBAAO,SAAS,iBAAiB,OAAO,CAAC;AAAA,YAC3C;AAAA,YAEA;AAAA,4DAAC,iCAAQ,WAAU,sDAAqD;AAAA,cACxE,8CAAC,SAAI,WAAU,2DAA0D;AAAA;AAAA;AAAA,QAC3E;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADRO,IAAM,eAAe,mBAAK,OAAO;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBAAO,QAAQ,aAAa,MAAM,KAAK;AAAA,QACzC;AAAA,QACA,YAAY,CAAC,eAAe;AAC1B,cAAI,CAAC,WAAW,MAAM;AACpB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,MAAM,WAAW;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAAC,YAAY;AACtB,iBACE,QAAQ,aAAa,kBAAkB,KACvC;AAAA,QAEJ;AAAA,QACA,WAAW,YAAY;AACrB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO;AAAA,YACL,oBAAoB,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,+BAAgBA,iBAAgB;AAAA,QAC9B,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,QACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO,CAAC;AAAA,UACR,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACF,WAAW,CAAC,UAAU,iBAAiB,KAAK,MAAM,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAO,sCAAsB,SAAS;AAAA,MACpC,sBAAsB;AAAA,MACtB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;;;AEhHD,IAAAC,wBAA6C;AAO7C,IAAAC,iBAAwB;AA8Bd,IAAAC,uBAAA;AArBV,IAAM,WAAW,CACf,WACmC,OAAO,SAAS;AACrD,IAAM,aAAa,CACjB,WACoC,OAAO,SAAS;AAE/C,SAAS,cAAc,OAA2B;AACvD,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,iBAAa;AAAA,IACjB,MACE,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,YAAY,OAAO,SAAS,CAAC;AAAA,IACxE,CAAC,OAAO;AAAA,EACV;AACA,QAAM,EAAE,MAAM,aAAa,kCAAY,IAAI,cAAc,CAAC;AAE1D,SACE,+CAAC,WACC;AAAA,mDAAC,WACC;AAAA,oDAAC,kBAAe,SAAO,MACrB;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,UACF;AAAA,UAEA;AAAA,0DAAC,cAAW,WAAU,iDAAgD;AAAA,YACtE,8CAAC,yCAAgB,WAAU,iDAAgD;AAAA;AAAA;AAAA,MAC7E,GACF;AAAA,MACA,8CAAC,kBAAe,YAAY,GAAG,uBAAS;AAAA,OAC1C;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,WAAU;AAAA,QAET,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAI,SAAS,MAAM,GAAG;AACpB,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,SAAS,OAAO;AAAA,gBAChB,SAAQ;AAAA,gBACR,WAAU;AAAA,gBAEV;AAAA,gEAAC,OAAO,MAAP,EAAY,WAAU,gCAA+B;AAAA,kBACrD,OAAO;AAAA;AAAA;AAAA,cANH,OAAO;AAAA,YAOd;AAAA,UAEJ,WAAW,WAAW,MAAM,GAAG;AAC7B,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW;AAAA,kBACT;AAAA,kBACA,UAAU,IAAI,sBAAsB;AAAA,gBACtC;AAAA,gBAEC,iBAAO;AAAA;AAAA,cANH,OAAO;AAAA,YAOd;AAAA,UAEJ;AAAA,QACF,CAAC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;;;ACpFA,IAAAC,iBAAuC;AACvC,IAAAC,wBASO;AAsBA,SAAS,wBAAwB,QAAgB;AACtD,aAAO,+BAAe;AAAA,IACpB;AAAA,IACA,UAAU,CAAC,EAAE,QAAAC,QAAO,MAAuB;AAAA,MACzC;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MACPA,QAAO,MAAM,EAAE,MAAM,EAAE,aAAa,UAAU,EAAE,aAAa,EAAE,IAAI;AAAA,QACrE,IAAI;AAAA,QACJ,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,aAAa;AAAA,QAC3C,UAAU,MACRA,QAAO,SAAS,WAAW,KAC3B,CAACA,QAAO,SAAS,aAAa,KAC9B,CAACA,QAAO,SAAS,YAAY,KAC7B,CAACA,QAAO,SAAS,UAAU;AAAA,QAC7B,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MACPA,QACG,MAAM,EACN,MAAM,EACN,aAAa,UAAU,EACvB,WAAW,EAAE,OAAO,EAAE,CAAC,EACvB,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,QACrD,UAAU,MAAMA,QAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,QACvD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MACPA,QACG,MAAM,EACN,MAAM,EACN,aAAa,UAAU,EACvB,WAAW,EAAE,OAAO,EAAE,CAAC,EACvB,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,QACrD,UAAU,MAAMA,QAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,QACvD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MACPA,QACG,MAAM,EACN,MAAM,EACN,aAAa,UAAU,EACvB,WAAW,EAAE,OAAO,EAAE,CAAC,EACvB,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,QACrD,UAAU,MAAMA,QAAO,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC;AAAA,QACvD,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,MAAM;AACb,UAAAA,QAAO,MAAM,EAAE,MAAM,EAAE,aAAa,UAAU,EAAE,UAAU,EAAE,IAAI;AAAA,QAClE;AAAA,QACA,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,UAAU;AAAA,QACxC,UAAU,MAAMA,QAAO,SAAS,QAAQ;AAAA,MAC1C;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAMA,QAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,QAC7D,IAAI;AAAA,QACJ,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,iBAAiB;AAAA,QAC/C,UAAU,MAAMA,QAAO,SAAS,YAAY;AAAA,QAC5C,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS,MAAMA,QAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,QAC9D,IAAI;AAAA,QACJ,UAAU,MAAM,CAACA,QAAO,IAAI,EAAE,kBAAkB;AAAA,QAChD,UAAU,MAAMA,QAAO,SAAS,aAAa;AAAA,QAC7C,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AjBmBQ,IAAAC,uBAAA;AA5GD,SAAS,eAAe,OAA8B;AA/C7D;AAgDE,QAAM,EAAE,QAAQ,SAAS,IAAI;AAE7B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,QAA0B;AAAA,IAC9B;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM,iCAAQ,SAAS;AAAA,MACjC,SAAS,MAAM,iCAAQ,QAAQ,QAAQ,aAAa;AAAA,MACpD,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM,iCAAQ,SAAS;AAAA,MACjC,SAAS,MAAM,iCAAQ,QAAQ,QAAQ,eAAe;AAAA,MACtD,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM,iCAAQ,SAAS;AAAA,MACjC,SAAS,MAAM,iCAAQ,QAAQ,QAAQ,kBAAkB;AAAA,MACzD,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM,iCAAQ,SAAS;AAAA,MACjC,SAAS,MAAM,iCAAQ,QAAQ,QAAQ,eAAe;AAAA,MACtD,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM,iCAAQ,SAAS;AAAA,MACjC,SAAS,MAAM,iCAAQ,QAAQ,QAAQ,aAAa;AAAA,MACpD,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAyC,gDAC1C,QACC,WAAW,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,IAFJ;AAAA,IAG7C,WAAW;AAAA,IACX,YAAY,CAAC,EAAE,QAAAC,SAAQ,MAAM,KAAK,MAAM;AAhG5C,UAAAC;AAiGM,UAAI,CAAC,QAAQD,QAAO,KAAK,UAAU;AACjC,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,KAAK,SAAS,QAAQ,CAAC,EAAE;AAC1C,YAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC;AACtC,YAAM,OAAO,WAAW;AAExB,UAAI,qBAAqBA,SAAQ,IAAI,GAAG;AACtC,eAAO;AAAA,MACT;AAEA,YAAM,cAAc;AAAA,QAClB,aAAa;AAAA,QACb,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAClB;AAEA,YAAM,uBACJ,YAAY,KAAK,CAAC,SAASA,QAAO,SAAS,IAAI,CAAC,OAChDC,MAAA,6BAAM,cAAN,gBAAAA,IAAiB,SAAS;AAC5B,aAAO,eAAeD,OAAM,KAAK,CAAC;AAAA,IACpC;AAAA,IACA,cAAc;AAAA,MACZ,eAAe;AAAA,QACb,WAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,YACX;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,oBAAoB,CAAC,gBAAgB,WAAW,YAAY;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,QAAQ,iBAAiB,MAAM;AACrC,QAAM,uBAAuB,wBAAwB,MAAM;AAC3D,QAAM,SAAS,iCAAQ,QAAQ,MAAM;AACrC,QAAM,mBAAkB,gDAAO,KAAK,YAAZ,mBAAqB,cAArB,mBAAgC,MAAM,GAAG,OAAzC,YAA+C,CAAC;AAExE,SACE;AAAA,IAAC;AAAA,qCACK,kBADL;AAAA,MAEC,WAAU;AAAA,MAEV,yDAAC,mBACC;AAAA,sDAAC,iBAAc,SAAS,sBAAsB;AAAA,QAE9C,8CAAC,WAAQ,WAAU,YAAW;AAAA,QAE7B,MAAM,IAAI,CAAC,MAAM,UAChB,8CAAC,qCAAiC,OAAX,KAAiB,CACzC;AAAA,QAED;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,MAAM;AAAA,YACjB,mBAAmB,CAAC,cAAc;AAChC,+CAAQ,QAAQ,QAAQ,aAAa,WAAW;AAAA,YAClD;AAAA;AAAA,QACF;AAAA,QAEC,CAAC,MAAM,gBACN,gFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAS,MAAM;AACb,uBAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,cAChD;AAAA,cACA,SAAQ;AAAA;AAAA,UACV;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAS,MAAM;AACb,uBAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,cACjD;AAAA,cACA,SAAQ;AAAA;AAAA,UACV;AAAA,WACF;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,eAAc,oCAAO,YAAP,YAAkB;AAAA,YAChC,eAAe,CAAC,OAAO,eAAe;AACpC,oBAAM,8BAA8B,MAAM;AAAA,gBACxC;AAAA,gBACA;AAAA,cACF;AAEA,kBAAI,CAAC,6BAA6B;AAChC,iDACI,QACD,QACA,gBAAgB,QAChB,YACA,iBACA;AACH;AAAA,cACF;AAEA,+CACI,QACD,gBAAgB,QAChB,QAAQ,EAAE,MAAM,MAAM,GACtB,iBAAiB,kCAAc,OAC/B,eACA;AAAA,YACL;AAAA,YACA,SAAQ;AAAA,YACR;AAAA,YACA,YAAY,MAAM;AAAA;AAAA,QACpB;AAAA,QAEA,8CAAC,WAAQ,WAAU,YAAW;AAAA,QAE9B;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,eAAe,CAAC,UAAU;AACxB,+CAAQ,QAAQ,SAAS,OAAO;AAAA,YAClC;AAAA,YACA,SAAS,CAAC,UAAU,OAAO,IAAI,KAAK;AAAA,YACpC,SAAQ;AAAA,YACR;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,WAAU;AAAA,gBAEV,yDAAC,SAAI,WAAU,2EACb;AAAA,gEAAC,UAAK,WAAU,gEAA+D,eAE/E;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,iBAAiB,MAAM,iBAAiB;AAAA;AAAA,kBACnD;AAAA,mBACF;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AkB5PA,yBAAuB;AACvB,iCAAqB;AACrB,iCAAsB;AACtB,mCAAwB;AACxB,kCAAsB;AACtB,kCAAsB;AACtB,+BAAoB;AACpB,iCAAsB;AACtB,gCAAqB;AACrB,6BAAkB;AAClB,kCAAuB;;;ACVvB,6BAA0C;AASnC,IAAM,QAAQ,uBAAAE,QAAY,OAAmC;AAAA,EAClE,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,oBAAI,IAAI;AAAA,IAClB;AAAA,EACF;AACF,CAAC;;;ACfD,IAAAC,gBAAsC;AAc/B,IAAM,SAAS,mBAAK,OAAsB;AAAA,EAC/C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EAET,gBAAgB;AACd,WAAO;AAAA,MACL,mBAAmB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY,CAAC,eAAe;AAC1B,iBAAO;AAAA,YACL,wBAAwB,WAAW,iBAAiB;AAAA,UACtD;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YAAY,mCAAS,aAAa;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,QAAQ,KAAK,IAAI;AAAA,MACnC;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,uCAAuC,CAAC;AAAA,EACzD;AAAA,EAEA,WAAW,EAAE,gBAAAC,gBAAe,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,UACA,+BAAgB,KAAK,QAAQ,gBAAgBA,iBAAgB;AAAA,QAC3D,OACE;AAAA,MACJ,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AClDD,IAAAC,iBAA8B;AAE9B,IAAAA,iBAA0D;AAC1D,IAAAC,gBAA8C;AAE9C,IAAAC,iBAAuB;AAyCnB,IAAAC,uBAAA;AAlCG,IAAM,mBAAe,2BAAW,CAAC,OAA0B,QAAQ;AACxE,QAAM,EAAE,QAAQ,CAAC,EAAE,IAAI;AAEvB,QAAM,iBAAa,uBAA2B,IAAI;AAElD,0CAAoB,KAAK,OAAO;AAAA,IAC9B,WAAW,CAAC,EAAE,MAAM,MAAgC;AAClD,UAAI,CAAC,WAAW,SAAS;AACvB,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,QAAQ,UAAU,OAAO,IAAI,WAAW,WAAW,CAAC;AAC5D,UAAI,MAAM,QAAQ,WAAW;AAC3B,cAAM,eAAe;AACrB,eAAO;AACP,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,aAAa;AAC7B,cAAM,eAAe;AACrB,iBAAS;AACT,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,SAAS;AACzB,eAAO;AACP,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,EACF,EAAE;AAEF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,CAAC,UAAU;AAvD/B;AAwDQ,cAAM,QAAQ;AAAA,UACZ,IAAI,MAAM;AAAA,UACV,WAAU,WAAM,aAAN,YAAkB;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,KAAK;AAAA;AAAA,EACP;AAEJ,CAAC;AAED,aAAa,cAAc;AAEpB,SAAS,uBACd,YAAuB,mBACvB,OAAe,+BACoB;AACnC,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,EAAE,OAAO,OAAO,MAAM;AAC5B,aAAO,iBAAiB,WAAW;AAAA,QACjC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IAEA,QAAQ,MAAM;AACZ,UAAI;AACJ,UAAI,QAAkC;AAEtC,aAAO;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,sBAAY,IAAI,6BAAc,cAAc;AAAA,YAC1C;AAAA,YACA,QAAQ,MAAM;AAAA,UAChB,CAAC;AAED,cAAI,CAAC,MAAM,YAAY;AACrB;AAAA,UACF;AAEA,sBAAQ,cAAAC,SAAM,QAAQ;AAAA,YACpB,wBAAwB,MAAM;AAAA,YAC9B,UAAU,MAAM,SAAS;AAAA,YACzB,SAAS,UAAU;AAAA,YACnB,cAAc;AAAA,YACd,aAAa;AAAA,YACb,SAAS;AAAA,YACT,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,QAEA,SAAS,OAAO;AA5GxB;AA6GU,oBAAU,YAAY,KAAK;AAE3B,cAAI,CAAC,MAAM,YAAY;AACrB;AAAA,UACF;AAEA,+CAAQ,OAAR,mBAAY,SAAS;AAAA,YACnB,wBAAwB,MAAM;AAAA,UAChC;AAAA,QACF;AAAA,QAEA,UAAU,OAAO;AAxHzB;AAyHU,cAAI,MAAM,MAAM,QAAQ,UAAU;AAChC,2CAAQ,GAAG;AACX,mBAAO;AAAA,UACT;AAEA,kBAAO,eAAU,QAAV,mBAAe,UAAU;AAAA,QAClC;AAAA,QAEA,SAAS;AACP,cAAI,CAAC,SAAS,EAAC,+BAAQ,OAAM,CAAC,WAAW;AACvC;AAAA,UACF;AAEA,yCAAQ,GAAG;AACX,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC5IA,IAAAC,gBAAkC;AAClC,IAAAC,qBAAuB;AAEhB,IAAM,eAAe,wBAAU,OAAO;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AACX,WAAO;AAAA,MACL,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF,MAIM;AACJ,gBAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,wBAAwB;AACtB,WAAO;AAAA,UACL,mBAAAC,SAAW;AAAA,QACT,QAAQ,KAAK;AAAA,SACV,KAAK,QAAQ,WACjB;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;AC/BM,IAAM,mBAAmB,CAAC,WAAwB,SAAsB;AAC7E,QAAM,kBAAkB,UAAU;AAClC,QAAM,aAAa,OAAO,KAAK,eAAe;AAE9C,QAAM,MAAM,KAAK;AACjB,QAAM,SAAS,MAAM;AAErB,MAAI,MAAM,UAAU,WAAW;AAC7B,cAAU,aAAa,UAAU,YAAY,MAAM;AAAA,EACrD,WAAW,SAAS,kBAAkB,UAAU,WAAW;AACzD,cAAU,aAAa,SAAS,kBAAkB,UAAU,YAAY;AAAA,EAC1E;AACF;;;ACRA,IAAAC,iBAA8B;AAE9B,IAAAA,iBAOO;AACP,IAAAC,gBAA8C;AA6FhC,IAAAC,uBAAA;AA9Ed,SAAS,YAAY,OAAyB;AAC5C,QAAM,EAAE,OAAO,SAAS,OAAO,IAAI;AAEnC,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,CAAC;AAEpD,QAAM,iBAAa;AAAA,IACjB,CAAC,UAAkB;AACjB,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,MAAM;AACR,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAAA;AAAA,IAEA,CAAC,SAAS,QAAQ,KAAK;AAAA,EACzB;AAEA,gCAAU,MAAM;AACd,UAAM,iBAAiB,CAAC,WAAW,aAAa,OAAO;AACvD,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,eAAe,SAAS,EAAE,GAAG,GAAG;AAClC,UAAE,eAAe;AACjB,YAAI,EAAE,QAAQ,WAAW;AACvB,4BAAkB,gBAAgB,MAAM,SAAS,KAAK,MAAM,MAAM;AAClE,iBAAO;AAAA,QACT;AACA,YAAI,EAAE,QAAQ,aAAa;AACzB,4BAAkB,gBAAgB,KAAK,MAAM,MAAM;AACnD,iBAAO;AAAA,QACT;AACA,YAAI,EAAE,QAAQ,SAAS;AACrB,qBAAW,aAAa;AACxB,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,OAAO,eAAe,kBAAkB,UAAU,CAAC;AAEvD,gCAAU,MAAM;AACd,qBAAiB,CAAC;AAAA,EACpB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,2BAAuB,uBAAuB,IAAI;AAExD,sCAAgB,MAAM;AACpB,UAAM,YAAY,6DAAsB;AAExC,UAAM,OAAO,uCAAW,SAAS;AAEjC,QAAI,QAAQ,WAAW;AACrB,uBAAiB,WAAW,IAAI;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,SAAO,MAAM,SAAS,IACpB,+CAAC,SAAI,WAAU,iHACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,KAAK;AAAA,QACL,WAAU;AAAA,QAET,gBAAM,IAAI,CAAC,MAAwB,UAAkB;AACpD,iBACE;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,UAAU,gBACN,sCACA;AAAA,cACN;AAAA,cAEA,SAAS,MAAM,WAAW,KAAK;AAAA,cAC/B,MAAK;AAAA,cAEL;AAAA,8DAAC,SAAI,WAAU,6EACZ,eAAK,MACR;AAAA,gBACA,+CAAC,SACC;AAAA,gEAAC,OAAE,WAAU,mBAAmB,eAAK,OAAM;AAAA,kBAC3C,8CAAC,OAAE,WAAU,iCACV,eAAK,aACR;AAAA,mBACF;AAAA;AAAA;AAAA,YAZK;AAAA,UAaP;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,IACA,8CAAC,SAAI,WAAU,+DACb,yDAAC,SAAI,WAAU,6BACb;AAAA,qDAAC,OAAE,WAAU,iDACX;AAAA,sDAAC,SAAI,WAAU,2DAA0D,oBAEzE;AAAA,QACA,8CAAC,SAAI,WAAU,oEAAmE,oBAElF;AAAA,QAAO;AAAA,QAAI;AAAA,SAEb;AAAA,MACA,8CAAC,UAAK,eAAY,QAAO,WAAU,4BAA2B,kBAE9D;AAAA,MACA,+CAAC,OAAE,WAAU,iDACX;AAAA,sDAAC,SAAI,WAAU,6DAA4D,mBAE3E;AAAA,QAAO;AAAA,QAAI;AAAA,SAEb;AAAA,OACF,GACF;AAAA,KACF,IACE;AACN;AAEO,SAAS,2BACd,WAAwB,CAAC,GACU;AACnC,SAAO;AAAA,IACL,OAAO,CAAC,EAAE,OAAO,OAAO,MAAM;AAC5B,aAAO,SAAS,OAAO,CAAC,SAAS;AAvJvC;AAwJQ,YAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,gBAAM,SAAS,MAAM,YAAY;AAEjC,eAAI,kCAAM,mBAAN,8BAAuB,SAAS;AAClC,mBAAO;AAAA,UACT;AAEA,iBACE,KAAK,MAAM,YAAY,EAAE,SAAS,MAAM,KACxC,KAAK,YAAY,YAAY,EAAE,SAAS,MAAM,KAC7C,KAAK,eACJ,KAAK,YAAY,KAAK,CAAC,SAAiB,KAAK,SAAS,MAAM,CAAC;AAAA,QAEnE;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,MAAM;AACZ,UAAI;AACJ,UAAI,QAAkC;AAEtC,aAAO;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,sBAAY,IAAI,6BAAc,aAAa;AAAA,YACzC;AAAA,YACA,QAAQ,MAAM;AAAA,UAChB,CAAC;AAED,sBAAQ,cAAAC,SAAM,QAAQ;AAAA,YACpB,wBAAwB,MAAM;AAAA,YAC9B,UAAU,MAAM,SAAS;AAAA,YACzB,SAAS,UAAU;AAAA,YACnB,cAAc;AAAA,YACd,aAAa;AAAA,YACb,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,QACA,UAAU,CAAC,UAAU;AACnB,iDAAW,YAAY;AAEvB,mBACE,MAAM,CAAC,EAAE,SAAS;AAAA,YAChB,wBAAwB,MAAM;AAAA,UAChC,CAAC;AAAA,QACL;AAAA,QACA,WAAW,CAAC,UAAU;AArM9B;AAsMU,cAAI,MAAM,MAAM,QAAQ,UAAU;AAChC,2CAAQ,GAAG;AAEX,mBAAO;AAAA,UACT;AAEA,kBAAO,4CAAW,QAAX,mBAAgB,UAAU;AAAA,QACnC;AAAA,QACA,QAAQ,MAAM;AACZ,cAAI,CAAC,SAAS,EAAC,+BAAQ,OAAM,CAAC,WAAW;AACvC;AAAA,UACF;AAEA,yCAAQ,GAAG;AACX,iDAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACzNA,4BAAuB;AAUhB,IAAM,gBAAgB,sBAAAC,QAAW,OAAO;AAAA,EAC7C,gBAAgB;AAXlB;AAYI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAEL,eAAe;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AAnBhB;AAoBI,WAAO,kCACF,UAAK,WAAL,gCADE;AAAA,MAGL,kBACE,CAAC,kBACD,CAAC,EAAE,MAAM,MAAM;AACb,eAAO,MAAM,EAAE,QAAQ,QAAQ,EAAE,cAAc,CAAC,EAAE,IAAI;AAAA,MACxD;AAAA,IACJ;AAAA,EACF;AACF,CAAC;;;APGM,SAAS,WAAW,OAAwB;AACjD,QAAM,EAAE,WAAW,QAAQ,yBAAyB,IAAI;AAExD,SAAO;AAAA,IACL,0BAAAC,QAAS,OAAO;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,mBAAAC,QAAW,UAAU;AAAA,MACnB,SAAS;AAAA,QACP,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,QAChB,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ,gBAAgB;AAAA,UACd,OACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,gBAAgB;AAAA,UACd,OACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,gBAAgB;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,2BAAAC;AAAA,IACA;AAAA,IACA,MAAM,UAAU,EAAE,OAAO,CAAC,4BAAAC,QAAU,MAAM,2BAAAC,QAAS,IAAI,EAAE,CAAC;AAAA,IAC1D,4BAAAD,QAAU,UAAU;AAAA,IACpB,4BAAAE,QAAU,UAAU,EAAE,OAAO,CAAC,2BAAAC,QAAU,MAAM,yBAAAC,QAAQ,MAAM,OAAO,IAAI,EAAE,CAAC;AAAA,IAC1E;AAAA,IACA,6BAAAC,QAAY,UAAU;AAAA,MACpB,aAAa,CAAC,EAAE,KAAK,MAAM;AACzB,YAAI,KAAK,KAAK,SAAS,WAAW;AAChC,iBAAO,WAAW,KAAK,MAAM,KAAK;AAAA,QACpC,WACE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,SAAS,KAAK,KAAK,IAAI,GACzB;AACA,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,IACnB,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,aAAa,UAAU;AAAA,MACrB,YAAY,2BAA2B,MAAM;AAAA,IAC/C,CAAC;AAAA,IACD,cAAc,UAAU;AAAA,MACtB,gBAAgB;AAAA,QACd,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,uBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,4BAAAC,QAAW,UAAU;AAAA,MACnB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAAA,IACD;AAAA,IACA,kBAAkB,UAAU;AAAA,MAC1B,YAAY,uBAAuB,WAAW,wBAAwB;AAAA,IACxE,CAAC;AAAA,EACH;AACF;;;A5EQuB,IAAAC,uBAAA;AAlGhB,SAASC,QAAO,OAAoB;AACzC,QAAM;AAAA,IACJ,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,oBAAoB;AAAA,IACtB,IAAI,CAAC;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,2BAA2B;AAAA,IAC3B,iBAAiB;AAAA,EACnB,IAAI;AAEJ,MAAI,mBAAwB;AAC5B,MAAI,aAAa;AACf,wBACE,2CAAa,UAAS,QAClB,cACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACR,WAAW,aAAa;AACtB,uBAAmB;AAAA,EACrB,OAAO;AACL,uBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,SAAS,CAAC;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAmB,uBAAO,IAAI;AACpC,QAAM,aAAS,0BAAU;AAAA,IACvB,aAAa;AAAA,MACX,YAAY;AAAA,QACV,OAAO,GAAG,wBAAwB,gBAAgB;AAAA,QAClD,YAAY,aAAa,SAAS;AAAA,MACpC;AAAA,MACA,iBAAiB;AAAA,QACf,SAAS,CAAC,OAAO,UAAU;AAEzB,cAAI,CAAC,WAAW,aAAa,OAAO,EAAE,SAAS,MAAM,GAAG,GAAG;AACzD,kBAAM,eAAe,SAAS,cAAc,gBAAgB;AAC5D,gBAAI,cAAc;AAChB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA,UAAU,CAAC,EAAE,QAAAC,QAAO,MAAM;AACxB,2CAAWA;AAAA,IACb;AAAA,IACA,UAAU,CAAC,EAAE,QAAAA,QAAO,MAAM;AACxB,2CAAWA;AAAA,IACb;AAAA,IACA,YAAY;AAAA,MACV,GAAG,WAAkB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,GAAID,eAAc,CAAC;AAAA,IACrB;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,8BAA8B,aAAa;AAAA,UACzD,KAAK;AAAA,UAEJ;AAAA,0BAAc,8CAAC,iBAAc,QAAQ,MAAM,QAAQ,QAAgB;AAAA,YACpE;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEA;AAAA,gEAAC,kBAAe,QAAgB,UAAU,kBAAkB;AAAA,kBAC5D,8CAAC,mBAAgB,QAAgB,UAAU,kBAAkB;AAAA,kBAC7D,8CAAC,oBAAiB,QAAgB,UAAU,kBAAkB;AAAA,kBAC9D,8CAAC,gCAAc,QAAgB;AAAA,kBAC/B,8CAAC,qBAAkB,QAAgB,UAAU,kBAAkB;AAAA,kBAC/D,8CAAC,qBAAkB,QAAgB,UAAU,kBAAkB;AAAA,kBAC/D,8CAAC,eAAY,QAAgB;AAAA,kBAC7B,8CAAC,iBAAc,QAAgB,UAAU,kBAAkB;AAAA;AAAA;AAAA,YAC7D;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":["Editor","import_react","import_react","import_uuid","import_core","import_core","uuid","HTMLAttributes","uuid","deepEql","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","updateAttributes","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","value","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_core","import_jsx_runtime","import_jsx_runtime","editor","import_react","import_lucide_react","import_react","import_state","import_tippy","import_model","t","e","o","element","n","r","i","s","d","tippy","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","index","import_react","import_lucide_react","import_tippy","import_react","import_fast_deep_equal","deepEql","import_jsx_runtime","editor","import_react","import_lucide_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react","import_react","import_jsx_runtime","_a","protocol","isVariable","import_jsx_runtime","import_react","import_core","HTMLAttributes","import_react","import_react","import_react","import_lucide_react","import_jsx_runtime","updateAttributes","event","import_jsx_runtime","TiptapImage","import_react","import_fast_deep_equal","editor","deepEql","import_tippy","import_jsx_runtime","editor","import_react","import_lucide_react","import_tippy","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","color","import_react","import_fast_deep_equal","deepEql","import_jsx_runtime","editor","import_react","import_core","HTMLAttributes","import_react","import_fast_deep_equal","deepEql","import_jsx_runtime","editor","import_react","import_lucide_react","import_react","import_fast_deep_equal","deepEql","import_core","TipTapHorizontalRule","import_extension_image","import_core","import_react","import_react","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","image","HTMLAttributes","import_core","import_react","import_react","import_react","import_jsx_runtime","value","isVariable","import_jsx_runtime","updateAttributes","text","alignment","HTMLAttributes","import_core","import_state","import_react","HTMLAttributes","Suggestion","import_extension_image","import_react","TiptapImage","Image","import_core","import_uuid","uuid","HTMLAttributes","import_core","import_react","import_react","import_lucide_react","import_jsx_runtime","HTMLAttributes","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","editor","import_jsx_runtime","editor","_a","TiptapColor","import_core","HTMLAttributes","import_react","import_tippy","import_react","import_jsx_runtime","tippy","import_core","import_suggestion","Suggestion","import_react","import_tippy","import_jsx_runtime","tippy","TiptapLink","Document","StarterKit","Underline","TextStyle","ListItem","TextAlign","Paragraph","Heading","Placeholder","Focus","Dropcursor","import_jsx_runtime","Editor","extensions","editor"]}