@marigoldapp/svelte-calendar
Version:
A small date picker built with Svelte 3. Demo available here: [demo page].
336 lines (293 loc) • 8.28 kB
JavaScript
import './Popover.css.proxy.js';
/* src/Components/Popover.svelte generated by Svelte v3.29.4 */
import {
SvelteComponent,
add_render_callback,
append,
attr,
binding_callbacks,
create_slot,
detach,
element,
globals,
init,
insert,
listen,
run_all,
safe_not_equal,
set_style,
space,
toggle_class,
transition_in,
transition_out,
update_slot
} from "../../web_modules/svelte/internal.js";
const { window: window_1 } = globals;
import { onMount, createEventDispatcher, tick } from "../../web_modules/svelte.js";
const get_contents_slot_changes = dirty => ({});
const get_contents_slot_context = ctx => ({});
const get_trigger_slot_changes = dirty => ({});
const get_trigger_slot_context = ctx => ({});
function create_fragment(ctx) {
let div4;
let div0;
let t;
let div3;
let div2;
let div1;
let current;
let mounted;
let dispose;
add_render_callback(/*onwindowresize*/ ctx[14]);
const trigger_slot_template = /*#slots*/ ctx[13].trigger;
const trigger_slot = create_slot(trigger_slot_template, ctx, /*$$scope*/ ctx[12], get_trigger_slot_context);
const contents_slot_template = /*#slots*/ ctx[13].contents;
const contents_slot = create_slot(contents_slot_template, ctx, /*$$scope*/ ctx[12], get_contents_slot_context);
return {
c() {
div4 = element("div");
div0 = element("div");
if (trigger_slot) trigger_slot.c();
t = space();
div3 = element("div");
div2 = element("div");
div1 = element("div");
if (contents_slot) contents_slot.c();
attr(div0, "class", "trigger");
attr(div1, "class", "contents-inner svelte-mc1z8c");
attr(div2, "class", "contents svelte-mc1z8c");
attr(div3, "class", "contents-wrapper svelte-mc1z8c");
set_style(div3, "transform", "translate(-50%,-50%) translate(" + /*translateX*/ ctx[8] + "px, " + /*translateY*/ ctx[7] + "px)");
toggle_class(div3, "visible", /*open*/ ctx[0]);
toggle_class(div3, "shrink", /*shrink*/ ctx[1]);
attr(div4, "class", "sc-popover svelte-mc1z8c");
},
m(target, anchor) {
insert(target, div4, anchor);
append(div4, div0);
if (trigger_slot) {
trigger_slot.m(div0, null);
}
/*div0_binding*/ ctx[15](div0);
append(div4, t);
append(div4, div3);
append(div3, div2);
append(div2, div1);
if (contents_slot) {
contents_slot.m(div1, null);
}
/*div2_binding*/ ctx[16](div2);
/*div3_binding*/ ctx[17](div3);
/*div4_binding*/ ctx[18](div4);
current = true;
if (!mounted) {
dispose = [
listen(window_1, "resize", /*onwindowresize*/ ctx[14]),
listen(div0, "click", /*doOpen*/ ctx[9])
];
mounted = true;
}
},
p(ctx, [dirty]) {
if (trigger_slot) {
if (trigger_slot.p && dirty & /*$$scope*/ 4096) {
update_slot(trigger_slot, trigger_slot_template, ctx, /*$$scope*/ ctx[12], dirty, get_trigger_slot_changes, get_trigger_slot_context);
}
}
if (contents_slot) {
if (contents_slot.p && dirty & /*$$scope*/ 4096) {
update_slot(contents_slot, contents_slot_template, ctx, /*$$scope*/ ctx[12], dirty, get_contents_slot_changes, get_contents_slot_context);
}
}
if (!current || dirty & /*translateX, translateY*/ 384) {
set_style(div3, "transform", "translate(-50%,-50%) translate(" + /*translateX*/ ctx[8] + "px, " + /*translateY*/ ctx[7] + "px)");
}
if (dirty & /*open*/ 1) {
toggle_class(div3, "visible", /*open*/ ctx[0]);
}
if (dirty & /*shrink*/ 2) {
toggle_class(div3, "shrink", /*shrink*/ ctx[1]);
}
},
i(local) {
if (current) return;
transition_in(trigger_slot, local);
transition_in(contents_slot, local);
current = true;
},
o(local) {
transition_out(trigger_slot, local);
transition_out(contents_slot, local);
current = false;
},
d(detaching) {
if (detaching) detach(div4);
if (trigger_slot) trigger_slot.d(detaching);
/*div0_binding*/ ctx[15](null);
if (contents_slot) contents_slot.d(detaching);
/*div2_binding*/ ctx[16](null);
/*div3_binding*/ ctx[17](null);
/*div4_binding*/ ctx[18](null);
mounted = false;
run_all(dispose);
}
};
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
const dispatch = createEventDispatcher();
let once = (el, evt, cb) => {
function handler() {
cb.apply(this, arguments);
el.removeEventListener(evt, handler);
}
el.addEventListener(evt, handler);
};
let popover;
let w;
let triggerContainer;
let contentsAnimated;
let contentsWrapper;
let translateY = 0;
let translateX = 0;
let { open = false } = $$props;
let { shrink } = $$props;
let { trigger } = $$props;
const close = () => {
$$invalidate(1, shrink = true);
once(contentsAnimated, "animationend", () => {
$$invalidate(1, shrink = false);
$$invalidate(0, open = false);
dispatch("closed");
});
};
function checkForFocusLoss(evt) {
if (!open) return;
let el = evt.target;
// eslint-disable-next-line
do {
if (el === popover) return;
} while (el = el.parentNode); // eslint-disable-next-line
close();
}
onMount(() => {
document.addEventListener("click", checkForFocusLoss);
if (!trigger) return;
triggerContainer.appendChild(trigger.parentNode.removeChild(trigger));
// eslint-disable-next-line
return () => {
document.removeEventListener("click", checkForFocusLoss);
};
});
const getDistanceToEdges = async () => {
if (!open) {
$$invalidate(0, open = true);
}
await tick();
let rect = contentsWrapper.getBoundingClientRect();
return {
top: rect.top + -1 * translateY,
bottom: window.innerHeight - rect.bottom + translateY,
left: rect.left + -1 * translateX,
right: document.body.clientWidth - rect.right + translateX
};
};
const getTranslate = async () => {
let dist = await getDistanceToEdges();
let x;
let y;
if (w < 480) {
y = dist.bottom;
} else if (dist.top < 0) {
y = Math.abs(dist.top);
} else if (dist.bottom < 0) {
y = dist.bottom;
} else {
y = 0;
}
if (dist.left < 0) {
x = Math.abs(dist.left);
} else if (dist.right < 0) {
x = dist.right;
} else {
x = 0;
}
return { x, y };
};
const doOpen = async () => {
const { x, y } = await getTranslate();
$$invalidate(8, translateX = x);
$$invalidate(7, translateY = y);
$$invalidate(0, open = true);
dispatch("opened");
};
function onwindowresize() {
$$invalidate(3, w = window_1.innerWidth)
}
function div0_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
triggerContainer = $$value;
$$invalidate(4, triggerContainer);
});
}
function div2_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
contentsAnimated = $$value;
$$invalidate(5, contentsAnimated);
});
}
function div3_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
contentsWrapper = $$value;
$$invalidate(6, contentsWrapper);
});
}
function div4_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
popover = $$value;
$$invalidate(2, popover);
});
}
$$self.$$set = $$props => {
if ("open" in $$props) $$invalidate(0, open = $$props.open);
if ("shrink" in $$props) $$invalidate(1, shrink = $$props.shrink);
if ("trigger" in $$props) $$invalidate(10, trigger = $$props.trigger);
if ("$$scope" in $$props) $$invalidate(12, $$scope = $$props.$$scope);
};
return [
open,
shrink,
popover,
w,
triggerContainer,
contentsAnimated,
contentsWrapper,
translateY,
translateX,
doOpen,
trigger,
close,
$$scope,
slots,
onwindowresize,
div0_binding,
div2_binding,
div3_binding,
div4_binding
];
}
class Popover extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, {
open: 0,
shrink: 1,
trigger: 10,
close: 11
});
}
get close() {
return this.$$.ctx[11];
}
}
export default Popover;