├── .circleci └── config.yml ├── .editorconfig ├── .eslintrc.cjs ├── .gitignore ├── .nojekyll ├── .npmignore ├── LICENSE ├── changelog.md ├── demo.gif ├── docs ├── build │ ├── bundle.js │ └── bundle.js.map ├── favicon.png └── index.html ├── es-internal └── eslint-config-es-base-js │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── README.md │ ├── index.eslintrc.js │ ├── package.json │ ├── problems.eslintrc.js │ └── styles.eslintrc.js ├── package-lock.json ├── package.json ├── public ├── favicon.png └── index.html ├── readme.md ├── rollup.config.js ├── src ├── DateRangeInput.svelte ├── Month.svelte ├── TestApp.svelte ├── css │ ├── elements │ │ ├── button.css │ │ ├── header.css │ │ ├── hr.css │ │ ├── input.css │ │ ├── label.css │ │ ├── section.css │ │ ├── select.css │ │ └── table.css │ ├── reset.css │ └── tokens │ │ ├── color.css │ │ ├── size.css │ │ └── text.css ├── date-object.js ├── get-days-of-the-week.js ├── get-month-name.js └── test-app.js └── update-internal-dependencies.sh /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | defaults: &defaults 4 | docker: 5 | - image: circleci/node:13-browsers 6 | 7 | git_restore_cache: &git_restore_cache 8 | restore_cache: 9 | keys: 10 | - source-v1-{{ .Branch }}-{{ .Revision }} 11 | - source-v1-{{ .Branch }}- 12 | - source-v1- 13 | 14 | git_save_cache: &git_save_cache 15 | save_cache: 16 | key: source-v1-{{ .Branch }}-{{ .Revision }} 17 | paths: 18 | - ".git" 19 | 20 | jobs: 21 | test_and_build: 22 | <<: *defaults 23 | steps: 24 | - *git_restore_cache 25 | - checkout 26 | - *git_save_cache 27 | - run: 28 | name: Install 29 | command: npm ci 30 | - run: 31 | name: Test 32 | command: npm test 33 | - run: 34 | name: Build 35 | command: npm run build 36 | test_and_build_and_deploy_to_npm: 37 | <<: *defaults 38 | steps: 39 | - *git_restore_cache 40 | - checkout 41 | - *git_save_cache 42 | - run: 43 | name: Install 44 | command: npm ci 45 | - run: 46 | name: Build 47 | command: npm run build 48 | - run: 49 | name: Deploy to npm 50 | command: npm publish --access public 51 | 52 | workflows: 53 | version: 2 54 | ci: 55 | jobs: 56 | - test_and_build: 57 | filters: 58 | branches: 59 | ignore: npm 60 | - test_and_build_and_deploy_to_npm: 61 | filters: 62 | branches: 63 | only: npm 64 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | 9 | [*.yml] 10 | indent_style = space 11 | indent_size = 2 12 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "node": true, 5 | "es6": true 6 | }, 7 | "plugins": [ 8 | "svelte3" 9 | ], 10 | "extends": [ 11 | "./es-internal/eslint-config-es-base-js" 12 | ], 13 | "parserOptions": { 14 | "ecmaVersion": 2019, 15 | "sourceType": "module" 16 | }, 17 | "overrides": [{ 18 | "files": ["**/*.svelte"], 19 | "processor": "svelte3/svelte3" 20 | }], 21 | "rules": { 22 | "semi": [ 23 | "warn", 24 | "never" 25 | ], 26 | "indent": [ 27 | "warn", 28 | "tab" 29 | ], 30 | "no-sparse-arrays": 0, 31 | "no-param-reassign": 0, 32 | "no-unused-vars": "warn", 33 | "no-unused-expressions": 0, 34 | }, 35 | settings: { 36 | 'svelte3/ignore-warnings': warning => { 37 | return warning.code === "missing-custom-element-compile-options" 38 | } 39 | } 40 | } 41 | 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | /bundle.* 4 | public/build 5 | component.css* 6 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EquipmentShare/date-range-input/f3a95c49ac187528fff2bcf0d36d7279234e2fe8/.nojekyll -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | public 2 | docs 3 | src/css 4 | rollup.* 5 | *.gif 6 | *.test.js 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 EquipmentShare, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # 2.1.0 2 | 3 | - Remove reliance on `rem`s in favor of `px` 4 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EquipmentShare/date-range-input/f3a95c49ac187528fff2bcf0d36d7279234e2fe8/demo.gif -------------------------------------------------------------------------------- /docs/build/bundle.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../src/get-month-name.js","../../src/get-days-of-the-week.js","../../node_modules/calendarize/dist/index.mjs","../../src/date-object.js","../../node_modules/click-should-be-intercepted-for-navigation/index.js","../../src/Month.svelte","../../src/DateRangeInput.svelte","../../src/TestApp.svelte","../../src/test-app.js"],"sourcesContent":["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 (typeof $$scope.dirty === '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 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 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 (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 if (value != null || input.value) {\n input.value = value;\n }\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}\nfunction add_resize_listener(element, fn) {\n if (getComputedStyle(element).position === 'static') {\n element.style.position = 'relative';\n }\n const object = document.createElement('object');\n object.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1;');\n object.setAttribute('aria-hidden', 'true');\n object.type = 'text/html';\n object.tabIndex = -1;\n let win;\n object.onload = () => {\n win = object.contentDocument.defaultView;\n win.addEventListener('resize', fn);\n };\n if (/Trident/.test(navigator.userAgent)) {\n element.appendChild(object);\n object.data = 'about:blank';\n }\n else {\n object.data = 'about:blank';\n element.appendChild(object);\n }\n return {\n cancel: () => {\n win && win.removeEventListener && win.removeEventListener('resize', fn);\n element.removeChild(object);\n }\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(html, anchor = null) {\n this.e = element('div');\n this.a = anchor;\n this.u(html);\n }\n m(target, anchor = null) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(target, this.n[i], anchor);\n }\n this.t = target;\n }\n u(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n p(html) {\n this.d();\n this.u(html);\n this.m(this.t, this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\n\nlet stylesheet;\nlet active = 0;\nlet current_rules = {};\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 if (!current_rules[name]) {\n if (!stylesheet) {\n const style = element('style');\n document.head.appendChild(style);\n stylesheet = style.sheet;\n }\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 node.style.animation = (node.style.animation || '')\n .split(', ')\n .filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n )\n .join(', ');\n if (name && !--active)\n clear_rules();\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n current_rules = {};\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' ? window : 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, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(children(options.target));\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.18.2' }, 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}\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}\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, 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_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, validate_component, validate_each_keys, validate_store, xlink_attr };\n","let monthNames = null\nconst getMonthNames = () => {\n\tif (!monthNames) {\n\t\tconst formatter = new Intl.DateTimeFormat(undefined, {\n\t\t\tmonth: `long`,\n\t\t})\n\n\t\tconst zeroThroughEleven = new Array(12).fill(null).map((_, i) => i)\n\n\t\tmonthNames = zeroThroughEleven.map(jsDateMonthNumber => formatter.format(new Date(2020, jsDateMonthNumber)))\n\t}\n\n\treturn monthNames\n}\n\nexport default monthNumber => {\n\tif (monthNumber < 1 || monthNumber > 12) {\n\t\tthrow new Error(`getMonthName argument must be between 1 and 12 – you passed in ${monthNumber}`)\n\t}\n\n\treturn getMonthNames()[monthNumber - 1]\n}\n","const anArbitrarySundayEarlyInTheMonth = new Date(2020, 0, 5)\nconst dayNumbers = [ 0, 1, 2, 3, 4, 5, 6 ]\n\nlet daysOfWeek = null\n\nexport default () => {\n\tif (!daysOfWeek) {\n\t\tconst formatter = new Intl.DateTimeFormat(undefined, {\n\t\t\tweekday: `short`,\n\t\t})\n\n\t\tdaysOfWeek = dayNumbers.map(dayNumber => {\n\t\t\tconst date = new Date(anArbitrarySundayEarlyInTheMonth)\n\t\t\tdate.setDate(date.getDate() + dayNumber)\n\t\t\treturn formatter.format(date)\n\t\t})\n\t}\n\n\treturn daysOfWeek\n}\n","export default function (target, offset) {\n\tvar i=0, j=0, week, out=[], date = new Date(target || new Date);\n\tvar year = date.getFullYear(), month = date.getMonth();\n\n\t// day index (of week) for 1st of month\n\tvar first = new Date(year, month, 1 - (offset | 0)).getDay();\n\n\t// how many days there are in this month\n\tvar days = new Date(year, month+1, 0).getDate();\n\n\twhile (i < days) {\n\t\tfor (j=0, week=Array(7); j < 7;) {\n\t\t\twhile (j < first) week[j++] = 0;\n\t\t\tweek[j++] = ++i > days ? 0 : i;\n\t\t\tfirst = 0;\n\t\t}\n\t\tout.push(week);\n\t}\n\n\treturn out;\n}\n","export const datesMatch = (a, b) => a.year === b.year\n\t&& a.month === b.month\n\t&& a.day === b.day\n\nexport const dateGt = (a, b) => {\n\tif (a.year === b.year && a.month === b.month) {\n\t\treturn a.day > b.day\n\t} else if (a.year === b.year) {\n\t\treturn a.month > b.month\n\t} else {\n\t\treturn a.year > b.year\n\t}\n}\n\nexport const dateGte = (a, b) => dateGt(a, b) || datesMatch(a, b)\n\nexport const dateLt = (a, b) => !dateGte(a, b)\n\nexport const dateLte = (a, b) => dateLt(a, b) || datesMatch(a, b)\n\n","function eventIsModifiedByKeyPress(event) {\n\treturn !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey)\n}\nfunction isLeftClick(event){\n\treturn event.button === 0\n}\n\nmodule.exports = function shouldIntercept(event) {\n\treturn !event.defaultPrevented\n\t\t&& !eventIsModifiedByKeyPress(event)\n\t\t&& isLeftClick(event)\n}\n","\n\n\n\n
\n\t
\n\t\t\n\t\t\t{getMonthName(visibleMonth.month)} {visibleMonth.year}\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
\n\t
\n\t\t{#each daysOfTheWeek as dayOfTheWeek}\n\t\t\t\n\t\t\t\t{dayOfTheWeek}\n\t\t\t\n\t\t{/each}\n\t
\n\t
\n\t\t{#each visibleWeeks as week}\n\t\t\t
\n\t\t\t\t{#each week as visibleDate}\n\t\t\t\t\t{#if visibleDate === null}\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t dispatchEvent('daySelected', visibleDate)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\ton:mouseover={ifMouseEventShouldBeReactedTo(\n\t\t\t\t\t\t\t\t\t() => dispatchEvent('mouseoverDate', visibleDate)\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\ton:mousedown={ifMouseEventShouldBeReactedTo(\n\t\t\t\t\t\t\t\t\t() => dispatchEvent('mousedownDate', visibleDate)\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\ton:mouseup={() => dispatchEvent('mouseupDate', visibleDate)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{visibleDate.day}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{/if}\n\t\t\t\t{/each}\n\t\t\t
\n\t\t{/each}\n\t
\n
\n\n\n","\n\n\n\n
\n\t mouseoverDate = startMouseDown = date}\n\t\ton:mouseoverDate={onMouseoverDate}\n\t\ton:mouseupDate={onMouseupDate}\n\t\ton:daySelected={onStartDaySelected}\n\n\t\tbind:visibleMonth={visibleStartMonth}\n\t>\n\t\n\t mouseoverDate = endMouseDown = date}\n\t\ton:mouseoverDate={onMouseoverDate}\n\t\ton:mouseupDate={onMouseupDate}\n\t\ton:daySelected={onEndDaySelected}\n\n\t\tbind:visibleMonth={visibleEndMonth}\n\t>\n
\n\n\n","\n\n\n\n\n\n
\n\t\n\t changes = [...changes, range] }\n\t>\n\t\n\t
\n\t\n
\n","import App from \"./TestApp.svelte\"\n\nconst app = new App({\n\ttarget: document.getElementById(\"test-app-target\"),\n})\n\nexport default app\n"],"names":["mouseEventShouldBeReactedTo","App"],"mappings":"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"} -------------------------------------------------------------------------------- /docs/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EquipmentShare/date-range-input/f3a95c49ac187528fff2bcf0d36d7279234e2fe8/docs/favicon.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | date-range-input test 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |

Date range picker

16 | 17 |

18 | Source 19 |

20 | 21 | 36 | 37 |

JS interface

38 |
39 | 40 | 41 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 0.0.8 2 | 3 | - add `homepage` property to `package.json` 4 | 5 | # 0.0.7 6 | 7 | - setup internal verdaccio npm proxy for caching purposes 8 | 9 | # 0.0.6 10 | 11 | - Add codeowners file 12 | - Add contributing doc 13 | - Add changelog file 14 | - Add repo creators to readme 15 | 16 | # 0.0.1 - 0.0.5 17 | 18 | - Initial Setup 19 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing @equipmentshare/eslint-config-es-base-js 2 | 3 | The `@equipmentshare/eslint-config-es-base-js` project operates an open contributor model where anyone is welcome to contribute towards development in the form of peer review, testing and patches. This document explains the practical process and guidelines for contributing. 4 | 5 | Firstly in terms of structure, there is no particular concept of "Core 6 | developers" in the sense of privileged people. Open source (and hopefully in-house libraries) often naturally revolve around meritocracy where longer term contributors gain more trust from 7 | the developer community. However, some hierarchy is necessary for practical 8 | purposes. As such there are repository "code owners" who are responsible for 9 | merging merge requests and ensuring a cohesive, constructive environment and vision for this project going forward. 10 | 11 | 12 | ## Contributor Workflow 13 | 14 | To contribute a patch, the workflow is as follows: 15 | 16 | 1. Create a topic branch off of `master` 17 | 1. Commit patches 18 | 1. Open up a merge request, tagging at least two and assigning one of the [code owners](/.gitlab/CODEOWNERS) for the project. 19 | 20 | It is the **assignee's** responsibility for clicking "merge" on the MR once all review comments have been resolved and the assignee is comfortable with the contents of the MR. Using a `WIP:` status on the MR serves as a flag to the assignee that the changeset is **not** ready to be merged, and serves as a method of control for the author over _when_ merging of the MR may be completed. The **author** is responsible for ensuring forward progress on the merge request. 21 | 22 | Labels serve as a means for communicating "status" from an MR's author to its reviewers. Common helpful labels include: 23 | 24 | - `Needs Review` 25 | - `Waiting on QA` 26 | - `Waiting on Deps` 27 | - `Ready to Merge` 28 | - `Blocked` 29 | 30 | In general [commits should be atomic](https://en.wikipedia.org/wiki/Atomic_commit#Atomic_commit_convention) and diffs should be easy to read. This helps to ensure a timely feedback loop for MR authors. 31 | 32 | 33 | ## "Decision Making" Process 34 | 35 | Code owners will take into consideration if a patch is in line with the general 36 | principles of the project; meets the minimum standards for inclusion; and will 37 | judge the general consensus of contributors. 38 | 39 | In general, all merge requests must: 40 | 41 | - Have a clear use case, fix a demonstrable bug or serve the greater good of 42 | the project (for example refactoring for modularisation); 43 | - Be well peer reviewed; 44 | - Have unit tests where appropriate; 45 | - Not break the existing test suite; 46 | - Where bugs are fixed, where possible, there should be unit tests 47 | demonstrating the bug and also proving the fix. This helps prevent regression. 48 | 49 | --- 50 | 51 | **Disclaimer:** A large portion of this Contribution guide was based off of [Bitcoin's OSS Contribution Guide](https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/CONTRIBUTING.md) 52 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/README.md: -------------------------------------------------------------------------------- 1 | # eslint-config-es-base-js 2 | 3 | A starting point for new JS package ESLint configurations at EquipmentShare. 4 | 5 | ## Goals 6 | 7 | Code quality rules and style choices chosen by some JS-lovers at EquipmentShare. 8 | 9 | They should be easy for you to use as a default, and simple for you to override any individual rules based on your team's preferences. 10 | 11 | ## To use in your own projects 12 | 13 | ```sh 14 | npm i --save-dev @equipmentshare/eslint-config-es-base-js 15 | ``` 16 | 17 | And add this to your `.eslintrc`: 18 | 19 | ```json 20 | { 21 | "extends": [ 22 | "@equipmentshare/es-base-js" 23 | ] 24 | } 25 | ``` 26 | 27 | ### Autoformatting 28 | 29 | It's a great idea to configure your editor to have eslint auto-fix your file on save. This gives you a great code auto-formatter, since almost all of the meaningful code style options are fixable, as well as many of the code-quality rules. 30 | 31 | For the benefit of folks opening MRs against your codebases, it's good form to include an `autoformat` script in your `package.json`, e.g. 32 | 33 | ```json 34 | { 35 | "scripts": { 36 | "autoformat": "eslint src/js/ --fix --ext .js,.ts" 37 | } 38 | } 39 | ``` 40 | 41 | ## "Problems" versus "styles" 42 | 43 | "Problems" are issues in code that will always produce undesired/unexpected behavior. 44 | 45 | Stylistic rules are issues that some people may have differing opinions on – either pure stylistic issues like whitespace or brace placement, or code that might seem risky/undesirable to some folks, but some people are willing to tolerate in their own code. 46 | 47 | If you disagree with any of the style vs problem judgments, feel free to bring them up in the `#eslint-config-working-group` Slack channel. 48 | 49 | You can include only the "problems" rules if you prefer: 50 | 51 | ```json 52 | { 53 | "extends": [ 54 | "@equipmentshare/es-base-js/problems.eslintrc.js" 55 | ] 56 | } 57 | ``` 58 | 59 | or just the "styles" rules: 60 | 61 | ```json 62 | { 63 | "extends": [ 64 | "@equipmentshare/es-base-js/styles.eslintrc.js" 65 | ] 66 | } 67 | ``` 68 | 69 | ## Warnings versus errors 70 | 71 | Issues that will cause parse errors or runtime exceptions are set to "error". Everything else is set to "warn". 72 | 73 | If you want eslint to return a non-zero exit code when it finds any warnings, use `eslint --max-warnings=0`. 74 | 75 | 76 | ## Contributing 77 | 78 | Want to contribute? Check out [CONTRIBUTING.md](./CONTRIBUTING.md) 79 | 80 | ## Creators 81 | 82 | The following people were involved in the creation of this config as well as the selection of rules contained within. 83 | 84 | - Josh Duff 85 | - Dylan Klohr 86 | - Steven Kolb 87 | - Brian Reynolds 88 | - Sarah Johnston 89 | - Troy Blank 90 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/index.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | './problems.eslintrc.js', 4 | './styles.eslintrc.js', 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "@equipmentshare/eslint-config-es-base-js@1", 3 | "_id": "@equipmentshare/eslint-config-es-base-js@1.0.0", 4 | "_inBundle": false, 5 | "_integrity": "sha512-/z2YAtF6MRUoAkeWLABtcdiLpEiNHmznZ+e0ivvf+GC6j4SDgcvIhSncNu8A0G3NsRA1fXTdeeXsqIHwjS6Fuw==", 6 | "_location": "/@equipmentshare/eslint-config-es-base-js", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "range", 10 | "registry": true, 11 | "raw": "@equipmentshare/eslint-config-es-base-js@1", 12 | "name": "@equipmentshare/eslint-config-es-base-js", 13 | "escapedName": "@equipmentshare%2feslint-config-es-base-js", 14 | "scope": "@equipmentshare", 15 | "rawSpec": "1", 16 | "saveSpec": null, 17 | "fetchSpec": "1" 18 | }, 19 | "_requiredBy": [ 20 | "#USER" 21 | ], 22 | "_resolved": "http://npm.internal.equipmentshare.com/@equipmentshare%2feslint-config-es-base-js/-/eslint-config-es-base-js-1.0.0.tgz", 23 | "_shasum": "ed3df7b8bf0782b3f96072b78555e2e4fff15c1b", 24 | "_spec": "@equipmentshare/eslint-config-es-base-js@1", 25 | "_where": "/Users/josh/code/date-range-input", 26 | "author": "", 27 | "bundleDependencies": false, 28 | "deprecated": false, 29 | "description": "A starting point for new JS package ESLint configurations at EquipmentShare.", 30 | "devDependencies": { 31 | "eslint": "^6.6.0" 32 | }, 33 | "homepage": "https://gitlab.internal.equipmentshare.com/fe-platform/eslint-config-es-base-js", 34 | "keywords": [ 35 | "eslint" 36 | ], 37 | "license": "UNLICENSED", 38 | "main": "index.eslintrc.js", 39 | "name": "@equipmentshare/eslint-config-es-base-js", 40 | "repository": { 41 | "type": "git", 42 | "url": "git@gitlab.internal.equipmentshare.com:es-frontend/eslint-config-es-base-js.git" 43 | }, 44 | "scripts": { 45 | "lint": "eslint . --ext .js,.ts", 46 | "test": "echo \"Error: no test specified :-x\" && exit 0" 47 | }, 48 | "version": "1.0.0" 49 | } 50 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/problems.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | 'getter-return': 'warn', 4 | 'no-async-promise-executor': 'warn', 5 | 'no-compare-neg-zero': 'warn', 6 | 'no-cond-assign': 'warn', 7 | 'no-console': 'warn', 8 | 'no-constant-condition': 'warn', 9 | 'no-control-regex': 'warn', 10 | 'no-debugger': 'warn', 11 | 'no-dupe-args': 'warn', 12 | 'no-dupe-keys': 'warn', 13 | 'no-duplicate-case': 'warn', 14 | 'no-empty': 'warn', 15 | 'no-empty-character-class': 'warn', 16 | 'no-ex-assign': 'warn', 17 | 'no-extra-boolean-cast': 'warn', 18 | 'no-extra-semi': 'warn', 19 | 'no-func-assign': 'warn', 20 | 'no-import-assign': 'error', 21 | 'no-invalid-regexp': 'error', 22 | 'no-irregular-whitespace': 'warn', 23 | 'no-misleading-character-class': 'warn', 24 | 'no-obj-calls': 'error', 25 | 'no-sparse-arrays': 'warn', 26 | 'no-template-curly-in-string': 'warn', 27 | 'no-unexpected-multiline': 'warn', 28 | 'no-unreachable': 'warn', 29 | 'no-unsafe-finally': 'warn', 30 | 'no-unsafe-negation': 'warn', 31 | 'use-isnan': 'warn', 32 | 'valid-typeof': 'warn', 33 | 'array-callback-return': 'warn', 34 | 'consistent-return': 'warn', 35 | 'default-param-last': 'warn', 36 | 'no-alert': 'warn', 37 | 'no-caller': 'warn', 38 | 'no-case-declarations': 'warn', 39 | 'no-empty-pattern': 'warn', 40 | 'no-extend-native': 'warn', 41 | 'no-fallthrough': 'warn', 42 | 'no-global-assign': 'warn', 43 | 'no-implicit-globals': 'warn', 44 | 'no-implied-eval': 'warn', 45 | 'no-invalid-this': 'warn', 46 | 'no-iterator': 'warn', 47 | 'no-lone-blocks': 'warn', 48 | 'no-loop-func': 'warn', 49 | 'no-new-wrappers': 'warn', 50 | 'no-octal-escape': 'warn', 51 | 'no-script-url': 'warn', 52 | 'no-self-compare': 'warn', 53 | 'no-unmodified-loop-condition': 'warn', 54 | 'no-unused-expressions': 'warn', 55 | 'no-unused-labels': 'warn', 56 | 'no-useless-call': 'warn', 57 | 'no-useless-catch': 'warn', 58 | 'no-with': 'warn', 59 | 'radix': 'warn', 60 | 'no-undef': 'error', 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /es-internal/eslint-config-es-base-js/styles.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | 'no-var': 'warn', 4 | 'no-regex-spaces': 'warn', 5 | 'class-methods-use-this': 'warn', 6 | 'curly': ['warn', 'all'], 7 | 'default-case': 'warn', 8 | 'dot-location': ['warn', 'property'], 9 | 'dot-notation': 'warn', 10 | 'eqeqeq': 'warn', 11 | 'no-floating-decimal': 'warn', 12 | 'no-multi-spaces': 'warn', 13 | 'no-multi-str': 'warn', 14 | 'no-new-func': 'warn', 15 | 'no-octal': 'warn', 16 | 'no-param-reassign': 'warn', 17 | 'no-proto': 'warn', 18 | 'no-self-assign': 'warn', 19 | 'no-sequences': 'warn', 20 | 'no-throw-literal': 'warn', 21 | 'no-useless-concat': 'warn', 22 | 'no-useless-escape': 'warn', 23 | 'no-useless-return': 'warn', 24 | 'no-void': 'warn', 25 | 'prefer-promise-reject-errors': 'warn', 26 | 'prefer-regex-literals': 'warn', 27 | 'require-await': 'warn', 28 | 'wrap-iife': 'warn', 29 | 'yoda': ['warn', 'never'], 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@equipmentshare/date-range-input", 3 | "description": "A user interface for inputting date ranges", 4 | "license": "MIT", 5 | "version": "2.1.0", 6 | "engines": { 7 | "node": ">=13" 8 | }, 9 | "type": "module", 10 | "main": "./bundle.js", 11 | "svelte": "src/DateRangeInput.svelte", 12 | "homepage": "https://github.com/EquipmentShare/date-range-input/#date-range-input", 13 | "repository": { 14 | "type": "git", 15 | "url": "git@github.com:EquipmentShare/date-range-input.git" 16 | }, 17 | "scripts": { 18 | "build": "run-s --print-label build-css build:js", 19 | "build:js": "rollup -c", 20 | "build-dev": "cross-env ENVIRONMENT=dev npm run build", 21 | "build-css": "cross-env OUTPUT_CSS_FILE=component.css npm run build:js", 22 | "update-gh-pages": "rm -rf public/build && rm -rf docs && npm run build-dev && cd public && cpy --parents ** ../docs", 23 | "dev:serve": "live-server public", 24 | "dev:watch:js": "npm run build:js -- -w", 25 | "dev": "run-p --print-label dev:**", 26 | "autoformat": "eslint rollup.config.js src/ --fix --ext .js,.svelte", 27 | "lint": "eslint rollup.config.js src/ --ext .js,.svelte", 28 | "test": "glob-module-file --pattern=\"src/**/*.test.js\" --importStar --format=es | node --input-type=module" 29 | }, 30 | "devDependencies": { 31 | "calendarize": "^1.1.0", 32 | "click-should-be-intercepted-for-navigation": "^1.0.0", 33 | "cpy-cli": "^2.0.0", 34 | "cross-env": "^6.0.3", 35 | "eslint": "^6.8.0", 36 | "eslint-plugin-svelte3": "^2.7.3", 37 | "glob-module-file": "^3.0.1", 38 | "live-server": "^1.2.1", 39 | "npm-run-all": "^4.1.5", 40 | "postcss-import": "^12.0.1", 41 | "rollup": "^1.12.0", 42 | "rollup-plugin-commonjs": "^10.0.0", 43 | "rollup-plugin-node-resolve": "^5.2.0", 44 | "rollup-plugin-svelte": "^5.0.3", 45 | "svelte": "^3.0.0", 46 | "svelte-preprocess-postcss": "^1.1.1", 47 | "zora": "^3.1.8" 48 | }, 49 | "dependencies": {} 50 | } 51 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EquipmentShare/date-range-input/f3a95c49ac187528fff2bcf0d36d7279234e2fe8/public/favicon.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | date-range-input test 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |

Date range picker

16 | 17 |

18 | Source 19 |

20 | 21 | 36 | 37 |

JS interface

38 |
39 | 40 | 41 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # date-range-input 2 | 3 | A user interface for inputting date ranges. 4 | 5 | **[Demo](https://equipmentshare.github.io/date-range-input/)** 6 | 7 | 8 | 9 | ## Install 10 | 11 | ```sh 12 | npm i @equipmentshare/date-range-input 13 | ``` 14 | 15 | ## How to use 16 | 17 | The date range input takes these properties. 18 | 19 | `start` and `end` are required. They must be an object with these numeric properties: `year`, `month`, and `day`. 20 | 21 | `visibleStartMonth` and `visibleEndMonth` are optional, for if you want to manually specify which month should be displayed in each calendar. They are an object with the numeric properties `year` and `month`. 22 | 23 | The component emits a `change` event with a `detail` property that is an object with `start` and `end` properties. Both dates are objects with `year`/`month`/`day` properties. 24 | 25 | ### As vanilla JS 26 | 27 | ```js 28 | import DateRangeInput from '@equipmentshare/date-range-input' 29 | 30 | const dateRangeInput = new DateRangeInput({ 31 | target: document.querySelector('div.date-range-input'), 32 | props: { 33 | start: { 34 | year: 2020, 35 | month: 1, 36 | day: 5, 37 | }, 38 | end: { 39 | year: 2020, 40 | month: 1, 41 | day: 18, 42 | }, 43 | visibleEndMonth: { 44 | year: 2020, 45 | month: 2 46 | } 47 | } 48 | }) 49 | 50 | dateRangeInput.$on('change', event => console.log(event.detail)) 51 | ``` 52 | 53 | ### As a Svelte component 54 | 55 | ```html 56 | 59 | 60 | console.log(event.detail) } 65 | > 66 | 67 | 68 | ``` 69 | 70 | ## How to test/develop 71 | 72 | ```sh 73 | npm run dev 74 | ``` 75 | 76 | Edit `src/TestApp.svelte` to play with the component. 77 | 78 | ## To consider 79 | 80 | A couple folks have said that they expected different behavior when they started a click-and-drag on an existing end-point. 81 | 82 | If this continues, we may want to experiment with different behavior when a drag starts on a current end-point – probably making it drag that end-point around, as opposed to the normal behavior of starting a new range selection 83 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from "rollup-plugin-svelte" 2 | import resolve from "rollup-plugin-node-resolve" 3 | import commonjs from "rollup-plugin-commonjs" 4 | import sveltePreprocessPostcss from "svelte-preprocess-postcss" 5 | import postcssImport from "postcss-import" 6 | 7 | const stylePreprocessor = sveltePreprocessPostcss({ 8 | useConfigFile: false, 9 | plugins: [ 10 | postcssImport({ 11 | path: "src", 12 | }), 13 | ], 14 | }) 15 | 16 | const customElement = process.env.OUTPUT === "custom-element" 17 | const devMode = !!process.env.ROLLUP_WATCH || process.env.ENVIRONMENT === 'dev' 18 | const outputCssFile = process.env.OUTPUT_CSS_FILE || false 19 | const testApp = devMode && !customElement 20 | 21 | const outputFileName = customElement 22 | ? "custom-element.js" 23 | : "bundle.js" 24 | 25 | const outputPath = devMode 26 | ? "./public/build/" + outputFileName 27 | : "./" + outputFileName 28 | 29 | const extraSvelteOptions = outputCssFile 30 | ? { 31 | cssOutputFilename: outputCssFile, 32 | css: css => css.write(outputCssFile), 33 | } 34 | : {} 35 | 36 | const componentConfig = { 37 | input: "src/DateRangeInput.svelte", 38 | output: { 39 | sourcemap: true, 40 | format: "esm", 41 | name: "DateRangeInput", 42 | file: outputPath, 43 | }, 44 | plugins: [ 45 | svelte({ 46 | dev: devMode, 47 | preprocess: { 48 | style: stylePreprocessor, 49 | }, 50 | customElement, 51 | tag: "date-range-input", 52 | onwarn: (warning, handler) => { 53 | if (warning.code === "missing-custom-element-compile-options") { 54 | return 55 | } 56 | 57 | handler(warning) 58 | }, 59 | ...extraSvelteOptions 60 | }), 61 | resolve({ 62 | browser: true, 63 | dedupe: importee => importee === "svelte" || importee.startsWith("svelte/"), 64 | }), 65 | commonjs(), 66 | ], 67 | watch: { 68 | clearScreen: false, 69 | }, 70 | } 71 | 72 | const testAppConfig = { 73 | input: "src/test-app.js", 74 | output: { 75 | sourcemap: true, 76 | format: "iife", 77 | name: "DateRangeInputTestApp", 78 | file: outputPath, 79 | }, 80 | external: [], 81 | } 82 | 83 | export default testApp 84 | ? Object.assign(componentConfig, testAppConfig) 85 | : componentConfig 86 | -------------------------------------------------------------------------------- /src/DateRangeInput.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 135 | 136 |
137 | mouseoverDate = startMouseDown = date} 142 | on:mouseoverDate={onMouseoverDate} 143 | on:mouseupDate={onMouseupDate} 144 | on:daySelected={onStartDaySelected} 145 | 146 | bind:visibleMonth={visibleStartMonth} 147 | > 148 | 149 | mouseoverDate = endMouseDown = date} 154 | on:mouseoverDate={onMouseoverDate} 155 | on:mouseupDate={onMouseupDate} 156 | on:daySelected={onEndDaySelected} 157 | 158 | bind:visibleMonth={visibleEndMonth} 159 | > 160 |
161 | 162 | 174 | -------------------------------------------------------------------------------- /src/Month.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 80 | 81 |
82 |
83 | 84 | {getMonthName(visibleMonth.month)} {visibleMonth.year} 85 | 86 | 87 | 90 | 93 | 94 |
95 |
96 | {#each daysOfTheWeek as dayOfTheWeek} 97 | 98 | {dayOfTheWeek} 99 | 100 | {/each} 101 |
102 |
103 | {#each visibleWeeks as week} 104 |
105 | {#each week as visibleDate} 106 | {#if visibleDate === null} 107 | 108 | 109 | 110 | {:else} 111 | 114 | 139 | 140 | {/if} 141 | {/each} 142 |
143 | {/each} 144 |
145 |
146 | 147 | 252 | -------------------------------------------------------------------------------- /src/TestApp.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 22 | 23 | 28 | 29 |
30 | 31 | changes = [...changes, range] } 37 | > 38 | 39 |
40 | 50 |
51 | -------------------------------------------------------------------------------- /src/css/elements/button.css: -------------------------------------------------------------------------------- 1 | @import "../tokens/text.css"; 2 | @import "../tokens/color.css"; 3 | @import "../tokens/size.css"; 4 | 5 | .button.primary { 6 | --color: var(--color-theme-white); 7 | --background-color: var(--color-ui-primary); 8 | } 9 | 10 | .button[disabled]{ 11 | --border-color: var(--color-theme-gray-lighter); 12 | --color: var(--color-theme-gray-lighter); 13 | } 14 | 15 | .button.primary[disabled] { 16 | --color: var(--color-theme-offwhite); 17 | --background-color: var(--color-theme-gray-lighter); 18 | } 19 | 20 | .button { 21 | --color: var(--color-ui-primary); 22 | --border-color: var(--color-ui-primary); 23 | --background-color: var(--color-theme-white); 24 | 25 | color: var(--color); 26 | background-color: var(--background-color); 27 | border: var(--border-width) solid var(--border-color); 28 | border-radius: var(--border-radius); 29 | display: flex; 30 | align-items: center; 31 | padding: var(--size-half) var(--size-base); 32 | white-space: nowrap; 33 | font-family: var(--text-font-family); 34 | font-size: var(--text-font-size-base); 35 | line-height: var(--text-font-size-base); 36 | height: var(--control-height); 37 | } 38 | 39 | .button:focus { 40 | box-shadow: 0 0 0 var(--size-quarter) var(--color-theme-gray-lightest); 41 | outline: none; 42 | } 43 | -------------------------------------------------------------------------------- /src/css/elements/header.css: -------------------------------------------------------------------------------- 1 | @import '../tokens/color.css'; 2 | @import '../tokens/size.css'; 3 | 4 | .header { 5 | background-color: var(--color-theme-white); 6 | padding: var(--size-base); 7 | border-bottom: 1px solid var(--color-theme-mute); 8 | box-shadow: 1px 1px 1px var(--color-theme-mute); 9 | } 10 | -------------------------------------------------------------------------------- /src/css/elements/hr.css: -------------------------------------------------------------------------------- 1 | @import "../tokens/size.css"; 2 | @import "../tokens/color.css"; 3 | 4 | .hr { 5 | border: none; 6 | border-top: 1px solid var(--color-theme-gray-lighter); 7 | margin: var(--size-half) 0; 8 | } 9 | -------------------------------------------------------------------------------- /src/css/elements/input.css: -------------------------------------------------------------------------------- 1 | @import "../tokens/color.css"; 2 | @import "../tokens/size.css"; 3 | @import "../tokens/text.css"; 4 | 5 | .input[type=date], .input[type=time], .input[type=number], .input[type=email], .input[type=password], .input[type=search], .input[type=tel], .input[type=text], .input[type=url] { 6 | --border-color: var(--color-theme-gray-lighter); 7 | 8 | border: var(--border-width) solid var(--border-color); 9 | border-radius: var(--border-radius); 10 | 11 | padding: var(--size-half) var(--size-base); 12 | font-family: var(--text-font-family); 13 | font-size: var(--text-font-size-base); 14 | line-height: var(--text-font-size-base); 15 | height: var(--control-height); 16 | } 17 | 18 | .input[type=date]:focus, .input[type=time]:focus, .input[type=number]:focus, .input[type=email]:focus, .input[type=password]:focus, .input[type=search]:focus, .input[type=tel]:focus, .input[type=text]:focus, .input[type=url]:focus { 19 | box-shadow: 0 0 0 var(--size-quarter) var(--color-theme-gray-lightest); 20 | outline: none; 21 | } 22 | 23 | .input[type=date]:invalid, .input[type=time]:invalid, .input[type=number]:invalid, .input[type=email]:invalid, .input[type=password]:invalid, .input[type=search]:invalid, .input[type=tel]:invalid, .input[type=text]:invalid, .input[type=url]:invalid { 24 | box-shadow: 0 0 0 var(--size-quarter) var(--color-theme-red); 25 | outline: none; 26 | } 27 | -------------------------------------------------------------------------------- /src/css/elements/label.css: -------------------------------------------------------------------------------- 1 | @import "../tokens/size.css"; 2 | @import "../tokens/text.css"; 3 | 4 | .label { 5 | line-height: var(--text-font-size-base); 6 | display: flex; 7 | justify-content: space-between; 8 | flex-direction: column; 9 | padding-top: var(--size-base); 10 | } 11 | 12 | .label.short { 13 | padding-top: 0; 14 | } 15 | 16 | .label > * { 17 | /* 18 | This adds separation above the control to put a bit of space between it and 19 | the .label text – the amount of the space is calculated so that between the 20 | non-short padding above and the text size, the .label text will be given as much 21 | vertical space as the --control-height 22 | */ 23 | margin-top: calc(var(--control-height) - var(--text-font-size-base) - var(--size-base)); 24 | } 25 | -------------------------------------------------------------------------------- /src/css/elements/section.css: -------------------------------------------------------------------------------- 1 | @import '../tokens/color.css'; 2 | @import '../tokens/size.css'; 3 | 4 | .section { 5 | background-color: var(--color-theme-white); 6 | padding: var(--size-base); 7 | border: 1px solid var(--color-theme-mute); 8 | border-radius: 2px; 9 | box-shadow: 1px 1px 1px var(--color-theme-mute); 10 | } 11 | -------------------------------------------------------------------------------- /src/css/elements/select.css: -------------------------------------------------------------------------------- 1 | @import "../tokens/text.css"; 2 | @import "../tokens/color.css"; 3 | @import "../tokens/size.css"; 4 | 5 | .select[disabled]{ 6 | --border-color: var(--color-theme-gray-lighter); 7 | --color: var(--color-theme-gray-lighter); 8 | } 9 | 10 | .select { 11 | --color: var(--color-brand-primary); 12 | --border-color: var(--color-theme-gray); 13 | --background-color: var(--color-theme-white); 14 | 15 | color: var(--color); 16 | background-color: var(--background-color); 17 | border: var(--border-width) solid var(--border-color); 18 | border-radius: var(--border-radius); 19 | 20 | padding: var(--size-half) var(--size-base); 21 | padding-right: 25px; 22 | font-family: var(--text-font-family); 23 | font-size: var(--text-font-size-base); 24 | line-height: var(--text-font-size-base); 25 | height: var(--control-height); 26 | 27 | -moz-appearance: none; 28 | appearance: none; 29 | -webkit-appearance: none; 30 | 31 | background-position: right 5px top 50%; 32 | background-repeat: no-repeat; 33 | background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+DQo8cGF0aCBkPSJtIDEzLDYgLTUsNSAtNSwtNSB6IiBmaWxsPSIjNzk3OTc5Ii8+DQo8L3N2Zz4="); 34 | } 35 | 36 | .select:focus { 37 | box-shadow: 0 0 0 var(--size-quarter) var(--color-theme-gray-lightest); 38 | outline: none; 39 | } 40 | -------------------------------------------------------------------------------- /src/css/elements/table.css: -------------------------------------------------------------------------------- 1 | @import '../tokens/color.css'; 2 | @import '../tokens/size.css'; 3 | 4 | .table { 5 | border-collapse: collapse; 6 | color: var(--color-brand-primary); 7 | width: 100%; 8 | } 9 | 10 | .table th, .table td { 11 | padding: var(--size-half); 12 | border: 1px solid var(--color-theme-mute); 13 | white-space: nowrap; 14 | } 15 | 16 | .table th { 17 | text-transform: uppercase; 18 | text-align: left; 19 | background-color: var(--color-theme-offwhite); 20 | } 21 | 22 | .table th.numeric, .table td.numeric { 23 | text-align: right; 24 | font-variant-numeric: tabular-nums; 25 | } 26 | 27 | .table tr:hover { 28 | background-color: var(--color-theme-offwhite); 29 | } 30 | -------------------------------------------------------------------------------- /src/css/reset.css: -------------------------------------------------------------------------------- 1 | /* @import "https://fonts.googleapis.com/css?family=Roboto:400,700"; */ 2 | @import './tokens/text.css'; 3 | 4 | * { 5 | box-sizing: border-box; 6 | } 7 | 8 | body, :host { 9 | font-family: var(--text-font-family); 10 | font-size: var(--text-font-size-base); 11 | } 12 | -------------------------------------------------------------------------------- /src/css/tokens/color.css: -------------------------------------------------------------------------------- 1 | :root, :host { 2 | --color-brand-primary: #616161; 3 | --color-brand-secondary: #424242; 4 | 5 | --color-ui-primary: #00adee; 6 | --color-ui-es-orange: #f6911e; 7 | 8 | --color-theme-default: #616161; 9 | --color-theme-white: #ffffff; 10 | --color-theme-offwhite: #fafafa; 11 | --color-theme-gray: #9e9e9e; 12 | --color-theme-gray-lighter: #bdbdbd; 13 | --color-theme-gray-lightest: #d0d0d0; 14 | --color-theme-charcoal: #232323; 15 | --color-theme-black: #000000; 16 | --color-theme-mute: #e0e0e0; 17 | --color-theme-green: #63a83c; 18 | --color-theme-red: #dd1a22; 19 | --color-theme-purple: #7e4ceb; 20 | --color-theme-orange: #f6911e; 21 | 22 | --section-container-background-color: var(--color-theme-offwhite); 23 | } 24 | 25 | /* 26 | At some point we need token names that imply how the colors should be used. 27 | 28 | Ideas: "error" and "cancel" for how we use red now 29 | "success" and "valid" for green 30 | */ 31 | -------------------------------------------------------------------------------- /src/css/tokens/size.css: -------------------------------------------------------------------------------- 1 | :root, :host { 2 | --size-unit: 4px; 3 | 4 | --size-quarter: var(--size-unit); 5 | --size-half: calc(var(--size-unit) * 2); 6 | --size-base: calc(var(--size-unit) * 4); 7 | --size-double: calc(var(--size-unit) * 8); 8 | 9 | --border-width: 1px; 10 | --border-radius: var(--size-quarter); 11 | 12 | --size-default-spacing: var(--size-half); 13 | 14 | --control-height: calc(var(--size-unit) * 9); 15 | } 16 | -------------------------------------------------------------------------------- /src/css/tokens/text.css: -------------------------------------------------------------------------------- 1 | @import './size.css'; 2 | 3 | :root, :host { 4 | --text-font-size-small: calc(var(--size-base) * .75); 5 | --text-font-size-base: var(--size-base); 6 | --text-font-family: Roboto, sans-serif; 7 | --text-font-weight-base: 400; 8 | --text-font-weight-bold: 700; 9 | } 10 | -------------------------------------------------------------------------------- /src/date-object.js: -------------------------------------------------------------------------------- 1 | export const datesMatch = (a, b) => a.year === b.year 2 | && a.month === b.month 3 | && a.day === b.day 4 | 5 | export const dateGt = (a, b) => { 6 | if (a.year === b.year && a.month === b.month) { 7 | return a.day > b.day 8 | } else if (a.year === b.year) { 9 | return a.month > b.month 10 | } else { 11 | return a.year > b.year 12 | } 13 | } 14 | 15 | export const dateGte = (a, b) => dateGt(a, b) || datesMatch(a, b) 16 | 17 | export const dateLt = (a, b) => !dateGte(a, b) 18 | 19 | export const dateLte = (a, b) => dateLt(a, b) || datesMatch(a, b) 20 | 21 | -------------------------------------------------------------------------------- /src/get-days-of-the-week.js: -------------------------------------------------------------------------------- 1 | const anArbitrarySundayEarlyInTheMonth = new Date(2020, 0, 5) 2 | const dayNumbers = [ 0, 1, 2, 3, 4, 5, 6 ] 3 | 4 | let daysOfWeek = null 5 | 6 | export default () => { 7 | if (!daysOfWeek) { 8 | const formatter = new Intl.DateTimeFormat(undefined, { 9 | weekday: `short`, 10 | }) 11 | 12 | daysOfWeek = dayNumbers.map(dayNumber => { 13 | const date = new Date(anArbitrarySundayEarlyInTheMonth) 14 | date.setDate(date.getDate() + dayNumber) 15 | return formatter.format(date) 16 | }) 17 | } 18 | 19 | return daysOfWeek 20 | } 21 | -------------------------------------------------------------------------------- /src/get-month-name.js: -------------------------------------------------------------------------------- 1 | let monthNames = null 2 | const getMonthNames = () => { 3 | if (!monthNames) { 4 | const formatter = new Intl.DateTimeFormat(undefined, { 5 | month: `long`, 6 | }) 7 | 8 | const zeroThroughEleven = new Array(12).fill(null).map((_, i) => i) 9 | 10 | monthNames = zeroThroughEleven.map(jsDateMonthNumber => formatter.format(new Date(2020, jsDateMonthNumber))) 11 | } 12 | 13 | return monthNames 14 | } 15 | 16 | export default monthNumber => { 17 | if (monthNumber < 1 || monthNumber > 12) { 18 | throw new Error(`getMonthName argument must be between 1 and 12 – you passed in ${monthNumber}`) 19 | } 20 | 21 | return getMonthNames()[monthNumber - 1] 22 | } 23 | -------------------------------------------------------------------------------- /src/test-app.js: -------------------------------------------------------------------------------- 1 | import App from "./TestApp.svelte" 2 | 3 | const app = new App({ 4 | target: document.getElementById("test-app-target"), 5 | }) 6 | 7 | export default app 8 | -------------------------------------------------------------------------------- /update-internal-dependencies.sh: -------------------------------------------------------------------------------- 1 | rm -rf src/css 2 | npm --no-save --registry=http://npm.internal.equipmentshare.com i @equipmentshare/es-foundation 3 | npx foundation --targetDirectory=src/css 4 | 5 | rm -rf es-internal 6 | npm --no-save --registry=http://npm.internal.equipmentshare.com i @equipmentshare/eslint-config-es-base-js@1 7 | cd node_modules/\@equipmentshare/ 8 | npx cpy --parents ** ../../es-internal 9 | cd ../../ 10 | --------------------------------------------------------------------------------