UNPKG

carbon-components-svelte

Version:
2,017 lines (1,838 loc) 1.9 MB
import flatpickr from 'flatpickr'; /** @returns {void} */ function noop() {} const identity = (x) => x; /** * @template T * @template S * @param {T} tar * @param {S} src * @returns {T & S} */ function assign(tar, src) { // @ts-ignore for (const k in src) tar[k] = src[k]; return /** @type {T & S} */ (tar); } function run(fn) { return fn(); } function blank_object() { return Object.create(null); } /** * @param {Function[]} fns * @returns {void} */ function run_all(fns) { fns.forEach(run); } /** * @param {any} thing * @returns {thing is Function} */ function is_function(thing) { return typeof thing === 'function'; } /** @returns {boolean} */ function safe_not_equal(a, b) { return a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function'; } let src_url_equal_anchor; /** * @param {string} element_src * @param {string} url * @returns {boolean} */ function src_url_equal(element_src, url) { if (element_src === url) return true; if (!src_url_equal_anchor) { src_url_equal_anchor = document.createElement('a'); } // This is actually faster than doing URL(..).href src_url_equal_anchor.href = url; return element_src === src_url_equal_anchor.href; } /** @returns {boolean} */ function is_empty(obj) { return Object.keys(obj).length === 0; } function subscribe(store, ...callbacks) { if (store == null) { for (const callback of callbacks) { callback(undefined); } return noop; } const unsub = store.subscribe(...callbacks); return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; } /** @returns {void} */ function component_subscribe(component, store, callback) { component.$$.on_destroy.push(subscribe(store, callback)); } function create_slot(definition, ctx, $$scope, fn) { if (definition) { const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); return definition[0](slot_ctx); } } function get_slot_context(definition, ctx, $$scope, fn) { return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx; } function get_slot_changes(definition, $$scope, dirty, fn) { if (definition[2] && fn) { const lets = definition[2](fn(dirty)); if ($$scope.dirty === undefined) { return lets; } if (typeof lets === 'object') { const merged = []; const len = Math.max($$scope.dirty.length, lets.length); for (let i = 0; i < len; i += 1) { merged[i] = $$scope.dirty[i] | lets[i]; } return merged; } return $$scope.dirty | lets; } return $$scope.dirty; } /** @returns {void} */ function update_slot_base( slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn ) { if (slot_changes) { const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); slot.p(slot_context, slot_changes); } } /** @returns {any[] | -1} */ function get_all_dirty_from_scope($$scope) { if ($$scope.ctx.length > 32) { const dirty = []; const length = $$scope.ctx.length / 32; for (let i = 0; i < length; i++) { dirty[i] = -1; } return dirty; } return -1; } /** @returns {{}} */ function exclude_internal_props(props) { const result = {}; for (const k in props) if (k[0] !== '$') result[k] = props[k]; return result; } /** @returns {{}} */ function compute_rest_props(props, keys) { const rest = {}; keys = new Set(keys); for (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k]; return rest; } /** @returns {{}} */ function compute_slots(slots) { const result = {}; for (const key in slots) { result[key] = true; } return result; } function set_store_value(store, ret, value) { store.set(value); return ret; } const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable']; const is_client = typeof window !== 'undefined'; /** @type {() => number} */ let now = is_client ? () => window.performance.now() : () => Date.now(); let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; const tasks = new Set(); /** * @param {number} now * @returns {void} */ function run_tasks(now) { tasks.forEach((task) => { if (!task.c(now)) { tasks.delete(task); task.f(); } }); if (tasks.size !== 0) raf(run_tasks); } /** * Creates a new task that runs on each raf frame * until it returns a falsy value or is aborted * @param {import('./private.js').TaskCallback} callback * @returns {import('./private.js').Task} */ function loop(callback) { /** @type {import('./private.js').TaskEntry} */ let task; if (tasks.size === 0) raf(run_tasks); return { promise: new Promise((fulfill) => { tasks.add((task = { c: callback, f: fulfill })); }), abort() { tasks.delete(task); } }; } /** @type {typeof globalThis} */ const globals = typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : // @ts-ignore Node typings have this global; /** * @param {Node} target * @param {Node} node * @returns {void} */ function append(target, node) { target.appendChild(node); } /** * @param {Node} target * @param {string} style_sheet_id * @param {string} styles * @returns {void} */ function append_styles(target, style_sheet_id, styles) { const append_styles_to = get_root_for_style(target); if (!append_styles_to.getElementById(style_sheet_id)) { const style = element('style'); style.id = style_sheet_id; style.textContent = styles; append_stylesheet(append_styles_to, style); } } /** * @param {Node} node * @returns {ShadowRoot | Document} */ function get_root_for_style(node) { if (!node) return document; const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; if (root && /** @type {ShadowRoot} */ (root).host) { return /** @type {ShadowRoot} */ (root); } return node.ownerDocument; } /** * @param {Node} node * @returns {CSSStyleSheet} */ function append_empty_stylesheet(node) { const style_element = element('style'); // For transitions to work without 'style-src: unsafe-inline' Content Security Policy, // these empty tags need to be allowed with a hash as a workaround until we move to the Web Animations API. // Using the hash for the empty string (for an empty tag) works in all browsers except Safari. // So as a workaround for the workaround, when we append empty style tags we set their content to /* empty */. // The hash 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc=' will then work even in Safari. style_element.textContent = '/* empty */'; append_stylesheet(get_root_for_style(node), style_element); return style_element.sheet; } /** * @param {ShadowRoot | Document} node * @param {HTMLStyleElement} style * @returns {CSSStyleSheet} */ function append_stylesheet(node, style) { append(/** @type {Document} */ (node).head || node, style); return style.sheet; } /** * @param {Node} target * @param {Node} node * @param {Node} [anchor] * @returns {void} */ function insert(target, node, anchor) { target.insertBefore(node, anchor || null); } /** * @param {Node} node * @returns {void} */ function detach(node) { if (node.parentNode) { node.parentNode.removeChild(node); } } /** * @returns {void} */ function destroy_each(iterations, detaching) { for (let i = 0; i < iterations.length; i += 1) { if (iterations[i]) iterations[i].d(detaching); } } /** * @template {keyof HTMLElementTagNameMap} K * @param {K} name * @returns {HTMLElementTagNameMap[K]} */ function element(name) { return document.createElement(name); } /** * @template {keyof SVGElementTagNameMap} K * @param {K} name * @returns {SVGElement} */ function svg_element(name) { return document.createElementNS('http://www.w3.org/2000/svg', name); } /** * @param {string} data * @returns {Text} */ function text(data) { return document.createTextNode(data); } /** * @returns {Text} */ function space() { return text(' '); } /** * @returns {Text} */ function empty() { return text(''); } /** * @param {EventTarget} node * @param {string} event * @param {EventListenerOrEventListenerObject} handler * @param {boolean | AddEventListenerOptions | EventListenerOptions} [options] * @returns {() => void} */ function listen(node, event, handler, options) { node.addEventListener(event, handler, options); return () => node.removeEventListener(event, handler, options); } /** * @returns {(event: any) => any} */ function prevent_default(fn) { return function (event) { event.preventDefault(); // @ts-ignore return fn.call(this, event); }; } /** * @returns {(event: any) => any} */ function stop_propagation(fn) { return function (event) { event.stopPropagation(); // @ts-ignore return fn.call(this, event); }; } /** * @param {Element} node * @param {string} attribute * @param {string} [value] * @returns {void} */ function attr(node, attribute, value) { if (value == null) node.removeAttribute(attribute); else if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value); } /** * List of attributes that should always be set through the attr method, * because updating them through the property setter doesn't work reliably. * In the example of `width`/`height`, the problem is that the setter only * accepts numeric values, but the attribute can also be set to a string like `50%`. * If this list becomes too big, rethink this approach. */ const always_set_through_set_attribute = ['width', 'height']; /** * @param {Element & ElementCSSInlineStyle} node * @param {{ [x: string]: string }} attributes * @returns {void} */ function set_attributes(node, attributes) { // @ts-ignore const descriptors = Object.getOwnPropertyDescriptors(node.__proto__); for (const key in attributes) { if (attributes[key] == null) { node.removeAttribute(key); } else if (key === 'style') { node.style.cssText = attributes[key]; } else if (key === '__value') { /** @type {any} */ (node).value = node[key] = attributes[key]; } else if ( descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1 ) { node[key] = attributes[key]; } else { attr(node, key, attributes[key]); } } } /** * @param {Element & ElementCSSInlineStyle} node * @param {{ [x: string]: string }} attributes * @returns {void} */ function set_svg_attributes(node, attributes) { for (const key in attributes) { attr(node, key, attributes[key]); } } /** * @param {Element} element * @returns {ChildNode[]} */ function children(element) { return Array.from(element.childNodes); } /** * @param {Text} text * @param {unknown} data * @returns {void} */ function set_data(text, data) { data = '' + data; if (text.data === data) return; text.data = /** @type {string} */ (data); } /** * @param {Text} text * @param {unknown} data * @returns {void} */ function set_data_contenteditable(text, data) { data = '' + data; if (text.wholeText === data) return; text.data = /** @type {string} */ (data); } /** * @param {Text} text * @param {unknown} data * @param {string} attr_value * @returns {void} */ function set_data_maybe_contenteditable(text, data, attr_value) { if (~contenteditable_truthy_values.indexOf(attr_value)) { set_data_contenteditable(text, data); } else { set_data(text, data); } } /** * @returns {void} */ function set_input_value(input, value) { input.value = value == null ? '' : value; } /** * @returns {void} */ function set_style(node, key, value, important) { if (value == null) { node.style.removeProperty(key); } else { node.style.setProperty(key, value, important ? 'important' : ''); } } /** * @returns {void} */ function select_option(select, value, mounting) { for (let i = 0; i < select.options.length; i += 1) { const option = select.options[i]; if (option.__value === value) { option.selected = true; return; } } if (!mounting || value !== undefined) { select.selectedIndex = -1; // no option should be selected } } /** * @returns {void} */ function toggle_class(element, name, toggle) { // The `!!` is required because an `undefined` flag means flipping the current state. element.classList.toggle(name, !!toggle); } /** * @template T * @param {string} type * @param {T} [detail] * @param {{ bubbles?: boolean, cancelable?: boolean }} [options] * @returns {CustomEvent<T>} */ function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) { return new CustomEvent(type, { detail, bubbles, cancelable }); } /** */ class HtmlTag { /** * @private * @default false */ is_svg = false; /** parent for creating node */ e = undefined; /** html tag nodes */ n = undefined; /** target */ t = undefined; /** anchor */ a = undefined; constructor(is_svg = false) { this.is_svg = is_svg; this.e = this.n = null; } /** * @param {string} html * @returns {void} */ c(html) { this.h(html); } /** * @param {string} html * @param {HTMLElement | SVGElement} target * @param {HTMLElement | SVGElement} anchor * @returns {void} */ m(html, target, anchor = null) { if (!this.e) { if (this.is_svg) this.e = svg_element(/** @type {keyof SVGElementTagNameMap} */ (target.nodeName)); /** #7364 target for <template> may be provided as #document-fragment(11) */ else this.e = element( /** @type {keyof HTMLElementTagNameMap} */ ( target.nodeType === 11 ? 'TEMPLATE' : target.nodeName ) ); this.t = target.tagName !== 'TEMPLATE' ? target : /** @type {HTMLTemplateElement} */ (target).content; this.c(html); } this.i(anchor); } /** * @param {string} html * @returns {void} */ h(html) { this.e.innerHTML = html; this.n = Array.from( this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes ); } /** * @returns {void} */ i(anchor) { for (let i = 0; i < this.n.length; i += 1) { insert(this.t, this.n[i], anchor); } } /** * @param {string} html * @returns {void} */ p(html) { this.d(); this.h(html); this.i(this.a); } /** * @returns {void} */ d() { this.n.forEach(detach); } } function construct_svelte_component(component, props) { return new component(props); } /** * @typedef {Node & { * claim_order?: number; * hydrate_init?: true; * actual_end_child?: NodeEx; * childNodes: NodeListOf<NodeEx>; * }} NodeEx */ /** @typedef {ChildNode & NodeEx} ChildNodeEx */ /** @typedef {NodeEx & { claim_order: number }} NodeEx2 */ /** * @typedef {ChildNodeEx[] & { * claim_info?: { * last_index: number; * total_claimed: number; * }; * }} ChildNodeArray */ // we need to store the information for multiple documents because a Svelte application could also contain iframes // https://github.com/sveltejs/svelte/issues/3624 /** @type {Map<Document | ShadowRoot, import('./private.d.ts').StyleInformation>} */ const managed_styles = new Map(); let active = 0; // https://github.com/darkskyapp/string-hash/blob/master/index.js /** * @param {string} str * @returns {number} */ function hash(str) { let hash = 5381; let i = str.length; while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i); return hash >>> 0; } /** * @param {Document | ShadowRoot} doc * @param {Element & ElementCSSInlineStyle} node * @returns {{ stylesheet: any; rules: {}; }} */ function create_style_information(doc, node) { const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; managed_styles.set(doc, info); return info; } /** * @param {Element & ElementCSSInlineStyle} node * @param {number} a * @param {number} b * @param {number} duration * @param {number} delay * @param {(t: number) => number} ease * @param {(t: number, u: number) => string} fn * @param {number} uid * @returns {string} */ function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) { const step = 16.666 / duration; let keyframes = '{\n'; for (let p = 0; p <= 1; p += step) { const t = a + (b - a) * ease(p); keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; } const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; const name = `__svelte_${hash(rule)}_${uid}`; const doc = get_root_for_style(node); const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node); if (!rules[name]) { rules[name] = true; stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length); } const animation = node.style.animation || ''; node.style.animation = `${ animation ? `${animation}, ` : '' }${name} ${duration}ms linear ${delay}ms 1 both`; active += 1; return name; } /** * @param {Element & ElementCSSInlineStyle} node * @param {string} [name] * @returns {void} */ function delete_rule(node, name) { const previous = (node.style.animation || '').split(', '); const next = previous.filter( name ? (anim) => anim.indexOf(name) < 0 // remove specific animation : (anim) => anim.indexOf('__svelte') === -1 // remove all Svelte animations ); const deleted = previous.length - next.length; if (deleted) { node.style.animation = next.join(', '); active -= deleted; if (!active) clear_rules(); } } /** @returns {void} */ function clear_rules() { raf(() => { if (active) return; managed_styles.forEach((info) => { const { ownerNode } = info.stylesheet; // there is no ownerNode if it runs on jsdom. if (ownerNode) detach(ownerNode); }); managed_styles.clear(); }); } let current_component; /** @returns {void} */ function set_current_component(component) { current_component = component; } function get_current_component() { if (!current_component) throw new Error('Function called outside component initialization'); return current_component; } /** * Creates an event dispatcher that can be used to dispatch [component events](https://svelte.dev/docs#template-syntax-component-directives-on-eventname). * Event dispatchers are functions that can take two arguments: `name` and `detail`. * * Component events created with `createEventDispatcher` create a * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent). * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture). * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail) * property and can contain any type of data. * * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument: * ```ts * const dispatch = createEventDispatcher<{ * loaded: never; // does not take a detail argument * change: string; // takes a detail argument of type string, which is required * optional: number | null; // takes an optional detail argument of type number * }>(); * ``` * * https://svelte.dev/docs/svelte#createeventdispatcher * @template {Record<string, any>} [EventMap=any] * @returns {import('./public.js').EventDispatcher<EventMap>} */ function createEventDispatcher() { const component = get_current_component(); return (type, detail, { cancelable = false } = {}) => { const callbacks = component.$$.callbacks[type]; if (callbacks) { // TODO are there situations where events could be dispatched // in a server (non-DOM) environment? const event = custom_event(/** @type {string} */ (type), detail, { cancelable }); callbacks.slice().forEach((fn) => { fn.call(component, event); }); return !event.defaultPrevented; } return true; }; } /** * Associates an arbitrary `context` object with the current component and the specified `key` * and returns that object. The context is then available to children of the component * (including slotted content) with `getContext`. * * Like lifecycle functions, this must be called during component initialisation. * * https://svelte.dev/docs/svelte#setcontext * @template T * @param {any} key * @param {T} context * @returns {T} */ function setContext(key, context) { get_current_component().$$.context.set(key, context); return context; } /** * Retrieves the context that belongs to the closest parent component with the specified `key`. * Must be called during component initialisation. * * https://svelte.dev/docs/svelte#getcontext * @template T * @param {any} key * @returns {T} */ function getContext(key) { return get_current_component().$$.context.get(key); } // TODO figure out if we still want to support // shorthand events, or if we want to implement // a real bubbling mechanism /** * @param component * @param event * @returns {void} */ function bubble(component, event) { const callbacks = component.$$.callbacks[event.type]; if (callbacks) { // @ts-ignore callbacks.slice().forEach((fn) => fn.call(this, event)); } } const dirty_components = []; const binding_callbacks = []; let render_callbacks = []; const flush_callbacks = []; const resolved_promise = /* @__PURE__ */ Promise.resolve(); let update_scheduled = false; /** @returns {void} */ function schedule_update() { if (!update_scheduled) { update_scheduled = true; resolved_promise.then(flush); } } /** @returns {Promise<void>} */ function tick() { schedule_update(); return resolved_promise; } /** @returns {void} */ function add_render_callback(fn) { render_callbacks.push(fn); } /** @returns {void} */ function add_flush_callback(fn) { flush_callbacks.push(fn); } // flush() calls callbacks in this order: // 1. All beforeUpdate callbacks, in order: parents before children // 2. All bind:this callbacks, in reverse order: children before parents. // 3. All afterUpdate callbacks, in order: parents before children. EXCEPT // for afterUpdates called during the initial onMount, which are called in // reverse order: children before parents. // Since callbacks might update component values, which could trigger another // call to flush(), the following steps guard against this: // 1. During beforeUpdate, any updated components will be added to the // dirty_components array and will cause a reentrant call to flush(). Because // the flush index is kept outside the function, the reentrant call will pick // up where the earlier call left off and go through all dirty components. The // current_component value is saved and restored so that the reentrant call will // not interfere with the "parent" flush() call. // 2. bind:this callbacks cannot trigger new flush() calls. // 3. During afterUpdate, any updated components will NOT have their afterUpdate // callback called a second time; the seen_callbacks set, outside the flush() // function, guarantees this behavior. const seen_callbacks = new Set(); let flushidx = 0; // Do *not* move this inside the flush() function /** @returns {void} */ function flush() { // Do not reenter flush while dirty components are updated, as this can // result in an infinite loop. Instead, let the inner flush handle it. // Reentrancy is ok afterwards for bindings etc. if (flushidx !== 0) { return; } const saved_component = current_component; do { // first, call beforeUpdate functions // and update components try { while (flushidx < dirty_components.length) { const component = dirty_components[flushidx]; flushidx++; set_current_component(component); update(component.$$); } } catch (e) { // reset dirty state to not end up in a deadlocked state and then rethrow dirty_components.length = 0; flushidx = 0; throw e; } set_current_component(null); dirty_components.length = 0; flushidx = 0; while (binding_callbacks.length) binding_callbacks.pop()(); // then, once components are updated, call // afterUpdate functions. This may cause // subsequent updates... for (let i = 0; i < render_callbacks.length; i += 1) { const callback = render_callbacks[i]; if (!seen_callbacks.has(callback)) { // ...so guard against infinite loops seen_callbacks.add(callback); callback(); } } render_callbacks.length = 0; } while (dirty_components.length); while (flush_callbacks.length) { flush_callbacks.pop()(); } update_scheduled = false; seen_callbacks.clear(); set_current_component(saved_component); } /** @returns {void} */ function update($$) { if ($$.fragment !== null) { $$.update(); run_all($$.before_update); const dirty = $$.dirty; $$.dirty = [-1]; $$.fragment && $$.fragment.p($$.ctx, dirty); $$.after_update.forEach(add_render_callback); } } /** * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`. * @param {Function[]} fns * @returns {void} */ function flush_render_callbacks(fns) { const filtered = []; const targets = []; render_callbacks.forEach((c) => (fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c))); targets.forEach((c) => c()); render_callbacks = filtered; } /** * @type {Promise<void> | null} */ let promise; /** * @returns {Promise<void>} */ function wait() { if (!promise) { promise = Promise.resolve(); promise.then(() => { promise = null; }); } return promise; } /** * @param {Element} node * @param {INTRO | OUTRO | boolean} direction * @param {'start' | 'end'} kind * @returns {void} */ function dispatch(node, direction, kind) { node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`)); } const outroing = new Set(); /** * @type {Outro} */ let outros; /** * @returns {void} */ function group_outros() { outros = { r: 0, c: [], p: outros // parent group }; } /** * @returns {void} */ function check_outros() { if (!outros.r) { run_all(outros.c); } outros = outros.p; } /** * @param {import('./private.js').Fragment} block * @param {0 | 1} [local] * @returns {void} */ function transition_in(block, local) { if (block && block.i) { outroing.delete(block); block.i(local); } } /** * @param {import('./private.js').Fragment} block * @param {0 | 1} local * @param {0 | 1} [detach] * @param {() => void} [callback] * @returns {void} */ function transition_out(block, local, detach, callback) { if (block && block.o) { if (outroing.has(block)) return; outroing.add(block); outros.c.push(() => { outroing.delete(block); if (callback) { if (detach) block.d(1); callback(); } }); block.o(local); } else if (callback) { callback(); } } /** * @type {import('../transition/public.js').TransitionConfig} */ const null_transition = { duration: 0 }; /** * @param {Element & ElementCSSInlineStyle} node * @param {TransitionFn} fn * @param {any} params * @param {boolean} intro * @returns {{ run(b: 0 | 1): void; end(): void; }} */ function create_bidirectional_transition(node, fn, params, intro) { /** * @type {TransitionOptions} */ const options = { direction: 'both' }; let config = fn(node, params, options); let t = intro ? 0 : 1; /** * @type {Program | null} */ let running_program = null; /** * @type {PendingProgram | null} */ let pending_program = null; let animation_name = null; /** @type {boolean} */ let original_inert_value; /** * @returns {void} */ function clear_animation() { if (animation_name) delete_rule(node, animation_name); } /** * @param {PendingProgram} program * @param {number} duration * @returns {Program} */ function init(program, duration) { const d = /** @type {Program['d']} */ (program.b - t); duration *= Math.abs(d); return { a: t, b: program.b, d, duration, start: program.start, end: program.start + duration, group: program.group }; } /** * @param {INTRO | OUTRO} b * @returns {void} */ function go(b) { const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition; /** * @type {PendingProgram} */ const program = { start: now() + delay, b }; if (!b) { // @ts-ignore todo: improve typings program.group = outros; outros.r += 1; } if ('inert' in node) { if (b) { if (original_inert_value !== undefined) { // aborted/reversed outro — restore previous inert value node.inert = original_inert_value; } } else { original_inert_value = /** @type {HTMLElement} */ (node).inert; node.inert = true; } } if (running_program || pending_program) { pending_program = program; } else { // if this is an intro, and there's a delay, we need to do // an initial tick and/or apply CSS animation immediately if (css) { clear_animation(); animation_name = create_rule(node, t, b, duration, delay, easing, css); } if (b) tick(0, 1); running_program = init(program, duration); add_render_callback(() => dispatch(node, b, 'start')); loop((now) => { if (pending_program && now > pending_program.start) { running_program = init(pending_program, duration); pending_program = null; dispatch(node, running_program.b, 'start'); if (css) { clear_animation(); animation_name = create_rule( node, t, running_program.b, running_program.duration, 0, easing, config.css ); } } if (running_program) { if (now >= running_program.end) { tick((t = running_program.b), 1 - t); dispatch(node, running_program.b, 'end'); if (!pending_program) { // we're done if (running_program.b) { // intro — we can tidy up immediately clear_animation(); } else { // outro — needs to be coordinated if (!--running_program.group.r) run_all(running_program.group.c); } } running_program = null; } else if (now >= running_program.start) { const p = now - running_program.start; t = running_program.a + running_program.d * easing(p / running_program.duration); tick(t, 1 - t); } } return !!(running_program || pending_program); }); } } return { run(b) { if (is_function(config)) { wait().then(() => { const opts = { direction: b ? 'in' : 'out' }; // @ts-ignore config = config(opts); go(b); }); } else { go(b); } }, end() { clear_animation(); running_program = pending_program = null; } }; } /** @typedef {1} INTRO */ /** @typedef {0} OUTRO */ /** @typedef {{ direction: 'in' | 'out' | 'both' }} TransitionOptions */ /** @typedef {(node: Element, params: any, options: TransitionOptions) => import('../transition/public.js').TransitionConfig} TransitionFn */ /** * @typedef {Object} Outro * @property {number} r * @property {Function[]} c * @property {Object} p */ /** * @typedef {Object} PendingProgram * @property {number} start * @property {INTRO|OUTRO} b * @property {Outro} [group] */ /** * @typedef {Object} Program * @property {number} a * @property {INTRO|OUTRO} b * @property {1|-1} d * @property {number} duration * @property {number} start * @property {number} end * @property {Outro} [group] */ // general each functions: function ensure_array_like(array_like_or_iterator) { return array_like_or_iterator?.length !== undefined ? array_like_or_iterator : Array.from(array_like_or_iterator); } // keyed each functions: /** @returns {void} */ function destroy_block(block, lookup) { block.d(1); lookup.delete(block.key); } /** @returns {void} */ function outro_and_destroy_block(block, lookup) { transition_out(block, 1, 1, () => { lookup.delete(block.key); }); } /** @returns {any[]} */ function update_keyed_each( old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context ) { let o = old_blocks.length; let n = list.length; let i = o; const old_indexes = {}; while (i--) old_indexes[old_blocks[i].key] = i; const new_blocks = []; const new_lookup = new Map(); const deltas = new Map(); const updates = []; i = n; while (i--) { const child_ctx = get_context(ctx, list, i); const key = get_key(child_ctx); let block = lookup.get(key); if (!block) { block = create_each_block(key, child_ctx); block.c(); } else if (dynamic) { // defer updates until all the DOM shuffling is done updates.push(() => block.p(child_ctx, dirty)); } new_lookup.set(key, (new_blocks[i] = block)); if (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key])); } const will_move = new Set(); const did_move = new Set(); /** @returns {void} */ function insert(block) { transition_in(block, 1); block.m(node, next); lookup.set(block.key, block); next = block.first; n--; } while (o && n) { const new_block = new_blocks[n - 1]; const old_block = old_blocks[o - 1]; const new_key = new_block.key; const old_key = old_block.key; if (new_block === old_block) { // do nothing next = new_block.first; o--; n--; } else if (!new_lookup.has(old_key)) { // remove old block destroy(old_block, lookup); o--; } else if (!lookup.has(new_key) || will_move.has(new_key)) { insert(new_block); } else if (did_move.has(old_key)) { o--; } else if (deltas.get(new_key) > deltas.get(old_key)) { did_move.add(new_key); insert(new_block); } else { will_move.add(old_key); o--; } } while (o--) { const old_block = old_blocks[o]; if (!new_lookup.has(old_block.key)) destroy(old_block, lookup); } while (n) insert(new_blocks[n - 1]); run_all(updates); return new_blocks; } /** @returns {{}} */ function get_spread_update(levels, updates) { const update = {}; const to_null_out = {}; const accounted_for = { $$scope: 1 }; let i = levels.length; while (i--) { const o = levels[i]; const n = updates[i]; if (n) { for (const key in o) { if (!(key in n)) to_null_out[key] = 1; } for (const key in n) { if (!accounted_for[key]) { update[key] = n[key]; accounted_for[key] = 1; } } levels[i] = n; } else { for (const key in o) { accounted_for[key] = 1; } } } for (const key in to_null_out) { if (!(key in update)) update[key] = undefined; } return update; } function get_spread_object(spread_props) { return typeof spread_props === 'object' && spread_props !== null ? spread_props : {}; } /** @returns {void} */ function bind(component, name, callback) { const index = component.$$.props[name]; if (index !== undefined) { component.$$.bound[index] = callback; callback(component.$$.ctx[index]); } } /** @returns {void} */ function create_component(block) { block && block.c(); } /** @returns {void} */ function mount_component(component, target, anchor) { const { fragment, after_update } = component.$$; fragment && fragment.m(target, anchor); // onMount happens before the initial afterUpdate add_render_callback(() => { const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); // if the component was destroyed immediately // it will update the `$$.on_destroy` reference to `null`. // the destructured on_destroy may still reference to the old array if (component.$$.on_destroy) { component.$$.on_destroy.push(...new_on_destroy); } else { // Edge case - component was destroyed immediately, // most likely as a result of a binding initialising run_all(new_on_destroy); } component.$$.on_mount = []; }); after_update.forEach(add_render_callback); } /** @returns {void} */ function destroy_component(component, detaching) { const $$ = component.$$; if ($$.fragment !== null) { flush_render_callbacks($$.after_update); run_all($$.on_destroy); $$.fragment && $$.fragment.d(detaching); // TODO null out other refs, including component.$$ (but need to // preserve final state?) $$.on_destroy = $$.fragment = null; $$.ctx = []; } } /** @returns {void} */ function make_dirty(component, i) { if (component.$$.dirty[0] === -1) { dirty_components.push(component); schedule_update(); component.$$.dirty.fill(0); } component.$$.dirty[(i / 31) | 0] |= 1 << i % 31; } // TODO: Document the other params /** * @param {SvelteComponent} component * @param {import('./public.js').ComponentConstructorOptions} options * * @param {import('./utils.js')['not_equal']} not_equal Used to compare props and state values. * @param {(target: Element | ShadowRoot) => void} [append_styles] Function that appends styles to the DOM when the component is first initialised. * This will be the `add_css` function from the compiled component. * * @returns {void} */ function init( component, options, instance, create_fragment, not_equal, props, append_styles = null, dirty = [-1] ) { const parent_component = current_component; set_current_component(component); /** @type {import('./private.js').T$$} */ const $$ = (component.$$ = { fragment: null, ctx: [], // state props, update: noop, not_equal, bound: blank_object(), // lifecycle on_mount: [], on_destroy: [], on_disconnect: [], before_update: [], after_update: [], context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), // everything else callbacks: blank_object(), dirty, skip_bound: false, root: options.target || parent_component.$$.root }); append_styles && append_styles($$.root); let ready = false; $$.ctx = instance ? instance(component, options.props || {}, (i, ret, ...rest) => { const value = rest.length ? rest[0] : ret; if ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) { if (!$$.skip_bound && $$.bound[i]) $$.bound[i](value); if (ready) make_dirty(component, i); } return ret; }) : []; $$.update(); ready = true; run_all($$.before_update); // `false` as a special case of no DOM component $$.fragment = create_fragment ? create_fragment($$.ctx) : false; if (options.target) { if (options.hydrate) { // TODO: what is the correct type here? // @ts-expect-error const nodes = children(options.target); $$.fragment && $$.fragment.l(nodes); nodes.forEach(detach); } else { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion $$.fragment && $$.fragment.c(); } if (options.intro) transition_in(component.$$.fragment); mount_component(component, options.target, options.anchor); flush(); } set_current_component(parent_component); } /** * Base class for Svelte components. Used when dev=false. * * @template {Record<string, any>} [Props=any] * @template {Record<string, any>} [Events=any] */ class SvelteComponent { /** * ### PRIVATE API * * Do not use, may change at any time * * @type {any} */ $$ = undefined; /** * ### PRIVATE API * * Do not use, may change at any time * * @type {any} */ $$set = undefined; /** @returns {void} */ $destroy() { destroy_component(this, 1); this.$destroy = noop; } /** * @template {Extract<keyof Events, string>} K * @param {K} type * @param {((e: Events[K]) => void) | null | undefined} callback * @returns {() => void} */ $on(type, callback) { if (!is_function(callback)) { return noop; } const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); callbacks.push(callback); return () => { const index = callbacks.indexOf(callback); if (index !== -1) callbacks.splice(index, 1); }; } /** * @param {Partial<Props>} props * @returns {void} */ $set(props) { if (this.$$set && !is_empty(props)) { this.$$.skip_bound = true; this.$$set(props); this.$$.skip_bound = false; } } } /** * @typedef {Object} CustomElementPropDefinition * @property {string} [attribute] * @property {boolean} [reflect] * @property {'String'|'Boolean'|'Number'|'Array'|'Object'} [type] */ // generated during release, do not modify const PUBLIC_VERSION = '4'; if (typeof window !== 'undefined') // @ts-ignore (window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION); /** @returns {void} */ function onMount() {} const subscriber_queue = []; /** * Creates a `Readable` store that allows reading by subscription. * * https://svelte.dev/docs/svelte-store#readable * @template T * @param {T} [value] initial value * @param {import('./public.js').StartStopNotifier<T>} [start] * @returns {import('./public.js').Readable<T>} */ function readable(value, start) { return { subscribe: writable(value, start).subscribe }; } /** * Create a `Writable` store that allows both updating and reading by subscription. * * https://svelte.dev/docs/svelte-store#writable * @template T * @param {T} [value] initial value * @param {import('./public.js').StartStopNotifier<T>} [start] * @returns {import('./public.js').Writable<T>} */ function writable(value, start = noop) { /** @type {import('./public.js').Unsubscriber} */ let stop; /** @type {Set<import('./private.js').SubscribeInvalidateTuple<T>>} */ const subscribers = new Set(); /** @param {T} new_value * @returns {void} */ function set(new_value) { if (safe_not_equal(value, new_value)) { value = new_value; if (stop) { // store is ready const run_queue = !subscriber_queue.length; for (const subscriber of subscribers) { subscriber[1](); subscriber_queue.push(subscriber, value); } if (run_queue) { for (let i = 0; i < subscriber_queue.length; i += 2) { subscriber_queue[i][0](subscriber_queue[i + 1]); } subscriber_queue.length = 0; } } } } /** * @param {import('./public.js').Updater<T>} fn * @returns {void} */ function update(fn) { set(fn(value)); } /** * @param {import('./public.js').Subscriber<T>} run * @param {import('./private.js').Invalidator<T>} [invalidate] * @returns {import('./public.js').Unsubscriber} */ function subscribe(run, invalidate = noop) { /** @type {import('./private.js').SubscribeInvalidateTuple<T>} */ const subscriber = [run, invalidate]; subscribers.add(subscriber); if (subscribers.size === 1) { stop = start(set, update) || noop; } run(value); return () => { subscribers.delete(subscriber); if (subscribers.size === 0 && stop) { stop(); stop = null; } }; } return { set, update, subscribe }; } /** * Derived value store by synchronizing one or more readable stores and * applying an aggregation function over its input values. * * https://svelte.dev/docs/svelte-store#derived * @template {import('./private.js').Stores} S * @template T * @overload * @param {S} stores - input stores * @param {(values: import('./private.js').StoresValues<S>, set: (value: T) => void, update: (fn: import('./public.js').Updater<T>) => void) => import('./public.js').Unsubscriber | void} fn - function callback that aggregates the values * @param {T} [initial_value] - initial value * @returns {import('./public.js').Readable<T>} */ /** * Derived value store by synchronizing one or more readable stores and * applying an aggregation function over its input values. * * https://svelte.dev/docs/svelte-store#derived * @template {import('./private.js').Stores} S * @template T * @overload * @param {S} stores - input stores * @param {(values: import('./private.js').StoresValues<S>) => T} fn - function callback that aggregates the values * @param {T} [initial_value] - initial value * @returns {import('./public.js').Readable<T>} */ /** * @template {import('./private.js').Stores} S * @template T * @param {S} stores * @param {Function} fn * @param {T} [initial_value] * @returns {import('./public.js').Readable<T>} */ function derived(stores, fn, initial_value) { const single = !Array.isArray(stores); /** @type {Array<import('./public.js').Readable<any>>} */ const stores_array = single ? [stores] : stores; if (!stores_array.every(Boolean)) { throw new Error('derived() expects stores as input, got a falsy value'); } const auto = fn.length < 2; return readable(initial_value, (set, update) => { let started = false; const values = []; let pending = 0; let cleanup = noop; const sync = () => { if (pending) { return; } cleanup(); const result = fn(single ? values[0] : values, set, update); if (auto) { set(result); } else { cleanup = is_function(result) ? result : noop; } }; const unsubscribers = stores_array.map((store, i) => subscribe( store, (value) => { values[i] = value; pending &= ~(1 << i); if (started) { sync(); } }, () => { pending |= 1 << i; } ) ); started = true; sync(); return function stop() { run_all(unsubscribers); cleanup(); // We need to set this to false because callbacks can still happen despite having unsubscribed: // Callbacks might already be placed in the queue which doesn't know it should no longer // invoke this derived store. started = false; }; }); } /** * Takes a store and returns a new one derived from the old one that is readable. * * https://svelte.dev/docs/svelte-store#readonly * @template T * @param {import('./public.js').Readable<T>} store - store to make readonly * @returns {import('./public.js').Readable<T>} */ function readonly(store) { return { subscribe: store.subscribe.bind(store) }; } /* src/icons/ChevronRight.svelte generated by Svelte v4.2.10 */ function create_if_block$1N(ctx) { let title_1; let t; return { c() { title_1 = svg_element("title"); t = text(/*title*/ ctx[1]); }, m(target, anchor) { insert(target, title_1, anchor); append(title_1, t); }, p(ctx, dirty) { if (dirty & /*title*/ 2) set_data(t, /*title*/ ctx[1]); }, d(detaching) { if (detaching) { detach(title_1); } } }; } function create_fragment$3c(ctx) { let svg; let path; let if_block = /*title*/ ctx[1] && create_if_block$1N(ctx); let svg_levels = [ { xmlns: "http://www.w3.org/2000/svg" }, { viewBox: "0 0 32 32" }, { fill: "currentColor" }, { preserveAspectRatio: "xMidYMid meet" }, { width: /*size*/ ctx[0] }, { height: /*size*/ ctx[0] }, /*attributes*/ ctx[2], /*$$restProps*/ ctx[3] ]; let svg_data = {}; for (let i = 0; i < svg_levels.length; i += 1) { svg_data = assign(svg_data, svg_levels[i]); } return { c() { svg = svg_element("svg"); if (if_block) if_block.c(); path = svg_element("path"); attr(path, "d", "M22 16L12 26 10.6 24.6 19.2 16 10.6 7.4 12 6z"); set_svg_attributes(svg, svg_data); }, m(target, anchor) { insert(target, svg, anchor); if (if_block) if_block.m(svg, null); append(svg, path); }, p(ctx, [dirty]) { if (/*title*/ ctx[1]) { if (if_block) { if_block.p(ctx, dirty); } else { if_block = create_if_block$1N(ctx); if_block.c(); if_block.m(svg, path); } } else if (if_block) { if_block.d(1); if_block = null; } set_svg_attributes(svg, svg_data = get_spread_update(svg_levels, [ { xmlns: "http://www.w3.org/2000/svg" }, { viewBox: "0 0 32 32" }, { fill: "currentColor" }, { preserveAspectRatio: "xMidYMid meet" }, dirty & /*size*/ 1 && { width: /*size*/ ctx[0] }, dirty & /*size*/ 1 && { height: /*size*/ ctx[0] }, dirty & /*attributes*/ 4 && /*attributes*/ ctx[2], dirty & /*$$restProps*/ 8 && /*$$restProps*/ ctx[3] ])); }, i: noop, o: noop, d(detaching) { if (detaching) { detach(svg); } if (if_block) if_block.d(); } }; } function instance$3c($$self, $$props, $$invalidate) { let labelled; let attributes; const omit_props_names = ["size","title"]; let $$restProps = compute_rest_props($$props, omit_props_names); let { size = 16 } = $$props; let { title = undefined } = $$props; $$self.$$set = $$new_props => { $$invalidate(5, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(3, $$restProps = compute_rest_props($$props, omit_props_names)); if ('size' in $$new_props) $$invalidate(0, size = $$new_props.size); if ('title' in $$new_props) $$invalidate(1, title = $$new_props.title); }; $$self.$$.update = () => { $$invalidate(4, labelled = $$props["aria-label"] || $$props["aria-labelledby"] || title); $$invalidate(2, attributes = { "aria-hidden": labelled ? undefined : true, role: labelled ? "img" : undefined, focusable: Number($$props["tabindex"]) === 0 ? true : undefined }); }; $$props = exclude_internal_props($$props); return [size, title, attributes, $$restProps, labelled]; } class ChevronRight extends SvelteComponent { constructor(options) { super(); init(this, options, instance$3c, create_fragment$3c, safe_not_equal, { size: 0, title: 1 }); } } var ChevronRight$1 = ChevronRight; /* src/SkeletonText/SkeletonText.svelte generated by Svelte v4.2.10 */ function get_each_context$l(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[3] = list[i]; return child_ctx; } // (38:0) {:else} function create_else_block$x(ctx) { let p; let mounted; let dispose; let p_levels = [/*$$restProps*/ ctx[7]]; let p_data = {}; for (let i = 0; i < p_levels.length; i += 1) { p_data = assign(p_data, p_levels[i]); } return { c() { p = element("p"); set_attributes(p, p_data); toggle_class(p, "bx--skeleton__text", true); toggle_class(p, "bx--skeleton__heading", /*heading*/ ctx[1]); set_style(p, "width", /*width*/ ctx[3]); }, m(target, anchor) { insert(target, p, anchor); if (!mounted) { dispose = [ listen(p, "click", /*click_handler_1*/ ctx[12]), listen(p, "mouseover", /*mouseover_handler_1*/ ctx[13]), listen(p, "mouseenter", /*mouseenter_handler_1*/ ctx[14]), listen(p, "mouseleave", /*mouseleave_handler_1*/ ctx[15]) ]; mounted = true; } }, p(ctx, dirty) { set_attributes(p, p_data = get_spread_update(p_levels, [dirty & /*$$restProps*/ 128 && /*$$restProps*/ ctx[7]])); toggle_class(p, "bx--skeleton__text", true); toggle_class(p, "bx--skeleton__heading", /*heading*/ ctx[1]); set_style(p, "width", /*width*/ ctx[3]); }, d(detaching) { if (detaching) { detach(p); } mounted = false; run_all(dispose); } }; } // (21