{"version":3,"sources":["jsdelivr-header.js","/npm/node_modules/svelte/internal/index.mjs","/npm/node_modules/svelte/store/index.mjs","/npm/node_modules/tslib/tslib.es6.js","/npm/src/core/store.ts","/npm/src/utils/domUtils.ts","/npm/src/core/constants.ts","/npm/src/core/drag/draggable.ts","/npm/src/core/drag/dragDropManager.ts","/npm/src/core/task.ts","/npm/src/entities/Task.svelte","/npm/src/entities/Row.svelte","/npm/src/entities/TimeRange.svelte","/npm/src/entities/TimeRangeHeader.svelte","/npm/src/column/ColumnHeaderRow.svelte","/npm/src/utils/utils.ts","/npm/src/column/ColumnHeader.svelte","/npm/src/column/Columns.svelte","/npm/src/ui/Resizer.svelte","/npm/src/utils/selectionManager.ts","/npm/src/core/api.ts","/npm/src/core/row.ts","/npm/src/core/timeRange.ts","/npm/src/core/events.ts","/npm/src/core/column.ts","/npm/src/Gantt.svelte","/npm/src/modules/table/TableTreeCell.svelte","/npm/src/modules/table/TableRow.svelte","/npm/src/modules/table/Table.svelte","/npm/src/modules/table/index.ts","/npm/src/modules/dependencies/Arrow.svelte","/npm/src/modules/dependencies/Dependency.svelte","/npm/src/modules/dependencies/GanttDependencies.svelte","/npm/src/modules/external/external.ts","/npm/src/index.ts"],"names":[],"mappings":"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","file":"/npm/svelte-gantt-event-custom-v2@1.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/svelte-gantt-event-custom-v2@1.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n    // @ts-ignore\n    for (const k in src)\n        tar[k] = src[k];\n    return tar;\n}\nfunction is_promise(value) {\n    return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n    element.__svelte_meta = {\n        loc: { file, line, column, char }\n    };\n}\nfunction run(fn) {\n    return fn();\n}\nfunction blank_object() {\n    return Object.create(null);\n}\nfunction run_all(fns) {\n    fns.forEach(run);\n}\nfunction is_function(thing) {\n    return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n    return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n    return a != a ? b == b : a !== b;\n}\nfunction validate_store(store, name) {\n    if (store != null && typeof store.subscribe !== 'function') {\n        throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n    }\n}\nfunction subscribe(store, ...callbacks) {\n    if (store == null) {\n        return noop;\n    }\n    const unsub = store.subscribe(...callbacks);\n    return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n    let value;\n    subscribe(store, _ => value = _)();\n    return value;\n}\nfunction component_subscribe(component, store, callback) {\n    component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n    if (definition) {\n        const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n        return definition[0](slot_ctx);\n    }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n    return definition[1] && fn\n        ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n        : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n    if (definition[2] && fn) {\n        const lets = definition[2](fn(dirty));\n        if ($$scope.dirty === undefined) {\n            return lets;\n        }\n        if (typeof lets === 'object') {\n            const merged = [];\n            const len = Math.max($$scope.dirty.length, lets.length);\n            for (let i = 0; i < len; i += 1) {\n                merged[i] = $$scope.dirty[i] | lets[i];\n            }\n            return merged;\n        }\n        return $$scope.dirty | lets;\n    }\n    return $$scope.dirty;\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n    const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n    if (slot_changes) {\n        const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n        slot.p(slot_context, slot_changes);\n    }\n}\nfunction exclude_internal_props(props) {\n    const result = {};\n    for (const k in props)\n        if (k[0] !== '$')\n            result[k] = props[k];\n    return result;\n}\nfunction compute_rest_props(props, keys) {\n    const rest = {};\n    keys = new Set(keys);\n    for (const k in props)\n        if (!keys.has(k) && k[0] !== '$')\n            rest[k] = props[k];\n    return rest;\n}\nfunction once(fn) {\n    let ran = false;\n    return function (...args) {\n        if (ran)\n            return;\n        ran = true;\n        fn.call(this, ...args);\n    };\n}\nfunction null_to_empty(value) {\n    return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n    store.set(value);\n    return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n    return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n    ? () => window.performance.now()\n    : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n    now = fn;\n}\nfunction set_raf(fn) {\n    raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n    tasks.forEach(task => {\n        if (!task.c(now)) {\n            tasks.delete(task);\n            task.f();\n        }\n    });\n    if (tasks.size !== 0)\n        raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n    tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n    let task;\n    if (tasks.size === 0)\n        raf(run_tasks);\n    return {\n        promise: new Promise(fulfill => {\n            tasks.add(task = { c: callback, f: fulfill });\n        }),\n        abort() {\n            tasks.delete(task);\n        }\n    };\n}\n\nfunction append(target, node) {\n    target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n    target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n    node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n    for (let i = 0; i < iterations.length; i += 1) {\n        if (iterations[i])\n            iterations[i].d(detaching);\n    }\n}\nfunction element(name) {\n    return document.createElement(name);\n}\nfunction element_is(name, is) {\n    return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n    const target = {};\n    for (const k in obj) {\n        if (has_prop(obj, k)\n            // @ts-ignore\n            && exclude.indexOf(k) === -1) {\n            // @ts-ignore\n            target[k] = obj[k];\n        }\n    }\n    return target;\n}\nfunction svg_element(name) {\n    return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n    return document.createTextNode(data);\n}\nfunction space() {\n    return text(' ');\n}\nfunction empty() {\n    return text('');\n}\nfunction listen(node, event, handler, options) {\n    node.addEventListener(event, handler, options);\n    return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n    return function (event) {\n        event.preventDefault();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_propagation(fn) {\n    return function (event) {\n        event.stopPropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction self(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.target === this)\n            fn.call(this, event);\n    };\n}\nfunction attr(node, attribute, value) {\n    if (value == null)\n        node.removeAttribute(attribute);\n    else if (node.getAttribute(attribute) !== value)\n        node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n    // @ts-ignore\n    const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n    for (const key in attributes) {\n        if (attributes[key] == null) {\n            node.removeAttribute(key);\n        }\n        else if (key === 'style') {\n            node.style.cssText = attributes[key];\n        }\n        else if (key === '__value') {\n            node.value = node[key] = attributes[key];\n        }\n        else if (descriptors[key] && descriptors[key].set) {\n            node[key] = attributes[key];\n        }\n        else {\n            attr(node, key, attributes[key]);\n        }\n    }\n}\nfunction set_svg_attributes(node, attributes) {\n    for (const key in attributes) {\n        attr(node, key, attributes[key]);\n    }\n}\nfunction set_custom_element_data(node, prop, value) {\n    if (prop in node) {\n        node[prop] = value;\n    }\n    else {\n        attr(node, prop, value);\n    }\n}\nfunction xlink_attr(node, attribute, value) {\n    node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group) {\n    const value = [];\n    for (let i = 0; i < group.length; i += 1) {\n        if (group[i].checked)\n            value.push(group[i].__value);\n    }\n    return value;\n}\nfunction to_number(value) {\n    return value === '' ? undefined : +value;\n}\nfunction time_ranges_to_array(ranges) {\n    const array = [];\n    for (let i = 0; i < ranges.length; i += 1) {\n        array.push({ start: ranges.start(i), end: ranges.end(i) });\n    }\n    return array;\n}\nfunction children(element) {\n    return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n    for (let i = 0; i < nodes.length; i += 1) {\n        const node = nodes[i];\n        if (node.nodeName === name) {\n            let j = 0;\n            while (j < node.attributes.length) {\n                const attribute = node.attributes[j];\n                if (attributes[attribute.name]) {\n                    j++;\n                }\n                else {\n                    node.removeAttribute(attribute.name);\n                }\n            }\n            return nodes.splice(i, 1)[0];\n        }\n    }\n    return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n    for (let i = 0; i < nodes.length; i += 1) {\n        const node = nodes[i];\n        if (node.nodeType === 3) {\n            node.data = '' + data;\n            return nodes.splice(i, 1)[0];\n        }\n    }\n    return text(data);\n}\nfunction claim_space(nodes) {\n    return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n    data = '' + data;\n    if (text.data !== data)\n        text.data = data;\n}\nfunction set_input_value(input, value) {\n    input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n    try {\n        input.type = type;\n    }\n    catch (e) {\n        // do nothing\n    }\n}\nfunction set_style(node, key, value, important) {\n    node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        if (option.__value === value) {\n            option.selected = true;\n            return;\n        }\n    }\n}\nfunction select_options(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        option.selected = ~value.indexOf(option.__value);\n    }\n}\nfunction select_value(select) {\n    const selected_option = select.querySelector(':checked') || select.options[0];\n    return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n    return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n    if (crossorigin === undefined) {\n        crossorigin = false;\n        try {\n            if (typeof window !== 'undefined' && window.parent) {\n                void window.parent.document;\n            }\n        }\n        catch (error) {\n            crossorigin = true;\n        }\n    }\n    return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n    const computed_style = getComputedStyle(node);\n    const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n    if (computed_style.position === 'static') {\n        node.style.position = 'relative';\n    }\n    const iframe = element('iframe');\n    iframe.setAttribute('style', `display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ` +\n        `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n    iframe.setAttribute('aria-hidden', 'true');\n    iframe.tabIndex = -1;\n    const crossorigin = is_crossorigin();\n    let unsubscribe;\n    if (crossorigin) {\n        iframe.src = `data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>`;\n        unsubscribe = listen(window, 'message', (event) => {\n            if (event.source === iframe.contentWindow)\n                fn();\n        });\n    }\n    else {\n        iframe.src = 'about:blank';\n        iframe.onload = () => {\n            unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n        };\n    }\n    append(node, iframe);\n    return () => {\n        if (crossorigin) {\n            unsubscribe();\n        }\n        else if (unsubscribe && iframe.contentWindow) {\n            unsubscribe();\n        }\n        detach(iframe);\n    };\n}\nfunction toggle_class(element, name, toggle) {\n    element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n    const e = document.createEvent('CustomEvent');\n    e.initCustomEvent(type, false, false, detail);\n    return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n    return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n    constructor(anchor = null) {\n        this.a = anchor;\n        this.e = this.n = null;\n    }\n    m(html, target, anchor = null) {\n        if (!this.e) {\n            this.e = element(target.nodeName);\n            this.t = target;\n            this.h(html);\n        }\n        this.i(anchor);\n    }\n    h(html) {\n        this.e.innerHTML = html;\n        this.n = Array.from(this.e.childNodes);\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert(this.t, this.n[i], anchor);\n        }\n    }\n    p(html) {\n        this.d();\n        this.h(html);\n        this.i(this.a);\n    }\n    d() {\n        this.n.forEach(detach);\n    }\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n    let hash = 5381;\n    let i = str.length;\n    while (i--)\n        hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n    return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n    const step = 16.666 / duration;\n    let keyframes = '{\\n';\n    for (let p = 0; p <= 1; p += step) {\n        const t = a + (b - a) * ease(p);\n        keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n    }\n    const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n    const name = `__svelte_${hash(rule)}_${uid}`;\n    const doc = node.ownerDocument;\n    active_docs.add(doc);\n    const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n    const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n    if (!current_rules[name]) {\n        current_rules[name] = true;\n        stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n    }\n    const animation = node.style.animation || '';\n    node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;\n    active += 1;\n    return name;\n}\nfunction delete_rule(node, name) {\n    const previous = (node.style.animation || '').split(', ');\n    const next = previous.filter(name\n        ? anim => anim.indexOf(name) < 0 // remove specific animation\n        : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n    );\n    const deleted = previous.length - next.length;\n    if (deleted) {\n        node.style.animation = next.join(', ');\n        active -= deleted;\n        if (!active)\n            clear_rules();\n    }\n}\nfunction clear_rules() {\n    raf(() => {\n        if (active)\n            return;\n        active_docs.forEach(doc => {\n            const stylesheet = doc.__svelte_stylesheet;\n            let i = stylesheet.cssRules.length;\n            while (i--)\n                stylesheet.deleteRule(i);\n            doc.__svelte_rules = {};\n        });\n        active_docs.clear();\n    });\n}\n\nfunction create_animation(node, from, fn, params) {\n    if (!from)\n        return noop;\n    const to = node.getBoundingClientRect();\n    if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n        return noop;\n    const { delay = 0, duration = 300, easing = identity, \n    // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n    start: start_time = now() + delay, \n    // @ts-ignore todo:\n    end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n    let running = true;\n    let started = false;\n    let name;\n    function start() {\n        if (css) {\n            name = create_rule(node, 0, 1, duration, delay, easing, css);\n        }\n        if (!delay) {\n            started = true;\n        }\n    }\n    function stop() {\n        if (css)\n            delete_rule(node, name);\n        running = false;\n    }\n    loop(now => {\n        if (!started && now >= start_time) {\n            started = true;\n        }\n        if (started && now >= end) {\n            tick(1, 0);\n            stop();\n        }\n        if (!running) {\n            return false;\n        }\n        if (started) {\n            const p = now - start_time;\n            const t = 0 + 1 * easing(p / duration);\n            tick(t, 1 - t);\n        }\n        return true;\n    });\n    start();\n    tick(0, 1);\n    return stop;\n}\nfunction fix_position(node) {\n    const style = getComputedStyle(node);\n    if (style.position !== 'absolute' && style.position !== 'fixed') {\n        const { width, height } = style;\n        const a = node.getBoundingClientRect();\n        node.style.position = 'absolute';\n        node.style.width = width;\n        node.style.height = height;\n        add_transform(node, a);\n    }\n}\nfunction add_transform(node, a) {\n    const b = node.getBoundingClientRect();\n    if (a.left !== b.left || a.top !== b.top) {\n        const style = getComputedStyle(node);\n        const transform = style.transform === 'none' ? '' : style.transform;\n        node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n    }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n    current_component = component;\n}\nfunction get_current_component() {\n    if (!current_component)\n        throw new Error(`Function called outside component initialization`);\n    return current_component;\n}\nfunction beforeUpdate(fn) {\n    get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n    get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n    get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n    get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n    const component = get_current_component();\n    return (type, detail) => {\n        const callbacks = component.$$.callbacks[type];\n        if (callbacks) {\n            // TODO are there situations where events could be dispatched\n            // in a server (non-DOM) environment?\n            const event = custom_event(type, detail);\n            callbacks.slice().forEach(fn => {\n                fn.call(component, event);\n            });\n        }\n    };\n}\nfunction setContext(key, context) {\n    get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n    return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n    const callbacks = component.$$.callbacks[event.type];\n    if (callbacks) {\n        callbacks.slice().forEach(fn => fn(event));\n    }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n    if (!update_scheduled) {\n        update_scheduled = true;\n        resolved_promise.then(flush);\n    }\n}\nfunction tick() {\n    schedule_update();\n    return resolved_promise;\n}\nfunction add_render_callback(fn) {\n    render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n    flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n    if (flushing)\n        return;\n    flushing = true;\n    do {\n        // first, call beforeUpdate functions\n        // and update components\n        for (let i = 0; i < dirty_components.length; i += 1) {\n            const component = dirty_components[i];\n            set_current_component(component);\n            update(component.$$);\n        }\n        dirty_components.length = 0;\n        while (binding_callbacks.length)\n            binding_callbacks.pop()();\n        // then, once components are updated, call\n        // afterUpdate functions. This may cause\n        // subsequent updates...\n        for (let i = 0; i < render_callbacks.length; i += 1) {\n            const callback = render_callbacks[i];\n            if (!seen_callbacks.has(callback)) {\n                // ...so guard against infinite loops\n                seen_callbacks.add(callback);\n                callback();\n            }\n        }\n        render_callbacks.length = 0;\n    } while (dirty_components.length);\n    while (flush_callbacks.length) {\n        flush_callbacks.pop()();\n    }\n    update_scheduled = false;\n    flushing = false;\n    seen_callbacks.clear();\n}\nfunction update($$) {\n    if ($$.fragment !== null) {\n        $$.update();\n        run_all($$.before_update);\n        const dirty = $$.dirty;\n        $$.dirty = [-1];\n        $$.fragment && $$.fragment.p($$.ctx, dirty);\n        $$.after_update.forEach(add_render_callback);\n    }\n}\n\nlet promise;\nfunction wait() {\n    if (!promise) {\n        promise = Promise.resolve();\n        promise.then(() => {\n            promise = null;\n        });\n    }\n    return promise;\n}\nfunction dispatch(node, direction, kind) {\n    node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n    outros = {\n        r: 0,\n        c: [],\n        p: outros // parent group\n    };\n}\nfunction check_outros() {\n    if (!outros.r) {\n        run_all(outros.c);\n    }\n    outros = outros.p;\n}\nfunction transition_in(block, local) {\n    if (block && block.i) {\n        outroing.delete(block);\n        block.i(local);\n    }\n}\nfunction transition_out(block, local, detach, callback) {\n    if (block && block.o) {\n        if (outroing.has(block))\n            return;\n        outroing.add(block);\n        outros.c.push(() => {\n            outroing.delete(block);\n            if (callback) {\n                if (detach)\n                    block.d(1);\n                callback();\n            }\n        });\n        block.o(local);\n    }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n    let config = fn(node, params);\n    let running = false;\n    let animation_name;\n    let task;\n    let uid = 0;\n    function cleanup() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n        tick(0, 1);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        if (task)\n            task.abort();\n        running = true;\n        add_render_callback(() => dispatch(node, true, 'start'));\n        task = loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(1, 0);\n                    dispatch(node, true, 'end');\n                    cleanup();\n                    return running = false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(t, 1 - t);\n                }\n            }\n            return running;\n        });\n    }\n    let started = false;\n    return {\n        start() {\n            if (started)\n                return;\n            delete_rule(node);\n            if (is_function(config)) {\n                config = config();\n                wait().then(go);\n            }\n            else {\n                go();\n            }\n        },\n        invalidate() {\n            started = false;\n        },\n        end() {\n            if (running) {\n                cleanup();\n                running = false;\n            }\n        }\n    };\n}\nfunction create_out_transition(node, fn, params) {\n    let config = fn(node, params);\n    let running = true;\n    let animation_name;\n    const group = outros;\n    group.r += 1;\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        add_render_callback(() => dispatch(node, false, 'start'));\n        loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(0, 1);\n                    dispatch(node, false, 'end');\n                    if (!--group.r) {\n                        // this will result in `end()` being called,\n                        // so we don't need to clean up here\n                        run_all(group.c);\n                    }\n                    return false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(1 - t, t);\n                }\n            }\n            return running;\n        });\n    }\n    if (is_function(config)) {\n        wait().then(() => {\n            // @ts-ignore\n            config = config();\n            go();\n        });\n    }\n    else {\n        go();\n    }\n    return {\n        end(reset) {\n            if (reset && config.tick) {\n                config.tick(1, 0);\n            }\n            if (running) {\n                if (animation_name)\n                    delete_rule(node, animation_name);\n                running = false;\n            }\n        }\n    };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n    let config = fn(node, params);\n    let t = intro ? 0 : 1;\n    let running_program = null;\n    let pending_program = null;\n    let animation_name = null;\n    function clear_animation() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function init(program, duration) {\n        const d = program.b - t;\n        duration *= Math.abs(d);\n        return {\n            a: t,\n            b: program.b,\n            d,\n            duration,\n            start: program.start,\n            end: program.start + duration,\n            group: program.group\n        };\n    }\n    function go(b) {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        const program = {\n            start: now() + delay,\n            b\n        };\n        if (!b) {\n            // @ts-ignore todo: improve typings\n            program.group = outros;\n            outros.r += 1;\n        }\n        if (running_program) {\n            pending_program = program;\n        }\n        else {\n            // if this is an intro, and there's a delay, we need to do\n            // an initial tick and/or apply CSS animation immediately\n            if (css) {\n                clear_animation();\n                animation_name = create_rule(node, t, b, duration, delay, easing, css);\n            }\n            if (b)\n                tick(0, 1);\n            running_program = init(program, duration);\n            add_render_callback(() => dispatch(node, b, 'start'));\n            loop(now => {\n                if (pending_program && now > pending_program.start) {\n                    running_program = init(pending_program, duration);\n                    pending_program = null;\n                    dispatch(node, running_program.b, 'start');\n                    if (css) {\n                        clear_animation();\n                        animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n                    }\n                }\n                if (running_program) {\n                    if (now >= running_program.end) {\n                        tick(t = running_program.b, 1 - t);\n                        dispatch(node, running_program.b, 'end');\n                        if (!pending_program) {\n                            // we're done\n                            if (running_program.b) {\n                                // intro — we can tidy up immediately\n                                clear_animation();\n                            }\n                            else {\n                                // outro — needs to be coordinated\n                                if (!--running_program.group.r)\n                                    run_all(running_program.group.c);\n                            }\n                        }\n                        running_program = null;\n                    }\n                    else if (now >= running_program.start) {\n                        const p = now - running_program.start;\n                        t = running_program.a + running_program.d * easing(p / running_program.duration);\n                        tick(t, 1 - t);\n                    }\n                }\n                return !!(running_program || pending_program);\n            });\n        }\n    }\n    return {\n        run(b) {\n            if (is_function(config)) {\n                wait().then(() => {\n                    // @ts-ignore\n                    config = config();\n                    go(b);\n                });\n            }\n            else {\n                go(b);\n            }\n        },\n        end() {\n            clear_animation();\n            running_program = pending_program = null;\n        }\n    };\n}\n\nfunction handle_promise(promise, info) {\n    const token = info.token = {};\n    function update(type, index, key, value) {\n        if (info.token !== token)\n            return;\n        info.resolved = value;\n        let child_ctx = info.ctx;\n        if (key !== undefined) {\n            child_ctx = child_ctx.slice();\n            child_ctx[key] = value;\n        }\n        const block = type && (info.current = type)(child_ctx);\n        let needs_flush = false;\n        if (info.block) {\n            if (info.blocks) {\n                info.blocks.forEach((block, i) => {\n                    if (i !== index && block) {\n                        group_outros();\n                        transition_out(block, 1, 1, () => {\n                            info.blocks[i] = null;\n                        });\n                        check_outros();\n                    }\n                });\n            }\n            else {\n                info.block.d(1);\n            }\n            block.c();\n            transition_in(block, 1);\n            block.m(info.mount(), info.anchor);\n            needs_flush = true;\n        }\n        info.block = block;\n        if (info.blocks)\n            info.blocks[index] = block;\n        if (needs_flush) {\n            flush();\n        }\n    }\n    if (is_promise(promise)) {\n        const current_component = get_current_component();\n        promise.then(value => {\n            set_current_component(current_component);\n            update(info.then, 1, info.value, value);\n            set_current_component(null);\n        }, error => {\n            set_current_component(current_component);\n            update(info.catch, 2, info.error, error);\n            set_current_component(null);\n        });\n        // if we previously had a then/catch block, destroy it\n        if (info.current !== info.pending) {\n            update(info.pending, 0);\n            return true;\n        }\n    }\n    else {\n        if (info.current !== info.then) {\n            update(info.then, 1, info.value, promise);\n            return true;\n        }\n        info.resolved = promise;\n    }\n}\n\nconst globals = (typeof window !== 'undefined'\n    ? window\n    : typeof globalThis !== 'undefined'\n        ? globalThis\n        : global);\n\nfunction destroy_block(block, lookup) {\n    block.d(1);\n    lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n    transition_out(block, 1, 1, () => {\n        lookup.delete(block.key);\n    });\n}\nfunction fix_and_destroy_block(block, lookup) {\n    block.f();\n    destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n    block.f();\n    outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n    let o = old_blocks.length;\n    let n = list.length;\n    let i = o;\n    const old_indexes = {};\n    while (i--)\n        old_indexes[old_blocks[i].key] = i;\n    const new_blocks = [];\n    const new_lookup = new Map();\n    const deltas = new Map();\n    i = n;\n    while (i--) {\n        const child_ctx = get_context(ctx, list, i);\n        const key = get_key(child_ctx);\n        let block = lookup.get(key);\n        if (!block) {\n            block = create_each_block(key, child_ctx);\n            block.c();\n        }\n        else if (dynamic) {\n            block.p(child_ctx, dirty);\n        }\n        new_lookup.set(key, new_blocks[i] = block);\n        if (key in old_indexes)\n            deltas.set(key, Math.abs(i - old_indexes[key]));\n    }\n    const will_move = new Set();\n    const did_move = new Set();\n    function insert(block) {\n        transition_in(block, 1);\n        block.m(node, next);\n        lookup.set(block.key, block);\n        next = block.first;\n        n--;\n    }\n    while (o && n) {\n        const new_block = new_blocks[n - 1];\n        const old_block = old_blocks[o - 1];\n        const new_key = new_block.key;\n        const old_key = old_block.key;\n        if (new_block === old_block) {\n            // do nothing\n            next = new_block.first;\n            o--;\n            n--;\n        }\n        else if (!new_lookup.has(old_key)) {\n            // remove old block\n            destroy(old_block, lookup);\n            o--;\n        }\n        else if (!lookup.has(new_key) || will_move.has(new_key)) {\n            insert(new_block);\n        }\n        else if (did_move.has(old_key)) {\n            o--;\n        }\n        else if (deltas.get(new_key) > deltas.get(old_key)) {\n            did_move.add(new_key);\n            insert(new_block);\n        }\n        else {\n            will_move.add(old_key);\n            o--;\n        }\n    }\n    while (o--) {\n        const old_block = old_blocks[o];\n        if (!new_lookup.has(old_block.key))\n            destroy(old_block, lookup);\n    }\n    while (n)\n        insert(new_blocks[n - 1]);\n    return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n    const keys = new Set();\n    for (let i = 0; i < list.length; i++) {\n        const key = get_key(get_context(ctx, list, i));\n        if (keys.has(key)) {\n            throw new Error(`Cannot have duplicate keys in a keyed each`);\n        }\n        keys.add(key);\n    }\n}\n\nfunction get_spread_update(levels, updates) {\n    const update = {};\n    const to_null_out = {};\n    const accounted_for = { $$scope: 1 };\n    let i = levels.length;\n    while (i--) {\n        const o = levels[i];\n        const n = updates[i];\n        if (n) {\n            for (const key in o) {\n                if (!(key in n))\n                    to_null_out[key] = 1;\n            }\n            for (const key in n) {\n                if (!accounted_for[key]) {\n                    update[key] = n[key];\n                    accounted_for[key] = 1;\n                }\n            }\n            levels[i] = n;\n        }\n        else {\n            for (const key in o) {\n                accounted_for[key] = 1;\n            }\n        }\n    }\n    for (const key in to_null_out) {\n        if (!(key in update))\n            update[key] = undefined;\n    }\n    return update;\n}\nfunction get_spread_object(spread_props) {\n    return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n    'allowfullscreen',\n    'allowpaymentrequest',\n    'async',\n    'autofocus',\n    'autoplay',\n    'checked',\n    'controls',\n    'default',\n    'defer',\n    'disabled',\n    'formnovalidate',\n    'hidden',\n    'ismap',\n    'loop',\n    'multiple',\n    'muted',\n    'nomodule',\n    'novalidate',\n    'open',\n    'playsinline',\n    'readonly',\n    'required',\n    'reversed',\n    'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n    const attributes = Object.assign({}, ...args);\n    if (classes_to_add) {\n        if (attributes.class == null) {\n            attributes.class = classes_to_add;\n        }\n        else {\n            attributes.class += ' ' + classes_to_add;\n        }\n    }\n    let str = '';\n    Object.keys(attributes).forEach(name => {\n        if (invalid_attribute_name_character.test(name))\n            return;\n        const value = attributes[name];\n        if (value === true)\n            str += \" \" + name;\n        else if (boolean_attributes.has(name.toLowerCase())) {\n            if (value)\n                str += \" \" + name;\n        }\n        else if (value != null) {\n            str += ` ${name}=\"${String(value).replace(/\"/g, '&#34;').replace(/'/g, '&#39;')}\"`;\n        }\n    });\n    return str;\n}\nconst escaped = {\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;'\n};\nfunction escape(html) {\n    return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n    let str = '';\n    for (let i = 0; i < items.length; i += 1) {\n        str += fn(items[i], i);\n    }\n    return str;\n}\nconst missing_component = {\n    $$render: () => ''\n};\nfunction validate_component(component, name) {\n    if (!component || !component.$$render) {\n        if (name === 'svelte:component')\n            name += ' this={...}';\n        throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n    }\n    return component;\n}\nfunction debug(file, line, column, values) {\n    console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n    console.log(values); // eslint-disable-line no-console\n    return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n    function $$render(result, props, bindings, slots) {\n        const parent_component = current_component;\n        const $$ = {\n            on_destroy,\n            context: new Map(parent_component ? parent_component.$$.context : []),\n            // these will be immediately discarded\n            on_mount: [],\n            before_update: [],\n            after_update: [],\n            callbacks: blank_object()\n        };\n        set_current_component({ $$ });\n        const html = fn(result, props, bindings, slots);\n        set_current_component(parent_component);\n        return html;\n    }\n    return {\n        render: (props = {}, options = {}) => {\n            on_destroy = [];\n            const result = { title: '', head: '', css: new Set() };\n            const html = $$render(result, props, {}, options);\n            run_all(on_destroy);\n            return {\n                html,\n                css: {\n                    code: Array.from(result.css).map(css => css.code).join('\\n'),\n                    map: null // TODO\n                },\n                head: result.title + result.head\n            };\n        },\n        $$render\n    };\n}\nfunction add_attribute(name, value, boolean) {\n    if (value == null || (boolean && !value))\n        return '';\n    return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n    return classes ? ` class=\"${classes}\"` : ``;\n}\n\nfunction bind(component, name, callback) {\n    const index = component.$$.props[name];\n    if (index !== undefined) {\n        component.$$.bound[index] = callback;\n        callback(component.$$.ctx[index]);\n    }\n}\nfunction create_component(block) {\n    block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n    block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n    const { fragment, on_mount, on_destroy, after_update } = component.$$;\n    fragment && fragment.m(target, anchor);\n    // onMount happens before the initial afterUpdate\n    add_render_callback(() => {\n        const new_on_destroy = on_mount.map(run).filter(is_function);\n        if (on_destroy) {\n            on_destroy.push(...new_on_destroy);\n        }\n        else {\n            // Edge case - component was destroyed immediately,\n            // most likely as a result of a binding initialising\n            run_all(new_on_destroy);\n        }\n        component.$$.on_mount = [];\n    });\n    after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n    const $$ = component.$$;\n    if ($$.fragment !== null) {\n        run_all($$.on_destroy);\n        $$.fragment && $$.fragment.d(detaching);\n        // TODO null out other refs, including component.$$ (but need to\n        // preserve final state?)\n        $$.on_destroy = $$.fragment = null;\n        $$.ctx = [];\n    }\n}\nfunction make_dirty(component, i) {\n    if (component.$$.dirty[0] === -1) {\n        dirty_components.push(component);\n        schedule_update();\n        component.$$.dirty.fill(0);\n    }\n    component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n    const parent_component = current_component;\n    set_current_component(component);\n    const prop_values = options.props || {};\n    const $$ = component.$$ = {\n        fragment: null,\n        ctx: null,\n        // state\n        props,\n        update: noop,\n        not_equal,\n        bound: blank_object(),\n        // lifecycle\n        on_mount: [],\n        on_destroy: [],\n        before_update: [],\n        after_update: [],\n        context: new Map(parent_component ? parent_component.$$.context : []),\n        // everything else\n        callbacks: blank_object(),\n        dirty\n    };\n    let ready = false;\n    $$.ctx = instance\n        ? instance(component, prop_values, (i, ret, ...rest) => {\n            const value = rest.length ? rest[0] : ret;\n            if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n                if ($$.bound[i])\n                    $$.bound[i](value);\n                if (ready)\n                    make_dirty(component, i);\n            }\n            return ret;\n        })\n        : [];\n    $$.update();\n    ready = true;\n    run_all($$.before_update);\n    // `false` as a special case of no DOM component\n    $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n    if (options.target) {\n        if (options.hydrate) {\n            const nodes = children(options.target);\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.l(nodes);\n            nodes.forEach(detach);\n        }\n        else {\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.c();\n        }\n        if (options.intro)\n            transition_in(component.$$.fragment);\n        mount_component(component, options.target, options.anchor);\n        flush();\n    }\n    set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n    SvelteElement = class extends HTMLElement {\n        constructor() {\n            super();\n            this.attachShadow({ mode: 'open' });\n        }\n        connectedCallback() {\n            // @ts-ignore todo: improve typings\n            for (const key in this.$$.slotted) {\n                // @ts-ignore todo: improve typings\n                this.appendChild(this.$$.slotted[key]);\n            }\n        }\n        attributeChangedCallback(attr, _oldValue, newValue) {\n            this[attr] = newValue;\n        }\n        $destroy() {\n            destroy_component(this, 1);\n            this.$destroy = noop;\n        }\n        $on(type, callback) {\n            // TODO should this delegate to addEventListener?\n            const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n            callbacks.push(callback);\n            return () => {\n                const index = callbacks.indexOf(callback);\n                if (index !== -1)\n                    callbacks.splice(index, 1);\n            };\n        }\n        $set() {\n            // overridden by instance, if it has props\n        }\n    };\n}\nclass SvelteComponent {\n    $destroy() {\n        destroy_component(this, 1);\n        this.$destroy = noop;\n    }\n    $on(type, callback) {\n        const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n        callbacks.push(callback);\n        return () => {\n            const index = callbacks.indexOf(callback);\n            if (index !== -1)\n                callbacks.splice(index, 1);\n        };\n    }\n    $set() {\n        // overridden by instance, if it has props\n    }\n}\n\nfunction dispatch_dev(type, detail) {\n    document.dispatchEvent(custom_event(type, Object.assign({ version: '3.23.0' }, detail)));\n}\nfunction append_dev(target, node) {\n    dispatch_dev(\"SvelteDOMInsert\", { target, node });\n    append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n    dispatch_dev(\"SvelteDOMInsert\", { target, node, anchor });\n    insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n    dispatch_dev(\"SvelteDOMRemove\", { node });\n    detach(node);\n}\nfunction detach_between_dev(before, after) {\n    while (before.nextSibling && before.nextSibling !== after) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction detach_before_dev(after) {\n    while (after.previousSibling) {\n        detach_dev(after.previousSibling);\n    }\n}\nfunction detach_after_dev(before) {\n    while (before.nextSibling) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n    const modifiers = options === true ? [\"capture\"] : options ? Array.from(Object.keys(options)) : [];\n    if (has_prevent_default)\n        modifiers.push('preventDefault');\n    if (has_stop_propagation)\n        modifiers.push('stopPropagation');\n    dispatch_dev(\"SvelteDOMAddEventListener\", { node, event, handler, modifiers });\n    const dispose = listen(node, event, handler, options);\n    return () => {\n        dispatch_dev(\"SvelteDOMRemoveEventListener\", { node, event, handler, modifiers });\n        dispose();\n    };\n}\nfunction attr_dev(node, attribute, value) {\n    attr(node, attribute, value);\n    if (value == null)\n        dispatch_dev(\"SvelteDOMRemoveAttribute\", { node, attribute });\n    else\n        dispatch_dev(\"SvelteDOMSetAttribute\", { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n    node[property] = value;\n    dispatch_dev(\"SvelteDOMSetProperty\", { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n    node.dataset[property] = value;\n    dispatch_dev(\"SvelteDOMSetDataset\", { node, property, value });\n}\nfunction set_data_dev(text, data) {\n    data = '' + data;\n    if (text.data === data)\n        return;\n    dispatch_dev(\"SvelteDOMSetData\", { node: text, data });\n    text.data = data;\n}\nfunction validate_each_argument(arg) {\n    if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n        let msg = '{#each} only iterates over array-like objects.';\n        if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n            msg += ' You can use a spread to convert this iterable into an array.';\n        }\n        throw new Error(msg);\n    }\n}\nfunction validate_slots(name, slot, keys) {\n    for (const slot_key of Object.keys(slot)) {\n        if (!~keys.indexOf(slot_key)) {\n            console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n        }\n    }\n}\nclass SvelteComponentDev extends SvelteComponent {\n    constructor(options) {\n        if (!options || (!options.target && !options.$$inline)) {\n            throw new Error(`'target' is a required option`);\n        }\n        super();\n    }\n    $destroy() {\n        super.$destroy();\n        this.$destroy = () => {\n            console.warn(`Component was already destroyed`); // eslint-disable-line no-console\n        };\n    }\n    $capture_state() { }\n    $inject_state() { }\n}\nfunction loop_guard(timeout) {\n    const start = Date.now();\n    return () => {\n        if (Date.now() - start > timeout) {\n            throw new Error(`Infinite loop detected`);\n        }\n    };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, update_slot, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal';\nexport { get_store_value as get } from '../internal';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier}start start and stop notifications for subscriptions\n */\nfunction readable(value, start) {\n    return {\n        subscribe: writable(value, start).subscribe,\n    };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=}start start and stop notifications for subscriptions\n */\nfunction writable(value, start = noop) {\n    let stop;\n    const subscribers = [];\n    function set(new_value) {\n        if (safe_not_equal(value, new_value)) {\n            value = new_value;\n            if (stop) { // store is ready\n                const run_queue = !subscriber_queue.length;\n                for (let i = 0; i < subscribers.length; i += 1) {\n                    const s = subscribers[i];\n                    s[1]();\n                    subscriber_queue.push(s, value);\n                }\n                if (run_queue) {\n                    for (let i = 0; i < subscriber_queue.length; i += 2) {\n                        subscriber_queue[i][0](subscriber_queue[i + 1]);\n                    }\n                    subscriber_queue.length = 0;\n                }\n            }\n        }\n    }\n    function update(fn) {\n        set(fn(value));\n    }\n    function subscribe(run, invalidate = noop) {\n        const subscriber = [run, invalidate];\n        subscribers.push(subscriber);\n        if (subscribers.length === 1) {\n            stop = start(set) || noop;\n        }\n        run(value);\n        return () => {\n            const index = subscribers.indexOf(subscriber);\n            if (index !== -1) {\n                subscribers.splice(index, 1);\n            }\n            if (subscribers.length === 0) {\n                stop();\n                stop = null;\n            }\n        };\n    }\n    return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n    const single = !Array.isArray(stores);\n    const stores_array = single\n        ? [stores]\n        : stores;\n    const auto = fn.length < 2;\n    return readable(initial_value, (set) => {\n        let inited = false;\n        const values = [];\n        let pending = 0;\n        let cleanup = noop;\n        const sync = () => {\n            if (pending) {\n                return;\n            }\n            cleanup();\n            const result = fn(single ? values[0] : values, set);\n            if (auto) {\n                set(result);\n            }\n            else {\n                cleanup = is_function(result) ? result : noop;\n            }\n        };\n        const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n            values[i] = value;\n            pending &= ~(1 << i);\n            if (inited) {\n                sync();\n            }\n        }, () => {\n            pending |= (1 << i);\n        }));\n        inited = true;\n        sync();\n        return function stop() {\n            run_all(unsubscribers);\n            cleanup();\n        };\n    });\n}\n\nexport { derived, readable, writable };\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { writable, Readable, derived } from 'svelte/store';\r\nimport { SvelteTask } from './task';\r\nimport { SvelteRow } from './row';\r\nimport { SvelteTimeRange } from './timeRange';\r\n\r\ninterface EntityState<T> {\r\n    ids: number[],\r\n    entities: { [key: number]: T }\r\n}\r\n\r\ninterface EntityType {\r\n    model: { id: number }\r\n}\r\n\r\nexport interface EntityStore<T extends EntityType> extends Readable<EntityState<T>> {\r\n    _update(updater: (value: EntityState<T>) => EntityState<T>): void;\r\n    add(entity: T): void;\r\n    addAll(entities: T[]): void;\r\n    update(entity: T): void;\r\n    upsert(entity: T): void;\r\n    upsertAll(entities: T[]): void;\r\n    delete(id: number): void;\r\n    deleteAll(ids: number[]): void;\r\n    refresh(): void;\r\n    set(value: EntityState<T>): void;\r\n}\r\n\r\nfunction createEntityStore<T extends EntityType>(): EntityStore<T> {\r\n    const { subscribe, set, update } = writable<EntityState<T>>({ ids: [], entities: {} });\r\n\r\n    return {\r\n        set,\r\n        _update: update,\r\n        subscribe,\r\n        add: (item: T) => update(({ ids, entities }) => ({\r\n            ids: [...ids, item.model.id],\r\n            entities: {\r\n                ...entities,\r\n                [item.model.id]: item\r\n            }\r\n        })),\r\n        delete: (id: number) => update(state => {\r\n            const { [id]: _, ...entities } = state.entities;\r\n            return {\r\n                ids: state.ids.filter(i => i !== id),\r\n                entities\r\n            };\r\n        }),\r\n        deleteAll: (ids: number[]) => update(state => {\r\n            const entities = { ...state.entities };\r\n            const idState = {};\r\n\r\n            ids.forEach(id => {\r\n                delete entities[id];\r\n                idState[id] = true;\r\n            });\r\n\r\n            return {\r\n                ids: state.ids.filter(i => !idState[i]),\r\n                entities\r\n            };\r\n        }),\r\n        update: (item: T) => update(({ ids, entities }) => ({\r\n            ids,\r\n            entities: {\r\n                ...entities,\r\n                [item.model.id]: item\r\n            }\r\n        })),\r\n        upsert: (item: T) => update(({ ids, entities }) => {\r\n            const hasIndex = ids.indexOf(item.model.id) !== -1;\r\n\r\n            return {\r\n                ids: hasIndex ? ids : [...ids, item.model.id],\r\n                entities: {\r\n                    ...entities,\r\n                    [item.model.id]: item\r\n                }\r\n            }\r\n        }),\r\n        upsertAll: (items: T[]) => update(state => {\r\n            const entities = { ...state.entities };\r\n            const ids = [...state.ids];\r\n\r\n            items.forEach(item => {\r\n                if (!entities[item.model.id]) {\r\n                    ids.push(item.model.id);\r\n                }\r\n                entities[item.model.id] = item;\r\n            });\r\n\r\n            return {\r\n                ids,\r\n                entities\r\n            };\r\n        }),\r\n        addAll: (items: T[]) => {\r\n            const ids = [];\r\n            const entities = {};\r\n\r\n            for (const entity of items) {\r\n                ids.push(entity.model.id);\r\n                entities[entity.model.id] = entity;\r\n            }\r\n\r\n            set({ ids, entities });\r\n        },\r\n        refresh: () => update(store => ({ ...store }))\r\n    };\r\n}\r\n\r\nexport const taskStore = createEntityStore<SvelteTask>();\r\nexport const rowStore = createEntityStore<SvelteRow>();\r\nexport const timeRangeStore = createEntityStore<SvelteTimeRange>();\r\n\r\nexport const allTasks = all(taskStore);\r\nexport const allRows = all(rowStore);\r\nexport const allTimeRanges = all(timeRangeStore);\r\n\r\nexport const rowTaskCache = derived(allTasks, $allTasks => {\r\n    return $allTasks.reduce((cache, task) => {\r\n        if (!cache[task.model.resourceId])\r\n            cache[task.model.resourceId] = [];\r\n        cache[task.model.resourceId].push(task.model.id);\r\n        return cache;\r\n    }, {});\r\n});\r\n\r\n\r\nexport function all<T extends EntityType>(store: EntityStore<T>): Readable<T[]> {\r\n    return derived(store, ({ ids, entities }) => ids.map(id => entities[id]));\r\n}\r\n\r\nexport function where<T extends EntityType>(store: EntityStore<T>, filterFn: (value: T) => any): Readable<T[]> {\r\n    return derived(store, ({ ids, entities }) => {\r\n        const result = [];\r\n        for(const id of ids) {\r\n            const entity = entities[id];\r\n            if(filterFn(entity)) {\r\n                result.push(entity);\r\n            }\r\n        }\r\n        return result;\r\n    });\r\n}\r\n","export function isLeftClick(event) {\r\n    return event.which === 1;\r\n}\r\n\r\n/**\r\n * Gets mouse position within an element\r\n * @param node \r\n * @param event \r\n */\r\nexport function getRelativePos(node: HTMLElement, event: MouseEvent) {\r\n    const rect = node.getBoundingClientRect();\r\n    const x = event.clientX - rect.left; //x position within the element.\r\n    const y = event.clientY - rect.top;  //y position within the element.\r\n    return {\r\n        x: x,\r\n        y: y\r\n    }\r\n}\r\n\r\n/**\r\n * Adds an event listener that triggers once.\r\n * @param target \r\n * @param type \r\n * @param listener \r\n * @param addOptions \r\n * @param removeOptions \r\n */\r\nexport function addEventListenerOnce(target: HTMLElement | Window, type: string, listener, addOptions?, removeOptions?) {\r\n    target.addEventListener(type, function fn(event) {\r\n        target.removeEventListener(type, fn, removeOptions);\r\n        listener.apply(this, arguments, addOptions);\r\n    });\r\n}\r\n\r\n/**\r\n * Sets the cursor on an element. Globally by default.\r\n * @param cursor \r\n * @param node \r\n */\r\nexport function setCursor(cursor: string, node: HTMLElement = document.body) {\r\n    node.style.cursor = cursor;\r\n}\r\n\r\nexport function sortFn(prop: (element: any) => any) {\r\n    return function (a, b) {\r\n        if (prop(a) < prop(b)) {\r\n            return -1;\r\n        } else if (prop(a) > prop(b)) {\r\n            return 1;\r\n        }\r\n        return 0;\r\n    }\r\n}\r\n\r\nexport function debounce(func, wait, immediate) {\r\n    var timeout;\r\n    return function () {\r\n        var context = this, args = arguments;\r\n        var later = function () {\r\n            timeout = null;\r\n            if (!immediate) func.apply(context, args);\r\n        };\r\n        var callNow = immediate && !timeout;\r\n        clearTimeout(timeout);\r\n        timeout = setTimeout(later, wait);\r\n        if (callNow) func.apply(context, args);\r\n    };\r\n};\r\n\r\nexport function throttle(func, limit) {\r\n    var wait = false;\r\n    return function () {\r\n        if (!wait) {\r\n\r\n            func.apply(null, arguments);\r\n            wait = true;\r\n            setTimeout(function () {\r\n                wait = false;\r\n            }, limit);\r\n        }\r\n    }\r\n}","export const V_SCROLLBAR_WIDTH = 17;\r\nexport const H_SCROLLBAR_WIDTH = 17;\r\nexport const MIN_DRAG_X = 2;\r\nexport const MIN_DRAG_Y = 2;","import { isLeftClick, addEventListenerOnce, getRelativePos } from '../../utils/domUtils';\r\nimport { MIN_DRAG_Y, MIN_DRAG_X } from '../constants';\r\n\r\nexport interface DraggableSettings {\r\n    onDown?(event?: DownDropEvent): void; \r\n    onResize?(event?: ResizeEvent): void;\r\n    onDrag?(event?: DragEvent): void;\r\n    onMouseUp?(): void;\r\n    onDrop(event?: DownDropEvent): void; \r\n    dragAllowed: (() => boolean) | boolean;\r\n    resizeAllowed: (() => boolean) | boolean;\r\n    container: any; \r\n    resizeHandleWidth?: any;\r\n    getX?: (event?: MouseEvent) => number;\r\n    getY?: (event?: MouseEvent) => number;\r\n    getWidth?: () => number;\r\n}\r\n\r\nexport interface DownDropEvent {\r\n    mouseEvent: MouseEvent;\r\n    x: number;\r\n    y: number;\r\n    width: number;\r\n    resizing: boolean;\r\n    dragging: boolean;\r\n}\r\n\r\nexport interface DragEvent {\r\n    mouseEvent: MouseEvent;\r\n    x: number;\r\n    y: number;\r\n}\r\n\r\nexport interface ResizeEvent {\r\n    mouseEvent: MouseEvent;\r\n    x: number;\r\n    width: number;\r\n}\r\n\r\n/**\r\n * Applies dragging interaction to gantt elements\r\n */\r\nexport class Draggable {\r\n    mouseStartPosX: number;\r\n    mouseStartPosY: number;\r\n    mouseStartRight: number;\r\n    direction: 'left' | 'right';\r\n    dragging = false;\r\n    resizing = false;\r\n    \r\n    initialX: number;\r\n    initialY: number;\r\n    initialW: number;\r\n    resizeTriggered = false;\r\n\r\n    settings: DraggableSettings;\r\n    node: HTMLElement;\r\n    \r\n    constructor(node: HTMLElement, settings: DraggableSettings) {\r\n        this.settings = settings;\r\n        this.node = node;\r\n\r\n        node.addEventListener('mousedown', this.onmousedown, false);\r\n    }\r\n\r\n    get dragAllowed() {\r\n        if(typeof(this.settings.dragAllowed) === 'function') {\r\n            return this.settings.dragAllowed();\r\n        } else {\r\n            return this.settings.dragAllowed;\r\n        }\r\n    }\r\n\r\n    get resizeAllowed() {\r\n        if(typeof(this.settings.resizeAllowed) === 'function') {\r\n            return this.settings.resizeAllowed();\r\n        } else {\r\n            return this.settings.resizeAllowed;\r\n        }\r\n    }\r\n\r\n    onmousedown = (event: MouseEvent) => {\r\n        if(!isLeftClick(event)){\r\n            return;\r\n        }\r\n\r\n        event.stopPropagation();\r\n        event.preventDefault();\r\n        \r\n        const canDrag = this.dragAllowed;\r\n        const canResize = this.resizeAllowed;\r\n        if(canDrag || canResize){\r\n            const x = this.settings.getX(event);\r\n            const y = this.settings.getY(event);\r\n            const width = this.settings.getWidth();\r\n\r\n            this.initialX = event.clientX;\r\n            this.initialY = event.clientY;\r\n\r\n\r\n            this.mouseStartPosX = getRelativePos(this.settings.container, event).x - x;\r\n            this.mouseStartPosY = getRelativePos(this.settings.container, event).y - y;\r\n            this.mouseStartRight = x + width;\r\n\r\n\r\n            if(canResize && this.mouseStartPosX < this.settings.resizeHandleWidth) {\r\n                this.direction = 'left';\r\n                this.resizing = true;\r\n            }\r\n            \r\n            if(canResize && this.mouseStartPosX > width - this.settings.resizeHandleWidth) {\r\n                this.direction = 'right';\r\n                this.resizing = true;\r\n            }\r\n            \r\n            if(canDrag && !this.resizing) {\r\n                this.dragging = true;\r\n            }\r\n\r\n            if((this.dragging || this.resizing) && this.settings.onDown) {\r\n                this.settings.onDown({\r\n                    mouseEvent: event,\r\n                    x,\r\n                    width,\r\n                    y,\r\n                    resizing: this.resizing,\r\n                    dragging: this.dragging\r\n                });\r\n            }\r\n\r\n            window.addEventListener('mousemove', this.onmousemove, false);\r\n            addEventListenerOnce(window, 'mouseup', this.onmouseup);\r\n        }\r\n    }\r\n    \r\n    onmousemove = (event: MouseEvent) => {\r\n        if(!this.resizeTriggered){\r\n            if(Math.abs(event.clientX - this.initialX) > MIN_DRAG_X || Math.abs(event.clientY - this.initialY) > MIN_DRAG_Y){\r\n                this.resizeTriggered = true;\r\n            }else{\r\n                return;\r\n            }\r\n        }\r\n\r\n        event.preventDefault();\r\n        if(this.resizing) {\r\n            const mousePos = getRelativePos(this.settings.container, event);\r\n            const x = this.settings.getX(event);\r\n            const width = this.settings.getWidth();\r\n\r\n            let resultX: number;\r\n            let resultWidth: number;\r\n\r\n            if(this.direction === 'left') { //resize ulijevo\r\n                if(mousePos.x > x + width) {\r\n                    this.direction = 'right';\r\n                    resultX = this.mouseStartRight;\r\n                    resultWidth = this.mouseStartRight - mousePos.x;\r\n                    this.mouseStartRight = this.mouseStartRight + width;\r\n                }\r\n                else{\r\n                    resultX = mousePos.x;\r\n                    resultWidth = this.mouseStartRight - mousePos.x;\r\n                }\r\n            }\r\n            else if(this.direction === 'right') {//resize desno\r\n                if(mousePos.x <= x) {\r\n                    this.direction = 'left';\r\n                    resultX = mousePos.x;\r\n                    resultWidth = x - mousePos.x;\r\n                    this.mouseStartRight = x;\r\n                }\r\n                else {\r\n                    resultX = x;\r\n                    resultWidth = mousePos.x - x;\r\n                }\r\n            }\r\n            \r\n            this.settings.onResize && this.settings.onResize({\r\n                mouseEvent: event,\r\n                x: resultX,\r\n                width: resultWidth\r\n            });\r\n        }\r\n\r\n        // mouseup\r\n        if(this.dragging && this.settings.onDrag) {\r\n            const mousePos = getRelativePos(this.settings.container, event);\r\n            this.settings.onDrag({\r\n                mouseEvent: event,\r\n                x: mousePos.x - this.mouseStartPosX,\r\n                y: mousePos.y - this.mouseStartPosY\r\n            });\r\n        }\r\n    }\r\n\r\n    onmouseup = (event: MouseEvent) => {\r\n        const x = this.settings.getX(event);\r\n        const y = this.settings.getY(event);\r\n        const width = this.settings.getWidth();\r\n        \r\n        this.settings.onMouseUp && this.settings.onMouseUp();\r\n\r\n        if(this.resizeTriggered && this.settings.onDrop){\r\n            this.settings.onDrop({\r\n                mouseEvent: event,\r\n                x, \r\n                y,\r\n                width,\r\n                dragging: this.dragging,\r\n                resizing: this.resizing\r\n            });\r\n        }\r\n\r\n        this.dragging = false;\r\n        this.resizing = false;\r\n        this.direction = null;\r\n        this.resizeTriggered = false;\r\n\r\n        window.removeEventListener('mousemove', this.onmousemove, false);\r\n    }\r\n    \r\n    destroy() {\r\n        this.node.removeEventListener('mousedown', this.onmousedown, false);\r\n        this.node.removeEventListener('mousemove', this.onmousemove, false);\r\n        this.node.removeEventListener('mouseup', this.onmouseup, false);\r\n    }\r\n}","import { SvelteRow } from '../row';\r\nimport { Writable, get } from 'svelte/store';\r\nimport { EntityStore } from '../store';\r\n\r\nexport type DropHandler = (event: MouseEvent) => any;\r\n\r\nexport class DragDropManager\r\n{\r\n    handlerMap: {[key:string]: DropHandler} = {};\r\n\r\n    constructor(rowStore: Writable<EntityStore<SvelteRow>>) {\r\n        this.register('row', (event) => {\r\n            let elements = document.elementsFromPoint(event.clientX, event.clientY);\r\n            let rowElement = elements.find((element) => !!element.getAttribute('data-row-id'));\r\n            if(rowElement !== undefined) {\r\n                const rowId = parseInt(rowElement.getAttribute('data-row-id'));\r\n                const { entities } = get(rowStore);\r\n                const targetRow = entities[rowId];\r\n\r\n                if(targetRow.model.enableDragging){\r\n                    return targetRow;\r\n                }\r\n            }\r\n            return null;\r\n        });\r\n    }\r\n\r\n    register(target: string, handler: DropHandler) {\r\n        this.handlerMap[target] = handler;\r\n    }\r\n\r\n    getTarget(target: string, event: MouseEvent): SvelteRow {\r\n        //const rowCenterX = this.root.refs.mainContainer.getBoundingClientRect().left + this.root.refs.mainContainer.getBoundingClientRect().width / 2;\r\n        var handler = this.handlerMap[target];\r\n        if(handler){\r\n            return handler(event);\r\n        }\r\n    }\r\n}","import { SvelteRow } from './row';\r\nimport { ColumnService } from './column';\r\n\r\nexport interface TaskModel {\r\n    id: number; // | string;\r\n    resourceId: number; // | string\r\n    from: any; // moment\r\n    to: any; // moment\r\n\r\n    amountDone?: number;\r\n    classes?: string | string[];\r\n    label?: string;\r\n    html?: string;\r\n    showButton?: boolean;\r\n    buttonClasses?: string | string[];\r\n    buttonHtml?: string;\r\n    enableDragging?: boolean;\r\n}\r\n\r\nexport interface SvelteTask {\r\n    model: TaskModel;\r\n\r\n    left: number;\r\n    top: number;\r\n    width: number;\r\n\r\n    height: number;\r\n    reflections?: string[];\r\n}\r\n\r\nexport class TaskFactory {\r\n    columnService: ColumnService;\r\n    \r\n    rowPadding: number;\r\n    rowEntities: {[key:number]: SvelteRow}\r\n\r\n    constructor(columnService: ColumnService) {\r\n\t\tthis.columnService = columnService;\r\n    }\r\n    \r\n    createTask(model: TaskModel): SvelteTask {\r\n        \r\n        // id of task, every task needs to have a unique one\r\n        //task.id = task.id || undefined;\r\n        // completion %, indicated on task\r\n        model.amountDone = model.amountDone || 0;\r\n        // css classes\r\n        model.classes = model.classes || '';\r\n        // datetime task starts on, currently moment-js object\r\n        model.from = model.from || null;\r\n        // datetime task ends on, currently moment-js object\r\n        model.to = model.to || null;\r\n        // label of task\r\n        model.label = model.label || undefined;\r\n        // html content of task, will override label\r\n        model.html = model.html || undefined;\r\n        // show button bar\r\n        model.showButton = model.showButton || false \r\n        // button classes, useful for fontawesome icons\r\n        model.buttonClasses = model.buttonClasses || ''\r\n        // html content of button\r\n        model.buttonHtml = model.buttonHtml || ''\r\n        // enable dragging of task\r\n        model.enableDragging = model.enableDragging === undefined ? true : model.enableDragging;\r\n        \r\n        const left = this.columnService.getPositionByDate(model.from) | 0;\r\n        const right = this.columnService.getPositionByDate(model.to) | 0; \r\n\r\n        return {\r\n            model,\r\n            left: left,\r\n            width: right-left,\r\n            height: this.getHeight(model),\r\n            top: this.getPosY(model),\r\n            reflections: []\r\n        }\r\n    }\r\n\r\n    createTasks(tasks: TaskModel[]) {\r\n        return tasks.map(task => this.createTask(task));\r\n    }\r\n\r\n    row(resourceId): SvelteRow{\r\n        return this.rowEntities[resourceId];\r\n    }\r\n\r\n    getHeight(model){\r\n        return this.row(model.resourceId).height - 2 * this.rowPadding;\r\n    }\r\n\r\n    getPosY(model){\r\n        return this.row(model.resourceId).y + this.rowPadding;\r\n    }\r\n}\r\n\r\nfunction overlap(one: SvelteTask, other: SvelteTask){\r\n    return !(one.left + one.width <= other.left || one.left >= other.left + other.width);\r\n}\r\n\r\nexport function reflectTask(task: SvelteTask, row: SvelteRow, options: { rowPadding: number }) {\r\n    const reflectedId = `reflected-task-${task.model.id}-${row.model.id}`;\r\n\r\n    const model = {\r\n        ...task.model,\r\n        resourceId: row.model.id,\r\n        id: reflectedId,\r\n        enableDragging: false\r\n    };\r\n\r\n    return {\r\n        ...task,\r\n        model,\r\n        top: row.y + options.rowPadding,\r\n        reflected: true,\r\n        reflectedOnParent: false,\r\n        reflectedOnChild: true,\r\n        originalId: task.model.id\r\n    };\r\n}","<script>\r\n    import { beforeUpdate, afterUpdate, getContext, onMount, onDestroy, tick } from \"svelte\";\r\n\r\n    import { setCursor } from \"src/utils/domUtils\";\r\n    import { taskStore, rowStore } from '../core/store';\r\n    import { Draggable } from \"../core/drag\";\r\n    import { reflectTask } from \"src/core/task\";\r\n\r\n    export let model;\r\n    export let height;\r\n    export let left;\r\n    export let top;\r\n    export let width;\r\n    export let reflected = false;\r\n\r\n    let animating = true;\r\n\r\n    let _dragging = false;\r\n    let _resizing = false;\r\n\r\n    let _position = {\r\n        x: left,\r\n        y: top,\r\n        width: width,\r\n    }\r\n\r\n    $: updatePosition(left, top, width);\r\n    function updatePosition(x, y, width) {\r\n        if(!_dragging && !_resizing) {\r\n            _position.x = x;\r\n            _position.y = y;//row.y + 6;\r\n            _position.width = width;\r\n            // should NOT animate on resize/update of columns\r\n        }\r\n    }\r\n\r\n    const { dimensionsChanged } = getContext('dimensions');\r\n    const { rowContainer } = getContext('gantt');\r\n    const { taskContent, resizeHandleWidth, rowPadding, onTaskButtonClick, reflectOnParentRows, reflectOnChildRows } = getContext('options');\r\n    const { dndManager, api, utils, selectionManager, columnService } = getContext('services');\r\n\r\n    function drag(node) {\r\n        const ondrop = (event) => {\r\n            let rowChangeValid = true;\r\n            //row switching\r\n            const sourceRow = $rowStore.entities[model.resourceId];\r\n            if (event.dragging) {\r\n                const targetRow = dndManager.getTarget(\"row\", event.mouseEvent);\r\n                if (targetRow) {\r\n                    model.resourceId = targetRow.model.id;\r\n                    api.tasks.raise.switchRow(this, targetRow, sourceRow);\r\n                } else {\r\n                    rowChangeValid = false;\r\n                }\r\n            }\r\n\r\n            _dragging = _resizing = false;\r\n\r\n            const task = $taskStore.entities[model.id];\r\n\r\n            if (rowChangeValid) {\r\n                const prevFrom = model.from;\r\n                const prevTo = model.to;\r\n                const newFrom = model.from = utils.roundTo(columnService.getDateByPosition(event.x));\r\n                const newTo = model.to = utils.roundTo(columnService.getDateByPosition(event.x + event.width));\r\n                const newLeft = columnService.getPositionByDate(newFrom) | 0;\r\n                const newRight = columnService.getPositionByDate(newTo) | 0;\r\n\r\n                const targetRow = $rowStore.entities[model.resourceId];\r\n                const left = newLeft;\r\n                const width = newRight - newLeft;\r\n                const top = $rowPadding + targetRow.y;\r\n                \r\n                updatePosition(left, top, width);\r\n\r\n                const newTask = {\r\n                    ...task,\r\n                    left: left,\r\n                    width: width,\r\n                    top: top,\r\n                    model\r\n                }\r\n\r\n                const changed = !prevFrom.isSame(newFrom) || !prevTo.isSame(newTo) || (sourceRow && sourceRow.model.id !== targetRow.model.id);\r\n                if(changed) {\r\n                    api.tasks.raise.change({ task: newTask, sourceRow, targetRow });\r\n                }\r\n\r\n                taskStore.update(newTask);\r\n\r\n                if(changed) {\r\n                    api.tasks.raise.changed({ task: newTask, sourceRow, targetRow });\r\n                }\r\n\r\n                // update shadow tasks\r\n                if(newTask.reflections) {\r\n                    taskStore.deleteAll(newTask.reflections);\r\n                }\r\n\r\n                const reflectedTasks = [];\r\n                if(reflectOnChildRows && targetRow.allChildren) {\r\n                    if(!newTask.reflections)\r\n                        newTask.reflections = [];\r\n\r\n                    const opts = { rowPadding: $rowPadding };\r\n                    targetRow.allChildren.forEach(r => {\r\n                        const reflectedTask = reflectTask(newTask, r, opts);\r\n                        newTask.reflections.push(reflectedTask.model.id);\r\n                        reflectedTasks.push(reflectedTask);\r\n                    });\r\n                }\r\n\r\n                if(reflectOnParentRows && targetRow.allParents.length > 0) {\r\n                    if(!newTask.reflections)\r\n                        newTask.reflections = [];\r\n\r\n                    const opts = { rowPadding: $rowPadding };\r\n                    targetRow.allParents.forEach(r => {\r\n                        const reflectedTask = reflectTask(newTask, r, opts);\r\n                        newTask.reflections.push(reflectedTask.model.id);\r\n                        reflectedTasks.push(reflectedTask);\r\n                    });\r\n                }\r\n\r\n                if(reflectedTasks.length > 0) {\r\n                    taskStore.upsertAll(reflectedTasks);\r\n                }\r\n\r\n                if(!(targetRow.allParents.length > 0) && !targetRow.allChildren) {\r\n                    newTask.reflections = null;\r\n                }\r\n            }\r\n            else {\r\n                // reset position\r\n                (_position.x = task.left), (_position.width = task.width), (_position.y = task.top);\r\n            }\r\n        };\r\n\r\n        const draggable = new Draggable(node, {\r\n            onDown: (event) => {\r\n                if (event.dragging) {\r\n                    setCursor(\"move\");\r\n                }\r\n                if (event.resizing) {\r\n                    setCursor(\"e-resize\");\r\n                }\r\n            },\r\n            onMouseUp: () => {\r\n                setCursor(\"default\");\r\n            },\r\n            onResize: (event) => {\r\n                (_position.x = event.x), (_position.width = event.width), (_resizing = true);\r\n            },\r\n            onDrag: (event) => {\r\n                (_position.x = event.x), (_position.y = event.y), (_dragging = true);\r\n            },\r\n            dragAllowed: () => {\r\n                return row.model.enableDragging && model.enableDragging;\r\n            },\r\n            resizeAllowed: () => {\r\n                return row.model.enableDragging && model.enableDragging;\r\n            },\r\n            onDrop: ondrop,\r\n            container: rowContainer,\r\n            resizeHandleWidth, \r\n            getX: () => _position.x,\r\n            getY: () => _position.y,\r\n            getWidth: () => _position.width\r\n        });\r\n        return {\r\n            destroy: () => draggable.destroy()\r\n        };\r\n    }\r\n\r\n    export function onclick(event) {\r\n        if (onTaskButtonClick) {\r\n            onTaskButtonClick(task);\r\n        }\r\n    }\r\n\r\n    let selection = selectionManager.selection;\r\n    let selected = false;\r\n    $: selected = $selection.indexOf(model.id) !== -1;\r\n\r\n    let row;\r\n    $: row = $rowStore.entities[model.resourceId];\r\n</script>\r\n\r\n<style>\r\n  .sg-label-bottom {\r\n    position: absolute;\r\n    top: calc(100% + 10px);\r\n    color: #888;\r\n  }\r\n\r\n  .debug {\r\n    position: absolute;\r\n    top: -10px;\r\n    right: 0;\r\n    font-size: 8px;\r\n    color: black;\r\n  }\r\n\r\n  .sg-task {\r\n    position: absolute;\r\n\r\n    white-space: nowrap;\r\n    /* overflow: hidden; */\r\n\r\n    transition: background-color 0.2s, opacity 0.2s;\r\n    pointer-events: all;\r\n  }\r\n\r\n  .sg-task-background {\r\n    position: absolute;\r\n    height: 100%;\r\n    top: 0;\r\n  }\r\n\r\n  .sg-task-content {\r\n    position: absolute;\r\n    height: 100%;\r\n    top: 0;\r\n\r\n    padding-left: 14px;\r\n    font-size: 14px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: flex-start;\r\n  }\r\n\r\n  .sg-task:not(.moving) {\r\n    transition: transform 0.2s, background-color 0.2s, width 0.2s;\r\n  }\r\n\r\n  .sg-task.moving {\r\n    z-index: 1;\r\n  }\r\n\r\n  .sg-task:hover::before {\r\n    content: \"\";\r\n    width: 4px;\r\n    height: 50%;\r\n    top: 25%;\r\n    position: absolute;\r\n    cursor: ew-resize;\r\n    border-style: solid;\r\n    border-color: rgba(255, 255, 255, 0.5);\r\n\r\n    margin-left: 3px;\r\n    left: 0;\r\n    border-width: 0 1px;\r\n    z-index: 1;\r\n  }\r\n\r\n  .sg-task:hover::after {\r\n    content: \"\";\r\n    width: 4px;\r\n    height: 50%;\r\n    top: 25%;\r\n    position: absolute;\r\n    cursor: ew-resize;\r\n    border-style: solid;\r\n    border-color: rgba(255, 255, 255, 0.5);\r\n\r\n    margin-right: 3px;\r\n    right: 0;\r\n    border-width: 0 1px;\r\n    z-index: 1;\r\n  }\r\n\r\n  .sg-task.selected {\r\n    outline: 2px solid rgba(3, 169, 244, 0.5);\r\n    outline-offset: 3px;\r\n    z-index: 1;\r\n  }\r\n\r\n  .sg-task-reflected {\r\n      opacity: 0.5;\r\n  }\r\n</style>\r\n\r\n<div\r\n  data-task-id=\"{model.id}\"\r\n  use:drag\r\n  class=\"sg-task {model.classes}\"\r\n  style=\"width:{_position.width}px; height:{height}px; transform: translate({_position.x}px, {_position.y}px);\"\r\n  class:moving={_dragging || _resizing}\r\n  class:selected\r\n  class:animating\r\n  class:sg-task-reflected={reflected}>\r\n  {#if model.amountDone}\r\n  <div class=\"sg-task-background\" style=\"width:{model.amountDone}%\" />\r\n  {/if}\r\n  <div class=\"sg-task-content\">\r\n    {#if model.html}\r\n      {@html model.html}\r\n    {:else if taskContent}\r\n      {@html taskContent(model)}\r\n    {:else}{model.label}{/if}\r\n    <!-- <span class=\"debug\">x:{_position.x} y:{_position.y}, x:{left} y:{top}</span> -->\r\n    {#if model.showButton}\r\n      <span class=\"sg-task-button {model.buttonClasses}\" on:click={onclick}>\r\n        {@html model.buttonHtml}\r\n      </span>\r\n    {/if}\r\n  </div>\r\n\r\n  {#if model.labelBottom}\r\n    <label class=\"sg-label-bottom\">{model.labelBottom}</label>\r\n  {/if}\r\n</div>\r\n","<script>\r\n    import { getContext } from 'svelte';\r\n    export let row;\r\n    let rowElement;\r\n\r\n    const { rowHeight } = getContext('options');\r\n    const { hoveredRow, selectedRow } = getContext('gantt');\r\n</script>\r\n\r\n<div class=\"sg-row {row.model.classes}\" data-row-id=\"{row.model.id}\" class:sg-hover={$hoveredRow == row.model.id} class:sg-selected={$selectedRow == row.model.id} bind:this={rowElement} style=\"height:{$rowHeight}px\">\r\n    {#if row.model.contentHtml}\r\n        {@html row.model.contentHtml}\r\n    {/if}\r\n</div>    \r\n<style>\r\n    .sg-row {\r\n        position: relative;\r\n        width: 100%;\r\n        box-sizing: border-box;\r\n    }\r\n</style>","<script>\r\n    export let model;\r\n    export let left;\r\n    export let width;\r\n    export let resizing = false;\r\n\r\n    const _position = {\r\n        width,\r\n        x: left\r\n    }\r\n    $: {\r\n        _position.x = left, _position.width = width;\r\n    };\r\n</script>\r\n\r\n<div class=\"sg-time-range\" class:moving=\"{resizing}\" style=\"width:{_position.width}px;left:{_position.x}px\">\r\n    <div class=\"sg-time-range-label\">{model.label}</div>\r\n</div>\r\n<style>\r\n    .sg-time-range {\r\n        height: 100%;\r\n        position: absolute;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n\r\n        background-image: linear-gradient(-45deg, rgba(0, 0, 0, 0) 46%, #e03218 49%, #e03218 51%, rgba(0, 0, 0, 0) 55%);\r\n        background-size: 6px 6px !important;\r\n        color: red;\r\n        font-weight: 400;\r\n    }\r\n\r\n    .sg-time-range-label {\r\n        margin-top: 10px;\r\n        background: #fff;\r\n        white-space: nowrap;\r\n        padding: 4px;\r\n        font-weight: 400;\r\n        font-size: 10px;\r\n    }\r\n</style>","<script>\r\n    import { beforeUpdate, getContext } from 'svelte';\r\n\r\n    import { Draggable } from '../core/drag';\r\n    import { timeRangeStore } from '../core/store';\r\n\r\n    const { rowContainer } = getContext('gantt');\r\n    const { utils, columnService } = getContext('services');\r\n    const { resizeHandleWidth } = getContext('options');\r\n    const {\r\n        from,\r\n        to,\r\n        width: ganttWidth,\r\n        visibleWidth\r\n    } = getContext('dimensions');\r\n\r\n    export let model;\r\n    export let width;\r\n    export let left;\r\n    \r\n    const _position = {\r\n        width,\r\n        x: left\r\n    }\r\n    $: {\r\n        _position.x = left, _position.width = width;\r\n    };\r\n\r\n    function drag(node) {\r\n        const ondrop = (event) => {\r\n            const newFrom = utils.roundTo(columnService.getDateByPosition(event.x)); \r\n            const newTo = utils.roundTo(columnService.getDateByPosition(event.x + event.width));\r\n            const newLeft = columnService.getPositionByDate(newFrom);\r\n            const newRight = columnService.getPositionByDate(newTo);\r\n            \r\n            Object.assign(model, {\r\n                from: newFrom,\r\n                to: newTo\r\n            });\r\n\r\n            update({\r\n                left: newLeft,\r\n                width: newRight - newLeft,\r\n                model,\r\n                resizing: false\r\n            });\r\n\r\n            window.removeEventListener('mousemove', onmousemove, false);\r\n        };\r\n\r\n        function update(state) {\r\n            timeRangeStore.update(state);\r\n            _position.x = state.left;\r\n            _position.width = state.width;\r\n        }\r\n\r\n        return new Draggable(node, {\r\n            onDown: (event) => {\r\n                update({\r\n                    left: event.x,\r\n                    width: event.width,\r\n                    model,\r\n                    resizing: true\r\n                });\r\n            }, \r\n            onResize: (event) => {\r\n                update({\r\n                    left: event.x,\r\n                    width: event.width,\r\n                    model,\r\n                    resizing: true\r\n                });\r\n            },\r\n            dragAllowed: false,\r\n            resizeAllowed: true,\r\n            onDrop: ondrop, \r\n            container: rowContainer, \r\n            resizeHandleWidth,\r\n            getX: () => _position.x,\r\n            getY: () => 0,\r\n            getWidth: () => _position.width\r\n        });\r\n    }\r\n</script>\r\n\r\n<div class=\"sg-time-range-control\" style=\"width:{_position.width}px;left:{_position.x}px\">\r\n    <div class=\"sg-time-range-handle-left\" use:drag></div>\r\n    <div class=\"sg-time-range-handle-right\" use:drag></div>\r\n</div>\r\n<style>\r\n    .sg-time-range-control {\r\n        position: absolute;\r\n    }\r\n\r\n    .sg-time-range-handle-left {\r\n        position: absolute;\r\n        left: 0;\r\n    }\r\n\r\n    .sg-time-range-handle-right {\r\n        position: absolute;\r\n        right: 0;\r\n    }\r\n\r\n    .sg-time-range-handle-left::before, .sg-time-range-handle-right::before {\r\n        position: absolute;\r\n        content: '';\r\n        bottom: 4px;\r\n        border-radius: 6px 6px 6px 0;\r\n        border: 2px solid #b0b0b7;\r\n        width: 9px;\r\n        height: 9px;\r\n        transform: translateX(-50%) rotate(-45deg);\r\n        background-color: #fff;\r\n\r\n        border-color: #e03218;\r\n        cursor: ew-resize;\r\n    }\r\n</style>","<script>\r\n    import { createEventDispatcher, getContext } from 'svelte';\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    import { duration as momentDuration } from 'moment';\r\n\r\n    const { from, to, width } = getContext('dimensions');\r\n    \r\n    export let header;\r\n    export let baseWidth;\r\n    export let baseDuration;\r\n\r\n    export let columnWidth;\r\n    $: {\r\n        const offset = header.offset || 1;\r\n        const duration = momentDuration(offset, header.unit).asMilliseconds();\r\n        const ratio = duration / baseDuration;\r\n        columnWidth = baseWidth * ratio;\r\n    }\r\n\r\n    export let columnCount;\r\n    $: {\r\n        columnCount = Math.ceil($width / columnWidth);\r\n        if(!isFinite(columnCount)){\r\n            console.error('columnCount is not finite');\r\n            columnCount = 0;\r\n        }\r\n    }\r\n\r\n    let _headers = [];\r\n    $: {\r\n        const headers = [];\r\n        let headerTime = $from.clone().startOf(header.unit);\r\n        const offset = header.offset || 1;\r\n\r\n        for(let i = 0; i < columnCount; i++){\r\n            headers.push({\r\n                width: Math.min(columnWidth, $width), \r\n                label: headerTime.format(header.format),\r\n                from: headerTime.clone(),\r\n                to: headerTime.clone().add(offset, header.unit),\r\n                unit: header.unit\r\n            });\r\n            headerTime.add(offset, header.unit);\r\n        }\r\n        _headers = headers;\r\n    }\r\n</script>\r\n\r\n<div class=\"column-header-row\">\r\n    {#each _headers as _header}\r\n        <div class=\"column-header-cell\" class:sticky={header.sticky} style=\"width:{_header.width}px\" on:click=\"{() => dispatch('dateSelected', { from: _header.from, to: _header.to, unit: _header.unit })}\">\r\n            <div class=\"column-header-cell-label\">{_header.label || 'N/A'}</div>\r\n        </div>\r\n    {/each}\r\n</div>\r\n<style>\r\n    .column-header-row {\r\n        box-sizing: border-box;\r\n        white-space: nowrap;\r\n        height: 32px;\r\n    }\r\n\r\n    .column-header-cell {\r\n        display: inline-block;\r\n        height: 100%;\r\n        box-sizing: border-box;\r\n        text-overflow: clip;\r\n        /* vertical-align: top; */\r\n        text-align: center;\r\n\r\n        display: inline-flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        font-size: 1em;    \r\n        font-size: 14px;\r\n        font-weight: 300;\r\n        transition: background 0.2s;\r\n\r\n        cursor: pointer;     \r\n        user-select: none;\r\n    }\r\n\r\n    .column-header-cell.sticky > .column-header-cell-label {\r\n        position: sticky;\r\n        left: 1rem;\r\n    }\r\n\r\n    .column-header-cell:hover {\r\n        background: #f9f9f9;\r\n    }\r\n    \r\n</style>","import { Moment } from \"moment\";\r\n\r\nexport class GanttUtils {\r\n    from: Moment;\r\n    to: Moment;\r\n    width: number;\r\n    magnetOffset: number;\r\n    magnetUnit: string;\r\n\r\n    constructor() {\r\n    }\r\n\r\n    /**\r\n     * Returns position of date on a line if from and to represent length of width\r\n     * @param {*} date \r\n     */\r\n    getPositionByDate (date) {\r\n        return getPositionByDate(date, this.from, this.to, this.width); \r\n    }\r\n\r\n    getDateByPosition (x) {\r\n        return getDateByPosition(x, this.from, this.to, this.width);\r\n    }\r\n\r\n    /**\r\n     * \r\n     * @param {Moment} date - Date\r\n     * @returns {Moment} rounded date passed as parameter\r\n     */\r\n    roundTo (date) {\r\n        let value = date.get(this.magnetUnit)\r\n    \r\n        value = Math.round(value / this.magnetOffset);\r\n    \r\n        date.set(this.magnetUnit, value * this.magnetOffset);\r\n\r\n        //round all smaller units to 0\r\n        const units = ['millisecond', 'second', 'minute', 'hour', 'date', 'month', 'year'];\r\n        const indexOf = units.indexOf(this.magnetUnit);\r\n        for (let i = 0; i < indexOf; i++) {\r\n            date.set(units[i], 0)\r\n        }\r\n        return date\r\n    }\r\n}\r\n\r\nexport function getPositionByDate (date, from, to, width) {\r\n    if (!date) {\r\n      return undefined\r\n    }\r\n\r\n    let durationTo = date.diff(from, 'milliseconds')\r\n    let durationToEnd = to.diff(from, 'milliseconds')\r\n\r\n    return durationTo / durationToEnd * width;\r\n}\r\n\r\nexport function getDateByPosition (x, from, to, width) {\r\n    let durationTo = x / width * to.diff(from, 'milliseconds');\r\n    let dateAtPosition = from.clone().add(durationTo, 'milliseconds');\r\n    return dateAtPosition; \r\n}\r\n\r\n// Returns the object on the left and right in an array using the given cmp function.\r\n// The compare function defined which property of the value to compare (e.g.: c => c.left)\r\nexport function getIndicesOnly<T, C = number|Date> (input: T[], value: C, comparer: {(T: T): C}, strict?: boolean) {\r\n    let lo = -1;\r\n    let hi = input.length;\r\n    while (hi - lo > 1) {\r\n        let mid = Math.floor((lo + hi) / 2);\r\n        if (strict ? comparer(input[mid]) < value : comparer(input[mid]) <= value) {\r\n            lo = mid;\r\n        } else {\r\n            hi = mid;\r\n        }\r\n    }\r\n    if (!strict && input[lo] !== undefined && comparer(input[lo]) === value) {\r\n        hi = lo;\r\n    }\r\n    return [lo, hi];\r\n}\r\n  \r\nexport function get<T, C = number|Date> (input: T[], value: C, comparer: {(T: T): C}, strict?: boolean) {\r\n    let res = getIndicesOnly(input, value, comparer, strict);\r\n    return [input[res[0]], input[res[1]]];\r\n}\r\n  ","<script>\r\n    import { getContext } from 'svelte';\r\n    import { duration as momentDuration } from 'moment';\r\n    import { getPositionByDate } from '../utils/utils';\r\n\r\n    import ColumnHeaderRow from './ColumnHeaderRow.svelte';\r\n    \r\n    /**\r\n     * Container component for header rows \r\n     */\r\n    export let headers;\r\n    export let columnUnit;\r\n    export let columnOffset;\r\n\r\n    const { from, to, width } = getContext('dimensions');\r\n\r\n    let minHeader;\r\n    $: {\r\n        let result = null; \r\n        let minDuration = null;\r\n\r\n        [...headers, {unit: columnUnit, offset: columnOffset}].forEach(header => {\r\n            \r\n            const offset = header.offset || 1;\r\n            const duration = momentDuration(offset, header.unit).asMilliseconds();\r\n            if(duration < minDuration || minDuration === null) {\r\n                minDuration = duration;\r\n                result = header;\r\n            }\r\n        });\r\n\r\n        minHeader = result;\r\n    }\r\n\r\n    let baseHeaderWidth;\r\n    $: {\r\n        baseHeaderWidth = getPositionByDate($from.clone().add(minHeader.offset || 1, minHeader.unit), $from, $to, $width) | 0;\r\n        if(baseHeaderWidth <= 0)\r\n            console.error('baseHeaderWidth is invalid, columns or headers might be too short for the current view.');\r\n    }\r\n\r\n    let baseHeaderDuration;\r\n    $: {\r\n        baseHeaderDuration = momentDuration(minHeader.offset || 1, minHeader.unit).asMilliseconds();\r\n    }\r\n</script>\r\n\r\n{#each headers as header}\r\n<ColumnHeaderRow {header} baseWidth={baseHeaderWidth} baseDuration={baseHeaderDuration} on:dateSelected/>\r\n{/each}\r\n\r\n<style>\r\n    \r\n</style>\r\n","<script>\r\n    import { getContext, onMount } from 'svelte';\r\n    \r\n    import Column from './Column.svelte';\r\n    /**\r\n     * Container component for columns rendered as gantt body background\r\n     */\r\n    export let columns = [];\r\n\r\n    function lineAt(ctx, x) {\r\n        ctx.beginPath();\r\n        ctx.moveTo(x, 0);\r\n        ctx.lineTo(x, 20);\r\n        ctx.stroke();\r\n    }\r\n\r\n    function createBackground(columns) {\r\n        const canvas = document.createElement('canvas');\r\n        canvas.width = columns.length * columns[0].width;\r\n        canvas.height = 20;\r\n\r\n        const ctx = canvas.getContext('2d');\r\n        ctx.shadowColor = \"rgba(128,128,128,0.5)\";\r\n        ctx.shadowOffsetX = 0;\r\n        ctx.shadowOffsetY = 0;\r\n        ctx.shadowBlur = 0.5;\r\n        ctx.lineWidth = 1;\r\n        ctx.lineCap = \"square\";\r\n        ctx.strokeStyle = '#efefef';\r\n        ctx.translate(0.5, 0.5);\r\n\r\n        columns.forEach(column => {\r\n            lineAt(ctx, column.left);\r\n        });\r\n\r\n        const dataURL = canvas.toDataURL();\r\n        return `url(\"${dataURL}\")`;\r\n    }\r\n\r\n    let backgroundImage;\r\n    $: {\r\n        backgroundImage = createBackground(columns.slice(0,4));\r\n    }\r\n</script>\r\n\r\n<div class=\"sg-columns\" style=\"background-image:{backgroundImage};\">\r\n\t<!-- {#each columns as column}\r\n\t<Column left={column.left} width={column.width} />\r\n\t{/each} -->\r\n</div>\r\n<style>\r\n    .sg-columns {\r\n        position: absolute;\r\n        height: 100%;\r\n        width: 100%;\r\n        overflow: hidden;\r\n\r\n        background-repeat: repeat;\r\n        background-position-x: -1px;\r\n    }\r\n</style>","<script>\r\n    import { createEventDispatcher, onMount } from 'svelte';\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    import { Draggable } from 'src/core/drag';\r\n    import { setCursor } from 'src/utils/domUtils';\r\n\r\n    export let x = 240;\r\n    export let container;\r\n\r\n    let dragging = false;\r\n    const dragOptions = {\r\n        onDrag: (event) => {\r\n            x = event.x, dragging = true;\r\n            dispatch('resize', { left: x });\r\n            setCursor('col-resize');\r\n        },\r\n        onDrop: (event) => {\r\n            x = event.x, dragging = false;\r\n            dispatch('resize', { left: x });\r\n            setCursor('default');\r\n        }, \r\n        dragAllowed: true,\r\n        resizeAllowed: false,\r\n        container: container, \r\n        getX: () => x,\r\n        getY: () => 0,\r\n        getWidth: () => 0\r\n    }\r\n\r\n    $: dragOptions.container = container;\r\n\r\n    function resizer(node) {\r\n        return new Draggable(node, dragOptions);\r\n    }\r\n</script>\r\n\r\n<div class=\"sg-resize\" style=\"left:{x}px\" use:resizer></div>\r\n<style>\r\n    .sg-resize {\r\n        z-index: 2;\r\n        background: #e9eaeb;\r\n        width: 5px;\r\n        cursor: col-resize;\r\n        position: absolute;\r\n        height: 100%;\r\n\r\n        transition: width 0.2s, transform 0.2s;\r\n    }\r\n\r\n    .sg-resize:hover {\r\n        transform: translateX(-2px);\r\n        width: 10px;\r\n    }\r\n</style>","import { writable, Writable } from 'svelte/store';\r\n\r\nexport class SelectionManager {\r\n    selection: Writable<any[]>;\r\n\r\n    constructor() {\r\n        this.selection = writable([]);\r\n    }\r\n\r\n    selectSingle(item) {\r\n        this.selection.set([item]);\r\n    }\r\n\r\n    toggleSelection(item) {\r\n        this.selection.update(items => {\r\n            const index = items.indexOf(item);\r\n            if (index !== -1) {\r\n                items.splice(index, 1);\r\n            }\r\n            else {\r\n                items.push(item);\r\n            }\r\n            return items;\r\n        });\r\n    }\r\n\r\n    clearSelection() {\r\n        this.selection.set([]);\r\n    }\r\n}","export class GanttApi {\r\n    listeners: any[];\r\n    listenersMap: { [key: string]: any; };\r\n\r\n    constructor() {\r\n        this.listeners = [];\r\n        this.listenersMap = {};\r\n    }\r\n\r\n    registerEvent(featureName, eventName) {\r\n        if (!this[featureName]) {\r\n            this[featureName] = {}\r\n        }\r\n\r\n        const feature = this[featureName]\r\n        if (!feature.on) {\r\n            feature.on = {}\r\n            feature.raise = {}\r\n        }\r\n\r\n        let eventId = 'on:' + featureName + ':' + eventName\r\n\r\n        feature.raise[eventName] = (...params) => {\r\n            //todo add svelte? event listeners, looping isnt effective unless rarely used\r\n            this.listeners.forEach(listener => {\r\n                if (listener.eventId === eventId) {\r\n                    listener.handler(params);\r\n                }\r\n            });\r\n        }\r\n\r\n        // Creating on event method featureName.oneventName\r\n        feature.on[eventName] = (handler) => {\r\n\r\n            // track our listener so we can turn off and on\r\n            let listener = {\r\n                handler: handler,\r\n                eventId: eventId\r\n            }\r\n            this.listenersMap[eventId] = listener;\r\n            this.listeners.push(listener)\r\n\r\n            const removeListener = () => {\r\n                const index = this.listeners.indexOf(listener)\r\n                this.listeners.splice(index, 1)\r\n            }\r\n\r\n            return removeListener\r\n        }\r\n    }\r\n}","export interface RowModel {\r\n    id: number;\r\n    classes?: string | string[];\r\n    contentHtml?: string;\r\n    enableDragging?: boolean;\r\n    height: number;\r\n    children?: RowModel[];\r\n}\r\n\r\nexport interface SvelteRow {\r\n    model: RowModel;\r\n    \r\n    y: number;\r\n    height: number;\r\n    hidden?: boolean;\r\n    children?: SvelteRow[];\r\n    allChildren?: SvelteRow[];\r\n    parent?: SvelteRow;\r\n    allParents?: SvelteRow[];\r\n    expanded?: boolean;\r\n    childLevel?: number;\r\n}\r\n\r\nexport class RowFactory {\r\n    rowHeight: number;\r\n\r\n    constructor(){\r\n    }\r\n\r\n    createRow(row: RowModel, y: number): SvelteRow {\r\n        // defaults\r\n        // id of task, every task needs to have a unique one\r\n        //row.id = row.id || undefined;\r\n        // css classes\r\n        row.classes = row.classes || '';\r\n        // html content of row\r\n        row.contentHtml = row.contentHtml || undefined;\r\n        // enable dragging of tasks to and from this row \r\n        row.enableDragging = row.enableDragging === undefined ? true : row.enableDragging;\r\n        // height of row element\r\n        const height = row.height || this.rowHeight;\r\n\r\n        return {\r\n            model: row,\r\n            y,\r\n            height,\r\n            expanded: true\r\n        }\r\n    }\r\n\r\n    createRows(rows: RowModel[]) {\r\n        const ctx = { y: 0, result: [] };\r\n        this.createChildRows(rows, ctx);\r\n        return ctx.result;\r\n    }\r\n\r\n    createChildRows(rowModels: RowModel[], ctx: { y: number, result: SvelteRow[] }, parent: SvelteRow = null, level: number = 0, parents: SvelteRow[] = []) {\r\n        const rowsAtLevel = [];\r\n        const allRows = [];\r\n\r\n        if(parent) {\r\n            parents = [...parents, parent];\r\n        }\r\n\r\n        rowModels.forEach(rowModel => {\r\n            const row = this.createRow(rowModel, ctx.y);\r\n            ctx.result.push(row);\r\n            rowsAtLevel.push(row);\r\n            allRows.push(row);\r\n\r\n            row.childLevel = level;\r\n            row.parent = parent;\r\n            row.allParents = parents;\r\n            \r\n            ctx.y += row.height;\r\n\r\n            if(rowModel.children) {\r\n                const nextLevel = this.createChildRows(rowModel.children, ctx, row, level+1, parents);\r\n                row.children = nextLevel.rows;\r\n                row.allChildren = nextLevel.allRows;\r\n                allRows.push(...nextLevel.allRows);\r\n            }\r\n        });\r\n        return {\r\n            rows: rowsAtLevel,\r\n            allRows\r\n        };\r\n    }\r\n}\r\n","import { ColumnService } from \"./column\";\r\n\r\nexport interface TimeRangeModel {\r\n    id: number; // | string;\r\n    from: any; // moment\r\n    to: any; // moment\r\n\r\n    classes?: string | string[];\r\n    label?: string;\r\n    enableResizing?: boolean;\r\n}\r\n\r\nexport interface SvelteTimeRange {\r\n    model: TimeRangeModel;\r\n    left: number;\r\n    width: number;\r\n    resizing: boolean;\r\n}\r\n\r\nexport class TimeRangeFactory {\r\n    columnService: ColumnService;\r\n\r\n    constructor(columnService: ColumnService) {\r\n        this.columnService = columnService;\r\n    }\r\n\r\n    create(model: TimeRangeModel): SvelteTimeRange {\r\n        // enable dragging\r\n        model.enableResizing = model.enableResizing === undefined ? true : model.enableResizing;\r\n\r\n        const left = this.columnService.getPositionByDate(model.from);\r\n        const right = this.columnService.getPositionByDate(model.to); \r\n\r\n        return {\r\n            model,\r\n            left: left,\r\n            width: right-left,\r\n            resizing: false\r\n        }\r\n    }\r\n}","const callbacks = {};\r\nexport function onDelegatedEvent(type, attr, callback) {\r\n    if (!callbacks[type])\r\n        callbacks[type] = {};\r\n    callbacks[type][attr] = callback;\r\n}\r\n\r\nexport function offDelegatedEvent(type, attr) {\r\n    delete callbacks[type][attr];\r\n}\r\n\r\nfunction matches(cbs, element) {\r\n    let data;\r\n    for (let attr in cbs) {\r\n        if (data = element.getAttribute(attr)) {\r\n            return { attr, data };\r\n        }\r\n    }\r\n}\r\n\r\nexport function onEvent(e) {\r\n    let { type, target } = e;\r\n    const cbs = callbacks[type];\r\n    if (!cbs) return;\r\n\r\n    let match;\r\n    let element = target;\r\n    while (element && element != e.currentTarget) {\r\n        if ((match = matches(cbs, element))) {\r\n            break;\r\n        }\r\n        element = element.parentElement;\r\n    }\r\n    if (match && cbs[match.attr]) {\r\n        cbs[match.attr](e, match.data, element);\r\n    }\r\n}","import { get } from '../utils/utils';\r\n\r\ninterface Column {\r\n    from: any;\r\n    left: number;\r\n    width: number;\r\n\r\n    /**\r\n     * Duration in milliseconds\r\n     */\r\n    duration: number;\r\n}\r\n\r\ninterface TimeResolution {\r\n    unit: string;\r\n    offset: number;\r\n}\r\n\r\nexport function findByPosition(columns: Column[], x: number) {\r\n    const result = get<Column>(columns, x, c => c.left);\r\n    return result;\r\n}\r\n\r\nexport function findByDate(columns: Column[], x: any) {\r\n    const result = get<Column>(columns, x, c => c.from);\r\n    return result;\r\n}\r\n\r\nexport class ColumnService {\r\n    \r\n    gantt: any;\r\n\r\n    constructor(gantt: any) {\r\n        this.gantt = gantt;\r\n    }\r\n\r\n    get columns(): Column[] {\r\n        return this.gantt.get().columns;\r\n    }\r\n\r\n    getColumnByDate(date) {\r\n        const columns = findByDate(this.columns, date);\r\n        return !columns[0] ? columns[1] : columns[0];\r\n    }\r\n\r\n    getColumnByPosition(x) {\r\n        const columns = findByPosition(this.columns, x);\r\n        return !columns[0] ? columns[1] : columns[0];\r\n    }\r\n\r\n    getPositionByDate (date) {\r\n        if(!date)\r\n            return null;\r\n\r\n        const column = this.getColumnByDate(date);\r\n        // partials\r\n\r\n        let durationTo = date.diff(column.from, 'milliseconds');\r\n        const position = durationTo / column.duration * column.width;\r\n\r\n        //multiples - skip every nth col, use other duration\r\n        return column.left + position;\r\n    }\r\n\r\n    getDateByPosition (x) {\r\n        const column = this.getColumnByPosition(x);\r\n        // partials\r\n\r\n        x = x - column.left;\r\n\r\n        let positionDuration = column.duration / column.width * x;\r\n        const date = column.from.clone().add(positionDuration, 'milliseconds');\r\n\r\n        return date;\r\n    }\r\n\r\n}","<script>\r\n    import { onMount, setContext, tick, onDestroy } from 'svelte';\r\n    import { writable, derived } from 'svelte/store';\r\n    import moment from 'moment';\r\n\r\n    let ganttElement;\r\n    let mainHeaderContainer;\r\n    let mainContainer;\r\n    let rowContainer;\r\n    let scrollables = [];\r\n    let mounted = false;\r\n\r\n    import { rowStore, taskStore, timeRangeStore, allTasks, allRows, allTimeRanges, rowTaskCache } from './core/store';\r\n    import { Task, Row, TimeRange, TimeRangeHeader, Milestone } from './entities';\r\n    import { Columns, ColumnHeader } from './column';\r\n    import { Resizer } from \"./ui\";\r\n\r\n    import { GanttUtils, getPositionByDate } from \"./utils/utils\";\r\n    import { getRelativePos, debounce, throttle } from \"./utils/domUtils\";\r\n    import { SelectionManager } from \"./utils/selectionManager\";\r\n    import { GanttApi } from \"./core/api\";\r\n    import { TaskFactory, reflectTask } from \"./core/task\";\r\n    import { RowFactory } from \"./core/row\";\r\n    import { TimeRangeFactory } from \"./core/timeRange\";\r\n    import { DragDropManager } from \"./core/drag\";\r\n    import { findByPosition, findByDate } from './core/column';\r\n    import { onEvent, onDelegatedEvent, offDelegatedEvent } from './core/events';\r\n\r\n    export let rows;\r\n    export let tasks = [];\r\n    export let timeRanges = [];\r\n    $: if(mounted) initRows(rows);\r\n    $: if(mounted) initTasks(tasks);\r\n    $: if(mounted) initTimeRanges(timeRanges);\r\n\r\n    export let rowPadding = 6;\r\n    export let rowHeight = 52;\r\n    const _rowHeight = writable(rowHeight);\r\n    const _rowPadding = writable(rowPadding);\r\n\r\n    export let from;\r\n    export let to;\r\n    const _from = writable(from);\r\n    const _to = writable(to);\r\n    $: $_from = from;\r\n    $: $_to = to;\r\n\r\n    export let minWidth = 800;\r\n    export let fitWidth = false;\r\n    const _minWidth = writable(minWidth);\r\n    const _fitWidth = writable(fitWidth);\r\n    $: {\r\n        $_minWidth = minWidth;\r\n        $_fitWidth = fitWidth;\r\n    } \r\n\r\n    export let classes = [];\r\n    export let headers = [{unit: 'day', format: 'MMMM Do'}, {unit: 'hour', format: 'H:mm'}];\r\n    export let zoomLevels = [\r\n\t\t{\r\n\t\t\theaders: [\r\n\t\t\t\t{ unit: 'day', format: 'DD.MM.YYYY' },\r\n\t\t\t\t{ unit: 'hour', format: 'HH' }\r\n\t\t\t],\r\n\t\t\tminWidth: 800,\r\n\t\t\tfitWidth: true\r\n\t\t},\r\n\t\t{\r\n\t\t\theaders: [\r\n\t\t\t\t{ unit: 'hour', format: 'ddd D/M, H A' },\r\n\t\t\t\t{ unit: 'minute', format: 'mm', offset: 15 }\r\n\t\t\t],\r\n\t\t\tminWidth: 5000,\r\n\t\t\tfitWidth: false\r\n\t\t}\r\n\t];\r\n    export let taskContent = null;\r\n    export let tableWidth = 100;\r\n    export let resizeHandleWidth = 10;\r\n    export let onTaskButtonClick = null;\r\n\r\n    export let magnetUnit = 'minute';\r\n    export let magnetOffset = 15;\r\n    export let columnUnit = 'minute';\r\n    export let columnOffset = 15;\r\n\r\n    // export until Svelte3 implements Svelte2's setup(component) hook\r\n    export let ganttTableModules = [];\r\n    export let ganttBodyModules = [];\r\n\r\n    export let reflectOnParentRows = true;\r\n    export let reflectOnChildRows = false;\r\n\r\n    const visibleWidth = writable();\r\n    const visibleHeight = writable();\r\n    const headerHeight = writable();\r\n    const _width = derived([visibleWidth, _minWidth, _fitWidth], ([visible, min, stretch]) => {\r\n        return stretch && visible > min ? visible : min;\r\n    });\r\n    \r\n    export const columnService = {\r\n        getColumnByDate(date) {\r\n            const pair = findByDate(columns, date);\r\n            return !pair[0] ? pair[1] : pair[0];\r\n        },\r\n        getColumnByPosition(x) {\r\n            const pair = findByPosition(columns, x);\r\n            return !pair[0] ? pair[1] : pair[0];\r\n        },\r\n        getPositionByDate (date) {\r\n            if(!date) return null;\r\n            const column = this.getColumnByDate(date);\r\n            \r\n            let durationTo = date.diff(column.from, 'milliseconds');\r\n            const position = durationTo / column.duration * column.width;\r\n\r\n            //multiples - skip every nth col, use other duration\r\n            return column.left + position;\r\n        },\r\n        getDateByPosition (x) {\r\n            const column = this.getColumnByPosition(x);\r\n            x = x - column.left;\r\n\r\n            let positionDuration = column.duration / column.width * x;\r\n            const date = moment(column.from).add(positionDuration, 'milliseconds');\r\n\r\n            return date;\r\n        },\r\n        /**\r\n         * \r\n         * @param {Moment} date - Date\r\n         * @returns {Moment} rounded date passed as parameter\r\n         */\r\n        roundTo(date) {\r\n            let value = date.get(magnetUnit);\r\n            value = Math.round(value / magnetOffset);\r\n            date.set(magnetUnit, value * magnetOffset);\r\n\r\n            //round all smaller units to 0\r\n            const units = ['millisecond', 'second', 'minute', 'hour', 'date', 'month', 'year'];\r\n            const indexOf = units.indexOf(magnetUnit);\r\n            for (let i = 0; i < indexOf; i++) {\r\n                date.set(units[i], 0)\r\n            }\r\n            return date\r\n        }\r\n    }\r\n\r\n    const columnWidth = writable(getPositionByDate($_from.clone().add(columnOffset, columnUnit), $_from, $_to, $_width) | 0);\r\n    $: $columnWidth = getPositionByDate($_from.clone().add(columnOffset, columnUnit), $_from, $_to, $_width) | 0;\r\n    let columnCount = Math.ceil($_width / $columnWidth);\r\n    $: columnCount = Math.ceil($_width / $columnWidth);\r\n    let columns = getColumns($_from, columnCount, columnOffset, columnUnit, $columnWidth);\r\n    $: columns = getColumns($_from, columnCount, columnOffset, columnUnit, $columnWidth);\r\n\r\n    function getColumns(from, count, offset, unit, width) {\r\n        let columns = [];\r\n        let columnFrom = from.clone();\r\n        let left = 0;\r\n        for (let i = 0; i < count; i++) {\r\n            const from = columnFrom.clone();\r\n            const to = columnFrom.add(offset, unit);\r\n            const duration = to.diff(from, 'milliseconds');\r\n\r\n            columns.push({\r\n                width: width,\r\n                from,\r\n                left,\r\n                duration\r\n            });\r\n            left += width;\r\n            columnFrom = to;\r\n        }\r\n        \r\n        return columns;\r\n    }\r\n\r\n    const dimensionsChanged = derived([columnWidth, _from, _to], () => ({}));\r\n    $: {\r\n        if($dimensionsChanged) {\r\n            refreshTasks();\r\n            refreshTimeRanges();\r\n        }\r\n    }\r\n\r\n    setContext('dimensions', {\r\n        from: _from,\r\n        to: _to,\r\n        width: _width,\r\n        visibleWidth,\r\n        visibleHeight,\r\n        headerHeight,\r\n        dimensionsChanged\r\n    });\r\n\r\n    setContext('options', {\r\n        taskContent,\r\n        rowPadding: _rowPadding,\r\n        rowHeight: _rowHeight,\r\n        resizeHandleWidth: resizeHandleWidth,\r\n        reflectOnParentRows,\r\n        reflectOnChildRows,\r\n        onTaskButtonClick\r\n    });\r\n\r\n    const hoveredRow = writable();\r\n    const selectedRow = writable();\r\n\r\n    const ganttContext = { \r\n        scrollables, \r\n        hoveredRow, \r\n        selectedRow \r\n    };\r\n    setContext('gantt', ganttContext);\r\n\r\n    onMount(() => {\r\n        Object.assign(ganttContext, {\r\n            rowContainer,\r\n            mainContainer,\r\n            mainHeaderContainer\r\n        });\r\n\r\n        api.registerEvent('tasks', 'move');\r\n        api.registerEvent('tasks', 'select');\r\n        api.registerEvent('tasks', 'switchRow');\r\n        api.registerEvent('tasks', 'moveEnd');\r\n        api.registerEvent('tasks', 'change');\r\n        api.registerEvent('tasks', 'changed');\r\n        api.registerEvent('gantt', 'viewChanged');\r\n\r\n        mounted = true;\r\n    });\r\n\r\n    onDelegatedEvent('click', 'data-task-id', (event, data, target) => {\r\n        const taskId = +data;\r\n        if (event.ctrlKey) {\r\n            selectionManager.toggleSelection(taskId);\r\n        } else {\r\n            selectionManager.selectSingle(taskId);\r\n        }\r\n        api.tasks.raise.select($taskStore.entities[taskId]);\r\n    });\r\n\r\n    onDelegatedEvent('mouseover', 'data-row-id', (event, data, target) => {\r\n        $hoveredRow = +data;\r\n    });\r\n\r\n    onDelegatedEvent('click', 'data-row-id', (event, data, target) => {\r\n        $selectedRow = +data;\r\n    });\r\n    \r\n    onDestroy(() => {\r\n        offDelegatedEvent('click', 'data-task-id');\r\n        offDelegatedEvent('click', 'data-row-id');\r\n    });\r\n\r\n    let __scrollTop = 0;\r\n    let __scrollLeft = 0;\r\n    function scrollable(node) {\r\n        const onscroll = event => {\r\n            const { scrollTop, scrollLeft } = node;\r\n\r\n            scrollables.forEach(scrollable => {\r\n                if (scrollable.orientation === \"horizontal\") {\r\n                    scrollable.node.scrollLeft = scrollLeft;\r\n                } else {\r\n                    scrollable.node.scrollTop = scrollTop;\r\n                }\r\n            });\r\n\r\n            __scrollTop = scrollTop;\r\n            __scrollLeft = scrollLeft;\r\n        };\r\n\r\n        node.addEventListener(\"scroll\", onscroll);\r\n        return {\r\n            destroy() {\r\n                node.removeEventListener(\"scroll\", onscroll, false);\r\n            }\r\n        };\r\n    }\r\n\r\n    function horizontalScrollListener(node) {\r\n        scrollables.push({ node, orientation: \"horizontal\" });\r\n    }\r\n\r\n    function onResize(event) {\r\n        tableWidth = event.detail.left;\r\n    }\r\n\r\n    let zoomLevel = 0;\r\n    let zooming = false;\r\n    async function onwheel(event) {\r\n        if (event.ctrlKey) {\r\n            event.preventDefault();\r\n\r\n            const prevZoomLevel = zoomLevel;\r\n            if (event.deltaY > 0) {\r\n                zoomLevel = Math.max(zoomLevel - 1, 0);\r\n            } else {\r\n                zoomLevel = Math.min(zoomLevel + 1, zoomLevels.length - 1);\r\n            }\r\n\r\n            if (prevZoomLevel != zoomLevel && zoomLevels[zoomLevel]) {\r\n                const options = {\r\n                    columnUnit: columnUnit,\r\n                    columnOffset: columnOffset,\r\n                    minWidth: $_minWidth,\r\n                    ...zoomLevels[zoomLevel]\r\n                };\r\n\r\n                const scale = options.minWidth / $_width;\r\n                const node = mainContainer;\r\n                const mousepos = getRelativePos(node, event);\r\n                const before = node.scrollLeft + mousepos.x;\r\n                const after = before * scale;\r\n                const scrollLeft = after - mousepos.x + node.clientWidth / 2;\r\n\r\n                console.log('scrollLeft', scrollLeft);\r\n\r\n                columnUnit = options.columnUnit;\r\n                columnOffset = options.columnOffset;\r\n                $_minWidth = options.minWidth;\r\n\r\n                if(options.headers)\r\n                    headers = options.headers;\r\n\r\n                if(options.fitWidth)\r\n                    $_fitWidth = options.fitWidth;\r\n\r\n                api.gantt.raise.viewChanged();\r\n                zooming = true;\r\n                await tick();\r\n                node.scrollLeft = scrollLeft;\r\n                zooming = false;\r\n            }\r\n        }\r\n    }\r\n\r\n    function onDateSelected(event) {\r\n        $_from = event.detail.from.clone();\r\n        $_to = event.detail.to.clone();\r\n    }\r\n\r\n    function initRows(rowsData) {\r\n        const rows = rowFactory.createRows(rowsData);\r\n        rowStore.addAll(rows);\r\n    }\r\n\r\n    async function initTasks(taskData) {\r\n        await tick();\r\n\r\n        const tasks = [];\r\n        const opts = { rowPadding: $_rowPadding };\r\n        taskData.forEach(t => {\r\n            const task = taskFactory.createTask(t);\r\n            const row = $rowStore.entities[task.model.resourceId];\r\n            task.reflections = [];\r\n\r\n            if(reflectOnChildRows && row.allChildren) {\r\n                row.allChildren.forEach(r => {\r\n                    const reflectedTask = reflectTask(task, r, opts);\r\n                    task.reflections.push(reflectedTask.model.id);\r\n                    tasks.push(reflectedTask);\r\n                });\r\n            }\r\n\r\n            if(reflectOnParentRows && row.allParents.length > 0) {\r\n                row.allParents.forEach(r => {\r\n                    const reflectedTask = reflectTask(task, r, opts);\r\n                    task.reflections.push(reflectedTask.model.id);\r\n                    tasks.push(reflectedTask);\r\n                });\r\n            }\r\n\r\n            tasks.push(task);\r\n        });\r\n        taskStore.addAll(tasks);\r\n    }\r\n\r\n    function initTimeRanges(timeRangeData) {\r\n        const timeRanges = timeRangeData.map(timeRange => {\r\n            return timeRangeFactory.create(timeRange);\r\n        });\r\n        timeRangeStore.addAll(timeRanges);\r\n    }\r\n    \r\n    function onModuleInit(module) {\r\n        \r\n    }\r\n\r\n    async function tickWithoutCSSTransition() {\r\n        disableTransition = false;\r\n        await tick();\r\n        ganttElement.offsetHeight; // force a reflow\r\n        disableTransition = true;\r\n    }\r\n\r\n    export const api = new GanttApi();\r\n    const selectionManager = new SelectionManager();\r\n\r\n    export const taskFactory = new TaskFactory(columnService);\r\n    $: {\r\n        taskFactory.rowPadding = $_rowPadding;\r\n        taskFactory.rowEntities = $rowStore.entities;\r\n    }\r\n\r\n    export const rowFactory = new RowFactory();\r\n    $: rowFactory.rowHeight = rowHeight;\r\n\r\n    export const dndManager = new DragDropManager(rowStore);\r\n    export const timeRangeFactory = new TimeRangeFactory(columnService);\r\n\r\n    export const utils = new GanttUtils();\r\n    $: {\r\n        utils.from = $_from;\r\n        utils.to = $_to;\r\n        utils.width = $_width;\r\n        utils.magnetOffset = magnetOffset;\r\n        utils.magnetUnit = magnetUnit;\r\n    }\r\n\r\n    setContext('services', {\r\n        utils,\r\n        api,\r\n        dndManager,\r\n        selectionManager,\r\n        columnService\r\n    });\r\n\r\n    export function refreshTimeRanges() {\r\n        timeRangeStore._update(({ids, entities}) => {\r\n            ids.forEach(id => {\r\n                const timeRange = entities[id];\r\n                const newLeft = columnService.getPositionByDate(timeRange.model.from) | 0;\r\n                const newRight = columnService.getPositionByDate(timeRange.model.to) | 0;\r\n\r\n                timeRange.left = newLeft;\r\n                timeRange.width = newRight - newLeft;\r\n            });\r\n            return { ids, entities };\r\n        });\r\n    }\r\n\r\n    export function refreshTasks() {\r\n        $allTasks.forEach(task => {\r\n            const newLeft = columnService.getPositionByDate(task.model.from) | 0;\r\n            const newRight = columnService.getPositionByDate(task.model.to) | 0;\r\n\r\n            task.left = newLeft;\r\n            task.width = newRight - newLeft;\r\n        });\r\n\r\n        taskStore.refresh();\r\n    }\r\n\r\n    export function getRowContainer() {\r\n        return rowContainer;\r\n    }\r\n\r\n    export function selectTask(id) {\r\n        const task = $taskStore.entities[id];\r\n        if (task) {\r\n            selectionManager.selectSingle(task);\r\n        }\r\n    }\r\n\r\n    export function unselectTasks() {\r\n        selectionManager.clearSelection();\r\n    }\r\n\r\n    export function scrollToRow(id, scrollBehavior = 'auto') {\r\n        const { scrollTop, clientHeight } = mainContainer;\r\n        \r\n        const index = $allRows.findIndex(r => r.model.id == id);\r\n        if(index === -1) return;\r\n        const targetTop = index * rowHeight;\r\n\r\n        if(targetTop < scrollTop) {\r\n            mainContainer.scrollTo({\r\n                top: targetTop,\r\n                behavior: scrollBehavior\r\n            });\r\n        }\r\n\r\n        if(targetTop > scrollTop + clientHeight) {\r\n            mainContainer.scrollTo({\r\n                top: targetTop + rowHeight - clientHeight,\r\n                behavior: scrollBehavior\r\n            });\r\n        }\r\n    }\r\n\r\n\texport function scrollToTask(id, scrollBehavior = 'auto') {\r\n        const { scrollLeft, scrollTop, clientWidth, clientHeight } = mainContainer;\r\n        \r\n        const task = $taskStore.entities[id];\r\n        if(!task) return;\r\n        const targetLeft = task.left;\r\n        const rowIndex = $allRows.findIndex(r => r.model.id == task.model.resourceId);\r\n        const targetTop = rowIndex * rowHeight;\r\n        \r\n        const options = {\r\n            top: undefined,\r\n            left: undefined,\r\n            behavior: scrollBehavior\r\n        };\r\n\r\n        if(targetLeft < scrollLeft) {\r\n            options.left = targetLeft;\r\n        }\r\n\r\n        if(targetLeft > scrollLeft + clientWidth) {\r\n            options.left = targetLeft + task.width - clientWidth;\r\n        }\r\n\r\n        if(targetTop < scrollTop) {\r\n            options.top = targetTop;\r\n        }\r\n\r\n        if(targetTop > scrollTop + clientHeight) {\r\n            options.top = targetTop + rowHeight - clientHeight;\r\n        }\r\n        \r\n        mainContainer.scrollTo(options);\r\n    }\r\n\r\n    export function updateTask(model) {\r\n        const task = taskFactory.createTask(model);\r\n        taskStore.upsert(task);\r\n    }\r\n\r\n    export function updateTasks(taskModels) {\r\n        const tasks = taskModels.map(model => taskFactory.createTask(model));\r\n        taskStore.upsertAll(tasks);\r\n    }\r\n\r\n    export function updateRow(model) {\r\n        const row = rowFactory.createRow(model);\r\n        rowStore.upsert(row);\r\n    }\r\n\r\n    export function updateRows(rowModels) {\r\n        const rows = rowModels.map(model => rowFactory.createRow(model));\r\n        rowStore.upsertAll(rows);\r\n    }\r\n\r\n    export function getRow(resourceId) {\r\n        return $rowStore.entities[resourceId];\r\n    }\r\n\r\n    export function getTask(id) {\r\n        return $taskStore.entities[id];\r\n    }\r\n\r\n    export function getTasks(resourceId) {\r\n        if ($rowTaskCache[resourceId]) {\r\n            return $rowTaskCache[resourceId].map(id => $taskStore.entities[id]);\r\n        }\r\n        return null;\r\n    }\r\n\r\n    let filteredRows = [];\r\n    $: filteredRows = $allRows.filter(row => !row.hidden);\r\n\r\n    let rightScrollbarVisible;\r\n    $: rightScrollbarVisible = rowContainerHeight > $visibleHeight;\r\n\r\n    let rowContainerHeight;\r\n    $: rowContainerHeight = filteredRows.length * rowHeight;\r\n\r\n    let startIndex;\r\n    $: startIndex = Math.floor(__scrollTop / rowHeight);\r\n\r\n    let endIndex;\r\n    $: endIndex = Math.min(startIndex + Math.ceil($visibleHeight / rowHeight), filteredRows.length - 1);\r\n\r\n    let paddingTop = 0;\r\n    $: paddingTop = startIndex * rowHeight;\r\n\r\n    let paddingBottom = 0;\r\n    $: paddingBottom = (filteredRows.length - endIndex - 1) * rowHeight;\r\n\r\n    let visibleRows = [];\r\n    $: visibleRows = filteredRows.slice(startIndex, endIndex + 1);\r\n\r\n    let visibleTasks;\r\n    $: {\r\n        const tasks = [];\r\n        visibleRows.forEach(row => {\r\n            if ($rowTaskCache[row.model.id]) {\r\n                $rowTaskCache[row.model.id].forEach(id => {\r\n                    tasks.push($taskStore.entities[id]);\r\n                });\r\n            }\r\n        });\r\n        visibleTasks = tasks;\r\n    }\r\n\r\n    let disableTransition = true;\r\n    $: if($dimensionsChanged) tickWithoutCSSTransition();\r\n</script>\r\n\r\n<div class=\"sg-gantt {classes}\" class:sg-disable-transition={!disableTransition} bind:this={ganttElement} on:click={onEvent} on:mouseover={onEvent}>\r\n    {#each ganttTableModules as module}\r\n    <svelte:component this={module} {rowContainerHeight} {paddingTop} {paddingBottom} tableWidth={tableWidth} {...$$restProps} on:init=\"{onModuleInit}\" {visibleRows} />\r\n\r\n    <Resizer x={tableWidth} on:resize=\"{onResize}\" container={ganttElement}></Resizer>\r\n    {/each}\r\n\r\n    <div class=\"sg-timeline sg-view\">\r\n        <div class=\"sg-header\" bind:this={mainHeaderContainer} bind:clientHeight=\"{$headerHeight}\" class:right-scrollbar-visible=\"{rightScrollbarVisible}\">\r\n            <div class=\"sg-header-scroller\" use:horizontalScrollListener>\r\n                <div class=\"header-container\" style=\"width:{$_width}px\">\r\n                    <ColumnHeader {headers} {columnUnit} {columnOffset} on:dateSelected=\"{onDateSelected}\" />\r\n                    {#each $allTimeRanges as timeRange (timeRange.id)}\r\n                    <TimeRangeHeader {...timeRange} />\r\n                    {/each}\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"sg-timeline-body\" bind:this={mainContainer} use:scrollable class:zooming=\"{zooming}\" on:wheel=\"{onwheel}\"\r\n         bind:clientHeight=\"{$visibleHeight}\" bind:clientWidth=\"{$visibleWidth}\">\r\n            <div class=\"content\" style=\"width:{$_width}px\">\r\n                <Columns columns={columns}/>\r\n                <div class=\"sg-rows\" bind:this={rowContainer} style=\"height:{rowContainerHeight}px;\">\r\n                    <div style=\"transform: translateY({paddingTop}px);\">\r\n                        {#each visibleRows as row (row.model.id)}\r\n                        <Row row={row} />\r\n                        {/each}\r\n                    </div>\r\n                </div>\r\n                <div class=\"sg-foreground\">\r\n                    {#each $allTimeRanges as timeRange (timeRange.id)}\r\n                    <TimeRange {...timeRange} />\r\n                    {/each}\r\n\r\n                    {#each visibleTasks as task (task.model.id)}\r\n                    <Task model={task.model} left={task.left}\r\n                     width={task.width} height={task.height} top={task.top} {...task} />\r\n                    {/each}\r\n                </div>\r\n                {#each ganttBodyModules as module}\r\n                <svelte:component this={module} {paddingTop} {paddingBottom} {visibleRows} {...$$restProps} on:init=\"{onModuleInit}\" />\r\n                {/each}\r\n            </div>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<style>\r\n    .sg-disable-transition :global(.sg-task),\r\n    .sg-disable-transition :global(.sg-milestone) {\r\n        transition: transform 0s, background-color 0.2s, width 0s !important;\r\n    }\r\n\r\n    :global(.sg-view:not(:first-child)) {\r\n        margin-left: 5px;\r\n    }\r\n    \r\n    /* This class should take into account varying widths of the scroll bar */\r\n    .right-scrollbar-visible {\r\n        padding-right: 17px;\r\n    }\r\n\r\n    .sg-timeline {\r\n        flex: 1 1 0%;\r\n        display: flex;\r\n        flex-direction: column;\r\n        overflow-x: auto;\r\n    }\r\n\r\n    .sg-gantt {\r\n        display: flex;\r\n\r\n        width: 100%;\r\n        height: 100%;\r\n        position: relative;\r\n    }\r\n\r\n    .sg-foreground {\r\n        box-sizing: border-box;\r\n        overflow: hidden;\r\n        top: 0;\r\n        left: 0;\r\n        position: absolute;\r\n        width: 100%;\r\n        height: 100%;\r\n        z-index: 1;\r\n        pointer-events: none;\r\n    }\r\n\r\n    .sg-rows {\r\n        width: 100%;\r\n        box-sizing: border-box;\r\n        overflow: hidden;\r\n    }\r\n\r\n    .sg-timeline-body {\r\n        overflow: auto;\r\n        flex: 1 1 auto;\r\n    }\r\n\r\n    .sg-header {\r\n        \r\n    }\r\n\r\n    .header-container {\r\n    }\r\n\r\n    .sg-header-scroller {\r\n        border-right: 1px solid #efefef;\r\n        overflow: hidden;\r\n        position: relative;\r\n    }\r\n\r\n    .content {\r\n        position: relative;\r\n    }\r\n\r\n    :global(*) {\r\n        box-sizing: border-box;\r\n    }\r\n</style>","<script>\r\n    import { createEventDispatcher, getContext } from \"svelte\";\r\n\r\n    export let row;\r\n    \r\n    const dispatch = createEventDispatcher();\r\n\r\n    function onExpandToggle() {\r\n        if(row.expanded) {\r\n            dispatch('rowCollapsed', { row });\r\n        } else {\r\n            dispatch('rowExpanded', { row });\r\n        }\r\n    }\r\n</script>\r\n\r\n<div class=\"sg-cell-inner\" style=\"padding-left: {row.childLevel*3}em\">\r\n    {#if row.children}\r\n        <div class=\"sg-tree-expander\" on:click=\"{onExpandToggle}\">\r\n            {#if row.expanded}\r\n            <i class=\"fas fa-angle-down\"></i>\r\n            {:else}\r\n            <i class=\"fas fa-angle-right\"></i>\r\n            {/if}\r\n        </div>\r\n    {/if}\r\n    <slot></slot>\r\n</div>\r\n\r\n<style>\r\n    .sg-tree-expander {\r\n        cursor: pointer;\r\n        min-width: 1.4em;\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n    }\r\n\r\n    .sg-cell-inner {\r\n        display: flex;\r\n    }\r\n</style>","<script>\r\n    import { createEventDispatcher, getContext } from \"svelte\";\r\n\r\n    import TableTreeCell from './TableTreeCell.svelte';\r\n\r\n    export let headers = null;\r\n    export let row = null;\r\n\r\n    const { rowHeight } = getContext('options');\r\n    const { hoveredRow, selectedRow } = getContext('gantt');\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    let treeIndentationStyle = '';\r\n    $: {\r\n        treeIndentationStyle = row.parent ? `padding-left: ${row.childLevel*3}em;`:'';\r\n    }\r\n\r\n</script>\r\n\r\n<div class=\"sg-table-row {row.model.class || ''}\" style=\"height:{$rowHeight}px\" data-row-id={row.model.id} class:sg-row-expanded=\"{row.expanded}\" class:sg-hover={$hoveredRow == row.model.id} class:sg-selected={$selectedRow == row.model.id}>\r\n    {#each headers as header}\r\n        <div class=\"sg-table-body-cell sg-table-cell\" style=\"width:{header.width}px\">\r\n            {#if header.type == 'tree'}\r\n                <TableTreeCell on:rowCollapsed on:rowExpanded {row}>\r\n                    {#if row.model.iconClass}\r\n                    <div class=\"sg-table-icon\">\r\n                        <i class=\"{row.model.iconClass}\"></i>\r\n                    </div>\r\n                    {/if}\r\n\r\n                    {#if row.model.headerHtml}\r\n                        {@html row.model.headerHtml}\r\n                    {:else if header.renderer}\r\n                        {@html header.renderer(row)}\r\n                    {:else}\r\n                        {row.model[header.property]}\r\n                    {/if}\r\n                </TableTreeCell>\r\n            {:else}\r\n                {#if row.model.iconClass}\r\n                <div class=\"sg-table-icon\">\r\n                    <i class=\"{row.model.iconClass}\"></i>\r\n                </div>\r\n                {/if}\r\n\r\n                {#if row.model.headerHtml}\r\n                    {@html row.model.headerHtml}\r\n                {:else if header.renderer}\r\n                    {@html header.renderer(row)}\r\n                {:else if header.type === 'resourceInfo'}\r\n                    <img class=\"sg-resource-image\" src=\"{row.model.imageSrc}\" alt=\"\"/>\r\n                    <div class=\"sg-resource-title\">\r\n                        {row.model[header.property]}\r\n                    </div>\r\n                {:else}\r\n                    {row.model[header.property]}\r\n                {/if}\r\n            {/if}\r\n        </div>\r\n    {/each}\r\n</div>\r\n<style>\r\n    .sg-table-row {\r\n        display: inline-flex;\r\n        min-width: 100%;\r\n        align-items: stretch;\r\n\r\n        position: relative;\r\n\r\n        font-weight: 400;\r\n        font-size: 14px;\r\n    }\r\n\r\n    .sg-table-cell {\r\n    }\r\n\r\n    .sg-resource-image {\r\n        width: 2.4em;\r\n        height: 2.4em;\r\n        border-radius: 50%;\r\n        margin-right: .6em;\r\n\r\n        background: #047c69;\r\n    }\r\n\r\n    .sg-resource-info {\r\n        flex: 1;\r\n        height: 100%;\r\n        display: flex;\r\n        flex-direction: row;\r\n        align-items: center;\r\n    }\r\n\r\n    .sg-table-icon {\r\n        margin-right: 0.5em;\r\n    }\r\n</style>","<script context=\"module\">\r\n    export const type = 'table';\r\n</script>\r\n\r\n<script>\r\n    import { createEventDispatcher, onMount, getContext } from 'svelte';\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    import TableRow from './TableRow.svelte';\r\n    import { H_SCROLLBAR_WIDTH } from 'src/core/constants';\r\n    import { rowStore, taskStore } from \"../../core/store\";\r\n\r\n    export let tableWidth;\r\n    export let paddingTop;\r\n    export let paddingBottom;\r\n    export let rowContainerHeight;\r\n    export let visibleRows;\r\n    // list of columns used in the table\r\n    // title: label to display in the header\r\n    // property: property of row to display in the cell\r\n    // width: width of column\r\n    export let tableHeaders = [{ title: 'Name', property: 'label', width: 100 }];\r\n\r\n    const { from, to, width, visibleWidth, headerHeight } = getContext('dimensions');\r\n    const { rowPadding } = getContext('options');\r\n\r\n    onMount(() => {\r\n        dispatch('init', { module: this });\r\n    });\r\n\r\n    const { scrollables } = getContext('gantt');\r\n    let headerContainer;\r\n    function scrollListener(node) {\r\n        scrollables.push({ node, orientation: \"vertical\" });\r\n        \r\n        node.addEventListener(\"scroll\", event => {\r\n            headerContainer.scrollLeft = node.scrollLeft;\r\n        });\r\n\r\n        return {\r\n            destroy() {\r\n                node.removeEventListener(\"scroll\");\r\n            }\r\n        };\r\n    }\r\n    \r\n    let scrollWidth;\r\n    $: {\r\n        let sum = 0;\r\n        tableHeaders.forEach(header => {\r\n            sum += header.width;\r\n        });\r\n        scrollWidth = sum;\r\n    }\r\n\r\n    function onRowExpanded(event) {\r\n        const row = event.detail.row;\r\n        row.expanded = true;\r\n        if(row.children)\r\n            show(row.children);\r\n        updateYPositions();\r\n    }\r\n\r\n    function onRowCollapsed(event) {\r\n        const row = event.detail.row;\r\n        row.expanded = false;\r\n        if(row.children)\r\n            hide(row.children);\r\n        updateYPositions();\r\n    }\r\n\r\n    function updateYPositions() {\r\n        let y = 0;\r\n        $rowStore.ids.forEach(id => {\r\n            const row = $rowStore.entities[id];\r\n            if(!row.hidden) {\r\n                $rowStore.entities[id].y = y;\r\n                y+= 52; \r\n            }\r\n        });\r\n\r\n        $taskStore.ids.forEach(id => {\r\n            const task = $taskStore.entities[id];\r\n            const row = $rowStore.entities[task.model.resourceId];\r\n            $taskStore.entities[id].top = row.y + $rowPadding;\r\n        });\r\n    }\r\n\r\n    function hide(children) {\r\n        children.forEach(row => {\r\n            if(row.children)\r\n                hide(row.children);\r\n            row.hidden = true;\r\n        });\r\n    }\r\n\r\n    function show(children, hidden = false) {\r\n        children.forEach(row => {\r\n            if(row.children)\r\n                show(row.children, !row.expanded);\r\n            row.hidden = hidden;\r\n        });\r\n    }\r\n\r\n    // if gantt displays a bottom scrollbar and table does not, we need to pad out the table\r\n    let bottomScrollbarVisible;\r\n    $: {\r\n        bottomScrollbarVisible = $width > $visibleWidth && scrollWidth <= tableWidth;\r\n    } \r\n</script>\r\n\r\n<div class=\"sg-table sg-view\" style=\"width:{tableWidth}px;\">\r\n    <div class=\"sg-table-header\" style=\"height:{$headerHeight}px\" bind:this={headerContainer}>\r\n        {#each tableHeaders as header}\r\n            <div class=\"sg-table-header-cell sg-table-cell\" style=\"width:{header.width}px\">\r\n                {header.title}\r\n            </div>\r\n        {/each}\r\n    </div>\r\n\r\n    <div class=\"sg-table-body\" class:bottom-scrollbar-visible=\"{bottomScrollbarVisible}\">\r\n        <div class=\"sg-table-scroller\" use:scrollListener>\r\n            <div class=\"sg-table-rows\" style=\"padding-top:{paddingTop}px;padding-bottom:{paddingBottom}px;height:{rowContainerHeight}px;\"> \r\n                {#each visibleRows as row}\r\n                    <TableRow\r\n                        row={row}\r\n                        headers={tableHeaders}\r\n                        on:rowExpanded={onRowExpanded}\r\n                        on:rowCollapsed={onRowCollapsed}/>\r\n                {/each}\r\n            </div>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<style>\r\n\r\n    /* This class should take into account varying widths of the scroll bar */\r\n    .bottom-scrollbar-visible {\r\n        padding-bottom: 17px;\r\n    }\r\n\r\n    .sg-table {\r\n        overflow-x: auto;\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    .sg-table-scroller {\r\n        width: 100%;\r\n        border-bottom: 1px solid #efefef; \r\n        overflow-y: hidden;\r\n    }\r\n\r\n    .sg-table-header {\r\n        display: flex;\r\n        align-items: stretch;\r\n        /* width: 100%; */\r\n        overflow: hidden;\r\n    }\r\n\r\n    .sg-table-rows {\r\n        \r\n    }\r\n\r\n    .sg-table-body {\r\n        display: flex;\r\n        flex: 1 1 0;\r\n        width: 100%;\r\n        overflow-y: hidden;\r\n    }\r\n\r\n    .sg-table-header-cell {\r\n        font-size: 14px;\r\n        font-weight: 400;\r\n    }\r\n\r\n    :global(.sg-table-cell){\r\n        white-space: nowrap;\r\n        overflow: hidden;\r\n        \r\n        display: flex;\r\n        align-items: center;\r\n        flex-shrink: 0;\r\n\r\n        padding: 0 .5em;\r\n        height: 100%;\r\n    }\r\n    \r\n    :global(.sg-table-cell:last-child) {\r\n        flex-grow: 1;\r\n    }\r\n</style>","import _svelteGanttTable from './Table.svelte';\r\nimport { ComponentCreator, Component } from '../../core/svelte';\r\n\r\nvar SvelteGanttTable = _svelteGanttTable as unknown as ComponentCreator<Component>;\r\n\r\nexport { SvelteGanttTable };","<script>\r\n    import { onMount } from 'svelte';\r\n\r\n    export let startY;\r\n    export let endY;\r\n    export let endX;\r\n    export let startX;\r\n    export let minLen = 12;\r\n    export let arrowSize = 5;\r\n    export let stroke = 'red';\r\n    export let strokeWidth = 2;\r\n\r\n    onMount(() => {\r\n\r\n    });\r\n\r\n    let height;\r\n    $: height = endY - startY;\r\n\r\n    let width;\r\n    $: width = endX - startX;\r\n\r\n    let path;\r\n    $: {\r\n        if (startX == NaN || startX == undefined)\r\n            path = 'M0 0';\r\n\r\n        let result;\r\n        if (startX + minLen >= endX && startY != endY) {\r\n            result = `L ${startX + minLen} ${startY} \r\n                        L ${startX + minLen} ${startY + height / 2}\r\n                        L ${endX - minLen} ${startY + height / 2}\r\n                        L ${endX - minLen} ${endY} `\r\n        }\r\n        else {\r\n            result = `L ${startX + width / 2} ${startY} \r\n                        L ${startX + width / 2} ${endY}`\r\n        }\r\n\r\n        // -2 so the line doesn't stick out of the arrowhead\r\n        path = `M${startX} ${startY}` + result + `L ${endX - 2} ${endY}`\r\n    }\r\n\r\n    let arrowPath;\r\n    $: {\r\n        if (endX == NaN || endX == undefined)\r\n            arrowPath = 'M0 0';\r\n\r\n        arrowPath = `M${endX - arrowSize} ${endY - arrowSize} L${endX} ${endY} L${endX - arrowSize} ${endY + arrowSize} Z`\r\n    }\r\n</script>\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"crispEdges\" class=\"arrow\" height=\"100%\" width=\"100%\">\r\n    <path d=\"{path}\" {stroke} stroke-width=\"{strokeWidth}\" fill=\"transparent\" class=\"select-area\" />\r\n    <path d=\"{arrowPath}\" fill=\"{stroke}\" />\r\n</svg>\r\n\r\n<style>\r\n    .arrow {\r\n        position: absolute;\r\n        left: 0px;\r\n        pointer-events: none;\r\n    }\r\n\r\n    .select-area {\r\n        pointer-events: visible;\r\n        position: absolute;\r\n    }\r\n</style>","<script>\r\n    import Arrow from './Arrow.svelte';\r\n\r\n    import { taskStore } from '../../core/store';\r\n\r\n    export let id;\r\n    export let fromId;\r\n    export let toId;\r\n\r\n    let fromTask;\r\n    $: fromTask = $taskStore.entities[fromId];\r\n\r\n    let toTask;\r\n    $: toTask = $taskStore.entities[toId];\r\n</script>\r\n\r\n<div class=\"sg-dependency\" style=\"left:0;top:0\" data-dependency-id=\"{id}\">\r\n    <Arrow startX={fromTask.left + fromTask.width} startY={fromTask.top + fromTask.height / 2} endX={toTask.left}\r\n        endY={toTask.top + toTask.height / 2} />\r\n</div>\r\n\r\n<style>\r\n    .sg-dependency {\r\n        position: absolute;\r\n        width: 100%;\r\n        height: 100%;\r\n    }\r\n</style>","<script context=\"module\">\r\n    const type = 'body';\r\n</script>\r\n\r\n<script>\r\n    import { getContext } from 'svelte';\r\n\r\n    import Dependency from './Dependency.svelte';\r\n    \r\n    import { taskStore } from '../../core/store';\r\n\r\n    const { visibleHeight } = getContext('dimensions');\r\n\r\n    export let paddingTop;\r\n    export let dependencies = [];\r\n\r\n    let visibleDependencies = [];\r\n    $: {\r\n        const result = [];\r\n        for (let i = 0; i < dependencies.length; i++) {\r\n            const dependency = dependencies[i];\r\n            const map = $taskStore.entities;\r\n\r\n            const fromTask = map[dependency.fromId];\r\n            const toTask = map[dependency.toId];\r\n            if(\r\n                fromTask && toTask \r\n                && Math.min(fromTask.top, toTask.top) <= paddingTop + $visibleHeight \r\n                && Math.max(fromTask.top, toTask.top) >= paddingTop\r\n            ) {\r\n                result.push(dependency);\r\n            }\r\n        }\r\n        visibleDependencies = result;\r\n    }\r\n</script>\r\n\r\n<div class=\"dependency-container\">\r\n    {#each visibleDependencies as dependency (dependency.id)}\r\n        <Dependency {...dependency}/>\r\n    {/each}\r\n</div>\r\n\r\n<style>\r\n    .dependency-container {\r\n        position: absolute;\r\n        width: 100%;\r\n        height: 100%;\r\n        \r\n        pointer-events: none;\r\n        top: 0;\r\n        float: left;\r\n        overflow: hidden;\r\n        z-index: 0;\r\n    }\r\n</style>","import { getRelativePos } from \"../../utils/domUtils\";\r\nimport { Draggable } from \"../../core/drag\";\r\nimport { SvelteRow } from \"../../core/row\";\r\nimport { SvelteGanttComponent } from \"../../gantt\";\r\nimport { Moment } from \"moment\";\r\n\r\ninterface DragOptions {\r\n    /** SvelteGantt this is binded to */\r\n    gantt: SvelteGanttComponent;\r\n    /** Creates a dragging indicator element */\r\n    elementContent(): HTMLElement;\r\n    /** Is currently being dragged */\r\n    dragging: boolean;\r\n    /** Is enabled */\r\n    enabled: boolean;\r\n    /** Success callback, when dragged over a row */\r\n    onsuccess?(target: SvelteRow, date: Moment, gantt: SvelteGanttComponent): void;\r\n    /** Fail callback, when dragged outside gantt */\r\n    onfail?(): void;\r\n}\r\n\r\nconst defaults = {\r\n    enabled: true,\r\n    elementContent: () => {\r\n        const element = document.createElement('div');\r\n        element.innerHTML = 'New Task';\r\n        Object.assign(element.style, {\r\n            position: 'absolute',\r\n            background: '#eee',\r\n            padding: '0.5em 1em',\r\n            fontSize: '12px',\r\n            pointerEvents: 'none',\r\n        });\r\n        return element;\r\n    }\r\n}\r\n\r\nexport class SvelteGanttExternal {\r\n    draggable: Draggable;\r\n    element: HTMLElement;\r\n    public options: DragOptions;\r\n\r\n    constructor(node: HTMLElement, options: DragOptions) {\r\n        this.options = Object.assign({}, defaults, options);\r\n        this.draggable = new Draggable(node, {\r\n            onDrag: this.onDrag.bind(this),\r\n            dragAllowed: () => this.options.enabled,\r\n            resizeAllowed: false,\r\n            onDrop: this.onDrop.bind(this),\r\n            container: document.body,\r\n            getX: (event: MouseEvent) => event.pageX,\r\n            getY: (event: MouseEvent) => event.pageY,\r\n            getWidth: () => 0\r\n        });\r\n    }\r\n\r\n    onDrag({ x, y }) {\r\n        if(!this.element) {\r\n            this.element = this.options.elementContent();\r\n            document.body.appendChild(this.element);\r\n            this.options.dragging = true;\r\n        }\r\n\r\n        this.element.style.top = y + 'px';\r\n        this.element.style.left = x + 'px';\r\n    }\r\n\r\n    onDrop(event) {\r\n        const gantt = this.options.gantt;\r\n        const targetRow = gantt.dndManager.getTarget('row', event.mouseEvent);\r\n        if (targetRow) {\r\n            const mousePos = getRelativePos(gantt.getRowContainer(), event.mouseEvent);\r\n            const date = gantt.utils.getDateByPosition(mousePos.x);\r\n\r\n            this.options.onsuccess?.(targetRow, date, gantt);\r\n        }\r\n        else {\r\n            this.options.onfail?.();\r\n        }\r\n\r\n        document.body.removeChild(this.element);\r\n        this.options.dragging = false;\r\n        this.element = null;\r\n    }\r\n}","// import { SvelteGanttTableComponent } from './modules/table';\r\n// import { SvelteGanttComponent } from './gantt';\r\n\r\n// export declare var SvelteGanttTable: SvelteGanttTableComponent;\r\n// export declare var SvelteGantt: SvelteGanttComponent;\r\n\r\nimport _svelteGantt from './Gantt.svelte';\r\n\r\nimport { SvelteGanttComponent, SvelteGanttOptions } from './gantt';\r\nimport { ComponentCreator } from './core/svelte';\r\nimport { SvelteGanttTable } from './modules/table';\r\nimport { SvelteGanttDependencies } from './modules/dependencies';\r\nimport { SvelteGanttExternal } from './modules/external/external';\r\n\r\nvar SvelteGantt = _svelteGantt as unknown as ComponentCreator<SvelteGanttComponent, SvelteGanttOptions>;\r\n\r\nexport {\r\n    SvelteGantt,\r\n    SvelteGanttTable,\r\n    SvelteGanttDependencies,\r\n    SvelteGanttExternal\r\n};"]}