.dialog-widget-content { background-color: #fff; position: absolute; border-radius: 3px; box-shadow: 2px 8px 23px 3px rgba(0, 0, 0, 0.2); overflow: hidden; } .dialog-message { font-size: 12px; line-height: 1.5; box-sizing: border-box; } .dialog-type-lightbox { position: fixed; height: 100%; width: 100%; bottom: 0; left: 0; background-color: rgba(0, 0, 0, 0.8); z-index: 9999; user-select: none; } .dialog-type-lightbox .dialog-widget-content { margin: auto; width: 375px; } .dialog-type-lightbox .dialog-header { font-size: 15px; color: #495157; padding: 30px 0 10px; font-weight: 500; } .dialog-type-lightbox .dialog-message { padding: 0 30px 30px; min-height: 50px; } .dialog-type-lightbox:not(.elementor-popup-modal) .dialog-header, .dialog-type-lightbox:not(.elementor-popup-modal) .dialog-message { text-align: center; } .dialog-type-lightbox .dialog-buttons-wrapper { border-top: 1px solid #e6e9ec; text-align: center; } .dialog-type-lightbox .dialog-buttons-wrapper > .dialog-button { font-family: Roboto, Arial, Helvetica, Verdana, sans-serif; width: 50%; border: none; background: none; color: #6d7882; font-size: 15px; cursor: pointer; padding: 13px 0; outline: 0; } .dialog-type-lightbox .dialog-buttons-wrapper > .dialog-button:hover { background-color: #f4f6f7; } .dialog-type-lightbox .dialog-buttons-wrapper > .dialog-button.dialog-ok { color: #b01b1b; } .dialog-type-lightbox .dialog-buttons-wrapper > .dialog-button.dialog-take_over { color: #39b54a; } .dialog-type-lightbox .dialog-buttons-wrapper > .dialog-button:active { background-color: rgba(230, 233, 236, 0.5); } .dialog-type-lightbox .dialog-buttons-wrapper > .dialog-button::-moz-focus-inner { border: 0; } .dialog-close-button { cursor: pointer; position: absolute; margin-top: 15px; left: 15px; font-size: 15px; line-height: 1; } .dialog-close-button:not(:hover) { opacity: .4; } .dialog-alert-widget .dialog-buttons-wrapper > button { width: 100%; } .dialog-confirm-widget .dialog-button:first-child { border-left: 1px solid #e6e9ec; } .dialog-prevent-scroll { overflow: hidden; max-height: 100vh; } @media (min-width: 1024px) { body.admin-bar .dialog-lightbox-widget { height: calc(100vh - 32px); } } @media (max-width: 1024px) { body.admin-bar .dialog-type-lightbox { position: sticky; height: 100vh; } } .elementor-aspect-ratio-219 .elementor-fit-aspect-ratio { padding-bottom: 42.8571%; } .elementor-aspect-ratio-169 .elementor-fit-aspect-ratio { padding-bottom: 56.25%; } .elementor-aspect-ratio-43 .elementor-fit-aspect-ratio { padding-bottom: 75%; } .elementor-aspect-ratio-32 .elementor-fit-aspect-ratio { padding-bottom: 66.6666%; } .elementor-aspect-ratio-11 .elementor-fit-aspect-ratio { padding-bottom: 100%; } .elementor-aspect-ratio-916 .elementor-fit-aspect-ratio { padding-bottom: 177.8%; } .elementor-fit-aspect-ratio { position: relative; height: 0; } .elementor-fit-aspect-ratio iframe { position: absolute; top: 0; left: 0; height: 100%; width: 100%; border: 0; background-color: #000; } .elementor-fit-aspect-ratio video { width: 100%; } .flatpickr-calendar { width: 280px; } .flatpickr-calendar .flatpickr-current-month span.cur-month { font-weight: 300; } .flatpickr-calendar .dayContainer { width: 280px; min-width: 280px; max-width: 280px; } .flatpickr-calendar .flatpickr-days { width: 280px; } .flatpickr-calendar .flatpickr-day { max-width: 37px; height: 37px; line-height: 37px; } .elementor-templates-modal .dialog-widget-content { font-family: Roboto, Arial, Helvetica, Verdana, sans-serif; background-color: #f1f3f5; width: 100%; } @media (max-width: 1439px) { .elementor-templates-modal .dialog-widget-content { max-width: 990px; } } @media (min-width: 1440px) { .elementor-templates-modal .dialog-widget-content { max-width: 1200px; } } .elementor-templates-modal .dialog-header { padding: 0; background-color: #fff; box-shadow: 0 0 8px rgba(0, 0, 0, 0.1); position: relative; z-index: 1; } .elementor-templates-modal .dialog-buttons-wrapper { background-color: #fff; border: none; display: none; justify-content: flex-end; padding: 5px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.1); position: relative; } .elementor-templates-modal .dialog-buttons-wrapper .elementor-button { height: 40px; margin-right: 5px; } .elementor-templates-modal .dialog-buttons-wrapper .elementor-button-success { padding: 12px 36px; color: #fff; width: initial; font-size: 15px; } .elementor-templates-modal .dialog-buttons-wrapper .elementor-button-success:hover { background-color: #39b54a; } .elementor-templates-modal .dialog-message { height: 750px; max-height: 85vh; overflow: auto; padding-top: 25px; } .elementor-templates-modal .dialog-content { height: 100%; } .elementor-templates-modal .dialog-loading { display: none; } .elementor-templates-modal__header { display: flex; align-items: center; justify-content: space-between; height: 50px; } .elementor-templates-modal__header__logo { line-height: 1; text-transform: uppercase; font-weight: bold; cursor: pointer; } .elementor-templates-modal__header__logo-area { text-align: right; padding-right: 15px; } .elementor-templates-modal__header__logo-area > * { display: flex; align-items: center; } .elementor-templates-modal__header__logo__icon-wrapper { margin-left: 10px; font-size: 12px; } .elementor-templates-modal__header__logo__title { padding-top: 2px; } .elementor-templates-modal__header__items-area { display: flex; flex-direction: row-reverse; } .elementor-templates-modal__header__item { position: relative; display: flex; align-items: center; justify-content: center; box-sizing: content-box; } .elementor-templates-modal__header__item > i { font-size: 20px; transition: all 0.3s; cursor: pointer; } .elementor-templates-modal__header__item > i:not(:hover) { color: #a4afb7; } .elementor-templates-modal__header__close--normal { width: 47px; border-right: 1px solid #e6e9ec; } .elementor-templates-modal__header__close--normal i { font-size: 18px; } .elementor-templates-modal__header__close--skip { padding: 10px; padding-right: 20px; margin-left: 10px; color: #fff; background-color: #a4afb7; font-size: 11px; font-weight: normal; line-height: 1; text-transform: uppercase; border-radius: 2px; cursor: pointer; } .elementor-templates-modal__header__close--skip > i { font-size: inherit; padding-right: 10px; margin-right: 15px; border-right: 1px solid; } .elementor-templates-modal__header__close--skip > i:not(:hover) { color: #fff; } .elementor-templates-modal__sidebar { flex-shrink: 0; width: 25%; background-color: rgba(255, 255, 255, 0.3); } .elementor-templates-modal__content { flex-grow: 1; box-shadow: 0 0 13px inset rgba(0, 0, 0, 0.05); } /* Will select next element after last '.elementor-general-section' */ #wpadminbar #wp-admin-bar-elementor_edit_page .elementor-general-section + .elementor-second-section { border-top: 1px solid #464b50; margin-top: 6px; } .elementor-hidden { display: none; } .elementor-screen-only, .screen-reader-text, .screen-reader-text span, .ui-helper-hidden-accessible { position: absolute; top: -10000em; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .elementor-clearfix:after { content: ''; display: block; clear: both; width: 0; height: 0; } .e-logo-wrapper { background: #93003c; display: inline-block; padding: 0.75em; border-radius: 50%; line-height: 1; } .e-logo-wrapper i { color: #fff; font-size: 1em; } #e-enable-unfiltered-files-dialog-import-template .dialog-confirm-ok { color: #39b54a; } #e-enable-unfiltered-files-dialog-import-template .dialog-confirm-cancel { color: #b01b1b; } .elementor { hyphens: manual; } .elementor *, .elementor *:before, .elementor *:after { box-sizing: border-box; } .elementor a { box-shadow: none; text-decoration: none; } .elementor hr { margin: 0; background-color: transparent; } .elementor img { height: auto; max-width: 100%; border: none; border-radius: 0; box-shadow: none; } .elementor .elementor-widget:not(.elementor-widget-text-editor):not(.elementor-widget-theme-post-content) figure { margin: 0; } .elementor embed, .elementor iframe, .elementor object, .elementor video { max-width: 100%; width: 100%; margin: 0; line-height: 1; border: none; } .elementor .elementor-custom-embed { line-height: 0; } .elementor .elementor-background-video-container, .elementor .elementor-background-holder, .elementor .elementor-background { height: 100%; width: 100%; top: 0; left: 0; position: absolute; overflow: hidden; z-index: 0; direction: ltr; } .elementor .elementor-background-video-container { transition: opacity 1s; pointer-events: none; } .elementor .elementor-background-video-container.elementor-loading { opacity: 0; } .elementor .elementor-background-video-embed { max-width: none; } .elementor .elementor-background-video-embed, .elementor .elementor-background-video-hosted { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .elementor .elementor-background-video { max-width: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .elementor .elementor-html5-video { object-fit: cover; } .elementor .elementor-background-overlay { height: 100%; width: 100%; top: 0; left: 0; position: absolute; } .elementor .elementor-background-slideshow { position: absolute; width: 100%; height: 100%; z-index: 0; top: 0; right: 0; } .elementor .elementor-background-slideshow__slide__image { width: 100%; height: 100%; background-position: center center; background-size: cover; } .elementor-widget-wrap > .elementor-element.elementor-absolute, .e-container > .elementor-element.elementor-absolute { position: absolute; } .elementor-widget-wrap > .elementor-element.elementor-fixed, .e-container > .elementor-element.elementor-fixed { position: fixed; } .elementor-widget-wrap .elementor-element.elementor-widget__width-auto, .elementor-widget-wrap .elementor-element.elementor-widget__width-initial { max-width: 100%; } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-widget-wrap .elementor-element.elementor-widget-tablet__width-auto, .elementor-widget-wrap .elementor-element.elementor-widget-tablet__width-initial { max-width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-widget-wrap .elementor-element.elementor-widget-mobile__width-auto, .elementor-widget-wrap .elementor-element.elementor-widget-mobile__width-initial { max-width: 100%; } } .elementor-element { --flex-direction: initial; --flex-wrap: initial; --justify-content: initial; --align-items: initial; --align-content: initial; --gap: initial; --flex-basis: initial; --flex-grow: initial; --flex-shrink: initial; --order: initial; --align-self: initial; flex-direction: var(--flex-direction); flex-wrap: var(--flex-wrap); justify-content: var(--justify-content); align-items: var(--align-items); align-content: var(--align-content); gap: var(--gap); flex-basis: var(--flex-basis); flex-grow: var(--flex-grow); flex-shrink: var(--flex-shrink); order: var(--order); align-self: var(--align-self); } .elementor-element.elementor-absolute, .elementor-element.elementor-fixed { z-index: 1; } .elementor-invisible { visibility: hidden; } .elementor-align-center { text-align: center; } .elementor-align-center .elementor-button { width: auto; } .elementor-align-right { text-align: right; } .elementor-align-right .elementor-button { width: auto; } .elementor-align-left { text-align: left; } .elementor-align-left .elementor-button { width: auto; } .elementor-align-justify .elementor-button { width: 100%; } .elementor-custom-embed-play { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .elementor-custom-embed-play i { font-size: 100px; color: #fff; text-shadow: 1px 0 6px rgba(0, 0, 0, 0.3); } .elementor-custom-embed-play svg { height: 100px; width: 100px; fill: #fff; filter: drop-shadow(1px 0 6px rgba(0, 0, 0, 0.3)); } .elementor-custom-embed-play i, .elementor-custom-embed-play svg { opacity: 0.8; transition: all .5s; } .elementor-custom-embed-play.elementor-playing i { font-family: eicons; } .elementor-custom-embed-play.elementor-playing i:before { content: '\e8fb'; } .elementor-custom-embed-play.elementor-playing i, .elementor-custom-embed-play.elementor-playing svg { animation: eicon-spin 2s infinite linear; } .elementor-tag { display: inline-flex; } .elementor-ken-burns { transition-property: transform; transition-duration: 10s; transition-timing-function: linear; } .elementor-ken-burns--out { transform: scale(1.3); } .elementor-ken-burns--active { transition-duration: 20s; } .elementor-ken-burns--active.elementor-ken-burns--out { transform: scale(1); } .elementor-ken-burns--active.elementor-ken-burns--in { transform: scale(1.3); } @media (min-width: ELEMENTOR_SCREEN_WIDESCREEN_MIN) { .elementor-widescreen-align-center { text-align: center; } .elementor-widescreen-align-center .elementor-button { width: auto; } .elementor-widescreen-align-right { text-align: right; } .elementor-widescreen-align-right .elementor-button { width: auto; } .elementor-widescreen-align-left { text-align: left; } .elementor-widescreen-align-left .elementor-button { width: auto; } .elementor-widescreen-align-justify .elementor-button { width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { .elementor-laptop-align-center { text-align: center; } .elementor-laptop-align-center .elementor-button { width: auto; } .elementor-laptop-align-right { text-align: right; } .elementor-laptop-align-right .elementor-button { width: auto; } .elementor-laptop-align-left { text-align: left; } .elementor-laptop-align-left .elementor-button { width: auto; } .elementor-laptop-align-justify .elementor-button { width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MAX) { .elementor-tablet_extra-align-center { text-align: center; } .elementor-tablet_extra-align-center .elementor-button { width: auto; } .elementor-tablet_extra-align-right { text-align: right; } .elementor-tablet_extra-align-right .elementor-button { width: auto; } .elementor-tablet_extra-align-left { text-align: left; } .elementor-tablet_extra-align-left .elementor-button { width: auto; } .elementor-tablet_extra-align-justify .elementor-button { width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-tablet-align-center { text-align: center; } .elementor-tablet-align-center .elementor-button { width: auto; } .elementor-tablet-align-right { text-align: right; } .elementor-tablet-align-right .elementor-button { width: auto; } .elementor-tablet-align-left { text-align: left; } .elementor-tablet-align-left .elementor-button { width: auto; } .elementor-tablet-align-justify .elementor-button { width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MAX) { .elementor-mobile_extra-align-center { text-align: center; } .elementor-mobile_extra-align-center .elementor-button { width: auto; } .elementor-mobile_extra-align-right { text-align: right; } .elementor-mobile_extra-align-right .elementor-button { width: auto; } .elementor-mobile_extra-align-left { text-align: left; } .elementor-mobile_extra-align-left .elementor-button { width: auto; } .elementor-mobile_extra-align-justify .elementor-button { width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-mobile-align-center { text-align: center; } .elementor-mobile-align-center .elementor-button { width: auto; } .elementor-mobile-align-right { text-align: right; } .elementor-mobile-align-right .elementor-button { width: auto; } .elementor-mobile-align-left { text-align: left; } .elementor-mobile-align-left .elementor-button { width: auto; } .elementor-mobile-align-justify .elementor-button { width: 100%; } } :root { --page-title-display: block; } .elementor-page-title, h1.entry-title { display: var(--page-title-display); } @keyframes eicon-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(359deg); } } .eicon-animation-spin { animation: eicon-spin 2s infinite linear; } .elementor-section { position: relative; } .elementor-section .elementor-container { display: flex; margin-right: auto; margin-left: auto; position: relative; } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-section .elementor-container { flex-wrap: wrap; } } .elementor-section.elementor-section-boxed > .elementor-container { max-width: 1140px; } .elementor-section.elementor-section-stretched { position: relative; width: 100%; } .elementor-section.elementor-section-items-top > .elementor-container { align-items: flex-start; } .elementor-section.elementor-section-items-middle > .elementor-container { align-items: center; } .elementor-section.elementor-section-items-bottom > .elementor-container { align-items: flex-end; } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) { .elementor-section.elementor-section-height-full { height: 100vh; } .elementor-section.elementor-section-height-full > .elementor-container { height: 100%; } } .elementor-bc-flex-widget .elementor-section-content-top > .elementor-container > .elementor-column > .elementor-widget-wrap { align-items: flex-start; } .elementor-bc-flex-widget .elementor-section-content-middle > .elementor-container > .elementor-column > .elementor-widget-wrap { align-items: center; } .elementor-bc-flex-widget .elementor-section-content-bottom > .elementor-container > .elementor-column > .elementor-widget-wrap { align-items: flex-end; } .elementor-row { width: 100%; display: flex; } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-row { flex-wrap: wrap; } } .elementor-widget-wrap { position: relative; width: 100%; flex-wrap: wrap; align-content: flex-start; } .elementor:not(.elementor-bc-flex-widget) .elementor-widget-wrap { display: flex; } .elementor-widget-wrap > .elementor-element { width: 100%; } .elementor-widget-wrap.e-swiper-container { width: calc(100% - (var(--e-column-margin-left, 0px) + var(--e-column-margin-right, 0px))); } .elementor-widget { position: relative; } .elementor-widget:not(:last-child) { margin-bottom: 20px; } .elementor-widget:not(:last-child).elementor-widget__width-auto, .elementor-widget:not(:last-child).elementor-widget__width-initial, .elementor-widget:not(:last-child).elementor-absolute { margin-bottom: 0; } .elementor-column { position: relative; min-height: 1px; display: flex; } .elementor-column-wrap { width: 100%; position: relative; display: flex; } .elementor-column-gap-narrow > .elementor-column > .elementor-element-populated { padding: 5px; } .elementor-column-gap-default > .elementor-column > .elementor-element-populated { padding: 10px; } .elementor-column-gap-extended > .elementor-column > .elementor-element-populated { padding: 15px; } .elementor-column-gap-wide > .elementor-column > .elementor-element-populated { padding: 20px; } .elementor-column-gap-wider > .elementor-column > .elementor-element-populated { padding: 30px; } .elementor-inner-section .elementor-column-gap-no .elementor-element-populated { padding: 0; } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) { .elementor-column.elementor-col-10, .elementor-column[data-col="10"] { width: 10%; } .elementor-column.elementor-col-11, .elementor-column[data-col="11"] { width: 11.111%; } .elementor-column.elementor-col-12, .elementor-column[data-col="12"] { width: 12.5%; } .elementor-column.elementor-col-14, .elementor-column[data-col="14"] { width: 14.285%; } .elementor-column.elementor-col-16, .elementor-column[data-col="16"] { width: 16.666%; } .elementor-column.elementor-col-20, .elementor-column[data-col="20"] { width: 20%; } .elementor-column.elementor-col-25, .elementor-column[data-col="25"] { width: 25%; } .elementor-column.elementor-col-30, .elementor-column[data-col="30"] { width: 30%; } .elementor-column.elementor-col-33, .elementor-column[data-col="33"] { width: 33.333%; } .elementor-column.elementor-col-40, .elementor-column[data-col="40"] { width: 40%; } .elementor-column.elementor-col-50, .elementor-column[data-col="50"] { width: 50%; } .elementor-column.elementor-col-60, .elementor-column[data-col="60"] { width: 60%; } .elementor-column.elementor-col-66, .elementor-column[data-col="66"] { width: 66.666%; } .elementor-column.elementor-col-70, .elementor-column[data-col="70"] { width: 70%; } .elementor-column.elementor-col-75, .elementor-column[data-col="75"] { width: 75%; } .elementor-column.elementor-col-80, .elementor-column[data-col="80"] { width: 80%; } .elementor-column.elementor-col-83, .elementor-column[data-col="83"] { width: 83.333%; } .elementor-column.elementor-col-90, .elementor-column[data-col="90"] { width: 90%; } .elementor-column.elementor-col-100, .elementor-column[data-col="100"] { width: 100%; } } @media (max-width: 479px) { .elementor-column.elementor-xs-10 { width: 10%; } .elementor-column.elementor-xs-11 { width: 11.111%; } .elementor-column.elementor-xs-12 { width: 12.5%; } .elementor-column.elementor-xs-14 { width: 14.285%; } .elementor-column.elementor-xs-16 { width: 16.666%; } .elementor-column.elementor-xs-20 { width: 20%; } .elementor-column.elementor-xs-25 { width: 25%; } .elementor-column.elementor-xs-30 { width: 30%; } .elementor-column.elementor-xs-33 { width: 33.333%; } .elementor-column.elementor-xs-40 { width: 40%; } .elementor-column.elementor-xs-50 { width: 50%; } .elementor-column.elementor-xs-60 { width: 60%; } .elementor-column.elementor-xs-66 { width: 66.666%; } .elementor-column.elementor-xs-70 { width: 70%; } .elementor-column.elementor-xs-75 { width: 75%; } .elementor-column.elementor-xs-80 { width: 80%; } .elementor-column.elementor-xs-83 { width: 83.333%; } .elementor-column.elementor-xs-90 { width: 90%; } .elementor-column.elementor-xs-100 { width: 100%; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-column.elementor-sm-10 { width: 10%; } .elementor-column.elementor-sm-11 { width: 11.111%; } .elementor-column.elementor-sm-12 { width: 12.5%; } .elementor-column.elementor-sm-14 { width: 14.285%; } .elementor-column.elementor-sm-16 { width: 16.666%; } .elementor-column.elementor-sm-20 { width: 20%; } .elementor-column.elementor-sm-25 { width: 25%; } .elementor-column.elementor-sm-30 { width: 30%; } .elementor-column.elementor-sm-33 { width: 33.333%; } .elementor-column.elementor-sm-40 { width: 40%; } .elementor-column.elementor-sm-50 { width: 50%; } .elementor-column.elementor-sm-60 { width: 60%; } .elementor-column.elementor-sm-66 { width: 66.666%; } .elementor-column.elementor-sm-70 { width: 70%; } .elementor-column.elementor-sm-75 { width: 75%; } .elementor-column.elementor-sm-80 { width: 80%; } .elementor-column.elementor-sm-83 { width: 83.333%; } .elementor-column.elementor-sm-90 { width: 90%; } .elementor-column.elementor-sm-100 { width: 100%; } } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) and (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-column.elementor-md-10 { width: 10%; } .elementor-column.elementor-md-11 { width: 11.111%; } .elementor-column.elementor-md-12 { width: 12.5%; } .elementor-column.elementor-md-14 { width: 14.285%; } .elementor-column.elementor-md-16 { width: 16.666%; } .elementor-column.elementor-md-20 { width: 20%; } .elementor-column.elementor-md-25 { width: 25%; } .elementor-column.elementor-md-30 { width: 30%; } .elementor-column.elementor-md-33 { width: 33.333%; } .elementor-column.elementor-md-40 { width: 40%; } .elementor-column.elementor-md-50 { width: 50%; } .elementor-column.elementor-md-60 { width: 60%; } .elementor-column.elementor-md-66 { width: 66.666%; } .elementor-column.elementor-md-70 { width: 70%; } .elementor-column.elementor-md-75 { width: 75%; } .elementor-column.elementor-md-80 { width: 80%; } .elementor-column.elementor-md-83 { width: 83.333%; } .elementor-column.elementor-md-90 { width: 90%; } .elementor-column.elementor-md-100 { width: 100%; } } @media (min-width: ELEMENTOR_SCREEN_WIDESCREEN_MIN) { .elementor-reverse-widescreen > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-widescreen > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-widescreen > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-widescreen > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-widescreen > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-widescreen > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-widescreen > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-widescreen > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-widescreen > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-widescreen > .elementor-container > :nth-child(10) { order: 1; } } @media (min-width: ELEMENTOR_SCREEN_TABLET_NEXT) and (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { .elementor-reverse-laptop > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-laptop > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-laptop > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-laptop > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-laptop > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-laptop > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-laptop > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-laptop > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-laptop > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-laptop > .elementor-container > :nth-child(10) { order: 1; } } @media (min-width: ELEMENTOR_SCREEN_TABLET_EXTRA_NEXT) and (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { .elementor-reverse-laptop > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-laptop > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-laptop > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-laptop > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-laptop > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-laptop > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-laptop > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-laptop > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-laptop > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-laptop > .elementor-container > :nth-child(10) { order: 1; } } @media (min-width: ELEMENTOR_SCREEN_TABLET_NEXT) and (max-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MAX) { .elementor-reverse-laptop > .elementor-container > :nth-child(1) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(2) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(3) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(4) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(5) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(6) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(7) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(8) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(9) { order: initial; } .elementor-reverse-laptop > .elementor-container > :nth-child(10) { order: initial; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-tablet_extra > .elementor-container > :nth-child(10) { order: 1; } } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) and (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-reverse-tablet > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-tablet > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-tablet > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-tablet > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-tablet > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-tablet > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-tablet > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-tablet > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-tablet > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-tablet > .elementor-container > :nth-child(10) { order: 1; } } @media (min-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_NEXT) and (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-reverse-tablet > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-tablet > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-tablet > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-tablet > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-tablet > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-tablet > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-tablet > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-tablet > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-tablet > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-tablet > .elementor-container > :nth-child(10) { order: 1; } } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) and (max-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MAX) { .elementor-reverse-tablet > .elementor-container > :nth-child(1) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(2) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(3) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(4) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(5) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(6) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(7) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(8) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(9) { order: initial; } .elementor-reverse-tablet > .elementor-container > :nth-child(10) { order: initial; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-mobile_extra > .elementor-container > :nth-child(10) { order: 1; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-reverse-mobile > .elementor-container > :nth-child(1) { order: 10; } .elementor-reverse-mobile > .elementor-container > :nth-child(2) { order: 9; } .elementor-reverse-mobile > .elementor-container > :nth-child(3) { order: 8; } .elementor-reverse-mobile > .elementor-container > :nth-child(4) { order: 7; } .elementor-reverse-mobile > .elementor-container > :nth-child(5) { order: 6; } .elementor-reverse-mobile > .elementor-container > :nth-child(6) { order: 5; } .elementor-reverse-mobile > .elementor-container > :nth-child(7) { order: 4; } .elementor-reverse-mobile > .elementor-container > :nth-child(8) { order: 3; } .elementor-reverse-mobile > .elementor-container > :nth-child(9) { order: 2; } .elementor-reverse-mobile > .elementor-container > :nth-child(10) { order: 1; } .elementor-column { width: 100%; } } ul.elementor-icon-list-items.elementor-inline-items { display: flex; flex-wrap: wrap; } ul.elementor-icon-list-items.elementor-inline-items .elementor-inline-item { word-break: break-word; } .elementor-grid { display: grid; grid-column-gap: var(--grid-column-gap); grid-row-gap: var(--grid-row-gap); } .elementor-grid .elementor-grid-item { min-width: 0; } .elementor-grid-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } @media (min-width: ELEMENTOR_SCREEN_WIDESCREEN_MIN) { .elementor-grid-widescreen-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-widescreen-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-widescreen-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-widescreen-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-widescreen-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-widescreen-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-widescreen-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-widescreen-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-widescreen-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-widescreen-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-widescreen-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-widescreen-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-widescreen-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-widescreen-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } } @media (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { .elementor-grid-laptop-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-laptop-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-laptop-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-laptop-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-laptop-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-laptop-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-laptop-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-laptop-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-laptop-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-laptop-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-laptop-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-laptop-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-laptop-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-laptop-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } } @media (max-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MAX) { .elementor-grid-tablet_extra-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-tablet_extra-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-tablet_extra-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-tablet_extra-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-tablet_extra-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-tablet_extra-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-tablet_extra-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-tablet_extra-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-tablet_extra-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-tablet_extra-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-tablet_extra-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-tablet_extra-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-tablet_extra-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-tablet_extra-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-grid-tablet-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-tablet-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-tablet-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-tablet-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-tablet-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-tablet-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-tablet-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-tablet-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-tablet-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-tablet-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-tablet-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-tablet-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-tablet-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-tablet-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MAX) { .elementor-grid-mobile_extra-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-mobile_extra-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-mobile_extra-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-mobile_extra-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-mobile_extra-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-mobile_extra-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-mobile_extra-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-mobile_extra-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-mobile_extra-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-mobile_extra-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-mobile_extra-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-mobile_extra-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-mobile_extra-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-mobile_extra-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-grid-mobile-0 .elementor-grid { display: inline-block; width: 100%; word-spacing: var(--grid-column-gap); margin-bottom: calc(-1 * var(--grid-row-gap)); } .elementor-grid-mobile-0 .elementor-grid .elementor-grid-item { display: inline-block; margin-bottom: var(--grid-row-gap); word-break: break-word; } .elementor-grid-mobile-1 .elementor-grid { grid-template-columns: repeat(1, 1fr); } .elementor-grid-mobile-2 .elementor-grid { grid-template-columns: repeat(2, 1fr); } .elementor-grid-mobile-3 .elementor-grid { grid-template-columns: repeat(3, 1fr); } .elementor-grid-mobile-4 .elementor-grid { grid-template-columns: repeat(4, 1fr); } .elementor-grid-mobile-5 .elementor-grid { grid-template-columns: repeat(5, 1fr); } .elementor-grid-mobile-6 .elementor-grid { grid-template-columns: repeat(6, 1fr); } .elementor-grid-mobile-7 .elementor-grid { grid-template-columns: repeat(7, 1fr); } .elementor-grid-mobile-8 .elementor-grid { grid-template-columns: repeat(8, 1fr); } .elementor-grid-mobile-9 .elementor-grid { grid-template-columns: repeat(9, 1fr); } .elementor-grid-mobile-10 .elementor-grid { grid-template-columns: repeat(10, 1fr); } .elementor-grid-mobile-11 .elementor-grid { grid-template-columns: repeat(11, 1fr); } .elementor-grid-mobile-12 .elementor-grid { grid-template-columns: repeat(12, 1fr); } } @media (min-width: ELEMENTOR_SCREEN_DESKTOP_MIN) { #elementor-device-mode:after { content: 'desktop'; } } @media (min-width: ELEMENTOR_SCREEN_WIDESCREEN_MIN) { #elementor-device-mode:after { content: 'widescreen'; } } @media (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { #elementor-device-mode:after { content: 'laptop'; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MAX) { #elementor-device-mode:after { content: 'tablet_extra'; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { #elementor-device-mode:after { content: 'tablet'; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MAX) { #elementor-device-mode:after { content: 'mobile_extra'; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { #elementor-device-mode:after { content: 'mobile'; } } .e-container { --border-radius: 0; --display: flex; --flex-direction: column; --flex-basis: auto; --flex-grow: 0; --flex-shrink: 1; --content-width: Min( 100%, var( --container-max-width, 1140px ) ); --width: 100%; --min-height: initial; --height: auto; --text-align: initial; --margin-top: 0; --margin-right: 0; --margin-bottom: 0; --margin-left: 0; --padding-top: var( --container-default-padding, 0px ); --padding-right: var( --container-default-padding, 0px ); --padding-bottom: var( --container-default-padding, 0px ); --padding-left: var( --container-default-padding, 0px ); --position: relative; --z-index: revert; --overflow: visible; --transition: 0; --gap: var( --widgets-spacing, 20px ); --overlay-mix-blend-mode: initial; --overlay-opacity: 1; --overlay-transition: 0; position: var(--position); display: var(--display); text-align: var(--text-align); flex-direction: var(--flex-direction); flex: var(--flex-grow) var(--flex-shrink) var(--flex-basis); width: var(--width); min-width: 0; max-width: Min(100%, var(--width)); min-height: var(--min-height); height: var(--height); border-radius: var(--border-radius); margin: var(--margin-top) var(--margin-right) var(--margin-bottom) var(--margin-left); padding-left: calc( ( 100% - var( --content-width ) ) / 2 + var( --padding-left )); padding-right: calc( ( 100% - var( --content-width ) ) / 2 + var( --padding-right )); padding-top: var(--padding-top); padding-bottom: var(--padding-bottom); z-index: var(--z-index); overflow: var(--overflow); transition: var(--transition); } :is(.elementor-section-wrap, [data-elementor-id]) > .e-container { --margin-right: auto; --margin-left: auto; } .e-container .elementor-empty-view { position: relative; width: 100%; height: 100%; min-height: var(--min-height, 100px); } .e-container .elementor-empty-view .elementor-first-add { width: auto; height: auto; inset: 10px; } .e-container .elementor-widget-placeholder { --size: 10px; --margin-start: calc( -1 * var( --size ) ); --margin-end: calc( -2 * var( --size ) ); flex-shrink: 0; align-self: stretch; z-index: 1; pointer-events: none; } .e-container.e-container--row > .elementor-widget-placeholder { position: relative; z-index: 9999; width: var(--size); margin-inline-start: var(--margin-start); height: auto; min-height: 100%; animation-name: dnd-placeholder-widget-vertical; animation-fill-mode: both; } .e-container.e-container--row[data-nesting-level]:not([data-nesting-level="0"]) > .elementor-widget-placeholder { margin-inline-end: 0; margin-inline-start: calc( var( --margin-start ) + var( --margin-end )); } .e-container.e-container--row[data-nesting-level]:not([data-nesting-level="0"]) > :not(.elementor-element) + .elementor-widget-placeholder { margin-inline-end: var(--margin-end); margin-inline-start: var(--margin-start); } .e-container.e-container--column > .elementor-widget-placeholder { height: var(--size); margin-block-start: var(--margin-start); margin-block-end: var(--margin-end); animation-name: dnd-placeholder-widget-horizontal; } .e-container.e-container--column > .elementor-widget-placeholder:nth-last-child(2) { margin-block-start: calc( 2 * var( --margin-start )); --margin-end: 0; } .e-container .elementor-sortable-helper { height: 84px; width: 125px; z-index: -1; } .e-container .elementor-widget.elementor-widget { margin-bottom: 0; } .e-container::before { content: var(--background-overlay); display: block; position: absolute; z-index: 0; width: 100%; height: 100%; left: 0; top: 0; mix-blend-mode: var(--overlay-mix-blend-mode); opacity: var(--overlay-opacity); transition: var(--overlay-transition); border-radius: var(--border-radius); } .e-container .elementor-widget { min-width: 0; } .e-container .elementor-widget-video, .e-container .elementor-widget-google_maps { flex-basis: 100%; } .e-container .elementor-widget-media-carousel { max-width: 100%; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting { position: relative; background-color: #556068; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting:hover, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting:hover { background-color: #495157; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting.elementor-editor-element-add, .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting.elementor-editor-element-edit + .elementor-editor-element-remove, .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting:first-child::before, .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting:last-child::after, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting.elementor-editor-element-add, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting.elementor-editor-element-edit + .elementor-editor-element-remove, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting:first-child::before, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting:last-child::after { display: none; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-setting:not(.elementor-editor-element-edit), .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-setting:not(.elementor-editor-element-edit) { margin-inline-start: -25px; z-index: -1; transition: .3s all; will-change: margin-inline-start; } .e-container > .e-container > .elementor-element-overlay > .elementor-editor-element-settings:hover > :is(.elementor-editor-element-duplicate, .elementor-editor-element-remove), .elementor-widget .e-container > .elementor-element-overlay > .elementor-editor-element-settings:hover > :is(.elementor-editor-element-duplicate, .elementor-editor-element-remove) { margin-inline-start: 0; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-settings, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-settings { inset: initial; transform: none; inset-inline-start: 0; top: 0; border-radius: 0; border-end-end-radius: 3px; height: auto; background-color: #556068; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-settings:hover, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-settings:hover { background-color: #495157; } .e-container > .e-container > .elementor-element-overlay .elementor-editor-element-settings i.eicon-handle::before, .elementor-widget .e-container > .elementor-element-overlay .elementor-editor-element-settings i.eicon-handle::before { content: '\e9b4'; font-size: 20px; display: block; padding: 2px; } @media (max-width: 767px) { .e-container { --width: 100%; --flex-wrap: wrap; } } @keyframes dnd-placeholder-widget-vertical { 0% { transform-origin: 0 50%; transform: translateX(50%) scaleX(0); opacity: 0; } 100% { transform-origin: 0 50%; transform: translateX(50%) scaleX(1); opacity: .9; } } @keyframes dnd-placeholder-widget-horizontal { 0% { transform-origin: 50% 0; transform: scaleY(0); opacity: 0; } 100% { transform-origin: 50% 0; transform: scaleY(1); opacity: .9; } } .elementor-form-fields-wrapper { display: flex; flex-wrap: wrap; } .elementor-form-fields-wrapper.elementor-labels-above .elementor-field-group > input, .elementor-form-fields-wrapper.elementor-labels-above .elementor-field-group > textarea, .elementor-form-fields-wrapper.elementor-labels-above .elementor-field-group > .elementor-select-wrapper, .elementor-form-fields-wrapper.elementor-labels-above .elementor-field-group .elementor-field-subgroup { flex-basis: 100%; max-width: 100%; } .elementor-form-fields-wrapper.elementor-labels-inline > .elementor-field-group > input, .elementor-form-fields-wrapper.elementor-labels-inline > .elementor-field-group .elementor-select-wrapper { flex-grow: 1; } .elementor-field-group { flex-wrap: wrap; align-items: center; } .elementor-field-group.elementor-field-type-submit { align-items: flex-end; } .elementor-field-group .elementor-field-textual { width: 100%; max-width: 100%; border: 1px solid #818a91; background-color: transparent; color: #373a3c; vertical-align: middle; flex-grow: 1; } .elementor-field-group .elementor-field-textual:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset; outline: 0; } .elementor-field-group .elementor-field-textual::-webkit-input-placeholder { color: inherit; font-family: inherit; opacity: 0.6; } .elementor-field-group .elementor-field-textual:-ms-input-placeholder { color: inherit; font-family: inherit; opacity: 0.6; } .elementor-field-group .elementor-field-textual::-moz-placeholder { color: inherit; font-family: inherit; opacity: 0.6; } .elementor-field-group .elementor-field-textual:-moz-placeholder { color: inherit; font-family: inherit; opacity: 0.6; } .elementor-field-group .elementor-field-textual::placeholder { color: inherit; font-family: inherit; opacity: 0.6; } .elementor-field-group .elementor-select-wrapper { display: flex; position: relative; width: 100%; } .elementor-field-group .elementor-select-wrapper select { appearance: none; -webkit-appearance: none; -moz-appearance: none; color: inherit; font-size: inherit; font-family: inherit; font-weight: inherit; font-style: inherit; text-transform: inherit; letter-spacing: inherit; line-height: inherit; flex-basis: 100%; padding-left: 20px; } .elementor-field-group .elementor-select-wrapper:before { content: '\e92a'; font-family: 'eicons'; font-size: 15px; position: absolute; top: 50%; transform: translateY(-50%); left: 10px; pointer-events: none; text-shadow: 0 0 3px rgba(0, 0, 0, 0.3); } .elementor-field-group.elementor-field-type-select-multiple .elementor-select-wrapper:before { content: ''; } .elementor-field-subgroup { display: flex; flex-wrap: wrap; } .elementor-field-subgroup .elementor-field-option label { display: inline-block; } .elementor-field-subgroup.elementor-subgroup-inline .elementor-field-option { padding-left: 10px; } .elementor-field-subgroup:not(.elementor-subgroup-inline) .elementor-field-option { flex-basis: 100%; } .elementor-field-type-checkbox .elementor-field-subgroup .elementor-field-option input, .elementor-field-type-checkbox .elementor-field-subgroup .elementor-field-option label, .elementor-field-type-radio .elementor-field-subgroup .elementor-field-option input, .elementor-field-type-radio .elementor-field-subgroup .elementor-field-option label, .elementor-field-type-acceptance .elementor-field-subgroup .elementor-field-option input, .elementor-field-type-acceptance .elementor-field-subgroup .elementor-field-option label { display: inline; } .elementor-field-label { cursor: pointer; } .elementor-mark-required .elementor-field-label:after { content: '*'; color: red; padding-right: 0.2em; } .elementor-field-textual { line-height: 1.4; font-size: 15px; min-height: 40px; padding: 5px 14px; border-radius: 3px; } .elementor-field-textual.elementor-size-xs { font-size: 13px; min-height: 33px; padding: 4px 12px; border-radius: 2px; } .elementor-field-textual.elementor-size-md { font-size: 16px; min-height: 47px; padding: 6px 16px; border-radius: 4px; } .elementor-field-textual.elementor-size-lg { font-size: 18px; min-height: 59px; padding: 7px 20px; border-radius: 5px; } .elementor-field-textual.elementor-size-xl { font-size: 20px; min-height: 72px; padding: 8px 24px; border-radius: 6px; } .elementor-button-align-stretch .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button { flex-basis: 100%; } .elementor-button-align-stretch .e-form__buttons__wrapper { flex-basis: 50%; flex-grow: 1; } .elementor-button-align-stretch .e-form__buttons__wrapper__button { flex-basis: 100%; } .elementor-button-align-center .elementor-field-type-submit, .elementor-button-align-center .e-form__buttons { justify-content: center; } .elementor-button-align-start .elementor-field-type-submit, .elementor-button-align-start .e-form__buttons { justify-content: flex-end; } .elementor-button-align-end .elementor-field-type-submit, .elementor-button-align-end .e-form__buttons { justify-content: flex-start; } .elementor-button-align-center .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button, .elementor-button-align-start .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button, .elementor-button-align-end .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button { flex-basis: initial; } .elementor-button-align-center .e-form__buttons__wrapper, .elementor-button-align-start .e-form__buttons__wrapper, .elementor-button-align-end .e-form__buttons__wrapper { flex-grow: initial; } .elementor-button-align-center .e-form__buttons__wrapper, .elementor-button-align-center .e-form__buttons__wrapper__button, .elementor-button-align-start .e-form__buttons__wrapper, .elementor-button-align-start .e-form__buttons__wrapper__button, .elementor-button-align-end .e-form__buttons__wrapper, .elementor-button-align-end .e-form__buttons__wrapper__button { flex-basis: initial; } @media screen and (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-tablet-button-align-stretch .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button { flex-basis: 100%; } .elementor-tablet-button-align-stretch .e-form__buttons__wrapper { flex-basis: 50%; flex-grow: 1; } .elementor-tablet-button-align-stretch .e-form__buttons__wrapper__button { flex-basis: 100%; } .elementor-tablet-button-align-center .elementor-field-type-submit, .elementor-tablet-button-align-center .e-form__buttons { justify-content: center; } .elementor-tablet-button-align-start .elementor-field-type-submit, .elementor-tablet-button-align-start .e-form__buttons { justify-content: flex-end; } .elementor-tablet-button-align-end .elementor-field-type-submit, .elementor-tablet-button-align-end .e-form__buttons { justify-content: flex-start; } .elementor-tablet-button-align-center .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button, .elementor-tablet-button-align-start .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button, .elementor-tablet-button-align-end .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button { flex-basis: initial; } .elementor-tablet-button-align-center .e-form__buttons__wrapper, .elementor-tablet-button-align-start .e-form__buttons__wrapper, .elementor-tablet-button-align-end .e-form__buttons__wrapper { flex-grow: initial; } .elementor-tablet-button-align-center .e-form__buttons__wrapper, .elementor-tablet-button-align-center .e-form__buttons__wrapper__button, .elementor-tablet-button-align-start .e-form__buttons__wrapper, .elementor-tablet-button-align-start .e-form__buttons__wrapper__button, .elementor-tablet-button-align-end .e-form__buttons__wrapper, .elementor-tablet-button-align-end .e-form__buttons__wrapper__button { flex-basis: initial; } } @media screen and (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-mobile-button-align-stretch .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button { flex-basis: 100%; } .elementor-mobile-button-align-stretch .e-form__buttons__wrapper { flex-basis: 50%; flex-grow: 1; } .elementor-mobile-button-align-stretch .e-form__buttons__wrapper__button { flex-basis: 100%; } .elementor-mobile-button-align-center .elementor-field-type-submit, .elementor-mobile-button-align-center .e-form__buttons { justify-content: center; } .elementor-mobile-button-align-start .elementor-field-type-submit, .elementor-mobile-button-align-start .e-form__buttons { justify-content: flex-end; } .elementor-mobile-button-align-end .elementor-field-type-submit, .elementor-mobile-button-align-end .e-form__buttons { justify-content: flex-start; } .elementor-mobile-button-align-center .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button, .elementor-mobile-button-align-start .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button, .elementor-mobile-button-align-end .elementor-field-type-submit:not(.e-form__buttons__wrapper) .elementor-button { flex-basis: initial; } .elementor-mobile-button-align-center .e-form__buttons__wrapper, .elementor-mobile-button-align-start .e-form__buttons__wrapper, .elementor-mobile-button-align-end .e-form__buttons__wrapper { flex-grow: initial; } .elementor-mobile-button-align-center .e-form__buttons__wrapper, .elementor-mobile-button-align-center .e-form__buttons__wrapper__button, .elementor-mobile-button-align-start .e-form__buttons__wrapper, .elementor-mobile-button-align-start .e-form__buttons__wrapper__button, .elementor-mobile-button-align-end .e-form__buttons__wrapper, .elementor-mobile-button-align-end .e-form__buttons__wrapper__button { flex-basis: initial; } } .elementor-error .elementor-field { border-color: #d9534f; } .elementor-error .help-inline { color: #d9534f; font-size: 0.9em; } .elementor-message { margin: 10px 0; font-size: 1em; line-height: 1; } .elementor-message:before { content: "\e90e"; display: inline-block; font-family: eicons; font-weight: normal; font-style: normal; vertical-align: middle; margin-left: 5px; } .elementor-message.elementor-message-danger { color: #d9534f; } .elementor-message.elementor-message-danger:before { content: "\e87f"; } .elementor-message.form-message-success { color: #5cb85c; } .elementor-form .elementor-button { padding-top: 0; padding-bottom: 0; border: none; } .elementor-form .elementor-button > span { display: flex; justify-content: center; } .elementor-form .elementor-button.elementor-size-xs { min-height: 33px; } .elementor-form .elementor-button.elementor-size-sm { min-height: 40px; } .elementor-form .elementor-button.elementor-size-md { min-height: 47px; } .elementor-form .elementor-button.elementor-size-lg { min-height: 59px; } .elementor-form .elementor-button.elementor-size-xl { min-height: 72px; } .elementor-element .elementor-widget-container { transition: background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s; } .elementor-button { display: inline-block; line-height: 1; background-color: #818a91; font-size: 15px; padding: 12px 24px; border-radius: 3px; color: #fff; fill: #fff; text-align: center; transition: all 0.3s; } .elementor-button:hover, .elementor-button:focus, .elementor-button:visited { color: #fff; } .elementor-button-content-wrapper { display: flex; justify-content: center; } .elementor-button-icon { flex-grow: 0; order: 5; } .elementor-button-icon svg { width: 1em; height: auto; } .elementor-button-icon .e-font-icon-svg { height: 1em; } .elementor-button-text { flex-grow: 1; order: 10; display: inline-block; } .elementor-button.elementor-size-xs { font-size: 13px; padding: 10px 20px; border-radius: 2px; } .elementor-button.elementor-size-md { font-size: 16px; padding: 15px 30px; border-radius: 4px; } .elementor-button.elementor-size-lg { font-size: 18px; padding: 20px 40px; border-radius: 5px; } .elementor-button.elementor-size-xl { font-size: 20px; padding: 25px 50px; border-radius: 6px; } .elementor-button .elementor-align-icon-right { margin-left: 5px; order: 5; } .elementor-button .elementor-align-icon-left { margin-right: 5px; order: 15; } .elementor-button span { text-decoration: inherit; } .elementor-element.elementor-button-info .elementor-button { background-color: #5bc0de; } .elementor-element.elementor-button-success .elementor-button { background-color: #5cb85c; } .elementor-element.elementor-button-warning .elementor-button { background-color: #f0ad4e; } .elementor-element.elementor-button-danger .elementor-button { background-color: #d9534f; } .elementor-widget-button .elementor-button .elementor-button-info { background-color: #5bc0de; } .elementor-widget-button .elementor-button .elementor-button-success { background-color: #5cb85c; } .elementor-widget-button .elementor-button .elementor-button-warning { background-color: #f0ad4e; } .elementor-widget-button .elementor-button .elementor-button-danger { background-color: #d9534f; } .elementor-tab-title a { color: inherit; } .elementor-view-stacked .elementor-icon { padding: .5em; background-color: #818a91; color: #fff; fill: #fff; } .elementor-view-framed .elementor-icon { padding: .5em; color: #818a91; border: 3px solid #818a91; background-color: transparent; } .elementor-icon { display: inline-block; line-height: 1; transition: all 0.3s; color: #818a91; font-size: 50px; text-align: center; } .elementor-icon:hover { color: #818a91; } .elementor-icon i, .elementor-icon svg { width: 1em; height: 1em; position: relative; display: block; } .elementor-icon i:before, .elementor-icon svg:before { position: absolute; left: 50%; transform: translateX(-50%); } .elementor-icon i.fad { width: initial; } .elementor-shape-circle .elementor-icon { border-radius: 50%; } .e-transform .elementor-widget-container { transform: perspective(var(--e-transform-perspective, 0)) rotateZ(var(--e-transform-rotateZ, 0)) rotateX(var(--e-transform-rotateX, 0)) rotateY(var(--e-transform-rotateY, 0)) translate(var(--e-transform-translate, 0)) translateX(var(--e-transform-translateX, 0)) translateY(var(--e-transform-translateY, 0)) scaleX(calc( var( --e-transform-flipX, 1 ) * var( --e-transform-scaleX, var( --e-transform-scale, 1 ) ))) scaleY(calc( var( --e-transform-flipY, 1 ) * var( --e-transform-scaleY, var(--e-transform-scale, 1) ))) skewX(var(--e-transform-skewX, 0)) skewY(var(--e-transform-skewY, 0)); transform-origin: var(--e-transform-origin-y) var(--e-transform-origin-x); transition: transform var(--e-transform-transition-duration, 400ms); } /** * Swiper 3.4.2 * Customized by Elementor team */ .swiper-container { margin-left: auto; margin-right: auto; position: relative; overflow: hidden; /* Fix of Webkit flickering */ z-index: 1; } .swiper-container .swiper-slide figure { line-height: 0; } .swiper-container .elementor-lightbox-content-source { display: none; } .swiper-container-no-flexbox .swiper-slide { float: left; } .swiper-container-vertical > .swiper-wrapper { flex-direction: column; } .swiper-wrapper { position: relative; width: 100%; height: 100%; z-index: 1; display: flex; transition-property: transform; box-sizing: content-box; } .swiper-container-android .swiper-slide, .swiper-wrapper { transform: translate3d(0px, 0, 0); } .swiper-container-multirow > .swiper-wrapper { flex-wrap: wrap; } .swiper-container-free-mode > .swiper-wrapper { transition-timing-function: ease-out; margin: 0 auto; } .swiper-slide { flex-shrink: 0; width: 100%; height: 100%; position: relative; } /* Auto Height */ .swiper-container-autoheight { height: auto; } .swiper-container-autoheight .swiper-slide { height: auto; } .swiper-container-autoheight .swiper-wrapper { align-items: flex-start; transition-property: transform, height; } /* a11y */ .swiper-container .swiper-notification { position: absolute; left: 0; top: 0; pointer-events: none; opacity: 0; z-index: -1000; } /* IE10 Windows Phone 8 Fixes */ .swiper-wp8-horizontal { touch-action: pan-y; } .swiper-wp8-vertical { touch-action: pan-x; } /* Arrows */ .swiper-button-prev, .swiper-button-next { position: absolute; top: 50%; width: 27px; height: 44px; margin-top: -22px; z-index: 10; cursor: pointer; background-size: 27px 44px; background: no-repeat center; } .swiper-button-prev.swiper-button-disabled, .swiper-button-next.swiper-button-disabled { opacity: 0.35; cursor: auto; pointer-events: none; } .swiper-button-prev, .swiper-container-rtl .swiper-button-next { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); left: 10px; right: auto; } .swiper-button-prev.swiper-button-black, .swiper-container-rtl .swiper-button-next.swiper-button-black { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); } .swiper-button-prev.swiper-button-white, .swiper-container-rtl .swiper-button-next.swiper-button-white { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); } .swiper-button-next, .swiper-container-rtl .swiper-button-prev { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); right: 10px; left: auto; } .swiper-button-next.swiper-button-black, .swiper-container-rtl .swiper-button-prev.swiper-button-black { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); } .swiper-button-next.swiper-button-white, .swiper-container-rtl .swiper-button-prev.swiper-button-white { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); } /* Pagination Styles */ .swiper-pagination { position: absolute; text-align: center; transition: 300ms; transform: translate3d(0, 0, 0); z-index: 10; } .swiper-pagination.swiper-pagination-hidden { opacity: 0; } /* Common Styles */ .swiper-pagination-fraction, .swiper-pagination-custom, .swiper-container-horizontal > .swiper-pagination-bullets { bottom: 5px; left: 0; width: 100%; } /* Bullets */ .swiper-pagination-bullet { width: 6px; height: 6px; display: inline-block; border-radius: 50%; background: #000; opacity: 0.2; } .swiper-pagination-fraction { color: #000; } button.swiper-pagination-bullet { border: none; margin: 0; padding: 0; box-shadow: none; appearance: none; -webkit-appearance: none; -moz-appearance: none; } .swiper-pagination-clickable .swiper-pagination-bullet { cursor: pointer; } .swiper-pagination-white .swiper-pagination-bullet { background: #fff; } .swiper-pagination-bullet-active { opacity: 1; } .swiper-pagination-white .swiper-pagination-bullet-active { background: #fff; } .swiper-pagination-black .swiper-pagination-bullet-active { background: #000; } .swiper-container-vertical > .swiper-pagination-bullets { right: 10px; top: 50%; transform: translate3d(0px, -50%, 0); } .swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet { margin: 5px 0; display: block; } .swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet { margin: 0 6px; } /* Progressbar */ .swiper-pagination-progressbar { background: rgba(0, 0, 0, 0.25); position: absolute; } .swiper-pagination-progressbar .swiper-pagination-progressbar-fill { background: #000; position: absolute; left: 0; top: 0; width: 100%; height: 100%; transform: scale(0); transform-origin: left top; } .swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill { transform-origin: right top; } .swiper-container-horizontal > .swiper-pagination-progressbar { width: 100%; height: 4px; left: 0; top: 0; } .swiper-container-vertical > .swiper-pagination-progressbar { width: 4px; height: 100%; left: 0; top: 0; } .swiper-pagination-progressbar.swiper-pagination-white { background: rgba(255, 255, 255, 0.5); } .swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill { background: #fff; } .swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill { background: #000; } /* 3D Container */ .swiper-container-3d { perspective: 1200px; } .swiper-container-3d .swiper-wrapper, .swiper-container-3d .swiper-slide, .swiper-container-3d .swiper-slide-shadow-left, .swiper-container-3d .swiper-slide-shadow-right, .swiper-container-3d .swiper-slide-shadow-top, .swiper-container-3d .swiper-slide-shadow-bottom, .swiper-container-3d .swiper-cube-shadow { transform-style: preserve-3d; } .swiper-container-3d .swiper-slide-shadow-left, .swiper-container-3d .swiper-slide-shadow-right, .swiper-container-3d .swiper-slide-shadow-top, .swiper-container-3d .swiper-slide-shadow-bottom { position: absolute; left: 0; top: 0; width: 100%; height: 100%; pointer-events: none; z-index: 10; } .swiper-container-3d .swiper-slide-shadow-left { background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); } .swiper-container-3d .swiper-slide-shadow-right { background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); } .swiper-container-3d .swiper-slide-shadow-top { background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); } .swiper-container-3d .swiper-slide-shadow-bottom { background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); } /* Coverflow */ .swiper-container-coverflow .swiper-wrapper, .swiper-container-flip .swiper-wrapper { /* Windows 8 IE 10 fix */ -ms-perspective: 1200px; } /* Cube + Flip */ .swiper-container-cube, .swiper-container-flip { overflow: visible; } .swiper-container-cube .swiper-slide, .swiper-container-flip .swiper-slide { pointer-events: none; z-index: 1; } .swiper-container-cube .swiper-slide .swiper-slide, .swiper-container-flip .swiper-slide .swiper-slide { pointer-events: none; } .swiper-container-cube .swiper-slide-active, .swiper-container-flip .swiper-slide-active, .swiper-container-cube .swiper-slide-active .swiper-slide-active, .swiper-container-flip .swiper-slide-active .swiper-slide-active { pointer-events: auto; } .swiper-container-cube .swiper-slide-shadow-top, .swiper-container-flip .swiper-slide-shadow-top, .swiper-container-cube .swiper-slide-shadow-bottom, .swiper-container-flip .swiper-slide-shadow-bottom, .swiper-container-cube .swiper-slide-shadow-left, .swiper-container-flip .swiper-slide-shadow-left, .swiper-container-cube .swiper-slide-shadow-right, .swiper-container-flip .swiper-slide-shadow-right { z-index: 0; backface-visibility: hidden; } /* Cube */ .swiper-container-cube .swiper-slide { visibility: hidden; transform-origin: 0 0; width: 100%; height: 100%; } .swiper-container-cube.swiper-container-rtl .swiper-slide { transform-origin: 100% 0; } .swiper-container-cube .swiper-slide-active, .swiper-container-cube .swiper-slide-next, .swiper-container-cube .swiper-slide-prev, .swiper-container-cube .swiper-slide-next + .swiper-slide { pointer-events: auto; visibility: visible; } .swiper-container-cube .swiper-cube-shadow { position: absolute; left: 0; bottom: 0; width: 100%; height: 100%; background: #000; opacity: 0.6; -webkit-filter: blur(50px); filter: blur(50px); z-index: 0; } /* Fade */ .swiper-container-fade.swiper-container-free-mode .swiper-slide { transition-timing-function: ease-out; } .swiper-container-fade .swiper-slide { pointer-events: none; transition-property: opacity; } .swiper-container-fade .swiper-slide .swiper-slide { pointer-events: none; } .swiper-container-fade .swiper-slide-active { pointer-events: auto; } .swiper-container-fade .swiper-slide-active .swiper-slide-active { pointer-events: auto; } .swiper-zoom-container { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; text-align: center; } .swiper-zoom-container > img, .swiper-zoom-container > svg, .swiper-zoom-container > canvas { max-width: 100%; max-height: 100%; object-fit: contain; } /* Scrollbar */ .swiper-scrollbar { border-radius: 10px; position: relative; -ms-touch-action: none; background: rgba(0, 0, 0, 0.1); } .swiper-container-horizontal > .swiper-scrollbar { position: absolute; left: 1%; bottom: 3px; z-index: 50; height: 5px; width: 98%; } .swiper-container-vertical > .swiper-scrollbar { position: absolute; right: 3px; top: 1%; z-index: 50; width: 5px; height: 98%; } .swiper-scrollbar-drag { height: 100%; width: 100%; position: relative; background: rgba(0, 0, 0, 0.5); border-radius: 10px; left: 0; top: 0; } .swiper-scrollbar-cursor-drag { cursor: move; } .elementor-pagination-position-outside .swiper-container { padding-bottom: 30px; } .elementor-pagination-position-outside .elementor-swiper-button { top: calc(50% - 30px / 2); } .elementor-swiper { position: relative; } .elementor-main-swiper { position: static; } .elementor-arrows-position-outside .swiper-container { width: calc(100% - 60px); } .elementor-arrows-position-outside .elementor-swiper-button-prev { left: 0; } .elementor-arrows-position-outside .elementor-swiper-button-next { right: 0; } .swiper-image-stretch .swiper-slide .swiper-slide-image { width: 100%; } .elementor-swiper-button { position: absolute; display: inline-flex; z-index: 1; cursor: pointer; font-size: 25px; color: rgba(238, 238, 238, 0.9); top: 50%; transform: translateY(-50%); } .elementor-swiper-button svg { fill: rgba(238, 238, 238, 0.9); height: 1em; width: 1em; } .elementor-swiper-button-prev { left: 10px; } .elementor-swiper-button-next { right: 10px; } .elementor-swiper-button.swiper-button-disabled { opacity: 0.3; } .swiper-container-cube .elementor-swiper-button { transform: translate3d(0, -50%, 1px); } /* Preloader */ .swiper-lazy-preloader { width: 42px; height: 42px; position: absolute; left: 50%; top: 50%; margin-left: -21px; margin-top: -21px; z-index: 10; transform-origin: 50%; animation: swiper-preloader-spin 1s steps(12, end) infinite; } .swiper-lazy-preloader:after { display: block; content: ""; width: 100%; height: 100%; background-size: 100%; background: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") no-repeat 50%; } .swiper-lazy-preloader-white:after { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } @keyframes swiper-preloader-spin { 100% { transform: rotate(360deg); } } .elementor-lightbox { --lightbox-ui-color: rgba(238, 238, 238, 0.9); --lightbox-ui-color-hover: #fff; --lightbox-text-color: var(--lightbox-ui-color); --lightbox-header-icons-size: 20px; --lightbox-navigation-icons-size: 25px; } .elementor-lightbox .dialog-header { display: none; } .elementor-lightbox .dialog-widget-content { background: none; box-shadow: none; width: 100%; height: 100%; } .elementor-lightbox .dialog-message { animation-duration: .3s; } .elementor-lightbox .dialog-message:not(.elementor-fit-aspect-ratio) { height: 100%; } .elementor-lightbox .dialog-message.dialog-lightbox-message { padding: 0; } .elementor-lightbox .dialog-lightbox-close-button { cursor: pointer; position: absolute; font-size: var(--lightbox-header-icons-size); left: 0.75em; margin-top: 13px; padding: .25em; z-index: 2; line-height: 1; display: flex; } .elementor-lightbox .dialog-lightbox-close-button svg { height: 1em; width: 1em; } .elementor-lightbox .dialog-lightbox-close-button, .elementor-lightbox .elementor-swiper-button { color: var(--lightbox-ui-color); transition: all 0.3s; opacity: 1; } .elementor-lightbox .dialog-lightbox-close-button svg, .elementor-lightbox .elementor-swiper-button svg { fill: var(--lightbox-ui-color); } .elementor-lightbox .dialog-lightbox-close-button:hover, .elementor-lightbox .elementor-swiper-button:hover { color: var(--lightbox-ui-color-hover); } .elementor-lightbox .dialog-lightbox-close-button:hover svg, .elementor-lightbox .elementor-swiper-button:hover svg { fill: var(--lightbox-ui-color-hover); } .elementor-lightbox .swiper-container { height: 100%; } .elementor-lightbox .elementor-lightbox-item { display: flex; align-items: center; justify-content: center; position: relative; padding: 70px; box-sizing: border-box; height: 100%; margin: auto; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-lightbox .elementor-lightbox-item { padding: 70px 0; } } .elementor-lightbox .elementor-lightbox-image { max-height: 100%; user-select: none; } .elementor-lightbox .elementor-lightbox-image, .elementor-lightbox .elementor-lightbox-image:hover { opacity: 1; filter: none; border: none; } .elementor-lightbox .elementor-lightbox-image, .elementor-lightbox .elementor-video-container { box-shadow: 0 0 30px rgba(0, 0, 0, 0.3), 0 0 8px -5px rgba(0, 0, 0, 0.3); border-radius: 2px; } .elementor-lightbox .elementor-video-container { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } @media (min-width: ELEMENTOR_SCREEN_TABLET_NEXT) { .elementor-lightbox .elementor-video-container { width: 75%; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-lightbox .elementor-video-container { width: 100%; } } @media (min-width: 768px) and (max-width: 1024px) { .elementor-lightbox .elementor-aspect-ratio-916 .elementor-video-container { width: 70%; } } .elementor-lightbox .elementor-swiper-button:focus { outline-width: 1px; } .elementor-lightbox .elementor-swiper-button-prev, .elementor-lightbox .elementor-swiper-button-next { height: 100%; display: flex; align-items: center; width: 15%; justify-content: center; font-size: var(--lightbox-navigation-icons-size); } .elementor-lightbox .elementor-swiper-button-prev { left: 0; } .elementor-lightbox .elementor-swiper-button-next { right: 0; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-lightbox .elementor-swiper-button:focus { outline: none; } .elementor-lightbox .elementor-swiper-button-prev, .elementor-lightbox .elementor-swiper-button-next { width: 20%; } .elementor-lightbox .elementor-swiper-button-prev i, .elementor-lightbox .elementor-swiper-button-next i { padding: 10px; background-color: rgba(0, 0, 0, 0.5); } .elementor-lightbox .elementor-swiper-button-prev { left: 0; justify-content: flex-start; } .elementor-lightbox .elementor-swiper-button-next { right: 0; justify-content: flex-end; } } .elementor-slideshow__counter { color: currentColor; font-size: .75em; width: max-content; } .elementor-slideshow__header, .elementor-slideshow__footer { position: absolute; left: 0; width: 100%; padding: 15px 20px; transition: 0.3s; } .elementor-slideshow__footer { color: var(--lightbox-text-color); } .elementor-slideshow__header { color: var(--lightbox-ui-color); display: flex; flex-direction: row-reverse; font-size: var(--lightbox-header-icons-size); padding-right: 1em; padding-left: 2.6em; top: 0; align-items: center; z-index: 10; } .elementor-slideshow__header > i, .elementor-slideshow__header > svg { cursor: pointer; padding: .25em; margin: 0 .35em; } .elementor-slideshow__header > i { font-size: inherit; } .elementor-slideshow__header > i:hover { color: var(--lightbox-ui-color-hover); } .elementor-slideshow__header > svg { box-sizing: content-box; fill: var(--lightbox-ui-color); height: 1em; width: 1em; } .elementor-slideshow__header > svg:hover { fill: var(--lightbox-ui-color-hover); } .elementor-slideshow__header .elementor-slideshow__counter { margin-left: auto; } .elementor-slideshow__header .elementor-icon-share { z-index: 5; } .elementor-slideshow__share-menu { background-color: rgba(0, 0, 0, 0); width: 0; height: 0; position: absolute; overflow: hidden; transition: background-color 400ms; } .elementor-slideshow__share-menu .elementor-slideshow__share-links a { color: #2C2C2C; } .elementor-slideshow__share-links { display: block; position: absolute; min-width: 200px; left: 2.8em; top: 3em; background-color: #fff; border-radius: 3px; padding: 14px 20px; transform: scale(0); opacity: 0; transform-origin: 90% 10%; transition: all 250ms 100ms; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); } .elementor-slideshow__share-links a { text-align: right; color: #55595c; font-size: 12px; line-height: 2.5; display: block; opacity: 0; transition: opacity 500ms 100ms; } .elementor-slideshow__share-links a:hover { color: #000; } .elementor-slideshow__share-links a i, .elementor-slideshow__share-links a svg { margin-left: 0.75em; } .elementor-slideshow__share-links a i { font-size: 1.25em; } .elementor-slideshow__share-links a svg { height: 1.25em; width: 1.25em; } .elementor-slideshow__share-links:before { content: ''; display: block; position: absolute; top: 1px; left: 0.5em; border: .45em solid; border-color: transparent transparent #fff transparent; transform: translateY(-100%) scaleX(0.7); } .elementor-slideshow__footer { bottom: 0; z-index: 5; position: fixed; } .elementor-slideshow__title, .elementor-slideshow__description { margin: 0; } .elementor-slideshow__title { font-size: 16px; font-weight: bold; } .elementor-slideshow__description { font-size: 14px; } .elementor-slideshow--ui-hidden .elementor-slideshow__header, .elementor-slideshow--ui-hidden .elementor-slideshow__footer { opacity: 0; pointer-events: none; } .elementor-slideshow--ui-hidden .elementor-swiper-button-prev, .elementor-slideshow--ui-hidden .elementor-swiper-button-next { opacity: 0; } .elementor-slideshow--fullscreen-mode .elementor-video-container { width: 100%; } .elementor-slideshow--zoom-mode .elementor-slideshow__header, .elementor-slideshow--zoom-mode .elementor-slideshow__footer { background-color: rgba(0, 0, 0, 0.5); } .elementor-slideshow--zoom-mode .elementor-swiper-button-prev, .elementor-slideshow--zoom-mode .elementor-swiper-button-next { opacity: 0; pointer-events: none; } .elementor-slideshow--share-mode .elementor-slideshow__share-menu { top: 0; left: 0; width: 100vw; height: 100vh; opacity: 1; cursor: default; background-color: rgba(0, 0, 0, 0.5); } .elementor-slideshow--share-mode .elementor-slideshow__share-links { transform: scale(1); } .elementor-slideshow--share-mode .elementor-slideshow__share-links, .elementor-slideshow--share-mode .elementor-slideshow__share-links a { opacity: 1; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .eicon-twitter { color: #1DA1F2; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .eicon-facebook { color: #3b5998; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .eicon-pinterest { color: #bd081c; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .eicon-download-bold { color: #a4afb7; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .e-eicon-twitter { fill: #1DA1F2; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .e-eicon-facebook { fill: #3b5998; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .e-eicon-pinterest { fill: #bd081c; } .elementor-slideshow--share-mode .elementor-slideshow__share-links .e-eicon-download-bold { fill: #a4afb7; } .elementor-slideshow--share-mode .eicon-share-arrow { z-index: 2; } .animated { animation-duration: 1.25s; } .animated.animated-slow { animation-duration: 2s; } .animated.animated-fast { animation-duration: .75s; } .animated.infinite { animation-iteration-count: infinite; } .animated.reverse { animation-direction: reverse; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .animated { animation: none; } } .elementor-shape { overflow: hidden; position: absolute; left: 0; width: 100%; line-height: 0; direction: ltr; /* * @TODO: The `z-index: -1` rules below are temporary fixes for Chrome 85 issue. * It will be removed in a future version of Chrome. */ } .elementor-shape-top { top: -1px; } .elementor-shape-top:not([data-negative="false"]) svg { z-index: -1; } .elementor-shape-bottom { bottom: -1px; } .elementor-shape-bottom:not([data-negative="true"]) svg { z-index: -1; } .elementor-shape[data-negative="false"].elementor-shape-bottom { transform: rotate(180deg); } .elementor-shape[data-negative="true"].elementor-shape-top { transform: rotate(180deg); } .elementor-shape svg { display: block; width: calc(100% + 1.3px); position: relative; left: 50%; transform: translateX(-50%); } .elementor-shape .elementor-shape-fill { fill: #fff; transform-origin: center; transform: rotateY(0deg); } #wp-admin-bar-elementor_edit_page > .ab-item::before { content: "\e813"; font-family: eicons; top: 3px; font-size: 18px; } #wp-admin-bar-elementor_edit_page .ab-submenu .ab-item { display: flex; width: 200px; } #wp-admin-bar-elementor_edit_page .elementor-edit-link-title { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; width: 100%; } #wp-admin-bar-elementor_edit_page .elementor-edit-link-type { background: #55595c; font-size: 11px; line-height: 9px; margin-top: 6px; padding: 4px 8px; border-radius: 3px; } #wp-admin-bar-elementor_inspector > .ab-item::before { content: "\f348"; top: 2px; } #wpadminbar * { font-style: normal; } .page-template-elementor_canvas.elementor-page:before { display: none; } .elementor-post__thumbnail__link { transition: none; } #left-area ul.elementor-icon-list-items, .elementor .elementor-element ul.elementor-icon-list-items, .elementor-edit-area .elementor-element ul.elementor-icon-list-items { padding: 0; } .e--ua-appleWebkit.rtl { --flex-right: flex-start; } .e--ua-appleWebkit .elementor-widget-social-icons.e-grid-align-right, .e--ua-appleWebkit .elementor-share-buttons--align-right { --justify-content: var(--flex-right, flex-end); } .e--ua-appleWebkit .elementor-widget-social-icons.e-grid-align-center, .e--ua-appleWebkit .elementor-share-buttons--align-center { --justify-content: center; } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-right .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-center .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-right .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-center .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-justify .elementor-grid { width: auto; display: flex; flex-wrap: wrap; justify-content: var(--justify-content, space-between); margin-left: calc(-0.5 * var(--grid-column-gap)); margin-right: calc(-0.5 * var(--grid-column-gap)); } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-right .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-center .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-right .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-center .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-justify .elementor-grid-item { margin-left: calc(0.5 * var(--grid-column-gap)); margin-right: calc(0.5 * var(--grid-column-gap)); } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-left .elementor-grid { display: inline-block; } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-left .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-left .elementor-grid-item { margin-left: 0; margin-right: 0; } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .e--ua-appleWebkit .elementor-widget-social-icons.e-grid-align-tablet-right, .e--ua-appleWebkit .elementor-share-buttons-tablet--align-right { --justify-content: var(--flex-right, flex-end); } .e--ua-appleWebkit .elementor-widget-social-icons.e-grid-align-tablet-center, .e--ua-appleWebkit .elementor-share-buttons-tablet--align-center { --justify-content: center; } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-right .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-center .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-tablet-right .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-tablet-center .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-tablet-justify .elementor-grid { width: auto; display: flex; flex-wrap: wrap; justify-content: var(--justify-content, space-between); margin-left: calc(-0.5 * var(--grid-column-gap)); margin-right: calc(-0.5 * var(--grid-column-gap)); } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-right .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-center .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-tablet-right .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-tablet-center .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-tablet-justify .elementor-grid-item { margin-left: calc(0.5 * var(--grid-column-gap)); margin-right: calc(0.5 * var(--grid-column-gap)); } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons-tablet--align-left .elementor-grid { display: inline-block; } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-tablet-left .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons-tablet--align-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons-tablet--align-left .elementor-grid-item { margin-left: 0; margin-right: 0; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .e--ua-appleWebkit .elementor-widget-social-icons.e-grid-align-mobile-right, .e--ua-appleWebkit .elementor-share-buttons-mobile--align-right { --justify-content: var(--flex-right, flex-end); } .e--ua-appleWebkit .elementor-widget-social-icons.e-grid-align-mobile-center, .e--ua-appleWebkit .elementor-share-buttons-mobile--align-center { --justify-content: center; } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-right .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-center .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-mobile-right .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-mobile-center .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-mobile-justify .elementor-grid { width: auto; display: flex; flex-wrap: wrap; justify-content: var(--justify-content, space-between); margin-left: calc(-0.5 * var(--grid-column-gap)); margin-right: calc(-0.5 * var(--grid-column-gap)); } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-right .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-center .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-mobile-right .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-mobile-center .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons--align-mobile-justify .elementor-grid-item { margin-left: calc(0.5 * var(--grid-column-gap)); margin-right: calc(0.5 * var(--grid-column-gap)); } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons-mobile--align-left .elementor-grid { display: inline-block; } .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-widget-social-icons.e-grid-align-mobile-left .elementor-grid-item, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons-mobile--align-left .elementor-grid, .e--ua-appleWebkit .elementor-grid-0.elementor-share-buttons-mobile--align-left .elementor-grid-item { margin-left: 0; margin-right: 0; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor .elementor-hidden-mobile { display: none; } .elementor .elementor-hidden-phone { display: none; } } @media (min-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MIN) and (max-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MAX) { .elementor .elementor-hidden-mobile_extra { display: none; } } @media (min-width: ELEMENTOR_SCREEN_TABLET_MIN) and (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor .elementor-hidden-tablet { display: none; } } @media (min-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MIN) and (max-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MAX) { .elementor .elementor-hidden-tablet_extra { display: none; } } @media (min-width: ELEMENTOR_SCREEN_LAPTOP_MIN) and (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { .elementor .elementor-hidden-laptop { display: none; } } @media (min-width: ELEMENTOR_SCREEN_DESKTOP_MIN) and (max-width: ELEMENTOR_SCREEN_DESKTOP_MAX) { .elementor .elementor-hidden-desktop { display: none; } } @media (min-width: ELEMENTOR_SCREEN_WIDESCREEN_MIN) { .elementor .elementor-hidden-widescreen { display: none; } } .elementor-widget-text-path { font-size: 20px; text-align: var(--alignment, right); } .elementor-widget-text-path svg { width: var(--width); max-width: 100%; height: auto; overflow: visible; word-spacing: var(--word-spacing); transform: rotate(var(--rotate, 0)) scaleX(var(--scale-x, 1)) scaleY(var(--scale-y, 1)); } .elementor-widget-text-path svg path { vector-effect: non-scaling-stroke; /* Prevent stroke size scaling when resizing the SVG. */ fill: var(--path-fill, transparent); stroke: var(--stroke-color, transparent); stroke-width: var(--stroke-width, 1px); transition: var(--stroke-transition) stroke, var(--stroke-transition) fill; } .elementor-widget-text-path svg:hover path { --path-fill: var( --path-fill-hover ); --stroke-color: var( --stroke-color-hover ); --stroke-width: var( --stroke-width-hover ); } .elementor-widget-text-path svg text { --fill: var( --text-color ); fill: var(--fill); direction: var(--direction, rtl); transition: var(--transition) stroke, var(--transition) stroke-width, var(--transition) fill; } .elementor-widget-text-path svg text:hover { --color: var( --text-color-hover, var( --text-color ) ); --fill: var( --color ); color: var(--color); } .elementor-accordion { text-align: right; } .elementor-accordion .elementor-accordion-item { border: 1px solid #D4D4D4; } .elementor-accordion .elementor-accordion-item + .elementor-accordion-item { border-top: none; } .elementor-accordion .elementor-tab-title { margin: 0; padding: 15px 20px; font-weight: bold; line-height: 1; cursor: pointer; outline: none; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon { display: inline-block; width: 1.5em; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon svg { width: 1em; height: 1em; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon.elementor-accordion-icon-right { float: right; text-align: right; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon.elementor-accordion-icon-left { float: left; text-align: left; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon .elementor-accordion-icon-closed { display: block; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon .elementor-accordion-icon-opened { display: none; } .elementor-accordion .elementor-tab-title.elementor-active .elementor-accordion-icon-closed { display: none; } .elementor-accordion .elementor-tab-title.elementor-active .elementor-accordion-icon-opened { display: block; } .elementor-accordion .elementor-tab-content { display: none; padding: 15px 20px; border-top: 1px solid #D4D4D4; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-accordion .elementor-tab-title { padding: 12px 15px; } .elementor-accordion .elementor-tab-title .elementor-accordion-icon { width: 1.2em; } .elementor-accordion .elementor-tab-content { padding: 7px 15px; } } .elementor-alert { padding: 15px; border-left: 5px solid transparent; position: relative; text-align: right; } .elementor-alert .elementor-alert-title { display: block; font-weight: bold; } .elementor-alert .elementor-alert-description { font-size: 13px; } .elementor-alert button.elementor-alert-dismiss { position: absolute; left: 10px; top: 10px; padding: 3px; font-size: 20px; line-height: 1; background: transparent; color: inherit; border: none; cursor: pointer; } .elementor-alert.elementor-alert-info { color: #31708f; background-color: #d9edf7; border-color: #bcdff1; } .elementor-alert.elementor-alert-success { color: #3c763d; background-color: #dff0d8; border-color: #cae6be; } .elementor-alert.elementor-alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #f9f0c3; } .elementor-alert.elementor-alert-danger { color: #a94442; background-color: #f2dede; border-color: #e8c4c4; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-alert { padding: 10px; } .elementor-alert button.elementor-alert-dismiss { right: 7px; top: 7px; } } .elementor-counter .elementor-counter-number-wrapper { display: flex; font-size: 69px; font-weight: 600; line-height: 1; } .elementor-counter .elementor-counter-number-prefix, .elementor-counter .elementor-counter-number-suffix { flex-grow: 1; white-space: pre-wrap; } .elementor-counter .elementor-counter-number-prefix { text-align: left; } .elementor-counter .elementor-counter-number-suffix { text-align: right; } .elementor-counter .elementor-counter-title { text-align: center; font-size: 19px; font-weight: 400; line-height: 2.5; } .elementor-widget-divider { --divider-border-style: none; --divider-border-width: 1px; --divider-color: #2C2C2C; --divider-icon-size: 20px; --divider-element-spacing: 10px; --divider-pattern-height: 24px; --divider-pattern-size: 20px; --divider-pattern-url: none; --divider-pattern-repeat: repeat-x; } .elementor-widget-divider .elementor-divider { display: flex; } .elementor-widget-divider .elementor-divider__text { font-size: 15px; line-height: 1; max-width: 95%; } .elementor-widget-divider .elementor-divider__element { margin: 0 var(--divider-element-spacing); flex-shrink: 0; } .elementor-widget-divider .elementor-icon { font-size: var(--divider-icon-size); } .elementor-widget-divider .elementor-divider-separator { display: flex; margin: 0; direction: ltr; } .elementor-widget-divider--view-line_text .elementor-divider-separator, .elementor-widget-divider--view-line_icon .elementor-divider-separator { align-items: center; } .elementor-widget-divider--view-line_text .elementor-divider-separator:before, .elementor-widget-divider--view-line_text .elementor-divider-separator:after, .elementor-widget-divider--view-line_icon .elementor-divider-separator:before, .elementor-widget-divider--view-line_icon .elementor-divider-separator:after { display: block; content: ''; border-bottom: 0; flex-grow: 1; border-top: var(--divider-border-width) var(--divider-border-style) var(--divider-color); } .elementor-widget-divider--element-align-left .elementor-divider .elementor-divider-separator > .elementor-divider__svg:first-of-type { flex-grow: 0; flex-shrink: 100; } .elementor-widget-divider--element-align-left .elementor-divider-separator:before { content: none; } .elementor-widget-divider--element-align-left .elementor-divider__element { margin-left: 0; } .elementor-widget-divider--element-align-right .elementor-divider .elementor-divider-separator > .elementor-divider__svg:last-of-type { flex-grow: 0; flex-shrink: 100; } .elementor-widget-divider--element-align-right .elementor-divider-separator:after { content: none; } .elementor-widget-divider--element-align-right .elementor-divider__element { margin-right: 0; } .elementor-widget-divider:not(.elementor-widget-divider--view-line_text):not(.elementor-widget-divider--view-line_icon) .elementor-divider-separator { border-top: var(--divider-border-width) var(--divider-border-style) var(--divider-color); } .elementor-widget-divider--separator-type-pattern { --divider-border-style: none; } .elementor-widget-divider--separator-type-pattern.elementor-widget-divider--view-line .elementor-divider-separator, .elementor-widget-divider--separator-type-pattern:not([class*=elementor-widget-divider--view]) .elementor-divider-separator, .elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:before, .elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:after { width: 100%; min-height: var(--divider-pattern-height); -webkit-mask-size: var(--divider-pattern-size) 100%; mask-size: var(--divider-pattern-size) 100%; -webkit-mask-repeat: var(--divider-pattern-repeat); mask-repeat: var(--divider-pattern-repeat); background-color: var(--divider-color); -webkit-mask-image: var(--divider-pattern-url); mask-image: var(--divider-pattern-url); } .elementor-widget-divider--no-spacing { --divider-pattern-size: auto; } .elementor-widget-divider--bg-round { --divider-pattern-repeat: round; } .rtl .elementor-widget-divider .elementor-divider__text { direction: rtl; } .elementor-image-gallery .gallery-item { display: inline-block; text-align: center; vertical-align: top; width: 100%; max-width: 100%; margin: 0 auto; } .elementor-image-gallery .gallery-item img { margin: 0 auto; } .elementor-image-gallery .gallery-item .gallery-caption { margin: 0; } .elementor-image-gallery figure img { display: block; } .elementor-image-gallery figure figcaption { width: 100%; } .gallery-spacing-custom .elementor-image-gallery .gallery-icon { padding: 0; } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) { .elementor-image-gallery .gallery-columns-2 .gallery-item { max-width: 50%; } .elementor-image-gallery .gallery-columns-3 .gallery-item { max-width: 33.33%; } .elementor-image-gallery .gallery-columns-4 .gallery-item { max-width: 25%; } .elementor-image-gallery .gallery-columns-5 .gallery-item { max-width: 20%; } .elementor-image-gallery .gallery-columns-6 .gallery-item { max-width: 16.666%; } .elementor-image-gallery .gallery-columns-7 .gallery-item { max-width: 14.28%; } .elementor-image-gallery .gallery-columns-8 .gallery-item { max-width: 12.5%; } .elementor-image-gallery .gallery-columns-9 .gallery-item { max-width: 11.11%; } .elementor-image-gallery .gallery-columns-10 .gallery-item { max-width: 10%; } } @media (min-width: 480px) and (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-image-gallery .gallery.gallery-columns-2 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-3 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-4 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-5 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-6 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-7 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-8 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-9 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-10 .gallery-item { max-width: 50%; } } @media (max-width: 479px) { .elementor-image-gallery .gallery.gallery-columns-2 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-3 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-4 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-5 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-6 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-7 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-8 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-9 .gallery-item, .elementor-image-gallery .gallery.gallery-columns-10 .gallery-item { max-width: 100%; } } .elementor-widget-google_maps .elementor-widget-container { overflow: hidden; } .elementor-widget-google_maps iframe { height: 300px; } .elementor-heading-title { padding: 0; margin: 0; line-height: 1; } .elementor-widget-heading .elementor-heading-title[class*="elementor-size-"] > a { color: inherit; font-size: inherit; line-height: inherit; } .elementor-widget-heading .elementor-heading-title.elementor-size-small { font-size: 15px; } .elementor-widget-heading .elementor-heading-title.elementor-size-medium { font-size: 19px; } .elementor-widget-heading .elementor-heading-title.elementor-size-large { font-size: 29px; } .elementor-widget-heading .elementor-heading-title.elementor-size-xl { font-size: 39px; } .elementor-widget-heading .elementor-heading-title.elementor-size-xxl { font-size: 59px; } .elementor-widget-icon-box .elementor-icon-box-wrapper { display: block; text-align: center; } .elementor-widget-icon-box .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) { .elementor-widget-icon-box.elementor-vertical-align-top .elementor-icon-box-wrapper { align-items: flex-start; } .elementor-widget-icon-box.elementor-vertical-align-middle .elementor-icon-box-wrapper { align-items: center; } .elementor-widget-icon-box.elementor-vertical-align-bottom .elementor-icon-box-wrapper { align-items: flex-end; } } .elementor-widget-icon-box.elementor-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } @media (min-width: ELEMENTOR_SCREEN_WIDESCREEN_MIN) { .elementor-widget-icon-box.elementor-widescreen-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-widescreen-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-widescreen-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-widescreen-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-widescreen-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-widescreen-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-widescreen-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-widescreen-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-widescreen-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-widescreen-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } } @media (max-width: ELEMENTOR_SCREEN_LAPTOP_MAX) { .elementor-widget-icon-box.elementor-laptop-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-laptop-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-laptop-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-laptop-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-laptop-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-laptop-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-laptop-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-laptop-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-laptop-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-laptop-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_EXTRA_MAX) { .elementor-widget-icon-box.elementor-tablet_extra-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-tablet_extra-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-tablet_extra-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-tablet_extra-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-tablet_extra-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-tablet_extra-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-tablet_extra-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-tablet_extra-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-tablet_extra-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-tablet_extra-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-widget-icon-box.elementor-tablet-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-tablet-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-tablet-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-tablet-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-tablet-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-tablet-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-tablet-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-tablet-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-tablet-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-tablet-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_EXTRA_MAX) { .elementor-widget-icon-box.elementor-mobile_extra-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-mobile_extra-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-mobile_extra-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-mobile_extra-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-mobile_extra-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-mobile_extra-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-mobile_extra-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-mobile_extra-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-mobile_extra-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-mobile_extra-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-widget-icon-box.elementor-mobile-position-left .elementor-icon-box-wrapper, .elementor-widget-icon-box.elementor-mobile-position-right .elementor-icon-box-wrapper { display: flex; } .elementor-widget-icon-box.elementor-mobile-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-mobile-position-right .elementor-icon-box-icon { display: inline-flex; flex: 0 0 auto; } .elementor-widget-icon-box.elementor-mobile-position-right .elementor-icon-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-icon-box.elementor-mobile-position-right .elementor-icon-box-icon { margin-left: var(--icon-box-icon-margin, 15px); margin-right: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-mobile-position-left .elementor-icon-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-icon-box.elementor-mobile-position-left .elementor-icon-box-icon { margin-right: var(--icon-box-icon-margin, 15px); margin-left: 0; margin-bottom: unset; } .elementor-widget-icon-box.elementor-mobile-position-top .elementor-icon-box-wrapper { display: block; text-align: center; flex-direction: unset; } .elementor-widget-icon-box.elementor-mobile-position-top .elementor-icon-box-icon { margin-bottom: var(--icon-box-icon-margin, 15px); margin-right: auto; margin-left: auto; } .elementor-widget-icon-box.elementor-position-left .elementor-icon-box-icon, .elementor-widget-icon-box.elementor-position-right .elementor-icon-box-icon { display: block; flex: unset; } } .elementor-widget-icon-box .elementor-icon-box-title a { color: inherit; } .elementor-widget-icon-box .elementor-icon-box-content { flex-grow: 1; } .elementor-widget-icon-box .elementor-icon-box-description { margin: 0; } .elementor-widget.elementor-icon-list--layout-inline .elementor-widget-container { overflow: hidden; } .elementor-widget .elementor-icon-list-items.elementor-inline-items { margin-right: -8px; margin-left: -8px; } .elementor-widget .elementor-icon-list-items.elementor-inline-items .elementor-icon-list-item { margin-right: 8px; margin-left: 8px; } .elementor-widget .elementor-icon-list-items.elementor-inline-items .elementor-icon-list-item:after { width: auto; left: auto; right: auto; position: relative; height: 100%; border-top: 0; border-bottom: 0; border-right: 0; border-left-width: 1px; border-style: solid; left: -8px; } .elementor-widget .elementor-icon-list-items { list-style-type: none; margin: 0; padding: 0; } .elementor-widget .elementor-icon-list-item { margin: 0; padding: 0; position: relative; } .elementor-widget .elementor-icon-list-item:after { position: absolute; bottom: 0; width: 100%; } .elementor-widget .elementor-icon-list-item, .elementor-widget .elementor-icon-list-item a { display: flex; align-items: center; font-size: inherit; } .elementor-widget .elementor-icon-list-icon + .elementor-icon-list-text { align-self: center; padding-right: 5px; } .elementor-widget .elementor-icon-list-icon { display: flex; } .elementor-widget .elementor-icon-list-icon svg { width: var(--e-icon-list-icon-size, 1em); height: var(--e-icon-list-icon-size, 1em); } .elementor-widget .elementor-icon-list-icon i { width: 1.25em; font-size: var(--e-icon-list-icon-size); } .elementor-widget.elementor-widget-icon-list .elementor-icon-list-icon { text-align: var(--e-icon-list-icon-align); } .elementor-widget.elementor-widget-icon-list .elementor-icon-list-icon svg { margin: var(--e-icon-list-icon-margin, 0 calc(var(--e-icon-list-icon-size, 1em) * 0.25) 0 0); } .elementor-widget.elementor-list-item-link-full_width a { width: 100%; } .elementor-widget.elementor-align-center .elementor-icon-list-item, .elementor-widget.elementor-align-center .elementor-icon-list-item a { justify-content: center; } .elementor-widget.elementor-align-center .elementor-icon-list-item:after { margin: auto; } .elementor-widget.elementor-align-center .elementor-inline-items { justify-content: center; } .elementor-widget.elementor-align-left .elementor-icon-list-item, .elementor-widget.elementor-align-left .elementor-icon-list-item a { justify-content: flex-end; text-align: left; } .elementor-widget.elementor-align-left .elementor-inline-items { justify-content: flex-end; } .elementor-widget.elementor-align-right .elementor-icon-list-item, .elementor-widget.elementor-align-right .elementor-icon-list-item a { justify-content: flex-start; text-align: right; } .elementor-widget.elementor-align-right .elementor-icon-list-items { justify-content: flex-start; } .elementor-widget:not(.elementor-align-right) .elementor-icon-list-item:after { right: 0; } .elementor-widget:not(.elementor-align-left) .elementor-icon-list-item:after { left: 0; } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-widget.elementor-tablet-align-center .elementor-icon-list-items { justify-content: center; } .elementor-widget.elementor-tablet-align-center .elementor-icon-list-item, .elementor-widget.elementor-tablet-align-center .elementor-icon-list-item a { justify-content: center; } .elementor-widget.elementor-tablet-align-center .elementor-icon-list-item:after { margin: auto; } .elementor-widget.elementor-tablet-align-left .elementor-icon-list-items { justify-content: flex-end; } .elementor-widget.elementor-tablet-align-left .elementor-icon-list-item, .elementor-widget.elementor-tablet-align-left .elementor-icon-list-item a { justify-content: flex-end; text-align: left; } .elementor-widget.elementor-tablet-align-right .elementor-icon-list-items { justify-content: flex-start; } .elementor-widget.elementor-tablet-align-right .elementor-icon-list-item, .elementor-widget.elementor-tablet-align-right .elementor-icon-list-item a { justify-content: flex-start; text-align: right; } .elementor-widget:not(.elementor-tablet-align-right) .elementor-icon-list-item:after { right: 0; } .elementor-widget:not(.elementor-tablet-align-left) .elementor-icon-list-item:after { left: 0; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-widget.elementor-mobile-align-center .elementor-icon-list-items { justify-content: center; } .elementor-widget.elementor-mobile-align-center .elementor-icon-list-item, .elementor-widget.elementor-mobile-align-center .elementor-icon-list-item a { justify-content: center; } .elementor-widget.elementor-mobile-align-center .elementor-icon-list-item:after { margin: auto; } .elementor-widget.elementor-mobile-align-left .elementor-icon-list-items { justify-content: flex-end; } .elementor-widget.elementor-mobile-align-left .elementor-icon-list-item, .elementor-widget.elementor-mobile-align-left .elementor-icon-list-item a { justify-content: flex-end; text-align: left; } .elementor-widget.elementor-mobile-align-right .elementor-icon-list-items { justify-content: flex-start; } .elementor-widget.elementor-mobile-align-right .elementor-icon-list-item, .elementor-widget.elementor-mobile-align-right .elementor-icon-list-item a { justify-content: flex-start; text-align: right; } .elementor-widget:not(.elementor-mobile-align-right) .elementor-icon-list-item:after { right: 0; } .elementor-widget:not(.elementor-mobile-align-left) .elementor-icon-list-item:after { left: 0; } } .elementor-widget-image { text-align: center; } .elementor-widget-image a { display: inline-block; } .elementor-widget-image a img[src$=".svg"] { width: 48px; } .elementor-widget-image img { vertical-align: middle; display: inline-block; } .elementor-widget-image-box .elementor-image-box-content { width: 100%; } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) { .elementor-widget-image-box.elementor-position-left .elementor-image-box-wrapper, .elementor-widget-image-box.elementor-position-right .elementor-image-box-wrapper { display: flex; } .elementor-widget-image-box.elementor-position-right .elementor-image-box-wrapper { text-align: left; flex-direction: row; } .elementor-widget-image-box.elementor-position-left .elementor-image-box-wrapper { text-align: right; flex-direction: row-reverse; } .elementor-widget-image-box.elementor-position-top .elementor-image-box-img { margin: auto; } .elementor-widget-image-box.elementor-vertical-align-top .elementor-image-box-wrapper { align-items: flex-start; } .elementor-widget-image-box.elementor-vertical-align-middle .elementor-image-box-wrapper { align-items: center; } .elementor-widget-image-box.elementor-vertical-align-bottom .elementor-image-box-wrapper { align-items: flex-end; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-widget-image-box .elementor-image-box-img { margin-left: auto !important; margin-right: auto !important; margin-bottom: 15px; } } .elementor-widget-image-box .elementor-image-box-img { display: inline-block; } .elementor-widget-image-box .elementor-image-box-title a { color: inherit; } .elementor-widget-image-box .elementor-image-box-wrapper { text-align: center; } .elementor-widget-image-box .elementor-image-box-description { margin: 0; } .elementor-widget-image-carousel .swiper-container { position: static; } .elementor-widget-image-carousel .swiper-container .swiper-slide figure { line-height: inherit; } .elementor-widget-image-carousel .swiper-slide { text-align: center; } .elementor-image-carousel-wrapper:not(.swiper-container-initialized) .swiper-slide { max-width: calc(100% / var(--e-image-carousel-slides-to-show, 3)); } body.elementor-page .elementor-widget-menu-anchor { margin-bottom: 0; } .elementor-widget-progress { text-align: right; } .elementor-progress-wrapper { position: relative; background-color: #eeeeee; color: #ffffff; height: 100%; border-radius: 2px; } .elementor-progress-bar { display: flex; background-color: #818a91; width: 0; font-size: 11px; height: 30px; line-height: 30px; border-radius: 2px; transition: width 1s ease-in-out; } .elementor-progress-text { flex-grow: 1; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; padding-right: 15px; } .elementor-progress-percentage { padding-left: 15px; } .elementor-widget-progress .elementor-progress-wrapper.progress-info .elementor-progress-bar { background-color: #5bc0de; } .elementor-widget-progress .elementor-progress-wrapper.progress-success .elementor-progress-bar { background-color: #5cb85c; } .elementor-widget-progress .elementor-progress-wrapper.progress-warning .elementor-progress-bar { background-color: #f0ad4e; } .elementor-widget-progress .elementor-progress-wrapper.progress-danger .elementor-progress-bar { background-color: #d9534f; } .elementor-progress .elementor-title { display: block; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-progress-text { padding-right: 10px; } } .elementor-widget-social-icons { /*TODO: This Grid-0 needs to be removed after PRO is Updated */ } .elementor-widget-social-icons.elementor-grid-0 .elementor-widget-container, .elementor-widget-social-icons.elementor-grid-tablet-0 .elementor-widget-container, .elementor-widget-social-icons.elementor-grid-mobile-0 .elementor-widget-container { line-height: 1; font-size: 0; } .elementor-widget-social-icons:not(.elementor-grid-0):not(.elementor-grid-tablet-0):not(.elementor-grid-mobile-0) .elementor-grid { display: inline-grid; } .elementor-widget-social-icons .elementor-grid { grid-column-gap: var(--grid-column-gap, 5px); grid-row-gap: var(--grid-row-gap, 5px); grid-template-columns: var(--grid-template-columns); justify-content: var(--justify-content, center); justify-items: var(--justify-content, center); } .elementor-icon.elementor-social-icon { font-size: var(--icon-size, 25px); line-height: var(--icon-size, 25px); width: calc(var(--icon-size, 25px) + (2 * var(--icon-padding, 0.5em))); height: calc(var(--icon-size, 25px) + (2 * var(--icon-padding, 0.5em))); } .elementor-social-icon { --e-social-icon-icon-color: #fff; display: inline-flex; background-color: #818a91; align-items: center; justify-content: center; text-align: center; cursor: pointer; } .elementor-social-icon i { color: var(--e-social-icon-icon-color); } .elementor-social-icon svg { fill: var(--e-social-icon-icon-color); } .elementor-social-icon:last-child { margin: 0; } .elementor-social-icon:hover { opacity: .9; color: white; } .elementor-social-icon-android { background-color: #A4C639; } .elementor-social-icon-apple { background-color: #999999; } .elementor-social-icon-behance { background-color: #1769ff; } .elementor-social-icon-bitbucket { background-color: #205081; } .elementor-social-icon-codepen { background-color: #000000; } .elementor-social-icon-delicious { background-color: #3399ff; } .elementor-social-icon-deviantart { background-color: #05cc47; } .elementor-social-icon-digg { background-color: #005be2; } .elementor-social-icon-dribbble { background-color: #ea4c89; } .elementor-social-icon-elementor { background-color: #D30C5C; } .elementor-social-icon-envelope { background-color: #ea4335; } .elementor-social-icon-facebook, .elementor-social-icon-facebook-f { background-color: #3b5998; } .elementor-social-icon-flickr { background-color: #0063dc; } .elementor-social-icon-foursquare { background-color: #2d5be3; } .elementor-social-icon-freecodecamp, .elementor-social-icon-free-code-camp { background-color: #006400; } .elementor-social-icon-github { background-color: #333333; } .elementor-social-icon-gitlab { background-color: #e24329; } .elementor-social-icon-globe { background-color: #818a91; } .elementor-social-icon-google-plus, .elementor-social-icon-google-plus-g { background-color: #dd4b39; } .elementor-social-icon-houzz { background-color: #7ac142; } .elementor-social-icon-instagram { background-color: #262626; } .elementor-social-icon-jsfiddle { background-color: #487AA2; } .elementor-social-icon-link { background-color: #818a91; } .elementor-social-icon-linkedin, .elementor-social-icon-linkedin-in { background-color: #0077b5; } .elementor-social-icon-medium { background-color: #00ab6b; } .elementor-social-icon-meetup { background-color: #ec1c40; } .elementor-social-icon-mixcloud { background-color: #273a4b; } .elementor-social-icon-odnoklassniki { background-color: #F4731C; } .elementor-social-icon-pinterest { background-color: #bd081c; } .elementor-social-icon-product-hunt { background-color: #da552f; } .elementor-social-icon-reddit { background-color: #ff4500; } .elementor-social-icon-rss { background-color: #f26522; } .elementor-social-icon-shopping-cart { background-color: #4CAF50; } .elementor-social-icon-skype { background-color: #00AFF0; } .elementor-social-icon-slideshare { background-color: #0077b5; } .elementor-social-icon-snapchat { background-color: #fffc00; } .elementor-social-icon-soundcloud { background-color: #ff8800; } .elementor-social-icon-spotify { background-color: #2ebd59; } .elementor-social-icon-stack-overflow { background-color: #fe7a15; } .elementor-social-icon-steam { background-color: #00adee; } .elementor-social-icon-stumbleupon { background-color: #EB4924; } .elementor-social-icon-telegram { background-color: #2CA5E0; } .elementor-social-icon-thumb-tack { background-color: #1aa1d8; } .elementor-social-icon-tripadvisor { background-color: #589442; } .elementor-social-icon-tumblr { background-color: #35465c; } .elementor-social-icon-twitch { background-color: #6441A5; } .elementor-social-icon-twitter { background-color: #1DA1F2; } .elementor-social-icon-viber { background-color: #665cac; } .elementor-social-icon-vimeo { background-color: #1ab7ea; } .elementor-social-icon-vk { background-color: #45668e; } .elementor-social-icon-weibo { background-color: #DD2430; } .elementor-social-icon-weixin { background-color: #31A918; } .elementor-social-icon-whatsapp { background-color: #25d366; } .elementor-social-icon-wordpress { background-color: #21759b; } .elementor-social-icon-xing { background-color: #026466; } .elementor-social-icon-yelp { background-color: #af0606; } .elementor-social-icon-youtube { background-color: #cd201f; } .elementor-social-icon-500px { background-color: #0099e5; } .elementor-shape-rounded .elementor-icon.elementor-social-icon { border-radius: 10%; } .elementor-shape-circle .elementor-icon.elementor-social-icon { border-radius: 50%; } .e-container.e-container--row .elementor-spacer-inner { width: var(--spacer-size); } .elementor-column .elementor-spacer-inner, .e-container.e-container--column .elementor-spacer-inner { height: var(--spacer-size); } .elementor-star-rating { color: #CCD6DF; font-family: eicons; display: inline-block; } .elementor-star-rating i { display: inline-block; position: relative; font-style: normal; cursor: default; } .elementor-star-rating i:before { content: '\e934'; display: block; font-size: inherit; font-family: inherit; position: absolute; overflow: hidden; color: #f0ad4e; top: 0; right: 0; } .elementor-star-rating .elementor-star-empty:before { content: none; } .elementor-star-rating .elementor-star-1:before { width: 10%; } .elementor-star-rating .elementor-star-2:before { width: 20%; } .elementor-star-rating .elementor-star-3:before { width: 30%; } .elementor-star-rating .elementor-star-4:before { width: 40%; } .elementor-star-rating .elementor-star-5:before { width: 50%; } .elementor-star-rating .elementor-star-6:before { width: 60%; } .elementor-star-rating .elementor-star-7:before { width: 70%; } .elementor-star-rating .elementor-star-8:before { width: 80%; } .elementor-star-rating .elementor-star-9:before { width: 90%; } .elementor-star-rating__wrapper { display: flex; align-items: center; } .elementor-star-rating__title { margin-left: 10px; } .elementor-star-rating--align-right .elementor-star-rating__wrapper { text-align: right; justify-content: flex-start; } .elementor-star-rating--align-left .elementor-star-rating__wrapper { text-align: left; justify-content: flex-end; } .elementor-star-rating--align-center .elementor-star-rating__wrapper { text-align: center; justify-content: center; } .elementor-star-rating--align-justify .elementor-star-rating__title { margin-left: auto; } @media (max-width: ELEMENTOR_SCREEN_TABLET_MAX) { .elementor-star-rating-tablet--align-right .elementor-star-rating__wrapper { text-align: right; justify-content: flex-start; } .elementor-star-rating-tablet--align-left .elementor-star-rating__wrapper { text-align: left; justify-content: flex-end; } .elementor-star-rating-tablet--align-center .elementor-star-rating__wrapper { text-align: center; justify-content: center; } .elementor-star-rating-tablet--align-justify .elementor-star-rating__title { margin-left: auto; } } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-star-rating-mobile--align-right .elementor-star-rating__wrapper { text-align: right; justify-content: flex-start; } .elementor-star-rating-mobile--align-left .elementor-star-rating__wrapper { text-align: left; justify-content: flex-end; } .elementor-star-rating-mobile--align-center .elementor-star-rating__wrapper { text-align: center; justify-content: center; } .elementor-star-rating-mobile--align-justify .elementor-star-rating__title { margin-left: auto; } } .last-star { letter-spacing: 0; } .elementor--star-style-star_unicode .elementor-star-rating { font-family: 'Arial', 'Helvetica', sans-serif; } .elementor--star-style-star_unicode .elementor-star-rating i:not(.elementor-star-empty):before { content: '\002605'; } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tabs-wrapper { width: 25%; flex-shrink: 0; } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tab-desktop-title.elementor-active { border-left-style: none; } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tab-desktop-title.elementor-active:before, .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tab-desktop-title.elementor-active:after { height: 999em; width: 0; left: 0; border-left-style: solid; } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tab-desktop-title.elementor-active:before { top: 0; transform: translateY(-100%); } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tab-desktop-title.elementor-active:after { top: 100%; } .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-desktop-title { display: table-cell; } .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-desktop-title.elementor-active { border-bottom-style: none; } .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-desktop-title.elementor-active:before, .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-desktop-title.elementor-active:after { bottom: 0; height: 0; width: 999em; border-bottom-style: solid; } .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-desktop-title.elementor-active:before { right: 100%; } .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-desktop-title.elementor-active:after { left: 100%; } .elementor-widget-tabs .elementor-tab-title, .elementor-widget-tabs .elementor-tab-title:before, .elementor-widget-tabs .elementor-tab-title:after, .elementor-widget-tabs .elementor-tab-content, .elementor-widget-tabs .elementor-tabs-content-wrapper { border: 1px none #D4D4D4; } .elementor-widget-tabs .elementor-tabs { text-align: right; } .elementor-widget-tabs .elementor-tabs-wrapper { overflow: hidden; } .elementor-widget-tabs .elementor-tab-title { cursor: pointer; outline: var(--focus-outline, none); } .elementor-widget-tabs .elementor-tab-desktop-title { position: relative; padding: 20px 25px; font-weight: bold; line-height: 1; border: solid transparent; } .elementor-widget-tabs .elementor-tab-desktop-title.elementor-active { border-color: #D4D4D4; } .elementor-widget-tabs .elementor-tab-desktop-title.elementor-active:before, .elementor-widget-tabs .elementor-tab-desktop-title.elementor-active:after { display: block; content: ''; position: absolute; } .elementor-widget-tabs .elementor-tab-mobile-title { padding: 10px 10px; cursor: pointer; } .elementor-widget-tabs .elementor-tab-content { padding: 20px; display: none; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-tabs .elementor-tab-title, .elementor-tabs .elementor-tab-content { border-style: solid; border-bottom-style: none; } .elementor-tabs .elementor-tabs-wrapper { display: none; } .elementor-tabs .elementor-tabs-content-wrapper { border-bottom-style: solid; } .elementor-tabs .elementor-tab-content { padding: 10px; } } @media (min-width: ELEMENTOR_SCREEN_MOBILE_NEXT) { .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tabs { display: flex; } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tabs-wrapper { flex-direction: column; } .elementor-widget-tabs.elementor-tabs-view-vertical .elementor-tabs-content-wrapper { flex-grow: 1; border-style: solid; border-right-style: none; } .elementor-widget-tabs.elementor-tabs-view-horizontal .elementor-tab-content { border-style: solid; border-top-style: none; } .elementor-widget-tabs.elementor-tabs-alignment-center .elementor-tabs-wrapper, .elementor-widget-tabs.elementor-tabs-alignment-end .elementor-tabs-wrapper, .elementor-widget-tabs.elementor-tabs-alignment-stretch .elementor-tabs-wrapper { display: flex; } .elementor-widget-tabs.elementor-tabs-alignment-center .elementor-tabs-wrapper { justify-content: center; } .elementor-widget-tabs.elementor-tabs-alignment-end .elementor-tabs-wrapper { justify-content: flex-end; } .elementor-widget-tabs.elementor-tabs-alignment-stretch.elementor-tabs-view-horizontal .elementor-tab-title { width: 100%; } .elementor-widget-tabs.elementor-tabs-alignment-stretch.elementor-tabs-view-vertical .elementor-tab-title { height: 100%; } .elementor-tabs .elementor-tab-mobile-title { display: none; } } .elementor-testimonial-wrapper { overflow: hidden; text-align: center; } .elementor-testimonial-wrapper .elementor-testimonial-content { font-size: 1.3em; margin-bottom: 20px; } .elementor-testimonial-wrapper .elementor-testimonial-name { line-height: 1.5; display: block; } .elementor-testimonial-wrapper .elementor-testimonial-job { font-size: 0.85em; display: block; } .elementor-testimonial-wrapper .elementor-testimonial-meta { width: 100%; line-height: 1; } .elementor-testimonial-wrapper .elementor-testimonial-meta-inner { display: inline-block; } .elementor-testimonial-wrapper .elementor-testimonial-meta .elementor-testimonial-details, .elementor-testimonial-wrapper .elementor-testimonial-meta .elementor-testimonial-image { display: table-cell; vertical-align: middle; } .elementor-testimonial-wrapper .elementor-testimonial-meta .elementor-testimonial-image img { width: 60px; height: 60px; border-radius: 50%; object-fit: cover; max-width: none; } .elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-aside .elementor-testimonial-image { padding-left: 15px; } .elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-aside .elementor-testimonial-details { text-align: right; } .elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-top .elementor-testimonial-details, .elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-top .elementor-testimonial-image { display: block; } .elementor-testimonial-wrapper .elementor-testimonial-meta.elementor-testimonial-image-position-top .elementor-testimonial-image { margin-bottom: 20px; } .elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap { background-color: #818a91; color: #fff; } .elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap { color: #818a91; border: 3px solid; background-color: transparent; } .elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap { margin-top: 8px; } .elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter { width: 1em; height: 1em; } .elementor-widget-text-editor .elementor-drop-cap { float: right; text-align: center; line-height: 1; font-size: 50px; } .elementor-widget-text-editor .elementor-drop-cap-letter { display: inline-block; } .elementor-toggle { text-align: right; } .elementor-toggle .elementor-tab-title { font-weight: bold; line-height: 1; margin: 0; padding: 15px; border-bottom: 1px solid #D4D4D4; cursor: pointer; outline: none; } .elementor-toggle .elementor-tab-title .elementor-toggle-icon { display: inline-block; width: 1em; } .elementor-toggle .elementor-tab-title .elementor-toggle-icon svg { margin-inline-start: -5px; width: 1em; height: 1em; } .elementor-toggle .elementor-tab-title .elementor-toggle-icon.elementor-toggle-icon-right { float: right; text-align: right; } .elementor-toggle .elementor-tab-title .elementor-toggle-icon.elementor-toggle-icon-left { float: left; text-align: left; } .elementor-toggle .elementor-tab-title .elementor-toggle-icon .elementor-toggle-icon-closed { display: block; } .elementor-toggle .elementor-tab-title .elementor-toggle-icon .elementor-toggle-icon-opened { display: none; } .elementor-toggle .elementor-tab-title.elementor-active { border-bottom: none; } .elementor-toggle .elementor-tab-title.elementor-active .elementor-toggle-icon-closed { display: none; } .elementor-toggle .elementor-tab-title.elementor-active .elementor-toggle-icon-opened { display: block; } .elementor-toggle .elementor-tab-content { padding: 15px; border-bottom: 1px solid #D4D4D4; display: none; } @media (max-width: ELEMENTOR_SCREEN_MOBILE_MAX) { .elementor-toggle .elementor-tab-title { padding: 12px; } .elementor-toggle .elementor-tab-content { padding: 12px 10px; } } .elementor-widget-video .elementor-widget-container { overflow: hidden; transform: translate3d(0, 0, 0); } .elementor-widget-video .elementor-open-inline .elementor-custom-embed-image-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-size: cover; background-position: 50%; } .elementor-widget-video .elementor-custom-embed-image-overlay { cursor: pointer; text-align: center; } .elementor-widget-video .elementor-custom-embed-image-overlay:hover .elementor-custom-embed-play i { opacity: 1; } .elementor-widget-video .elementor-custom-embed-image-overlay img { display: block; width: 100%; } .elementor-widget-video .e-hosted-video .elementor-video { object-fit: cover; } {"translation-revision-date":"2024-11-04T15:59:18+00:00","generator":"WP-CLI\/2.12.0","source":"src\/Launch\/components\/QuestionIcon\/Icons\/shopping-cart.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"ro_RO","plural-forms":"nplurals=2; plural=(n != 1);"},"Shopping Cart Icon":["Icon co\u0219 de cump\u0103r\u0103turi"]}}}(function () { var table = (function (domGlobals) { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var noop = function () { }; var compose = function (fa, fb) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return fa(fb.apply(null, args)); }; }; var constant = function (value) { return function () { return value; }; }; var identity = function (x) { return x; }; function curry(fn) { var initialArgs = []; for (var _i = 1; _i < arguments.length; _i++) { initialArgs[_i - 1] = arguments[_i]; } return function () { var restArgs = []; for (var _i = 0; _i < arguments.length; _i++) { restArgs[_i] = arguments[_i]; } var all = initialArgs.concat(restArgs); return fn.apply(null, all); }; } var not = function (f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return !f.apply(null, args); }; }; var die = function (msg) { return function () { throw new Error(msg); }; }; var never = constant(false); var always = constant(true); var none = function () { return NONE; }; var NONE = function () { var eq = function (o) { return o.isNone(); }; var call = function (thunk) { return thunk(); }; var id = function (n) { return n; }; var me = { fold: function (n, s) { return n(); }, is: never, isSome: never, isNone: always, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: constant(null), getOrUndefined: constant(undefined), or: id, orThunk: call, map: none, each: noop, bind: none, exists: never, forall: always, filter: none, equals: eq, equals_: eq, toArray: function () { return []; }, toString: constant('none()') }; if (Object.freeze) { Object.freeze(me); } return me; }(); var some = function (a) { var constant_a = constant(a); var self = function () { return me; }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, is: function (v) { return a === v; }, isSome: always, isNone: never, getOr: constant_a, getOrThunk: constant_a, getOrDie: constant_a, getOrNull: constant_a, getOrUndefined: constant_a, or: self, orThunk: self, map: function (f) { return some(f(a)); }, each: function (f) { f(a); }, bind: bind, exists: bind, forall: bind, filter: function (f) { return f(a) ? me : NONE; }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; }, equals: function (o) { return o.is(a); }, equals_: function (o, elementEq) { return o.fold(never, function (b) { return elementEq(a, b); }); } }; return me; }; var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Option = { some: some, none: none, from: from }; var typeOf = function (x) { if (x === null) { return 'null'; } var t = typeof x; if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { return 'array'; } if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { return 'string'; } return t; }; var isType = function (type) { return function (value) { return typeOf(value) === type; }; }; var isString = isType('string'); var isArray = isType('array'); var isBoolean = isType('boolean'); var isFunction = isType('function'); var isNumber = isType('number'); var nativeSlice = Array.prototype.slice; var nativeIndexOf = Array.prototype.indexOf; var nativePush = Array.prototype.push; var rawIndexOf = function (ts, t) { return nativeIndexOf.call(ts, t); }; var contains = function (xs, x) { return rawIndexOf(xs, x) > -1; }; var exists = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return true; } } return false; }; var map = function (xs, f) { var len = xs.length; var r = new Array(len); for (var i = 0; i < len; i++) { var x = xs[i]; r[i] = f(x, i); } return r; }; var each = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; f(x, i); } }; var eachr = function (xs, f) { for (var i = xs.length - 1; i >= 0; i--) { var x = xs[i]; f(x, i); } }; var filter = function (xs, pred) { var r = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; var foldr = function (xs, f, acc) { eachr(xs, function (x) { acc = f(acc, x); }); return acc; }; var foldl = function (xs, f, acc) { each(xs, function (x) { acc = f(acc, x); }); return acc; }; var find = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Option.some(x); } } return Option.none(); }; var findIndex = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Option.some(i); } } return Option.none(); }; var flatten = function (xs) { var r = []; for (var i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } nativePush.apply(r, xs[i]); } return r; }; var bind = function (xs, f) { var output = map(xs, f); return flatten(output); }; var forall = function (xs, pred) { for (var i = 0, len = xs.length; i < len; ++i) { var x = xs[i]; if (pred(x, i) !== true) { return false; } } return true; }; var reverse = function (xs) { var r = nativeSlice.call(xs, 0); r.reverse(); return r; }; var last = function (xs) { return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]); }; var from$1 = isFunction(Array.from) ? Array.from : function (x) { return nativeSlice.call(x); }; var keys = Object.keys; var each$1 = function (obj, f) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; f(x, i); } }; var map$1 = function (obj, f) { return tupleMap(obj, function (x, i) { return { k: i, v: f(x, i) }; }); }; var tupleMap = function (obj, f) { var r = {}; each$1(obj, function (x, i) { var tuple = f(x, i); r[tuple.k] = tuple.v; }); return r; }; var Immutable = function () { var fields = []; for (var _i = 0; _i < arguments.length; _i++) { fields[_i] = arguments[_i]; } return function () { var values = []; for (var _i = 0; _i < arguments.length; _i++) { values[_i] = arguments[_i]; } if (fields.length !== values.length) { throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); } var struct = {}; each(fields, function (name, i) { struct[name] = constant(values[i]); }); return struct; }; }; var sort = function (arr) { return arr.slice(0).sort(); }; var reqMessage = function (required, keys) { throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.'); }; var unsuppMessage = function (unsupported) { throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', ')); }; var validateStrArr = function (label, array) { if (!isArray(array)) { throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.'); } each(array, function (a) { if (!isString(a)) { throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.'); } }); }; var invalidTypeMessage = function (incorrect, type) { throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.'); }; var checkDupes = function (everything) { var sorted = sort(everything); var dupe = find(sorted, function (s, i) { return i < sorted.length - 1 && s === sorted[i + 1]; }); dupe.each(function (d) { throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].'); }); }; var MixedBag = function (required, optional) { var everything = required.concat(optional); if (everything.length === 0) { throw new Error('You must specify at least one required or optional field.'); } validateStrArr('required', required); validateStrArr('optional', optional); checkDupes(everything); return function (obj) { var keys$1 = keys(obj); var allReqd = forall(required, function (req) { return contains(keys$1, req); }); if (!allReqd) { reqMessage(required, keys$1); } var unsupported = filter(keys$1, function (key) { return !contains(everything, key); }); if (unsupported.length > 0) { unsuppMessage(unsupported); } var r = {}; each(required, function (req) { r[req] = constant(obj[req]); }); each(optional, function (opt) { r[opt] = constant(Object.prototype.hasOwnProperty.call(obj, opt) ? Option.some(obj[opt]) : Option.none()); }); return r; }; }; var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; var COMMENT = domGlobals.Node.COMMENT_NODE; var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; var ELEMENT = domGlobals.Node.ELEMENT_NODE; var TEXT = domGlobals.Node.TEXT_NODE; var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; var ENTITY = domGlobals.Node.ENTITY_NODE; var NOTATION = domGlobals.Node.NOTATION_NODE; var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); var path = function (parts, scope) { var o = scope !== undefined && scope !== null ? scope : Global; for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { o = o[parts[i]]; } return o; }; var resolve = function (p, scope) { var parts = p.split('.'); return path(parts, scope); }; var unsafe = function (name, scope) { return resolve(name, scope); }; var getOrDie = function (name, scope) { var actual = unsafe(name, scope); if (actual === undefined || actual === null) { throw new Error(name + ' not available on this browser'); } return actual; }; var Global$1 = { getOrDie: getOrDie }; var name = function (element) { var r = element.dom().nodeName; return r.toLowerCase(); }; var type = function (element) { return element.dom().nodeType; }; var isType$1 = function (t) { return function (element) { return type(element) === t; }; }; var isComment = function (element) { return type(element) === COMMENT || name(element) === '#comment'; }; var isElement = isType$1(ELEMENT); var isText = isType$1(TEXT); var rawSet = function (dom, key, value) { if (isString(value) || isBoolean(value) || isNumber(value)) { dom.setAttribute(key, value + ''); } else { domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); throw new Error('Attribute value was not simple'); } }; var set = function (element, key, value) { rawSet(element.dom(), key, value); }; var setAll = function (element, attrs) { var dom = element.dom(); each$1(attrs, function (v, k) { rawSet(dom, k, v); }); }; var get = function (element, key) { var v = element.dom().getAttribute(key); return v === null ? undefined : v; }; var has = function (element, key) { var dom = element.dom(); return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; }; var remove = function (element, key) { element.dom().removeAttribute(key); }; var clone = function (element) { return foldl(element.dom().attributes, function (acc, attr) { acc[attr.name] = attr.value; return acc; }, {}); }; var checkRange = function (str, substr, start) { if (substr === '') { return true; } if (str.length < substr.length) { return false; } var x = str.substr(start, start + substr.length); return x === substr; }; var contains$1 = function (str, substr) { return str.indexOf(substr) !== -1; }; var endsWith = function (str, suffix) { return checkRange(str, suffix, str.length - suffix.length); }; var trim = function (str) { return str.replace(/^\s+|\s+$/g, ''); }; var isSupported = function (dom) { return dom.style !== undefined && isFunction(dom.style.getPropertyValue); }; var cached = function (f) { var called = false; var r; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (!called) { called = true; r = f.apply(null, args); } return r; }; }; var fromHtml = function (html, scope) { var doc = scope || domGlobals.document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { domGlobals.console.error('HTML does not have a single root node', html); throw new Error('HTML must have a single root node'); } return fromDom(div.childNodes[0]); }; var fromTag = function (tag, scope) { var doc = scope || domGlobals.document; var node = doc.createElement(tag); return fromDom(node); }; var fromText = function (text, scope) { var doc = scope || domGlobals.document; var node = doc.createTextNode(text); return fromDom(node); }; var fromDom = function (node) { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: constant(node) }; }; var fromPoint = function (docElm, x, y) { var doc = docElm.dom(); return Option.from(doc.elementFromPoint(x, y)).map(fromDom); }; var Element = { fromHtml: fromHtml, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; var inBody = function (element) { var dom = isText(element) ? element.dom().parentNode : element.dom(); return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom); }; var body = cached(function () { return getBody(Element.fromDom(domGlobals.document)); }); var getBody = function (doc) { var b = doc.dom().body; if (b === null || b === undefined) { throw new Error('Body is not available yet'); } return Element.fromDom(b); }; var internalSet = function (dom, property, value) { if (!isString(value)) { domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); throw new Error('CSS value must be a string: ' + value); } if (isSupported(dom)) { dom.style.setProperty(property, value); } }; var internalRemove = function (dom, property) { if (isSupported(dom)) { dom.style.removeProperty(property); } }; var set$1 = function (element, property, value) { var dom = element.dom(); internalSet(dom, property, value); }; var setAll$1 = function (element, css) { var dom = element.dom(); each$1(css, function (v, k) { internalSet(dom, k, v); }); }; var get$1 = function (element, property) { var dom = element.dom(); var styles = domGlobals.window.getComputedStyle(dom); var r = styles.getPropertyValue(property); var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; return v === null ? undefined : v; }; var getUnsafeProperty = function (dom, property) { return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; }; var getRaw = function (element, property) { var dom = element.dom(); var raw = getUnsafeProperty(dom, property); return Option.from(raw).filter(function (r) { return r.length > 0; }); }; var remove$1 = function (element, property) { var dom = element.dom(); internalRemove(dom, property); if (has(element, 'style') && trim(get(element, 'style')) === '') { remove(element, 'style'); } }; var copy = function (source, target) { var sourceDom = source.dom(); var targetDom = target.dom(); if (isSupported(sourceDom) && isSupported(targetDom)) { targetDom.style.cssText = sourceDom.style.cssText; } }; var node = function () { var f = Global$1.getOrDie('Node'); return f; }; var compareDocumentPosition = function (a, b, match) { return (a.compareDocumentPosition(b) & match) !== 0; }; var documentPositionPreceding = function (a, b) { return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING); }; var documentPositionContainedBy = function (a, b) { return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY); }; var Node = { documentPositionPreceding: documentPositionPreceding, documentPositionContainedBy: documentPositionContainedBy }; var firstMatch = function (regexes, s) { for (var i = 0; i < regexes.length; i++) { var x = regexes[i]; if (x.test(s)) { return x; } } return undefined; }; var find$1 = function (regexes, agent) { var r = firstMatch(regexes, agent); if (!r) { return { major: 0, minor: 0 }; } var group = function (i) { return Number(agent.replace(r, '$' + i)); }; return nu(group(1), group(2)); }; var detect = function (versionRegexes, agent) { var cleanedAgent = String(agent).toLowerCase(); if (versionRegexes.length === 0) { return unknown(); } return find$1(versionRegexes, cleanedAgent); }; var unknown = function () { return nu(0, 0); }; var nu = function (major, minor) { return { major: major, minor: minor }; }; var Version = { nu: nu, detect: detect, unknown: unknown }; var edge = 'Edge'; var chrome = 'Chrome'; var ie = 'IE'; var opera = 'Opera'; var firefox = 'Firefox'; var safari = 'Safari'; var isBrowser = function (name, current) { return function () { return current === name; }; }; var unknown$1 = function () { return nu$1({ current: undefined, version: Version.unknown() }); }; var nu$1 = function (info) { var current = info.current; var version = info.version; return { current: current, version: version, isEdge: isBrowser(edge, current), isChrome: isBrowser(chrome, current), isIE: isBrowser(ie, current), isOpera: isBrowser(opera, current), isFirefox: isBrowser(firefox, current), isSafari: isBrowser(safari, current) }; }; var Browser = { unknown: unknown$1, nu: nu$1, edge: constant(edge), chrome: constant(chrome), ie: constant(ie), opera: constant(opera), firefox: constant(firefox), safari: constant(safari) }; var windows = 'Windows'; var ios = 'iOS'; var android = 'Android'; var linux = 'Linux'; var osx = 'OSX'; var solaris = 'Solaris'; var freebsd = 'FreeBSD'; var isOS = function (name, current) { return function () { return current === name; }; }; var unknown$2 = function () { return nu$2({ current: undefined, version: Version.unknown() }); }; var nu$2 = function (info) { var current = info.current; var version = info.version; return { current: current, version: version, isWindows: isOS(windows, current), isiOS: isOS(ios, current), isAndroid: isOS(android, current), isOSX: isOS(osx, current), isLinux: isOS(linux, current), isSolaris: isOS(solaris, current), isFreeBSD: isOS(freebsd, current) }; }; var OperatingSystem = { unknown: unknown$2, nu: nu$2, windows: constant(windows), ios: constant(ios), android: constant(android), linux: constant(linux), osx: constant(osx), solaris: constant(solaris), freebsd: constant(freebsd) }; var DeviceType = function (os, browser, userAgent) { var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; var isiPhone = os.isiOS() && !isiPad; var isAndroid3 = os.isAndroid() && os.version.major === 3; var isAndroid4 = os.isAndroid() && os.version.major === 4; var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true; var isTouch = os.isiOS() || os.isAndroid(); var isPhone = isTouch && !isTablet; var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; return { isiPad: constant(isiPad), isiPhone: constant(isiPhone), isTablet: constant(isTablet), isPhone: constant(isPhone), isTouch: constant(isTouch), isAndroid: os.isAndroid, isiOS: os.isiOS, isWebView: constant(iOSwebview) }; }; var detect$1 = function (candidates, userAgent) { var agent = String(userAgent).toLowerCase(); return find(candidates, function (candidate) { return candidate.search(agent); }); }; var detectBrowser = function (browsers, userAgent) { return detect$1(browsers, userAgent).map(function (browser) { var version = Version.detect(browser.versionRegexes, userAgent); return { current: browser.name, version: version }; }); }; var detectOs = function (oses, userAgent) { return detect$1(oses, userAgent).map(function (os) { var version = Version.detect(os.versionRegexes, userAgent); return { current: os.name, version: version }; }); }; var UaString = { detectBrowser: detectBrowser, detectOs: detectOs }; var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; var checkContains = function (target) { return function (uastring) { return contains$1(uastring, target); }; }; var browsers = [ { name: 'Edge', versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], search: function (uastring) { return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); } }, { name: 'Chrome', versionRegexes: [ /.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex ], search: function (uastring) { return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); } }, { name: 'IE', versionRegexes: [ /.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/ ], search: function (uastring) { return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); } }, { name: 'Opera', versionRegexes: [ normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/ ], search: checkContains('opera') }, { name: 'Firefox', versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], search: checkContains('firefox') }, { name: 'Safari', versionRegexes: [ normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/ ], search: function (uastring) { return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); } } ]; var oses = [ { name: 'Windows', search: checkContains('win'), versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'iOS', search: function (uastring) { return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); }, versionRegexes: [ /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, /.*cpu os ([0-9]+)_([0-9]+).*/, /.*cpu iphone os ([0-9]+)_([0-9]+).*/ ] }, { name: 'Android', search: checkContains('android'), versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'OSX', search: checkContains('os x'), versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/] }, { name: 'Linux', search: checkContains('linux'), versionRegexes: [] }, { name: 'Solaris', search: checkContains('sunos'), versionRegexes: [] }, { name: 'FreeBSD', search: checkContains('freebsd'), versionRegexes: [] } ]; var PlatformInfo = { browsers: constant(browsers), oses: constant(oses) }; var detect$2 = function (userAgent) { var browsers = PlatformInfo.browsers(); var oses = PlatformInfo.oses(); var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); var deviceType = DeviceType(os, browser, userAgent); return { browser: browser, os: os, deviceType: deviceType }; }; var PlatformDetection = { detect: detect$2 }; var detect$3 = cached(function () { var userAgent = domGlobals.navigator.userAgent; return PlatformDetection.detect(userAgent); }); var PlatformDetection$1 = { detect: detect$3 }; var ELEMENT$1 = ELEMENT; var DOCUMENT$1 = DOCUMENT; var is = function (element, selector) { var dom = element.dom(); if (dom.nodeType !== ELEMENT$1) { return false; } else { var elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { return elem.msMatchesSelector(selector); } else if (elem.webkitMatchesSelector !== undefined) { return elem.webkitMatchesSelector(selector); } else if (elem.mozMatchesSelector !== undefined) { return elem.mozMatchesSelector(selector); } else { throw new Error('Browser lacks native selectors'); } } }; var bypassSelector = function (dom) { return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0; }; var all = function (selector, scope) { var base = scope === undefined ? domGlobals.document : scope.dom(); return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); }; var one = function (selector, scope) { var base = scope === undefined ? domGlobals.document : scope.dom(); return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom); }; var eq = function (e1, e2) { return e1.dom() === e2.dom(); }; var regularContains = function (e1, e2) { var d1 = e1.dom(); var d2 = e2.dom(); return d1 === d2 ? false : d1.contains(d2); }; var ieContains = function (e1, e2) { return Node.documentPositionContainedBy(e1.dom(), e2.dom()); }; var browser = PlatformDetection$1.detect().browser; var contains$2 = browser.isIE() ? ieContains : regularContains; var is$1 = is; var owner = function (element) { return Element.fromDom(element.dom().ownerDocument); }; var defaultView = function (element) { return Element.fromDom(element.dom().ownerDocument.defaultView); }; var parent = function (element) { return Option.from(element.dom().parentNode).map(Element.fromDom); }; var parents = function (element, isRoot) { var stop = isFunction(isRoot) ? isRoot : never; var dom = element.dom(); var ret = []; while (dom.parentNode !== null && dom.parentNode !== undefined) { var rawParent = dom.parentNode; var p = Element.fromDom(rawParent); ret.push(p); if (stop(p) === true) { break; } else { dom = rawParent; } } return ret; }; var prevSibling = function (element) { return Option.from(element.dom().previousSibling).map(Element.fromDom); }; var nextSibling = function (element) { return Option.from(element.dom().nextSibling).map(Element.fromDom); }; var children = function (element) { return map(element.dom().childNodes, Element.fromDom); }; var child = function (element, index) { var cs = element.dom().childNodes; return Option.from(cs[index]).map(Element.fromDom); }; var firstChild = function (element) { return child(element, 0); }; var spot = Immutable('element', 'offset'); var before = function (marker, element) { var parent$1 = parent(marker); parent$1.each(function (v) { v.dom().insertBefore(element.dom(), marker.dom()); }); }; var after = function (marker, element) { var sibling = nextSibling(marker); sibling.fold(function () { var parent$1 = parent(marker); parent$1.each(function (v) { append(v, element); }); }, function (v) { before(v, element); }); }; var prepend = function (parent, element) { var firstChild$1 = firstChild(parent); firstChild$1.fold(function () { append(parent, element); }, function (v) { parent.dom().insertBefore(element.dom(), v.dom()); }); }; var append = function (parent, element) { parent.dom().appendChild(element.dom()); }; var wrap = function (element, wrapper) { before(element, wrapper); append(wrapper, element); }; var before$1 = function (marker, elements) { each(elements, function (x) { before(marker, x); }); }; var after$1 = function (marker, elements) { each(elements, function (x, i) { var e = i === 0 ? marker : elements[i - 1]; after(e, x); }); }; var append$1 = function (parent, elements) { each(elements, function (x) { append(parent, x); }); }; var empty = function (element) { element.dom().textContent = ''; each(children(element), function (rogue) { remove$2(rogue); }); }; var remove$2 = function (element) { var dom = element.dom(); if (dom.parentNode !== null) { dom.parentNode.removeChild(dom); } }; var unwrap = function (wrapper) { var children$1 = children(wrapper); if (children$1.length > 0) { before$1(wrapper, children$1); } remove$2(wrapper); }; var dimension = Immutable('width', 'height'); var dimensions = Immutable('width', 'height'); var grid = Immutable('rows', 'columns'); var address = Immutable('row', 'column'); var coords = Immutable('x', 'y'); var detail = Immutable('element', 'rowspan', 'colspan'); var detailnew = Immutable('element', 'rowspan', 'colspan', 'isNew'); var extended = Immutable('element', 'rowspan', 'colspan', 'row', 'column'); var rowdata = Immutable('element', 'cells', 'section'); var elementnew = Immutable('element', 'isNew'); var rowdatanew = Immutable('element', 'cells', 'section', 'isNew'); var rowcells = Immutable('cells', 'section'); var rowdetails = Immutable('details', 'section'); var bounds = Immutable('startRow', 'startCol', 'finishRow', 'finishCol'); var ancestors = function (scope, predicate, isRoot) { return filter(parents(scope, isRoot), predicate); }; var children$1 = function (scope, predicate) { return filter(children(scope), predicate); }; var descendants = function (scope, predicate) { var result = []; each(children(scope), function (x) { if (predicate(x)) { result = result.concat([x]); } result = result.concat(descendants(x, predicate)); }); return result; }; var ancestors$1 = function (scope, selector, isRoot) { return ancestors(scope, function (e) { return is(e, selector); }, isRoot); }; var children$2 = function (scope, selector) { return children$1(scope, function (e) { return is(e, selector); }); }; var descendants$1 = function (scope, selector) { return all(selector, scope); }; function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot); } var ancestor = function (scope, predicate, isRoot) { var element = scope.dom(); var stop = isFunction(isRoot) ? isRoot : constant(false); while (element.parentNode) { element = element.parentNode; var el = Element.fromDom(element); if (predicate(el)) { return Option.some(el); } else if (stop(el)) { break; } } return Option.none(); }; var closest = function (scope, predicate, isRoot) { var is = function (s, test) { return test(s); }; return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot); }; var child$1 = function (scope, predicate) { var pred = function (node) { return predicate(Element.fromDom(node)); }; var result = find(scope.dom().childNodes, pred); return result.map(Element.fromDom); }; var descendant = function (scope, predicate) { var descend = function (node) { for (var i = 0; i < node.childNodes.length; i++) { var child_1 = Element.fromDom(node.childNodes[i]); if (predicate(child_1)) { return Option.some(child_1); } var res = descend(node.childNodes[i]); if (res.isSome()) { return res; } } return Option.none(); }; return descend(scope.dom()); }; var ancestor$1 = function (scope, selector, isRoot) { return ancestor(scope, function (e) { return is(e, selector); }, isRoot); }; var child$2 = function (scope, selector) { return child$1(scope, function (e) { return is(e, selector); }); }; var descendant$1 = function (scope, selector) { return one(selector, scope); }; var closest$1 = function (scope, selector, isRoot) { return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot); }; var firstLayer = function (scope, selector) { return filterFirstLayer(scope, selector, constant(true)); }; var filterFirstLayer = function (scope, selector, predicate) { return bind(children(scope), function (x) { return is(x, selector) ? predicate(x) ? [x] : [] : filterFirstLayer(x, selector, predicate); }); }; var LayerSelector = { firstLayer: firstLayer, filterFirstLayer: filterFirstLayer }; var lookup = function (tags, element, isRoot) { if (isRoot === void 0) { isRoot = never; } if (isRoot(element)) { return Option.none(); } if (contains(tags, name(element))) { return Option.some(element); } var isRootOrUpperTable = function (elm) { return is(elm, 'table') || isRoot(elm); }; return ancestor$1(element, tags.join(','), isRootOrUpperTable); }; var cell = function (element, isRoot) { return lookup([ 'td', 'th' ], element, isRoot); }; var cells = function (ancestor) { return LayerSelector.firstLayer(ancestor, 'th,td'); }; var notCell = function (element, isRoot) { return lookup([ 'caption', 'tr', 'tbody', 'tfoot', 'thead' ], element, isRoot); }; var neighbours = function (selector, element) { return parent(element).map(function (parent) { return children$2(parent, selector); }); }; var neighbourCells = curry(neighbours, 'th,td'); var neighbourRows = curry(neighbours, 'tr'); var firstCell = function (ancestor) { return descendant$1(ancestor, 'th,td'); }; var table = function (element, isRoot) { return closest$1(element, 'table', isRoot); }; var row = function (element, isRoot) { return lookup(['tr'], element, isRoot); }; var rows = function (ancestor) { return LayerSelector.firstLayer(ancestor, 'tr'); }; var attr = function (element, property) { return parseInt(get(element, property), 10); }; var grid$1 = function (element, rowProp, colProp) { var rowsCount = attr(element, rowProp); var cols = attr(element, colProp); return grid(rowsCount, cols); }; var TableLookup = { cell: cell, firstCell: firstCell, cells: cells, neighbourCells: neighbourCells, table: table, row: row, rows: rows, notCell: notCell, neighbourRows: neighbourRows, attr: attr, grid: grid$1 }; var fromTable = function (table) { var rows = TableLookup.rows(table); return map(rows, function (row) { var element = row; var parent$1 = parent(element); var parentSection = parent$1.map(function (p) { var parentName = name(p); return parentName === 'tfoot' || parentName === 'thead' || parentName === 'tbody' ? parentName : 'tbody'; }).getOr('tbody'); var cells = map(TableLookup.cells(row), function (cell) { var rowspan = has(cell, 'rowspan') ? parseInt(get(cell, 'rowspan'), 10) : 1; var colspan = has(cell, 'colspan') ? parseInt(get(cell, 'colspan'), 10) : 1; return detail(cell, rowspan, colspan); }); return rowdata(element, cells, parentSection); }); }; var fromPastedRows = function (rows, example) { return map(rows, function (row) { var cells = map(TableLookup.cells(row), function (cell) { var rowspan = has(cell, 'rowspan') ? parseInt(get(cell, 'rowspan'), 10) : 1; var colspan = has(cell, 'colspan') ? parseInt(get(cell, 'colspan'), 10) : 1; return detail(cell, rowspan, colspan); }); return rowdata(row, cells, example.section()); }); }; var DetailsList = { fromTable: fromTable, fromPastedRows: fromPastedRows }; var key = function (row, column) { return row + ',' + column; }; var getAt = function (warehouse, row, column) { var raw = warehouse.access()[key(row, column)]; return raw !== undefined ? Option.some(raw) : Option.none(); }; var findItem = function (warehouse, item, comparator) { var filtered = filterItems(warehouse, function (detail) { return comparator(item, detail.element()); }); return filtered.length > 0 ? Option.some(filtered[0]) : Option.none(); }; var filterItems = function (warehouse, predicate) { var all = bind(warehouse.all(), function (r) { return r.cells(); }); return filter(all, predicate); }; var generate = function (list) { var access = {}; var cells = []; var maxRows = list.length; var maxColumns = 0; each(list, function (details, r) { var currentRow = []; each(details.cells(), function (detail) { var start = 0; while (access[key(r, start)] !== undefined) { start++; } var current = extended(detail.element(), detail.rowspan(), detail.colspan(), r, start); for (var i = 0; i < detail.colspan(); i++) { for (var j = 0; j < detail.rowspan(); j++) { var cr = r + j; var cc = start + i; var newpos = key(cr, cc); access[newpos] = current; maxColumns = Math.max(maxColumns, cc + 1); } } currentRow.push(current); }); cells.push(rowdata(details.element(), currentRow, details.section())); }); var grid$1 = grid(maxRows, maxColumns); return { grid: constant(grid$1), access: constant(access), all: constant(cells) }; }; var justCells = function (warehouse) { var rows = map(warehouse.all(), function (w) { return w.cells(); }); return flatten(rows); }; var Warehouse = { generate: generate, getAt: getAt, findItem: findItem, filterItems: filterItems, justCells: justCells }; var statsStruct = Immutable('minRow', 'minCol', 'maxRow', 'maxCol'); var findSelectedStats = function (house, isSelected) { var totalColumns = house.grid().columns(); var totalRows = house.grid().rows(); var minRow = totalRows; var minCol = totalColumns; var maxRow = 0; var maxCol = 0; each$1(house.access(), function (detail) { if (isSelected(detail)) { var startRow = detail.row(); var endRow = startRow + detail.rowspan() - 1; var startCol = detail.column(); var endCol = startCol + detail.colspan() - 1; if (startRow < minRow) { minRow = startRow; } else if (endRow > maxRow) { maxRow = endRow; } if (startCol < minCol) { minCol = startCol; } else if (endCol > maxCol) { maxCol = endCol; } } }); return statsStruct(minRow, minCol, maxRow, maxCol); }; var makeCell = function (list, seenSelected, rowIndex) { var row = list[rowIndex].element(); var td = Element.fromTag('td'); append(td, Element.fromTag('br')); var f = seenSelected ? append : prepend; f(row, td); }; var fillInGaps = function (list, house, stats, isSelected) { var totalColumns = house.grid().columns(); var totalRows = house.grid().rows(); for (var i = 0; i < totalRows; i++) { var seenSelected = false; for (var j = 0; j < totalColumns; j++) { if (!(i < stats.minRow() || i > stats.maxRow() || j < stats.minCol() || j > stats.maxCol())) { var needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone(); if (needCell) { makeCell(list, seenSelected, i); } else { seenSelected = true; } } } } }; var clean = function (table, stats) { var emptyRows = filter(LayerSelector.firstLayer(table, 'tr'), function (row) { return row.dom().childElementCount === 0; }); each(emptyRows, remove$2); if (stats.minCol() === stats.maxCol() || stats.minRow() === stats.maxRow()) { each(LayerSelector.firstLayer(table, 'th,td'), function (cell) { remove(cell, 'rowspan'); remove(cell, 'colspan'); }); } remove(table, 'width'); remove(table, 'height'); remove$1(table, 'width'); remove$1(table, 'height'); }; var extract = function (table, selectedSelector) { var isSelected = function (detail) { return is(detail.element(), selectedSelector); }; var list = DetailsList.fromTable(table); var house = Warehouse.generate(list); var stats = findSelectedStats(house, isSelected); var selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')'; var unselectedCells = LayerSelector.filterFirstLayer(table, 'th,td', function (cell) { return is(cell, selector); }); each(unselectedCells, remove$2); fillInGaps(list, house, stats, isSelected); clean(table, stats); return table; }; var CopySelected = { extract: extract }; function NodeValue (is, name) { var get = function (element) { if (!is(element)) { throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); } return getOption(element).getOr(''); }; var getOption = function (element) { return is(element) ? Option.from(element.dom().nodeValue) : Option.none(); }; var set = function (element, value) { if (!is(element)) { throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); } element.dom().nodeValue = value; }; return { get: get, getOption: getOption, set: set }; } var api = NodeValue(isText, 'text'); var get$2 = function (element) { return api.get(element); }; var getOption = function (element) { return api.getOption(element); }; var set$2 = function (element, value) { api.set(element, value); }; var getEnd = function (element) { return name(element) === 'img' ? 1 : getOption(element).fold(function () { return children(element).length; }, function (v) { return v.length; }); }; var NBSP = '\xA0'; var isTextNodeWithCursorPosition = function (el) { return getOption(el).filter(function (text) { return text.trim().length !== 0 || text.indexOf(NBSP) > -1; }).isSome(); }; var elementsWithCursorPosition = [ 'img', 'br' ]; var isCursorPosition = function (elem) { var hasCursorPosition = isTextNodeWithCursorPosition(elem); return hasCursorPosition || contains(elementsWithCursorPosition, name(elem)); }; var first = function (element) { return descendant(element, isCursorPosition); }; var last$1 = function (element) { return descendantRtl(element, isCursorPosition); }; var descendantRtl = function (scope, predicate) { var descend = function (element) { var children$1 = children(element); for (var i = children$1.length - 1; i >= 0; i--) { var child = children$1[i]; if (predicate(child)) { return Option.some(child); } var res = descend(child); if (res.isSome()) { return res; } } return Option.none(); }; return descend(scope); }; var clone$1 = function (original, isDeep) { return Element.fromDom(original.dom().cloneNode(isDeep)); }; var shallow = function (original) { return clone$1(original, false); }; var deep = function (original) { return clone$1(original, true); }; var shallowAs = function (original, tag) { var nu = Element.fromTag(tag); var attributes = clone(original); setAll(nu, attributes); return nu; }; var copy$1 = function (original, tag) { var nu = shallowAs(original, tag); var cloneChildren = children(deep(original)); append$1(nu, cloneChildren); return nu; }; var createCell = function () { var td = Element.fromTag('td'); append(td, Element.fromTag('br')); return td; }; var replace = function (cell, tag, attrs) { var replica = copy$1(cell, tag); each$1(attrs, function (v, k) { if (v === null) { remove(replica, k); } else { set(replica, k, v); } }); return replica; }; var pasteReplace = function (cell) { return cell; }; var newRow = function (doc) { return function () { return Element.fromTag('tr', doc.dom()); }; }; var cloneFormats = function (oldCell, newCell, formats) { var first$1 = first(oldCell); return first$1.map(function (firstText) { var formatSelector = formats.join(','); var parents = ancestors$1(firstText, formatSelector, function (element) { return eq(element, oldCell); }); return foldr(parents, function (last, parent) { var clonedFormat = shallow(parent); remove(clonedFormat, 'contenteditable'); append(last, clonedFormat); return clonedFormat; }, newCell); }).getOr(newCell); }; var cellOperations = function (mutate, doc, formatsToClone) { var newCell = function (prev) { var docu = owner(prev.element()); var td = Element.fromTag(name(prev.element()), docu.dom()); var formats = formatsToClone.getOr([ 'strong', 'em', 'b', 'i', 'span', 'font', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'div' ]); var lastNode = formats.length > 0 ? cloneFormats(prev.element(), td, formats) : td; append(lastNode, Element.fromTag('br')); copy(prev.element(), td); remove$1(td, 'height'); if (prev.colspan() !== 1) { remove$1(prev.element(), 'width'); } mutate(prev.element(), td); return td; }; return { row: newRow(doc), cell: newCell, replace: replace, gap: createCell }; }; var paste = function (doc) { return { row: newRow(doc), cell: createCell, replace: pasteReplace, gap: createCell }; }; var TableFill = { cellOperations: cellOperations, paste: paste }; var fromHtml$1 = function (html, scope) { var doc = scope || domGlobals.document; var div = doc.createElement('div'); div.innerHTML = html; return children(Element.fromDom(div)); }; var inSelection = function (bounds, detail) { var leftEdge = detail.column(); var rightEdge = detail.column() + detail.colspan() - 1; var topEdge = detail.row(); var bottomEdge = detail.row() + detail.rowspan() - 1; return leftEdge <= bounds.finishCol() && rightEdge >= bounds.startCol() && (topEdge <= bounds.finishRow() && bottomEdge >= bounds.startRow()); }; var isWithin = function (bounds, detail) { return detail.column() >= bounds.startCol() && detail.column() + detail.colspan() - 1 <= bounds.finishCol() && detail.row() >= bounds.startRow() && detail.row() + detail.rowspan() - 1 <= bounds.finishRow(); }; var isRectangular = function (warehouse, bounds) { var isRect = true; var detailIsWithin = curry(isWithin, bounds); for (var i = bounds.startRow(); i <= bounds.finishRow(); i++) { for (var j = bounds.startCol(); j <= bounds.finishCol(); j++) { isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin); } } return isRect ? Option.some(bounds) : Option.none(); }; var CellBounds = { inSelection: inSelection, isWithin: isWithin, isRectangular: isRectangular }; var getBounds = function (detailA, detailB) { return bounds(Math.min(detailA.row(), detailB.row()), Math.min(detailA.column(), detailB.column()), Math.max(detailA.row() + detailA.rowspan() - 1, detailB.row() + detailB.rowspan() - 1), Math.max(detailA.column() + detailA.colspan() - 1, detailB.column() + detailB.colspan() - 1)); }; var getAnyBox = function (warehouse, startCell, finishCell) { var startCoords = Warehouse.findItem(warehouse, startCell, eq); var finishCoords = Warehouse.findItem(warehouse, finishCell, eq); return startCoords.bind(function (sc) { return finishCoords.map(function (fc) { return getBounds(sc, fc); }); }); }; var getBox = function (warehouse, startCell, finishCell) { return getAnyBox(warehouse, startCell, finishCell).bind(function (bounds) { return CellBounds.isRectangular(warehouse, bounds); }); }; var CellGroup = { getAnyBox: getAnyBox, getBox: getBox }; var moveBy = function (warehouse, cell, row, column) { return Warehouse.findItem(warehouse, cell, eq).bind(function (detail) { var startRow = row > 0 ? detail.row() + detail.rowspan() - 1 : detail.row(); var startCol = column > 0 ? detail.column() + detail.colspan() - 1 : detail.column(); var dest = Warehouse.getAt(warehouse, startRow + row, startCol + column); return dest.map(function (d) { return d.element(); }); }); }; var intercepts = function (warehouse, start, finish) { return CellGroup.getAnyBox(warehouse, start, finish).map(function (bounds) { var inside = Warehouse.filterItems(warehouse, curry(CellBounds.inSelection, bounds)); return map(inside, function (detail) { return detail.element(); }); }); }; var parentCell = function (warehouse, innerCell) { var isContainedBy = function (c1, c2) { return contains$2(c2, c1); }; return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(function (detail) { return detail.element(); }); }; var CellFinder = { moveBy: moveBy, intercepts: intercepts, parentCell: parentCell }; var moveBy$1 = function (cell, deltaRow, deltaColumn) { return TableLookup.table(cell).bind(function (table) { var warehouse = getWarehouse(table); return CellFinder.moveBy(warehouse, cell, deltaRow, deltaColumn); }); }; var intercepts$1 = function (table, first, last) { var warehouse = getWarehouse(table); return CellFinder.intercepts(warehouse, first, last); }; var nestedIntercepts = function (table, first, firstTable, last, lastTable) { var warehouse = getWarehouse(table); var optStartCell = eq(table, firstTable) ? Option.some(first) : CellFinder.parentCell(warehouse, first); var optLastCell = eq(table, lastTable) ? Option.some(last) : CellFinder.parentCell(warehouse, last); return optStartCell.bind(function (startCell) { return optLastCell.bind(function (lastCell) { return CellFinder.intercepts(warehouse, startCell, lastCell); }); }); }; var getBox$1 = function (table, first, last) { var warehouse = getWarehouse(table); return CellGroup.getBox(warehouse, first, last); }; var getWarehouse = function (table) { var list = DetailsList.fromTable(table); return Warehouse.generate(list); }; var TablePositions = { moveBy: moveBy$1, intercepts: intercepts$1, nestedIntercepts: nestedIntercepts, getBox: getBox$1 }; var TagBoundaries = [ 'body', 'p', 'div', 'article', 'aside', 'figcaption', 'figure', 'footer', 'header', 'nav', 'section', 'ol', 'ul', 'li', 'table', 'thead', 'tbody', 'tfoot', 'caption', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pre', 'address' ]; function DomUniverse () { var clone$1 = function (element) { return Element.fromDom(element.dom().cloneNode(false)); }; var document = function (element) { return element.dom().ownerDocument; }; var isBoundary = function (element) { if (!isElement(element)) { return false; } if (name(element) === 'body') { return true; } return contains(TagBoundaries, name(element)); }; var isEmptyTag = function (element) { if (!isElement(element)) { return false; } return contains([ 'br', 'img', 'hr', 'input' ], name(element)); }; var comparePosition = function (element, other) { return element.dom().compareDocumentPosition(other.dom()); }; var copyAttributesTo = function (source, destination) { var as = clone(source); setAll(destination, as); }; return { up: constant({ selector: ancestor$1, closest: closest$1, predicate: ancestor, all: parents }), down: constant({ selector: descendants$1, predicate: descendants }), styles: constant({ get: get$1, getRaw: getRaw, set: set$1, remove: remove$1 }), attrs: constant({ get: get, set: set, remove: remove, copyTo: copyAttributesTo }), insert: constant({ before: before, after: after, afterAll: after$1, append: append, appendAll: append$1, prepend: prepend, wrap: wrap }), remove: constant({ unwrap: unwrap, remove: remove$2 }), create: constant({ nu: Element.fromTag, clone: clone$1, text: Element.fromText }), query: constant({ comparePosition: comparePosition, prevSibling: prevSibling, nextSibling: nextSibling }), property: constant({ children: children, name: name, parent: parent, document: document, isText: isText, isComment: isComment, isElement: isElement, getText: get$2, setText: set$2, isBoundary: isBoundary, isEmptyTag: isEmptyTag }), eq: eq, is: is$1 }; } var leftRight = Immutable('left', 'right'); var brokenPath = Immutable('first', 'second', 'splits'); var bisect = function (universe, parent, child) { var children = universe.property().children(parent); var index = findIndex(children, curry(universe.eq, child)); return index.map(function (ind) { return { before: constant(children.slice(0, ind)), after: constant(children.slice(ind + 1)) }; }); }; var breakToRight = function (universe, parent, child) { return bisect(universe, parent, child).map(function (parts) { var second = universe.create().clone(parent); universe.insert().appendAll(second, parts.after()); universe.insert().after(parent, second); return leftRight(parent, second); }); }; var breakToLeft = function (universe, parent, child) { return bisect(universe, parent, child).map(function (parts) { var prior = universe.create().clone(parent); universe.insert().appendAll(prior, parts.before().concat([child])); universe.insert().appendAll(parent, parts.after()); universe.insert().before(parent, prior); return leftRight(prior, parent); }); }; var breakPath = function (universe, item, isTop, breaker) { var next = function (child, group, splits) { var fallback = brokenPath(child, Option.none(), splits); if (isTop(child)) { return brokenPath(child, group, splits); } else { return universe.property().parent(child).bind(function (parent) { return breaker(universe, parent, child).map(function (breakage) { var extra = [{ first: breakage.left, second: breakage.right }]; var nextChild = isTop(parent) ? parent : breakage.left(); return next(nextChild, Option.some(breakage.right()), splits.concat(extra)); }); }).getOr(fallback); } }; return next(item, Option.none(), []); }; var all$1 = function (universe, look, elements, f) { var head = elements[0]; var tail = elements.slice(1); return f(universe, look, head, tail); }; var oneAll = function (universe, look, elements) { return elements.length > 0 ? all$1(universe, look, elements, unsafeOne) : Option.none(); }; var unsafeOne = function (universe, look, head, tail) { var start = look(universe, head); return foldr(tail, function (b, a) { var current = look(universe, a); return commonElement(universe, b, current); }, start); }; var commonElement = function (universe, start, end) { return start.bind(function (s) { return end.filter(curry(universe.eq, s)); }); }; var eq$1 = function (universe, item) { return curry(universe.eq, item); }; var unsafeSubset = function (universe, common, ps1, ps2) { var children = universe.property().children(common); if (universe.eq(common, ps1[0])) { return Option.some([ps1[0]]); } if (universe.eq(common, ps2[0])) { return Option.some([ps2[0]]); } var finder = function (ps) { var topDown = reverse(ps); var index = findIndex(topDown, eq$1(universe, common)).getOr(-1); var item = index < topDown.length - 1 ? topDown[index + 1] : topDown[index]; return findIndex(children, eq$1(universe, item)); }; var startIndex = finder(ps1); var endIndex = finder(ps2); return startIndex.bind(function (sIndex) { return endIndex.map(function (eIndex) { var first = Math.min(sIndex, eIndex); var last = Math.max(sIndex, eIndex); return children.slice(first, last + 1); }); }); }; var ancestors$2 = function (universe, start, end, isRoot) { if (isRoot === void 0) { isRoot = never; } var ps1 = [start].concat(universe.up().all(start)); var ps2 = [end].concat(universe.up().all(end)); var prune = function (path) { var index = findIndex(path, isRoot); return index.fold(function () { return path; }, function (ind) { return path.slice(0, ind + 1); }); }; var pruned1 = prune(ps1); var pruned2 = prune(ps2); var shared = find(pruned1, function (x) { return exists(pruned2, eq$1(universe, x)); }); return { firstpath: constant(pruned1), secondpath: constant(pruned2), shared: constant(shared) }; }; var subset = function (universe, start, end) { var ancs = ancestors$2(universe, start, end); return ancs.shared().bind(function (shared) { return unsafeSubset(universe, shared, ancs.firstpath(), ancs.secondpath()); }); }; var SubsetFn = { subset: subset, ancestors: ancestors$2 }; var sharedOne = oneAll; var subset$1 = SubsetFn.subset; var ancestors$3 = SubsetFn.ancestors; var breakToLeft$1 = breakToLeft; var breakToRight$1 = breakToRight; var breakPath$1 = breakPath; var Parent = { sharedOne: sharedOne, subset: subset$1, ancestors: ancestors$3, breakToLeft: breakToLeft$1, breakToRight: breakToRight$1, breakPath: breakPath$1 }; var universe = DomUniverse(); var sharedOne$1 = function (look, elements) { return Parent.sharedOne(universe, function (_universe, element) { return look(element); }, elements); }; var subset$2 = function (start, finish) { return Parent.subset(universe, start, finish); }; var ancestors$4 = function (start, finish, isRoot) { return Parent.ancestors(universe, start, finish, isRoot); }; var breakToLeft$2 = function (parent, child) { return Parent.breakToLeft(universe, parent, child); }; var breakToRight$2 = function (parent, child) { return Parent.breakToRight(universe, parent, child); }; var breakPath$2 = function (child, isTop, breaker) { return Parent.breakPath(universe, child, isTop, function (u, p, c) { return breaker(p, c); }); }; var DomParent = { sharedOne: sharedOne$1, subset: subset$2, ancestors: ancestors$4, breakToLeft: breakToLeft$2, breakToRight: breakToRight$2, breakPath: breakPath$2 }; var create = MixedBag([ 'boxes', 'start', 'finish' ], []); var Identified = { create: create }; var lookupTable = function (container) { return ancestor$1(container, 'table'); }; var identify = function (start, finish, isRoot) { var getIsRoot = function (rootTable) { return function (element) { return isRoot !== undefined && isRoot(element) || eq(element, rootTable); }; }; if (eq(start, finish)) { return Option.some(Identified.create({ boxes: Option.some([start]), start: start, finish: finish })); } else { return lookupTable(start).bind(function (startTable) { return lookupTable(finish).bind(function (finishTable) { if (eq(startTable, finishTable)) { return Option.some(Identified.create({ boxes: TablePositions.intercepts(startTable, start, finish), start: start, finish: finish })); } else if (contains$2(startTable, finishTable)) { var ancestorCells = ancestors$1(finish, 'td,th', getIsRoot(startTable)); var finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish; return Option.some(Identified.create({ boxes: TablePositions.nestedIntercepts(startTable, start, startTable, finish, finishTable), start: start, finish: finishCell })); } else if (contains$2(finishTable, startTable)) { var ancestorCells = ancestors$1(start, 'td,th', getIsRoot(finishTable)); var startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start; return Option.some(Identified.create({ boxes: TablePositions.nestedIntercepts(finishTable, start, startTable, finish, finishTable), start: start, finish: startCell })); } else { return DomParent.ancestors(start, finish).shared().bind(function (lca) { return closest$1(lca, 'table', isRoot).bind(function (lcaTable) { var finishAncestorCells = ancestors$1(finish, 'td,th', getIsRoot(lcaTable)); var finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish; var startAncestorCells = ancestors$1(start, 'td,th', getIsRoot(lcaTable)); var startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start; return Option.some(Identified.create({ boxes: TablePositions.nestedIntercepts(lcaTable, start, startTable, finish, finishTable), start: startCell, finish: finishCell })); }); }); } }); }); } }; var retrieve = function (container, selector) { var sels = descendants$1(container, selector); return sels.length > 0 ? Option.some(sels) : Option.none(); }; var getLast = function (boxes, lastSelectedSelector) { return find(boxes, function (box) { return is(box, lastSelectedSelector); }); }; var getEdges = function (container, firstSelectedSelector, lastSelectedSelector) { return descendant$1(container, firstSelectedSelector).bind(function (first) { return descendant$1(container, lastSelectedSelector).bind(function (last) { return DomParent.sharedOne(lookupTable, [ first, last ]).map(function (tbl) { return { first: constant(first), last: constant(last), table: constant(tbl) }; }); }); }); }; var expandTo = function (finish, firstSelectedSelector) { return ancestor$1(finish, 'table').bind(function (table) { return descendant$1(table, firstSelectedSelector).bind(function (start) { return identify(start, finish).bind(function (identified) { return identified.boxes().map(function (boxes) { return { boxes: constant(boxes), start: constant(identified.start()), finish: constant(identified.finish()) }; }); }); }); }); }; var shiftSelection = function (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) { return getLast(boxes, lastSelectedSelector).bind(function (last) { return TablePositions.moveBy(last, deltaRow, deltaColumn).bind(function (finish) { return expandTo(finish, firstSelectedSelector); }); }); }; var CellSelection = { identify: identify, retrieve: retrieve, shiftSelection: shiftSelection, getEdges: getEdges }; var retrieve$1 = function (container, selector) { return CellSelection.retrieve(container, selector); }; var retrieveBox = function (container, firstSelectedSelector, lastSelectedSelector) { return CellSelection.getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(function (edges) { var isRoot = function (ancestor) { return eq(container, ancestor); }; var firstAncestor = ancestor$1(edges.first(), 'thead,tfoot,tbody,table', isRoot); var lastAncestor = ancestor$1(edges.last(), 'thead,tfoot,tbody,table', isRoot); return firstAncestor.bind(function (fA) { return lastAncestor.bind(function (lA) { return eq(fA, lA) ? TablePositions.getBox(edges.table(), edges.first(), edges.last()) : Option.none(); }); }); }); }; var TableSelection = { retrieve: retrieve$1, retrieveBox: retrieveBox }; var selected = 'data-mce-selected'; var selectedSelector = 'td[' + selected + '],th[' + selected + ']'; var attributeSelector = '[' + selected + ']'; var firstSelected = 'data-mce-first-selected'; var firstSelectedSelector = 'td[' + firstSelected + '],th[' + firstSelected + ']'; var lastSelected = 'data-mce-last-selected'; var lastSelectedSelector = 'td[' + lastSelected + '],th[' + lastSelected + ']'; var Ephemera = { selected: constant(selected), selectedSelector: constant(selectedSelector), attributeSelector: constant(attributeSelector), firstSelected: constant(firstSelected), firstSelectedSelector: constant(firstSelectedSelector), lastSelected: constant(lastSelected), lastSelectedSelector: constant(lastSelectedSelector) }; var generate$1 = function (cases) { if (!isArray(cases)) { throw new Error('cases must be an array'); } if (cases.length === 0) { throw new Error('there must be at least one case'); } var constructors = []; var adt = {}; each(cases, function (acase, count) { var keys$1 = keys(acase); if (keys$1.length !== 1) { throw new Error('one and only one name per case'); } var key = keys$1[0]; var value = acase[key]; if (adt[key] !== undefined) { throw new Error('duplicate key detected:' + key); } else if (key === 'cata') { throw new Error('cannot have a case named cata (sorry)'); } else if (!isArray(value)) { throw new Error('case arguments must be an array'); } constructors.push(key); adt[key] = function () { var argLength = arguments.length; if (argLength !== value.length) { throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); } var args = new Array(argLength); for (var i = 0; i < args.length; i++) { args[i] = arguments[i]; } var match = function (branches) { var branchKeys = keys(branches); if (constructors.length !== branchKeys.length) { throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); } var allReqd = forall(constructors, function (reqKey) { return contains(branchKeys, reqKey); }); if (!allReqd) { throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); } return branches[key].apply(null, args); }; return { fold: function () { if (arguments.length !== cases.length) { throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length); } var target = arguments[count]; return target.apply(null, args); }, match: match, log: function (label) { domGlobals.console.log(label, { constructors: constructors, constructor: key, params: args }); } }; }; }); return adt; }; var Adt = { generate: generate$1 }; var type$1 = Adt.generate([ { none: [] }, { multiple: ['elements'] }, { single: ['selection'] } ]); var cata = function (subject, onNone, onMultiple, onSingle) { return subject.fold(onNone, onMultiple, onSingle); }; var SelectionTypes = { cata: cata, none: type$1.none, multiple: type$1.multiple, single: type$1.single }; var selection = function (cell, selections) { return SelectionTypes.cata(selections.get(), constant([]), identity, constant([cell])); }; var unmergable = function (cell, selections) { var hasSpan = function (elem) { return has(elem, 'rowspan') && parseInt(get(elem, 'rowspan'), 10) > 1 || has(elem, 'colspan') && parseInt(get(elem, 'colspan'), 10) > 1; }; var candidates = selection(cell, selections); return candidates.length > 0 && forall(candidates, hasSpan) ? Option.some(candidates) : Option.none(); }; var mergable = function (table, selections) { return SelectionTypes.cata(selections.get(), Option.none, function (cells, _env) { if (cells.length === 0) { return Option.none(); } return TableSelection.retrieveBox(table, Ephemera.firstSelectedSelector(), Ephemera.lastSelectedSelector()).bind(function (bounds) { return cells.length > 1 ? Option.some({ bounds: constant(bounds), cells: constant(cells) }) : Option.none(); }); }, Option.none); }; var CellOperations = { mergable: mergable, unmergable: unmergable, selection: selection }; var noMenu = function (cell) { return { element: constant(cell), mergable: Option.none, unmergable: Option.none, selection: constant([cell]) }; }; var forMenu = function (selections, table, cell) { return { element: constant(cell), mergable: constant(CellOperations.mergable(table, selections)), unmergable: constant(CellOperations.unmergable(cell, selections)), selection: constant(CellOperations.selection(cell, selections)) }; }; var notCell$1 = function (element) { return noMenu(element); }; var paste$1 = Immutable('element', 'clipboard', 'generators'); var pasteRows = function (selections, table, cell, clipboard, generators) { return { element: constant(cell), mergable: Option.none, unmergable: Option.none, selection: constant(CellOperations.selection(cell, selections)), clipboard: constant(clipboard), generators: constant(generators) }; }; var TableTargets = { noMenu: noMenu, forMenu: forMenu, notCell: notCell$1, paste: paste$1, pasteRows: pasteRows }; var extractSelected = function (cells) { return TableLookup.table(cells[0]).map(deep).map(function (replica) { return [CopySelected.extract(replica, Ephemera.attributeSelector())]; }); }; var serializeElements = function (editor, elements) { return map(elements, function (elm) { return editor.selection.serializer.serialize(elm.dom(), {}); }).join(''); }; var getTextContent = function (elements) { return map(elements, function (element) { return element.dom().innerText; }).join(''); }; var registerEvents = function (editor, selections, actions, cellSelection) { editor.on('BeforeGetContent', function (e) { var multiCellContext = function (cells) { e.preventDefault(); extractSelected(cells).each(function (elements) { e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements); }); }; if (e.selection === true) { SelectionTypes.cata(selections.get(), noop, multiCellContext, noop); } }); editor.on('BeforeSetContent', function (e) { if (e.selection === true && e.paste === true) { var cellOpt = Option.from(editor.dom.getParent(editor.selection.getStart(), 'th,td')); cellOpt.each(function (domCell) { var cell = Element.fromDom(domCell); TableLookup.table(cell).each(function (table) { var elements = filter(fromHtml$1(e.content), function (content) { return name(content) !== 'meta'; }); if (elements.length === 1 && name(elements[0]) === 'table') { e.preventDefault(); var doc = Element.fromDom(editor.getDoc()); var generators = TableFill.paste(doc); var targets = TableTargets.paste(cell, elements[0], generators); actions.pasteCells(table, targets).each(function (rng) { editor.selection.setRng(rng); editor.focus(); cellSelection.clear(table); }); } }); }); } }); }; var Clipboard = { registerEvents: registerEvents }; function Dimension (name, getOffset) { var set = function (element, h) { if (!isNumber(h) && !h.match(/^[0-9]+$/)) { throw new Error(name + '.set accepts only positive integer values. Value was ' + h); } var dom = element.dom(); if (isSupported(dom)) { dom.style[name] = h + 'px'; } }; var get = function (element) { var r = getOffset(element); if (r <= 0 || r === null) { var css = get$1(element, name); return parseFloat(css) || 0; } return r; }; var getOuter = get; var aggregate = function (element, properties) { return foldl(properties, function (acc, property) { var val = get$1(element, property); var value = val === undefined ? 0 : parseInt(val, 10); return isNaN(value) ? acc : acc + value; }, 0); }; var max = function (element, value, properties) { var cumulativeInclusions = aggregate(element, properties); var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; return absoluteMax; }; return { set: set, get: get, getOuter: getOuter, aggregate: aggregate, max: max }; } var api$1 = Dimension('height', function (element) { var dom = element.dom(); return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; }); var get$3 = function (element) { return api$1.get(element); }; var getOuter = function (element) { return api$1.getOuter(element); }; var api$2 = Dimension('width', function (element) { return element.dom().offsetWidth; }); var get$4 = function (element) { return api$2.get(element); }; var getOuter$1 = function (element) { return api$2.getOuter(element); }; var platform = PlatformDetection$1.detect(); var needManualCalc = function () { return platform.browser.isIE() || platform.browser.isEdge(); }; var toNumber = function (px, fallback) { var num = parseFloat(px); return isNaN(num) ? fallback : num; }; var getProp = function (elm, name, fallback) { return toNumber(get$1(elm, name), fallback); }; var getCalculatedHeight = function (cell) { var paddingTop = getProp(cell, 'padding-top', 0); var paddingBottom = getProp(cell, 'padding-bottom', 0); var borderTop = getProp(cell, 'border-top-width', 0); var borderBottom = getProp(cell, 'border-bottom-width', 0); var height = cell.dom().getBoundingClientRect().height; var boxSizing = get$1(cell, 'box-sizing'); var borders = borderTop + borderBottom; return boxSizing === 'border-box' ? height : height - paddingTop - paddingBottom - borders; }; var getWidth = function (cell) { return getProp(cell, 'width', get$4(cell)); }; var getHeight = function (cell) { return needManualCalc() ? getCalculatedHeight(cell) : getProp(cell, 'height', get$3(cell)); }; var RuntimeSize = { getWidth: getWidth, getHeight: getHeight }; var genericSizeRegex = /(\d+(\.\d+)?)(\w|%)*/; var percentageBasedSizeRegex = /(\d+(\.\d+)?)%/; var pixelBasedSizeRegex = /(\d+(\.\d+)?)px|em/; var setPixelWidth = function (cell, amount) { set$1(cell, 'width', amount + 'px'); }; var setPercentageWidth = function (cell, amount) { set$1(cell, 'width', amount + '%'); }; var setHeight = function (cell, amount) { set$1(cell, 'height', amount + 'px'); }; var getHeightValue = function (cell) { return getRaw(cell, 'height').getOrThunk(function () { return RuntimeSize.getHeight(cell) + 'px'; }); }; var convert = function (cell, number, getter, setter) { var newSize = TableLookup.table(cell).map(function (table) { var total = getter(table); return Math.floor(number / 100 * total); }).getOr(number); setter(cell, newSize); return newSize; }; var normalizePixelSize = function (value, cell, getter, setter) { var number = parseInt(value, 10); return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number; }; var getTotalHeight = function (cell) { var value = getHeightValue(cell); if (!value) { return get$3(cell); } return normalizePixelSize(value, cell, get$3, setHeight); }; var get$5 = function (cell, type, f) { var v = f(cell); var span = getSpan(cell, type); return v / span; }; var getSpan = function (cell, type) { return has(cell, type) ? parseInt(get(cell, type), 10) : 1; }; var getRawWidth = function (element) { var cssWidth = getRaw(element, 'width'); return cssWidth.fold(function () { return Option.from(get(element, 'width')); }, function (width) { return Option.some(width); }); }; var normalizePercentageWidth = function (cellWidth, tableSize) { return cellWidth / tableSize.pixelWidth() * 100; }; var choosePercentageSize = function (element, width, tableSize) { var percentMatch = percentageBasedSizeRegex.exec(width); if (percentMatch !== null) { return parseFloat(percentMatch[1]); } else { var intWidth = get$4(element); return normalizePercentageWidth(intWidth, tableSize); } }; var getPercentageWidth = function (cell, tableSize) { var width = getRawWidth(cell); return width.fold(function () { var intWidth = get$4(cell); return normalizePercentageWidth(intWidth, tableSize); }, function (w) { return choosePercentageSize(cell, w, tableSize); }); }; var normalizePixelWidth = function (cellWidth, tableSize) { return cellWidth / 100 * tableSize.pixelWidth(); }; var choosePixelSize = function (element, width, tableSize) { var pixelMatch = pixelBasedSizeRegex.exec(width); if (pixelMatch !== null) { return parseInt(pixelMatch[1], 10); } var percentMatch = percentageBasedSizeRegex.exec(width); if (percentMatch !== null) { var floatWidth = parseFloat(percentMatch[1]); return normalizePixelWidth(floatWidth, tableSize); } return get$4(element); }; var getPixelWidth = function (cell, tableSize) { var width = getRawWidth(cell); return width.fold(function () { return get$4(cell); }, function (w) { return choosePixelSize(cell, w, tableSize); }); }; var getHeight$1 = function (cell) { return get$5(cell, 'rowspan', getTotalHeight); }; var getGenericWidth = function (cell) { var width = getRawWidth(cell); return width.bind(function (w) { var match = genericSizeRegex.exec(w); if (match !== null) { return Option.some({ width: constant(parseFloat(match[1])), unit: constant(match[3]) }); } else { return Option.none(); } }); }; var setGenericWidth = function (cell, amount, unit) { set$1(cell, 'width', amount + unit); }; var Sizes = { percentageBasedSizeRegex: constant(percentageBasedSizeRegex), pixelBasedSizeRegex: constant(pixelBasedSizeRegex), setPixelWidth: setPixelWidth, setPercentageWidth: setPercentageWidth, setHeight: setHeight, getPixelWidth: getPixelWidth, getPercentageWidth: getPercentageWidth, getGenericWidth: getGenericWidth, setGenericWidth: setGenericWidth, getHeight: getHeight$1, getRawWidth: getRawWidth }; var halve = function (main, other) { var width = Sizes.getGenericWidth(main); width.each(function (w) { var newWidth = w.width() / 2; Sizes.setGenericWidth(main, newWidth, w.unit()); Sizes.setGenericWidth(other, newWidth, w.unit()); }); }; var CellMutations = { halve: halve }; var r = function (left, top) { var translate = function (x, y) { return r(left + x, top + y); }; return { left: constant(left), top: constant(top), translate: translate }; }; var Position = r; var boxPosition = function (dom) { var box = dom.getBoundingClientRect(); return Position(box.left, box.top); }; var firstDefinedOrZero = function (a, b) { return a !== undefined ? a : b !== undefined ? b : 0; }; var absolute = function (element) { var doc = element.dom().ownerDocument; var body = doc.body; var win = doc.defaultView; var html = doc.documentElement; var scrollTop = firstDefinedOrZero(win.pageYOffset, html.scrollTop); var scrollLeft = firstDefinedOrZero(win.pageXOffset, html.scrollLeft); var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); }; var viewport = function (element) { var dom = element.dom(); var doc = dom.ownerDocument; var body = doc.body; if (body === dom) { return Position(body.offsetLeft, body.offsetTop); } if (!inBody(element)) { return Position(0, 0); } return boxPosition(dom); }; var rowInfo = Immutable('row', 'y'); var colInfo = Immutable('col', 'x'); var rtlEdge = function (cell) { var pos = absolute(cell); return pos.left() + getOuter$1(cell); }; var ltrEdge = function (cell) { return absolute(cell).left(); }; var getLeftEdge = function (index, cell) { return colInfo(index, ltrEdge(cell)); }; var getRightEdge = function (index, cell) { return colInfo(index, rtlEdge(cell)); }; var getTop = function (cell) { return absolute(cell).top(); }; var getTopEdge = function (index, cell) { return rowInfo(index, getTop(cell)); }; var getBottomEdge = function (index, cell) { return rowInfo(index, getTop(cell) + getOuter(cell)); }; var findPositions = function (getInnerEdge, getOuterEdge, array) { if (array.length === 0) { return []; } var lines = map(array.slice(1), function (cellOption, index) { return cellOption.map(function (cell) { return getInnerEdge(index, cell); }); }); var lastLine = array[array.length - 1].map(function (cell) { return getOuterEdge(array.length - 1, cell); }); return lines.concat([lastLine]); }; var negate = function (step) { return -step; }; var height = { delta: identity, positions: function (optElements) { return findPositions(getTopEdge, getBottomEdge, optElements); }, edge: getTop }; var ltr = { delta: identity, edge: ltrEdge, positions: function (optElements) { return findPositions(getLeftEdge, getRightEdge, optElements); } }; var rtl = { delta: negate, edge: rtlEdge, positions: function (optElements) { return findPositions(getRightEdge, getLeftEdge, optElements); } }; var BarPositions = { height: height, rtl: rtl, ltr: ltr }; var ResizeDirection = { ltr: BarPositions.ltr, rtl: BarPositions.rtl }; function TableDirection (directionAt) { var auto = function (table) { return directionAt(table).isRtl() ? ResizeDirection.rtl : ResizeDirection.ltr; }; var delta = function (amount, table) { return auto(table).delta(amount, table); }; var positions = function (cols, table) { return auto(table).positions(cols, table); }; var edge = function (cell) { return auto(cell).edge(cell); }; return { delta: delta, edge: edge, positions: positions }; } var getGridSize = function (table) { var input = DetailsList.fromTable(table); var warehouse = Warehouse.generate(input); return warehouse.grid(); }; var TableGridSize = { getGridSize: getGridSize }; var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var cat = function (arr) { var r = []; var push = function (x) { r.push(x); }; for (var i = 0; i < arr.length; i++) { arr[i].each(push); } return r; }; var findMap = function (arr, f) { for (var i = 0; i < arr.length; i++) { var r = f(arr[i], i); if (r.isSome()) { return r; } } return Option.none(); }; var setIfNot = function (element, property, value, ignore) { if (value === ignore) { remove(element, property); } else { set(element, property, value); } }; var render = function (table, grid) { var newRows = []; var newCells = []; var renderSection = function (gridSection, sectionName) { var section = child$2(table, sectionName).getOrThunk(function () { var tb = Element.fromTag(sectionName, owner(table).dom()); append(table, tb); return tb; }); empty(section); var rows = map(gridSection, function (row) { if (row.isNew()) { newRows.push(row.element()); } var tr = row.element(); empty(tr); each(row.cells(), function (cell) { if (cell.isNew()) { newCells.push(cell.element()); } setIfNot(cell.element(), 'colspan', cell.colspan(), 1); setIfNot(cell.element(), 'rowspan', cell.rowspan(), 1); append(tr, cell.element()); }); return tr; }); append$1(section, rows); }; var removeSection = function (sectionName) { child$2(table, sectionName).each(remove$2); }; var renderOrRemoveSection = function (gridSection, sectionName) { if (gridSection.length > 0) { renderSection(gridSection, sectionName); } else { removeSection(sectionName); } }; var headSection = []; var bodySection = []; var footSection = []; each(grid, function (row) { switch (row.section()) { case 'thead': headSection.push(row); break; case 'tbody': bodySection.push(row); break; case 'tfoot': footSection.push(row); break; } }); renderOrRemoveSection(headSection, 'thead'); renderOrRemoveSection(bodySection, 'tbody'); renderOrRemoveSection(footSection, 'tfoot'); return { newRows: constant(newRows), newCells: constant(newCells) }; }; var copy$2 = function (grid) { var rows = map(grid, function (row) { var tr = shallow(row.element()); each(row.cells(), function (cell) { var clonedCell = deep(cell.element()); setIfNot(clonedCell, 'colspan', cell.colspan(), 1); setIfNot(clonedCell, 'rowspan', cell.rowspan(), 1); append(tr, clonedCell); }); return tr; }); return rows; }; var Redraw = { render: render, copy: copy$2 }; var read = function (element, attr) { var value = get(element, attr); return value === undefined || value === '' ? [] : value.split(' '); }; var add = function (element, attr, id) { var old = read(element, attr); var nu = old.concat([id]); set(element, attr, nu.join(' ')); return true; }; var remove$3 = function (element, attr, id) { var nu = filter(read(element, attr), function (v) { return v !== id; }); if (nu.length > 0) { set(element, attr, nu.join(' ')); } else { remove(element, attr); } return false; }; var supports = function (element) { return element.dom().classList !== undefined; }; var get$6 = function (element) { return read(element, 'class'); }; var add$1 = function (element, clazz) { return add(element, 'class', clazz); }; var remove$4 = function (element, clazz) { return remove$3(element, 'class', clazz); }; var add$2 = function (element, clazz) { if (supports(element)) { element.dom().classList.add(clazz); } else { add$1(element, clazz); } }; var cleanClass = function (element) { var classList = supports(element) ? element.dom().classList : get$6(element); if (classList.length === 0) { remove(element, 'class'); } }; var remove$5 = function (element, clazz) { if (supports(element)) { var classList = element.dom().classList; classList.remove(clazz); } else { remove$4(element, clazz); } cleanClass(element); }; var has$1 = function (element, clazz) { return supports(element) && element.dom().classList.contains(clazz); }; var repeat = function (repititions, f) { var r = []; for (var i = 0; i < repititions; i++) { r.push(f(i)); } return r; }; var range = function (start, end) { var r = []; for (var i = start; i < end; i++) { r.push(i); } return r; }; var deduce = function (xs, index) { if (index < 0 || index >= xs.length - 1) { return Option.none(); } var current = xs[index].fold(function () { var rest = reverse(xs.slice(0, index)); return findMap(rest, function (a, i) { return a.map(function (aa) { return { value: aa, delta: i + 1 }; }); }); }, function (c) { return Option.some({ value: c, delta: 0 }); }); var next = xs[index + 1].fold(function () { var rest = xs.slice(index + 1); return findMap(rest, function (a, i) { return a.map(function (aa) { return { value: aa, delta: i + 1 }; }); }); }, function (n) { return Option.some({ value: n, delta: 1 }); }); return current.bind(function (c) { return next.map(function (n) { var extras = n.delta + c.delta; return Math.abs(n.value - c.value) / extras; }); }); }; var columns = function (warehouse) { var grid = warehouse.grid(); var cols = range(0, grid.columns()); var rowsArr = range(0, grid.rows()); return map(cols, function (col) { var getBlock = function () { return bind(rowsArr, function (r) { return Warehouse.getAt(warehouse, r, col).filter(function (detail) { return detail.column() === col; }).fold(constant([]), function (detail) { return [detail]; }); }); }; var isSingle = function (detail) { return detail.colspan() === 1; }; var getFallback = function () { return Warehouse.getAt(warehouse, 0, col); }; return decide(getBlock, isSingle, getFallback); }); }; var decide = function (getBlock, isSingle, getFallback) { var inBlock = getBlock(); var singleInBlock = find(inBlock, isSingle); var detailOption = singleInBlock.orThunk(function () { return Option.from(inBlock[0]).orThunk(getFallback); }); return detailOption.map(function (detail) { return detail.element(); }); }; var rows$1 = function (warehouse) { var grid = warehouse.grid(); var rowsArr = range(0, grid.rows()); var cols = range(0, grid.columns()); return map(rowsArr, function (row) { var getBlock = function () { return bind(cols, function (c) { return Warehouse.getAt(warehouse, row, c).filter(function (detail) { return detail.row() === row; }).fold(constant([]), function (detail) { return [detail]; }); }); }; var isSingle = function (detail) { return detail.rowspan() === 1; }; var getFallback = function () { return Warehouse.getAt(warehouse, row, 0); }; return decide(getBlock, isSingle, getFallback); }); }; var Blocks = { columns: columns, rows: rows$1 }; var css = function (namespace) { var dashNamespace = namespace.replace(/\./g, '-'); var resolve = function (str) { return dashNamespace + '-' + str; }; return { resolve: resolve }; }; var styles = css('ephox-snooker'); var Styles = { resolve: styles.resolve }; var col = function (column, x, y, w, h) { var blocker = Element.fromTag('div'); setAll$1(blocker, { position: 'absolute', left: x - w / 2 + 'px', top: y + 'px', height: h + 'px', width: w + 'px' }); setAll(blocker, { 'data-column': column, 'role': 'presentation' }); return blocker; }; var row$1 = function (r, x, y, w, h) { var blocker = Element.fromTag('div'); setAll$1(blocker, { position: 'absolute', left: x + 'px', top: y - h / 2 + 'px', height: h + 'px', width: w + 'px' }); setAll(blocker, { 'data-row': r, 'role': 'presentation' }); return blocker; }; var Bar = { col: col, row: row$1 }; var resizeBar = Styles.resolve('resizer-bar'); var resizeRowBar = Styles.resolve('resizer-rows'); var resizeColBar = Styles.resolve('resizer-cols'); var BAR_THICKNESS = 7; var destroy = function (wire) { var previous = descendants$1(wire.parent(), '.' + resizeBar); each(previous, remove$2); }; var drawBar = function (wire, positions, create) { var origin = wire.origin(); each(positions, function (cpOption, i) { cpOption.each(function (cp) { var bar = create(origin, cp); add$2(bar, resizeBar); append(wire.parent(), bar); }); }); }; var refreshCol = function (wire, colPositions, position, tableHeight) { drawBar(wire, colPositions, function (origin, cp) { var colBar = Bar.col(cp.col(), cp.x() - origin.left(), position.top() - origin.top(), BAR_THICKNESS, tableHeight); add$2(colBar, resizeColBar); return colBar; }); }; var refreshRow = function (wire, rowPositions, position, tableWidth) { drawBar(wire, rowPositions, function (origin, cp) { var rowBar = Bar.row(cp.row(), position.left() - origin.left(), cp.y() - origin.top(), tableWidth, BAR_THICKNESS); add$2(rowBar, resizeRowBar); return rowBar; }); }; var refreshGrid = function (wire, table, rows, cols, hdirection, vdirection) { var position = absolute(table); var rowPositions = rows.length > 0 ? hdirection.positions(rows, table) : []; refreshRow(wire, rowPositions, position, getOuter$1(table)); var colPositions = cols.length > 0 ? vdirection.positions(cols, table) : []; refreshCol(wire, colPositions, position, getOuter(table)); }; var refresh = function (wire, table, hdirection, vdirection) { destroy(wire); var list = DetailsList.fromTable(table); var warehouse = Warehouse.generate(list); var rows = Blocks.rows(warehouse); var cols = Blocks.columns(warehouse); refreshGrid(wire, table, rows, cols, hdirection, vdirection); }; var each$2 = function (wire, f) { var bars = descendants$1(wire.parent(), '.' + resizeBar); each(bars, f); }; var hide = function (wire) { each$2(wire, function (bar) { set$1(bar, 'display', 'none'); }); }; var show = function (wire) { each$2(wire, function (bar) { set$1(bar, 'display', 'block'); }); }; var isRowBar = function (element) { return has$1(element, resizeRowBar); }; var isColBar = function (element) { return has$1(element, resizeColBar); }; var Bars = { refresh: refresh, hide: hide, show: show, destroy: destroy, isRowBar: isRowBar, isColBar: isColBar }; var addCell = function (gridRow, index, cell) { var cells = gridRow.cells(); var before = cells.slice(0, index); var after = cells.slice(index); var newCells = before.concat([cell]).concat(after); return setCells(gridRow, newCells); }; var mutateCell = function (gridRow, index, cell) { var cells = gridRow.cells(); cells[index] = cell; }; var setCells = function (gridRow, cells) { return rowcells(cells, gridRow.section()); }; var mapCells = function (gridRow, f) { var cells = gridRow.cells(); var r = map(cells, f); return rowcells(r, gridRow.section()); }; var getCell = function (gridRow, index) { return gridRow.cells()[index]; }; var getCellElement = function (gridRow, index) { return getCell(gridRow, index).element(); }; var cellLength = function (gridRow) { return gridRow.cells().length; }; var GridRow = { addCell: addCell, setCells: setCells, mutateCell: mutateCell, getCell: getCell, getCellElement: getCellElement, mapCells: mapCells, cellLength: cellLength }; var getColumn = function (grid, index) { return map(grid, function (row) { return GridRow.getCell(row, index); }); }; var getRow = function (grid, index) { return grid[index]; }; var findDiff = function (xs, comp) { if (xs.length === 0) { return 0; } var first = xs[0]; var index = findIndex(xs, function (x) { return !comp(first.element(), x.element()); }); return index.fold(function () { return xs.length; }, function (ind) { return ind; }); }; var subgrid = function (grid, row, column, comparator) { var restOfRow = getRow(grid, row).cells().slice(column); var endColIndex = findDiff(restOfRow, comparator); var restOfColumn = getColumn(grid, column).slice(row); var endRowIndex = findDiff(restOfColumn, comparator); return { colspan: constant(endColIndex), rowspan: constant(endRowIndex) }; }; var TableGrid = { subgrid: subgrid }; var toDetails = function (grid, comparator) { var seen = map(grid, function (row, ri) { return map(row.cells(), function (col, ci) { return false; }); }); var updateSeen = function (ri, ci, rowspan, colspan) { for (var r = ri; r < ri + rowspan; r++) { for (var c = ci; c < ci + colspan; c++) { seen[r][c] = true; } } }; return map(grid, function (row, ri) { var details = bind(row.cells(), function (cell, ci) { if (seen[ri][ci] === false) { var result = TableGrid.subgrid(grid, ri, ci, comparator); updateSeen(ri, ci, result.rowspan(), result.colspan()); return [detailnew(cell.element(), result.rowspan(), result.colspan(), cell.isNew())]; } else { return []; } }); return rowdetails(details, row.section()); }); }; var toGrid = function (warehouse, generators, isNew) { var grid = []; for (var i = 0; i < warehouse.grid().rows(); i++) { var rowCells = []; for (var j = 0; j < warehouse.grid().columns(); j++) { var element = Warehouse.getAt(warehouse, i, j).map(function (item) { return elementnew(item.element(), isNew); }).getOrThunk(function () { return elementnew(generators.gap(), true); }); rowCells.push(element); } var row = rowcells(rowCells, warehouse.all()[i].section()); grid.push(row); } return grid; }; var Transitions = { toDetails: toDetails, toGrid: toGrid }; var fromWarehouse = function (warehouse, generators) { return Transitions.toGrid(warehouse, generators, false); }; var deriveRows = function (rendered, generators) { var findRow = function (details) { var rowOfCells = findMap(details, function (detail) { return parent(detail.element()).map(function (row) { var isNew = parent(row).isNone(); return elementnew(row, isNew); }); }); return rowOfCells.getOrThunk(function () { return elementnew(generators.row(), true); }); }; return map(rendered, function (details) { var row = findRow(details.details()); return rowdatanew(row.element(), details.details(), details.section(), row.isNew()); }); }; var toDetailList = function (grid, generators) { var rendered = Transitions.toDetails(grid, eq); return deriveRows(rendered, generators); }; var findInWarehouse = function (warehouse, element) { var all = flatten(map(warehouse.all(), function (r) { return r.cells(); })); return find(all, function (e) { return eq(element, e.element()); }); }; var run = function (operation, extract, adjustment, postAction, genWrappers) { return function (wire, table, target, generators, direction) { var input = DetailsList.fromTable(table); var warehouse = Warehouse.generate(input); var output = extract(warehouse, target).map(function (info) { var model = fromWarehouse(warehouse, generators); var result = operation(model, info, eq, genWrappers(generators)); var grid = toDetailList(result.grid(), generators); return { grid: constant(grid), cursor: result.cursor }; }); return output.fold(function () { return Option.none(); }, function (out) { var newElements = Redraw.render(table, out.grid()); adjustment(table, out.grid(), direction); postAction(table); Bars.refresh(wire, table, BarPositions.height, direction); return Option.some({ cursor: out.cursor, newRows: newElements.newRows, newCells: newElements.newCells }); }); }; }; var onCell = function (warehouse, target) { return TableLookup.cell(target.element()).bind(function (cell) { return findInWarehouse(warehouse, cell); }); }; var onPaste = function (warehouse, target) { return TableLookup.cell(target.element()).bind(function (cell) { return findInWarehouse(warehouse, cell).map(function (details) { var value = __assign(__assign({}, details), { generators: target.generators, clipboard: target.clipboard }); return value; }); }); }; var onPasteRows = function (warehouse, target) { var details = map(target.selection(), function (cell) { return TableLookup.cell(cell).bind(function (lc) { return findInWarehouse(warehouse, lc); }); }); var cells = cat(details); return cells.length > 0 ? Option.some({ cells: cells, generators: target.generators, clipboard: target.clipboard }) : Option.none(); }; var onMergable = function (_warehouse, target) { return target.mergable(); }; var onUnmergable = function (_warehouse, target) { return target.unmergable(); }; var onCells = function (warehouse, target) { var details = map(target.selection(), function (cell) { return TableLookup.cell(cell).bind(function (lc) { return findInWarehouse(warehouse, lc); }); }); var cells = cat(details); return cells.length > 0 ? Option.some(cells) : Option.none(); }; var value = function (o) { var is = function (v) { return o === v; }; var or = function (opt) { return value(o); }; var orThunk = function (f) { return value(o); }; var map = function (f) { return value(f(o)); }; var mapError = function (f) { return value(o); }; var each = function (f) { f(o); }; var bind = function (f) { return f(o); }; var fold = function (_, onValue) { return onValue(o); }; var exists = function (f) { return f(o); }; var forall = function (f) { return f(o); }; var toOption = function () { return Option.some(o); }; return { is: is, isValue: always, isError: never, getOr: constant(o), getOrThunk: constant(o), getOrDie: constant(o), or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: each, bind: bind, exists: exists, forall: forall, toOption: toOption }; }; var error = function (message) { var getOrThunk = function (f) { return f(); }; var getOrDie = function () { return die(String(message))(); }; var or = function (opt) { return opt; }; var orThunk = function (f) { return f(); }; var map = function (f) { return error(message); }; var mapError = function (f) { return error(f(message)); }; var bind = function (f) { return error(message); }; var fold = function (onError, _) { return onError(message); }; return { is: never, isValue: never, isError: always, getOr: identity, getOrThunk: getOrThunk, getOrDie: getOrDie, or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: noop, bind: bind, exists: never, forall: always, toOption: Option.none }; }; var fromOption = function (opt, err) { return opt.fold(function () { return error(err); }, value); }; var Result = { value: value, error: error, fromOption: fromOption }; var measure = function (startAddress, gridA, gridB) { if (startAddress.row() >= gridA.length || startAddress.column() > GridRow.cellLength(gridA[0])) { return Result.error('invalid start address out of table bounds, row: ' + startAddress.row() + ', column: ' + startAddress.column()); } var rowRemainder = gridA.slice(startAddress.row()); var colRemainder = rowRemainder[0].cells().slice(startAddress.column()); var colRequired = GridRow.cellLength(gridB[0]); var rowRequired = gridB.length; return Result.value({ rowDelta: constant(rowRemainder.length - rowRequired), colDelta: constant(colRemainder.length - colRequired) }); }; var measureWidth = function (gridA, gridB) { var colLengthA = GridRow.cellLength(gridA[0]); var colLengthB = GridRow.cellLength(gridB[0]); return { rowDelta: constant(0), colDelta: constant(colLengthA - colLengthB) }; }; var fill = function (cells, generator) { return map(cells, function () { return elementnew(generator.cell(), true); }); }; var rowFill = function (grid, amount, generator) { return grid.concat(repeat(amount, function (_row) { return GridRow.setCells(grid[grid.length - 1], fill(grid[grid.length - 1].cells(), generator)); })); }; var colFill = function (grid, amount, generator) { return map(grid, function (row) { return GridRow.setCells(row, row.cells().concat(fill(range(0, amount), generator))); }); }; var tailor = function (gridA, delta, generator) { var fillCols = delta.colDelta() < 0 ? colFill : identity; var fillRows = delta.rowDelta() < 0 ? rowFill : identity; var modifiedCols = fillCols(gridA, Math.abs(delta.colDelta()), generator); var tailoredGrid = fillRows(modifiedCols, Math.abs(delta.rowDelta()), generator); return tailoredGrid; }; var Fitment = { measure: measure, measureWidth: measureWidth, tailor: tailor }; var merge = function (grid, bounds, comparator, substitution) { if (grid.length === 0) { return grid; } for (var i = bounds.startRow(); i <= bounds.finishRow(); i++) { for (var j = bounds.startCol(); j <= bounds.finishCol(); j++) { GridRow.mutateCell(grid[i], j, elementnew(substitution(), false)); } } return grid; }; var unmerge = function (grid, target, comparator, substitution) { var first = true; for (var i = 0; i < grid.length; i++) { for (var j = 0; j < GridRow.cellLength(grid[0]); j++) { var current = GridRow.getCellElement(grid[i], j); var isToReplace = comparator(current, target); if (isToReplace === true && first === false) { GridRow.mutateCell(grid[i], j, elementnew(substitution(), true)); } else if (isToReplace === true) { first = false; } } } return grid; }; var uniqueCells = function (row, comparator) { return foldl(row, function (rest, cell) { return exists(rest, function (currentCell) { return comparator(currentCell.element(), cell.element()); }) ? rest : rest.concat([cell]); }, []); }; var splitRows = function (grid, index, comparator, substitution) { if (index > 0 && index < grid.length) { var rowPrevCells = grid[index - 1].cells(); var cells = uniqueCells(rowPrevCells, comparator); each(cells, function (cell) { var replacement = Option.none(); var _loop_1 = function (i) { var _loop_2 = function (j) { var current = grid[i].cells()[j]; var isToReplace = comparator(current.element(), cell.element()); if (isToReplace) { if (replacement.isNone()) { replacement = Option.some(substitution()); } replacement.each(function (sub) { GridRow.mutateCell(grid[i], j, elementnew(sub, true)); }); } }; for (var j = 0; j < GridRow.cellLength(grid[0]); j++) { _loop_2(j); } }; for (var i = index; i < grid.length; i++) { _loop_1(i); } }); } return grid; }; var MergingOperations = { merge: merge, unmerge: unmerge, splitRows: splitRows }; var isSpanning = function (grid, row, col, comparator) { var candidate = GridRow.getCell(grid[row], col); var matching = curry(comparator, candidate.element()); var currentRow = grid[row]; return grid.length > 1 && GridRow.cellLength(currentRow) > 1 && (col > 0 && matching(GridRow.getCellElement(currentRow, col - 1)) || col < currentRow.cells().length - 1 && matching(GridRow.getCellElement(currentRow, col + 1)) || row > 0 && matching(GridRow.getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(GridRow.getCellElement(grid[row + 1], col))); }; var mergeTables = function (startAddress, gridA, gridB, generator, comparator) { var startRow = startAddress.row(); var startCol = startAddress.column(); var mergeHeight = gridB.length; var mergeWidth = GridRow.cellLength(gridB[0]); var endRow = startRow + mergeHeight; var endCol = startCol + mergeWidth; for (var r = startRow; r < endRow; r++) { for (var c = startCol; c < endCol; c++) { if (isSpanning(gridA, r, c, comparator)) { MergingOperations.unmerge(gridA, GridRow.getCellElement(gridA[r], c), comparator, generator.cell); } var newCell = GridRow.getCellElement(gridB[r - startRow], c - startCol); var replacement = generator.replace(newCell); GridRow.mutateCell(gridA[r], c, elementnew(replacement, true)); } } return gridA; }; var merge$1 = function (startAddress, gridA, gridB, generator, comparator) { var result = Fitment.measure(startAddress, gridA, gridB); return result.map(function (delta) { var fittedGrid = Fitment.tailor(gridA, delta, generator); return mergeTables(startAddress, fittedGrid, gridB, generator, comparator); }); }; var insert = function (index, gridA, gridB, generator, comparator) { MergingOperations.splitRows(gridA, index, comparator, generator.cell); var delta = Fitment.measureWidth(gridB, gridA); var fittedNewGrid = Fitment.tailor(gridB, delta, generator); var secondDelta = Fitment.measureWidth(gridA, fittedNewGrid); var fittedOldGrid = Fitment.tailor(gridA, secondDelta, generator); return fittedOldGrid.slice(0, index).concat(fittedNewGrid).concat(fittedOldGrid.slice(index, fittedOldGrid.length)); }; var TableMerge = { merge: merge$1, insert: insert }; var insertRowAt = function (grid, index, example, comparator, substitution) { var before = grid.slice(0, index); var after = grid.slice(index); var between = GridRow.mapCells(grid[example], function (ex, c) { var withinSpan = index > 0 && index < grid.length && comparator(GridRow.getCellElement(grid[index - 1], c), GridRow.getCellElement(grid[index], c)); var ret = withinSpan ? GridRow.getCell(grid[index], c) : elementnew(substitution(ex.element(), comparator), true); return ret; }); return before.concat([between]).concat(after); }; var insertColumnAt = function (grid, index, example, comparator, substitution) { return map(grid, function (row) { var withinSpan = index > 0 && index < GridRow.cellLength(row) && comparator(GridRow.getCellElement(row, index - 1), GridRow.getCellElement(row, index)); var sub = withinSpan ? GridRow.getCell(row, index) : elementnew(substitution(GridRow.getCellElement(row, example), comparator), true); return GridRow.addCell(row, index, sub); }); }; var splitCellIntoColumns = function (grid, exampleRow, exampleCol, comparator, substitution) { var index = exampleCol + 1; return map(grid, function (row, i) { var isTargetCell = i === exampleRow; var sub = isTargetCell ? elementnew(substitution(GridRow.getCellElement(row, exampleCol), comparator), true) : GridRow.getCell(row, exampleCol); return GridRow.addCell(row, index, sub); }); }; var splitCellIntoRows = function (grid, exampleRow, exampleCol, comparator, substitution) { var index = exampleRow + 1; var before = grid.slice(0, index); var after = grid.slice(index); var between = GridRow.mapCells(grid[exampleRow], function (ex, i) { var isTargetCell = i === exampleCol; return isTargetCell ? elementnew(substitution(ex.element(), comparator), true) : ex; }); return before.concat([between]).concat(after); }; var deleteColumnsAt = function (grid, start, finish) { var rows = map(grid, function (row) { var cells = row.cells().slice(0, start).concat(row.cells().slice(finish + 1)); return rowcells(cells, row.section()); }); return filter(rows, function (row) { return row.cells().length > 0; }); }; var deleteRowsAt = function (grid, start, finish) { return grid.slice(0, start).concat(grid.slice(finish + 1)); }; var ModificationOperations = { insertRowAt: insertRowAt, insertColumnAt: insertColumnAt, splitCellIntoColumns: splitCellIntoColumns, splitCellIntoRows: splitCellIntoRows, deleteRowsAt: deleteRowsAt, deleteColumnsAt: deleteColumnsAt }; var replaceIn = function (grid, targets, comparator, substitution) { var isTarget = function (cell) { return exists(targets, function (target) { return comparator(cell.element(), target.element()); }); }; return map(grid, function (row) { return GridRow.mapCells(row, function (cell) { return isTarget(cell) ? elementnew(substitution(cell.element(), comparator), true) : cell; }); }); }; var notStartRow = function (grid, rowIndex, colIndex, comparator) { return GridRow.getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(GridRow.getCellElement(grid[rowIndex - 1], colIndex), GridRow.getCellElement(grid[rowIndex], colIndex))); }; var notStartColumn = function (row, index, comparator) { return index > 0 && comparator(GridRow.getCellElement(row, index - 1), GridRow.getCellElement(row, index)); }; var replaceColumn = function (grid, index, comparator, substitution) { var targets = bind(grid, function (row, i) { var alreadyAdded = notStartRow(grid, i, index, comparator) || notStartColumn(row, index, comparator); return alreadyAdded ? [] : [GridRow.getCell(row, index)]; }); return replaceIn(grid, targets, comparator, substitution); }; var replaceRow = function (grid, index, comparator, substitution) { var targetRow = grid[index]; var targets = bind(targetRow.cells(), function (item, i) { var alreadyAdded = notStartRow(grid, index, i, comparator) || notStartColumn(targetRow, i, comparator); return alreadyAdded ? [] : [item]; }); return replaceIn(grid, targets, comparator, substitution); }; var TransformOperations = { replaceColumn: replaceColumn, replaceRow: replaceRow }; var adt = Adt.generate([ { none: [] }, { only: ['index'] }, { left: [ 'index', 'next' ] }, { middle: [ 'prev', 'index', 'next' ] }, { right: [ 'prev', 'index' ] } ]); var ColumnContext = __assign({}, adt); var neighbours$1 = function (input, index) { if (input.length === 0) { return ColumnContext.none(); } if (input.length === 1) { return ColumnContext.only(0); } if (index === 0) { return ColumnContext.left(0, 1); } if (index === input.length - 1) { return ColumnContext.right(index - 1, index); } if (index > 0 && index < input.length - 1) { return ColumnContext.middle(index - 1, index, index + 1); } return ColumnContext.none(); }; var determine = function (input, column, step, tableSize) { var result = input.slice(0); var context = neighbours$1(input, column); var zero = function (array) { return map(array, constant(0)); }; var onNone = constant(zero(result)); var onOnly = function (index) { return tableSize.singleColumnWidth(result[index], step); }; var onChange = function (index, next) { if (step >= 0) { var newNext = Math.max(tableSize.minCellWidth(), result[next] - step); return zero(result.slice(0, index)).concat([ step, newNext - result[next] ]).concat(zero(result.slice(next + 1))); } else { var newThis = Math.max(tableSize.minCellWidth(), result[index] + step); var diffx = result[index] - newThis; return zero(result.slice(0, index)).concat([ newThis - result[index], diffx ]).concat(zero(result.slice(next + 1))); } }; var onLeft = onChange; var onMiddle = function (_prev, index, next) { return onChange(index, next); }; var onRight = function (_prev, index) { if (step >= 0) { return zero(result.slice(0, index)).concat([step]); } else { var size = Math.max(tableSize.minCellWidth(), result[index] + step); return zero(result.slice(0, index)).concat([size - result[index]]); } }; return context.fold(onNone, onOnly, onLeft, onMiddle, onRight); }; var Deltas = { determine: determine }; var getSpan$1 = function (cell, type) { return has(cell, type) && parseInt(get(cell, type), 10) > 1; }; var hasColspan = function (cell) { return getSpan$1(cell, 'colspan'); }; var hasRowspan = function (cell) { return getSpan$1(cell, 'rowspan'); }; var getInt = function (element, property) { return parseInt(get$1(element, property), 10); }; var CellUtils = { hasColspan: hasColspan, hasRowspan: hasRowspan, minWidth: constant(10), minHeight: constant(10), getInt: getInt }; var getRaw$1 = function (cell, property, getter) { return getRaw(cell, property).fold(function () { return getter(cell) + 'px'; }, function (raw) { return raw; }); }; var getRawW = function (cell, tableSize) { return getRaw$1(cell, 'width', function (e) { return Sizes.getPixelWidth(e, tableSize); }); }; var getRawH = function (cell) { return getRaw$1(cell, 'height', Sizes.getHeight); }; var getWidthFrom = function (warehouse, direction, getWidth, fallback, tableSize) { var columns = Blocks.columns(warehouse); var backups = map(columns, function (cellOption) { return cellOption.map(direction.edge); }); return map(columns, function (cellOption, c) { var columnCell = cellOption.filter(not(CellUtils.hasColspan)); return columnCell.fold(function () { var deduced = deduce(backups, c); return fallback(deduced); }, function (cell) { return getWidth(cell, tableSize); }); }); }; var getDeduced = function (deduced) { return deduced.map(function (d) { return d + 'px'; }).getOr(''); }; var getRawWidths = function (warehouse, direction, tableSize) { return getWidthFrom(warehouse, direction, getRawW, getDeduced, tableSize); }; var getPercentageWidths = function (warehouse, direction, tableSize) { return getWidthFrom(warehouse, direction, Sizes.getPercentageWidth, function (deduced) { return deduced.fold(function () { return tableSize.minCellWidth(); }, function (cellWidth) { return cellWidth / tableSize.pixelWidth() * 100; }); }, tableSize); }; var getPixelWidths = function (warehouse, direction, tableSize) { return getWidthFrom(warehouse, direction, Sizes.getPixelWidth, function (deduced) { return deduced.getOrThunk(tableSize.minCellWidth); }, tableSize); }; var getHeightFrom = function (warehouse, direction, getHeight, fallback) { var rows = Blocks.rows(warehouse); var backups = map(rows, function (cellOption) { return cellOption.map(direction.edge); }); return map(rows, function (cellOption, c) { var rowCell = cellOption.filter(not(CellUtils.hasRowspan)); return rowCell.fold(function () { var deduced = deduce(backups, c); return fallback(deduced); }, function (cell) { return getHeight(cell); }); }); }; var getPixelHeights = function (warehouse, direction) { return getHeightFrom(warehouse, direction, Sizes.getHeight, function (deduced) { return deduced.getOrThunk(CellUtils.minHeight); }); }; var getRawHeights = function (warehouse, direction) { return getHeightFrom(warehouse, direction, getRawH, getDeduced); }; var ColumnSizes = { getRawWidths: getRawWidths, getPixelWidths: getPixelWidths, getPercentageWidths: getPercentageWidths, getPixelHeights: getPixelHeights, getRawHeights: getRawHeights }; var total = function (start, end, measures) { var r = 0; for (var i = start; i < end; i++) { r += measures[i] !== undefined ? measures[i] : 0; } return r; }; var recalculateWidth = function (warehouse, widths) { var all = Warehouse.justCells(warehouse); return map(all, function (cell) { var width = total(cell.column(), cell.column() + cell.colspan(), widths); return { element: cell.element, width: constant(width), colspan: cell.colspan }; }); }; var recalculateHeight = function (warehouse, heights) { var all = Warehouse.justCells(warehouse); return map(all, function (cell) { var height = total(cell.row(), cell.row() + cell.rowspan(), heights); return { element: cell.element, height: constant(height), rowspan: cell.rowspan }; }); }; var matchRowHeight = function (warehouse, heights) { return map(warehouse.all(), function (row, i) { return { element: row.element, height: constant(heights[i]) }; }); }; var Recalculations = { recalculateWidth: recalculateWidth, recalculateHeight: recalculateHeight, matchRowHeight: matchRowHeight }; var percentageSize = function (width, element) { var floatWidth = parseFloat(width); var pixelWidth = get$4(element); var getCellDelta = function (delta) { return delta / pixelWidth * 100; }; var singleColumnWidth = function (w, _delta) { return [100 - w]; }; var minCellWidth = function () { return CellUtils.minWidth() / pixelWidth * 100; }; var setTableWidth = function (table, _newWidths, delta) { var ratio = delta / 100; var change = ratio * floatWidth; Sizes.setPercentageWidth(table, floatWidth + change); }; return { width: constant(floatWidth), pixelWidth: constant(pixelWidth), getWidths: ColumnSizes.getPercentageWidths, getCellDelta: getCellDelta, singleColumnWidth: singleColumnWidth, minCellWidth: minCellWidth, setElementWidth: Sizes.setPercentageWidth, setTableWidth: setTableWidth }; }; var pixelSize = function (width) { var getCellDelta = identity; var singleColumnWidth = function (w, delta) { var newNext = Math.max(CellUtils.minWidth(), w + delta); return [newNext - w]; }; var setTableWidth = function (table, newWidths, _delta) { var total = foldr(newWidths, function (b, a) { return b + a; }, 0); Sizes.setPixelWidth(table, total); }; return { width: constant(width), pixelWidth: constant(width), getWidths: ColumnSizes.getPixelWidths, getCellDelta: getCellDelta, singleColumnWidth: singleColumnWidth, minCellWidth: CellUtils.minWidth, setElementWidth: Sizes.setPixelWidth, setTableWidth: setTableWidth }; }; var chooseSize = function (element, width) { var percentMatch = Sizes.percentageBasedSizeRegex().exec(width); if (percentMatch !== null) { return percentageSize(percentMatch[1], element); } var pixelMatch = Sizes.pixelBasedSizeRegex().exec(width); if (pixelMatch !== null) { var intWidth = parseInt(pixelMatch[1], 10); return pixelSize(intWidth); } var fallbackWidth = get$4(element); return pixelSize(fallbackWidth); }; var getTableSize = function (element) { var width = Sizes.getRawWidth(element); return width.fold(function () { var fallbackWidth = get$4(element); return pixelSize(fallbackWidth); }, function (w) { return chooseSize(element, w); }); }; var TableSize = { getTableSize: getTableSize }; var getWarehouse$1 = function (list) { return Warehouse.generate(list); }; var sumUp = function (newSize) { return foldr(newSize, function (b, a) { return b + a; }, 0); }; var getTableWarehouse = function (table) { var list = DetailsList.fromTable(table); return getWarehouse$1(list); }; var adjustWidth = function (table, delta, index, direction) { var tableSize = TableSize.getTableSize(table); var step = tableSize.getCellDelta(delta); var warehouse = getTableWarehouse(table); var widths = tableSize.getWidths(warehouse, direction, tableSize); var deltas = Deltas.determine(widths, index, step, tableSize); var newWidths = map(deltas, function (dx, i) { return dx + widths[i]; }); var newSizes = Recalculations.recalculateWidth(warehouse, newWidths); each(newSizes, function (cell) { tableSize.setElementWidth(cell.element(), cell.width()); }); if (index === warehouse.grid().columns() - 1) { tableSize.setTableWidth(table, newWidths, step); } }; var adjustHeight = function (table, delta, index, direction) { var warehouse = getTableWarehouse(table); var heights = ColumnSizes.getPixelHeights(warehouse, direction); var newHeights = map(heights, function (dy, i) { return index === i ? Math.max(delta + dy, CellUtils.minHeight()) : dy; }); var newCellSizes = Recalculations.recalculateHeight(warehouse, newHeights); var newRowSizes = Recalculations.matchRowHeight(warehouse, newHeights); each(newRowSizes, function (row) { Sizes.setHeight(row.element(), row.height()); }); each(newCellSizes, function (cell) { Sizes.setHeight(cell.element(), cell.height()); }); var total = sumUp(newHeights); Sizes.setHeight(table, total); }; var adjustWidthTo = function (table, list, direction) { var tableSize = TableSize.getTableSize(table); var warehouse = getWarehouse$1(list); var widths = tableSize.getWidths(warehouse, direction, tableSize); var newSizes = Recalculations.recalculateWidth(warehouse, widths); each(newSizes, function (cell) { tableSize.setElementWidth(cell.element(), cell.width()); }); if (newSizes.length > 0) { tableSize.setTableWidth(table, widths, tableSize.getCellDelta(0)); } }; var Adjustments = { adjustWidth: adjustWidth, adjustHeight: adjustHeight, adjustWidthTo: adjustWidthTo }; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var base = function (handleUnsupported, required) { return baseWith(handleUnsupported, required, { validate: isFunction, label: 'function' }); }; var baseWith = function (handleUnsupported, required, pred) { if (required.length === 0) { throw new Error('You must specify at least one required field.'); } validateStrArr('required', required); checkDupes(required); return function (obj) { var keys$1 = keys(obj); var allReqd = forall(required, function (req) { return contains(keys$1, req); }); if (!allReqd) { reqMessage(required, keys$1); } handleUnsupported(required, keys$1); var invalidKeys = filter(required, function (key) { return !pred.validate(obj[key], key); }); if (invalidKeys.length > 0) { invalidTypeMessage(invalidKeys, pred.label); } return obj; }; }; var handleExact = function (required, keys) { var unsupported = filter(keys, function (key) { return !contains(required, key); }); if (unsupported.length > 0) { unsuppMessage(unsupported); } }; var exactly = function (required) { return base(handleExact, required); }; var verifyGenerators = exactly([ 'cell', 'row', 'replace', 'gap' ]); var elementToData = function (element) { var colspan = has(element, 'colspan') ? parseInt(get(element, 'colspan'), 10) : 1; var rowspan = has(element, 'rowspan') ? parseInt(get(element, 'rowspan'), 10) : 1; return { element: constant(element), colspan: constant(colspan), rowspan: constant(rowspan) }; }; var modification = function (generators, toData) { if (toData === void 0) { toData = elementToData; } verifyGenerators(generators); var position = Cell(Option.none()); var nu = function (data) { return generators.cell(data); }; var nuFrom = function (element) { var data = toData(element); return nu(data); }; var add = function (element) { var replacement = nuFrom(element); if (position.get().isNone()) { position.set(Option.some(replacement)); } recent = Option.some({ item: element, replacement: replacement }); return replacement; }; var recent = Option.none(); var getOrInit = function (element, comparator) { return recent.fold(function () { return add(element); }, function (p) { return comparator(element, p.item) ? p.replacement : add(element); }); }; return { getOrInit: getOrInit, cursor: position.get }; }; var transform = function (scope, tag) { return function (generators) { var position = Cell(Option.none()); verifyGenerators(generators); var list = []; var find$1 = function (element, comparator) { return find(list, function (x) { return comparator(x.item, element); }); }; var makeNew = function (element) { var attrs = { scope: scope }; var cell = generators.replace(element, tag, attrs); list.push({ item: element, sub: cell }); if (position.get().isNone()) { position.set(Option.some(cell)); } return cell; }; var replaceOrInit = function (element, comparator) { return find$1(element, comparator).fold(function () { return makeNew(element); }, function (p) { return comparator(element, p.item) ? p.sub : makeNew(element); }); }; return { replaceOrInit: replaceOrInit, cursor: position.get }; }; }; var merging = function (generators) { verifyGenerators(generators); var position = Cell(Option.none()); var combine = function (cell) { if (position.get().isNone()) { position.set(Option.some(cell)); } return function () { var raw = generators.cell({ element: constant(cell), colspan: constant(1), rowspan: constant(1) }); remove$1(raw, 'width'); remove$1(cell, 'width'); return raw; }; }; return { combine: combine, cursor: position.get }; }; var Generators = { modification: modification, transform: transform, merging: merging }; var blockList = [ 'body', 'p', 'div', 'article', 'aside', 'figcaption', 'figure', 'footer', 'header', 'nav', 'section', 'ol', 'ul', 'table', 'thead', 'tfoot', 'tbody', 'caption', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pre', 'address' ]; var isList = function (universe, item) { var tagName = universe.property().name(item); return contains([ 'ol', 'ul' ], tagName); }; var isBlock = function (universe, item) { var tagName = universe.property().name(item); return contains(blockList, tagName); }; var isFormatting = function (universe, item) { var tagName = universe.property().name(item); return contains([ 'address', 'pre', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ], tagName); }; var isHeading = function (universe, item) { var tagName = universe.property().name(item); return contains([ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ], tagName); }; var isContainer = function (universe, item) { return contains([ 'div', 'li', 'td', 'th', 'blockquote', 'body', 'caption' ], universe.property().name(item)); }; var isEmptyTag = function (universe, item) { return contains([ 'br', 'img', 'hr', 'input' ], universe.property().name(item)); }; var isFrame = function (universe, item) { return universe.property().name(item) === 'iframe'; }; var isInline = function (universe, item) { return !(isBlock(universe, item) || isEmptyTag(universe, item)) && universe.property().name(item) !== 'li'; }; var Structure = { isBlock: isBlock, isList: isList, isFormatting: isFormatting, isHeading: isHeading, isContainer: isContainer, isEmptyTag: isEmptyTag, isFrame: isFrame, isInline: isInline }; var universe$1 = DomUniverse(); var isBlock$1 = function (element) { return Structure.isBlock(universe$1, element); }; var isList$1 = function (element) { return Structure.isList(universe$1, element); }; var isFormatting$1 = function (element) { return Structure.isFormatting(universe$1, element); }; var isHeading$1 = function (element) { return Structure.isHeading(universe$1, element); }; var isContainer$1 = function (element) { return Structure.isContainer(universe$1, element); }; var isEmptyTag$1 = function (element) { return Structure.isEmptyTag(universe$1, element); }; var isFrame$1 = function (element) { return Structure.isFrame(universe$1, element); }; var isInline$1 = function (element) { return Structure.isInline(universe$1, element); }; var DomStructure = { isBlock: isBlock$1, isList: isList$1, isFormatting: isFormatting$1, isHeading: isHeading$1, isContainer: isContainer$1, isEmptyTag: isEmptyTag$1, isFrame: isFrame$1, isInline: isInline$1 }; var merge$2 = function (cells) { var isBr = function (el) { return name(el) === 'br'; }; var advancedBr = function (children) { return forall(children, function (c) { return isBr(c) || isText(c) && get$2(c).trim().length === 0; }); }; var isListItem = function (el) { return name(el) === 'li' || ancestor(el, DomStructure.isList).isSome(); }; var siblingIsBlock = function (el) { return nextSibling(el).map(function (rightSibling) { if (DomStructure.isBlock(rightSibling)) { return true; } if (DomStructure.isEmptyTag(rightSibling)) { return name(rightSibling) === 'img' ? false : true; } return false; }).getOr(false); }; var markCell = function (cell) { return last$1(cell).bind(function (rightEdge) { var rightSiblingIsBlock = siblingIsBlock(rightEdge); return parent(rightEdge).map(function (parent) { return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || DomStructure.isBlock(parent) && !eq(cell, parent) ? [] : [Element.fromTag('br')]; }); }).getOr([]); }; var markContent = function () { var content = bind(cells, function (cell) { var children$1 = children(cell); return advancedBr(children$1) ? [] : children$1.concat(markCell(cell)); }); return content.length === 0 ? [Element.fromTag('br')] : content; }; var contents = markContent(); empty(cells[0]); append$1(cells[0], contents); }; var TableContent = { merge: merge$2 }; var prune = function (table) { var cells = TableLookup.cells(table); if (cells.length === 0) { remove$2(table); } }; var outcome = Immutable('grid', 'cursor'); var elementFromGrid = function (grid, row, column) { return findIn(grid, row, column).orThunk(function () { return findIn(grid, 0, 0); }); }; var findIn = function (grid, row, column) { return Option.from(grid[row]).bind(function (r) { return Option.from(r.cells()[column]).bind(function (c) { return Option.from(c.element()); }); }); }; var bundle = function (grid, row, column) { return outcome(grid, findIn(grid, row, column)); }; var uniqueRows = function (details) { return foldl(details, function (rest, detail) { return exists(rest, function (currentDetail) { return currentDetail.row() === detail.row(); }) ? rest : rest.concat([detail]); }, []).sort(function (detailA, detailB) { return detailA.row() - detailB.row(); }); }; var uniqueColumns = function (details) { return foldl(details, function (rest, detail) { return exists(rest, function (currentDetail) { return currentDetail.column() === detail.column(); }) ? rest : rest.concat([detail]); }, []).sort(function (detailA, detailB) { return detailA.column() - detailB.column(); }); }; var insertRowBefore = function (grid, detail, comparator, genWrappers) { var example = detail.row(); var targetIndex = detail.row(); var newGrid = ModificationOperations.insertRowAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, targetIndex, detail.column()); }; var insertRowsBefore = function (grid, details, comparator, genWrappers) { var example = details[0].row(); var targetIndex = details[0].row(); var rows = uniqueRows(details); var newGrid = foldl(rows, function (newG, _row) { return ModificationOperations.insertRowAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, targetIndex, details[0].column()); }; var insertRowAfter = function (grid, detail, comparator, genWrappers) { var example = detail.row(); var targetIndex = detail.row() + detail.rowspan(); var newGrid = ModificationOperations.insertRowAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, targetIndex, detail.column()); }; var insertRowsAfter = function (grid, details, comparator, genWrappers) { var rows = uniqueRows(details); var example = rows[rows.length - 1].row(); var targetIndex = rows[rows.length - 1].row() + rows[rows.length - 1].rowspan(); var newGrid = foldl(rows, function (newG, _row) { return ModificationOperations.insertRowAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, targetIndex, details[0].column()); }; var insertColumnBefore = function (grid, detail, comparator, genWrappers) { var example = detail.column(); var targetIndex = detail.column(); var newGrid = ModificationOperations.insertColumnAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), targetIndex); }; var insertColumnsBefore = function (grid, details, comparator, genWrappers) { var columns = uniqueColumns(details); var example = columns[0].column(); var targetIndex = columns[0].column(); var newGrid = foldl(columns, function (newG, _row) { return ModificationOperations.insertColumnAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, details[0].row(), targetIndex); }; var insertColumnAfter = function (grid, detail, comparator, genWrappers) { var example = detail.column(); var targetIndex = detail.column() + detail.colspan(); var newGrid = ModificationOperations.insertColumnAt(grid, targetIndex, example, comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), targetIndex); }; var insertColumnsAfter = function (grid, details, comparator, genWrappers) { var example = details[details.length - 1].column(); var targetIndex = details[details.length - 1].column() + details[details.length - 1].colspan(); var columns = uniqueColumns(details); var newGrid = foldl(columns, function (newG, _row) { return ModificationOperations.insertColumnAt(newG, targetIndex, example, comparator, genWrappers.getOrInit); }, grid); return bundle(newGrid, details[0].row(), targetIndex); }; var makeRowHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceRow(grid, detail.row(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var makeColumnHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceColumn(grid, detail.column(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var unmakeRowHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceRow(grid, detail.row(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var unmakeColumnHeader = function (grid, detail, comparator, genWrappers) { var newGrid = TransformOperations.replaceColumn(grid, detail.column(), comparator, genWrappers.replaceOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var splitCellIntoColumns$1 = function (grid, detail, comparator, genWrappers) { var newGrid = ModificationOperations.splitCellIntoColumns(grid, detail.row(), detail.column(), comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var splitCellIntoRows$1 = function (grid, detail, comparator, genWrappers) { var newGrid = ModificationOperations.splitCellIntoRows(grid, detail.row(), detail.column(), comparator, genWrappers.getOrInit); return bundle(newGrid, detail.row(), detail.column()); }; var eraseColumns = function (grid, details, _comparator, _genWrappers) { var columns = uniqueColumns(details); var newGrid = ModificationOperations.deleteColumnsAt(grid, columns[0].column(), columns[columns.length - 1].column()); var cursor = elementFromGrid(newGrid, details[0].row(), details[0].column()); return outcome(newGrid, cursor); }; var eraseRows = function (grid, details, _comparator, _genWrappers) { var rows = uniqueRows(details); var newGrid = ModificationOperations.deleteRowsAt(grid, rows[0].row(), rows[rows.length - 1].row()); var cursor = elementFromGrid(newGrid, details[0].row(), details[0].column()); return outcome(newGrid, cursor); }; var mergeCells = function (grid, mergable, comparator, _genWrappers) { var cells = mergable.cells(); TableContent.merge(cells); var newGrid = MergingOperations.merge(grid, mergable.bounds(), comparator, constant(cells[0])); return outcome(newGrid, Option.from(cells[0])); }; var unmergeCells = function (grid, unmergable, comparator, genWrappers) { var newGrid = foldr(unmergable, function (b, cell) { return MergingOperations.unmerge(b, cell, comparator, genWrappers.combine(cell)); }, grid); return outcome(newGrid, Option.from(unmergable[0])); }; var pasteCells = function (grid, pasteDetails, comparator, _genWrappers) { var gridify = function (table, generators) { var list = DetailsList.fromTable(table); var wh = Warehouse.generate(list); return Transitions.toGrid(wh, generators, true); }; var gridB = gridify(pasteDetails.clipboard(), pasteDetails.generators()); var startAddress = address(pasteDetails.row(), pasteDetails.column()); var mergedGrid = TableMerge.merge(startAddress, grid, gridB, pasteDetails.generators(), comparator); return mergedGrid.fold(function () { return outcome(grid, Option.some(pasteDetails.element())); }, function (nuGrid) { var cursor = elementFromGrid(nuGrid, pasteDetails.row(), pasteDetails.column()); return outcome(nuGrid, cursor); }); }; var gridifyRows = function (rows, generators, example) { var pasteDetails = DetailsList.fromPastedRows(rows, example); var wh = Warehouse.generate(pasteDetails); return Transitions.toGrid(wh, generators, true); }; var pasteRowsBefore = function (grid, pasteDetails, comparator, _genWrappers) { var example = grid[pasteDetails.cells[0].row()]; var index = pasteDetails.cells[0].row(); var gridB = gridifyRows(pasteDetails.clipboard(), pasteDetails.generators(), example); var mergedGrid = TableMerge.insert(index, grid, gridB, pasteDetails.generators(), comparator); var cursor = elementFromGrid(mergedGrid, pasteDetails.cells[0].row(), pasteDetails.cells[0].column()); return outcome(mergedGrid, cursor); }; var pasteRowsAfter = function (grid, pasteDetails, comparator, _genWrappers) { var example = grid[pasteDetails.cells[0].row()]; var index = pasteDetails.cells[pasteDetails.cells.length - 1].row() + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan(); var gridB = gridifyRows(pasteDetails.clipboard(), pasteDetails.generators(), example); var mergedGrid = TableMerge.insert(index, grid, gridB, pasteDetails.generators(), comparator); var cursor = elementFromGrid(mergedGrid, pasteDetails.cells[0].row(), pasteDetails.cells[0].column()); return outcome(mergedGrid, cursor); }; var resize = Adjustments.adjustWidthTo; var TableOperations = { insertRowBefore: run(insertRowBefore, onCell, noop, noop, Generators.modification), insertRowsBefore: run(insertRowsBefore, onCells, noop, noop, Generators.modification), insertRowAfter: run(insertRowAfter, onCell, noop, noop, Generators.modification), insertRowsAfter: run(insertRowsAfter, onCells, noop, noop, Generators.modification), insertColumnBefore: run(insertColumnBefore, onCell, resize, noop, Generators.modification), insertColumnsBefore: run(insertColumnsBefore, onCells, resize, noop, Generators.modification), insertColumnAfter: run(insertColumnAfter, onCell, resize, noop, Generators.modification), insertColumnsAfter: run(insertColumnsAfter, onCells, resize, noop, Generators.modification), splitCellIntoColumns: run(splitCellIntoColumns$1, onCell, resize, noop, Generators.modification), splitCellIntoRows: run(splitCellIntoRows$1, onCell, noop, noop, Generators.modification), eraseColumns: run(eraseColumns, onCells, resize, prune, Generators.modification), eraseRows: run(eraseRows, onCells, noop, prune, Generators.modification), makeColumnHeader: run(makeColumnHeader, onCell, noop, noop, Generators.transform('row', 'th')), unmakeColumnHeader: run(unmakeColumnHeader, onCell, noop, noop, Generators.transform(null, 'td')), makeRowHeader: run(makeRowHeader, onCell, noop, noop, Generators.transform('col', 'th')), unmakeRowHeader: run(unmakeRowHeader, onCell, noop, noop, Generators.transform(null, 'td')), mergeCells: run(mergeCells, onMergable, noop, noop, Generators.merging), unmergeCells: run(unmergeCells, onUnmergable, resize, noop, Generators.merging), pasteCells: run(pasteCells, onPaste, resize, noop, Generators.modification), pasteRowsBefore: run(pasteRowsBefore, onPasteRows, noop, noop, Generators.modification), pasteRowsAfter: run(pasteRowsAfter, onPasteRows, noop, noop, Generators.modification) }; var getBody$1 = function (editor) { return Element.fromDom(editor.getBody()); }; var getPixelWidth$1 = function (elm) { return elm.getBoundingClientRect().width; }; var getPixelHeight = function (elm) { return elm.getBoundingClientRect().height; }; var getIsRoot = function (editor) { return function (element) { return eq(element, getBody$1(editor)); }; }; var removePxSuffix = function (size) { return size ? size.replace(/px$/, '') : ''; }; var addSizeSuffix = function (size) { if (/^[0-9]+$/.test(size)) { size += 'px'; } return size; }; var removeDataStyle = function (table) { var dataStyleCells = descendants$1(table, 'td[data-mce-style],th[data-mce-style]'); remove(table, 'data-mce-style'); each(dataStyleCells, function (cell) { remove(cell, 'data-mce-style'); }); }; var getDirection = function (element) { return get$1(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; }; var ltr$1 = { isRtl: constant(false) }; var rtl$1 = { isRtl: constant(true) }; var directionAt = function (element) { var dir = getDirection(element); return dir === 'rtl' ? rtl$1 : ltr$1; }; var Direction = { directionAt: directionAt }; var defaultTableToolbar = [ 'tableprops', 'tabledelete', '|', 'tableinsertrowbefore', 'tableinsertrowafter', 'tabledeleterow', '|', 'tableinsertcolbefore', 'tableinsertcolafter', 'tabledeletecol' ]; var defaultStyles = { 'border-collapse': 'collapse', 'width': '100%' }; var defaultAttributes = { border: '1' }; var getDefaultAttributes = function (editor) { return editor.getParam('table_default_attributes', defaultAttributes, 'object'); }; var getDefaultStyles = function (editor) { return editor.getParam('table_default_styles', defaultStyles, 'object'); }; var hasTableResizeBars = function (editor) { return editor.getParam('table_resize_bars', true, 'boolean'); }; var hasTabNavigation = function (editor) { return editor.getParam('table_tab_navigation', true, 'boolean'); }; var hasAdvancedCellTab = function (editor) { return editor.getParam('table_cell_advtab', true, 'boolean'); }; var hasAdvancedRowTab = function (editor) { return editor.getParam('table_row_advtab', true, 'boolean'); }; var hasAdvancedTableTab = function (editor) { return editor.getParam('table_advtab', true, 'boolean'); }; var hasAppearanceOptions = function (editor) { return editor.getParam('table_appearance_options', true, 'boolean'); }; var hasTableGrid = function (editor) { return editor.getParam('table_grid', true, 'boolean'); }; var shouldStyleWithCss = function (editor) { return editor.getParam('table_style_by_css', false, 'boolean'); }; var getCellClassList = function (editor) { return editor.getParam('table_cell_class_list', [], 'array'); }; var getRowClassList = function (editor) { return editor.getParam('table_row_class_list', [], 'array'); }; var getTableClassList = function (editor) { return editor.getParam('table_class_list', [], 'array'); }; var getColorPickerCallback = function (editor) { return editor.getParam('color_picker_callback'); }; var isPixelsForced = function (editor) { return editor.getParam('table_responsive_width') === false; }; var getCloneElements = function (editor) { var cloneElements = editor.getParam('table_clone_elements'); if (isString(cloneElements)) { return Option.some(cloneElements.split(/[ ,]/)); } else if (Array.isArray(cloneElements)) { return Option.some(cloneElements); } else { return Option.none(); } }; var hasObjectResizing = function (editor) { var objectResizing = editor.getParam('object_resizing', true); return objectResizing === 'table' || objectResizing; }; var getToolbar = function (editor) { var toolbar = editor.getParam('table_toolbar', defaultTableToolbar); if (toolbar === '' || toolbar === false) { return []; } else if (isString(toolbar)) { return toolbar.split(/[ ,]/); } else if (isArray(toolbar)) { return toolbar; } else { return []; } }; var fireNewRow = function (editor, row) { return editor.fire('newrow', { node: row }); }; var fireNewCell = function (editor, cell) { return editor.fire('newcell', { node: cell }); }; var fireObjectResizeStart = function (editor, target, width, height) { editor.fire('ObjectResizeStart', { target: target, width: width, height: height }); }; var fireObjectResized = function (editor, target, width, height) { editor.fire('ObjectResized', { target: target, width: width, height: height }); }; var TableActions = function (editor, lazyWire) { var isTableBody = function (editor) { return name(getBody$1(editor)) === 'table'; }; var lastRowGuard = function (table) { var size = TableGridSize.getGridSize(table); return isTableBody(editor) === false || size.rows() > 1; }; var lastColumnGuard = function (table) { var size = TableGridSize.getGridSize(table); return isTableBody(editor) === false || size.columns() > 1; }; var cloneFormats = getCloneElements(editor); var execute = function (operation, guard, mutate, lazyWire) { return function (table, target) { removeDataStyle(table); var wire = lazyWire(); var doc = Element.fromDom(editor.getDoc()); var direction = TableDirection(Direction.directionAt); var generators = TableFill.cellOperations(mutate, doc, cloneFormats); return guard(table) ? operation(wire, table, target, generators, direction).bind(function (result) { each(result.newRows(), function (row) { fireNewRow(editor, row.dom()); }); each(result.newCells(), function (cell) { fireNewCell(editor, cell.dom()); }); return result.cursor().map(function (cell) { var rng = editor.dom.createRng(); rng.setStart(cell.dom(), 0); rng.setEnd(cell.dom(), 0); return rng; }); }) : Option.none(); }; }; var deleteRow = execute(TableOperations.eraseRows, lastRowGuard, noop, lazyWire); var deleteColumn = execute(TableOperations.eraseColumns, lastColumnGuard, noop, lazyWire); var insertRowsBefore = execute(TableOperations.insertRowsBefore, always, noop, lazyWire); var insertRowsAfter = execute(TableOperations.insertRowsAfter, always, noop, lazyWire); var insertColumnsBefore = execute(TableOperations.insertColumnsBefore, always, CellMutations.halve, lazyWire); var insertColumnsAfter = execute(TableOperations.insertColumnsAfter, always, CellMutations.halve, lazyWire); var mergeCells = execute(TableOperations.mergeCells, always, noop, lazyWire); var unmergeCells = execute(TableOperations.unmergeCells, always, noop, lazyWire); var pasteRowsBefore = execute(TableOperations.pasteRowsBefore, always, noop, lazyWire); var pasteRowsAfter = execute(TableOperations.pasteRowsAfter, always, noop, lazyWire); var pasteCells = execute(TableOperations.pasteCells, always, noop, lazyWire); return { deleteRow: deleteRow, deleteColumn: deleteColumn, insertRowsBefore: insertRowsBefore, insertRowsAfter: insertRowsAfter, insertColumnsBefore: insertColumnsBefore, insertColumnsAfter: insertColumnsAfter, mergeCells: mergeCells, unmergeCells: unmergeCells, pasteRowsBefore: pasteRowsBefore, pasteRowsAfter: pasteRowsAfter, pasteCells: pasteCells }; }; var copyRows = function (table, target, generators) { var list = DetailsList.fromTable(table); var house = Warehouse.generate(list); var details = onCells(house, target); return details.map(function (selectedCells) { var grid = Transitions.toGrid(house, generators, false); var slicedGrid = grid.slice(selectedCells[0].row(), selectedCells[selectedCells.length - 1].row() + selectedCells[selectedCells.length - 1].rowspan()); var slicedDetails = toDetailList(slicedGrid, generators); return Redraw.copy(slicedDetails); }); }; var CopyRows = { copyRows: copyRows }; var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); var getTDTHOverallStyle = function (dom, elm, name) { var cells = dom.select('td,th', elm); var firstChildStyle; var checkChildren = function (firstChildStyle, elms) { for (var i = 0; i < elms.length; i++) { var currentStyle = dom.getStyle(elms[i], name); if (typeof firstChildStyle === 'undefined') { firstChildStyle = currentStyle; } if (firstChildStyle !== currentStyle) { return ''; } } return firstChildStyle; }; firstChildStyle = checkChildren(firstChildStyle, cells); return firstChildStyle; }; var applyAlign = function (editor, elm, name) { if (name) { editor.formatter.apply('align' + name, {}, elm); } }; var applyVAlign = function (editor, elm, name) { if (name) { editor.formatter.apply('valign' + name, {}, elm); } }; var unApplyAlign = function (editor, elm) { global$1.each('left center right'.split(' '), function (name) { editor.formatter.remove('align' + name, {}, elm); }); }; var unApplyVAlign = function (editor, elm) { global$1.each('top middle bottom'.split(' '), function (name) { editor.formatter.remove('valign' + name, {}, elm); }); }; var Styles$1 = { applyAlign: applyAlign, applyVAlign: applyVAlign, unApplyAlign: unApplyAlign, unApplyVAlign: unApplyVAlign, getTDTHOverallStyle: getTDTHOverallStyle }; var buildListItems = function (inputList, itemCallback, startItems) { var appendItems = function (values, output) { output = output || []; global$1.each(values, function (item) { var menuItem = { text: item.text || item.title }; if (item.menu) { menuItem.menu = appendItems(item.menu); } else { menuItem.value = item.value; if (itemCallback) { itemCallback(menuItem); } } output.push(menuItem); }); return output; }; return appendItems(inputList, startItems || []); }; function styleFieldHasFocus(e) { return e.control.rootControl.find('#style')[0].getEl().isEqualNode(domGlobals.document.activeElement); } var syncAdvancedStyleFields = function (editor, evt) { if (styleFieldHasFocus(evt)) { updateAdvancedFields(editor, evt); } else { updateStyleField(editor, evt); } }; var updateStyleField = function (editor, evt) { var dom = editor.dom; var rootControl = evt.control.rootControl; var data = rootControl.toJSON(); var css = dom.parseStyle(data.style); css['border-style'] = data.borderStyle; css['border-color'] = data.borderColor; css['background-color'] = data.backgroundColor; css.width = data.width ? addSizeSuffix(data.width) : ''; css.height = data.height ? addSizeSuffix(data.height) : ''; rootControl.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); }; var updateAdvancedFields = function (editor, evt) { var dom = editor.dom; var rootControl = evt.control.rootControl; var data = rootControl.toJSON(); var css = dom.parseStyle(data.style); rootControl.find('#borderStyle').value(css['border-style'] || ''); rootControl.find('#borderColor').value(css['border-color'] || ''); rootControl.find('#backgroundColor').value(css['background-color'] || ''); rootControl.find('#width').value(css.width || ''); rootControl.find('#height').value(css.height || ''); }; var extractAdvancedStyles = function (dom, elm) { var css = dom.parseStyle(dom.getAttrib(elm, 'style')); var data = {}; if (css['border-style']) { data.borderStyle = css['border-style']; } if (css['border-color']) { data.borderColor = css['border-color']; } if (css['background-color']) { data.backgroundColor = css['background-color']; } data.style = dom.serializeStyle(css); return data; }; var createStyleForm = function (editor) { var createColorPickAction = function () { var colorPickerCallback = getColorPickerCallback(editor); if (colorPickerCallback) { return function (evt) { return colorPickerCallback.call(editor, function (value) { evt.control.value(value).fire('change'); }, evt.control.value()); }; } }; return { title: 'Advanced', type: 'form', defaults: { onchange: curry(updateStyleField, editor) }, items: [ { label: 'Style', name: 'style', type: 'textbox', onchange: curry(updateAdvancedFields, editor) }, { type: 'form', padding: 0, formItemDefaults: { layout: 'grid', alignH: [ 'start', 'right' ] }, defaults: { size: 7 }, items: [ { label: 'Border style', type: 'listbox', name: 'borderStyle', width: 90, onselect: curry(updateStyleField, editor), values: [ { text: 'Select...', value: '' }, { text: 'Solid', value: 'solid' }, { text: 'Dotted', value: 'dotted' }, { text: 'Dashed', value: 'dashed' }, { text: 'Double', value: 'double' }, { text: 'Groove', value: 'groove' }, { text: 'Ridge', value: 'ridge' }, { text: 'Inset', value: 'inset' }, { text: 'Outset', value: 'outset' }, { text: 'None', value: 'none' }, { text: 'Hidden', value: 'hidden' } ] }, { label: 'Border color', type: 'colorbox', name: 'borderColor', onaction: createColorPickAction() }, { label: 'Background color', type: 'colorbox', name: 'backgroundColor', onaction: createColorPickAction() } ] } ] }; }; var Helpers = { createStyleForm: createStyleForm, buildListItems: buildListItems, updateStyleField: updateStyleField, extractAdvancedStyles: extractAdvancedStyles, updateAdvancedFields: updateAdvancedFields, syncAdvancedStyleFields: syncAdvancedStyleFields }; var updateStyles = function (elm, cssText) { delete elm.dataset.mceStyle; elm.style.cssText += ';' + cssText; }; var extractDataFromElement = function (editor, elm) { var dom = editor.dom; var data = { width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'), height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'), scope: dom.getAttrib(elm, 'scope'), class: dom.getAttrib(elm, 'class'), type: elm.nodeName.toLowerCase(), style: '', align: '', valign: '' }; global$1.each('left center right'.split(' '), function (name) { if (editor.formatter.matchNode(elm, 'align' + name)) { data.align = name; } }); global$1.each('top middle bottom'.split(' '), function (name) { if (editor.formatter.matchNode(elm, 'valign' + name)) { data.valign = name; } }); if (hasAdvancedCellTab(editor)) { global$1.extend(data, Helpers.extractAdvancedStyles(dom, elm)); } return data; }; var onSubmitCellForm = function (editor, cells, evt) { var dom = editor.dom; var data; function setAttrib(elm, name, value) { if (cells.length === 1 || value) { dom.setAttrib(elm, name, value); } } function setStyle(elm, name, value) { if (cells.length === 1 || value) { dom.setStyle(elm, name, value); } } if (hasAdvancedCellTab(editor)) { Helpers.syncAdvancedStyleFields(editor, evt); } data = evt.control.rootControl.toJSON(); editor.undoManager.transact(function () { global$1.each(cells, function (cellElm) { setAttrib(cellElm, 'scope', data.scope); if (cells.length === 1) { setAttrib(cellElm, 'style', data.style); } else { updateStyles(cellElm, data.style); } setAttrib(cellElm, 'class', data.class); setStyle(cellElm, 'width', addSizeSuffix(data.width)); setStyle(cellElm, 'height', addSizeSuffix(data.height)); if (data.type && cellElm.nodeName.toLowerCase() !== data.type) { cellElm = dom.rename(cellElm, data.type); } if (cells.length === 1) { Styles$1.unApplyAlign(editor, cellElm); Styles$1.unApplyVAlign(editor, cellElm); } if (data.align) { Styles$1.applyAlign(editor, cellElm, data.align); } if (data.valign) { Styles$1.applyVAlign(editor, cellElm, data.valign); } }); editor.focus(); }); }; var open = function (editor) { var cellElm, data, classListCtrl, cells = []; cells = editor.dom.select('td[data-mce-selected],th[data-mce-selected]'); cellElm = editor.dom.getParent(editor.selection.getStart(), 'td,th'); if (!cells.length && cellElm) { cells.push(cellElm); } cellElm = cellElm || cells[0]; if (!cellElm) { return; } if (cells.length > 1) { data = { width: '', height: '', scope: '', class: '', align: '', valign: '', style: '', type: cellElm.nodeName.toLowerCase() }; } else { data = extractDataFromElement(editor, cellElm); } if (getCellClassList(editor).length > 0) { classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: Helpers.buildListItems(getCellClassList(editor), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ block: 'td', classes: [item.value] }); }; } }) }; } var generalCellForm = { type: 'form', layout: 'flex', direction: 'column', labelGapCalc: 'children', padding: 0, items: [ { type: 'form', layout: 'grid', columns: 2, labelGapCalc: false, padding: 0, defaults: { type: 'textbox', maxWidth: 50 }, items: [ { label: 'Width', name: 'width', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Height', name: 'height', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Cell type', name: 'type', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'Cell', value: 'td' }, { text: 'Header cell', value: 'th' } ] }, { label: 'Scope', name: 'scope', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Row', value: 'row' }, { text: 'Column', value: 'col' }, { text: 'Row group', value: 'rowgroup' }, { text: 'Column group', value: 'colgroup' } ] }, { label: 'H Align', name: 'align', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Left', value: 'left' }, { text: 'Center', value: 'center' }, { text: 'Right', value: 'right' } ] }, { label: 'V Align', name: 'valign', type: 'listbox', text: 'None', minWidth: 90, maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Top', value: 'top' }, { text: 'Middle', value: 'middle' }, { text: 'Bottom', value: 'bottom' } ] } ] }, classListCtrl ] }; if (hasAdvancedCellTab(editor)) { editor.windowManager.open({ title: 'Cell properties', bodyType: 'tabpanel', data: data, body: [ { title: 'General', type: 'form', items: generalCellForm }, Helpers.createStyleForm(editor) ], onsubmit: curry(onSubmitCellForm, editor, cells) }); } else { editor.windowManager.open({ title: 'Cell properties', data: data, body: generalCellForm, onsubmit: curry(onSubmitCellForm, editor, cells) }); } }; var CellDialog = { open: open }; var extractDataFromElement$1 = function (editor, elm) { var dom = editor.dom; var data = { height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'), scope: dom.getAttrib(elm, 'scope'), class: dom.getAttrib(elm, 'class'), align: '', style: '', type: elm.parentNode.nodeName.toLowerCase() }; global$1.each('left center right'.split(' '), function (name) { if (editor.formatter.matchNode(elm, 'align' + name)) { data.align = name; } }); if (hasAdvancedRowTab(editor)) { global$1.extend(data, Helpers.extractAdvancedStyles(dom, elm)); } return data; }; var switchRowType = function (dom, rowElm, toType) { var tableElm = dom.getParent(rowElm, 'table'); var oldParentElm = rowElm.parentNode; var parentElm = dom.select(toType, tableElm)[0]; if (!parentElm) { parentElm = dom.create(toType); if (tableElm.firstChild) { if (tableElm.firstChild.nodeName === 'CAPTION') { dom.insertAfter(parentElm, tableElm.firstChild); } else { tableElm.insertBefore(parentElm, tableElm.firstChild); } } else { tableElm.appendChild(parentElm); } } parentElm.appendChild(rowElm); if (!oldParentElm.hasChildNodes()) { dom.remove(oldParentElm); } }; function onSubmitRowForm(editor, rows, oldData, evt) { var dom = editor.dom; function setAttrib(elm, name, value) { if (rows.length === 1 || value) { dom.setAttrib(elm, name, value); } } function setStyle(elm, name, value) { if (rows.length === 1 || value) { dom.setStyle(elm, name, value); } } if (hasAdvancedRowTab(editor)) { Helpers.syncAdvancedStyleFields(editor, evt); } var data = evt.control.rootControl.toJSON(); editor.undoManager.transact(function () { global$1.each(rows, function (rowElm) { setAttrib(rowElm, 'scope', data.scope); setAttrib(rowElm, 'style', data.style); setAttrib(rowElm, 'class', data.class); setStyle(rowElm, 'height', addSizeSuffix(data.height)); if (data.type !== rowElm.parentNode.nodeName.toLowerCase()) { switchRowType(editor.dom, rowElm, data.type); } if (data.align !== oldData.align) { Styles$1.unApplyAlign(editor, rowElm); Styles$1.applyAlign(editor, rowElm, data.align); } }); editor.focus(); }); } var open$1 = function (editor) { var dom = editor.dom; var tableElm, cellElm, rowElm, classListCtrl, data; var rows = []; var generalRowForm; tableElm = dom.getParent(editor.selection.getStart(), 'table'); cellElm = dom.getParent(editor.selection.getStart(), 'td,th'); global$1.each(tableElm.rows, function (row) { global$1.each(row.cells, function (cell) { if (dom.getAttrib(cell, 'data-mce-selected') || cell === cellElm) { rows.push(row); return false; } }); }); rowElm = rows[0]; if (!rowElm) { return; } if (rows.length > 1) { data = { height: '', scope: '', style: '', class: '', align: '', type: rowElm.parentNode.nodeName.toLowerCase() }; } else { data = extractDataFromElement$1(editor, rowElm); } if (getRowClassList(editor).length > 0) { classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: Helpers.buildListItems(getRowClassList(editor), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ block: 'tr', classes: [item.value] }); }; } }) }; } generalRowForm = { type: 'form', columns: 2, padding: 0, defaults: { type: 'textbox' }, items: [ { type: 'listbox', name: 'type', label: 'Row type', text: 'Header', maxWidth: null, values: [ { text: 'Header', value: 'thead' }, { text: 'Body', value: 'tbody' }, { text: 'Footer', value: 'tfoot' } ] }, { type: 'listbox', name: 'align', label: 'Alignment', text: 'None', maxWidth: null, values: [ { text: 'None', value: '' }, { text: 'Left', value: 'left' }, { text: 'Center', value: 'center' }, { text: 'Right', value: 'right' } ] }, { label: 'Height', name: 'height' }, classListCtrl ] }; if (hasAdvancedRowTab(editor)) { editor.windowManager.open({ title: 'Row properties', data: data, bodyType: 'tabpanel', body: [ { title: 'General', type: 'form', items: generalRowForm }, Helpers.createStyleForm(editor) ], onsubmit: curry(onSubmitRowForm, editor, rows, data) }); } else { editor.windowManager.open({ title: 'Row properties', data: data, body: generalRowForm, onsubmit: curry(onSubmitRowForm, editor, rows, data) }); } }; var RowDialog = { open: open$1 }; var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); var DefaultRenderOptions = { styles: { 'border-collapse': 'collapse', 'width': '100%' }, attributes: { border: '1' }, percentages: true }; var makeTable = function () { return Element.fromTag('table'); }; var tableBody = function () { return Element.fromTag('tbody'); }; var tableRow = function () { return Element.fromTag('tr'); }; var tableHeaderCell = function () { return Element.fromTag('th'); }; var tableCell = function () { return Element.fromTag('td'); }; var render$1 = function (rows, columns, rowHeaders, columnHeaders, renderOpts) { if (renderOpts === void 0) { renderOpts = DefaultRenderOptions; } var table = makeTable(); setAll$1(table, renderOpts.styles); setAll(table, renderOpts.attributes); var tbody = tableBody(); append(table, tbody); var trs = []; for (var i = 0; i < rows; i++) { var tr = tableRow(); for (var j = 0; j < columns; j++) { var td = i < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell(); if (j < columnHeaders) { set(td, 'scope', 'row'); } if (i < rowHeaders) { set(td, 'scope', 'col'); } append(td, Element.fromTag('br')); if (renderOpts.percentages) { set$1(td, 'width', 100 / columns + '%'); } append(tr, td); } trs.push(tr); } append$1(tbody, trs); return table; }; var get$7 = function (element) { return element.dom().innerHTML; }; var getOuter$2 = function (element) { var container = Element.fromTag('div'); var clone = Element.fromDom(element.dom().cloneNode(true)); append(container, clone); return get$7(container); }; var placeCaretInCell = function (editor, cell) { editor.selection.select(cell.dom(), true); editor.selection.collapse(true); }; var selectFirstCellInTable = function (editor, tableElm) { descendant$1(tableElm, 'td,th').each(curry(placeCaretInCell, editor)); }; var fireEvents = function (editor, table) { each(descendants$1(table, 'tr'), function (row) { fireNewRow(editor, row.dom()); each(descendants$1(row, 'th,td'), function (cell) { fireNewCell(editor, cell.dom()); }); }); }; var isPercentage = function (width) { return isString(width) && width.indexOf('%') !== -1; }; var insert$1 = function (editor, columns, rows) { var defaultStyles = getDefaultStyles(editor); var options = { styles: defaultStyles, attributes: getDefaultAttributes(editor), percentages: isPercentage(defaultStyles.width) && !isPixelsForced(editor) }; var table = render$1(rows, columns, 0, 0, options); set(table, 'data-mce-id', '__mce'); var html = getOuter$2(table); editor.insertContent(html); return descendant$1(getBody$1(editor), 'table[data-mce-id="__mce"]').map(function (table) { if (isPixelsForced(editor)) { set$1(table, 'width', get$1(table, 'width')); } remove(table, 'data-mce-id'); fireEvents(editor, table); selectFirstCellInTable(editor, table); return table.dom(); }).getOr(null); }; var InsertTable = { insert: insert$1 }; function styleTDTH(dom, elm, name, value) { if (elm.tagName === 'TD' || elm.tagName === 'TH') { dom.setStyle(elm, name, value); } else { if (elm.children) { for (var i = 0; i < elm.children.length; i++) { styleTDTH(dom, elm.children[i], name, value); } } } } var extractDataFromElement$2 = function (editor, tableElm) { var dom = editor.dom; var data = { width: dom.getStyle(tableElm, 'width') || dom.getAttrib(tableElm, 'width'), height: dom.getStyle(tableElm, 'height') || dom.getAttrib(tableElm, 'height'), cellspacing: dom.getStyle(tableElm, 'border-spacing') || dom.getAttrib(tableElm, 'cellspacing'), cellpadding: dom.getAttrib(tableElm, 'data-mce-cell-padding') || dom.getAttrib(tableElm, 'cellpadding') || Styles$1.getTDTHOverallStyle(editor.dom, tableElm, 'padding'), border: dom.getAttrib(tableElm, 'data-mce-border') || dom.getAttrib(tableElm, 'border') || Styles$1.getTDTHOverallStyle(editor.dom, tableElm, 'border'), borderColor: dom.getAttrib(tableElm, 'data-mce-border-color'), caption: !!dom.select('caption', tableElm)[0], class: dom.getAttrib(tableElm, 'class') }; global$1.each('left center right'.split(' '), function (name) { if (editor.formatter.matchNode(tableElm, 'align' + name)) { data.align = name; } }); if (hasAdvancedTableTab(editor)) { global$1.extend(data, Helpers.extractAdvancedStyles(dom, tableElm)); } return data; }; var applyDataToElement = function (editor, tableElm, data) { var dom = editor.dom; var attrs = {}; var styles = {}; attrs.class = data.class; styles.height = addSizeSuffix(data.height); if (dom.getAttrib(tableElm, 'width') && !shouldStyleWithCss(editor)) { attrs.width = removePxSuffix(data.width); } else { styles.width = addSizeSuffix(data.width); } if (shouldStyleWithCss(editor)) { styles['border-width'] = addSizeSuffix(data.border); styles['border-spacing'] = addSizeSuffix(data.cellspacing); global$1.extend(attrs, { 'data-mce-border-color': data.borderColor, 'data-mce-cell-padding': data.cellpadding, 'data-mce-border': data.border }); } else { global$1.extend(attrs, { border: data.border, cellpadding: data.cellpadding, cellspacing: data.cellspacing }); } if (shouldStyleWithCss(editor)) { if (tableElm.children) { for (var i = 0; i < tableElm.children.length; i++) { styleTDTH(dom, tableElm.children[i], { 'border-width': addSizeSuffix(data.border), 'border-color': data.borderColor, 'padding': addSizeSuffix(data.cellpadding) }); } } } if (data.style) { global$1.extend(styles, dom.parseStyle(data.style)); } else { styles = global$1.extend({}, dom.parseStyle(dom.getAttrib(tableElm, 'style')), styles); } attrs.style = dom.serializeStyle(styles); dom.setAttribs(tableElm, attrs); }; var onSubmitTableForm = function (editor, tableElm, evt) { var dom = editor.dom; var captionElm; var data; if (hasAdvancedTableTab(editor)) { Helpers.syncAdvancedStyleFields(editor, evt); } data = evt.control.rootControl.toJSON(); if (data.class === false) { delete data.class; } editor.undoManager.transact(function () { if (!tableElm) { tableElm = InsertTable.insert(editor, data.cols || 1, data.rows || 1); } applyDataToElement(editor, tableElm, data); captionElm = dom.select('caption', tableElm)[0]; if (captionElm && !data.caption) { dom.remove(captionElm); } if (!captionElm && data.caption) { captionElm = dom.create('caption'); captionElm.innerHTML = !global$2.ie ? '
' : '\xA0'; tableElm.insertBefore(captionElm, tableElm.firstChild); } Styles$1.unApplyAlign(editor, tableElm); if (data.align) { Styles$1.applyAlign(editor, tableElm, data.align); } editor.focus(); editor.addVisual(); }); }; var open$2 = function (editor, isProps) { var dom = editor.dom; var tableElm, colsCtrl, rowsCtrl, classListCtrl, data = {}, generalTableForm; if (isProps === true) { tableElm = dom.getParent(editor.selection.getStart(), 'table'); if (tableElm) { data = extractDataFromElement$2(editor, tableElm); } } else { colsCtrl = { label: 'Cols', name: 'cols' }; rowsCtrl = { label: 'Rows', name: 'rows' }; } if (getTableClassList(editor).length > 0) { if (data.class) { data.class = data.class.replace(/\s*mce\-item\-table\s*/g, ''); } classListCtrl = { name: 'class', type: 'listbox', label: 'Class', values: Helpers.buildListItems(getTableClassList(editor), function (item) { if (item.value) { item.textStyle = function () { return editor.formatter.getCssText({ block: 'table', classes: [item.value] }); }; } }) }; } generalTableForm = { type: 'form', layout: 'flex', direction: 'column', labelGapCalc: 'children', padding: 0, items: [ { type: 'form', labelGapCalc: false, padding: 0, layout: 'grid', columns: 2, defaults: { type: 'textbox', maxWidth: 50 }, items: hasAppearanceOptions(editor) ? [ colsCtrl, rowsCtrl, { label: 'Width', name: 'width', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Height', name: 'height', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Cell spacing', name: 'cellspacing' }, { label: 'Cell padding', name: 'cellpadding' }, { label: 'Border', name: 'border' }, { label: 'Caption', name: 'caption', type: 'checkbox' } ] : [ colsCtrl, rowsCtrl, { label: 'Width', name: 'width', onchange: curry(Helpers.updateStyleField, editor) }, { label: 'Height', name: 'height', onchange: curry(Helpers.updateStyleField, editor) } ] }, { label: 'Alignment', name: 'align', type: 'listbox', text: 'None', values: [ { text: 'None', value: '' }, { text: 'Left', value: 'left' }, { text: 'Center', value: 'center' }, { text: 'Right', value: 'right' } ] }, classListCtrl ] }; if (hasAdvancedTableTab(editor)) { editor.windowManager.open({ title: 'Table properties', data: data, bodyType: 'tabpanel', body: [ { title: 'General', type: 'form', items: generalTableForm }, Helpers.createStyleForm(editor) ], onsubmit: curry(onSubmitTableForm, editor, tableElm) }); } else { editor.windowManager.open({ title: 'Table properties', data: data, body: generalTableForm, onsubmit: curry(onSubmitTableForm, editor, tableElm) }); } }; var TableDialog = { open: open$2 }; var each$3 = global$1.each; var registerCommands = function (editor, actions, cellSelection, selections, clipboardRows) { var isRoot = getIsRoot(editor); var eraseTable = function () { getSelectionStartCell().orThunk(getSelectionStartCaption).each(function (cellOrCaption) { var table = TableLookup.table(cellOrCaption, isRoot); table.filter(not(isRoot)).each(function (table) { var cursor = Element.fromText(''); after(table, cursor); remove$2(table); var rng = editor.dom.createRng(); rng.setStart(cursor.dom(), 0); rng.setEnd(cursor.dom(), 0); editor.selection.setRng(rng); }); }); }; var getSelectionStartFromSelector = function (selector) { return function () { return Option.from(editor.dom.getParent(editor.selection.getStart(), selector)).map(Element.fromDom); }; }; var getSelectionStartCaption = getSelectionStartFromSelector('caption'); var getSelectionStartCell = getSelectionStartFromSelector('th,td'); var getTableFromCell = function (cell) { return TableLookup.table(cell, isRoot); }; var getSize = function (table) { return { width: getPixelWidth$1(table.dom()), height: getPixelWidth$1(table.dom()) }; }; var resizeChange = function (editor, oldSize, table) { var newSize = getSize(table); if (oldSize.width !== newSize.width || oldSize.height !== newSize.height) { fireObjectResizeStart(editor, table.dom(), oldSize.width, oldSize.height); fireObjectResized(editor, table.dom(), newSize.width, newSize.height); } }; var actOnSelection = function (execute) { getSelectionStartCell().each(function (cell) { getTableFromCell(cell).each(function (table) { var targets = TableTargets.forMenu(selections, table, cell); var beforeSize = getSize(table); execute(table, targets).each(function (rng) { resizeChange(editor, beforeSize, table); editor.selection.setRng(rng); editor.focus(); cellSelection.clear(table); removeDataStyle(table); }); }); }); }; var copyRowSelection = function (execute) { return getSelectionStartCell().bind(function (cell) { return getTableFromCell(cell).bind(function (table) { var doc = Element.fromDom(editor.getDoc()); var targets = TableTargets.forMenu(selections, table, cell); var generators = TableFill.cellOperations(noop, doc, Option.none()); return CopyRows.copyRows(table, targets, generators); }); }); }; var pasteOnSelection = function (execute) { clipboardRows.get().each(function (rows) { var clonedRows = map(rows, function (row) { return deep(row); }); getSelectionStartCell().each(function (cell) { getTableFromCell(cell).each(function (table) { var doc = Element.fromDom(editor.getDoc()); var generators = TableFill.paste(doc); var targets = TableTargets.pasteRows(selections, table, cell, clonedRows, generators); execute(table, targets).each(function (rng) { editor.selection.setRng(rng); editor.focus(); cellSelection.clear(table); }); }); }); }); }; each$3({ mceTableSplitCells: function () { actOnSelection(actions.unmergeCells); }, mceTableMergeCells: function () { actOnSelection(actions.mergeCells); }, mceTableInsertRowBefore: function () { actOnSelection(actions.insertRowsBefore); }, mceTableInsertRowAfter: function () { actOnSelection(actions.insertRowsAfter); }, mceTableInsertColBefore: function () { actOnSelection(actions.insertColumnsBefore); }, mceTableInsertColAfter: function () { actOnSelection(actions.insertColumnsAfter); }, mceTableDeleteCol: function () { actOnSelection(actions.deleteColumn); }, mceTableDeleteRow: function () { actOnSelection(actions.deleteRow); }, mceTableCutRow: function (grid) { clipboardRows.set(copyRowSelection()); actOnSelection(actions.deleteRow); }, mceTableCopyRow: function (grid) { clipboardRows.set(copyRowSelection()); }, mceTablePasteRowBefore: function (grid) { pasteOnSelection(actions.pasteRowsBefore); }, mceTablePasteRowAfter: function (grid) { pasteOnSelection(actions.pasteRowsAfter); }, mceTableDelete: eraseTable }, function (func, name) { editor.addCommand(name, func); }); each$3({ mceInsertTable: curry(TableDialog.open, editor), mceTableProps: curry(TableDialog.open, editor, true), mceTableRowProps: curry(RowDialog.open, editor), mceTableCellProps: curry(CellDialog.open, editor) }, function (func, name) { editor.addCommand(name, function (ui, val) { func(val); }); }); }; var Commands = { registerCommands: registerCommands }; var only = function (element) { var parent = Option.from(element.dom().documentElement).map(Element.fromDom).getOr(element); return { parent: constant(parent), view: constant(element), origin: constant(Position(0, 0)) }; }; var detached = function (editable, chrome) { var origin = function () { return absolute(chrome); }; return { parent: constant(chrome), view: constant(editable), origin: origin }; }; var body$1 = function (editable, chrome) { return { parent: constant(chrome), view: constant(editable), origin: constant(Position(0, 0)) }; }; var ResizeWire = { only: only, detached: detached, body: body$1 }; var Event = function (fields) { var struct = Immutable.apply(null, fields); var handlers = []; var bind = function (handler) { if (handler === undefined) { throw new Error('Event bind error: undefined handler'); } handlers.push(handler); }; var unbind = function (handler) { handlers = filter(handlers, function (h) { return h !== handler; }); }; var trigger = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var event = struct.apply(null, args); each(handlers, function (handler) { handler(event); }); }; return { bind: bind, unbind: unbind, trigger: trigger }; }; var create$1 = function (typeDefs) { var registry = map$1(typeDefs, function (event) { return { bind: event.bind, unbind: event.unbind }; }); var trigger = map$1(typeDefs, function (event) { return event.trigger; }); return { registry: registry, trigger: trigger }; }; var Events = { create: create$1 }; var mkEvent = function (target, x, y, stop, prevent, kill, raw) { return { target: constant(target), x: constant(x), y: constant(y), stop: stop, prevent: prevent, kill: kill, raw: constant(raw) }; }; var handle = function (filter, handler) { return function (rawEvent) { if (!filter(rawEvent)) { return; } var target = Element.fromDom(rawEvent.target); var stop = function () { rawEvent.stopPropagation(); }; var prevent = function () { rawEvent.preventDefault(); }; var kill = compose(prevent, stop); var evt = mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); handler(evt); }; }; var binder = function (element, event, filter, handler, useCapture) { var wrapped = handle(filter, handler); element.dom().addEventListener(event, wrapped, useCapture); return { unbind: curry(unbind, element, event, wrapped, useCapture) }; }; var bind$1 = function (element, event, filter, handler) { return binder(element, event, filter, handler, false); }; var unbind = function (element, event, handler, useCapture) { element.dom().removeEventListener(event, handler, useCapture); }; var filter$1 = constant(true); var bind$2 = function (element, event, handler) { return bind$1(element, event, filter$1, handler); }; var hasOwnProperty = Object.prototype.hasOwnProperty; var shallow$1 = function (old, nu) { return nu; }; var baseMerge = function (merger) { return function () { var objects = new Array(arguments.length); for (var i = 0; i < objects.length; i++) { objects[i] = arguments[i]; } if (objects.length === 0) { throw new Error('Can\'t merge zero objects'); } var ret = {}; for (var j = 0; j < objects.length; j++) { var curObject = objects[j]; for (var key in curObject) { if (hasOwnProperty.call(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } } } return ret; }; }; var merge$3 = baseMerge(shallow$1); var styles$1 = css('ephox-dragster'); var Styles$2 = { resolve: styles$1.resolve }; var Blocker = function (options) { var settings = merge$3({ layerClass: Styles$2.resolve('blocker') }, options); var div = Element.fromTag('div'); set(div, 'role', 'presentation'); setAll$1(div, { position: 'fixed', left: '0px', top: '0px', width: '100%', height: '100%' }); add$2(div, Styles$2.resolve('blocker')); add$2(div, settings.layerClass); var element = function () { return div; }; var destroy = function () { remove$2(div); }; return { element: element, destroy: destroy }; }; var DragMode = exactly([ 'compare', 'extract', 'mutate', 'sink' ]); var DragSink = exactly([ 'element', 'start', 'stop', 'destroy' ]); var DragApi = exactly([ 'forceDrop', 'drop', 'move', 'delayDrop' ]); var compare = function (old, nu) { return Position(nu.left() - old.left(), nu.top() - old.top()); }; var extract$1 = function (event) { return Option.some(Position(event.x(), event.y())); }; var mutate = function (mutation, info) { mutation.mutate(info.left(), info.top()); }; var sink = function (dragApi, settings) { var blocker = Blocker(settings); var mdown = bind$2(blocker.element(), 'mousedown', dragApi.forceDrop); var mup = bind$2(blocker.element(), 'mouseup', dragApi.drop); var mmove = bind$2(blocker.element(), 'mousemove', dragApi.move); var mout = bind$2(blocker.element(), 'mouseout', dragApi.delayDrop); var destroy = function () { blocker.destroy(); mup.unbind(); mmove.unbind(); mout.unbind(); mdown.unbind(); }; var start = function (parent) { append(parent, blocker.element()); }; var stop = function () { remove$2(blocker.element()); }; return DragSink({ element: blocker.element, start: start, stop: stop, destroy: destroy }); }; var MouseDrag = DragMode({ compare: compare, extract: extract$1, sink: sink, mutate: mutate }); var last$2 = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { domGlobals.clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer !== null) { domGlobals.clearTimeout(timer); } timer = domGlobals.setTimeout(function () { fn.apply(null, args); timer = null; }, rate); }; return { cancel: cancel, throttle: throttle }; }; function InDrag () { var previous = Option.none(); var reset = function () { previous = Option.none(); }; var update = function (mode, nu) { var result = previous.map(function (old) { return mode.compare(old, nu); }); previous = Option.some(nu); return result; }; var onEvent = function (event, mode) { var dataOption = mode.extract(event); dataOption.each(function (data) { var offset = update(mode, data); offset.each(function (d) { events.trigger.move(d); }); }); }; var events = Events.create({ move: Event(['info']) }); return { onEvent: onEvent, reset: reset, events: events.registry }; } function NoDrag () { return { onEvent: noop, reset: noop }; } function Movement () { var noDragState = NoDrag(); var inDragState = InDrag(); var dragState = noDragState; var on = function () { dragState.reset(); dragState = inDragState; }; var off = function () { dragState.reset(); dragState = noDragState; }; var onEvent = function (event, mode) { dragState.onEvent(event, mode); }; var isOn = function () { return dragState === inDragState; }; return { on: on, off: off, isOn: isOn, onEvent: onEvent, events: inDragState.events }; } var setup = function (mutation, mode, settings) { var active = false; var events = Events.create({ start: Event([]), stop: Event([]) }); var movement = Movement(); var drop = function () { sink.stop(); if (movement.isOn()) { movement.off(); events.trigger.stop(); } }; var throttledDrop = last$2(drop, 200); var go = function (parent) { sink.start(parent); movement.on(); events.trigger.start(); }; var mousemove = function (event) { throttledDrop.cancel(); movement.onEvent(event, mode); }; movement.events.move.bind(function (event) { mode.mutate(mutation, event.info()); }); var on = function () { active = true; }; var off = function () { active = false; }; var runIfActive = function (f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (active) { f.apply(null, args); } }; }; var sink = mode.sink(DragApi({ forceDrop: drop, drop: runIfActive(drop), move: runIfActive(mousemove), delayDrop: runIfActive(throttledDrop.throttle) }), settings); var destroy = function () { sink.destroy(); }; return { element: sink.element, go: go, on: on, off: off, destroy: destroy, events: events.registry }; }; var Dragging = { setup: setup }; var transform$1 = function (mutation, settings) { if (settings === void 0) { settings = {}; } var mode = settings.mode !== undefined ? settings.mode : MouseDrag; return Dragging.setup(mutation, mode, settings); }; var Dragger = { transform: transform$1 }; var Mutation = function () { var events = Events.create({ drag: Event([ 'xDelta', 'yDelta' ]) }); var mutate = function (x, y) { events.trigger.drag(x, y); }; return { mutate: mutate, events: events.registry }; }; var BarMutation = function () { var events = Events.create({ drag: Event([ 'xDelta', 'yDelta', 'target' ]) }); var target = Option.none(); var delegate = Mutation(); delegate.events.drag.bind(function (event) { target.each(function (t) { events.trigger.drag(event.xDelta(), event.yDelta(), t); }); }); var assign = function (t) { target = Option.some(t); }; var get = function () { return target; }; return { assign: assign, get: get, mutate: delegate.mutate, events: events.registry }; }; var isContentEditableTrue = function (elm) { return get(elm, 'contenteditable') === 'true'; }; var findClosestContentEditable = function (target, isRoot) { return closest$1(target, '[contenteditable]', isRoot); }; var resizeBarDragging = Styles.resolve('resizer-bar-dragging'); var BarManager = function (wire, direction, hdirection) { var mutation = BarMutation(); var resizing = Dragger.transform(mutation, {}); var hoverTable = Option.none(); var getResizer = function (element, type) { return Option.from(get(element, type)); }; mutation.events.drag.bind(function (event) { getResizer(event.target(), 'data-row').each(function (_dataRow) { var currentRow = CellUtils.getInt(event.target(), 'top'); set$1(event.target(), 'top', currentRow + event.yDelta() + 'px'); }); getResizer(event.target(), 'data-column').each(function (_dataCol) { var currentCol = CellUtils.getInt(event.target(), 'left'); set$1(event.target(), 'left', currentCol + event.xDelta() + 'px'); }); }); var getDelta = function (target, dir) { var newX = CellUtils.getInt(target, dir); var oldX = parseInt(get(target, 'data-initial-' + dir), 10); return newX - oldX; }; resizing.events.stop.bind(function () { mutation.get().each(function (target) { hoverTable.each(function (table) { getResizer(target, 'data-row').each(function (row) { var delta = getDelta(target, 'top'); remove(target, 'data-initial-top'); events.trigger.adjustHeight(table, delta, parseInt(row, 10)); }); getResizer(target, 'data-column').each(function (column) { var delta = getDelta(target, 'left'); remove(target, 'data-initial-left'); events.trigger.adjustWidth(table, delta, parseInt(column, 10)); }); Bars.refresh(wire, table, hdirection, direction); }); }); }); var handler = function (target, dir) { events.trigger.startAdjust(); mutation.assign(target); set(target, 'data-initial-' + dir, parseInt(get$1(target, dir), 10)); add$2(target, resizeBarDragging); set$1(target, 'opacity', '0.2'); resizing.go(wire.parent()); }; var mousedown = bind$2(wire.parent(), 'mousedown', function (event) { if (Bars.isRowBar(event.target())) { handler(event.target(), 'top'); } if (Bars.isColBar(event.target())) { handler(event.target(), 'left'); } }); var isRoot = function (e) { return eq(e, wire.view()); }; var findClosestEditableTable = function (target) { return closest$1(target, 'table', isRoot).filter(function (table) { return findClosestContentEditable(table, isRoot).exists(isContentEditableTrue); }); }; var mouseover = bind$2(wire.view(), 'mouseover', function (event) { findClosestEditableTable(event.target()).fold(function () { if (inBody(event.target())) { Bars.destroy(wire); } }, function (table) { hoverTable = Option.some(table); Bars.refresh(wire, table, hdirection, direction); }); }); var destroy = function () { mousedown.unbind(); mouseover.unbind(); resizing.destroy(); Bars.destroy(wire); }; var refresh = function (tbl) { Bars.refresh(wire, tbl, hdirection, direction); }; var events = Events.create({ adjustHeight: Event([ 'table', 'delta', 'row' ]), adjustWidth: Event([ 'table', 'delta', 'column' ]), startAdjust: Event([]) }); return { destroy: destroy, refresh: refresh, on: resizing.on, off: resizing.off, hideBars: curry(Bars.hide, wire), showBars: curry(Bars.show, wire), events: events.registry }; }; var create$2 = function (wire, vdirection) { var hdirection = BarPositions.height; var manager = BarManager(wire, vdirection, hdirection); var events = Events.create({ beforeResize: Event(['table']), afterResize: Event(['table']), startDrag: Event([]) }); manager.events.adjustHeight.bind(function (event) { events.trigger.beforeResize(event.table()); var delta = hdirection.delta(event.delta(), event.table()); Adjustments.adjustHeight(event.table(), delta, event.row(), hdirection); events.trigger.afterResize(event.table()); }); manager.events.startAdjust.bind(function (event) { events.trigger.startDrag(); }); manager.events.adjustWidth.bind(function (event) { events.trigger.beforeResize(event.table()); var delta = vdirection.delta(event.delta(), event.table()); Adjustments.adjustWidth(event.table(), delta, event.column(), vdirection); events.trigger.afterResize(event.table()); }); return { on: manager.on, off: manager.off, hideBars: manager.hideBars, showBars: manager.showBars, destroy: manager.destroy, events: events.registry }; }; var TableResize = { create: create$2 }; var createContainer = function () { var container = Element.fromTag('div'); setAll$1(container, { position: 'static', height: '0', width: '0', padding: '0', margin: '0', border: '0' }); append(body(), container); return container; }; var get$8 = function (editor, container) { return editor.inline ? ResizeWire.body(getBody$1(editor), createContainer()) : ResizeWire.only(Element.fromDom(editor.getDoc())); }; var remove$6 = function (editor, wire) { if (editor.inline) { remove$2(wire.parent()); } }; var TableWire = { get: get$8, remove: remove$6 }; var ResizeHandler = function (editor) { var selectionRng = Option.none(); var resize = Option.none(); var wire = Option.none(); var percentageBasedSizeRegex = /(\d+(\.\d+)?)%/; var startW, startRawW; var isTable = function (elm) { return elm.nodeName === 'TABLE'; }; var getRawWidth = function (elm) { return editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width'); }; var lazyResize = function () { return resize; }; var lazyWire = function () { return wire.getOr(ResizeWire.only(Element.fromDom(editor.getBody()))); }; var destroy = function () { resize.each(function (sz) { sz.destroy(); }); wire.each(function (w) { TableWire.remove(editor, w); }); }; editor.on('init', function () { var direction = TableDirection(Direction.directionAt); var rawWire = TableWire.get(editor); wire = Option.some(rawWire); if (hasObjectResizing(editor) && hasTableResizeBars(editor)) { var sz = TableResize.create(rawWire, direction); sz.on(); sz.events.startDrag.bind(function (event) { selectionRng = Option.some(editor.selection.getRng()); }); sz.events.beforeResize.bind(function (event) { var rawTable = event.table().dom(); fireObjectResizeStart(editor, rawTable, getPixelWidth$1(rawTable), getPixelHeight(rawTable)); }); sz.events.afterResize.bind(function (event) { var table = event.table(); var rawTable = table.dom(); removeDataStyle(table); selectionRng.each(function (rng) { editor.selection.setRng(rng); editor.focus(); }); fireObjectResized(editor, rawTable, getPixelWidth$1(rawTable), getPixelHeight(rawTable)); editor.undoManager.add(); }); resize = Option.some(sz); } }); editor.on('ObjectResizeStart', function (e) { var targetElm = e.target; if (isTable(targetElm)) { startW = e.width; startRawW = getRawWidth(targetElm); } }); editor.on('ObjectResized', function (e) { var targetElm = e.target; if (isTable(targetElm)) { var table = targetElm; if (percentageBasedSizeRegex.test(startRawW)) { var percentW = parseFloat(percentageBasedSizeRegex.exec(startRawW)[1]); var targetPercentW = e.width * percentW / startW; editor.dom.setStyle(table, 'width', targetPercentW + '%'); } else { var newCellSizes_1 = []; global$1.each(table.rows, function (row) { global$1.each(row.cells, function (cell) { var width = editor.dom.getStyle(cell, 'width', true); newCellSizes_1.push({ cell: cell, width: width }); }); }); global$1.each(newCellSizes_1, function (newCellSize) { editor.dom.setStyle(newCellSize.cell, 'width', newCellSize.width); editor.dom.setAttrib(newCellSize.cell, 'width', null); }); } } }); return { lazyResize: lazyResize, lazyWire: lazyWire, destroy: destroy }; }; var adt$1 = Adt.generate([ { none: ['current'] }, { first: ['current'] }, { middle: [ 'current', 'target' ] }, { last: ['current'] } ]); var none$1 = function (current) { if (current === void 0) { current = undefined; } return adt$1.none(current); }; var CellLocation = __assign(__assign({}, adt$1), { none: none$1 }); var detect$4 = function (current, isRoot) { return TableLookup.table(current, isRoot).bind(function (table) { var all = TableLookup.cells(table); var index = findIndex(all, function (x) { return eq(current, x); }); return index.map(function (ind) { return { index: constant(ind), all: constant(all) }; }); }); }; var next = function (current, isRoot) { var detection = detect$4(current, isRoot); return detection.fold(function () { return CellLocation.none(current); }, function (info) { return info.index() + 1 < info.all().length ? CellLocation.middle(current, info.all()[info.index() + 1]) : CellLocation.last(current); }); }; var prev = function (current, isRoot) { var detection = detect$4(current, isRoot); return detection.fold(function () { return CellLocation.none(); }, function (info) { return info.index() - 1 >= 0 ? CellLocation.middle(current, info.all()[info.index() - 1]) : CellLocation.first(current); }); }; var CellNavigation = { next: next, prev: prev }; var create$3 = Immutable('start', 'soffset', 'finish', 'foffset'); var SimRange = { create: create$3 }; var adt$2 = Adt.generate([ { before: ['element'] }, { on: [ 'element', 'offset' ] }, { after: ['element'] } ]); var cata$1 = function (subject, onBefore, onOn, onAfter) { return subject.fold(onBefore, onOn, onAfter); }; var getStart = function (situ) { return situ.fold(identity, identity, identity); }; var before$2 = adt$2.before; var on = adt$2.on; var after$2 = adt$2.after; var Situ = { before: before$2, on: on, after: after$2, cata: cata$1, getStart: getStart }; var adt$3 = Adt.generate([ { domRange: ['rng'] }, { relative: [ 'startSitu', 'finishSitu' ] }, { exact: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var exactFromRange = function (simRange) { return adt$3.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset()); }; var getStart$1 = function (selection) { return selection.match({ domRange: function (rng) { return Element.fromDom(rng.startContainer); }, relative: function (startSitu, finishSitu) { return Situ.getStart(startSitu); }, exact: function (start, soffset, finish, foffset) { return start; } }); }; var domRange = adt$3.domRange; var relative = adt$3.relative; var exact = adt$3.exact; var getWin = function (selection) { var start = getStart$1(selection); return defaultView(start); }; var range$1 = SimRange.create; var Selection = { domRange: domRange, relative: relative, exact: exact, exactFromRange: exactFromRange, getWin: getWin, range: range$1 }; var selectNodeContents = function (win, element) { var rng = win.document.createRange(); selectNodeContentsUsing(rng, element); return rng; }; var selectNodeContentsUsing = function (rng, element) { rng.selectNodeContents(element.dom()); }; var setStart = function (rng, situ) { situ.fold(function (e) { rng.setStartBefore(e.dom()); }, function (e, o) { rng.setStart(e.dom(), o); }, function (e) { rng.setStartAfter(e.dom()); }); }; var setFinish = function (rng, situ) { situ.fold(function (e) { rng.setEndBefore(e.dom()); }, function (e, o) { rng.setEnd(e.dom(), o); }, function (e) { rng.setEndAfter(e.dom()); }); }; var relativeToNative = function (win, startSitu, finishSitu) { var range = win.document.createRange(); setStart(range, startSitu); setFinish(range, finishSitu); return range; }; var exactToNative = function (win, start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom(), soffset); rng.setEnd(finish.dom(), foffset); return rng; }; var toRect = function (rect) { return { left: constant(rect.left), top: constant(rect.top), right: constant(rect.right), bottom: constant(rect.bottom), width: constant(rect.width), height: constant(rect.height) }; }; var getFirstRect = function (rng) { var rects = rng.getClientRects(); var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); return rect.width > 0 || rect.height > 0 ? Option.some(rect).map(toRect) : Option.none(); }; var adt$4 = Adt.generate([ { ltr: [ 'start', 'soffset', 'finish', 'foffset' ] }, { rtl: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var fromRange = function (win, type, range) { return type(Element.fromDom(range.startContainer), range.startOffset, Element.fromDom(range.endContainer), range.endOffset); }; var getRanges = function (win, selection) { return selection.match({ domRange: function (rng) { return { ltr: constant(rng), rtl: Option.none }; }, relative: function (startSitu, finishSitu) { return { ltr: cached(function () { return relativeToNative(win, startSitu, finishSitu); }), rtl: cached(function () { return Option.some(relativeToNative(win, finishSitu, startSitu)); }) }; }, exact: function (start, soffset, finish, foffset) { return { ltr: cached(function () { return exactToNative(win, start, soffset, finish, foffset); }), rtl: cached(function () { return Option.some(exactToNative(win, finish, foffset, start, soffset)); }) }; } }); }; var doDiagnose = function (win, ranges) { var rng = ranges.ltr(); if (rng.collapsed) { var reversed = ranges.rtl().filter(function (rev) { return rev.collapsed === false; }); return reversed.map(function (rev) { return adt$4.rtl(Element.fromDom(rev.endContainer), rev.endOffset, Element.fromDom(rev.startContainer), rev.startOffset); }).getOrThunk(function () { return fromRange(win, adt$4.ltr, rng); }); } else { return fromRange(win, adt$4.ltr, rng); } }; var diagnose = function (win, selection) { var ranges = getRanges(win, selection); return doDiagnose(win, ranges); }; var asLtrRange = function (win, selection) { var diagnosis = diagnose(win, selection); return diagnosis.match({ ltr: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom(), soffset); rng.setEnd(finish.dom(), foffset); return rng; }, rtl: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(finish.dom(), foffset); rng.setEnd(start.dom(), soffset); return rng; } }); }; var searchForPoint = function (rectForOffset, x, y, maxX, length) { if (length === 0) { return 0; } else if (x === maxX) { return length - 1; } var xDelta = maxX; for (var i = 1; i < length; i++) { var rect = rectForOffset(i); var curDeltaX = Math.abs(x - rect.left); if (y <= rect.bottom) { if (y < rect.top || curDeltaX > xDelta) { return i - 1; } else { xDelta = curDeltaX; } } } return 0; }; var inRect = function (rect, x, y) { return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom; }; var locateOffset = function (doc, textnode, x, y, rect) { var rangeForOffset = function (o) { var r = doc.dom().createRange(); r.setStart(textnode.dom(), o); r.collapse(true); return r; }; var rectForOffset = function (o) { var r = rangeForOffset(o); return r.getBoundingClientRect(); }; var length = get$2(textnode).length; var offset = searchForPoint(rectForOffset, x, y, rect.right, length); return rangeForOffset(offset); }; var locate = function (doc, node, x, y) { var r = doc.dom().createRange(); r.selectNode(node.dom()); var rects = r.getClientRects(); var foundRect = findMap(rects, function (rect) { return inRect(rect, x, y) ? Option.some(rect) : Option.none(); }); return foundRect.map(function (rect) { return locateOffset(doc, node, x, y, rect); }); }; var searchInChildren = function (doc, node, x, y) { var r = doc.dom().createRange(); var nodes = children(node); return findMap(nodes, function (n) { r.selectNode(n.dom()); return inRect(r.getBoundingClientRect(), x, y) ? locateNode(doc, n, x, y) : Option.none(); }); }; var locateNode = function (doc, node, x, y) { return isText(node) ? locate(doc, node, x, y) : searchInChildren(doc, node, x, y); }; var locate$1 = function (doc, node, x, y) { var r = doc.dom().createRange(); r.selectNode(node.dom()); var rect = r.getBoundingClientRect(); var boundedX = Math.max(rect.left, Math.min(rect.right, x)); var boundedY = Math.max(rect.top, Math.min(rect.bottom, y)); return locateNode(doc, node, boundedX, boundedY); }; var COLLAPSE_TO_LEFT = true; var COLLAPSE_TO_RIGHT = false; var getCollapseDirection = function (rect, x) { return x - rect.left < rect.right - x ? COLLAPSE_TO_LEFT : COLLAPSE_TO_RIGHT; }; var createCollapsedNode = function (doc, target, collapseDirection) { var r = doc.dom().createRange(); r.selectNode(target.dom()); r.collapse(collapseDirection); return r; }; var locateInElement = function (doc, node, x) { var cursorRange = doc.dom().createRange(); cursorRange.selectNode(node.dom()); var rect = cursorRange.getBoundingClientRect(); var collapseDirection = getCollapseDirection(rect, x); var f = collapseDirection === COLLAPSE_TO_LEFT ? first : last$1; return f(node).map(function (target) { return createCollapsedNode(doc, target, collapseDirection); }); }; var locateInEmpty = function (doc, node, x) { var rect = node.dom().getBoundingClientRect(); var collapseDirection = getCollapseDirection(rect, x); return Option.some(createCollapsedNode(doc, node, collapseDirection)); }; var search = function (doc, node, x) { var f = children(node).length === 0 ? locateInEmpty : locateInElement; return f(doc, node, x); }; var caretPositionFromPoint = function (doc, x, y) { return Option.from(doc.dom().caretPositionFromPoint(x, y)).bind(function (pos) { if (pos.offsetNode === null) { return Option.none(); } var r = doc.dom().createRange(); r.setStart(pos.offsetNode, pos.offset); r.collapse(); return Option.some(r); }); }; var caretRangeFromPoint = function (doc, x, y) { return Option.from(doc.dom().caretRangeFromPoint(x, y)); }; var searchTextNodes = function (doc, node, x, y) { var r = doc.dom().createRange(); r.selectNode(node.dom()); var rect = r.getBoundingClientRect(); var boundedX = Math.max(rect.left, Math.min(rect.right, x)); var boundedY = Math.max(rect.top, Math.min(rect.bottom, y)); return locate$1(doc, node, boundedX, boundedY); }; var searchFromPoint = function (doc, x, y) { return Element.fromPoint(doc, x, y).bind(function (elem) { var fallback = function () { return search(doc, elem, x); }; return children(elem).length === 0 ? fallback() : searchTextNodes(doc, elem, x, y).orThunk(fallback); }); }; var availableSearch = document.caretPositionFromPoint ? caretPositionFromPoint : document.caretRangeFromPoint ? caretRangeFromPoint : searchFromPoint; var fromPoint$1 = function (win, x, y) { var doc = Element.fromDom(win.document); return availableSearch(doc, x, y).map(function (rng) { return SimRange.create(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset); }); }; var beforeSpecial = function (element, offset) { var name$1 = name(element); if ('input' === name$1) { return Situ.after(element); } else if (!contains([ 'br', 'img' ], name$1)) { return Situ.on(element, offset); } else { return offset === 0 ? Situ.before(element) : Situ.after(element); } }; var preprocessRelative = function (startSitu, finishSitu) { var start = startSitu.fold(Situ.before, beforeSpecial, Situ.after); var finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after); return Selection.relative(start, finish); }; var preprocessExact = function (start, soffset, finish, foffset) { var startSitu = beforeSpecial(start, soffset); var finishSitu = beforeSpecial(finish, foffset); return Selection.relative(startSitu, finishSitu); }; var preprocess = function (selection) { return selection.match({ domRange: function (rng) { var start = Element.fromDom(rng.startContainer); var finish = Element.fromDom(rng.endContainer); return preprocessExact(start, rng.startOffset, finish, rng.endOffset); }, relative: preprocessRelative, exact: preprocessExact }); }; var makeRange = function (start, soffset, finish, foffset) { var doc = owner(start); var rng = doc.dom().createRange(); rng.setStart(start.dom(), soffset); rng.setEnd(finish.dom(), foffset); return rng; }; var after$3 = function (start, soffset, finish, foffset) { var r = makeRange(start, soffset, finish, foffset); var same = eq(start, finish) && soffset === foffset; return r.collapsed && !same; }; var doSetNativeRange = function (win, rng) { Option.from(win.getSelection()).each(function (selection) { selection.removeAllRanges(); selection.addRange(rng); }); }; var doSetRange = function (win, start, soffset, finish, foffset) { var rng = exactToNative(win, start, soffset, finish, foffset); doSetNativeRange(win, rng); }; var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) { selection.collapse(start.dom(), soffset); selection.extend(finish.dom(), foffset); }; var setRangeFromRelative = function (win, relative) { return diagnose(win, relative).match({ ltr: function (start, soffset, finish, foffset) { doSetRange(win, start, soffset, finish, foffset); }, rtl: function (start, soffset, finish, foffset) { var selection = win.getSelection(); if (selection.setBaseAndExtent) { selection.setBaseAndExtent(start.dom(), soffset, finish.dom(), foffset); } else if (selection.extend) { try { setLegacyRtlRange(win, selection, start, soffset, finish, foffset); } catch (e) { doSetRange(win, finish, foffset, start, soffset); } } else { doSetRange(win, finish, foffset, start, soffset); } } }); }; var setExact = function (win, start, soffset, finish, foffset) { var relative = preprocessExact(start, soffset, finish, foffset); setRangeFromRelative(win, relative); }; var setRelative = function (win, startSitu, finishSitu) { var relative = preprocessRelative(startSitu, finishSitu); setRangeFromRelative(win, relative); }; var toNative = function (selection) { var win = Selection.getWin(selection).dom(); var getDomRange = function (start, soffset, finish, foffset) { return exactToNative(win, start, soffset, finish, foffset); }; var filtered = preprocess(selection); return diagnose(win, filtered).match({ ltr: getDomRange, rtl: getDomRange }); }; var readRange = function (selection) { if (selection.rangeCount > 0) { var firstRng = selection.getRangeAt(0); var lastRng = selection.getRangeAt(selection.rangeCount - 1); return Option.some(SimRange.create(Element.fromDom(firstRng.startContainer), firstRng.startOffset, Element.fromDom(lastRng.endContainer), lastRng.endOffset)); } else { return Option.none(); } }; var doGetExact = function (selection) { var anchor = Element.fromDom(selection.anchorNode); var focus = Element.fromDom(selection.focusNode); return after$3(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Option.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection); }; var setToElement = function (win, element) { var rng = selectNodeContents(win, element); doSetNativeRange(win, rng); }; var getExact = function (win) { return Option.from(win.getSelection()).filter(function (sel) { return sel.rangeCount > 0; }).bind(doGetExact); }; var get$9 = function (win) { return getExact(win).map(function (range) { return Selection.exact(range.start(), range.soffset(), range.finish(), range.foffset()); }); }; var getFirstRect$1 = function (win, selection) { var rng = asLtrRange(win, selection); return getFirstRect(rng); }; var getAtPoint = function (win, x, y) { return fromPoint$1(win, x, y); }; var clear = function (win) { var selection = win.getSelection(); selection.removeAllRanges(); }; var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); var forward = function (editor, isRoot, cell, lazyWire) { return go(editor, isRoot, CellNavigation.next(cell), lazyWire); }; var backward = function (editor, isRoot, cell, lazyWire) { return go(editor, isRoot, CellNavigation.prev(cell), lazyWire); }; var getCellFirstCursorPosition = function (editor, cell) { var selection = Selection.exact(cell, 0, cell, 0); return toNative(selection); }; var getNewRowCursorPosition = function (editor, table) { var rows = descendants$1(table, 'tr'); return last(rows).bind(function (last) { return descendant$1(last, 'td,th').map(function (first) { return getCellFirstCursorPosition(editor, first); }); }); }; var go = function (editor, isRoot, cell, actions, lazyWire) { return cell.fold(Option.none, Option.none, function (current, next) { return first(next).map(function (cell) { return getCellFirstCursorPosition(editor, cell); }); }, function (current) { return TableLookup.table(current, isRoot).bind(function (table) { var targets = TableTargets.noMenu(current); editor.undoManager.transact(function () { actions.insertRowsAfter(table, targets); }); return getNewRowCursorPosition(editor, table); }); }); }; var rootElements = [ 'table', 'li', 'dl' ]; var handle$1 = function (event, editor, actions, lazyWire) { if (event.keyCode === global$3.TAB) { var body_1 = getBody$1(editor); var isRoot_1 = function (element) { var name$1 = name(element); return eq(element, body_1) || contains(rootElements, name$1); }; var rng = editor.selection.getRng(); if (rng.collapsed) { var start = Element.fromDom(rng.startContainer); TableLookup.cell(start, isRoot_1).each(function (cell) { event.preventDefault(); var navigation = event.shiftKey ? backward : forward; var rng = navigation(editor, isRoot_1, cell, actions, lazyWire); rng.each(function (range) { editor.selection.setRng(range); }); }); } } }; var TabContext = { handle: handle$1 }; var create$4 = Immutable('selection', 'kill'); var Response = { create: create$4 }; var create$5 = function (start, soffset, finish, foffset) { return { start: constant(Situ.on(start, soffset)), finish: constant(Situ.on(finish, foffset)) }; }; var Situs = { create: create$5 }; var convertToRange = function (win, selection) { var rng = asLtrRange(win, selection); return SimRange.create(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset); }; var makeSitus = Situs.create; var Util = { convertToRange: convertToRange, makeSitus: makeSitus }; var sync = function (container, isRoot, start, soffset, finish, foffset, selectRange) { if (!(eq(start, finish) && soffset === foffset)) { return closest$1(start, 'td,th', isRoot).bind(function (s) { return closest$1(finish, 'td,th', isRoot).bind(function (f) { return detect$5(container, isRoot, s, f, selectRange); }); }); } else { return Option.none(); } }; var detect$5 = function (container, isRoot, start, finish, selectRange) { if (!eq(start, finish)) { return CellSelection.identify(start, finish, isRoot).bind(function (cellSel) { var boxes = cellSel.boxes().getOr([]); if (boxes.length > 0) { selectRange(container, boxes, cellSel.start(), cellSel.finish()); return Option.some(Response.create(Option.some(Util.makeSitus(start, 0, start, getEnd(start))), true)); } else { return Option.none(); } }); } else { return Option.none(); } }; var update = function (rows, columns, container, selected, annotations) { var updateSelection = function (newSels) { annotations.clear(container); annotations.selectRange(container, newSels.boxes(), newSels.start(), newSels.finish()); return newSels.boxes(); }; return CellSelection.shiftSelection(selected, rows, columns, annotations.firstSelectedSelector(), annotations.lastSelectedSelector()).map(updateSelection); }; var KeySelection = { sync: sync, detect: detect$5, update: update }; var traverse = Immutable('item', 'mode'); var backtrack = function (universe, item, _direction, transition) { if (transition === void 0) { transition = sidestep; } return universe.property().parent(item).map(function (p) { return traverse(p, transition); }); }; var sidestep = function (universe, item, direction, transition) { if (transition === void 0) { transition = advance; } return direction.sibling(universe, item).map(function (p) { return traverse(p, transition); }); }; var advance = function (universe, item, direction, transition) { if (transition === void 0) { transition = advance; } var children = universe.property().children(item); var result = direction.first(children); return result.map(function (r) { return traverse(r, transition); }); }; var successors = [ { current: backtrack, next: sidestep, fallback: Option.none() }, { current: sidestep, next: advance, fallback: Option.some(backtrack) }, { current: advance, next: advance, fallback: Option.some(sidestep) } ]; var go$1 = function (universe, item, mode, direction, rules) { if (rules === void 0) { rules = successors; } var ruleOpt = find(rules, function (succ) { return succ.current === mode; }); return ruleOpt.bind(function (rule) { return rule.current(universe, item, direction, rule.next).orThunk(function () { return rule.fallback.bind(function (fb) { return go$1(universe, item, fb, direction); }); }); }); }; var left = function () { var sibling = function (universe, item) { return universe.query().prevSibling(item); }; var first = function (children) { return children.length > 0 ? Option.some(children[children.length - 1]) : Option.none(); }; return { sibling: sibling, first: first }; }; var right = function () { var sibling = function (universe, item) { return universe.query().nextSibling(item); }; var first = function (children) { return children.length > 0 ? Option.some(children[0]) : Option.none(); }; return { sibling: sibling, first: first }; }; var Walkers = { left: left, right: right }; var hone = function (universe, item, predicate, mode, direction, isRoot) { var next = go$1(universe, item, mode, direction); return next.bind(function (n) { if (isRoot(n.item())) { return Option.none(); } else { return predicate(n.item()) ? Option.some(n.item()) : hone(universe, n.item(), predicate, n.mode(), direction, isRoot); } }); }; var left$1 = function (universe, item, predicate, isRoot) { return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot); }; var right$1 = function (universe, item, predicate, isRoot) { return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot); }; var isLeaf = function (universe) { return function (element) { return universe.property().children(element).length === 0; }; }; var before$3 = function (universe, item, isRoot) { return seekLeft(universe, item, isLeaf(universe), isRoot); }; var after$4 = function (universe, item, isRoot) { return seekRight(universe, item, isLeaf(universe), isRoot); }; var seekLeft = left$1; var seekRight = right$1; var universe$2 = DomUniverse(); var before$4 = function (element, isRoot) { return before$3(universe$2, element, isRoot); }; var after$5 = function (element, isRoot) { return after$4(universe$2, element, isRoot); }; var seekLeft$1 = function (element, predicate, isRoot) { return seekLeft(universe$2, element, predicate, isRoot); }; var seekRight$1 = function (element, predicate, isRoot) { return seekRight(universe$2, element, predicate, isRoot); }; var ancestor$2 = function (scope, predicate, isRoot) { return ancestor(scope, predicate, isRoot).isSome(); }; var point = Immutable('element', 'offset'); var delta = Immutable('element', 'deltaOffset'); var range$2 = Immutable('element', 'start', 'finish'); var points = Immutable('begin', 'end'); var text = Immutable('element', 'text'); var adt$5 = Adt.generate([ { none: ['message'] }, { success: [] }, { failedUp: ['cell'] }, { failedDown: ['cell'] } ]); var isOverlapping = function (bridge, before, after) { var beforeBounds = bridge.getRect(before); var afterBounds = bridge.getRect(after); return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right; }; var isRow = function (elem) { return closest$1(elem, 'tr'); }; var verify = function (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) { return closest$1(after, 'td,th', isRoot).bind(function (afterCell) { return closest$1(before, 'td,th', isRoot).map(function (beforeCell) { if (!eq(afterCell, beforeCell)) { return DomParent.sharedOne(isRow, [ afterCell, beforeCell ]).fold(function () { return isOverlapping(bridge, beforeCell, afterCell) ? adt$5.success() : failure(beforeCell); }, function (_sharedRow) { return failure(beforeCell); }); } else { return eq(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$5.none('in same cell'); } }); }).getOr(adt$5.none('default')); }; var cata$2 = function (subject, onNone, onSuccess, onFailedUp, onFailedDown) { return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown); }; var BeforeAfter = __assign(__assign({}, adt$5), { verify: verify, cata: cata$2 }); var inAncestor = Immutable('ancestor', 'descendants', 'element', 'index'); var inParent = Immutable('parent', 'children', 'element', 'index'); var indexInParent = function (element) { return parent(element).bind(function (parent) { var children$1 = children(parent); return indexOf(children$1, element).map(function (index) { return inParent(parent, children$1, element, index); }); }); }; var indexOf = function (elements, element) { return findIndex(elements, curry(eq, element)); }; var isBr = function (elem) { return name(elem) === 'br'; }; var gatherer = function (cand, gather, isRoot) { return gather(cand, isRoot).bind(function (target) { return isText(target) && get$2(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Option.some(target); }); }; var handleBr = function (isRoot, element, direction) { return direction.traverse(element).orThunk(function () { return gatherer(element, direction.gather, isRoot); }).map(direction.relative); }; var findBr = function (element, offset) { return child(element, offset).filter(isBr).orThunk(function () { return child(element, offset - 1).filter(isBr); }); }; var handleParent = function (isRoot, element, offset, direction) { return findBr(element, offset).bind(function (br) { return direction.traverse(br).fold(function () { return gatherer(br, direction.gather, isRoot).map(direction.relative); }, function (adjacent) { return indexInParent(adjacent).map(function (info) { return Situ.on(info.parent(), info.index()); }); }); }); }; var tryBr = function (isRoot, element, offset, direction) { var target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction); return target.map(function (tgt) { return { start: constant(tgt), finish: constant(tgt) }; }); }; var process = function (analysis) { return BeforeAfter.cata(analysis, function (message) { return Option.none(); }, function () { return Option.none(); }, function (cell) { return Option.some(point(cell, 0)); }, function (cell) { return Option.some(point(cell, getEnd(cell))); }); }; var BrTags = { tryBr: tryBr, process: process }; var nu$3 = MixedBag([ 'left', 'top', 'right', 'bottom' ], []); var moveDown = function (caret, amount) { return nu$3({ left: caret.left(), top: caret.top() + amount, right: caret.right(), bottom: caret.bottom() + amount }); }; var moveUp = function (caret, amount) { return nu$3({ left: caret.left(), top: caret.top() - amount, right: caret.right(), bottom: caret.bottom() - amount }); }; var moveBottomTo = function (caret, bottom) { var height = caret.bottom() - caret.top(); return nu$3({ left: caret.left(), top: bottom - height, right: caret.right(), bottom: bottom }); }; var moveTopTo = function (caret, top) { var height = caret.bottom() - caret.top(); return nu$3({ left: caret.left(), top: top, right: caret.right(), bottom: top + height }); }; var translate = function (caret, xDelta, yDelta) { return nu$3({ left: caret.left() + xDelta, top: caret.top() + yDelta, right: caret.right() + xDelta, bottom: caret.bottom() + yDelta }); }; var getTop$1 = function (caret) { return caret.top(); }; var getBottom = function (caret) { return caret.bottom(); }; var toString = function (caret) { return '(' + caret.left() + ', ' + caret.top() + ') -> (' + caret.right() + ', ' + caret.bottom() + ')'; }; var Carets = { nu: nu$3, moveUp: moveUp, moveDown: moveDown, moveBottomTo: moveBottomTo, moveTopTo: moveTopTo, getTop: getTop$1, getBottom: getBottom, translate: translate, toString: toString }; var getPartialBox = function (bridge, element, offset) { if (offset >= 0 && offset < getEnd(element)) { return bridge.getRangedRect(element, offset, element, offset + 1); } else if (offset > 0) { return bridge.getRangedRect(element, offset - 1, element, offset); } return Option.none(); }; var toCaret = function (rect) { return Carets.nu({ left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom }); }; var getElemBox = function (bridge, element) { return Option.some(bridge.getRect(element)); }; var getBoxAt = function (bridge, element, offset) { if (isElement(element)) { return getElemBox(bridge, element).map(toCaret); } else if (isText(element)) { return getPartialBox(bridge, element, offset).map(toCaret); } else { return Option.none(); } }; var getEntireBox = function (bridge, element) { if (isElement(element)) { return getElemBox(bridge, element).map(toCaret); } else if (isText(element)) { return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret); } else { return Option.none(); } }; var Rectangles = { getBoxAt: getBoxAt, getEntireBox: getEntireBox }; var JUMP_SIZE = 5; var NUM_RETRIES = 100; var adt$6 = Adt.generate([ { none: [] }, { retry: ['caret'] } ]); var isOutside = function (caret, box) { return caret.left() < box.left() || Math.abs(box.right() - caret.left()) < 1 || caret.left() > box.right(); }; var inOutsideBlock = function (bridge, element, caret) { return closest(element, DomStructure.isBlock).fold(constant(false), function (cell) { return Rectangles.getEntireBox(bridge, cell).exists(function (box) { return isOutside(caret, box); }); }); }; var adjustDown = function (bridge, element, guessBox, original, caret) { var lowerCaret = Carets.moveDown(caret, JUMP_SIZE); if (Math.abs(guessBox.bottom() - original.bottom()) < 1) { return adt$6.retry(lowerCaret); } else if (guessBox.top() > caret.bottom()) { return adt$6.retry(lowerCaret); } else if (guessBox.top() === caret.bottom()) { return adt$6.retry(Carets.moveDown(caret, 1)); } else { return inOutsideBlock(bridge, element, caret) ? adt$6.retry(Carets.translate(lowerCaret, JUMP_SIZE, 0)) : adt$6.none(); } }; var adjustUp = function (bridge, element, guessBox, original, caret) { var higherCaret = Carets.moveUp(caret, JUMP_SIZE); if (Math.abs(guessBox.top() - original.top()) < 1) { return adt$6.retry(higherCaret); } else if (guessBox.bottom() < caret.top()) { return adt$6.retry(higherCaret); } else if (guessBox.bottom() === caret.top()) { return adt$6.retry(Carets.moveUp(caret, 1)); } else { return inOutsideBlock(bridge, element, caret) ? adt$6.retry(Carets.translate(higherCaret, JUMP_SIZE, 0)) : adt$6.none(); } }; var upMovement = { point: Carets.getTop, adjuster: adjustUp, move: Carets.moveUp, gather: before$4 }; var downMovement = { point: Carets.getBottom, adjuster: adjustDown, move: Carets.moveDown, gather: after$5 }; var isAtTable = function (bridge, x, y) { return bridge.elementFromPoint(x, y).filter(function (elm) { return name(elm) === 'table'; }).isSome(); }; var adjustForTable = function (bridge, movement, original, caret, numRetries) { return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries); }; var adjustTil = function (bridge, movement, original, caret, numRetries) { if (numRetries === 0) { return Option.some(caret); } if (isAtTable(bridge, caret.left(), movement.point(caret))) { return adjustForTable(bridge, movement, original, caret, numRetries - 1); } return bridge.situsFromPoint(caret.left(), movement.point(caret)).bind(function (guess) { return guess.start().fold(Option.none, function (element) { return Rectangles.getEntireBox(bridge, element).bind(function (guessBox) { return movement.adjuster(bridge, element, guessBox, original, caret).fold(Option.none, function (newCaret) { return adjustTil(bridge, movement, original, newCaret, numRetries - 1); }); }).orThunk(function () { return Option.some(caret); }); }, Option.none); }); }; var ieTryDown = function (bridge, caret) { return bridge.situsFromPoint(caret.left(), caret.bottom() + JUMP_SIZE); }; var ieTryUp = function (bridge, caret) { return bridge.situsFromPoint(caret.left(), caret.top() - JUMP_SIZE); }; var checkScroll = function (movement, adjusted, bridge) { if (movement.point(adjusted) > bridge.getInnerHeight()) { return Option.some(movement.point(adjusted) - bridge.getInnerHeight()); } else if (movement.point(adjusted) < 0) { return Option.some(-movement.point(adjusted)); } else { return Option.none(); } }; var retry = function (movement, bridge, caret) { var moved = movement.move(caret, JUMP_SIZE); var adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved); return checkScroll(movement, adjusted, bridge).fold(function () { return bridge.situsFromPoint(adjusted.left(), movement.point(adjusted)); }, function (delta) { bridge.scrollBy(0, delta); return bridge.situsFromPoint(adjusted.left(), movement.point(adjusted) - delta); }); }; var Retries = { tryUp: curry(retry, upMovement), tryDown: curry(retry, downMovement), ieTryUp: ieTryUp, ieTryDown: ieTryDown, getJumpSize: constant(JUMP_SIZE) }; var MAX_RETRIES = 20; var platform$1 = PlatformDetection$1.detect(); var findSpot = function (bridge, isRoot, direction) { return bridge.getSelection().bind(function (sel) { return BrTags.tryBr(isRoot, sel.finish(), sel.foffset(), direction).fold(function () { return Option.some(point(sel.finish(), sel.foffset())); }, function (brNeighbour) { var range = bridge.fromSitus(brNeighbour); var analysis = BeforeAfter.verify(bridge, sel.finish(), sel.foffset(), range.finish(), range.foffset(), direction.failure, isRoot); return BrTags.process(analysis); }); }); }; var scan = function (bridge, isRoot, element, offset, direction, numRetries) { if (numRetries === 0) { return Option.none(); } return tryCursor(bridge, isRoot, element, offset, direction).bind(function (situs) { var range = bridge.fromSitus(situs); var analysis = BeforeAfter.verify(bridge, element, offset, range.finish(), range.foffset(), direction.failure, isRoot); return BeforeAfter.cata(analysis, function () { return Option.none(); }, function () { return Option.some(situs); }, function (cell) { if (eq(element, cell) && offset === 0) { return tryAgain(bridge, element, offset, Carets.moveUp, direction); } else { return scan(bridge, isRoot, cell, 0, direction, numRetries - 1); } }, function (cell) { if (eq(element, cell) && offset === getEnd(cell)) { return tryAgain(bridge, element, offset, Carets.moveDown, direction); } else { return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1); } }); }); }; var tryAgain = function (bridge, element, offset, move, direction) { return Rectangles.getBoxAt(bridge, element, offset).bind(function (box) { return tryAt(bridge, direction, move(box, Retries.getJumpSize())); }); }; var tryAt = function (bridge, direction, box) { if (platform$1.browser.isChrome() || platform$1.browser.isSafari() || platform$1.browser.isFirefox() || platform$1.browser.isEdge()) { return direction.otherRetry(bridge, box); } else if (platform$1.browser.isIE()) { return direction.ieRetry(bridge, box); } else { return Option.none(); } }; var tryCursor = function (bridge, isRoot, element, offset, direction) { return Rectangles.getBoxAt(bridge, element, offset).bind(function (box) { return tryAt(bridge, direction, box); }); }; var handle$2 = function (bridge, isRoot, direction) { return findSpot(bridge, isRoot, direction).bind(function (spot) { return scan(bridge, isRoot, spot.element(), spot.offset(), direction, MAX_RETRIES).map(bridge.fromSitus); }); }; var TableKeys = { handle: handle$2 }; var detection = PlatformDetection$1.detect(); var inSameTable = function (elem, table) { return ancestor$2(elem, function (e) { return parent(e).exists(function (p) { return eq(p, table); }); }); }; var simulate = function (bridge, isRoot, direction, initial, anchor) { return closest$1(initial, 'td,th', isRoot).bind(function (start) { return closest$1(start, 'table', isRoot).bind(function (table) { if (!inSameTable(anchor, table)) { return Option.none(); } return TableKeys.handle(bridge, isRoot, direction).bind(function (range) { return closest$1(range.finish(), 'td,th', isRoot).map(function (finish) { return { start: constant(start), finish: constant(finish), range: constant(range) }; }); }); }); }); }; var navigate = function (bridge, isRoot, direction, initial, anchor, precheck) { if (detection.browser.isIE()) { return Option.none(); } else { return precheck(initial, isRoot).orThunk(function () { return simulate(bridge, isRoot, direction, initial, anchor).map(function (info) { var range = info.range(); return Response.create(Option.some(Util.makeSitus(range.start(), range.soffset(), range.finish(), range.foffset())), true); }); }); } }; var firstUpCheck = function (initial, isRoot) { return closest$1(initial, 'tr', isRoot).bind(function (startRow) { return closest$1(startRow, 'table', isRoot).bind(function (table) { var rows = descendants$1(table, 'tr'); if (eq(startRow, rows[0])) { return seekLeft$1(table, function (element) { return last$1(element).isSome(); }, isRoot).map(function (last) { var lastOffset = getEnd(last); return Response.create(Option.some(Util.makeSitus(last, lastOffset, last, lastOffset)), true); }); } else { return Option.none(); } }); }); }; var lastDownCheck = function (initial, isRoot) { return closest$1(initial, 'tr', isRoot).bind(function (startRow) { return closest$1(startRow, 'table', isRoot).bind(function (table) { var rows = descendants$1(table, 'tr'); if (eq(startRow, rows[rows.length - 1])) { return seekRight$1(table, function (element) { return first(element).isSome(); }, isRoot).map(function (first) { return Response.create(Option.some(Util.makeSitus(first, 0, first, 0)), true); }); } else { return Option.none(); } }); }); }; var select = function (bridge, container, isRoot, direction, initial, anchor, selectRange) { return simulate(bridge, isRoot, direction, initial, anchor).bind(function (info) { return KeySelection.detect(container, isRoot, info.start(), info.finish(), selectRange); }); }; var VerticalMovement = { navigate: navigate, select: select, firstUpCheck: firstUpCheck, lastDownCheck: lastDownCheck }; var findCell = function (target, isRoot) { return closest$1(target, 'td,th', isRoot); }; function MouseSelection (bridge, container, isRoot, annotations) { var cursor = Option.none(); var clearState = function () { cursor = Option.none(); }; var mousedown = function (event) { annotations.clear(container); cursor = findCell(event.target(), isRoot); }; var mouseover = function (event) { cursor.each(function (start) { annotations.clear(container); findCell(event.target(), isRoot).each(function (finish) { CellSelection.identify(start, finish, isRoot).each(function (cellSel) { var boxes = cellSel.boxes().getOr([]); if (boxes.length > 1 || boxes.length === 1 && !eq(start, finish)) { annotations.selectRange(container, boxes, cellSel.start(), cellSel.finish()); bridge.selectContents(finish); } }); }); }); }; var mouseup = function (_event) { cursor.each(clearState); }; return { mousedown: mousedown, mouseover: mouseover, mouseup: mouseup }; } var down = { traverse: nextSibling, gather: after$5, relative: Situ.before, otherRetry: Retries.tryDown, ieRetry: Retries.ieTryDown, failure: BeforeAfter.failedDown }; var up = { traverse: prevSibling, gather: before$4, relative: Situ.before, otherRetry: Retries.tryUp, ieRetry: Retries.ieTryUp, failure: BeforeAfter.failedUp }; var KeyDirection = { down: down, up: up }; var isKey = function (key) { return function (keycode) { return keycode === key; }; }; var isUp = isKey(38); var isDown = isKey(40); var isNavigation = function (keycode) { return keycode >= 37 && keycode <= 40; }; var SelectionKeys = { ltr: { isBackward: isKey(37), isForward: isKey(39) }, rtl: { isBackward: isKey(39), isForward: isKey(37) }, isUp: isUp, isDown: isDown, isNavigation: isNavigation }; var toRaw = function (sr) { return { left: sr.left(), top: sr.top(), right: sr.right(), bottom: sr.bottom(), width: sr.width(), height: sr.height() }; }; var Rect = { toRaw: toRaw }; var isSafari = PlatformDetection$1.detect().browser.isSafari(); var get$a = function (_DOC) { var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; var y = doc.body.scrollTop || doc.documentElement.scrollTop; return Position(x, y); }; var by = function (x, y, _DOC) { var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; var win = doc.defaultView; win.scrollBy(x, y); }; var WindowBridge = function (win) { var elementFromPoint = function (x, y) { return Element.fromPoint(Element.fromDom(win.document), x, y); }; var getRect = function (element) { return element.dom().getBoundingClientRect(); }; var getRangedRect = function (start, soffset, finish, foffset) { var sel = Selection.exact(start, soffset, finish, foffset); return getFirstRect$1(win, sel).map(Rect.toRaw); }; var getSelection = function () { return get$9(win).map(function (exactAdt) { return Util.convertToRange(win, exactAdt); }); }; var fromSitus = function (situs) { var relative = Selection.relative(situs.start(), situs.finish()); return Util.convertToRange(win, relative); }; var situsFromPoint = function (x, y) { return getAtPoint(win, x, y).map(function (exact) { return Situs.create(exact.start(), exact.soffset(), exact.finish(), exact.foffset()); }); }; var clearSelection = function () { clear(win); }; var selectContents = function (element) { setToElement(win, element); }; var setSelection = function (sel) { setExact(win, sel.start(), sel.soffset(), sel.finish(), sel.foffset()); }; var setRelativeSelection = function (start, finish) { setRelative(win, start, finish); }; var getInnerHeight = function () { return win.innerHeight; }; var getScrollY = function () { var pos = get$a(Element.fromDom(win.document)); return pos.top(); }; var scrollBy = function (x, y) { by(x, y, Element.fromDom(win.document)); }; return { elementFromPoint: elementFromPoint, getRect: getRect, getRangedRect: getRangedRect, getSelection: getSelection, fromSitus: fromSitus, situsFromPoint: situsFromPoint, clearSelection: clearSelection, setSelection: setSelection, setRelativeSelection: setRelativeSelection, selectContents: selectContents, getInnerHeight: getInnerHeight, getScrollY: getScrollY, scrollBy: scrollBy }; }; var rc = Immutable('rows', 'cols'); var mouse = function (win, container, isRoot, annotations) { var bridge = WindowBridge(win); var handlers = MouseSelection(bridge, container, isRoot, annotations); return { mousedown: handlers.mousedown, mouseover: handlers.mouseover, mouseup: handlers.mouseup }; }; var keyboard = function (win, container, isRoot, annotations) { var bridge = WindowBridge(win); var clearToNavigate = function () { annotations.clear(container); return Option.none(); }; var keydown = function (event, start, soffset, finish, foffset, direction) { var realEvent = event.raw(); var keycode = realEvent.which; var shiftKey = realEvent.shiftKey === true; var handler = CellSelection.retrieve(container, annotations.selectedSelector()).fold(function () { if (SelectionKeys.isDown(keycode) && shiftKey) { return curry(VerticalMovement.select, bridge, container, isRoot, KeyDirection.down, finish, start, annotations.selectRange); } else if (SelectionKeys.isUp(keycode) && shiftKey) { return curry(VerticalMovement.select, bridge, container, isRoot, KeyDirection.up, finish, start, annotations.selectRange); } else if (SelectionKeys.isDown(keycode)) { return curry(VerticalMovement.navigate, bridge, isRoot, KeyDirection.down, finish, start, VerticalMovement.lastDownCheck); } else if (SelectionKeys.isUp(keycode)) { return curry(VerticalMovement.navigate, bridge, isRoot, KeyDirection.up, finish, start, VerticalMovement.firstUpCheck); } else { return Option.none; } }, function (selected) { var update = function (attempts) { return function () { var navigation = findMap(attempts, function (delta) { return KeySelection.update(delta.rows(), delta.cols(), container, selected, annotations); }); return navigation.fold(function () { return CellSelection.getEdges(container, annotations.firstSelectedSelector(), annotations.lastSelectedSelector()).map(function (edges) { var relative = SelectionKeys.isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before; bridge.setRelativeSelection(Situ.on(edges.first(), 0), relative(edges.table())); annotations.clear(container); return Response.create(Option.none(), true); }); }, function (_) { return Option.some(Response.create(Option.none(), true)); }); }; }; if (SelectionKeys.isDown(keycode) && shiftKey) { return update([rc(+1, 0)]); } else if (SelectionKeys.isUp(keycode) && shiftKey) { return update([rc(-1, 0)]); } else if (direction.isBackward(keycode) && shiftKey) { return update([ rc(0, -1), rc(-1, 0) ]); } else if (direction.isForward(keycode) && shiftKey) { return update([ rc(0, +1), rc(+1, 0) ]); } else if (SelectionKeys.isNavigation(keycode) && shiftKey === false) { return clearToNavigate; } else { return Option.none; } }); return handler(); }; var keyup = function (event, start, soffset, finish, foffset) { return CellSelection.retrieve(container, annotations.selectedSelector()).fold(function () { var realEvent = event.raw(); var keycode = realEvent.which; var shiftKey = realEvent.shiftKey === true; if (shiftKey === false) { return Option.none(); } if (SelectionKeys.isNavigation(keycode)) { return KeySelection.sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange); } else { return Option.none(); } }, Option.none); }; return { keydown: keydown, keyup: keyup }; }; var InputHandlers = { mouse: mouse, keyboard: keyboard }; var remove$7 = function (element, classes) { each(classes, function (x) { remove$5(element, x); }); }; var addClass = function (clazz) { return function (element) { add$2(element, clazz); }; }; var removeClasses = function (classes) { return function (element) { remove$7(element, classes); }; }; var byClass = function (ephemera) { var addSelectionClass = addClass(ephemera.selected()); var removeSelectionClasses = removeClasses([ ephemera.selected(), ephemera.lastSelected(), ephemera.firstSelected() ]); var clear = function (container) { var sels = descendants$1(container, ephemera.selectedSelector()); each(sels, removeSelectionClasses); }; var selectRange = function (container, cells, start, finish) { clear(container); each(cells, addSelectionClass); add$2(start, ephemera.firstSelected()); add$2(finish, ephemera.lastSelected()); }; return { clear: clear, selectRange: selectRange, selectedSelector: ephemera.selectedSelector, firstSelectedSelector: ephemera.firstSelectedSelector, lastSelectedSelector: ephemera.lastSelectedSelector }; }; var byAttr = function (ephemera) { var removeSelectionAttributes = function (element) { remove(element, ephemera.selected()); remove(element, ephemera.firstSelected()); remove(element, ephemera.lastSelected()); }; var addSelectionAttribute = function (element) { set(element, ephemera.selected(), '1'); }; var clear = function (container) { var sels = descendants$1(container, ephemera.selectedSelector()); each(sels, removeSelectionAttributes); }; var selectRange = function (container, cells, start, finish) { clear(container); each(cells, addSelectionAttribute); set(start, ephemera.firstSelected(), '1'); set(finish, ephemera.lastSelected(), '1'); }; return { clear: clear, selectRange: selectRange, selectedSelector: ephemera.selectedSelector, firstSelectedSelector: ephemera.firstSelectedSelector, lastSelectedSelector: ephemera.lastSelectedSelector }; }; var SelectionAnnotation = { byClass: byClass, byAttr: byAttr }; var hasInternalTarget = function (e) { return has$1(Element.fromDom(e.target), 'ephox-snooker-resizer-bar') === false; }; function CellSelection$1 (editor, lazyResize) { var handlerStruct = MixedBag([ 'mousedown', 'mouseover', 'mouseup', 'keyup', 'keydown' ], []); var handlers = Option.none(); var annotations = SelectionAnnotation.byAttr(Ephemera); editor.on('init', function (e) { var win = editor.getWin(); var body = getBody$1(editor); var isRoot = getIsRoot(editor); var syncSelection = function () { var sel = editor.selection; var start = Element.fromDom(sel.getStart()); var end = Element.fromDom(sel.getEnd()); var shared = DomParent.sharedOne(TableLookup.table, [ start, end ]); shared.fold(function () { annotations.clear(body); }, noop); }; var mouseHandlers = InputHandlers.mouse(win, body, isRoot, annotations); var keyHandlers = InputHandlers.keyboard(win, body, isRoot, annotations); var hasShiftKey = function (event) { return event.raw().shiftKey === true; }; var handleResponse = function (event, response) { if (!hasShiftKey(event)) { return; } if (response.kill()) { event.kill(); } response.selection().each(function (ns) { var relative = Selection.relative(ns.start(), ns.finish()); var rng = asLtrRange(win, relative); editor.selection.setRng(rng); }); }; var keyup = function (event) { var wrappedEvent = wrapEvent(event); if (wrappedEvent.raw().shiftKey && SelectionKeys.isNavigation(wrappedEvent.raw().which)) { var rng = editor.selection.getRng(); var start = Element.fromDom(rng.startContainer); var end = Element.fromDom(rng.endContainer); keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) { handleResponse(wrappedEvent, response); }); } }; var keydown = function (event) { var wrappedEvent = wrapEvent(event); lazyResize().each(function (resize) { resize.hideBars(); }); var rng = editor.selection.getRng(); var startContainer = Element.fromDom(editor.selection.getStart()); var start = Element.fromDom(rng.startContainer); var end = Element.fromDom(rng.endContainer); var direction = Direction.directionAt(startContainer).isRtl() ? SelectionKeys.rtl : SelectionKeys.ltr; keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(function (response) { handleResponse(wrappedEvent, response); }); lazyResize().each(function (resize) { resize.showBars(); }); }; var isMouseEvent = function (event) { return event.hasOwnProperty('x') && event.hasOwnProperty('y'); }; var wrapEvent = function (event) { var target = Element.fromDom(event.target); var stop = function () { event.stopPropagation(); }; var prevent = function () { event.preventDefault(); }; var kill = compose(prevent, stop); return { target: constant(target), x: constant(isMouseEvent(event) ? event.x : null), y: constant(isMouseEvent(event) ? event.y : null), stop: stop, prevent: prevent, kill: kill, raw: constant(event) }; }; var isLeftMouse = function (raw) { return raw.button === 0; }; var isLeftButtonPressed = function (raw) { if (raw.buttons === undefined) { return true; } if (global$2.ie && global$2.ie >= 12 && raw.buttons === 0) { return true; } return (raw.buttons & 1) !== 0; }; var mouseDown = function (e) { if (isLeftMouse(e) && hasInternalTarget(e)) { mouseHandlers.mousedown(wrapEvent(e)); } }; var mouseOver = function (e) { if (isLeftButtonPressed(e) && hasInternalTarget(e)) { mouseHandlers.mouseover(wrapEvent(e)); } }; var mouseUp = function (e) { if (isLeftMouse(e) && hasInternalTarget(e)) { mouseHandlers.mouseup(wrapEvent(e)); } }; editor.on('mousedown', mouseDown); editor.on('mouseover', mouseOver); editor.on('mouseup', mouseUp); editor.on('keyup', keyup); editor.on('keydown', keydown); editor.on('nodechange', syncSelection); handlers = Option.some(handlerStruct({ mousedown: mouseDown, mouseover: mouseOver, mouseup: mouseUp, keyup: keyup, keydown: keydown })); }); var destroy = function () { handlers.each(function (handlers) { }); }; return { clear: annotations.clear, destroy: destroy }; } var Selections = function (editor) { var get = function () { var body = getBody$1(editor); return TableSelection.retrieve(body, Ephemera.selectedSelector()).fold(function () { if (editor.selection.getStart() === undefined) { return SelectionTypes.none(); } else { return SelectionTypes.single(editor.selection); } }, function (cells) { return SelectionTypes.multiple(cells); }); }; return { get: get }; }; var each$4 = global$1.each; var addButtons = function (editor) { var menuItems = []; each$4('inserttable tableprops deletetable | cell row column'.split(' '), function (name) { if (name === '|') { menuItems.push({ text: '-' }); } else { menuItems.push(editor.menuItems[name]); } }); editor.addButton('table', { type: 'menubutton', title: 'Table', menu: menuItems }); function cmd(command) { return function () { editor.execCommand(command); }; } editor.addButton('tableprops', { title: 'Table properties', onclick: cmd('mceTableProps'), icon: 'table' }); editor.addButton('tabledelete', { title: 'Delete table', onclick: cmd('mceTableDelete') }); editor.addButton('tablecellprops', { title: 'Cell properties', onclick: cmd('mceTableCellProps') }); editor.addButton('tablemergecells', { title: 'Merge cells', onclick: cmd('mceTableMergeCells') }); editor.addButton('tablesplitcells', { title: 'Split cell', onclick: cmd('mceTableSplitCells') }); editor.addButton('tableinsertrowbefore', { title: 'Insert row before', onclick: cmd('mceTableInsertRowBefore') }); editor.addButton('tableinsertrowafter', { title: 'Insert row after', onclick: cmd('mceTableInsertRowAfter') }); editor.addButton('tabledeleterow', { title: 'Delete row', onclick: cmd('mceTableDeleteRow') }); editor.addButton('tablerowprops', { title: 'Row properties', onclick: cmd('mceTableRowProps') }); editor.addButton('tablecutrow', { title: 'Cut row', onclick: cmd('mceTableCutRow') }); editor.addButton('tablecopyrow', { title: 'Copy row', onclick: cmd('mceTableCopyRow') }); editor.addButton('tablepasterowbefore', { title: 'Paste row before', onclick: cmd('mceTablePasteRowBefore') }); editor.addButton('tablepasterowafter', { title: 'Paste row after', onclick: cmd('mceTablePasteRowAfter') }); editor.addButton('tableinsertcolbefore', { title: 'Insert column before', onclick: cmd('mceTableInsertColBefore') }); editor.addButton('tableinsertcolafter', { title: 'Insert column after', onclick: cmd('mceTableInsertColAfter') }); editor.addButton('tabledeletecol', { title: 'Delete column', onclick: cmd('mceTableDeleteCol') }); }; var addToolbars = function (editor) { var isTable = function (table) { var selectorMatched = editor.dom.is(table, 'table') && editor.getBody().contains(table); return selectorMatched; }; var toolbar = getToolbar(editor); if (toolbar.length > 0) { editor.addContextToolbar(isTable, toolbar.join(' ')); } }; var Buttons = { addButtons: addButtons, addToolbars: addToolbars }; var addMenuItems = function (editor, selections) { var targets = Option.none(); var tableCtrls = []; var cellCtrls = []; var mergeCtrls = []; var unmergeCtrls = []; var noTargetDisable = function (ctrl) { ctrl.disabled(true); }; var ctrlEnable = function (ctrl) { ctrl.disabled(false); }; var pushTable = function () { var self = this; tableCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { ctrlEnable(self); }); }; var pushCell = function () { var self = this; cellCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { ctrlEnable(self); }); }; var pushMerge = function () { var self = this; mergeCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { self.disabled(targets.mergable().isNone()); }); }; var pushUnmerge = function () { var self = this; unmergeCtrls.push(self); targets.fold(function () { noTargetDisable(self); }, function (targets) { self.disabled(targets.unmergable().isNone()); }); }; var setDisabledCtrls = function () { targets.fold(function () { each(tableCtrls, noTargetDisable); each(cellCtrls, noTargetDisable); each(mergeCtrls, noTargetDisable); each(unmergeCtrls, noTargetDisable); }, function (targets) { each(tableCtrls, ctrlEnable); each(cellCtrls, ctrlEnable); each(mergeCtrls, function (mergeCtrl) { mergeCtrl.disabled(targets.mergable().isNone()); }); each(unmergeCtrls, function (unmergeCtrl) { unmergeCtrl.disabled(targets.unmergable().isNone()); }); }); }; editor.on('init', function () { editor.on('nodechange', function (e) { var cellOpt = Option.from(editor.dom.getParent(editor.selection.getStart(), 'th,td')); targets = cellOpt.bind(function (cellDom) { var cell = Element.fromDom(cellDom); var table = TableLookup.table(cell); return table.map(function (table) { return TableTargets.forMenu(selections, table, cell); }); }); setDisabledCtrls(); }); }); var generateTableGrid = function () { var html = ''; html = ''; for (var y = 0; y < 10; y++) { html += ''; for (var x = 0; x < 10; x++) { html += ''; } html += ''; } html += '
'; html += ''; return html; }; var selectGrid = function (editor, tx, ty, control) { var table = control.getEl().getElementsByTagName('table')[0]; var x, y, focusCell, cell, active; var rtl = control.isRtl() || control.parent().rel === 'tl-tr'; table.nextSibling.innerHTML = tx + 1 + ' x ' + (ty + 1); if (rtl) { tx = 9 - tx; } for (y = 0; y < 10; y++) { for (x = 0; x < 10; x++) { cell = table.rows[y].childNodes[x].firstChild; active = (rtl ? x >= tx : x <= tx) && y <= ty; editor.dom.toggleClass(cell, 'mce-active', active); if (active) { focusCell = cell; } } } return focusCell.parentNode; }; var insertTable = hasTableGrid(editor) === false ? { text: 'Table', icon: 'table', context: 'table', onclick: cmd('mceInsertTable') } : { text: 'Table', icon: 'table', context: 'table', ariaHideMenu: true, onclick: function (e) { if (e.aria) { this.parent().hideAll(); e.stopImmediatePropagation(); editor.execCommand('mceInsertTable'); } }, onshow: function () { selectGrid(editor, 0, 0, this.menu.items()[0]); }, onhide: function () { var elements = this.menu.items()[0].getEl().getElementsByTagName('a'); editor.dom.removeClass(elements, 'mce-active'); editor.dom.addClass(elements[0], 'mce-active'); }, menu: [{ type: 'container', html: generateTableGrid(), onPostRender: function () { this.lastX = this.lastY = 0; }, onmousemove: function (e) { var target = e.target; var x, y; if (target.tagName.toUpperCase() === 'A') { x = parseInt(target.getAttribute('data-mce-x'), 10); y = parseInt(target.getAttribute('data-mce-y'), 10); if (this.isRtl() || this.parent().rel === 'tl-tr') { x = 9 - x; } if (x !== this.lastX || y !== this.lastY) { selectGrid(editor, x, y, e.control); this.lastX = x; this.lastY = y; } } }, onclick: function (e) { var self = this; if (e.target.tagName.toUpperCase() === 'A') { e.preventDefault(); e.stopPropagation(); self.parent().cancel(); editor.undoManager.transact(function () { InsertTable.insert(editor, self.lastX + 1, self.lastY + 1); }); editor.addVisual(); } } }] }; function cmd(command) { return function () { editor.execCommand(command); }; } var tableProperties = { text: 'Table properties', context: 'table', onPostRender: pushTable, onclick: cmd('mceTableProps') }; var deleteTable = { text: 'Delete table', context: 'table', onPostRender: pushTable, cmd: 'mceTableDelete' }; var row = { text: 'Row', context: 'table', menu: [ { text: 'Insert row before', onclick: cmd('mceTableInsertRowBefore'), onPostRender: pushCell }, { text: 'Insert row after', onclick: cmd('mceTableInsertRowAfter'), onPostRender: pushCell }, { text: 'Delete row', onclick: cmd('mceTableDeleteRow'), onPostRender: pushCell }, { text: 'Row properties', onclick: cmd('mceTableRowProps'), onPostRender: pushCell }, { text: '-' }, { text: 'Cut row', onclick: cmd('mceTableCutRow'), onPostRender: pushCell }, { text: 'Copy row', onclick: cmd('mceTableCopyRow'), onPostRender: pushCell }, { text: 'Paste row before', onclick: cmd('mceTablePasteRowBefore'), onPostRender: pushCell }, { text: 'Paste row after', onclick: cmd('mceTablePasteRowAfter'), onPostRender: pushCell } ] }; var column = { text: 'Column', context: 'table', menu: [ { text: 'Insert column before', onclick: cmd('mceTableInsertColBefore'), onPostRender: pushCell }, { text: 'Insert column after', onclick: cmd('mceTableInsertColAfter'), onPostRender: pushCell }, { text: 'Delete column', onclick: cmd('mceTableDeleteCol'), onPostRender: pushCell } ] }; var cell = { separator: 'before', text: 'Cell', context: 'table', menu: [ { text: 'Cell properties', onclick: cmd('mceTableCellProps'), onPostRender: pushCell }, { text: 'Merge cells', onclick: cmd('mceTableMergeCells'), onPostRender: pushMerge }, { text: 'Split cell', onclick: cmd('mceTableSplitCells'), onPostRender: pushUnmerge } ] }; editor.addMenuItem('inserttable', insertTable); editor.addMenuItem('tableprops', tableProperties); editor.addMenuItem('deletetable', deleteTable); editor.addMenuItem('row', row); editor.addMenuItem('column', column); editor.addMenuItem('cell', cell); }; var MenuItems = { addMenuItems: addMenuItems }; var getClipboardRows = function (clipboardRows) { return clipboardRows.get().fold(function () { return; }, function (rows) { return map(rows, function (row) { return row.dom(); }); }); }; var setClipboardRows = function (rows, clipboardRows) { var sugarRows = map(rows, Element.fromDom); clipboardRows.set(Option.from(sugarRows)); }; var getApi = function (editor, clipboardRows) { return { insertTable: function (columns, rows) { return InsertTable.insert(editor, columns, rows); }, setClipboardRows: function (rows) { return setClipboardRows(rows, clipboardRows); }, getClipboardRows: function () { return getClipboardRows(clipboardRows); } }; }; function Plugin(editor) { var resizeHandler = ResizeHandler(editor); var cellSelection = CellSelection$1(editor, resizeHandler.lazyResize); var actions = TableActions(editor, resizeHandler.lazyWire); var selections = Selections(editor); var clipboardRows = Cell(Option.none()); Commands.registerCommands(editor, actions, cellSelection, selections, clipboardRows); Clipboard.registerEvents(editor, selections, actions, cellSelection); MenuItems.addMenuItems(editor, selections); Buttons.addButtons(editor); Buttons.addToolbars(editor); editor.on('PreInit', function () { editor.serializer.addTempAttr(Ephemera.firstSelected()); editor.serializer.addTempAttr(Ephemera.lastSelected()); }); if (hasTabNavigation(editor)) { editor.on('keydown', function (e) { TabContext.handle(e, editor, actions, resizeHandler.lazyWire); }); } editor.on('remove', function () { resizeHandler.destroy(); cellSelection.destroy(); }); return getApi(editor, clipboardRows); } global.add('table', Plugin); function Plugin$1 () { } return Plugin$1; }(window)); })(); @media (min-width:ELEMENTOR_SCREEN_TABLET_NEXT){.elementor-widget-wc-archive-products .woocommerce.columns-2 ul.products{grid-template-columns:repeat(2,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-3 ul.products{grid-template-columns:repeat(3,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-4 ul.products{grid-template-columns:repeat(4,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-5 ul.products{grid-template-columns:repeat(5,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-6 ul.products{grid-template-columns:repeat(6,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-7 ul.products{grid-template-columns:repeat(7,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-8 ul.products{grid-template-columns:repeat(8,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-9 ul.products{grid-template-columns:repeat(9,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-10 ul.products{grid-template-columns:repeat(10,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-11 ul.products{grid-template-columns:repeat(11,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-12 ul.products{grid-template-columns:repeat(12,1fr)}}@media (max-width:ELEMENTOR_SCREEN_TABLET_MAX){.elementor-widget-wc-archive-products .products{grid-template-columns:repeat(3,1fr)}}@media (max-width:ELEMENTOR_SCREEN_MOBILE_MAX){.elementor-widget-wc-archive-products .products{grid-template-columns:repeat(2,1fr)}}@media (min-width:ELEMENTOR_SCREEN_TABLET_NEXT){.elementor-widget-wc-archive-products .woocommerce.columns-2 ul.products{grid-template-columns:repeat(2,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-3 ul.products{grid-template-columns:repeat(3,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-4 ul.products{grid-template-columns:repeat(4,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-5 ul.products{grid-template-columns:repeat(5,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-6 ul.products{grid-template-columns:repeat(6,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-7 ul.products{grid-template-columns:repeat(7,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-8 ul.products{grid-template-columns:repeat(8,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-9 ul.products{grid-template-columns:repeat(9,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-10 ul.products{grid-template-columns:repeat(10,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-11 ul.products{grid-template-columns:repeat(11,1fr)}.elementor-widget-wc-archive-products .woocommerce.columns-12 ul.products{grid-template-columns:repeat(12,1fr)}}@media (max-width:ELEMENTOR_SCREEN_TABLET_MAX){.elementor-widget-wc-archive-products .products{grid-template-columns:repeat(3,1fr)}}@media (max-width:ELEMENTOR_SCREEN_MOBILE_MAX){.elementor-widget-wc-archive-products .products{grid-template-columns:repeat(2,1fr)}} live.unvergesslich.de

Kostenloses Webinar

So merkt sich dein Gehirn Inhalte 10x schneller.

Entdecke das Gedächtnistraining, das dich nicht nur schneller lernen lässt, sondern klarer denken, überzeugender auftreten und langfristig Zeit sparen.

Teilnehmer
300000 +
Jahre Wissen
0 +
Firmen begeistert
1000 +

Bekannt aus

In diesem 75-minütigen Webinar lernst du:

Wie sich dein Denken, Arbeiten und Auftreten wirklich verändert

Du sparst dir ständiges Wiederholen und unnötiges Nachlesen – und gehst effizienter mit deiner Zeit um.
Du lernst schneller, merkst dir mehr – und kannst Informationen gezielter einsetzen.
Du trittst klarer, souveräner und überzeugender auf – im Job und im Gespräch.
Du gewinnst mentale Ruhe, weil du weißt: Du hast den Kopf frei – und die wichtigen Dinge parat.
Du wirkst kompetenter und gewinnst leichter das Vertrauen anderer.

Ideal für alle, die mehr behalten – und dadurch kompetenter wirken wollen

Kundenstimmen

"Was für ein gigantischer Vortrag!"

"Pfiffig und auf eine wundervolle lebendige und witzige Art, aber durchaus kompetent und ansprechend haben Sie alle Zuhörer in den Bann gezogen."

Annette Wasmer

SCHEELEN® AG

"Es funktioniert!"

"Ich kann mir nach diesem Tag mit dir viel mehr merken als gedacht. Irrsinnig was möglich ist – Lernen ist geil – Lernen ist einfacher als gedacht! Hat Spaß gemacht! Bockstark! Super! Es funktioniert!"

Peter Loser

Abteilungsleiter BMW

"Jetzt bin ich schlauer!"

"Das musst du ausprobieren! - Mit diesen Worten hatte mein Enkel (14 Jahre, 9. Klasse Gymnasium) mir die Unvergesslich-Box geschenkt. Unglaublich was seit dem passiert ist! Jetzt bin ich um einiges schlauer."

Gabriele Müller

pensionierte Lehrerin

"Ich bin begeistert!"

"Es war sensationell und ich war nicht nur von mir, sondern auch von dir total begeistert! 😊 Danke für das großartige Seminar."

Robert Rottler

Prokurist Privatbank

"Ich kann ALLES!"

"Was Hänschen nicht lernt, lernt Hans nimmermehr? Denkste. Jetzt glaube ich, kann ich so ziemlich alles lernen. Ich weiß ja jetzt, wie es geht. Im ersten Moment wirken die Gedächtnistechniken merkwürdig, ungewohnt – kann das so funktionieren? Ja. Kann es. Tut es. Mach es!"

Hans Seidenbacher

KMU München

"Einfach unvergesslich."

"Die 3 Veranstaltungen mit Markus im Gymnasium „Lornsenschule“ in Schleswig waren einfach unvergesslich. Alle Schüler waren begeistert, wie viel Spaß man am Lernen haben kann und entdeckten neue Lerntechniken für sich."

Sünne Jacobsen

Vorstand SEB Lornsenschule

Bekannt aus

Erfolg durch verknüpftes Denken

Er lernte die Gedächtnistechniken erst im Studium kennen und konnte damit seinen Notendurchschnitt von 3,2 im Abitur auf 1,3 im Studium steigern. Und das bei der Hälfte der Lernzeit! Mit der Zeit verbesserte er die Lernmethoden und entwickelte Techniken, mit denen sich auch seine Kommilitonen und Mitmenschen eine Fülle von Informationen aneignen konnten bei stark reduziertem Lernaufwand.

In den darauffolgenden Jahren vertiefte er sein Wissen und verfeinerte verschiedenste Merk- und Denktechniken derart erfolgreich, dass er es zu seiner Mission machte, die Gedächtnisleistung von Menschen in nur kurzer Zeit enorm zu steigern.

Heute ist Markus Hofmann einer der wohl inspirierendsten und effektivsten Gedächtsnisexperten Europas, Buchautor und wurde mit dem Deutschen Weiterbildungspreis ausgezeichnet. Er ist Gründer und Ausbilder der Greator®-Lerncoach-Ausbildung. Über 350.000 Teilnehmer waren bereits live in seinen Vorträgen und Seminaren.

Referenzen & Showcases

Besser erinnern, schneller denken, souveräner handeln – jetzt starten

Alle Rechte vorbehalten © 2025

Allgemeine Geschäftsbedingungen

Allgemeine Geschäftsbedingungen und Kundeninformationen

I. Allgemeine Geschäftsbedingungen

§ 1 Grundlegende Bestimmungen

(1) Die nachstehenden Geschäftsbedingungen gelten für Verträge, die Sie mit uns als Anbieter (Memo-Mind Brainproducts GmbH) über die Internetseite www.unvergesslich.de/shop schließen. Soweit nicht anders vereinbart, wird der Einbeziehung gegebenenfalls von Ihnen verwendeter eigener Bedingungen widersprochen.

(2) Verbraucher im Sinne der nachstehenden Regelungen ist jede natürliche Person, die ein Rechtsgeschäft zu Zwecken abschließt, die überwiegend weder ihrer gewerblichen noch ihrer selbständigen beruflichen Tätigkeit zugerechnet werden kann. Unternehmer ist jede natürliche oder juristische Person oder eine rechtsfähige Personengesellschaft, die bei Abschluss eines Rechtsgeschäfts in Ausübung ihrer selbständigen beruflichen oder gewerblichen Tätigkeit handelt.

§ 2 Zustandekommen des Vertrages

(1) Gegenstand des Vertrages ist der Verkauf von Waren .

(2) Bereits mit dem Einstellen des jeweiligen Produkts auf unserer Internetseite unterbreiten wir Ihnen ein verbindliches Angebot zum Abschluss eines Vertrages über das Online-Warenkorbsystem zu den in der Artikelbeschreibung angegebenen Bedingungen.

(3) Der Vertrag kommt über das Online-Warenkorbsystem wie folgt zustande:
Die zum Kauf beabsichtigten Waren  werden im „Warenkorb“ abgelegt. Über die entsprechende Schaltfläche in der Navigationsleiste können Sie den „Warenkorb“ aufrufen und dort jederzeit Änderungen vornehmen.
Nach Anklicken der Schaltfläche „Kasse“ oder „Weiter zur Bestellung“  (oder ähnliche Bezeichnung) und der Eingabe der persönlichen Daten sowie der Zahlungs- und Versandbedingungen werden Ihnen abschließend die Bestelldaten als Bestellübersicht angezeigt.

Soweit Sie als Zahlungsart ein Sofortzahl-System (z.B. PayPal (Express/Plus/Checkout), Amazon Pay, Sofort, giropay) nutzen, werden Sie entweder auf die Bestellübersichtsseite in unserem Online-Shop geführt oder auf die Internetseite des Anbieters des Sofortzahl-Systems weitergeleitet.
Erfolgt eine Weiterleitung zu dem jeweiligen Sofortzahl-System, nehmen Sie dort die entsprechende Auswahl bzw. Eingabe Ihrer Daten vor. Abschließend werden Ihnen auf der Internetseite des Anbieters des Sofortzahl-Systems oder nachdem Sie zurück in unseren Online-Shop geleitet wurden, die Bestelldaten als Bestellübersicht angezeigt.

Vor Absenden der Bestellung haben Sie die Möglichkeit, die Angaben in der Bestellübersicht nochmals zu überprüfen, zu ändern (auch über die Funktion „zurück“ des Internetbrowsers) bzw. die Bestellung abzubrechen.

Mit dem Absenden der Bestellung über die entsprechende Schaltfläche („zahlungspflichtig bestellen“, „kaufen“ / „jetzt kaufen“, „kostenpflichtig bestellen“, „bezahlen“ / „jetzt bezahlen“ oder ähnliche Bezeichnung) erklären Sie rechtsverbindlich die Annahme des Angebotes, wodurch der Vertrag zustande kommt.

(4) Ihre Anfragen zur Erstellung eines Angebotes sind für Sie unverbindlich. Wir unterbreiten Ihnen hierzu ein verbindliches Angebot in Textform (z.B. per E-Mail), welches Sie innerhalb von 5 Tagen (soweit im jeweiligen Angebot keine andere Frist ausgewiesen ist) annehmen können.

(5) Die Abwicklung der Bestellung und Übermittlung aller im Zusammenhang mit dem Vertragsschluss erforderlichen Informationen erfolgt per E-Mail zum Teil automatisiert. Sie haben deshalb sicherzustellen, dass die von Ihnen bei uns hinterlegte E-Mail-Adresse zutreffend ist, der Empfang der E-Mails technisch sichergestellt und insbesondere nicht durch SPAM-Filter verhindert wird.

§ 3 Zurückbehaltungsrecht, Eigentumsvorbehalt

(1) Ein Zurückbehaltungsrecht können Sie nur ausüben, soweit es sich um Forderungen aus demselben Vertragsverhältnis handelt.

(2)  Die Ware bleibt bis zur vollständigen Zahlung des Kaufpreises unser Eigentum.

(3)  Sind Sie Unternehmer, gilt ergänzend Folgendes:

a) Wir behalten uns das Eigentum an der Ware bis zum vollständigen Ausgleich aller Forderungen aus der laufenden Geschäftsbeziehung vor. Vor Übergang des Eigentums an der Vorbehaltsware ist eine Verpfändung oder Sicherheitsübereignung nicht zulässig.

b) Sie können die Ware im ordentlichen Geschäftsgang weiterverkaufen. Für diesen Fall treten Sie bereits jetzt alle Forderungen in Höhe des Rechnungsbetrages, die Ihnen aus dem Weiterverkauf erwachsen, an uns ab, wir nehmen die Abtretung an. Sie sind weiter zur Einziehung der Forderung ermächtigt. Soweit Sie Ihren Zahlungsverpflichtungen nicht ordnungsgemäß nachkommen, behalten wir uns allerdings vor, die Forderung selbst einzuziehen.

c) Bei Verbindung und Vermischung der Vorbehaltsware erwerben wir Miteigentum an der neuen Sache im Verhältnis des Rechnungswertes der Vorbehaltsware zu den anderen verarbeiteten Gegenständen zum Zeitpunkt der Verarbeitung.

d) Wir verpflichten uns, die uns zustehenden Sicherheiten auf Ihr Verlangen insoweit freizugeben, als der realisierbare Wert unserer Sicherheiten die zu sichernde Forderung um mehr als 10% übersteigt. Die Auswahl der freizugebenden Sicherheiten obliegt uns.

§ 4 Gewährleistung

(1) Es bestehen die gesetzlichen Mängelhaftungsrechte.

(2) Als Verbraucher werden Sie gebeten, die Ware bei Lieferung umgehend auf Vollständigkeit, offensichtliche Mängel und Transportschäden zu überprüfen und uns sowie dem Spediteur Beanstandungen schnellstmöglich mitzuteilen. Kommen Sie dem nicht nach, hat dies keine Auswirkung auf Ihre gesetzlichen Gewährleistungsansprüche.

(3) Soweit ein Merkmal der Ware von den objektiven Anforderungen abweicht, gilt die Abweichung nur dann als vereinbart, wenn Sie vor Abgabe der Vertragserklärung durch uns über selbige in Kenntnis gesetzt wurden und die Abweichung ausdrücklich und gesondert zwischen den Vertragsparteien vereinbart wurde.

(4) Soweit Sie Unternehmer sind, gilt abweichend von den vorstehenden Gewährleistungsregelungen:

a)  Als Beschaffenheit der Ware gelten nur unsere eigenen Angaben und die Produktbeschreibung des Herstellers als vereinbart, nicht jedoch sonstige Werbung, öffentliche Anpreisungen und Äußerungen des Herstellers.

b)  Bei Mängeln leisten wir nach unserer Wahl Gewähr durch Nachbesserung oder Nachlieferung. Schlägt die Mangelbeseitigung fehl, können Sie nach Ihrer Wahl Minderung verlangen oder vom Vertrag zurücktreten. Die Mängelbeseitigung gilt nach erfolglosem zweiten Versuch als fehlgeschlagen, wenn sich nicht insbesondere aus der Art der Ware oder des Mangels oder den sonstigen Umständen etwas anderes ergibt. Im Falle der Nachbesserung müssen wir nicht die erhöhten Kosten tragen, die durch die Verbringung der Ware an einen anderen Ort als den Erfüllungsort entstehen, sofern die Verbringung nicht dem bestimmungsgemäßen Gebrauch der Ware entspricht.

c)  Die Gewährleistungsfrist beträgt ein Jahr ab Ablieferung der Ware. Die Fristverkürzung gilt nicht:

– für uns zurechenbare schuldhaft verursachte Schäden aus der Verletzung des Lebens, des Körpers oder der Gesundheit und bei vorsätzlich oder grob fahrlässig verursachten sonstigen Schäden;
– soweit wir den Mangel arglistig verschwiegen oder eine Garantie für die Beschaffenheit der Sache übernommen haben;
– bei Sachen, die entsprechend ihrer üblichen Verwendungsweise für ein Bauwerk verwendet worden sind und dessen Mangelhaftigkeit verursacht haben;
– bei gesetzlichen Rückgriffsansprüchen, die Sie im Zusammenhang mit Mängelrechten gegen uns haben.

§ 5 Rechtswahl, Erfüllungsort, Gerichtsstand

(1)  Es gilt deutsches Recht. Bei Verbrauchern gilt diese Rechtswahl nur, soweit hierdurch der durch zwingende Bestimmungen des Rechts des Staates des gewöhnlichen Aufenthaltes des Verbrauchers gewährte Schutz nicht entzogen wird (Günstigkeitsprinzip).

(2)  Erfüllungsort für alle Leistungen aus den mit uns bestehenden Geschäftsbeziehungen sowie Gerichtsstand ist unser Sitz, soweit Sie nicht Verbraucher, sondern Kaufmann, juristische Person des öffentlichen Rechts oder öffentlich-rechtliches Sondervermögen sind. Dasselbe gilt, wenn Sie keinen allgemeinen Gerichtsstand in Deutschland oder der EU haben oder der Wohnsitz oder gewöhnliche Aufenthalt im Zeitpunkt der Klageerhebung nicht bekannt ist. Die Befugnis, auch das Gericht an einem anderen gesetzlichen Gerichtsstand anzurufen, bleibt hiervon unberührt.

(3)  Die Bestimmungen des UN-Kaufrechts finden ausdrücklich keine Anwendung.


II. Kundeninformationen

1. Identität des Verkäufers

Memo-Mind Brainproducts GmbH
Maria-Einsiedel-Str. 17
81379 München
Deutschland

Telefon: +49 (0)89-4523210-0
E-Mail: shop@unvergesslich.de

Alternative Streitbeilegung:
Die Europäische Kommission stellt eine Plattform für die außergerichtliche Online-Streitbeilegung (OS-Plattform) bereit, aufrufbar unter https://ec.europa.eu/odr.

2. Informationen zum Zustandekommen des Vertrages

Die technischen Schritte zum Vertragsschluss, der Vertragsschluss selbst und die Korrekturmöglichkeiten erfolgen nach Maßgabe der Regelungen „Zustandekommen des Vertrages“ unserer Allgemeinen Geschäftsbedingungen (Teil I.).

3. Vertragssprache, Vertragstextspeicherung

3.1. Vertragssprache ist deutsch .

3.2. Der vollständige Vertragstext wird von uns nicht gespeichert. Vor Absenden der Bestellung über das Online – Warenkorbsystem  können die Vertragsdaten über die Druckfunktion des Browsers ausgedruckt oder elektronisch gesichert werden. Nach Zugang der Bestellung bei uns werden die Bestelldaten, die gesetzlich vorgeschriebenen Informationen bei Fernabsatzverträgen und die Allgemeinen Geschäftsbedingungen nochmals per E-Mail an Sie übersandt.

3.3. Bei Angebotsanfragen außerhalb des Online-Warenkorbsystems erhalten Sie alle Vertragsdaten im Rahmen eines verbindlichen Angebotes in Textform übersandt, z.B. per E-Mail, welche Sie ausdrucken oder elektronisch sichern können.

4. Wesentliche Merkmale der Ware oder Dienstleistung

Die wesentlichen Merkmale der Ware und/oder Dienstleistung finden sich im jeweiligen Angebot.

5. Preise und Zahlungsmodalitäten

5.1. Die in den jeweiligen Angeboten angeführten Preise sowie die Versandkosten stellen Gesamtpreise dar. Sie beinhalten alle Preisbestandteile einschließlich aller anfallenden Steuern.

5.2. Die anfallenden Versandkosten sind nicht im Kaufpreis enthalten. Sie sind über eine entsprechend bezeichnete Schaltfläche auf unserer Internetpräsenz oder im jeweiligen Angebot aufrufbar, werden im Laufe des Bestellvorganges gesondert ausgewiesen und sind von Ihnen zusätzlich zu tragen, soweit nicht die versandkostenfreie Lieferung zugesagt ist.

5.3. Erfolgt die Lieferung in Länder außerhalb der Europäischen Union können von uns nicht zu vertretende weitere Kosten anfallen, wie z.B. Zölle, Steuern oder Geldübermittlungsgebühren (Überweisungs- oder Wechselkursgebühren der Kreditinstitute), die von Ihnen zu tragen sind.

5.4. Entstandene Kosten der Geldübermittlung (Überweisungs- oder Wechselkursgebühren der Kreditinstitute) sind von Ihnen in den Fällen zu tragen, in denen die Lieferung in einen EU-Mitgliedsstaat erfolgt, die Zahlung aber außerhalb der Europäischen Union veranlasst wurde.

5.5. Die Ihnen zur Verfügung stehenden Zahlungsarten sind unter einer entsprechend bezeichneten Schaltfläche auf unserer Internetpräsenz oder im jeweiligen Angebot ausgewiesen.

5.6. Soweit bei den einzelnen Zahlungsarten nicht anders angegeben, sind die Zahlungsansprüche aus dem geschlossenen Vertrag sofort zur Zahlung fällig.

6. Lieferbedingungen

6.1. Die Lieferbedingungen, der Liefertermin sowie gegebenenfalls bestehende Lieferbeschränkungen finden sich unter einer entsprechend bezeichneten Schaltfläche auf unserer Internetpräsenz oder im jeweiligen Angebot.

6.2. Soweit Sie Verbraucher sind ist gesetzlich geregelt, dass die Gefahr des zufälligen Untergangs und der zufälligen Verschlechterung der verkauften Sache während der Versendung erst mit der Übergabe der Ware an Sie übergeht, unabhängig davon, ob die Versendung versichert oder unversichert erfolgt. Dies gilt nicht, wenn Sie eigenständig ein nicht vom Unternehmer benanntes Transportunternehmen oder eine sonst zur Ausführung der Versendung bestimmte Person beauftragt haben.

Sind Sie Unternehmer, erfolgt die Lieferung und Versendung auf Ihre Gefahr.

7. Gesetzliches Mängelhaftungsrecht

Die Mängelhaftung richtet sich nach der Regelung „Gewährleistung“ in unseren Allgemeinen Geschäftsbedingungen (Teil I).

Diese AGB und Kundeninformationen wurden von den auf IT-Recht spezialisierten Juristen des Händlerbundes erstellt und werden permanent auf Rechtskonformität geprüft. Die Händlerbund Management AG garantiert für die Rechtssicherheit der Texte und haftet im Falle von Abmahnungen. Nähere Informationen dazu finden Sie unter: https://www.haendlerbund.de/de/leistungen/rechtssicherheit/agb-service.

letzte Aktualisierung: 01.01.2022

Impressum

Anschrift

Markus Hofmann
Gedächtnisexperte, Keynote Speaker

Büchlfeld 8a
82266 Inning am Ammersee/Buch

Telefon: +49(0)8143 99985 80

Verantwortlich für Produktverkauf
und Veranstaltungsorganisation:

MEMO-MIND Brainproducts GmbH
Büchlfeld 8a
82266 Inning am Ammersee/Buch

Telefon: +49(0)8143 99985 80

E-Mail: welcome@unvergesslich.de

Web: www.unvergesslich.de

Amtsgericht München, HRB 168 698

Geschäftsführer: Markus Hofmann & Isabel Bertram

USt.-IdNr.: DE255062057

Sollten Ihnen Inhalte oder Grafiken so gut gefallen, dass Sie gerne etwas daraus übernehmen oder veröffentlichen möchten, dann holen Sie bitte im Vorfeld unsere schriftliche Genehmigung ein.

Widerrufsrecht

Sie können Ihre Bestellung innerhalb von zwei Wochen ohne Angabe von Gründen in Textform (z. B. Brief, Fax, E-Mail) oder durch Rücksendung der Ware widerrufen. Die Frist beginnt frühestens mit Erhalt der Ware. Zur Wahrung der Widerrufsfrist genügt die rechtzeitige Absendung des Widerrufs oder der Ware. Der Widerruf ist zu richten an: MEMO-MIND Brainproducts GmbH, Büchlfeld 8a , 82266 Inning am Ammersee/Buch.

Anti-Scientology-Erklärung

Um uns deutlich von unseriösen Angeboten abzugrenzen erklären wir (Markus Hofmann und die MEMO-MIND Brainproducts GmbH) für uns und alle durch uns eingesetzten Mitarbeiter, dass wir weder nach der Technologie von L. Ron Hubbard, noch mit einer anderen – mit Scientology zusammenhängenden – Technologie arbeiten. Wir besuchen keine Schulungen, Kurse oder Seminare nach den genannten Technologien und sind keine Mitglieder der IAS (International Association of Scientologists). Wir lehnen die Technologien von L. Ron Hubbard zur Führung unseres Unternehmens sowie innerhalb aller unserer unternehmerischen Aktivitäten ausnahmslos ab.

Haftungsausschluss

1. Inhalt des Onlineangebotes
Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt.
Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.

2. Verweise und Links
Bei direkten oder indirekten Verweisen auf fremde Webseiten („Hyperlinks”), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern.
Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist.

3. Urheber- und Kennzeichenrecht
Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen.
Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind!
Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet.

4. Rechtswirksamkeit dieses Haftungsausschlusses
Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt.


Powered by Kundenwachstum.de

Datenschutz

Die MEMO-MIND Brainproducts GmbH nimmt den Schutz Ihrer persönlichen Daten sehr ernst und hält sich strikt an die seit dem 25. Mai 2018 in Kraft getretene DSGVO.

1. Datenschutz auf einen Blick

Allgemeine Hinweise

Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz entnehmen Sie unserer unter diesem Text aufgeführten Datenschutzerklärung.

Datenerfassung auf dieser Website

Wer ist verantwortlich für die Datenerfassung auf dieser Website?

Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Abschnitt „Hinweis zur Verantwortlichen Stelle“ in dieser Datenschutzerklärung entnehmen.

Wie erfassen wir Ihre Daten?

Ihre Daten werden zum einen dadurch erhoben, dass Sie uns diese mitteilen. Hierbei kann es sich z. B. um Daten handeln, die Sie in ein Kontaktformular eingeben.

Andere Daten werden automatisch oder nach Ihrer Einwilligung beim Besuch der Website durch unsere IT-Systeme erfasst. Das sind vor allem technische Daten (z. B. Internetbrowser, Betriebssystem oder Uhrzeit des Seitenaufrufs). Die Erfassung dieser Daten erfolgt automatisch, sobald Sie diese Website betreten.

Wofür nutzen wir Ihre Daten?

Ein Teil der Daten wird erhoben, um eine fehlerfreie Bereitstellung der Website zu gewährleisten. Andere Daten können zur Analyse Ihres Nutzerverhaltens verwendet werden.

Welche Rechte haben Sie bezüglich Ihrer Daten?

Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten. Sie haben außerdem ein Recht, die Berichtigung oder Löschung dieser Daten zu verlangen. Wenn Sie eine Einwilligung zur Datenverarbeitung erteilt haben, können Sie diese Einwilligung jederzeit für die Zukunft widerrufen. Außerdem haben Sie das Recht, unter bestimmten Umständen die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Des Weiteren steht Ihnen ein Beschwerderecht bei der zuständigen Aufsichtsbehörde zu.

Hierzu sowie zu weiteren Fragen zum Thema Datenschutz können Sie sich jederzeit an uns wenden.

Analyse-Tools und Tools von Dritt­anbietern

Beim Besuch dieser Website kann Ihr Surf-Verhalten statistisch ausgewertet werden. Das geschieht vor allem mit sogenannten Analyseprogrammen.

Detaillierte Informationen zu diesen Analyseprogrammen finden Sie in der folgenden Datenschutzerklärung.

2. Hosting

Wir hosten die Inhalte unserer Website bei folgendem Anbieter:

Mittwald

Anbieter ist die Mittwald CM Service GmbH & Co. KG, Königsberger Straße 4-6, 32339 Espelkamp (nachfolgend Mittwald).

Details entnehmen Sie der Datenschutzerklärung von Mittwald: https://www.mittwald.de/datenschutz.

Die Verwendung von Mittwald erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Wir haben ein berechtigtes Interesse an einer möglichst zuverlässigen Darstellung unserer Website. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.

Auftragsverarbeitung

Wir haben einen Vertrag über Auftragsverarbeitung (AVV) zur Nutzung des oben genannten Dienstes geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.

3. Allgemeine Hinweise und Pflicht­informationen

Datenschutz

Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend den gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.

Wenn Sie diese Website benutzen, werden verschiedene personenbezogene Daten erhoben. Personenbezogene Daten sind Daten, mit denen Sie persönlich identifiziert werden können. Die vorliegende Datenschutzerklärung erläutert, welche Daten wir erheben und wofür wir sie nutzen. Sie erläutert auch, wie und zu welchem Zweck das geschieht.

Wir weisen darauf hin, dass die Datenübertragung im Internet (z. B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.

Hinweis zur verantwortlichen Stelle

Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:

Markus Hofmann
Gedächtnisexperte, Keynote Speaker
Büchlfeld 8a
82266 Inning am Ammersee/Buch

Telefon: +49(0)8143 99985 80
E-Mail: welcome@unvergesslich.de

Verantwortliche Stelle ist die natürliche oder juristische Person, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten (z. B. Namen, E-Mail-Adressen o. Ä.) entscheidet.

Speicherdauer

Soweit innerhalb dieser Datenschutzerklärung keine speziellere Speicherdauer genannt wurde, verbleiben Ihre personenbezogenen Daten bei uns, bis der Zweck für die Datenverarbeitung entfällt. Wenn Sie ein berechtigtes Löschersuchen geltend machen oder eine Einwilligung zur Datenverarbeitung widerrufen, werden Ihre Daten gelöscht, sofern wir keine anderen rechtlich zulässigen Gründe für die Speicherung Ihrer personenbezogenen Daten haben (z. B. steuer- oder handelsrechtliche Aufbewahrungsfristen); im letztgenannten Fall erfolgt die Löschung nach Fortfall dieser Gründe.

Allgemeine Hinweise zu den Rechtsgrundlagen der Datenverarbeitung auf dieser Website

Sofern Sie in die Datenverarbeitung eingewilligt haben, verarbeiten wir Ihre personenbezogenen Daten auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO bzw. Art. 9 Abs. 2 lit. a DSGVO, sofern besondere Datenkategorien nach Art. 9 Abs. 1 DSGVO verarbeitet werden. Im Falle einer ausdrücklichen Einwilligung in die Übertragung personenbezogener Daten in Drittstaaten erfolgt die Datenverarbeitung außerdem auf Grundlage von Art. 49 Abs. 1 lit. a DSGVO. Sofern Sie in die Speicherung von Cookies oder in den Zugriff auf Informationen in Ihr Endgerät (z. B. via Device-Fingerprinting) eingewilligt haben, erfolgt die Datenverarbeitung zusätzlich auf Grundlage von § 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Sind Ihre Daten zur Vertragserfüllung oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, verarbeiten wir Ihre Daten auf Grundlage des Art. 6 Abs. 1 lit. b DSGVO. Des Weiteren verarbeiten wir Ihre Daten, sofern diese zur Erfüllung einer rechtlichen Verpflichtung erforderlich sind auf Grundlage von Art. 6 Abs. 1 lit. c DSGVO. Die Datenverarbeitung kann ferner auf Grundlage unseres berechtigten Interesses nach Art. 6 Abs. 1 lit. f DSGVO erfolgen. Über die jeweils im Einzelfall einschlägigen Rechtsgrundlagen wird in den folgenden Absätzen dieser Datenschutzerklärung informiert.

Hinweis zur Datenweitergabe in die USA und sonstige Drittstaaten

Wir verwenden unter anderem Tools von Unternehmen mit Sitz in den USA oder sonstigen datenschutzrechtlich nicht sicheren Drittstaaten. Wenn diese Tools aktiv sind, können Ihre personenbezogene Daten in diese Drittstaaten übertragen und dort verarbeitet werden. Wir weisen darauf hin, dass in diesen Ländern kein mit der EU vergleichbares Datenschutzniveau garantiert werden kann. Beispielsweise sind US-Unternehmen dazu verpflichtet, personenbezogene Daten an Sicherheitsbehörden herauszugeben, ohne dass Sie als Betroffener hiergegen gerichtlich vorgehen könnten. Es kann daher nicht ausgeschlossen werden, dass US-Behörden (z. B. Geheimdienste) Ihre auf US-Servern befindlichen Daten zu Überwachungszwecken verarbeiten, auswerten und dauerhaft speichern. Wir haben auf diese Verarbeitungstätigkeiten keinen Einfluss.

Widerruf Ihrer Einwilligung zur Datenverarbeitung

Viele Datenverarbeitungsvorgänge sind nur mit Ihrer ausdrücklichen Einwilligung möglich. Sie können eine bereits erteilte Einwilligung jederzeit widerrufen. Die Rechtmäßigkeit der bis zum Widerruf erfolgten Datenverarbeitung bleibt vom Widerruf unberührt.

Widerspruchsrecht gegen die Datenerhebung in besonderen Fällen sowie gegen Direktwerbung (Art. 21 DSGVO)

WENN DIE DATENVERARBEITUNG AUF GRUNDLAGE VON ART. 6 ABS. 1 LIT. E ODER F DSGVO ERFOLGT, HABEN SIE JEDERZEIT DAS RECHT, AUS GRÜNDEN, DIE SICH AUS IHRER BESONDEREN SITUATION ERGEBEN, GEGEN DIE VERARBEITUNG IHRER PERSONENBEZOGENEN DATEN WIDERSPRUCH EINZULEGEN; DIES GILT AUCH FÜR EIN AUF DIESE BESTIMMUNGEN GESTÜTZTES PROFILING. DIE JEWEILIGE RECHTSGRUNDLAGE, AUF DENEN EINE VERARBEITUNG BERUHT, ENTNEHMEN SIE DIESER DATENSCHUTZERKLÄRUNG. WENN SIE WIDERSPRUCH EINLEGEN, WERDEN WIR IHRE BETROFFENEN PERSONENBEZOGENEN DATEN NICHT MEHR VERARBEITEN, ES SEI DENN, WIR KÖNNEN ZWINGENDE SCHUTZWÜRDIGE GRÜNDE FÜR DIE VERARBEITUNG NACHWEISEN, DIE IHRE INTERESSEN, RECHTE UND FREIHEITEN ÜBERWIEGEN ODER DIE VERARBEITUNG DIENT DER GELTENDMACHUNG, AUSÜBUNG ODER VERTEIDIGUNG VON RECHTSANSPRÜCHEN (WIDERSPRUCH NACH ART. 21 ABS. 1 DSGVO).

WERDEN IHRE PERSONENBEZOGENEN DATEN VERARBEITET, UM DIREKTWERBUNG ZU BETREIBEN, SO HABEN SIE DAS RECHT, JEDERZEIT WIDERSPRUCH GEGEN DIE VERARBEITUNG SIE BETREFFENDER PERSONENBEZOGENER DATEN ZUM ZWECKE DERARTIGER WERBUNG EINZULEGEN; DIES GILT AUCH FÜR DAS PROFILING, SOWEIT ES MIT SOLCHER DIREKTWERBUNG IN VERBINDUNG STEHT. WENN SIE WIDERSPRECHEN, WERDEN IHRE PERSONENBEZOGENEN DATEN ANSCHLIESSEND NICHT MEHR ZUM ZWECKE DER DIREKTWERBUNG VERWENDET (WIDERSPRUCH NACH ART. 21 ABS. 2 DSGVO).

Beschwerde­recht bei der zuständigen Aufsichts­behörde

Im Falle von Verstößen gegen die DSGVO steht den Betroffenen ein Beschwerderecht bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat ihres gewöhnlichen Aufenthalts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes zu. Das Beschwerderecht besteht unbeschadet anderweitiger verwaltungsrechtlicher oder gerichtlicher Rechtsbehelfe.

Recht auf Daten­übertrag­barkeit

Sie haben das Recht, Daten, die wir auf Grundlage Ihrer Einwilligung oder in Erfüllung eines Vertrags automatisiert verarbeiten, an sich oder an einen Dritten in einem gängigen, maschinenlesbaren Format aushändigen zu lassen. Sofern Sie die direkte Übertragung der Daten an einen anderen Verantwortlichen verlangen, erfolgt dies nur, soweit es technisch machbar ist.

Auskunft, Löschung und Berichtigung

Sie haben im Rahmen der geltenden gesetzlichen Bestimmungen jederzeit das Recht auf unentgeltliche Auskunft über Ihre gespeicherten personenbezogenen Daten, deren Herkunft und Empfänger und den Zweck der Datenverarbeitung und ggf. ein Recht auf Berichtigung oder Löschung dieser Daten. Hierzu sowie zu weiteren Fragen zum Thema personenbezogene Daten können Sie sich jederzeit an uns wenden.

Recht auf Einschränkung der Verarbeitung

Sie haben das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Hierzu können Sie sich jederzeit an uns wenden. Das Recht auf Einschränkung der Verarbeitung besteht in folgenden Fällen:

  • Wenn Sie die Richtigkeit Ihrer bei uns gespeicherten personenbezogenen Daten bestreiten, benötigen wir in der Regel Zeit, um dies zu überprüfen. Für die Dauer der Prüfung haben Sie das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.
  • Wenn die Verarbeitung Ihrer personenbezogenen Daten unrechtmäßig geschah/geschieht, können Sie statt der Löschung die Einschränkung der Datenverarbeitung verlangen.
  • Wenn wir Ihre personenbezogenen Daten nicht mehr benötigen, Sie sie jedoch zur Ausübung, Verteidigung oder Geltendmachung von Rechtsansprüchen benötigen, haben Sie das Recht, statt der Löschung die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.
  • Wenn Sie einen Widerspruch nach Art. 21 Abs. 1 DSGVO eingelegt haben, muss eine Abwägung zwischen Ihren und unseren Interessen vorgenommen werden. Solange noch nicht feststeht, wessen Interessen überwiegen, haben Sie das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.

Wenn Sie die Verarbeitung Ihrer personenbezogenen Daten eingeschränkt haben, dürfen diese Daten – von ihrer Speicherung abgesehen – nur mit Ihrer Einwilligung oder zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen oder juristischen Person oder aus Gründen eines wichtigen öffentlichen Interesses der Europäischen Union oder eines Mitgliedstaats verarbeitet werden.

SSL- bzw. TLS-Verschlüsselung

Diese Seite nutzt aus Sicherheitsgründen und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel Bestellungen oder Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL- bzw. TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://“ auf „https://“ wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.

Wenn die SSL- bzw. TLS-Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.

Verschlüsselter Zahlungsverkehr auf dieser Website

Besteht nach dem Abschluss eines kostenpflichtigen Vertrags eine Verpflichtung, uns Ihre Zahlungsdaten (z. B. Kontonummer bei Einzugsermächtigung) zu übermitteln, werden diese Daten zur Zahlungsabwicklung benötigt.

Der Zahlungsverkehr über die gängigen Zahlungsmittel (Visa/MasterCard, Lastschriftverfahren) erfolgt ausschließlich über eine verschlüsselte SSL- bzw. TLS-Verbindung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://“ auf „https://“ wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.

Bei verschlüsselter Kommunikation können Ihre Zahlungsdaten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.

Widerspruch gegen Werbe-E-Mails

Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-E-Mails, vor.

4. Datenerfassung auf dieser Website

Cookies

Unsere Internetseiten verwenden so genannte „Cookies“. Cookies sind kleine Datenpakete und richten auf Ihrem Endgerät keinen Schaden an. Sie werden entweder vorübergehend für die Dauer einer Sitzung (Session-Cookies) oder dauerhaft (permanente Cookies) auf Ihrem Endgerät gespeichert. Session-Cookies werden nach Ende Ihres Besuchs automatisch gelöscht. Permanente Cookies bleiben auf Ihrem Endgerät gespeichert, bis Sie diese selbst löschen oder eine automatische Löschung durch Ihren Webbrowser erfolgt.

Cookies können von uns (First-Party-Cookies) oder von Drittunternehmen stammen (sog. Third-Party-Cookies). Third-Party-Cookies ermöglichen die Einbindung bestimmter Dienstleistungen von Drittunternehmen innerhalb von Webseiten (z. B. Cookies zur Abwicklung von Zahlungsdienstleistungen).

Cookies haben verschiedene Funktionen. Zahlreiche Cookies sind technisch notwendig, da bestimmte Webseitenfunktionen ohne diese nicht funktionieren würden (z. B. die Warenkorbfunktion oder die Anzeige von Videos). Andere Cookies können zur Auswertung des Nutzerverhaltens oder zu Werbezwecken verwendet werden.

Cookies, die zur Durchführung des elektronischen Kommunikationsvorgangs, zur Bereitstellung bestimmter, von Ihnen erwünschter Funktionen (z. B. für die Warenkorbfunktion) oder zur Optimierung der Website (z. B. Cookies zur Messung des Webpublikums) erforderlich sind (notwendige Cookies), werden auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO gespeichert, sofern keine andere Rechtsgrundlage angegeben wird. Der Websitebetreiber hat ein berechtigtes Interesse an der Speicherung von notwendigen Cookies zur technisch fehlerfreien und optimierten Bereitstellung seiner Dienste. Sofern eine Einwilligung zur Speicherung von Cookies und vergleichbaren Wiedererkennungstechnologien abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage dieser Einwilligung (Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG); die Einwilligung ist jederzeit widerrufbar.

Sie können Ihren Browser so einstellen, dass Sie über das Setzen von Cookies informiert werden und Cookies nur im Einzelfall erlauben, die Annahme von Cookies für bestimmte Fälle oder generell ausschließen sowie das automatische Löschen der Cookies beim Schließen des Browsers aktivieren. Bei der Deaktivierung von Cookies kann die Funktionalität dieser Website eingeschränkt sein.

Welche Cookies und Dienste auf dieser Website eingesetzt werden, können Sie dieser Datenschutzerklärung entnehmen.

Einwilligung mit Borlabs Cookie

Unsere Website nutzt die Consent-Technologie von Borlabs Cookie, um Ihre Einwilligung zur Speicherung bestimmter Cookies in Ihrem Browser oder zum Einsatz bestimmter Technologien einzuholen und diese datenschutzkonform zu dokumentieren. Anbieter dieser Technologie ist die Borlabs GmbH, Rübenkamp 32, 22305 Hamburg (im Folgenden Borlabs).

Wenn Sie unsere Website betreten, wird ein Borlabs-Cookie in Ihrem Browser gespeichert, in dem die von Ihnen erteilten Einwilligungen oder der Widerruf dieser Einwilligungen gespeichert werden. Diese Daten werden nicht an den Anbieter von Borlabs Cookie weitergegeben.

Die erfassten Daten werden gespeichert, bis Sie uns zur Löschung auffordern bzw. das Borlabs-Cookie selbst löschen oder der Zweck für die Datenspeicherung entfällt. Zwingende gesetzliche Aufbewahrungsfristen bleiben unberührt. Details zur Datenverarbeitung von Borlabs Cookie finden Sie unter https://de.borlabs.io/kb/welche-daten-speichert-borlabs-cookie/.

Der Einsatz der Borlabs-Cookie-Consent-Technologie erfolgt, um die gesetzlich vorgeschriebenen Einwilligungen für den Einsatz von Cookies einzuholen. Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. c DSGVO.

Server-Log-Dateien

Der Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log-Dateien, die Ihr Browser automatisch an uns übermittelt. Dies sind:

  • Browsertyp und Browserversion
  • verwendetes Betriebssystem
  • Referrer URL
  • Hostname des zugreifenden Rechners
  • Uhrzeit der Serveranfrage
  • IP-Adresse

Eine Zusammenführung dieser Daten mit anderen Datenquellen wird nicht vorgenommen.

Die Erfassung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an der technisch fehlerfreien Darstellung und der Optimierung seiner Website – hierzu müssen die Server-Log-Files erfasst werden.

Kontaktformular

Wenn Sie uns per Kontaktformular Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.

Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) sofern diese abgefragt wurde; die Einwilligung ist jederzeit widerrufbar.

Die von Ihnen im Kontaktformular eingegebenen Daten verbleiben bei uns, bis Sie uns zur Löschung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck für die Datenspeicherung entfällt (z. B. nach abgeschlossener Bearbeitung Ihrer Anfrage). Zwingende gesetzliche Bestimmungen – insbesondere Aufbewahrungsfristen – bleiben unberührt.

Anfrage per E-Mail, Telefon oder Telefax

Wenn Sie uns per E-Mail, Telefon oder Telefax kontaktieren, wird Ihre Anfrage inklusive aller daraus hervorgehenden personenbezogenen Daten (Name, Anfrage) zum Zwecke der Bearbeitung Ihres Anliegens bei uns gespeichert und verarbeitet. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.

Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) sofern diese abgefragt wurde; die Einwilligung ist jederzeit widerrufbar.

Die von Ihnen an uns per Kontaktanfragen übersandten Daten verbleiben bei uns, bis Sie uns zur Löschung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck für die Datenspeicherung entfällt (z. B. nach abgeschlossener Bearbeitung Ihres Anliegens). Zwingende gesetzliche Bestimmungen – insbesondere gesetzliche Aufbewahrungsfristen – bleiben unberührt.

5. Analyse-Tools und Werbung

Google Tag Manager

Wir setzen den Google Tag Manager ein. Anbieter ist die Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland.

Der Google Tag Manager ist ein Tool, mit dessen Hilfe wir Tracking- oder Statistik-Tools und andere Technologien auf unserer Website einbinden können. Der Google Tag Manager selbst erstellt keine Nutzerprofile, speichert keine Cookies und nimmt keine eigenständigen Analysen vor. Er dient lediglich der Verwaltung und Ausspielung der über ihn eingebundenen Tools. Der Google Tag Manager erfasst jedoch Ihre IP-Adresse, die auch an das Mutterunternehmen von Google in die Vereinigten Staaten übertragen werden kann.

Der Einsatz des Google Tag Managers erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an einer schnellen und unkomplizierten Einbindung und Verwaltung verschiedener Tools auf seiner Website. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.

Google Analytics

Diese Website nutzt Funktionen des Webanalysedienstes Google Analytics. Anbieter ist die Google Ireland Limited („Google“), Gordon House, Barrow Street, Dublin 4, Irland.

Google Analytics ermöglicht es dem Websitebetreiber, das Verhalten der Websitebesucher zu analysieren. Hierbei erhält der Websitebetreiber verschiedene Nutzungsdaten, wie z. B. Seitenaufrufe, Verweildauer, verwendete Betriebssysteme und Herkunft des Nutzers. Diese Daten werden dem jeweiligen Endgerät des Users zugeordnet. Eine Zuordnung zu einer User-ID erfolgt nicht.

Des Weiteren können wir mit Google Analytics u. a. Ihre Maus- und Scrollbewegungen und Klicks aufzeichnen. Ferner verwendet Google Analytics verschiedene Modellierungsansätze, um die erfassten Datensätze zu ergänzen und setzt Machine-Learning-Technologien bei der Datenanalyse ein.

Google Analytics verwendet Technologien, die die Wiedererkennung des Nutzers zum Zwecke der Analyse des Nutzerverhaltens ermöglichen (z. B. Cookies oder Device-Fingerprinting). Die von Google erfassten Informationen über die Benutzung dieser Website werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.

Die Nutzung dieses Dienstes erfolgt auf Grundlage Ihrer Einwilligung nach Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar.

Die Datenübertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gestützt. Details finden Sie hier: https://privacy.google.com/businesses/controllerterms/mccs/.

IP Anonymisierung

Wir haben auf dieser Website die Funktion IP-Anonymisierung aktiviert. Dadurch wird Ihre IP-Adresse von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum vor der Übermittlung in die USA gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um Ihre Nutzung der Website auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen. Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt.

Browser Plugin

Sie können die Erfassung und Verarbeitung Ihrer Daten durch Google verhindern, indem Sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: https://tools.google.com/dlpage/gaoptout?hl=de.

Mehr Informationen zum Umgang mit Nutzerdaten bei Google Analytics finden Sie in der Datenschutzerklärung von Google: https://support.google.com/analytics/answer/6004245?hl=de.

Auftragsverarbeitung

Wir haben mit Google einen Vertrag zur Auftragsverarbeitung abgeschlossen und setzen die strengen Vorgaben der deutschen Datenschutzbehörden bei der Nutzung von Google Analytics vollständig um.

Google Analytics E-Commerce-Messung

Diese Website nutzt die Funktion „E-Commerce-Messung“ von Google Analytics. Mit Hilfe von E-Commerce-Messung kann der Websitebetreiber das Kaufverhalten der Websitebesucher zur Verbesserung seiner Online-Marketing-Kampagnen analysieren. Hierbei werden Informationen, wie zum Beispiel die getätigten Bestellungen, durchschnittliche Bestellwerte, Versandkosten und die Zeit von der Ansicht bis zum Kauf eines Produktes erfasst. Diese Daten können von Google unter einer Transaktions-ID zusammengefasst werden, die dem jeweiligen Nutzer bzw. dessen Gerät zugeordnet ist.

Hotjar

Diese Website nutzt Hotjar. Anbieter ist die Hotjar Ltd., Level 2, St Julians Business Centre, 3, Elia Zammit Street, St Julians STJ 1000, Malta, Europe (Website: https://www.hotjar.com).

Hotjar ist ein Werkzeug zur Analyse Ihres Nutzerverhaltens auf dieser Website. Mit Hotjar können wir u. a. Ihre Maus- und Scrollbewegungen und Klicks aufzeichnen. Hotjar kann dabei auch feststellen, wie lange Sie mit dem Mauszeiger auf einer bestimmten Stelle verblieben sind. Aus diesen Informationen erstellt Hotjar sogenannte Heatmaps, mit denen sich feststellen lässt, welche Websitebereiche vom Websitebesucher bevorzugt angeschaut werden.

Des Weiteren können wir feststellen, wie lange Sie auf einer Seite verblieben sind und wann Sie sie verlassen haben. Wir können auch feststellen, an welcher Stelle Sie Ihre Eingaben in ein Kontaktformular abgebrochen haben (sog. Conversion-Funnels).

Darüber hinaus können mit Hotjar direkte Feedbacks von Websitebesuchern eingeholt werden. Diese Funktion dient der Verbesserung der Webangebote des Websitebetreibers.

Hotjar verwendet Technologien, die die Wiedererkennung des Nutzers zum Zwecke der Analyse des Nutzerverhaltens ermöglichen (z. B. Cookies oder Einsatz von Device-Fingerprinting).

Soweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz deso. g.Dienstes ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung dieses Dienstes auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO; der Websitebetreiber hat ein berechtigtes Interesse an der Analyse des Nutzerverhaltens, um sowohl sein Webangebot als auch seine Werbung zu optimieren.

Deaktivieren von Hotjar

Wenn Sie die Datenerfassung durch Hotjar deaktivieren möchten, klicken Sie auf folgenden Link und folgen Sie den dortigen Anweisungen: https://www.hotjar.com/policies/do-not-track/

Bitte beachten Sie, dass die Deaktivierung von Hotjar für jeden Browser bzw. für jedes Endgerät separat erfolgen muss.

Nähere Informationen über Hotjar und zu den erfassten Daten entnehmen Sie der Datenschutzerklärung von Hotjar unter dem folgenden Link: https://www.hotjar.com/privacy

Auftragsverarbeitung

Wir haben einen Vertrag über Auftragsverarbeitung (AVV) zur Nutzung des oben genannten Dienstes geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.

Clarity

Diese Website nutzt Clarity. Anbieter ist die Microsoft Ireland Operations Limited, One Microsoft Place, South County Business Park, Leopardstown, Dublin 18, Irland, https://docs.microsoft.com/en-us/clarity/ (im Folgenden „Clarity“).

Clarity ist ein Werkzeug zur Analyse des Nutzerverhaltens auf dieser Website. Hierbei erfasst Clarity insbesondere Mausbewegungen und erstellt eine grafische Darstellung darüber, auf welchen Teil der Website Nutzer besonders häufig scrollen (Heatmaps). Clarity kann ferner Sitzungen aufzeichnen, sodass wir die Seitennutzung in Form von Videos ansehen können. Ferner erhalten wir Angaben über das allgemeine Nutzerverhalten innerhalb unserer Website.

Clarity verwendet Technologien, die die Wiedererkennung des Nutzers zum Zwecke der Analyse des Nutzerverhaltens ermöglichen (z. B. Cookies oder Einsatz von Device-Fingerprinting). Ihre personenbezogenen Daten werden auf den Servern von Microsoft (Microsoft Azure Cloud Service) in den USA gespeichert.

Soweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz des o. g. Dienstes ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung dieses Dienstes auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO; der Websitebetreiber hat ein berechtigtes Interesse an einer effektiven Nutzeranalyse.

Weitere Details zum Datenschutz von Clarity finden Sie hier: https://docs.microsoft.com/en-us/clarity/faq.

Auftragsverarbeitung

Wir haben einen Vertrag über Auftragsverarbeitung (AVV) zur Nutzung des oben genannten Dienstes geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.

Meta-Pixel (ehemals Facebook Pixel)

Diese Website nutzt zur Konversionsmessung der Besucheraktions-Pixel von Facebook/Meta. Anbieter dieses Dienstes ist die Meta Platforms Ireland Limited, 4 Grand Canal Square, Dublin 2, Irland. Die erfassten Daten werden nach Aussage von Facebook jedoch auch in die USA und in andere Drittländer übertragen.

So kann das Verhalten der Seitenbesucher nachverfolgt werden, nachdem diese durch Klick auf eine Facebook-Werbeanzeige auf die Website des Anbieters weitergeleitet wurden. Dadurch können die Wirksamkeit der Facebook-Werbeanzeigen für statistische und Marktforschungszwecke ausgewertet werden und zukünftige Werbemaßnahmen optimiert werden.

Die erhobenen Daten sind für uns als Betreiber dieser Website anonym, wir können keine Rückschlüsse auf die Identität der Nutzer ziehen. Die Daten werden aber von Facebook gespeichert und verarbeitet, sodass eine Verbindung zum jeweiligen Nutzerprofil möglich ist und Facebook die Daten für eigene Werbezwecke, entsprechend der Facebook-Datenverwendungsrichtlinie (https://de-de.facebook.com/about/privacy/) verwenden kann. Dadurch kann Facebook das Schalten von Werbeanzeigen auf Seiten von Facebook sowie außerhalb von Facebook ermöglichen. Diese Verwendung der Daten kann von uns als Seitenbetreiber nicht beeinflusst werden.

Die Nutzung dieses Dienstes erfolgt auf Grundlage Ihrer Einwilligung nach Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar.

Soweit mit Hilfe des hier beschriebenen Tools personenbezogene Daten auf unserer Website erfasst und an Facebook weitergeleitet werden, sind wir und die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland gemeinsam für diese Datenverarbeitung verantwortlich (Art. 26 DSGVO). Die gemeinsame Verantwortlichkeit beschränkt sich dabei ausschließlich auf die Erfassung der Daten und deren Weitergabe an Facebook. Die nach der Weiterleitung erfolgende Verarbeitung durch Facebook ist nicht Teil der gemeinsamen Verantwortung. Die uns gemeinsam obliegenden Verpflichtungen wurden in einer Vereinbarung über gemeinsame Verarbeitung festgehalten. Den Wortlaut der Vereinbarung finden Sie unter: https://www.facebook.com/legal/controller_addendum. Laut dieser Vereinbarung sind wir für die Erteilung der Datenschutzinformationen beim Einsatz des Facebook-Tools und für die datenschutzrechtlich sichere Implementierung des Tools auf unserer Website verantwortlich. Für die Datensicherheit der Facebook-Produkte ist Facebook verantwortlich. Betroffenenrechte (z. B. Auskunftsersuchen) hinsichtlich der bei Facebook verarbeiteten Daten können Sie direkt bei Facebook geltend machen. Wenn Sie die Betroffenenrechte bei uns geltend machen, sind wir verpflichtet, diese an Facebook weiterzuleiten.

Die Datenübertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gestützt. Details finden Sie hier: https://www.facebook.com/legal/EU_data_transfer_addendum und https://de-de.facebook.com/help/566994660333381.

In den Datenschutzhinweisen von Facebook finden Sie weitere Hinweise zum Schutz Ihrer Privatsphäre: https://de-de.facebook.com/about/privacy/.

Sie können außerdem die Remarketing-Funktion „Custom Audiences” im Bereich Einstellungen für Werbeanzeigen unter https://www.facebook.com/ads/preferences/?entry_product=ad_settings_screen deaktivieren. Dazu müssen Sie bei Facebook angemeldet sein.

Wenn Sie kein Facebook Konto besitzen, können Sie nutzungsbasierte Werbung von Facebook auf der Website der European Interactive Digital Advertising Alliance deaktivieren: http://www.youronlinechoices.com/de/praferenzmanagement/.

6. Newsletter

Newsletter­daten

Wenn Sie den auf der Website angebotenen Newsletter beziehen möchten, benötigen wir von Ihnen eine E-Mail-Adresse sowie Informationen, welche uns die Überprüfung gestatten, dass Sie der Inhaber der angegebenen E-Mail-Adresse und mit dem Empfang des Newsletters einverstanden sind. Weitere Daten werden nicht bzw. nur auf freiwilliger Basis erhoben. Für die Abwicklung der Newsletter nutzen wir Newsletterdiensteanbieter, die nachfolgend beschrieben werden.

ActiveCampaign

Diese Website nutzt ActiveCampaign für den Versand von Newslettern. Anbieter ist die ActiveCampaign, Inc., 1 N Dearborn, 5th Floor Chicago, Illinois 60602, USA.

ActiveCampaign ist ein Dienst, mit dem u.a. der Versand von Newslettern organisiert und analysiert werden kann. Die von Ihnen zum Zwecke des Newsletterbezugs eingegeben Daten werden auf den Servern von ActiveCampaign in den USA gespeichert.

Datenanalyse durch ActiveCampaign

Mit Hilfe von ActiveCampaign ist es uns möglich, unsere Newsletter-Kampagnen zu analysieren. So können wir z. B. sehen, ob eine Newsletter-Nachricht geöffnet wurde und welche Links ggf. angeklickt wurden. Auf diese Weise können wir u.a. feststellen, welche Links besonders oft angeklickt wurden.

Außerdem können wir erkennen, ob nach dem Öffnen / Anklicken bestimmte vorher definierte Aktionen durchgeführt wurden (Conversion-Rate). Wir können so z. B. erkennen, ob Sie nach dem Anklicken des Newsletters einen Kauf getätigt haben.

ActiveCampaign ermöglicht es uns auch, die Newsletter-Empfänger anhand verschiedener Kategorien zu unterteilen (“clustern”). Dabei lassen sich die Newsletterempfänger z. B. nach Alter, Geschlecht oder Wohnort unterteilen. Auf diese Weise lassen sich die Newsletter besser an die jeweiligen Zielgruppen anpassen. Wenn Sie keine Analyse durch ActiveCampaign wollen, müssen Sie den Newsletter abbestellen. Hierfür stellen wir in jeder Newsletternachricht einen entsprechenden Link zur Verfügung.

Ausführliche Informationen zu den Funktionen von ActiveCampaign entnehmen Sie folgendem Link: https://www.activecampaign.com/email-marketing.

Die Datenschutzerklärung von ActiveCampaign finden Sie unter: https://www.activecampaign.com/privacy-policy.

Rechtsgrundlage

Die Datenverarbeitung erfolgt auf Grundlage Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO). Sie können diese Einwilligung jederzeit widerrufen. Die Rechtmäßigkeit der bereits erfolgten Datenverarbeitungsvorgänge bleibt vom Widerruf unberührt.

Die Datenübertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gestützt. Details finden Sie hier: https://www.activecampaign.com/legal/scc und https://www.activecampaign.com/de/legal/gdpr-updates/privacy-shield.

Speicherdauer

Die von Ihnen zum Zwecke des Newsletter-Bezugs bei uns hinterlegten Daten werden von uns bis zu Ihrer Austragung aus dem Newsletter bei uns bzw. dem Newsletterdiensteanbieter gespeichert und nach der Abbestellung des Newsletters aus der Newsletterverteilerliste gelöscht. Daten, die zu anderen Zwecken bei uns gespeichert wurden, bleiben hiervon unberührt.

Nach Ihrer Austragung aus der Newsletterverteilerliste wird Ihre E-Mail-Adresse bei uns bzw. dem Newsletterdiensteanbieter ggf. in einer Blacklist gespeichert, sofern dies zur Verhinderung künftiger Mailings erforderlich ist. Die Daten aus der Blacklist werden nur für diesen Zweck verwendet und nicht mit anderen Daten zusammengeführt. Dies dient sowohl Ihrem Interesse als auch unserem Interesse an der Einhaltung der gesetzlichen Vorgaben beim Versand von Newslettern (berechtigtes Interesse im Sinne des Art. 6 Abs. 1 lit. f DSGVO). Die Speicherung in der Blacklist ist zeitlich nicht befristet. Sie können der Speicherung widersprechen, sofern Ihre Interessen unser berechtigtes Interesse überwiegen.

Auftragsverarbeitung

Wir haben einen Vertrag über Auftragsverarbeitung (AVV) zur Nutzung des oben genannten Dienstes geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.

7. Plugins und Tools

YouTube mit erweitertem Datenschutz

Diese Website bindet Videos der Website YouTube ein. Betreiber der Seiten ist die Google Ireland Limited („Google“), Gordon House, Barrow Street, Dublin 4, Irland.

Wir nutzen YouTube im erweiterten Datenschutzmodus. Dieser Modus bewirkt laut YouTube, dass YouTube keine Informationen über die Besucher auf dieser Website speichert, bevor diese sich das Video ansehen. Die Weitergabe von Daten an YouTube-Partner wird durch den erweiterten Datenschutzmodus hingegen nicht zwingend ausgeschlossen. So stellt YouTube – unabhängig davon, ob Sie sich ein Video ansehen – eine Verbindung zum Google DoubleClick-Netzwerk her.

Sobald Sie ein YouTube-Video auf dieser Website starten, wird eine Verbindung zu den Servern von YouTube hergestellt. Dabei wird dem YouTube-Server mitgeteilt, welche unserer Seiten Sie besucht haben. Wenn Sie in Ihrem YouTube-Account eingeloggt sind, ermöglichen Sie YouTube, Ihr Surfverhalten direkt Ihrem persönlichen Profil zuzuordnen. Dies können Sie verhindern, indem Sie sich aus Ihrem YouTube-Account ausloggen.

Des Weiteren kann YouTube nach Starten eines Videos verschiedene Cookies auf Ihrem Endgerät speichern oder vergleichbare Wiedererkennungstechnologien (z. B. Device-Fingerprinting) einsetzen. Auf diese Weise kann YouTube Informationen über Besucher dieser Website erhalten. Diese Informationen werden u. a. verwendet, um Videostatistiken zu erfassen, die Anwenderfreundlichkeit zu verbessern und Betrugsversuchen vorzubeugen.

Gegebenenfalls können nach dem Start eines YouTube-Videos weitere Datenverarbeitungsvorgänge ausgelöst werden, auf die wir keinen Einfluss haben.

Die Nutzung von YouTube erfolgt im Interesse einer ansprechenden Darstellung unserer Online-Angebote. Dies stellt ein berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO dar. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.

Weitere Informationen über Datenschutz bei YouTube finden Sie in deren Datenschutzerklärung unter: https://policies.google.com/privacy?hl=de.

Vimeo ohne Tracking (Do-Not-Track)

Diese Website nutzt Plugins des Videoportals Vimeo. Anbieter ist die Vimeo Inc., 555 West 18th Street, New York, New York 10011, USA.

Wenn Sie eine unserer mit Vimeo-Videos ausgestatteten Seiten besuchen, wird eine Verbindung zu den Servern von Vimeo hergestellt. Dabei wird dem Vimeo-Server mitgeteilt, welche unserer Seiten Sie besucht haben. Zudem erlangt Vimeo Ihre IP-Adresse. Wir haben Vimeo jedoch so eingestellt, dass Vimeo Ihre Nutzeraktivitäten nicht nachverfolgen und keine Cookies setzen wird.

Die Nutzung von Vimeo erfolgt im Interesse einer ansprechenden Darstellung unserer Online-Angebote. Dies stellt ein berechtigtes Interesse im Sinne des Art. 6 Abs. 1 lit. f DSGVO dar. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO; die Einwilligung ist jederzeit widerrufbar.

Die Datenübertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission sowie nach Aussage von Vimeo auf „berechtigte Geschäftsinteressen“ gestützt. Details finden Sie hier: https://vimeo.com/privacy.

Weitere Informationen zum Umgang mit Nutzerdaten finden Sie in der Datenschutzerklärung von Vimeo unter: https://vimeo.com/privacy.

WebinarGeek

Für Webinare nutzen wir die Webinarplattform von WebinarGeek.com (Chroomstraat 12, 2718 RR Zoetermeer, Niederlande).

Für die Anmeldung und die Durchführung der Online-Seminare verwenden wir die von Ihnen an uns übermittelten Daten bei der Anmeldung zum jeweiligen Seminar, und zwar Vorname, Nachname, E-Mail, Unternehmen/Arbeitgeber und die Postleitzahl.

Nach der Anmeldung nutzen wir Ihre E-Mail-Adresse, um die Anmeldung zu bestätigen, Einwahl-Informationen zu versenden und Sie kurz vor dem Webinar an den anstehenden Termin zu erinnern. Nach einem Webinar nutzen wir Ihre E-Mail-Adresse und ihren Namen einmalig, um Ihnen eine E-Mail zu schicken und Ihnen Zugriff zu den Aufnahmen des Online-Seminars zu ermöglichen.

Im Rahmen des Online-Seminars erhalten wir von Ihnen folgende Daten: Name, Vorname, E-Mail-Adresse zur Identifizierung und Login, Land, IP-Adresse und Cookies zur Verwaltung der Internetsitzung und Gewährleistung der Bereitstellung des Webinars. Die Verarbeitung Ihrer Daten erfolgt nur im Rahmen des Online-Seminars.

Rechtsgrundlage für die vorgenannten Datenverarbeitung ist Art. 6 Abs. 1 lit. b DSGVO. Die Verarbeitung dient ausschließlich der Vertragserfüllung in Form der Durchführung sowie Vor- und Nachbereitung der Teilnahmevereinbarung des jeweiligen Webinars.

Mit Webinargeek wurde ein Auftragsverarbeitungsvertrag geschlossen. Webinargeek verarbeitet die Daten ausschließlich in der europäischen Union. Ein Transfer Ihrer personenbezogenen Daten in Drittstaaten findet nicht statt.

Weitere Infos zum Datenschutz bei Webinargeek finden Sie unter: https://www.webinargeek.com/privacy

Auftragsverarbeitung

Wir haben einen Vertrag über Auftragsverarbeitung (AVV) zur Nutzung des oben genannten Dienstes geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.

8. eCommerce und Zahlungs­anbieter

Verarbeiten von Kunden- und Vertragsdaten

Wir erheben, verarbeiten und nutzen personenbezogene Kunden- und Vertragsdaten zur Begründung, inhaltlichen Ausgestaltung und Änderung unserer Vertragsbeziehungen. Personenbezogene Daten über die Inanspruchnahme dieser Website (Nutzungsdaten) erheben, verarbeiten und nutzen wir nur, soweit dies erforderlich ist, um dem Nutzer die Inanspruchnahme des Dienstes zu ermöglichen oder abzurechnen. Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. b DSGVO.

Die erhobenen Kundendaten werden nach Abschluss des Auftrags oder Beendigung der Geschäftsbeziehung und Ablauf der ggf. bestehenden gesetzlichen Aufbewahrungsfristen gelöscht. Gesetzliche Aufbewahrungsfristen bleiben unberührt.

Daten­übermittlung bei Vertragsschluss für Dienstleistungen und digitale Inhalte

Wir übermitteln personenbezogene Daten an Dritte nur dann, wenn dies im Rahmen der Vertragsabwicklung notwendig ist, etwa an das mit der Zahlungsabwicklung beauftragte Kreditinstitut.

Eine weitergehende Übermittlung der Daten erfolgt nicht bzw. nur dann, wenn Sie der Übermittlung ausdrücklich zugestimmt haben. Eine Weitergabe Ihrer Daten an Dritte ohne ausdrückliche Einwilligung, etwa zu Zwecken der Werbung, erfolgt nicht.

Grundlage für die Datenverarbeitung ist Art. 6 Abs. 1 lit. b DSGVO, der die Verarbeitung von Daten zur Erfüllung eines Vertrags oder vorvertraglicher Maßnahmen gestattet.

elopage

Auf dieser Website bieten wir unter anderem digitale Waren und Dienstleistungen zum Kauf an. Für den Verkauf dieser Produkte auf unserer Website nutzen wir elopage. Anbieter ist die elopage GmbH, Kurfürstendamm 208, 10719 Berlin, Deutschland (nachfolgend elopage).

Wenn Sie auf eines unserer Produkte klicken, werden Sie zu unserer Verkaufsseite auf elopage weitergeleitet. Die Vertragsabwicklung erfolgt anschließend über elopage. Details entnehmen Sie der Datenschutzerklärung von elopage unter: https://elopage.com/privacy?locale=de.

Die Verwendung von elopage erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Wir haben ein berechtigtes Interesse an der Nutzung einer schnellen und professionellen Verkaufsseite zum Vertrieb unserer Produkte. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.

Auftragsverarbeitung

Wir haben einen Vertrag über Auftragsverarbeitung (AVV) zur Nutzung des oben genannten Dienstes geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.