diff --git a/CHANGELOG.md b/CHANGELOG.md index bc35f28..4c27816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,33 @@ # Change Log All notable changes to this project will be documented in this file. +## [2.5] - 2023-08-02 +Upgrade to version 2.5 of the T3SF framework for exciting new features, bug fixes, and an enhanced user experience. This release introduces the MSEL Playground, Dark mode, a Database with AI-generated Events, and much more! + +### New +- Introducing the MSEL Playground, providing real-time editing capabilities for MSEL files. + - Added support for uploading .xls/.xlsx files and converting them to JSON format. + - Implemented the ability to save modified or converted MSEL files. +- Refreshed the nav-bar style for an improved visual experience. +- Created a new static folder for local web resources. + - Modified the source for certain images used in the application. +- Added a function to set the Discord server ID. +- Introduced a Dark mode option. +- Implemented a Database with AI-generated Events. +- Included a FAQ section addressing common TTX design questions. +- Added a Platform indicator on the GUI. +- Expanded the poll options to support more choices. +- Added "Resume," "Pause," and "Abort" buttons on the GUI. +- Swapped the functionality of the "Stop" and "Abort" buttons. +- Included a random data generator button for the MSEL. +- Added a Database with comprehensive example scenarios. +- Improved clarity of script execution explanations. + +### Fixes +- Fixed a bug in the log viewer where the "Framework status" text wouldn't display without available logs. +- Rewrote the log display to address visual issues when selecting or when logs were too long. +- Resolved an issue where exception messages were not properly displayed on the GUI. + ## [2.1] - 2023-06-02 Upgrade to version 2.1 of the T3SF framework to benefit from an array of new features, bug fixes, and enhanced stability. This release brings important updates and automation to streamline various processes within the framework. diff --git a/README.md b/README.md index ad9e330..7ef8df4 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@
- [![Docker Image for Discord](https://github.com/Base4Security/T3SF/actions/workflows/publish_discord.yml/badge.svg)](https://github.com/Base4Security/T3SF/actions/workflows/publish_discord.yml) - [![Docker Image for Slack](https://github.com/Base4Security/T3SF/actions/workflows/publish_slack.yml/badge.svg)](https://github.com/Base4Security/T3SF/actions/workflows/publish_slack.yml) + [![Docker Image for Discord](https://github.com/Base4Security/T3SF/actions/workflows/publish_discord.yml/badge.svg)](https://hub.docker.com/r/base4sec/t3sf) + [![Docker Image for Slack](https://github.com/Base4Security/T3SF/actions/workflows/publish_slack.yml/badge.svg)](https://hub.docker.com/r/base4sec/t3sf)

Technical Tabletop Exercises Simulation Framework diff --git a/T3SF/T3SF.py b/T3SF/T3SF.py index 1038e2b..d5829a5 100644 --- a/T3SF/T3SF.py +++ b/T3SF/T3SF.py @@ -17,12 +17,9 @@ def keyboard_interrupt_handler(signal_num, frame): # Associate the signal handler function with SIGINT (keyboard interrupt) signal.signal(signal.SIGINT, keyboard_interrupt_handler) - class T3SF(object): def __init__(self, bot = None, app = None, platform = None): self.response = None - self.process_wait = False - self.process_quit = False self.regex_ready = None self.incidents_running = False self.poll_answered = False @@ -85,8 +82,6 @@ async def TimeDifference(self, actual_real_time, previous_real_time, itinerator= await self.NotifyGameMasters(type_info="poll_unanswered", data={'msg_poll':self._inject["Script"]}) except Exception as e: - print("Get Time Difference") - print(e) T3SF_Logger.emit("Get Time Difference", message_type="ERROR") T3SF_Logger.emit(e, message_type="ERROR") raise @@ -113,7 +108,7 @@ async def start(MSEL:str, platform, gui=False): if gui == True: T3SF_Logger.emit(message="Starting GUI", message_type="DEBUG") gui_module = importlib.import_module("T3SF.gui.core") - gui_module.GUI(platform_run=platform, MSEL=MSEL) + gui_module.GUI(platform_run=platform, MSEL=MSEL, static_url_path='/static', static_folder='static') if platform.lower() == "slack": bot_module = importlib.import_module("T3SF.slack.bot") @@ -172,8 +167,6 @@ async def NotifyGameMasters(self, type_info=str, data=None): return True except Exception as e: - print("NotifyGameMasters") - print(e) T3SF_Logger.emit("NotifyGameMasters", message_type="ERROR") T3SF_Logger.emit(e, message_type="ERROR") raise @@ -199,12 +192,10 @@ async def ProcessIncidents(self, MSEL:str, ctx, function_type:str=None, itinerat bypass_time = True for information in self.data: - if self.process_quit == True: + process_status = await self.check_status() + + if process_status == 'break': break - - if self.process_wait == True: - while self.process_wait == True: - await asyncio.sleep(5) if itinerator == 0: # Set a variable to get the actual timestamp and the past one, after that checks for differences. itinerator_loop = itinerator @@ -248,18 +239,34 @@ async def ProcessIncidents(self, MSEL:str, ctx, function_type:str=None, itinerat itinerator += 1 + await self.check_status(reset=True) await self.NotifyGameMasters(type_info="finished_incidents") # Informs that the script is completed and there's no remaining incidents. - self.process_quit = False - self.process_wait = False self.incidents_running = False except Exception as e: - print("ProcessIncidents function") - print(e) T3SF_Logger.emit("ProcessIncidents function", message_type="ERROR") T3SF_Logger.emit(e, message_type="ERROR") raise + async def check_status(self, reset:bool = False): + from .utils import process_wait, process_quit + + if reset: + process_quit = False + process_wait = False + return True + + if process_quit == True: + return 'break' + + if process_wait == True: + # print(f"We are waiting, because the variable {process_wait} is set to True") + await asyncio.sleep(5) + await self.check_status() + return False + + return True + async def SendIncident(self, inject): try: self._inject = inject @@ -273,8 +280,6 @@ async def SendIncident(self, inject): return True except Exception as e: - print("SendIncident") - print(e) T3SF_Logger.emit("SendIncident", message_type="ERROR") T3SF_Logger.emit(e, message_type="ERROR") raise @@ -292,8 +297,6 @@ async def SendPoll(self, inject): return True except Exception as e: - print("SendPoll") - print(e) T3SF_Logger.emit("SendPoll", message_type="ERROR") T3SF_Logger.emit(e, message_type="ERROR") raise diff --git a/T3SF/discord/discord.py b/T3SF/discord/discord.py index e324a52..aa014b4 100644 --- a/T3SF/discord/discord.py +++ b/T3SF/discord/discord.py @@ -3,7 +3,7 @@ import random import json import re -from T3SF import utils +from T3SF import utils, T3SF_Logger class Discord(object): def __init__(self, bot): @@ -62,11 +62,14 @@ async def InboxesAuto(self, T3SF_instance): past_channel = category.name pass + T3SF_Logger.emit(message=f'Please confirm the Regular Expression for the inboxes on the gm-chat!', message_type="INFO") + await T3SF_instance.response_auto.edit(embed=discord.Embed( title = "ℹ️ Regex detected!", description = f"Please confirm if the regex detected for the channels, is correct so we can get the inboxes!\n\nExample:\nGroup - Legal\nThe regex should be `Group -`\n\nDetected regex: `{regex}`", color = 0x77B255).set_image(url=image_example).set_footer(text="Please answer with [Yes(Y)/No(N)]")) + def check_regex_channels(msg): if started_from_gui: return msg.content.lower() in ["y", "yes", "n", "no"] @@ -120,6 +123,8 @@ def get_regex_channels(msg_regex_user): await self.EditMessage(T3SF_instance=T3SF_instance, style="custom", variable="T3SF_instance.response_auto", color="GREEN", title=f"📩 Inboxes fetched! [{len(T3SF_instance.inboxes_all)}]", description=mensaje_inboxes) + T3SF_Logger.emit(message=f'Confirmed! Inboxes ready', message_type="INFO") + return True async def InjectHandler(self, T3SF_instance): @@ -168,8 +173,8 @@ async def PollHandler(self, T3SF_instance): diff_secs = diff * 60 view = discord.ui.View() - view.add_item(discord.ui.Button(style=discord.ButtonStyle.primary,label=poll_options[0], custom_id="poll|"+poll_options[0])) - view.add_item(discord.ui.Button(style=discord.ButtonStyle.primary,label=poll_options[1], custom_id="poll|"+poll_options[1])) + for option in poll_options: + view.add_item(discord.ui.Button(style=discord.ButtonStyle.primary, label=option, custom_id="poll|" + option)) all_data = all_data+ f"\n\nYou have {diff} minute(s) to answer this poll!" diff --git a/T3SF/gui/core.py b/T3SF/gui/core.py index 6e700b4..4b9a599 100644 --- a/T3SF/gui/core.py +++ b/T3SF/gui/core.py @@ -1,4 +1,4 @@ -from flask import Flask, render_template, Response, stream_with_context, Blueprint, request +from flask import Flask, render_template, Response, Blueprint, request, jsonify, after_this_request import os, signal, time import threading import logging @@ -8,6 +8,8 @@ import json from T3SF import utils +import sqlite3 + bp = Blueprint('t3sf', __name__) platform = None @@ -39,9 +41,6 @@ def start(self): listeners = [] class MessageAnnouncer: - def __init__(self): - self.listeners = [] - def listen(self): global listeners listeners.append(queue.Queue(maxsize=10)) @@ -57,6 +56,15 @@ def announce(self, msg): except queue.Full: del listeners[i] +# Global variables for the template engine +@bp.context_processor +def actual_platform(): + def get_platform(): + # Return the platform value here + return platform + + return dict(platform=get_platform()) + # SSE @bp.route('/stream', methods=['GET']) def listen(): @@ -72,6 +80,7 @@ def stream(): yield line messages = MessageAnnouncer().listen() # returns a queue.Queue + messages.put("New client connected\n\n") # Send a message when a client connects while True: msg = messages.get() # blocks until a new message arrives yield msg @@ -91,11 +100,11 @@ def stream(): # Views @bp.route('/') def index(): - return render_template('index.html', active_page="logs_viewer", platform=platform.lower()) + return render_template('index.html', active_page="logs_viewer") -@bp.route('/msel-viewer') -def msel_viewer(): - return render_template('msel_viewer.html', active_page="msel_viewer") +@bp.route('/msel-playground') +def msel_playground(): + return render_template('msel_playground.html', active_page="msel_playground") @bp.route('/env-creation') def env_creation(): @@ -114,6 +123,12 @@ async def start_exercise(): from T3SF.discord.bot import run_async_incidents try: server_id = int(request.args.get("server")) + + # Setting variables for GUI + utils.process_quit = False + utils.process_wait = False + utils.process_started = True + await run_async_incidents(server=server_id) except (ValueError, TypeError): @@ -128,26 +143,65 @@ async def start_exercise(): elif platform.lower() == "slack": from T3SF.slack.bot import run_async_incidents + + # Setting variables for GUI + utils.process_quit = False + utils.process_wait = False + utils.process_started = True + await run_async_incidents() # Return an immediate response return Response("Started", mimetype='text/plain') +@bp.route('/pause') +def pause_exercise(): + utils.process_wait = True + + return "We are waiting" + +@bp.route('/resume') +def resume_exercise(): + utils.process_wait = False + utils.process_quit = False + utils.process_started = True + + return "We are processing again" + @bp.route('/stop') def stop_exercise(): - # Kill the script - msg = { - "id" : str(uuid.uuid4()), - "type" : "INFO", - "content": "Exiting...", - "timestamp": datetime.now().strftime("%H:%M:%S") - } - MessageAnnouncer().announce(msg=f"data: {json.dumps(msg)}\n\n") - time.sleep(1) - os._exit(0) + utils.process_quit = True + + return "We are Stoping" + +@bp.route('/abort') +def abort_exercise(): + # Return a response first + response = 'Shutting down...' - # Return a response that triggers the WSGI server to shutdown the application - return 'Shutting down...' + # Define a function to be executed after the response is sent + @after_this_request + def shutdown(response): + # Start a new thread to kill the script + t = threading.Thread(target=kill_script) + t.start() + + # Announce the exiting message + msg = { + "id": str(uuid.uuid4()), + "type": "INFO", + "content": "Exiting...", + "timestamp": datetime.now().strftime("%H:%M:%S") + } + MessageAnnouncer().announce(msg=f"data: {json.dumps(msg)}\n\n") + + return response + + def kill_script(): + time.sleep(0.5) # Wait for the client to receive response + os._exit(0) # Kill the script + + return response @bp.route('/create') async def create_env(): @@ -165,13 +219,13 @@ async def create_env(): "timestamp": datetime.now().strftime("%H:%M:%S") } MessageAnnouncer().announce(msg=f"data: {json.dumps(msg)}\n\n") - return Response("Failed, Token was not provided or is not an integer.", mimetype='text/plain') + return jsonify({"status":"error","msg":"Failed, Token was not provided or is not an integer."}) elif platform.lower() == "slack": from T3SF.slack.bot import create_environment await create_environment() - return "Created" + return jsonify({"status":"ok","msg":"Environment created!"}) @bp.route('/clear') def clear_logs(): @@ -179,4 +233,330 @@ def clear_logs(): open('logs.txt', 'w').close() # Return a response - return 'Logs cleared...' \ No newline at end of file + return 'Logs cleared...' + +# APIs +@bp.route('/data', methods=['POST']) +def get_data(): + # Connect to the SQLite database + conn = sqlite3.connect(os.path.join(os.path.dirname(__file__)) + '/t3sf.sqlite3') + cursor = conn.cursor() + + # Get the DataTables request parameters + draw = int(request.form.get('draw', 0)) + start = int(request.form.get('start', 0)) + length = int(request.form.get('length', 0)) + search_value = request.form.get('search[value]', '') + + # Get the selected filters from the dropdowns + filter_phase = request.form.get('phaseFilter', '') + filter_sector = request.form.get('sectorFilter', '') + + # Construct the SQL query with search, pagination, and filter + # columns = ['id', 'RelatedThreat', 'Receptor', 'Event', 'TypeOfScenario', 'TPP', 'ExercisePhase', Subject', 'Sector', 'Poll'] // Enable this if you want search to be global + columns = ['id', 'RelatedThreat', 'Receptor', 'Event'] + conditions = [] + params = [] + + # Generate the WHERE conditions for each column + for column in columns: + conditions.append(f"{column} LIKE ?") + params.append(f'%{search_value}%') + + # Combine the conditions with OR operator + where_clause = " OR ".join(conditions) + + query = f"SELECT id, RelatedThreat, Receptor, Event, TypeOfScenario, TPP, ExercisePhase, Subject, Sector, Poll FROM events WHERE " + + # Add the filters to the query + if filter_phase and filter_sector: + query += f" ExercisePhase = ? AND Sector LIKE ? AND ( {where_clause} )" + params.insert(0, f"%{filter_sector}%") + params.insert(0, filter_phase) + elif filter_phase: + query += f" ExercisePhase = ? AND ( {where_clause} )" + params.insert(0, filter_phase) + elif filter_sector: + query += f" Sector LIKE ? AND ( {where_clause} )" + params.insert(0, f"%{filter_sector}%") + else: + query += f" {where_clause}" + + # Order By + column_index = int(request.form.get('order[0][column]', 0)) + order_direction = request.form.get('order[0][dir]', 'asc') + + columns = ['id', 'RelatedThreat', 'Receptor', 'Event', 'TypeOfScenario', 'TPP', 'ExercisePhase', 'Subject', 'Sector', 'Poll'] + + # Validate the column index + if column_index >= 0 and column_index < len(columns): + column_name = columns[column_index] + query += f" ORDER BY {column_name} {order_direction}" + + # Add pagination + query += " LIMIT ? OFFSET ?" + params.extend([length, start]) + + cursor.execute(query, params) + rows = cursor.fetchall() + + # Get the total count of filtered records + query = f"SELECT COUNT(*) FROM events WHERE " + + # Add the filters to the query + if filter_phase and filter_sector: + query += f" ExercisePhase = ? AND Sector LIKE ? AND ( {where_clause} )" + elif filter_phase: + query += f" ExercisePhase = ? AND ( {where_clause} )" + elif filter_sector: + query += f" Sector LIKE ? AND ( {where_clause} )" + else: + query += f" {where_clause}" + + cursor.execute(query, params[:-2]) + total_filtered_records = cursor.fetchone()[0] + + # Get the total count of all records + cursor.execute(f"SELECT COUNT(*) FROM events") + total_records = cursor.fetchone()[0] + + # Prepare the data in JSON format + data = [] + for row in rows: + # Create a dictionary for each row + row_dict = dict(zip(columns, row)) + + # Append the row dictionary to the data list + data.append(row_dict) + + # Close the database connection + cursor.close() + conn.close() + + # Prepare the response for DataTables + response = { + "draw": draw, + "recordsTotal": total_records, + "recordsFiltered": total_filtered_records, + "data": data + } + + return jsonify(response) + +@bp.route('/msels-data', methods=['POST']) +def get_msels(): + # Connect to the SQLite database + conn = sqlite3.connect(os.path.join(os.path.dirname(__file__)) + '/t3sf.sqlite3') + cursor = conn.cursor() + + # Get the DataTables request parameters + draw = int(request.form.get('draw', 0)) + start = int(request.form.get('start', 0)) + length = int(request.form.get('length', 0)) + search_value = request.form.get('search[value]', '') + + # Construct the SQL query with search, pagination, and filter + columns = ['id', 'Topic', 'Sector', 'Description'] + conditions = [] + params = [] + + # Generate the WHERE conditions for each column + for column in columns: + conditions.append(f"{column} LIKE ?") + params.append(f'%{search_value}%') + + # Combine the conditions with OR operator + where_clause = " OR ".join(conditions) + + query = f"SELECT id, Topic, Sector, Description FROM MSELS_info WHERE {where_clause}" + + # Order By + column_index = int(request.form.get('order[0][column]', 0)) + order_direction = request.form.get('order[0][dir]', 'asc') + + columns = ['id', 'Topic', 'Sector', 'Description'] + + # Validate the column index + if column_index >= 0 and column_index < len(columns): + column_name = columns[column_index] + query += f" ORDER BY {column_name} {order_direction}" + + # Add pagination + query += " LIMIT ? OFFSET ?" + params.extend([length, start]) + + cursor.execute(query, params) + rows = cursor.fetchall() + + # Get the total count of filtered records + query = f"SELECT COUNT(*) FROM MSELS_info WHERE {where_clause}" + + cursor.execute(query, params[:-2]) + total_filtered_records = cursor.fetchone()[0] + + # Get the total count of all records + cursor.execute(f"SELECT COUNT(*) FROM MSELS_info") + total_records = cursor.fetchone()[0] + + # Prepare the data in JSON format + data = [] + for row in rows: + # Create a dictionary for each row + row_dict = dict(zip(columns, row)) + + query = f"SELECT COUNT(*), GROUP_CONCAT(id), GROUP_CONCAT(receptor) FROM MSELS_events WHERE MSEL_ID = ?" + + cursor.execute(query, [row[0]]) + results = cursor.fetchall() + + events_amount = [option[0] for option in results] + events_ids = [option[1] for option in results] + receptors_dirt = [option[2] for option in results] + + receptors = ", ".join(list(set(receptors_dirt[0].split(",")))) + + row_dict['EventsAmount'] = events_amount + row_dict['EventsIDs'] = events_ids + row_dict['Receptors'] = receptors + + # Append the row dictionary to the data list + data.append(row_dict) + + # Close the database connection + cursor.close() + conn.close() + + # Prepare the response for DataTables + response = { + "draw": draw, + "recordsTotal": total_records, + "recordsFiltered": total_filtered_records, + "data": data + } + + return jsonify(response) + +@bp.route('/get-injects', methods=['POST']) +def get_injects(): + ids = request.json.get('ids', []) # Get the IDs from the request body + source = request.json.get('from', "") # Get the source/from from the request body + + table = "events" + + if source == "MSEL": + table = "MSELS_events" + + # Connect to the SQLite database + conn = sqlite3.connect(os.path.join(os.path.dirname(__file__)) + '/t3sf.sqlite3') + conn.row_factory = sqlite3.Row # Set row_factory to sqlite3.Row + + cursor = conn.cursor() + + injects = [] + + for id in ids: + # Create a JSON object for each ID based on the data on the DB + query = f"SELECT Receptor, Event, Subject, Poll FROM {table} WHERE id = ?" + + try: + # Convert the input to an integer and avoid SQLi + sanitized_input = int(id) + except ValueError: + break + return None + + cursor.execute(query, [sanitized_input]) + + rows = cursor.fetchone() + + if rows is not None: + inject = { + '#': '', + 'Real Time': '', # We will not provide this info + 'Date': '', # We will not provide this info + 'Subject': rows['Subject'], + 'From': '', # We will not provide this info + 'Player': rows['Receptor'], + 'Script': rows['Event'], + 'Photo': '', # We will not provide this info for now + 'Picture Name': '', # We will not provide this info for now + 'Profile': '', # We will not provide this info for now + 'Poll': rows['Poll'] + } + injects.append(inject) + + # Close the database connection + cursor.close() + conn.close() + + return Response(json.dumps(injects), mimetype='application/json') + +@bp.route('/get-filters', methods=['GET']) +def get_data_for_dropdowns(): + conn = sqlite3.connect(os.path.join(os.path.dirname(__file__)) + '/t3sf.sqlite3') + cursor = conn.cursor() + + # Execute the query to retrieve the options for ExercisePhase + cursor.execute("SELECT DISTINCT ExercisePhase FROM events") + + # Fetch all the options for ExercisePhase + phases_options = cursor.fetchall() + + # Execute the query to retrieve the options for Sector + cursor.execute("SELECT DISTINCT Sector FROM events") + + # Fetch all the options for Sector + sector_options = cursor.fetchall() + + # Close the database connection + cursor.close() + conn.close() + + # Convert the options to a list of strings + phases_options = [option[0] for option in phases_options] + + # Convert the comma-separated sectors to individual sectors + sector_options = [sector[0].split(", ") for sector in sector_options] + sector_options = [sector for sublist in sector_options for sector in sublist] + + # Logical Order for Phases + phases_order = [ + "Initial Events", + "Detection Events", + "Details Events", + "Exposure Events", + "Business Events", + "Communication Events", + "Decision Events", + "Resolution Events" + ] + + # Remove duplicates and sort the options + phases_options = sorted(list(set(phases_options)), key=lambda x: phases_order.index(x)) + sector_options = sorted(list(set(sector_options))) + + + + # Return the options as a JSON response + return jsonify({'ExercisePhase': phases_options, 'Sector': sector_options}) + +@bp.route('/framework-status', methods=['GET']) +def framework_status(): + stopped = utils.process_quit + paused = utils.process_wait + started = utils.process_started + + if(stopped): + status = "stop" + + elif(paused): + status = "pause" + + elif(started): + status = "start" + + else: + status = "active" + + # Return the status as a JSON response + return jsonify({'status': status}) \ No newline at end of file diff --git a/T3SF/gui/static/imgs/icon.png b/T3SF/gui/static/imgs/icon.png new file mode 100644 index 0000000..c5598de Binary files /dev/null and b/T3SF/gui/static/imgs/icon.png differ diff --git a/T3SF/gui/static/imgs/logo-dark.png b/T3SF/gui/static/imgs/logo-dark.png new file mode 100644 index 0000000..dc065ee Binary files /dev/null and b/T3SF/gui/static/imgs/logo-dark.png differ diff --git a/T3SF/gui/static/imgs/logo-light.png b/T3SF/gui/static/imgs/logo-light.png new file mode 100644 index 0000000..abf6909 Binary files /dev/null and b/T3SF/gui/static/imgs/logo-light.png differ diff --git a/T3SF/gui/static/js/bootstrap_toasts.js b/T3SF/gui/static/js/bootstrap_toasts.js new file mode 100644 index 0000000..242cabe --- /dev/null +++ b/T3SF/gui/static/js/bootstrap_toasts.js @@ -0,0 +1,38 @@ +const b5toastContainerElement = document.getElementById("toast-container"); + +const b5toast = { + delayInMilliseconds: 5000, + htmlToElement: function (html) { + const template = document.createElement("template"); + html = html.trim(); + template.innerHTML = html; + return template.content.firstChild; + }, + show: function (color, title, message, delay) { + title = title ? title : ""; + if (color == "warning") { + txt_color = "black"; + } + else{ + txt_color = "white"; + } + const html = ` +

`; + const toastElement = b5toast.htmlToElement(html); + b5toastContainerElement.appendChild(toastElement); + const toast = new bootstrap.Toast(toastElement, { + delay: delay?delay:b5toastdelayInMilliseconds, + animation: true + }); + toast.show(); + setTimeout(() => toastElement.remove(), delay?delay:b5toastdelayInMilliseconds + 3000); // let a certain margin to allow the "hiding toast animation" + }, +}; \ No newline at end of file diff --git a/T3SF/gui/static/js/copy.js b/T3SF/gui/static/js/copy.js new file mode 100644 index 0000000..a07458a --- /dev/null +++ b/T3SF/gui/static/js/copy.js @@ -0,0 +1,28 @@ +export default function copyToClipBoard(text) { + if (navigator.clipboard) { + return navigator.clipboard.writeText(text) + } + // Compatible with old browsers such as Chrome <=65, Edge <=18 & IE + // Compatible with HTTP + else if (document.queryCommandSupported?.("copy")) { + const textarea = document.createElement("textarea") + textarea.value = text + + textarea.style.position = "fixed" // Avoid scrolling to bottom + textarea.style.opacity = "0" + + document.body.appendChild(textarea) + textarea.select() + + // Security exception may be thrown by some browsers + try { + document.execCommand("copy") + } catch (e) { + console.error(e) + } finally { + document.body.removeChild(textarea) + } + } else { + console.error("Copy failed.") + } +} diff --git a/T3SF/gui/static/js/theme_switcher.js b/T3SF/gui/static/js/theme_switcher.js new file mode 100644 index 0000000..8a57c26 --- /dev/null +++ b/T3SF/gui/static/js/theme_switcher.js @@ -0,0 +1,53 @@ +// Check the initial theme preference and set it +const themePreference = localStorage.getItem('theme'); +const prefersDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; + +if (themePreference === 'dark' || (themePreference === null && prefersDarkMode)) { + enableDarkMode(); +} else { + enableLightMode(); +} + +// Toggle the theme when the button is clicked +const themeToggle = document.getElementById('theme-toggle'); + +themeToggle.addEventListener('click', () => { + if (document.documentElement.getAttribute('data-bs-theme') === 'dark') { + enableLightMode(); + } else { + enableDarkMode(); + } +}); + +// Enable dark mode +function enableDarkMode() { + document.documentElement.setAttribute('data-bs-theme', 'dark'); + localStorage.setItem('theme', 'dark'); + replaceClassNames('bg-light', 'bg-darkmode'); + replaceClassNames('bg-white', 'bg-dark'); + document.getElementById('theme-icon').classList.replace('bi-moon-fill', 'bi-sun-fill'); + document.getElementById('theme-text').textContent = 'Light mode'; + document.querySelectorAll('#logo-image').forEach((image) => {image.src = "/static/imgs/logo-dark.png";}); + document.getElementById('json-editor-container')?.classList.replace('jse-theme-light', 'jse-theme-dark'); +} + +// Enable light mode +function enableLightMode() { + document.documentElement.setAttribute('data-bs-theme', 'light'); + localStorage.setItem('theme', 'light'); + replaceClassNames('bg-darkmode', 'bg-light'); + replaceClassNames('bg-dark', 'bg-white'); + document.getElementById('theme-icon').classList.replace('bi-sun-fill', 'bi-moon-fill'); + document.getElementById('theme-text').textContent = 'Dark mode'; + document.querySelectorAll('#logo-image').forEach((image) => {image.src = "/static/imgs/logo-light.png"; }); + document.getElementById('json-editor-container')?.classList.replace('jse-theme-dark', 'jse-theme-light'); +} + +// Replace class names +function replaceClassNames(oldClassName, newClassName) { + const elements = document.querySelectorAll(`.${oldClassName}`); + elements.forEach((element) => { + element.classList.remove(oldClassName); + element.classList.add(newClassName); + }); +} \ No newline at end of file diff --git a/T3SF/gui/static/js/vanilla-jsoneditor/CHANGELOG.md b/T3SF/gui/static/js/vanilla-jsoneditor/CHANGELOG.md new file mode 100644 index 0000000..0d9b558 --- /dev/null +++ b/T3SF/gui/static/js/vanilla-jsoneditor/CHANGELOG.md @@ -0,0 +1,1472 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [0.17.8](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.7...v0.17.8) (2023-06-21) + + +### Bug Fixes + +* method `scrollTo` not always expanding an invisible section of an array ([bda3922](https://github.com/josdejong/svelte-jsoneditor/commit/bda39222fdcd9ec58a4c077dea4245c6fa6fe133)) +* update dependencies (`codemirror`, `jsonrepair`, `sass`, and others) ([3054f96](https://github.com/josdejong/svelte-jsoneditor/commit/3054f964c52ddeb44b486dabb1a804c95c5395e7)) + +### [0.17.7](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.6...v0.17.7) (2023-06-13) + + +### Bug Fixes + +* [#278](https://github.com/josdejong/svelte-jsoneditor/issues/278) cannot filter debugging output ([b2317a5](https://github.com/josdejong/svelte-jsoneditor/commit/b2317a5db900b77644d992f2f14c97e1de31c3c5)) + +### [0.17.6](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.5...v0.17.6) (2023-06-12) + + +### Features + +* update dependencies and devDependencies ([fc8ef83](https://github.com/josdejong/svelte-jsoneditor/commit/fc8ef8340e1a6f825bf335000a7f4b70ce2c8182)) + + +### Bug Fixes + +* let `createAjvValidator` throw an error when the JSON schema contains an error ([7cfb233](https://github.com/josdejong/svelte-jsoneditor/commit/7cfb233d92862a34557537cef7840926976b40e1)) +* unused CSS selector `".jse-column-header span.jse-column-sort-icon"` ([51c1d54](https://github.com/josdejong/svelte-jsoneditor/commit/51c1d5441085581402cc916e9479c2c91d5c068e)) + +### [0.17.5](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.4...v0.17.5) (2023-06-08) + + +### Bug Fixes + +* keep focus on the editor after clicking a message action button ([aeb5d8f](https://github.com/josdejong/svelte-jsoneditor/commit/aeb5d8f9da13054cdd61cc866edad7b3f128eb66)) +* start typing in an empty document in tree mode throwing an error ([747f2b4](https://github.com/josdejong/svelte-jsoneditor/commit/747f2b4d78c5c30c0f08ac6fea4823ba6d537be2)) +* throw an error when a custom Ajv instance provided via `onCreateAjv` is configured wrongly ([78771cd](https://github.com/josdejong/svelte-jsoneditor/commit/78771cd3a3326bbdb56f400648bafe3c306f6b65)) + +### [0.17.4](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.3...v0.17.4) (2023-05-18) + + +### Bug Fixes + +* [#275](https://github.com/josdejong/svelte-jsoneditor/issues/275) flush debounced changes in `text` mode before blur and destroy ([e8270e9](https://github.com/josdejong/svelte-jsoneditor/commit/e8270e99354cc965dea209a23f60dd5c9000ca57)) + +### [0.17.3](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.2...v0.17.3) (2023-05-05) + + +### Features + +* update dependencies (jsonrepair and dev dependencies) ([d2c424a](https://github.com/josdejong/svelte-jsoneditor/commit/d2c424a14997d515b1cee4d26d0e30b7bbae1c1e)) + +### [0.17.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.1...v0.17.2) (2023-05-03) + + +### Features + +* update dependencies (codemirror, sass) ([aeb9af5](https://github.com/josdejong/svelte-jsoneditor/commit/aeb9af585753a6847e5239afefbbf6b985d3e6c6)) + + +### Bug Fixes + +* [#238](https://github.com/josdejong/svelte-jsoneditor/issues/238) editor scrolls the browser page to top on Safari when getting focus ([20129f8](https://github.com/josdejong/svelte-jsoneditor/commit/20129f87e43e639c75b70383771d11e2df6431e7)) + +### [0.17.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.17.0...v0.17.1) (2023-04-17) + + +### Features + +* make the option `askToFormat` configurable (fix [#252](https://github.com/josdejong/svelte-jsoneditor/issues/252)) ([5e5494f](https://github.com/josdejong/svelte-jsoneditor/commit/5e5494f97da667dc5c8295665dc263b48867f077)) + + +### Bug Fixes + +* [#142](https://github.com/josdejong/svelte-jsoneditor/issues/142) cannot select contents in readOnly text mode ([99922dc](https://github.com/josdejong/svelte-jsoneditor/commit/99922dc3f5f981a742bb2a2b31151bfe1c09ecb3)) +* [#251](https://github.com/josdejong/svelte-jsoneditor/issues/251) enable search in text mode when readOnly ([50f8889](https://github.com/josdejong/svelte-jsoneditor/commit/50f8889597466ec8027c07dda3d4e613684aa9dc)) +* update dependencies (`jsonrepair` and `@codemirror/view`) ([5ff1306](https://github.com/josdejong/svelte-jsoneditor/commit/5ff130610867d69832722cd3b9b4b9ac40d4e57d)) + +## [0.17.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.16.1...v0.17.0) (2023-04-17) + + +### ⚠ BREAKING CHANGES + +* The pointers to entry files and the exports map in the package.json file have been changed. This is just an under-the-hood change for most use cases. + +### Features + +* change `stringifyJSONPath` and `parseJSONPath` to have a more human friendly output ([f0f8b80](https://github.com/josdejong/svelte-jsoneditor/commit/f0f8b805873c6c0ba48340df236755963eacf93e)) +* update dependencies and devDependencies ([f32281f](https://github.com/josdejong/svelte-jsoneditor/commit/f32281f37c1780a8bca047a16d31e4b2083542e9)) +* update dependencies including @sveltejs/package, changing the package structure ([#258](https://github.com/josdejong/svelte-jsoneditor/issues/258)) ([78603d4](https://github.com/josdejong/svelte-jsoneditor/commit/78603d4e47549c45530c4763b95a1364d7144f94)) + +### [0.16.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.16.0...v0.16.1) (2023-03-24) + + +### Bug Fixes + +* change the row numbering in table mode to zero based for consistency ([d923268](https://github.com/josdejong/svelte-jsoneditor/commit/d923268b2d550e2779051bb43b08d3daee8f91fe)) +* give the optional `rootPath` option of `transform` a default value ([b38db6c](https://github.com/josdejong/svelte-jsoneditor/commit/b38db6c1e3b3b7ff87a92bd61049a5a193ac713a)) + +## [0.16.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.15.1...v0.16.0) (2023-03-15) + + +### ⚠ BREAKING CHANGES + +* Methods `set`, `update`, `patch`, `expand`, `acceptAutoRepair`, `scrollTo`, `focus`, `refresh`, +`updateProps` and `destroy` are now async and return a Promise. + +### Features + +* implement the public method `scrollTo` for mode `table` ([a615548](https://github.com/josdejong/svelte-jsoneditor/commit/a615548aa26470d0535d1e1ddb781654b44f3315)) +* update dependencies `svelte-awesome` and `svelte-select` and some devDependencies ([05acdcf](https://github.com/josdejong/svelte-jsoneditor/commit/05acdcfaf03b69aae3a82f10bf2bc3532ebe61c1)) + + +### Bug Fixes + +* [#189](https://github.com/josdejong/svelte-jsoneditor/issues/189) setup eslint to enforce `.js` file extensions on all imports ([cf37451](https://github.com/josdejong/svelte-jsoneditor/commit/cf37451e46c56e637924095ab11d6883ade08289)) +* [#236](https://github.com/josdejong/svelte-jsoneditor/issues/236) change the public methods to return a Promise`, resolving after the editor is re-rendered ([dbfb1a6](https://github.com/josdejong/svelte-jsoneditor/commit/dbfb1a68a3104b38dbb45338fc1fdae075038930)) +* [#237](https://github.com/josdejong/svelte-jsoneditor/issues/237) parse error in case of empty text, and parse error not cleared on change ([31e9e50](https://github.com/josdejong/svelte-jsoneditor/commit/31e9e50f461cc8bd21d746df1948d645f7d5e118)) + +### [0.15.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.15.0...v0.15.1) (2023-03-01) + + +### Bug Fixes + +* missing .js extension on import ([ae66310](https://github.com/josdejong/svelte-jsoneditor/commit/ae663106b68fa880c47fbdbed33032c696d8aa28)) + +## [0.15.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.10...v0.15.0) (2023-03-01) + + +### ⚠ BREAKING CHANGES + +* when there are no validation errors, the return value of +method `validate()` and parameter `contentErrors` in callback `onChange` is +now `null` instead of `{ validationErrors: [] }`. + +### Features + +* faster `getColumns` without sampling ([0937718](https://github.com/josdejong/svelte-jsoneditor/commit/0937718fb5c30b996a955aa24ca336163d92877c)) +* sample the array to detect headers (fast) and have a button to enforce checking all items ([452d168](https://github.com/josdejong/svelte-jsoneditor/commit/452d168595eef1b24d38d9c97f7d74eadb5ee243)) + + +### Bug Fixes + +* [#226](https://github.com/josdejong/svelte-jsoneditor/issues/226) return `null` instead of `{ validationErrors: [] }` when there are no validation errors ([395dbd1](https://github.com/josdejong/svelte-jsoneditor/commit/395dbd10b0fac21876b500295668bc0b5ef94010)) +* [#231](https://github.com/josdejong/svelte-jsoneditor/issues/231) code mode grabbing focus on creation ([5df57ee](https://github.com/josdejong/svelte-jsoneditor/commit/5df57eea7a8c6600efb4f8f1a41ad338fce77e0a)) +* update dependencies and devDependencies ([9275c34](https://github.com/josdejong/svelte-jsoneditor/commit/9275c3494e4fcf45bd370f9ff77554d9193db4ac)) + +### [0.14.10](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.9...v0.14.10) (2023-02-24) + + +### Features + +* implement an "Edit row" action in the context menu of table mode ([4211a14](https://github.com/josdejong/svelte-jsoneditor/commit/4211a14ffaa4b64b58ff4ecbbde18e232bf9c48e)) + + +### Bug Fixes + +* [#226](https://github.com/josdejong/svelte-jsoneditor/issues/226) export typeguards `isContentParseError` and `isContentValidationErrors` ([0c8189f](https://github.com/josdejong/svelte-jsoneditor/commit/0c8189fadd74af83a3a17aa7b6efdf0c95ef1561)) +* table mode broken due to a wrong import (regression since v0.14.6) ([1e48fe5](https://github.com/josdejong/svelte-jsoneditor/commit/1e48fe50ac2ed613682330e628b1dcfbc224c0c5)) + +### [0.14.9](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.8...v0.14.9) (2023-02-22) + + +### Bug Fixes + +* throw an error when forgetting to end a Lodash `_.chain(...)` with `.value()` ([f76e4e8](https://github.com/josdejong/svelte-jsoneditor/commit/f76e4e8bf047680835a34cc5236e3b19d4df9f73)) + +### [0.14.8](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.7...v0.14.8) (2023-02-22) + + +### Bug Fixes + +* ensure dark indentation markers when using dark theme ([f7b936e](https://github.com/josdejong/svelte-jsoneditor/commit/f7b936ef65293813a9e744b12123101d80a08e78)) + +### [0.14.7](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.6...v0.14.7) (2023-02-22) + + +### Bug Fixes + +* some imports missing a .js extension ([5493931](https://github.com/josdejong/svelte-jsoneditor/commit/5493931681b49ade593777561b52da24213adfcd)) + +### [0.14.6](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.5...v0.14.6) (2023-02-22) + + +### Features + +* add indentation guide line in text mode (fixes [#225](https://github.com/josdejong/svelte-jsoneditor/issues/225)) ([09f2575](https://github.com/josdejong/svelte-jsoneditor/commit/09f257568567eb1b01ff68b955d69bebe54cff95)) +* change the JavaScript and Lodash query languages to generate immutable, chained queries ([3e92c10](https://github.com/josdejong/svelte-jsoneditor/commit/3e92c1048791f44d58c8b1636bb0e1bfeb914c74)) + + +### Bug Fixes + +* jmespathQueryLanguage not working with non-native JSON data types like LosslessNumber ([e2c8e3d](https://github.com/josdejong/svelte-jsoneditor/commit/e2c8e3dfc9242f4883dd3f1261a0b5a0b6abd71c)) + +### [0.14.5](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.4...v0.14.5) (2023-02-15) + + +### Features + +* update dependencies and devDependencies ([d0e2568](https://github.com/josdejong/svelte-jsoneditor/commit/d0e2568540efcc7d2066044bbd2d3673902fe6c6)) + + +### Bug Fixes + +* styling issues of the selection dropdown in dark mode ([886330e](https://github.com/josdejong/svelte-jsoneditor/commit/886330e75879ccdd383a9f324646b96ae9406019)) +* the "Pick" field in the Transform Wizard not restoring the previously selected fields correctly ([635f662](https://github.com/josdejong/svelte-jsoneditor/commit/635f6624c21a194b5ce96805c9c3a12f1238b234)) + +### [0.14.4](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.3...v0.14.4) (2023-02-03) + + +### Features + +* add a "Show me" button to the message of the parse error ([347910a](https://github.com/josdejong/svelte-jsoneditor/commit/347910a675578f724b7188a8ff901611944cbafe)) +* show a message "Do you want to format the JSON?" when loading compact JSON ([42c6c95](https://github.com/josdejong/svelte-jsoneditor/commit/42c6c95ecdc8a8856e67d7ef1753693627aee8de)) + + +### Bug Fixes + +* [#219](https://github.com/josdejong/svelte-jsoneditor/issues/219) horizontal scrollbar visible in search box ([d3ffdef](https://github.com/josdejong/svelte-jsoneditor/commit/d3ffdef065e2dcb98fe1cae981e741fbfa136d08)) +* improve styling of the message text ([e8a86d9](https://github.com/josdejong/svelte-jsoneditor/commit/e8a86d97792993306700bdb447724a287993da7f)) + +### [0.14.3](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.2...v0.14.3) (2023-01-27) + + +### Bug Fixes + +* creating a new object or array by typing `{` or `]` broken (regression since `v0.14.1`) ([f7b5f92](https://github.com/josdejong/svelte-jsoneditor/commit/f7b5f925d7ae64aadad34007b82abc239127f537)) + +### [0.14.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.1...v0.14.2) (2023-01-26) + + +### Features + +* expose utility actions `resizeObserver` and `onEscape` ([c705ea2](https://github.com/josdejong/svelte-jsoneditor/commit/c705ea2bb8fa22797b9078de9cadec726c85ab4a)) + +### [0.14.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.14.0...v0.14.1) (2023-01-26) + + +### Features + +* implement duplicating, inserting, and removing rows in table mode ([9b691d1](https://github.com/josdejong/svelte-jsoneditor/commit/9b691d1536ba2d52b42e6da24b28a89b6bfb17ca)) + + +### Bug Fixes + +* close only the top modal instead of all modals on Escape ([b102843](https://github.com/josdejong/svelte-jsoneditor/commit/b102843dcc7ae411944ea745c4edd868a593dbde)) +* editor cannot get focus by clicking selected key or value ([7e83a36](https://github.com/josdejong/svelte-jsoneditor/commit/7e83a36b1c9301ce965ba6cc874fe575f6525a75)) +* improve detection of column names in large arrays with non-homogeneous data ([5704325](https://github.com/josdejong/svelte-jsoneditor/commit/5704325cfc2759e879a34de3e075cd0610d8f75c)) +* maintain order of columns after sorting the contents ([23bbf56](https://github.com/josdejong/svelte-jsoneditor/commit/23bbf56db274062e5d03906963e7e24bbcaab78c)) +* multi-select via Shift+Click not working in tree mode ([aafd933](https://github.com/josdejong/svelte-jsoneditor/commit/aafd933d48672cd2f37a9811183ca4f093fcd4d7)) + +## [0.14.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.13.1...v0.14.0) (2023-01-20) + + +### ⚠ BREAKING CHANGES + +* Callback changed from `onRenderMenu(mode, items)` to `onRenderMenu(items, { mode, modal })`. + +### Features + +* add more context information to `onRenderMenu`: `mode` and `modal` ([fbbdb87](https://github.com/josdejong/svelte-jsoneditor/commit/fbbdb87548fa0e2d163fc5ad39367af54a13b4cc)) + +### [0.13.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.13.0...v0.13.1) (2023-01-20) + + +### Bug Fixes + +* inserting a new character uppercase ([d836096](https://github.com/josdejong/svelte-jsoneditor/commit/d8360968d35b8469c51fa73f5af765b86bc55321)) + +## [0.13.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.12.0...v0.13.0) (2023-01-20) + + +### ⚠ BREAKING CHANGES + +* CSS variable `--jse-selection-background-light-color` is renamed to `--jse-selection-background-inactive-color` + +### Features + +* more flexible styling for contents in tree mode with new CSS variables ([e29f85e](https://github.com/josdejong/svelte-jsoneditor/commit/e29f85e1d5ac77993117225c862b8c056ad9a4ad)) + + +### Bug Fixes + +* update dependencies and devDependencies ([008dcd6](https://github.com/josdejong/svelte-jsoneditor/commit/008dcd655b8e680cebff7d163daa19b0327c9662)) + +## [0.12.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.8...v0.12.0) (2023-01-18) + + +### ⚠ BREAKING CHANGES + +* The TypeScript definitions of `createAjvValidator` and `renderJSONSchemaEnum` are +changed: passing `JSONSchema` and `JSONSchemaDefinitions` instead of `JSONValue`. + +### Bug Fixes + +* [#210](https://github.com/josdejong/svelte-jsoneditor/issues/210) `renderJSONSchemaEnum` not working enums inside an array ([887bf23](https://github.com/josdejong/svelte-jsoneditor/commit/887bf23c6aeb63de3a75b677f0545a51efc3c449)) +* cannot click the bottom right quarter of the context menu pointer ([b176f01](https://github.com/josdejong/svelte-jsoneditor/commit/b176f0101d3f860d54faa7c433050f69d28daa72)) +* minor updates of dependencies and devDependencies ([c654ed7](https://github.com/josdejong/svelte-jsoneditor/commit/c654ed7074ea01335f8a5db0e2fd447793a03bf4)) +* remove test files from the `svelte-jsoneditor` npm package ([fe21ffb](https://github.com/josdejong/svelte-jsoneditor/commit/fe21ffb8195417531e6f2103ffd0e9b2ff7e392c)) +* switch from `ajv-dist` to `ajv` again (works ok now with rollup and vite) ([f43a5fb](https://github.com/josdejong/svelte-jsoneditor/commit/f43a5fb364c161daea507693110d67b96bb19b67)) +* update dependencies and dev dependencies ([7229ae6](https://github.com/josdejong/svelte-jsoneditor/commit/7229ae62d7495614739de4593963707cbdd88e58)) + +### [0.11.8](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.7...v0.11.8) (2023-01-07) + +### [0.11.7](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.6...v0.11.7) (2023-01-07) + +### [0.11.6](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.5...v0.11.6) (2023-01-07) + + +### Bug Fixes + +* upgrade to jsonrepair@3.0.2 and lossless-json@2.0.5 containing an issue with unicode characters ([22cb40e](https://github.com/josdejong/svelte-jsoneditor/commit/22cb40e6972c3e8a93a3bad8730b6e8e82b374b3)) + +### [0.11.5](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.4...v0.11.5) (2022-12-20) + + +### Features + +* upgrade all dependencies, most notably `svelte-select@5, `@sveltejs/kit@1.0.0`, `vite@4.0.2` ([be135ee](https://github.com/josdejong/svelte-jsoneditor/commit/be135ee77c147e7dc59948955370973aa6c232db)) +* upgrade to `jsonrepair@3.0.0`, improving performance and repairing more cases ([8a315cf](https://github.com/josdejong/svelte-jsoneditor/commit/8a315cf8bee311fc2fcf46d37954a26568e5765f)) + +### [0.11.4](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.3...v0.11.4) (2022-12-14) + + +### Bug Fixes + +* method `scrollTo` not returning a promise anymore (regression since v0.11.0) ([524799f](https://github.com/josdejong/svelte-jsoneditor/commit/524799f8126f6b0f4bb36f5c81087b57d8af7496)) + +### [0.11.3](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.2...v0.11.3) (2022-12-13) + + +### Bug Fixes + +* [#206](https://github.com/josdejong/svelte-jsoneditor/issues/206) remove the fixed width of the mode toggle buttons ([8e0cda3](https://github.com/josdejong/svelte-jsoneditor/commit/8e0cda3c1c91e97b1c41ff28c5b0ac80cf8c26ab)) +* [#96](https://github.com/josdejong/svelte-jsoneditor/issues/96) add missing properties to `JSONEditorPropsOptional` ([410fd80](https://github.com/josdejong/svelte-jsoneditor/commit/410fd801297faa46afef201569bfd79792de17e1)) +* [#96](https://github.com/josdejong/svelte-jsoneditor/issues/96) make all properties of JSONEditorPropsOptional optional ([4bc33e8](https://github.com/josdejong/svelte-jsoneditor/commit/4bc33e88450396a1860db43baabe15986bfc7cd1)) +* cannot edit values of non-existing nested objects in table mode ([8127571](https://github.com/josdejong/svelte-jsoneditor/commit/8127571d74864587788811e08a64a5345d11ae19)) +* improve landing page message in table mode when opening an array without values ([f238a92](https://github.com/josdejong/svelte-jsoneditor/commit/f238a9236740d261456a5f7841ef0de2ecc7fb74)) + +### [0.11.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.1...v0.11.2) (2022-12-09) + + +### Bug Fixes + +* [#204](https://github.com/josdejong/svelte-jsoneditor/issues/204) unresolvable imports with `.ts` extension ([d45828b](https://github.com/josdejong/svelte-jsoneditor/commit/d45828b1d1f370ff25322ef1f5204c1050d4f60c)) + +### [0.11.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.11.0...v0.11.1) (2022-12-07) + + +### Bug Fixes + +* table mode landing page not handling an empty array correctly ([4b4d039](https://github.com/josdejong/svelte-jsoneditor/commit/4b4d0398333d59d95d6fd3e28a67038c3b8781ac)) + +## [0.11.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.10.4...v0.11.0) (2022-12-07) + + +### ⚠ BREAKING CHANGES + +* In the `TransformModalCallback`, the property `selectedPath` is renamed to `rootPath`. The css variables `--jse-context-menu-button-*` are renamed to `--jse-context-menu-pointer-*`. + +### Features + +* create a landing page for non-array content in table mode ([558d8c1](https://github.com/josdejong/svelte-jsoneditor/commit/558d8c1321b08de038623f158eab90d4875747f0)) +* implement table mode [#156](https://github.com/josdejong/svelte-jsoneditor/issues/156) ([#202](https://github.com/josdejong/svelte-jsoneditor/issues/202)) ([6fde147](https://github.com/josdejong/svelte-jsoneditor/commit/6fde14780624888e648b807207346d11437ef9ba)) + + +### Bug Fixes + +* [#187](https://github.com/josdejong/svelte-jsoneditor/issues/187) duplicate id's of svg's ([b95ac82](https://github.com/josdejong/svelte-jsoneditor/commit/b95ac82f56f9565d9779bf8bd9186c9adfb3565d)) +* support opening Sort and Transform modals from a JSONEditor modal ([4652c1f](https://github.com/josdejong/svelte-jsoneditor/commit/4652c1fe3b29b37638a2b2692099b58f49ae84a4)) +* unnecessary z-index on the context menu pointer ([5a6b2f6](https://github.com/josdejong/svelte-jsoneditor/commit/5a6b2f65fb5b17e7306cafbf19f1c50003759dae)) +* z-index issue with the table header ([8f6a7c7](https://github.com/josdejong/svelte-jsoneditor/commit/8f6a7c77fca5076152841da518a64c5f91652c60)) + +### [0.10.4](https://github.com/josdejong/svelte-jsoneditor/compare/v0.10.3...v0.10.4) (2022-12-05) + + +### Bug Fixes + +* repair modal accidentally showing a mode toggle ([798f668](https://github.com/josdejong/svelte-jsoneditor/commit/798f668a63c4534ad008b209b9e0c03b31040fd3)) +* update to `lossless-json@2.0.3`, fix throwing an error in case of bad characters like a newline ([7f7b59e](https://github.com/josdejong/svelte-jsoneditor/commit/7f7b59eac6a965b3c5238f934a4ab4d1b3af152c)) + +### [0.10.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.10.1...v0.10.2) (2022-11-17) + + +### Bug Fixes + +* limit the number of rendered validation errors in the overview list ([b0ae546](https://github.com/josdejong/svelte-jsoneditor/commit/b0ae5461e8d69b7336bf1f1d8c4072c49280b15d)) +* reset the selection instead of clearing it when the selected contents are removed ([7c937f5](https://github.com/josdejong/svelte-jsoneditor/commit/7c937f534fd625aca481a22138fc55c9a30b7d5f)) + +### [0.10.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.10.0...v0.10.1) (2022-11-10) + + +### Bug Fixes + +* improve highlighting color of search matches in dark mode ([fb7bdd9](https://github.com/josdejong/svelte-jsoneditor/commit/fb7bdd93ee35c752711a9420a441d99981062983)) + +## [0.10.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.9.2...v0.10.0) (2022-11-10) + + +### ⚠ BREAKING CHANGES + +* The signature of `createAjvValidator` is changed from up to three unnamed arguments +`createAjvValidator(schema, schemaDefinitions, ajvOptions)` to a single object with options +`createAjvValidator({ schema, schemaDefinitions, ajvOptions })`. + +### Features + +* implement `onCreateAjv` callback for the `createAjvValidator` plugin ([da3d76c](https://github.com/josdejong/svelte-jsoneditor/commit/da3d76ce4087464a0d66566f9239498bbff710fd)) + + +### Bug Fixes + +* [#188](https://github.com/josdejong/svelte-jsoneditor/issues/188) selected text not visible in text mode when in dark mode ([41856da](https://github.com/josdejong/svelte-jsoneditor/commit/41856da229912db510090049b47bae3543f996a3)) +* improve highlighting color of search matches in dark mode ([b85c260](https://github.com/josdejong/svelte-jsoneditor/commit/b85c26002c376fd15b340e71b1e2225747785365)) +* negative numbers like `-4.1` not highlighted with the right color in tree mode ([071c3f9](https://github.com/josdejong/svelte-jsoneditor/commit/071c3f9d248e18c5638c5352ca4a60fb227f639e)) + +### [0.9.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.9.1...v0.9.2) (2022-11-04) + + +### Bug Fixes + +* incorrect cursor style for ColorPicker & BooleanToggle ([#184](https://github.com/josdejong/svelte-jsoneditor/issues/184)) ([12e60e5](https://github.com/josdejong/svelte-jsoneditor/commit/12e60e5b836f9294ea4a0b3bfe2384745c0509cf)) +* remove root `$` prefix from the path in the Sort and Transform modal ([50ce3f0](https://github.com/josdejong/svelte-jsoneditor/commit/50ce3f04980a02164a4fa897afec942933e21db9)) +* when switching to a different JSON parser, stringify and parse the contents again ([2cece4e](https://github.com/josdejong/svelte-jsoneditor/commit/2cece4ebc7dbd75dc28f743c5b3ea12470848e7d)) + +### [0.9.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.9.0...v0.9.1) (2022-11-02) + + +### Bug Fixes + +* export and document all selection utility functions again (reverting their removal in `v0.9.0`) ([0dd1dee](https://github.com/josdejong/svelte-jsoneditor/commit/0dd1dee55983cb261911814870410a57be87590c)) +* update codemirror dependencies and all devDependencies ([77cbb6d](https://github.com/josdejong/svelte-jsoneditor/commit/77cbb6d4fc95f3d0867a1117af682d6d534903f8)) + +## [0.9.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.8.0...v0.9.0) (2022-10-25) + + +### ⚠ BREAKING CHANGES + +* Not exporting a set of undocumented utility functions anymore: `isValueSelection`, +`isKeySelection`, `isInsideSelection`, `isAfterSelection`, `isMultiSelection`, +`isEditingSelection`, `createValueSelection`, `createKeySelection`, `createInsideSelection`, +`createAfterSelection`, `createMultiSelection`. And not exporting components `SortModal` and +`TransformModal` anymore. + +### Features + +* export utility functions `isContent`, `isTextContent`, `isJSONContent`, `toTextContent`, ([d21fc6d](https://github.com/josdejong/svelte-jsoneditor/commit/d21fc6d09c731ad10702db58893ebce7aeadd744)), closes [#173](https://github.com/josdejong/svelte-jsoneditor/issues/173) + + +### Bug Fixes + +* [#174](https://github.com/josdejong/svelte-jsoneditor/issues/174) the `OnChange` signature containing an `any` type instead of `OnChangeStatus` ([c2d626f](https://github.com/josdejong/svelte-jsoneditor/commit/c2d626f7204790cc86954dc535949dad50822cbd)) +* `any` type in `JSONPathParser.parse` type definition ([19363b4](https://github.com/josdejong/svelte-jsoneditor/commit/19363b42cc98f702b04bb5cbaaa0a3b0b2edee4b)) + +## [0.8.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.11...v0.8.0) (2022-10-24) + + +### ⚠ BREAKING CHANGES + +* The custom `FontAwesomeIcon` is now replaced with `IconDefinition` from FontAwesome + +### Bug Fixes + +* [#169](https://github.com/josdejong/svelte-jsoneditor/issues/169) use `IconDefinition` from FontAwesome instead of a custom interface `FontAwesomeIcon` ([9d693f9](https://github.com/josdejong/svelte-jsoneditor/commit/9d693f94ebeffa187a2f3ab8f85998b987be8b94)) + +### [0.7.11](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.10...v0.7.11) (2022-10-18) + + +### Features + +* convert primitive values like a string into an object or array holding the value ([67d78f0](https://github.com/josdejong/svelte-jsoneditor/commit/67d78f09744f0ff4d879728f2d1b3aaa92fa5e8c)), closes [#160](https://github.com/josdejong/svelte-jsoneditor/issues/160) + + +### Bug Fixes + +* correctly handle property names containing spaces and special characters in JMESPath ([8e7d3e8](https://github.com/josdejong/svelte-jsoneditor/commit/8e7d3e89dbd00edc045147b203f606171e0486b8)) +* errors not displayed at the right position in text mode when `escapeUnicodeCharacters=true` ([8e7be40](https://github.com/josdejong/svelte-jsoneditor/commit/8e7be40778eb31f4fea51bf52e79803c411c1ebf)) +* improve error message when using `content.text` wrongly (see [#166](https://github.com/josdejong/svelte-jsoneditor/issues/166)) ([cdad5fb](https://github.com/josdejong/svelte-jsoneditor/commit/cdad5fb8712cd45ca14333ded75adc5877410476)) +* revert dev dependency `rollup-plugin-dts` to v4 too to have it work with rollup v2 ([2b183c7](https://github.com/josdejong/svelte-jsoneditor/commit/2b183c7bbb3003a7dfaa19404e1f76d005558236)) + +### [0.7.10](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.9...v0.7.10) (2022-10-13) + + +### Features + +* implement a path editor in the Navigation Bar ([#164](https://github.com/josdejong/svelte-jsoneditor/issues/164)) ([9692634](https://github.com/josdejong/svelte-jsoneditor/commit/969263447d080eef830755744363d547365ef1d4)) + + +### Bug Fixes + +* [#162](https://github.com/josdejong/svelte-jsoneditor/issues/162) clicking the color picker causes a form submit ([42f2586](https://github.com/josdejong/svelte-jsoneditor/commit/42f25865e8dd61b574d663a72ac6ba643f21bd1a)) +* show paths in Sort modal as a JSONPath (dot separated) instead of JSONPointer ([3cde53d](https://github.com/josdejong/svelte-jsoneditor/commit/3cde53d6e34d195eb050dc1bdc35d383f06a0f7d)) + +### [0.7.9](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.8...v0.7.9) (2022-09-30) + + +### Bug Fixes + +* [#123](https://github.com/josdejong/svelte-jsoneditor/issues/123) use the main `parser` instead of `validationParser` to determine any parse errors ([c18ede3](https://github.com/josdejong/svelte-jsoneditor/commit/c18ede30070f27a612b8019a77feaca97500e1bf)) + +### [0.7.8](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.7...v0.7.8) (2022-09-29) + + +### Bug Fixes + +* [#153](https://github.com/josdejong/svelte-jsoneditor/issues/153) code using a missing dependency `lossless-json` ([4a34214](https://github.com/josdejong/svelte-jsoneditor/commit/4a34214703843f0af6a0253652649cc33083b746)) + +### [0.7.7](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.6...v0.7.7) (2022-09-29) + + +### Features + +* implemented options `parser` and `validationParser` to support alternative JSON parsers like lossless-json ([#151](https://github.com/josdejong/svelte-jsoneditor/issues/151)) ([b47368b](https://github.com/josdejong/svelte-jsoneditor/commit/b47368b7de4c90bab89572210c869eaba64348a7)) + +### [0.7.6](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.5...v0.7.6) (2022-09-28) + + +### Bug Fixes + +* [#149](https://github.com/josdejong/svelte-jsoneditor/issues/149) double quote and unicode characters of control characters not being escaped correctly ([ab213e6](https://github.com/josdejong/svelte-jsoneditor/commit/ab213e6cf276d5556f675ccfd73d8b8265b40283)) +* escaping unicode characters not triggered when loading a document in text mode ([9dedca0](https://github.com/josdejong/svelte-jsoneditor/commit/9dedca039faa887805bd4b0755276c09d3671a45)) + +### [0.7.5](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.4...v0.7.5) (2022-09-21) + + +### Bug Fixes + +* [#98](https://github.com/josdejong/svelte-jsoneditor/issues/98) make copy compatible on non-secure origins and older browser ([#144](https://github.com/josdejong/svelte-jsoneditor/issues/144)) ([d43a646](https://github.com/josdejong/svelte-jsoneditor/commit/d43a6465cd01f91fe8d1634038dfcf67fa578c81)) + +### [0.7.4](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.3...v0.7.4) (2022-09-12) + + +### Bug Fixes + +* [#130](https://github.com/josdejong/svelte-jsoneditor/issues/130) do not open mobile keyboard when the editor is readonly ([1c669fa](https://github.com/josdejong/svelte-jsoneditor/commit/1c669fa731468bcabdcd72935fff468511a6fe5b)) +* [#138](https://github.com/josdejong/svelte-jsoneditor/issues/138) text of tooltip in text mode not readable when using a dark theme ([5e7790e](https://github.com/josdejong/svelte-jsoneditor/commit/5e7790e6fec93b9a8f6646ab4a064d12f9f74762)) +* [#139](https://github.com/josdejong/svelte-jsoneditor/issues/139) cannot use numpad keyboard to enter numbers in tree mode ([e2383d9](https://github.com/josdejong/svelte-jsoneditor/commit/e2383d94d2e51dc8d774122deb05ef0092095851)) +* inserting non capital case characters ([861f36d](https://github.com/josdejong/svelte-jsoneditor/commit/861f36db8a5f725e7716a34d72c7743659b8c823)) +* let `text` mode not change json contents directly into text contents, and prevent freezing when loading a large document ([#141](https://github.com/josdejong/svelte-jsoneditor/issues/141)) ([28b2b56](https://github.com/josdejong/svelte-jsoneditor/commit/28b2b5687d899533e45248eb76afef6aa8d10594)) + +### [0.7.3](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.2...v0.7.3) (2022-09-09) + + +### Bug Fixes + +* circular dependency caused by an unused import ([65a4f5d](https://github.com/josdejong/svelte-jsoneditor/commit/65a4f5d6041b3fd5de0eebc57b9603a0112c01f2)) + +### [0.7.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.1...v0.7.2) (2022-09-09) + + +### Features + +* update all dependencies ([dff38e3](https://github.com/josdejong/svelte-jsoneditor/commit/dff38e3ad7ec490e6fe34ef584f1622e8cae7b2f)) + + +### Bug Fixes + +* mark the package as side-effects free, allowing better optimization in bundlers ([23c1816](https://github.com/josdejong/svelte-jsoneditor/commit/23c1816ea3518360f3f0fd13ebf7acd9abb6d5a5)) + +### [0.7.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.7.0...v0.7.1) (2022-09-05) + + +### Bug Fixes + +* `onChange` event being fired when creating the editor in tree mode ([83e22f7](https://github.com/josdejong/svelte-jsoneditor/commit/83e22f74ab73260df0352235c0528b34a3ca5b19)) + +## [0.7.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.6...v0.7.0) (2022-09-01) + + +### ⚠ BREAKING CHANGES + +* Formerly, `onChange` did only fire after a change made by a user. Now, `onChange` also fires +after programmatic changes: when changing props or calling `patch`, `set`, `update`. + +### Features + +* always fire onChange, and let onPatch return a PatchResult (fixes [#128](https://github.com/josdejong/svelte-jsoneditor/issues/128)) ([fb45518](https://github.com/josdejong/svelte-jsoneditor/commit/fb4551805c796137ea85b90f6e00603a6244eeaa)) +* update dependencies ([#135](https://github.com/josdejong/svelte-jsoneditor/issues/135)) ([c2e8e0a](https://github.com/josdejong/svelte-jsoneditor/commit/c2e8e0a29d01ad848518cce7dd1226bc7509f499)) + + +### Bug Fixes + +* expanded state sometimes being reset when syncing content ([a6cce69](https://github.com/josdejong/svelte-jsoneditor/commit/a6cce69df27921d015a19957152a447ad1ea52b0)) + +### [0.6.6](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.5...v0.6.6) (2022-08-29) + + +### Bug Fixes + +* mobile keyboard opening all the time when selecting something in the editor on a touch device ([c2a0937](https://github.com/josdejong/svelte-jsoneditor/commit/c2a0937b6928388c82c76af3e57f1f3a2bc18fdb)) + +### [0.6.5](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.4...v0.6.5) (2022-08-29) + + +### Features + +* [#129](https://github.com/josdejong/svelte-jsoneditor/issues/129) allow passing additional options to `createAjvValidator` ([a66f230](https://github.com/josdejong/svelte-jsoneditor/commit/a66f230998a4e8c52a65d7cc5ce124968dec600f)) + + +### Bug Fixes + +* [#131](https://github.com/josdejong/svelte-jsoneditor/issues/131) backslash character not being escaped when `escapeControlCharacters: true` ([#133](https://github.com/josdejong/svelte-jsoneditor/issues/133)) ([1657d9a](https://github.com/josdejong/svelte-jsoneditor/commit/1657d9abe9568f76119275c8808f81a2805a1f73)) + +### [0.6.4](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.3...v0.6.4) (2022-08-19) + + +### Bug Fixes + +* [#124](https://github.com/josdejong/svelte-jsoneditor/issues/124) view jumping up when editor gets focus ([b94f531](https://github.com/josdejong/svelte-jsoneditor/commit/b94f5317cfba8f7dbe6debf915b9852949f6196f)) + +### [0.6.3](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.2...v0.6.3) (2022-08-16) + + +### Bug Fixes + +* minor update of all dependencies ([b61778a](https://github.com/josdejong/svelte-jsoneditor/commit/b61778a70a1df6a1073db0a52c86d10773201bc6)) + +### [0.6.2](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.1...v0.6.2) (2022-07-28) + + +### Bug Fixes + +* revert the ES workaround for `[@fortawesome](https://github.com/fortawesome)` again, it doesn't work anymore ([69533af](https://github.com/josdejong/svelte-jsoneditor/commit/69533af086d512d830804bbc1fd2cbd6d9e1aec8)) + +### [0.6.1](https://github.com/josdejong/svelte-jsoneditor/compare/v0.6.0...v0.6.1) (2022-07-28) + + +### Bug Fixes + +* make sure all imports in index.ts have a .js extension ([52431f6](https://github.com/josdejong/svelte-jsoneditor/commit/52431f61f13a7e7f8ad886d9dd10ca42d944accd)) +* re-introduce the ES workaround for `[@fortawesome](https://github.com/fortawesome)` again ([2a7284c](https://github.com/josdejong/svelte-jsoneditor/commit/2a7284c23b20bad7930198f530a84dbdea361b5c)) + +## [0.6.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.5.0...v0.6.0) (2022-07-28) + + +### ⚠ BREAKING CHANGES + +* The signature of `onChange` is changed from `onChange(updatedContent, previousContent, patchResult)` +to `onChange(updatedContent, previousContent, { contentErrors, patchResult })`. + +### Features + +* implement validate method and pass contentErrors via onChange, fixes [#56](https://github.com/josdejong/svelte-jsoneditor/issues/56) ([#119](https://github.com/josdejong/svelte-jsoneditor/issues/119)) ([9847382](https://github.com/josdejong/svelte-jsoneditor/commit/9847382396fe5f853f8ecfde4d5227175c498bf4)) + + +### Bug Fixes + +* [#118](https://github.com/josdejong/svelte-jsoneditor/issues/118) cursor position in TextMode being reset after changing `validator` ([e580e26](https://github.com/josdejong/svelte-jsoneditor/commit/e580e26e3c4d82935a9fed9804666c986d1c3b21)) + +## [0.5.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.4.0...v0.5.0) (2022-07-11) + + +### ⚠ BREAKING CHANGES + +* The bundled file has been moved into a separate npm package named `vanilla-jsoneditor`. Please replace: `import { JSONEditor} from "svelte-jsoneditor/dist/jsoneditor.js"` with `import { JSONEditor} from "vanilla-jsoneditor"`. Read more about v0.5.0: https://github.com/josdejong/svelte-jsoneditor/blob/main/CHANGELOG.md + +### Features + +* move bundle into a separate npm package vanilla-jsoneditor ([#114](https://github.com/josdejong/svelte-jsoneditor/issues/114)) ([e865be3](https://github.com/josdejong/svelte-jsoneditor/commit/e865be31e29417d5d5d4fbbd9ebdf9472a94e4f8)) + +## [0.4.0](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.60...v0.4.0) (2022-07-08) + + +### ⚠ BREAKING CHANGES + +* The 'code' mode has been renamed to 'text' mode. +* The type `JSONPath` is changed from `Array` to `Array`, +and some TypeScript types now come from `immutable-json-patch`. + +### Features + +* rename code mode to text mode ([#113](https://github.com/josdejong/svelte-jsoneditor/issues/113)) ([769fb8f](https://github.com/josdejong/svelte-jsoneditor/commit/769fb8ff5e913e61cceae0c074ebea34f15610b7)) +* state refactor ([#111](https://github.com/josdejong/svelte-jsoneditor/issues/111)) ([a58b4c3](https://github.com/josdejong/svelte-jsoneditor/commit/a58b4c33368f2d0ef39c2aba1a45498f4065c7b5)) + + +### Bug Fixes + +* [#105](https://github.com/josdejong/svelte-jsoneditor/issues/105) disable dropdown button when all items are disabled ([8698606](https://github.com/josdejong/svelte-jsoneditor/commit/86986066e965b1710e0d15e87e79fd0d958d39df)) +* [#107](https://github.com/josdejong/svelte-jsoneditor/issues/107) dependency issue with fortawesome building svelte-kit ([7ad8e95](https://github.com/josdejong/svelte-jsoneditor/commit/7ad8e95d3acfd69377c172f735b5f6d7e1cda47d)) +* [#110](https://github.com/josdejong/svelte-jsoneditor/issues/110) ContextMenu closes when hovering a validation error ([#112](https://github.com/josdejong/svelte-jsoneditor/issues/112)) ([46424bb](https://github.com/josdejong/svelte-jsoneditor/commit/46424bb3fd4353fc541f3d537eda803218ca63f2)) +* generate a valid sourcemap again ([7981a99](https://github.com/josdejong/svelte-jsoneditor/commit/7981a991f9e34183d4f1d94790d341fb5f6d0cde)) +* make `svelte` a dependency, its type definitions are needed in TypeScript projects (see [#19](https://github.com/josdejong/svelte-jsoneditor/issues/19)) ([acb3acf](https://github.com/josdejong/svelte-jsoneditor/commit/acb3acfa14ea7eb01e4140e799bd6a490f6fd0ef)) +* remove the "powered by CodeMirror" text, is listed in readme and webapp footer instead ([89d661a](https://github.com/josdejong/svelte-jsoneditor/commit/89d661ac5c9c6b01f374a654e9016af4e7ad6035)) +* truncate text preview of invalid JSON in tree mode ([67f5790](https://github.com/josdejong/svelte-jsoneditor/commit/67f57908456c9daa89258af095ace61b2fd9f47e)) + + +* make sure the next version will be marked as a breaking change ([0737b6c](https://github.com/josdejong/svelte-jsoneditor/commit/0737b6c7db31c1421f903a1dc1ef090b358633f1)) + +### [0.3.60](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.59...v0.3.60) (2022-06-09) + + +### Bug Fixes + +* [#55](https://github.com/josdejong/svelte-jsoneditor/issues/55) support tabs for indentation, introduce new option `tabSize` ([7e96e9a](https://github.com/josdejong/svelte-jsoneditor/commit/7e96e9a231a0fd69c28b7825423a21d9c94a15bc)) + +### [0.3.59](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.58...v0.3.59) (2022-06-08) + + +### Bug Fixes + +* [#91](https://github.com/josdejong/svelte-jsoneditor/issues/91) interface OptionalJSONEditorProps missing in npm package ([23bd690](https://github.com/josdejong/svelte-jsoneditor/commit/23bd690265dd213775e4163e28b79380aeb0a119)) +* invert the color of warning text to make it better readable ([410d91e](https://github.com/josdejong/svelte-jsoneditor/commit/410d91eb21700f55c8ac914486e62b500929d24d)) +* render the status bar of code mode above parse errors and validation warnings ([d765cb0](https://github.com/josdejong/svelte-jsoneditor/commit/d765cb02851bb2b89bc648d21582a313106f9cfa)) +* update dependencies and devDependencies ([9aa49b6](https://github.com/josdejong/svelte-jsoneditor/commit/9aa49b6ee63f92712241ab6aa8c6da7987e1b607)) + +### [0.3.58](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.57...v0.3.58) (2022-05-31) + + +### Features + +* implement StatusBar in code mode ([4bf271a](https://github.com/josdejong/svelte-jsoneditor/commit/4bf271a32ea24fb069bc91cf567a5102ee29e5d2)) + +### [0.3.57](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.56...v0.3.57) (2022-05-31) + + +### Bug Fixes + +* make active line color a lighter than the selection color in code mode ([1d26fc7](https://github.com/josdejong/svelte-jsoneditor/commit/1d26fc7a4ee95be7f3698c3b0894a85800557f71)) + +### [0.3.56](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.55...v0.3.56) (2022-05-30) + + +### Bug Fixes + +* disable broken sourcemap for the time being ([8239683](https://github.com/josdejong/svelte-jsoneditor/commit/82396830d781c3e2246636c5ac73893fccecc4fb)) + +### [0.3.55](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.54...v0.3.55) (2022-05-30) + + +### Bug Fixes + +* editor not having a border when welcome screen is displayed ([87e5da9](https://github.com/josdejong/svelte-jsoneditor/commit/87e5da92b67e82e5e6fca7594fdd1ff5d8760a74)) +* expanded state being reset when updating the contents ([27f61f2](https://github.com/josdejong/svelte-jsoneditor/commit/27f61f2f66b7b572e2d4bc8276bb79b3640c83ed)) + +### [0.3.54](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.53...v0.3.54) (2022-05-27) + + +### Bug Fixes + +* do not throw an exception when using `.refresh()` in tree mode ([6d5646d](https://github.com/josdejong/svelte-jsoneditor/commit/6d5646d9562d76a88e26ed19d4fd714597d209fe)) +* improve typescript definitions ([#86](https://github.com/josdejong/svelte-jsoneditor/issues/86)) ([a7d759a](https://github.com/josdejong/svelte-jsoneditor/commit/a7d759a6c3fca6cf28ad9f440c5ddcbbdd1dc362)) + +### [0.3.53](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.52...v0.3.53) (2022-05-23) + + +### Bug Fixes + +* index.js files containing broken imports to ts files ([0c4a9f0](https://github.com/josdejong/svelte-jsoneditor/commit/0c4a9f0c2dea2a45aa5dd5b2176ad7802a4e5206)) + +### [0.3.52](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.51...v0.3.52) (2022-05-23) + + +### Bug Fixes + +* index.js file containing broken references to .ts files (regression since v0.3.51) ([36959ee](https://github.com/josdejong/svelte-jsoneditor/commit/36959ee0e2ea8cbbefcbb63f193d83b556404dbc)) + +### [0.3.51](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.50...v0.3.51) (2022-05-23) + + +### Features + +* implement a method `.refresh()` to force rerendering of the code editor ([545426a](https://github.com/josdejong/svelte-jsoneditor/commit/545426aa7d8718e05f57cb83c71d035f37b33dc8)) + + +### Bug Fixes + +* improve the behavior of the arrow quickkeys to navigate the context menu ([#83](https://github.com/josdejong/svelte-jsoneditor/issues/83)) ([76b177f](https://github.com/josdejong/svelte-jsoneditor/commit/76b177f03b68097c7e521bf07ed753a5a1acf931)) +* maintain the enforceString status after replacing a value ([4d1e9e3](https://github.com/josdejong/svelte-jsoneditor/commit/4d1e9e3b8eb57215650a586740f59d6390bf0981)) + +### [0.3.50](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.49...v0.3.50) (2022-05-20) + + +### Bug Fixes + +* [#79](https://github.com/josdejong/svelte-jsoneditor/issues/79) browser scrolling the editor into view on load ([42fe818](https://github.com/josdejong/svelte-jsoneditor/commit/42fe8188e9248a0191d39e8e991217d5dec5a54c)) +* [#81](https://github.com/josdejong/svelte-jsoneditor/issues/81) clear navigation path when iterating through search results ([434c66d](https://github.com/josdejong/svelte-jsoneditor/commit/434c66d7abc92b6d0f1a38e454a0e7ab9d6c8450)) +* cannot start typing characters to insert a value from the welcome screen ([2bc34e2](https://github.com/josdejong/svelte-jsoneditor/commit/2bc34e224a33219c0ea73515bc04d569d832a0a9)) +* editor losing focus after selecting a color with the color picker ([8cb912a](https://github.com/josdejong/svelte-jsoneditor/commit/8cb912a55d77dca9d298ba9a6bf41d44b0262064)) +* editor losing focus after toggling a boolean value ([ea52484](https://github.com/josdejong/svelte-jsoneditor/commit/ea524847db5927d7c7283d5a8b2aaa3703bf025a)) +* give editor focus when the user starts dragging the selection ([9bd28db](https://github.com/josdejong/svelte-jsoneditor/commit/9bd28dbfb6f5a2bc3ee9ad30d50bd8521ade9b40)) +* give navigation bar text a brighter color in dark theme ([42be0e7](https://github.com/josdejong/svelte-jsoneditor/commit/42be0e7fdd2e7315980e235d43e92cae57cfea7e)) +* improve Transform Wizard to work better with numbers, booleans, and null ([ebc076a](https://github.com/josdejong/svelte-jsoneditor/commit/ebc076a80abc7e561b5518373c2b8530d0413e92)) +* keep focus in editor when closing color picker via ESC ([0b75001](https://github.com/josdejong/svelte-jsoneditor/commit/0b7500171df513fd804051eefc6a7abbbe28ffb4)) +* paste as JSON helper message not working ([0f803b2](https://github.com/josdejong/svelte-jsoneditor/commit/0f803b21a7fc4eaab6e0bb04a108f51d8c0f69a6)) + +### [0.3.49](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.48...v0.3.49) (2022-05-13) + +### Features + +* Support for custom styling using css variables + +### Bug Fixes + +* [#69](https://github.com/josdejong/svelte-jsoneditor/issues/69) cannot build the library after a clean install ([32a9b73](https://github.com/josdejong/svelte-jsoneditor/commit/32a9b737db60a9aee35d276b65f5d5b54bd5cd0c)) +* [#70](https://github.com/josdejong/svelte-jsoneditor/issues/70) implement quickkey Shift+Enter to go to the previous search result ([8f1917f](https://github.com/josdejong/svelte-jsoneditor/commit/8f1917fc5b100eaa7dfadd0f88f765a70de7bd4c)) +* [#71](https://github.com/josdejong/svelte-jsoneditor/issues/71) describe the differences with josdejong/jsoneditor in the README.md ([b9a54e9](https://github.com/josdejong/svelte-jsoneditor/commit/b9a54e974daa0a1e9a6575ddfcb5658e45bbc2ae)) +* context menu button jumping around whilst selecting multiple expanded objects ([d4a3cbf](https://github.com/josdejong/svelte-jsoneditor/commit/d4a3cbfc44ea14b36a0c1d8df2b36495d1f8d2d9)) +* exception thrown when clicking left from a selection ([e7e8094](https://github.com/josdejong/svelte-jsoneditor/commit/e7e8094ad34c4d8ecc9a3d855fe315a448e3bf20)) +* expandAll not working ([37c6256](https://github.com/josdejong/svelte-jsoneditor/commit/37c6256dd4ad60400f7c0ebad75b3d2f534db9e7)) +* right click in welcome screen did not open the context menu ([7934e9a](https://github.com/josdejong/svelte-jsoneditor/commit/7934e9ac7184a84e17d8bcbdfdaa48e9aa210bb7)) +* selection and expanded state not always stored correctly in history ([#73](https://github.com/josdejong/svelte-jsoneditor/issues/73)) ([702fba1](https://github.com/josdejong/svelte-jsoneditor/commit/702fba1d07620008d33f7c0c2ad00e05cbd5954f)) + +### [0.3.48](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.47...v0.3.48) (2022-04-26) + + +### Bug Fixes + +* quickkeys `[` and `{` not working in welcome screen (regression since v0.3.47) ([8a808a4](https://github.com/josdejong/svelte-jsoneditor/commit/8a808a412497e2bfbe4ba01f29eed363cdbc7303)) + +### [0.3.47](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.46...v0.3.47) (2022-04-26) + + +### Bug Fixes + +* allow defining multiple functions in the query of the Transform modal ([31e9b8b](https://github.com/josdejong/svelte-jsoneditor/commit/31e9b8b50ea35dfd6b58145c602ff01a59a66fc2)) +* be able to right-click on top of a property/item tag to open the context menu ([a033abf](https://github.com/josdejong/svelte-jsoneditor/commit/a033abf535c146ca76b38113ccce6a03917ab884)) +* context menu button of insert area sometimes flickering ([282e31d](https://github.com/josdejong/svelte-jsoneditor/commit/282e31d8a52bc43b8d2fba25347d7ec9f040ffc8)) +* full document being selected when clicking scrollbar or main menu when there is no selection ([5109de1](https://github.com/josdejong/svelte-jsoneditor/commit/5109de1bf4d5b7a9399b1180f7e09f8777f67447)) +* fully expand an inserted structure ([a22f405](https://github.com/josdejong/svelte-jsoneditor/commit/a22f405765692abb3b66deae9d92fb89f9a085a6)) +* improve the Javascript and Lodash queries generated via the wizard ([9666120](https://github.com/josdejong/svelte-jsoneditor/commit/9666120ce8cbad2508fe190926601772ae0ff741)) +* sort/transform the contents of the key instead of the parent when a key is selected ([e761a79](https://github.com/josdejong/svelte-jsoneditor/commit/e761a79a2a9bc5cf3615bfe49c2f9832c3569c22)) + +### [0.3.46](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.45...v0.3.46) (2022-04-22) + + +### Features + +* show tip in ContextMenu when it is opened via the ContextMenuButton or the main menu ([b9c38d2](https://github.com/josdejong/svelte-jsoneditor/commit/b9c38d275396ce00dcc61c4c34d4ecb523c9915c)) + + +### Bug Fixes + +* floating context menu button not rendered when a key is selected ([1ec4ed9](https://github.com/josdejong/svelte-jsoneditor/commit/1ec4ed9ba8af197856ce33e1e42b78dadf8de416)) + +### [0.3.45](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.44...v0.3.45) (2022-04-21) + + +### Bug Fixes + +* expose method `findElement(path)` ([3930137](https://github.com/josdejong/svelte-jsoneditor/commit/39301376ab2f0786a76c22c51c549de125ffa76f)) + +### [0.3.44](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.43...v0.3.44) (2022-04-21) + + +### Features + +* expose method `findElement(path)` ([655a790](https://github.com/josdejong/svelte-jsoneditor/commit/655a790e662180d41207072a25748d76aa69ec6b)) + +### [0.3.43](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.42...v0.3.43) (2022-04-20) + + +### Bug Fixes + +* disable insert buttons in ContextMenu when root is selected (regression introduced in v0.3.41) ([1fe6f48](https://github.com/josdejong/svelte-jsoneditor/commit/1fe6f488ae7b7d8d83952e4f00ca2e55fa6a4a09)) + +### [0.3.42](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.41...v0.3.42) (2022-04-20) + + +### Bug Fixes + +* right-click right from a value did not select the insert area before opening the context menu ([215eb04](https://github.com/josdejong/svelte-jsoneditor/commit/215eb04b82f4eacb66972041476a740de7f18451)) + +### [0.3.41](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.40...v0.3.41) (2022-04-20) + + +### Features + +* change insert buttons into convert buttons, converting between objects/arrays/text (see [#61](https://github.com/josdejong/svelte-jsoneditor/issues/61)) ([f413066](https://github.com/josdejong/svelte-jsoneditor/commit/f413066509b9167af9751218df30922ae5d9ffac)) + + +### Bug Fixes + +* change button text to "Copy compacted" for consistency ([396a274](https://github.com/josdejong/svelte-jsoneditor/commit/396a274219cb20e682d5b83c9317b99b3346b098)) +* change styling of the mode toggle button (code/tree) ([28b9c6c](https://github.com/josdejong/svelte-jsoneditor/commit/28b9c6c671f282832ece219a7c2f60cc2b0c5fa5)) +* use flex-start and flex-end to fix warnings in environments like tailwindcss ([#43](https://github.com/josdejong/svelte-jsoneditor/issues/43)) ([e1e0ddd](https://github.com/josdejong/svelte-jsoneditor/commit/e1e0dddfc6593197bf618a87af94d5a19a8945f9)) + +### [0.3.40](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.39...v0.3.40) (2022-04-15) + + +### Bug Fixes + +* importing vanilla-picker wrongly ([ddecbf1](https://github.com/josdejong/svelte-jsoneditor/commit/ddecbf1fd3d87a53e574374b581c1eabcd9c54b8)) + +### [0.3.39](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.38...v0.3.39) (2022-04-15) + + +### Bug Fixes + +* [#66](https://github.com/josdejong/svelte-jsoneditor/issues/66) import color picker dynamically since it cannot render server side ([b6041bb](https://github.com/josdejong/svelte-jsoneditor/commit/b6041bb3df4b8d74927cd65ef7343c63b04d8299)) + +### [0.3.38](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.37...v0.3.38) (2022-04-13) + + +### Features + +* select contents within brackets using double-click ([#65](https://github.com/josdejong/svelte-jsoneditor/issues/65)) ([e73970f](https://github.com/josdejong/svelte-jsoneditor/commit/e73970ff9b168d57ad53b5d56ac25e98794abf56)) + + +### Bug Fixes + +* show `prop` and `item` instead of plural when there is only one property or item ([1f1725f](https://github.com/josdejong/svelte-jsoneditor/commit/1f1725feda64c70c5ba305f1aa02ad1468a0d226)) + +### [0.3.37](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.36...v0.3.37) (2022-04-12) + + +### Bug Fixes + +* clicking a button to switch mode did toggle instead of selecting the clicked mode ([0451001](https://github.com/josdejong/svelte-jsoneditor/commit/045100141855a5f91c47205a8e735500584b3120)) + +### [0.3.36](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.35...v0.3.36) (2022-04-12) + + +### Bug Fixes + +* change code mode toggle into group buttons [tree|code] (see [#59](https://github.com/josdejong/svelte-jsoneditor/issues/59)) ([ad33b26](https://github.com/josdejong/svelte-jsoneditor/commit/ad33b2671b08442f54daa477ec40dcb594f6afe8)) +* expand all extracted contents (when not too large) ([d4ae8f4](https://github.com/josdejong/svelte-jsoneditor/commit/d4ae8f473c66b1c912454d20590277a5b3503524)) +* position search box in code mode on top ([#62](https://github.com/josdejong/svelte-jsoneditor/issues/62)) ([f0a1feb](https://github.com/josdejong/svelte-jsoneditor/commit/f0a1feb28b034ce847abdf73890968759423847a)) +* update all devDependencies ([13331c7](https://github.com/josdejong/svelte-jsoneditor/commit/13331c7550a630fa26faa853d04394d6fdaf624a)) + +### [0.3.35](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.34...v0.3.35) (2022-04-11) + + +### Bug Fixes + +* improve the rendering performance ([#58](https://github.com/josdejong/svelte-jsoneditor/issues/58)) ([84c6eb3](https://github.com/josdejong/svelte-jsoneditor/commit/84c6eb30e4df744670adbb92b8c3543d3a60bba5)) + +### [0.3.34](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.33...v0.3.34) (2022-04-08) + + +### Features + +* implement method `acceptAutoRepair` ([d037a7e](https://github.com/josdejong/svelte-jsoneditor/commit/d037a7e73869751bd408191a217c734b4fce9be0)) + +### [0.3.33](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.32...v0.3.33) (2022-04-07) + + +### Bug Fixes + +* make sure JavaScript and Lodash queries return null and never undefined ([73ae90c](https://github.com/josdejong/svelte-jsoneditor/commit/73ae90c4d3f50d500d47fc5cb87a0d0b91686301)) + +### [0.3.32](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.31...v0.3.32) (2022-04-06) + +### [0.3.31](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.30...v0.3.31) (2022-04-06) + + +### Bug Fixes + +* styling tweaks in the vertical sizing of the TransformModal ([3f87a8a](https://github.com/josdejong/svelte-jsoneditor/commit/3f87a8ab477d88e155697bc6edc047028da555f7)) + +### [0.3.30](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.29...v0.3.30) (2022-04-06) + + +### Bug Fixes + +* be resilient against missing or disabled localStorage ([52f76b7](https://github.com/josdejong/svelte-jsoneditor/commit/52f76b73b8d26ffcfca4e8391a55273f5b1d9b22)) +* disable Search menu item when there is no contents ([e687229](https://github.com/josdejong/svelte-jsoneditor/commit/e687229a33518356c65850d57a729c2ea6e9637f)) +* do not show welcome options when editor is readOnly ([eb92d75](https://github.com/josdejong/svelte-jsoneditor/commit/eb92d75ad608aa6df05b7633dd7cba9bb5008876)) +* method `editor.transform()` broken (regression since v0.3.29) ([299dc78](https://github.com/josdejong/svelte-jsoneditor/commit/299dc78fdfce1c327cb54efc97d6dc8fd34f00d9)) +* styling tweaks in the TransformModal ([3983918](https://github.com/josdejong/svelte-jsoneditor/commit/3983918d125249535211a0228b9444cd6d9bc8f3)) + +### [0.3.29](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.28...v0.3.29) (2022-04-06) + + +### Features + +* reorganize Tranform modal, show original data alongside the preview ([#54](https://github.com/josdejong/svelte-jsoneditor/issues/54)) ([9b6b79e](https://github.com/josdejong/svelte-jsoneditor/commit/9b6b79e487d79057522ecbeca41fade01b7bbd79)) + + +### Bug Fixes + +* cannot select a key or value when clicking inside the selection ([331254a](https://github.com/josdejong/svelte-jsoneditor/commit/331254ad9a458ef9889ea22acc9c02cb6ef50e8a)) +* disable Auto repair buttons when the editor is readOnly ([0a5eca4](https://github.com/josdejong/svelte-jsoneditor/commit/0a5eca4c26bcb1818815bf1e24bc18e0888c9d02)) +* dragging selection not disabled in readOnly mode ([eac069a](https://github.com/josdejong/svelte-jsoneditor/commit/eac069ae0f0df2711bd5991778d4e25545f765a4)) +* solve circular dependency to TreeMode in the Transform modal ([71f3511](https://github.com/josdejong/svelte-jsoneditor/commit/71f3511ffc3cb6eab2ef2d6fd9f1abae18c2f3e4)) +* some styling fixes in the Sort modal ([4366a0f](https://github.com/josdejong/svelte-jsoneditor/commit/4366a0fa1d460def432b3a1900f530c0a63dc2d2)) +* undo/redo buttons in code mode not updated when contents changed externally ([5778540](https://github.com/josdejong/svelte-jsoneditor/commit/5778540560c3ce6b7d62346e4a9ef302881bc373)) +* use ajv-dist instead of ajv to solve rollup issues ([a663a1b](https://github.com/josdejong/svelte-jsoneditor/commit/a663a1bf7748b3332f9e8ddcd12c6c760e953f7f)) + +### [0.3.28](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.27...v0.3.28) (2022-04-04) + + +### Bug Fixes + +* could not select items when starting to drag right from an item ([c5de4d5](https://github.com/josdejong/svelte-jsoneditor/commit/c5de4d5ac84675c0a6292f439c845f3ee51e2a4b)) +* insert area visible whilst selecting or dragging ([5d1e68f](https://github.com/josdejong/svelte-jsoneditor/commit/5d1e68f248d1ad9a7f898a50b4945f50eacc1488)) + +### [0.3.27](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.26...v0.3.27) (2022-04-04) + + +### Bug Fixes + +* when pasting, expand all pasted contents by default when small ([ec9703c](https://github.com/josdejong/svelte-jsoneditor/commit/ec9703c741bf0575864ce699a4c3ea708acdf57a)) + +### [0.3.26](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.25...v0.3.26) (2022-04-04) + + +### Bug Fixes + +* fully expand small JSON documents by default ([d94701b](https://github.com/josdejong/svelte-jsoneditor/commit/d94701b9d40cc0eefbf6865d3cfb76526c6fdd8e)) +* pasted or replaced contents not being expanded ([4e86440](https://github.com/josdejong/svelte-jsoneditor/commit/4e864405a70676038b0da6816ae4679f5078cf1e)) +* update dependencies ([d9eb233](https://github.com/josdejong/svelte-jsoneditor/commit/d9eb233c24c958cabd41ad58df372ca6bbb15cf7)) + +### [0.3.25](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.24...v0.3.25) (2022-03-22) + + +### Features + +* drag selected contents up and down ([#50](https://github.com/josdejong/svelte-jsoneditor/issues/50)) ([c3c4113](https://github.com/josdejong/svelte-jsoneditor/commit/c3c4113441c2a2df111da5e74b312a9146900927)) + + +### Bug Fixes + +* validate in code mode not always triggering ([246cf67](https://github.com/josdejong/svelte-jsoneditor/commit/246cf670259393c56934f0955df31ec957e3f863)) + +### [0.3.24](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.23...v0.3.24) (2022-03-16) + + +### Bug Fixes + +* component EditableDiv did not close when losing focus to another element on the same page ([a8abe71](https://github.com/josdejong/svelte-jsoneditor/commit/a8abe710f5e2d10bf31f7272f709d53665a1eb88)) +* define font for linting messages ([8a5456f](https://github.com/josdejong/svelte-jsoneditor/commit/8a5456f3de474c58e49b637617d1694b515e1055)) +* editor layout does overflow when opening a large minified document in code mode ([#48](https://github.com/josdejong/svelte-jsoneditor/issues/48)) ([5574d38](https://github.com/josdejong/svelte-jsoneditor/commit/5574d38164f48610842a0707be81cf9ca12bd53b)) +* implement quick keys Ctrl+F and Ctrl+H to open the find dialog whilst editing a key or value ([e608486](https://github.com/josdejong/svelte-jsoneditor/commit/e608486a53c59cb53b3cf1240884d7d2147fd345)) +* minor styling fix ([1399dd8](https://github.com/josdejong/svelte-jsoneditor/commit/1399dd8272de55f22d77b1633bd124632064606f)) +* styling tweaks ([1d15f2b](https://github.com/josdejong/svelte-jsoneditor/commit/1d15f2b2675922d4c566cdd6cec53caac70dcd7e)) +* wrapping line in Copy dropdown menu ([61b10ac](https://github.com/josdejong/svelte-jsoneditor/commit/61b10ac1d4a50b7d9b7e68b9316adbedd47ffd02)) + +### [0.3.23](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.22...v0.3.23) (2022-03-08) + + +### Bug Fixes + +* do not use dynamic imports ([b5ca813](https://github.com/josdejong/svelte-jsoneditor/commit/b5ca813ef1c5a4dbd5527c496afe824986e3a45e)) + +### [0.3.22](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.21...v0.3.22) (2022-03-08) + + +### Bug Fixes + +* publish missing generated/* folder on npm too ([ec391b2](https://github.com/josdejong/svelte-jsoneditor/commit/ec391b28b7c12bed81f65ff8b35a9fabba88d349)) +* publish missing generated/* folder on npm too ([a0195cd](https://github.com/josdejong/svelte-jsoneditor/commit/a0195cde8e77850a431eb0a77219d644c80af1d7)) + +### [0.3.21](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.20...v0.3.21) (2022-03-08) + + +### Features + +* replace Ace with CodeMirror 6 ([#46](https://github.com/josdejong/svelte-jsoneditor/issues/46)) ([71cc856](https://github.com/josdejong/svelte-jsoneditor/commit/71cc856c81456dbb788b14d847e30a289bf2a129)) + +### [0.3.20](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.19...v0.3.20) (2022-03-07) + + +### Bug Fixes + +* drop `viteOptimizeDeps` (in `src/config.js`) and remove it from the docs: not needed anymore ([1c64009](https://github.com/josdejong/svelte-jsoneditor/commit/1c64009469c7914f5daffa93c4402c4643072a03)) + +### [0.3.19](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.18...v0.3.19) (2022-03-07) + + +### Bug Fixes + +* add `generated` folder to .prettierignore ([e15ee93](https://github.com/josdejong/svelte-jsoneditor/commit/e15ee931eab2a4e273a3dae188ecdf6ab284351f)) +* diff-sequences export not playing nice with Vite ([f87a7b3](https://github.com/josdejong/svelte-jsoneditor/commit/f87a7b379e9204bc835de87125371f709f77dc3c)) + +### [0.3.18](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.17...v0.3.18) (2022-02-09) + + +### Bug Fixes + +* race condition when toggling mode ([2a97ab5](https://github.com/josdejong/svelte-jsoneditor/commit/2a97ab55191ddb5e9a79591a74bf342a0e89e9e8)) +* update all dependencies ([f083d2c](https://github.com/josdejong/svelte-jsoneditor/commit/f083d2c1c9570e91b24ee037d1d988c9e733722f)) + +### [0.3.17](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.16...v0.3.17) (2022-02-09) + + +### Bug Fixes + +* improve explanatory titles on color picker and boolean toggle when readOnly ([aac632b](https://github.com/josdejong/svelte-jsoneditor/commit/aac632bcb9ceeb9a9ab4358aefdea2523c0adb4e)) +* only show explanatory titles on color picker and boolean toggle when editable ([4971138](https://github.com/josdejong/svelte-jsoneditor/commit/49711385d97ba10499285a02b9c365b7719f7c55)) +* rename schemaRefs to schemaDefinitions (not breaking, just a renamed function argument) ([0e7d653](https://github.com/josdejong/svelte-jsoneditor/commit/0e7d65335212188011d7ba0c3ce8438a99b22ee5)) +* shortcut Shift+Enter to create a newline not working on Chrome ([48a10a6](https://github.com/josdejong/svelte-jsoneditor/commit/48a10a667ce1d19258bb09f7cb23e8931ba9f39f)) +* update dependencies ([4bc6d53](https://github.com/josdejong/svelte-jsoneditor/commit/4bc6d5356c5f401bf5a0e0ff60a67a046b346e5a)) + +### [0.3.16](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.15...v0.3.16) (2022-01-20) + + +### Features + +* implement support for enforcing a value to stay a string when it contains a numeric value. + This can be toggled via the button "Enforce string" in ContextMenu, under "Edit value". + + +### Bug Fixes + +* [#45](https://github.com/josdejong/svelte-jsoneditor/issues/45) invoke onChangeMode after re-rendering instead of before ([c8894ce](https://github.com/josdejong/svelte-jsoneditor/commit/c8894ce2b618df3cadf5cc8a6ac8a3cc44c15c9f)) + + +### [0.3.15](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.14...v0.3.15) (2022-01-12) + + +### Bug Fixes + +* regression in clicking the context menu button on an insert area ([f5bcc71](https://github.com/josdejong/svelte-jsoneditor/commit/f5bcc7166720bac94b7ea222f5e95e8a39368d46)) + +### [0.3.14](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.13...v0.3.14) (2022-01-08) + + +### Bug Fixes + +* expand contents when pasting in an empty document ([a3c8021](https://github.com/josdejong/svelte-jsoneditor/commit/a3c80216370dfa176b0eafd6afa9e88a0f9d579f)) +* shift-click not working when selecting an area in between two nodes ([c21f1f3](https://github.com/josdejong/svelte-jsoneditor/commit/c21f1f310382b39c4ca4b27725b982feeb48acbf)) +* shift-click to select multiple items broken ([a28bbdf](https://github.com/josdejong/svelte-jsoneditor/commit/a28bbdf8c8a3354a9f6e32efd2cb7b44656f91dd)) + +### [0.3.13](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.12...v0.3.13) (2022-01-05) + + +### Bug Fixes + +* clicking on another node whilst editing did not move the focus there ([b2fe3d7](https://github.com/josdejong/svelte-jsoneditor/commit/b2fe3d7e558358d4aa7f0400d90da366b56bbb6c)) +* fix too large padding for expanded array bracket ([0963960](https://github.com/josdejong/svelte-jsoneditor/commit/09639609d9b642a9df0caa663caaad6903816cd8)) +* issue in encode/decode datapath ([a56cb1b](https://github.com/josdejong/svelte-jsoneditor/commit/a56cb1ba867c336f8ee72b7c505ba669024beb28)) +* make the code robust against missing refContents ([360de5e](https://github.com/josdejong/svelte-jsoneditor/commit/360de5e9e01b6008f5062fec70ffb621b66f70ed)) +* scrollTo throwing exception when contents is empty ([68fcb6a](https://github.com/josdejong/svelte-jsoneditor/commit/68fcb6aaa59490130e528b25bdea014a315e7285)) +* styling tweak for the readonly item count tag ([5bbb679](https://github.com/josdejong/svelte-jsoneditor/commit/5bbb679efccb235a17fafcc82919ea14cb62c66d)) +* when opening edit mode, sometimes the first typed character was lost ([22b5577](https://github.com/josdejong/svelte-jsoneditor/commit/22b5577f3432501776b56abdedda5c1854f5d809)) + +### [0.3.12](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.11...v0.3.12) (2022-01-05) + + +### Bug Fixes + +* revert "fix: upgrade to the latest version of sveltekit and vite, removing the need for viteOptimizeDeps" + +### [0.3.11](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.10...v0.3.11) (2022-01-05) + + +### Bug Fixes + +* property `normalization` missing the docs and in development application ([002b7e9](https://github.com/josdejong/svelte-jsoneditor/commit/002b7e995decc602962a4b74c5cd6847477df405)) +* tweak font for ubuntu and mac ([b05009c](https://github.com/josdejong/svelte-jsoneditor/commit/b05009c4b41b200ec8703c85373f55f96138f96f)) +* upgrade to the latest version of sveltekit and vite, removing the need for viteOptimizeDeps ([c7211a3](https://github.com/josdejong/svelte-jsoneditor/commit/c7211a30981a453ee0a86ac2594bf0cca3431436)) + +### [0.3.10](https://github.com/josdejong/svelte-jsoneditor/compare/v0.3.9...v0.3.10) (2021-12-22) + + +### Features + +* implement options escapeControlCharacters and escapeUnicodeCharacters ([#42](https://github.com/josdejong/svelte-jsoneditor/issues/42)) ([cfdd8cc](https://github.com/josdejong/svelte-jsoneditor/commit/cfdd8cca0639a93ca5bb62cca84b31e7b3c9ee6f)) +* show tag with array item count also when expanded ([b427fe7](https://github.com/josdejong/svelte-jsoneditor/commit/b427fe7f4618a633882b241ee771d05ce3daa092)) + + +### Bug Fixes + +* add property `type` to `
',i=(t=r,(n=document.createElement("div")).innerHTML=t,n.firstElementChild);return this.domElement=i,this._domH=Lee(".picker_hue",i),this._domSL=Lee(".picker_sl",i),this._domA=Lee(".picker_alpha",i),this._domEdit=Lee(".picker_editor input",i),this._domSample=Lee(".picker_sample",i),this._domOkay=Lee(".picker_done button",i),this._domCancel=Lee(".picker_cancel button",i),i.classList.add("layout_"+this.settings.layout),this.settings.alpha||i.classList.add("no_alpha"),this.settings.editor||i.classList.add("no_editor"),this.settings.cancelButton||i.classList.add("no_cancel"),this._ifPopup((function(){return i.classList.add("popup")})),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var e=this,t=this,n=this.domElement,r=this._events;function i(e,t,n){r.add(e,t,n)}i(n,"click",(function(e){return e.preventDefault()})),Ree(r,this._domH,(function(e,n){return t._setHSLA(e)})),Ree(r,this._domSL,(function(e,n){return t._setHSLA(null,e,1-n)})),this.settings.alpha&&Ree(r,this._domA,(function(e,n){return t._setHSLA(null,null,null,1-n)}));var o=this._domEdit;i(o,"input",(function(e){t._setColor(this.value,{fromEditor:!0,failSilently:!0})})),i(o,"focus",(function(e){var t=this;t.selectionStart===t.selectionEnd&&t.select()})),this._ifPopup((function(){var t=function(t){return e.closeHandler(t)};i(window,Iee,t),i(window,Dee,t),zee(r,n,["Esc","Escape"],t);var o=function(t){e.__containedEvent=t.timeStamp};i(n,Iee,o),i(n,Dee,o),i(e._domCancel,"click",t)}));var a=function(t){e._ifPopup((function(){return e.closeHandler(t)})),e.onDone&&e.onDone(e.colour)};i(this._domOkay,"click",a),zee(r,n,["Enter"],a)}},{key:"_setPosition",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup((function(n){"static"===getComputedStyle(e).position&&(e.style.position="relative");var r=!0===n?"popup_right":"popup_"+n;["popup_top","popup_bottom","popup_left","popup_right"].forEach((function(e){e===r?t.classList.add(e):t.classList.remove(e)})),t.classList.add(r)}))}},{key:"_setHSLA",value:function(e,t,n,r,i){i=i||{};var o=this.colour,a=o.hsla;[e,t,n,r].forEach((function(e,t){(e||0===e)&&(a[t]=e)})),o.hsla=a,this._updateUI(i),this.onChange&&!i.silent&&this.onChange(o)}},{key:"_updateUI",value:function(e){if(this.domElement){e=e||{};var t=this.colour,n=t.hsla,r="hsl("+360*n[0]+", 100%, 50%)",i=t.hslString,o=t.hslaString,a=this._domH,s=this._domSL,c=this._domA,u=Lee(".picker_selector",a),l=Lee(".picker_selector",s),f=Lee(".picker_selector",c);y(0,u,n[0]),this._domSL.style.backgroundColor=this._domH.style.color=r,y(0,l,n[1]),b(0,l,1-n[2]),s.style.color=i,b(0,f,1-n[3]);var h=i,d=h.replace("hsl","hsla").replace(")",", 0)"),v="linear-gradient("+[h,d]+")";if(this._domA.style.background=v+", linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em,\n linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em",!e.fromEditor){var p=this.settings.editorFormat,m=this.settings.alpha,g=void 0;switch(p){case"rgb":g=t.printRGB(m);break;case"hsl":g=t.printHSL(m);break;default:g=t.printHex(m)}this._domEdit.value=g}this._domSample.style.color=o}function y(e,t,n){t.style.left=100*n+"%"}function b(e,t,n){t.style.top=100*n+"%"}}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var n=e?"":"none",r=t.style.display!==n;return r&&(t.style.display=n),r}}]),e}(),Vee=document.createElement("style");Vee.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(Vee),Fee.StyleElement=Vee;var qee=Object.freeze({__proto__:null,default:Fee});export{KM as BooleanToggle,ts as CaretType,nE as ColorPicker,bA as EditableValue,g8 as EnumValue,l8 as JSONEditor,Za as Mode,tP as ReadonlyValue,rs as SearchField,es as SelectionType,is as SortDirection,Ba as SvelteComponentTyped,lP as TimestampTag,ns as ValidationSeverity,uc as compileJSONPointer,lc as compileJSONPointerProp,tA as createAfterSelection,bee as createAjvValidator,eA as createInsideSelection,XE as createKeySelection,nA as createMultiSelection,ZE as createValueSelection,oc as deleteIn,yO as estimateSerializedSize,sc as existsIn,tc as getIn,dc as immutableJSONPatch,ac as insertAt,TE as isAfterSelection,fO as isContent,gI as isContentParseError,yI as isContentValidationErrors,oA as isEditingSelection,kO as isEqualParser,RE as isInsideSelection,dO as isJSONContent,NE as isKeySelection,gO as isLargeContent,DE as isMultiSelection,hO as isTextContent,IE as isValueSelection,xM as javascriptQueryLanguage,See as jmespathQueryLanguage,xee as lodashQueryLanguage,HI as onEscape,jc as parseFrom,hM as parseJSONPath,cc as parseJSONPointer,kc as parsePath,w8 as renderJSONSchemaEnum,fP as renderValue,Q3 as resizeObserver,$c as revertJSONPatch,nc as setIn,fM as stringifyJSONPath,pO as toJSONContent,vO as toTextContent,ic as updateIn}; +//# sourceMappingURL=index.js.map diff --git a/T3SF/gui/static/js/vanilla-jsoneditor/index.js.map b/T3SF/gui/static/js/vanilla-jsoneditor/index.js.map new file mode 100644 index 0000000..2141f37 --- /dev/null +++ b/T3SF/gui/static/js/vanilla-jsoneditor/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["../node_modules/svelte/internal/index.mjs","../src/lib/utils/debug.ts","../node_modules/svelte/transition/index.mjs","../node_modules/svelte-simple-modal/src/Modal.svelte","../src/lib/types.ts","../src/lib/constants.ts","../src/lib/utils/uniqueId.ts","../node_modules/immutable-json-patch/lib/esm/typeguards.js","../node_modules/immutable-json-patch/lib/esm/utils.js","../node_modules/immutable-json-patch/lib/esm/immutabilityHelpers.js","../node_modules/immutable-json-patch/lib/esm/jsonPointer.js","../node_modules/immutable-json-patch/lib/esm/immutableJSONPatch.js","../node_modules/immutable-json-patch/lib/esm/revertJSONPatch.js","../node_modules/json-source-map/index.js","../node_modules/jsonrepair/lib/esm/JSONRepairError.js","../node_modules/jsonrepair/lib/esm/stringUtils.js","../node_modules/jsonrepair/lib/esm/jsonrepair.js","../src/lib/utils/numberUtils.ts","../src/lib/utils/typeUtils.ts","../node_modules/lodash-es/_freeGlobal.js","../node_modules/lodash-es/_root.js","../node_modules/lodash-es/_Symbol.js","../node_modules/lodash-es/_getRawTag.js","../node_modules/lodash-es/_objectToString.js","../node_modules/lodash-es/_baseGetTag.js","../node_modules/lodash-es/isObjectLike.js","../node_modules/lodash-es/isSymbol.js","../node_modules/lodash-es/_baseToNumber.js","../node_modules/lodash-es/_arrayMap.js","../node_modules/lodash-es/isArray.js","../node_modules/lodash-es/_baseToString.js","../node_modules/lodash-es/_createMathOperation.js","../node_modules/lodash-es/add.js","../node_modules/lodash-es/_trimmedEndIndex.js","../node_modules/lodash-es/_baseTrim.js","../node_modules/lodash-es/isObject.js","../node_modules/lodash-es/toNumber.js","../node_modules/lodash-es/toFinite.js","../node_modules/lodash-es/toInteger.js","../node_modules/lodash-es/after.js","../node_modules/lodash-es/identity.js","../node_modules/lodash-es/isFunction.js","../node_modules/lodash-es/_coreJsData.js","../node_modules/lodash-es/_isMasked.js","../node_modules/lodash-es/_toSource.js","../node_modules/lodash-es/_baseIsNative.js","../node_modules/lodash-es/_getNative.js","../node_modules/lodash-es/_getValue.js","../node_modules/lodash-es/_WeakMap.js","../node_modules/lodash-es/_metaMap.js","../node_modules/lodash-es/_baseSetData.js","../node_modules/lodash-es/_baseCreate.js","../node_modules/lodash-es/_createCtor.js","../node_modules/lodash-es/_createBind.js","../node_modules/lodash-es/_apply.js","../node_modules/lodash-es/_composeArgs.js","../node_modules/lodash-es/_composeArgsRight.js","../node_modules/lodash-es/_baseLodash.js","../node_modules/lodash-es/_LazyWrapper.js","../node_modules/lodash-es/noop.js","../node_modules/lodash-es/_getData.js","../node_modules/lodash-es/_realNames.js","../node_modules/lodash-es/_getFuncName.js","../node_modules/lodash-es/_LodashWrapper.js","../node_modules/lodash-es/_copyArray.js","../node_modules/lodash-es/_wrapperClone.js","../node_modules/lodash-es/wrapperLodash.js","../node_modules/lodash-es/_isLaziable.js","../node_modules/lodash-es/_shortOut.js","../node_modules/lodash-es/_setData.js","../node_modules/lodash-es/_getWrapDetails.js","../node_modules/lodash-es/_insertWrapDetails.js","../node_modules/lodash-es/constant.js","../node_modules/lodash-es/_defineProperty.js","../node_modules/lodash-es/_baseSetToString.js","../node_modules/lodash-es/_setToString.js","../node_modules/lodash-es/_arrayEach.js","../node_modules/lodash-es/_baseFindIndex.js","../node_modules/lodash-es/_baseIsNaN.js","../node_modules/lodash-es/_baseIndexOf.js","../node_modules/lodash-es/_strictIndexOf.js","../node_modules/lodash-es/_arrayIncludes.js","../node_modules/lodash-es/_updateWrapDetails.js","../node_modules/lodash-es/_setWrapToString.js","../node_modules/lodash-es/_createRecurry.js","../node_modules/lodash-es/_getHolder.js","../node_modules/lodash-es/_isIndex.js","../node_modules/lodash-es/_reorder.js","../node_modules/lodash-es/_replaceHolders.js","../node_modules/lodash-es/_createHybrid.js","../node_modules/lodash-es/_countHolders.js","../node_modules/lodash-es/_createPartial.js","../node_modules/lodash-es/_mergeData.js","../node_modules/lodash-es/_createWrap.js","../node_modules/lodash-es/_createCurry.js","../node_modules/lodash-es/ary.js","../node_modules/lodash-es/_baseAssignValue.js","../node_modules/lodash-es/eq.js","../node_modules/lodash-es/_assignValue.js","../node_modules/lodash-es/_copyObject.js","../node_modules/lodash-es/_overRest.js","../node_modules/lodash-es/_baseRest.js","../node_modules/lodash-es/isLength.js","../node_modules/lodash-es/isArrayLike.js","../node_modules/lodash-es/_isIterateeCall.js","../node_modules/lodash-es/_createAssigner.js","../node_modules/lodash-es/_isPrototype.js","../node_modules/lodash-es/_baseTimes.js","../node_modules/lodash-es/_baseIsArguments.js","../node_modules/lodash-es/isArguments.js","../node_modules/lodash-es/stubFalse.js","../node_modules/lodash-es/isBuffer.js","../node_modules/lodash-es/_baseIsTypedArray.js","../node_modules/lodash-es/_baseUnary.js","../node_modules/lodash-es/_nodeUtil.js","../node_modules/lodash-es/isTypedArray.js","../node_modules/lodash-es/_arrayLikeKeys.js","../node_modules/lodash-es/_overArg.js","../node_modules/lodash-es/_nativeKeys.js","../node_modules/lodash-es/_baseKeys.js","../node_modules/lodash-es/keys.js","../node_modules/lodash-es/assign.js","../node_modules/lodash-es/_baseKeysIn.js","../node_modules/lodash-es/_nativeKeysIn.js","../node_modules/lodash-es/keysIn.js","../node_modules/lodash-es/assignIn.js","../node_modules/lodash-es/assignInWith.js","../node_modules/lodash-es/assignWith.js","../node_modules/lodash-es/_isKey.js","../node_modules/lodash-es/_nativeCreate.js","../node_modules/lodash-es/_hashGet.js","../node_modules/lodash-es/_hashHas.js","../node_modules/lodash-es/_Hash.js","../node_modules/lodash-es/_assocIndexOf.js","../node_modules/lodash-es/_hashClear.js","../node_modules/lodash-es/_hashDelete.js","../node_modules/lodash-es/_hashSet.js","../node_modules/lodash-es/_listCacheDelete.js","../node_modules/lodash-es/_ListCache.js","../node_modules/lodash-es/_listCacheClear.js","../node_modules/lodash-es/_listCacheGet.js","../node_modules/lodash-es/_listCacheHas.js","../node_modules/lodash-es/_listCacheSet.js","../node_modules/lodash-es/_Map.js","../node_modules/lodash-es/_getMapData.js","../node_modules/lodash-es/_isKeyable.js","../node_modules/lodash-es/_MapCache.js","../node_modules/lodash-es/_mapCacheClear.js","../node_modules/lodash-es/_mapCacheDelete.js","../node_modules/lodash-es/_mapCacheGet.js","../node_modules/lodash-es/_mapCacheHas.js","../node_modules/lodash-es/_mapCacheSet.js","../node_modules/lodash-es/memoize.js","../node_modules/lodash-es/_stringToPath.js","../node_modules/lodash-es/_memoizeCapped.js","../node_modules/lodash-es/toString.js","../node_modules/lodash-es/_castPath.js","../node_modules/lodash-es/_toKey.js","../node_modules/lodash-es/_baseGet.js","../node_modules/lodash-es/get.js","../node_modules/lodash-es/_baseAt.js","../node_modules/lodash-es/_arrayPush.js","../node_modules/lodash-es/_isFlattenable.js","../node_modules/lodash-es/_baseFlatten.js","../node_modules/lodash-es/flatten.js","../node_modules/lodash-es/_flatRest.js","../node_modules/lodash-es/at.js","../node_modules/lodash-es/_getPrototype.js","../node_modules/lodash-es/isPlainObject.js","../node_modules/lodash-es/isError.js","../node_modules/lodash-es/attempt.js","../node_modules/lodash-es/before.js","../node_modules/lodash-es/bind.js","../node_modules/lodash-es/bindAll.js","../node_modules/lodash-es/bindKey.js","../node_modules/lodash-es/_baseSlice.js","../node_modules/lodash-es/_castSlice.js","../node_modules/lodash-es/_hasUnicode.js","../node_modules/lodash-es/_unicodeToArray.js","../node_modules/lodash-es/_stringToArray.js","../node_modules/lodash-es/_asciiToArray.js","../node_modules/lodash-es/_createCaseFirst.js","../node_modules/lodash-es/upperFirst.js","../node_modules/lodash-es/capitalize.js","../node_modules/lodash-es/_arrayReduce.js","../node_modules/lodash-es/_basePropertyOf.js","../node_modules/lodash-es/_deburrLetter.js","../node_modules/lodash-es/deburr.js","../node_modules/lodash-es/_asciiWords.js","../node_modules/lodash-es/_hasUnicodeWord.js","../node_modules/lodash-es/_unicodeWords.js","../node_modules/lodash-es/words.js","../node_modules/lodash-es/_createCompounder.js","../node_modules/lodash-es/camelCase.js","../node_modules/lodash-es/castArray.js","../node_modules/lodash-es/_createRound.js","../node_modules/lodash-es/ceil.js","../node_modules/lodash-es/chain.js","../node_modules/lodash-es/chunk.js","../node_modules/lodash-es/_baseClamp.js","../node_modules/lodash-es/clamp.js","../node_modules/lodash-es/_Stack.js","../node_modules/lodash-es/_baseAssign.js","../node_modules/lodash-es/_stackClear.js","../node_modules/lodash-es/_stackDelete.js","../node_modules/lodash-es/_stackGet.js","../node_modules/lodash-es/_stackHas.js","../node_modules/lodash-es/_stackSet.js","../node_modules/lodash-es/_cloneBuffer.js","../node_modules/lodash-es/_arrayFilter.js","../node_modules/lodash-es/stubArray.js","../node_modules/lodash-es/_getSymbols.js","../node_modules/lodash-es/_getSymbolsIn.js","../node_modules/lodash-es/_baseGetAllKeys.js","../node_modules/lodash-es/_getAllKeys.js","../node_modules/lodash-es/_getAllKeysIn.js","../node_modules/lodash-es/_DataView.js","../node_modules/lodash-es/_Promise.js","../node_modules/lodash-es/_Set.js","../node_modules/lodash-es/_getTag.js","../node_modules/lodash-es/_initCloneArray.js","../node_modules/lodash-es/_Uint8Array.js","../node_modules/lodash-es/_cloneArrayBuffer.js","../node_modules/lodash-es/_cloneRegExp.js","../node_modules/lodash-es/_cloneSymbol.js","../node_modules/lodash-es/_cloneTypedArray.js","../node_modules/lodash-es/_initCloneByTag.js","../node_modules/lodash-es/_cloneDataView.js","../node_modules/lodash-es/_initCloneObject.js","../node_modules/lodash-es/isMap.js","../node_modules/lodash-es/_baseIsMap.js","../node_modules/lodash-es/isSet.js","../node_modules/lodash-es/_baseIsSet.js","../node_modules/lodash-es/_baseClone.js","../node_modules/lodash-es/_copySymbolsIn.js","../node_modules/lodash-es/_baseAssignIn.js","../node_modules/lodash-es/_copySymbols.js","../node_modules/lodash-es/clone.js","../node_modules/lodash-es/cloneDeep.js","../node_modules/lodash-es/cloneDeepWith.js","../node_modules/lodash-es/cloneWith.js","../node_modules/lodash-es/commit.js","../node_modules/lodash-es/compact.js","../node_modules/lodash-es/concat.js","../node_modules/lodash-es/_SetCache.js","../node_modules/lodash-es/_arraySome.js","../node_modules/lodash-es/_cacheHas.js","../node_modules/lodash-es/_setCacheAdd.js","../node_modules/lodash-es/_setCacheHas.js","../node_modules/lodash-es/_equalArrays.js","../node_modules/lodash-es/_mapToArray.js","../node_modules/lodash-es/_setToArray.js","../node_modules/lodash-es/_equalByTag.js","../node_modules/lodash-es/_equalObjects.js","../node_modules/lodash-es/_baseIsEqualDeep.js","../node_modules/lodash-es/_baseIsEqual.js","../node_modules/lodash-es/_baseIsMatch.js","../node_modules/lodash-es/_isStrictComparable.js","../node_modules/lodash-es/_getMatchData.js","../node_modules/lodash-es/_matchesStrictComparable.js","../node_modules/lodash-es/_baseMatches.js","../node_modules/lodash-es/_baseHasIn.js","../node_modules/lodash-es/_hasPath.js","../node_modules/lodash-es/hasIn.js","../node_modules/lodash-es/_baseMatchesProperty.js","../node_modules/lodash-es/_baseProperty.js","../node_modules/lodash-es/property.js","../node_modules/lodash-es/_basePropertyDeep.js","../node_modules/lodash-es/_baseIteratee.js","../node_modules/lodash-es/cond.js","../node_modules/lodash-es/_baseConformsTo.js","../node_modules/lodash-es/conforms.js","../node_modules/lodash-es/_baseConforms.js","../node_modules/lodash-es/conformsTo.js","../node_modules/lodash-es/_arrayAggregator.js","../node_modules/lodash-es/_createBaseFor.js","../node_modules/lodash-es/_baseFor.js","../node_modules/lodash-es/_baseForOwn.js","../node_modules/lodash-es/_createBaseEach.js","../node_modules/lodash-es/_baseEach.js","../node_modules/lodash-es/_baseAggregator.js","../node_modules/lodash-es/_createAggregator.js","../node_modules/lodash-es/countBy.js","../node_modules/lodash-es/create.js","../node_modules/lodash-es/curry.js","../node_modules/lodash-es/curryRight.js","../node_modules/lodash-es/now.js","../node_modules/lodash-es/debounce.js","../node_modules/lodash-es/defaultTo.js","../node_modules/lodash-es/defaults.js","../node_modules/lodash-es/_assignMergeValue.js","../node_modules/lodash-es/isArrayLikeObject.js","../node_modules/lodash-es/_safeGet.js","../node_modules/lodash-es/toPlainObject.js","../node_modules/lodash-es/_baseMerge.js","../node_modules/lodash-es/_baseMergeDeep.js","../node_modules/lodash-es/_customDefaultsMerge.js","../node_modules/lodash-es/mergeWith.js","../node_modules/lodash-es/defaultsDeep.js","../node_modules/lodash-es/_baseDelay.js","../node_modules/lodash-es/defer.js","../node_modules/lodash-es/delay.js","../node_modules/lodash-es/_arrayIncludesWith.js","../node_modules/lodash-es/_baseDifference.js","../node_modules/lodash-es/difference.js","../node_modules/lodash-es/last.js","../node_modules/lodash-es/differenceBy.js","../node_modules/lodash-es/differenceWith.js","../node_modules/lodash-es/divide.js","../node_modules/lodash-es/drop.js","../node_modules/lodash-es/dropRight.js","../node_modules/lodash-es/_baseWhile.js","../node_modules/lodash-es/dropRightWhile.js","../node_modules/lodash-es/dropWhile.js","../node_modules/lodash-es/_castFunction.js","../node_modules/lodash-es/forEach.js","../node_modules/lodash-es/_arrayEachRight.js","../node_modules/lodash-es/_baseForRight.js","../node_modules/lodash-es/_baseForOwnRight.js","../node_modules/lodash-es/_baseEachRight.js","../node_modules/lodash-es/forEachRight.js","../node_modules/lodash-es/endsWith.js","../node_modules/lodash-es/_createToPairs.js","../node_modules/lodash-es/_setToPairs.js","../node_modules/lodash-es/_baseToPairs.js","../node_modules/lodash-es/toPairs.js","../node_modules/lodash-es/toPairsIn.js","../node_modules/lodash-es/_escapeHtmlChar.js","../node_modules/lodash-es/escape.js","../node_modules/lodash-es/escapeRegExp.js","../node_modules/lodash-es/_arrayEvery.js","../node_modules/lodash-es/_baseEvery.js","../node_modules/lodash-es/every.js","../node_modules/lodash-es/toLength.js","../node_modules/lodash-es/fill.js","../node_modules/lodash-es/_baseFill.js","../node_modules/lodash-es/_baseFilter.js","../node_modules/lodash-es/filter.js","../node_modules/lodash-es/_createFind.js","../node_modules/lodash-es/findIndex.js","../node_modules/lodash-es/find.js","../node_modules/lodash-es/_baseFindKey.js","../node_modules/lodash-es/findKey.js","../node_modules/lodash-es/findLastIndex.js","../node_modules/lodash-es/findLast.js","../node_modules/lodash-es/findLastKey.js","../node_modules/lodash-es/head.js","../node_modules/lodash-es/_baseMap.js","../node_modules/lodash-es/map.js","../node_modules/lodash-es/flatMap.js","../node_modules/lodash-es/flatMapDeep.js","../node_modules/lodash-es/flatMapDepth.js","../node_modules/lodash-es/flattenDeep.js","../node_modules/lodash-es/flattenDepth.js","../node_modules/lodash-es/flip.js","../node_modules/lodash-es/floor.js","../node_modules/lodash-es/_createFlow.js","../node_modules/lodash-es/flow.js","../node_modules/lodash-es/flowRight.js","../node_modules/lodash-es/forIn.js","../node_modules/lodash-es/forInRight.js","../node_modules/lodash-es/forOwn.js","../node_modules/lodash-es/forOwnRight.js","../node_modules/lodash-es/fromPairs.js","../node_modules/lodash-es/_baseFunctions.js","../node_modules/lodash-es/functions.js","../node_modules/lodash-es/functionsIn.js","../node_modules/lodash-es/groupBy.js","../node_modules/lodash-es/_baseGt.js","../node_modules/lodash-es/_createRelationalOperation.js","../node_modules/lodash-es/gt.js","../node_modules/lodash-es/gte.js","../node_modules/lodash-es/_baseHas.js","../node_modules/lodash-es/has.js","../node_modules/lodash-es/_baseInRange.js","../node_modules/lodash-es/inRange.js","../node_modules/lodash-es/isString.js","../node_modules/lodash-es/_baseValues.js","../node_modules/lodash-es/values.js","../node_modules/lodash-es/includes.js","../node_modules/lodash-es/indexOf.js","../node_modules/lodash-es/initial.js","../node_modules/lodash-es/_baseIntersection.js","../node_modules/lodash-es/_castArrayLikeObject.js","../node_modules/lodash-es/intersection.js","../node_modules/lodash-es/intersectionBy.js","../node_modules/lodash-es/intersectionWith.js","../node_modules/lodash-es/_createInverter.js","../node_modules/lodash-es/_baseInverter.js","../node_modules/lodash-es/invert.js","../node_modules/lodash-es/invertBy.js","../node_modules/lodash-es/_parent.js","../node_modules/lodash-es/_baseInvoke.js","../node_modules/lodash-es/invoke.js","../node_modules/lodash-es/invokeMap.js","../node_modules/lodash-es/isArrayBuffer.js","../node_modules/lodash-es/_baseIsArrayBuffer.js","../node_modules/lodash-es/isBoolean.js","../node_modules/lodash-es/isDate.js","../node_modules/lodash-es/_baseIsDate.js","../node_modules/lodash-es/isElement.js","../node_modules/lodash-es/isEmpty.js","../node_modules/lodash-es/isEqual.js","../node_modules/lodash-es/isEqualWith.js","../node_modules/lodash-es/isFinite.js","../node_modules/lodash-es/isInteger.js","../node_modules/lodash-es/isMatch.js","../node_modules/lodash-es/isMatchWith.js","../node_modules/lodash-es/isNumber.js","../node_modules/lodash-es/isNaN.js","../node_modules/lodash-es/_isMaskable.js","../node_modules/lodash-es/isNative.js","../node_modules/lodash-es/isNil.js","../node_modules/lodash-es/isNull.js","../node_modules/lodash-es/isRegExp.js","../node_modules/lodash-es/_baseIsRegExp.js","../node_modules/lodash-es/isSafeInteger.js","../node_modules/lodash-es/isUndefined.js","../node_modules/lodash-es/isWeakMap.js","../node_modules/lodash-es/isWeakSet.js","../node_modules/lodash-es/iteratee.js","../node_modules/lodash-es/join.js","../node_modules/lodash-es/kebabCase.js","../node_modules/lodash-es/keyBy.js","../node_modules/lodash-es/lastIndexOf.js","../node_modules/lodash-es/_strictLastIndexOf.js","../node_modules/lodash-es/lowerCase.js","../node_modules/lodash-es/lowerFirst.js","../node_modules/lodash-es/_baseLt.js","../node_modules/lodash-es/lt.js","../node_modules/lodash-es/lte.js","../node_modules/lodash-es/mapKeys.js","../node_modules/lodash-es/mapValues.js","../node_modules/lodash-es/matches.js","../node_modules/lodash-es/matchesProperty.js","../node_modules/lodash-es/_baseExtremum.js","../node_modules/lodash-es/max.js","../node_modules/lodash-es/maxBy.js","../node_modules/lodash-es/_baseSum.js","../node_modules/lodash-es/_baseMean.js","../node_modules/lodash-es/mean.js","../node_modules/lodash-es/meanBy.js","../node_modules/lodash-es/merge.js","../node_modules/lodash-es/method.js","../node_modules/lodash-es/methodOf.js","../node_modules/lodash-es/min.js","../node_modules/lodash-es/minBy.js","../node_modules/lodash-es/mixin.js","../node_modules/lodash-es/multiply.js","../node_modules/lodash-es/negate.js","../node_modules/lodash-es/toArray.js","../node_modules/lodash-es/_iteratorToArray.js","../node_modules/lodash-es/next.js","../node_modules/lodash-es/_baseNth.js","../node_modules/lodash-es/nth.js","../node_modules/lodash-es/nthArg.js","../node_modules/lodash-es/_baseUnset.js","../node_modules/lodash-es/_customOmitClone.js","../node_modules/lodash-es/omit.js","../node_modules/lodash-es/_baseSet.js","../node_modules/lodash-es/_basePickBy.js","../node_modules/lodash-es/pickBy.js","../node_modules/lodash-es/omitBy.js","../node_modules/lodash-es/once.js","../node_modules/lodash-es/_compareAscending.js","../node_modules/lodash-es/_baseOrderBy.js","../node_modules/lodash-es/_baseSortBy.js","../node_modules/lodash-es/_compareMultiple.js","../node_modules/lodash-es/orderBy.js","../node_modules/lodash-es/_createOver.js","../node_modules/lodash-es/over.js","../node_modules/lodash-es/_castRest.js","../node_modules/lodash-es/overArgs.js","../node_modules/lodash-es/overEvery.js","../node_modules/lodash-es/overSome.js","../node_modules/lodash-es/_baseRepeat.js","../node_modules/lodash-es/_asciiSize.js","../node_modules/lodash-es/_unicodeSize.js","../node_modules/lodash-es/_stringSize.js","../node_modules/lodash-es/_createPadding.js","../node_modules/lodash-es/pad.js","../node_modules/lodash-es/padEnd.js","../node_modules/lodash-es/padStart.js","../node_modules/lodash-es/parseInt.js","../node_modules/lodash-es/partial.js","../node_modules/lodash-es/partialRight.js","../node_modules/lodash-es/partition.js","../node_modules/lodash-es/pick.js","../node_modules/lodash-es/_basePick.js","../node_modules/lodash-es/plant.js","../node_modules/lodash-es/propertyOf.js","../node_modules/lodash-es/_baseIndexOfWith.js","../node_modules/lodash-es/_basePullAll.js","../node_modules/lodash-es/pullAll.js","../node_modules/lodash-es/pull.js","../node_modules/lodash-es/pullAllBy.js","../node_modules/lodash-es/pullAllWith.js","../node_modules/lodash-es/_basePullAt.js","../node_modules/lodash-es/pullAt.js","../node_modules/lodash-es/_baseRandom.js","../node_modules/lodash-es/random.js","../node_modules/lodash-es/_baseRange.js","../node_modules/lodash-es/_createRange.js","../node_modules/lodash-es/range.js","../node_modules/lodash-es/rangeRight.js","../node_modules/lodash-es/rearg.js","../node_modules/lodash-es/_baseReduce.js","../node_modules/lodash-es/reduce.js","../node_modules/lodash-es/_arrayReduceRight.js","../node_modules/lodash-es/reduceRight.js","../node_modules/lodash-es/reject.js","../node_modules/lodash-es/remove.js","../node_modules/lodash-es/repeat.js","../node_modules/lodash-es/replace.js","../node_modules/lodash-es/rest.js","../node_modules/lodash-es/result.js","../node_modules/lodash-es/reverse.js","../node_modules/lodash-es/round.js","../node_modules/lodash-es/_arraySample.js","../node_modules/lodash-es/_baseSample.js","../node_modules/lodash-es/sample.js","../node_modules/lodash-es/_shuffleSelf.js","../node_modules/lodash-es/_arraySampleSize.js","../node_modules/lodash-es/_baseSampleSize.js","../node_modules/lodash-es/sampleSize.js","../node_modules/lodash-es/set.js","../node_modules/lodash-es/setWith.js","../node_modules/lodash-es/_arrayShuffle.js","../node_modules/lodash-es/_baseShuffle.js","../node_modules/lodash-es/shuffle.js","../node_modules/lodash-es/size.js","../node_modules/lodash-es/slice.js","../node_modules/lodash-es/snakeCase.js","../node_modules/lodash-es/_baseSome.js","../node_modules/lodash-es/some.js","../node_modules/lodash-es/sortBy.js","../node_modules/lodash-es/_baseSortedIndexBy.js","../node_modules/lodash-es/_baseSortedIndex.js","../node_modules/lodash-es/sortedIndex.js","../node_modules/lodash-es/sortedIndexBy.js","../node_modules/lodash-es/sortedIndexOf.js","../node_modules/lodash-es/sortedLastIndex.js","../node_modules/lodash-es/sortedLastIndexBy.js","../node_modules/lodash-es/sortedLastIndexOf.js","../node_modules/lodash-es/_baseSortedUniq.js","../node_modules/lodash-es/sortedUniq.js","../node_modules/lodash-es/sortedUniqBy.js","../node_modules/lodash-es/split.js","../node_modules/lodash-es/spread.js","../node_modules/lodash-es/startCase.js","../node_modules/lodash-es/startsWith.js","../node_modules/lodash-es/stubObject.js","../node_modules/lodash-es/stubString.js","../node_modules/lodash-es/stubTrue.js","../node_modules/lodash-es/subtract.js","../node_modules/lodash-es/sum.js","../node_modules/lodash-es/sumBy.js","../node_modules/lodash-es/tail.js","../node_modules/lodash-es/take.js","../node_modules/lodash-es/takeRight.js","../node_modules/lodash-es/takeRightWhile.js","../node_modules/lodash-es/takeWhile.js","../node_modules/lodash-es/tap.js","../node_modules/lodash-es/_customDefaultsAssignIn.js","../node_modules/lodash-es/_escapeStringChar.js","../node_modules/lodash-es/_reInterpolate.js","../node_modules/lodash-es/templateSettings.js","../node_modules/lodash-es/_reEscape.js","../node_modules/lodash-es/_reEvaluate.js","../node_modules/lodash-es/template.js","../node_modules/lodash-es/throttle.js","../node_modules/lodash-es/thru.js","../node_modules/lodash-es/times.js","../node_modules/lodash-es/toIterator.js","../node_modules/lodash-es/_baseWrapperValue.js","../node_modules/lodash-es/wrapperValue.js","../node_modules/lodash-es/toLower.js","../node_modules/lodash-es/toPath.js","../node_modules/lodash-es/toSafeInteger.js","../node_modules/lodash-es/toUpper.js","../node_modules/lodash-es/transform.js","../node_modules/lodash-es/_charsEndIndex.js","../node_modules/lodash-es/_charsStartIndex.js","../node_modules/lodash-es/trim.js","../node_modules/lodash-es/trimEnd.js","../node_modules/lodash-es/trimStart.js","../node_modules/lodash-es/truncate.js","../node_modules/lodash-es/unary.js","../node_modules/lodash-es/_unescapeHtmlChar.js","../node_modules/lodash-es/unescape.js","../node_modules/lodash-es/_createSet.js","../node_modules/lodash-es/_baseUniq.js","../node_modules/lodash-es/union.js","../node_modules/lodash-es/unionBy.js","../node_modules/lodash-es/unionWith.js","../node_modules/lodash-es/uniq.js","../node_modules/lodash-es/uniqBy.js","../node_modules/lodash-es/uniqWith.js","../node_modules/lodash-es/uniqueId.js","../node_modules/lodash-es/unset.js","../node_modules/lodash-es/unzip.js","../node_modules/lodash-es/unzipWith.js","../node_modules/lodash-es/_baseUpdate.js","../node_modules/lodash-es/update.js","../node_modules/lodash-es/updateWith.js","../node_modules/lodash-es/upperCase.js","../node_modules/lodash-es/valuesIn.js","../node_modules/lodash-es/without.js","../node_modules/lodash-es/wrap.js","../node_modules/lodash-es/wrapperAt.js","../node_modules/lodash-es/wrapperChain.js","../node_modules/lodash-es/wrapperReverse.js","../node_modules/lodash-es/_baseXor.js","../node_modules/lodash-es/xor.js","../node_modules/lodash-es/xorBy.js","../node_modules/lodash-es/xorWith.js","../node_modules/lodash-es/zip.js","../node_modules/lodash-es/_baseZipObject.js","../node_modules/lodash-es/zipObject.js","../node_modules/lodash-es/zipObjectDeep.js","../node_modules/lodash-es/zipWith.js","../node_modules/lodash-es/array.default.js","../node_modules/lodash-es/collection.default.js","../node_modules/lodash-es/date.default.js","../node_modules/lodash-es/function.default.js","../node_modules/lodash-es/lang.default.js","../node_modules/lodash-es/math.default.js","../node_modules/lodash-es/number.default.js","../node_modules/lodash-es/object.default.js","../node_modules/lodash-es/seq.default.js","../node_modules/lodash-es/string.default.js","../node_modules/lodash-es/util.default.js","../node_modules/lodash-es/_getView.js","../node_modules/lodash-es/_lazyValue.js","../node_modules/lodash-es/lodash.default.js","../node_modules/lodash-es/_lazyClone.js","../node_modules/lodash-es/_lazyReverse.js","../src/lib/utils/arrayUtils.ts","../src/lib/utils/jsonUtils.ts","../src/lib/utils/domUtils.ts","../src/lib/utils/keyBindings.ts","../src/lib/components/modals/popup/AbsolutePopupEntry.svelte","../src/lib/components/modals/popup/AbsolutePopup.svelte","../src/lib/utils/pathUtils.ts","../src/lib/utils/stringUtils.ts","../src/lib/plugins/query/javascriptQueryLanguage.ts","../node_modules/@fortawesome/free-regular-svg-icons/index.mjs","../node_modules/svelte-awesome/components/svg/Raw.svelte","../node_modules/svelte-awesome/components/svg/Svg.svelte","../node_modules/svelte-awesome/components/Icon.svelte","../src/lib/plugins/value/components/BooleanToggle.svelte","../src/lib/components/controls/ColorPickerPopup.svelte","../src/lib/plugins/value/components/ColorPicker.svelte","../src/lib/logic/expandItemsSections.ts","../src/lib/logic/documentState.ts","../src/lib/logic/selection.ts","../src/lib/utils/cssUtils.ts","../src/lib/plugins/value/components/utils/getValueClass.ts","../src/lib/components/controls/EditableDiv.svelte","../src/lib/plugins/value/components/EditableValue.svelte","../src/lib/logic/operations.ts","../src/lib/logic/search.ts","../src/lib/components/modes/treemode/highlight/SearchResultHighlighter.svelte","../src/lib/plugins/value/components/ReadonlyValue.svelte","../src/lib/components/controls/tooltip/Tooltip.svelte","../src/lib/components/controls/tooltip/tooltip.ts","../src/lib/plugins/value/components/TimestampTag.svelte","../src/lib/plugins/value/renderValue.ts","../node_modules/@fortawesome/free-solid-svg-icons/index.mjs","../src/lib/components/modals/transformModalState.ts","../node_modules/@floating-ui/core/dist/floating-ui.core.browser.min.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.browser.min.mjs","../node_modules/svelte-floating-ui/index.js","../node_modules/svelte-select/filter.js","../node_modules/svelte-select/get-items.js","../node_modules/svelte-select/ChevronIcon.svelte","../node_modules/svelte-select/ClearIcon.svelte","../node_modules/svelte-select/LoadingIcon.svelte","../node_modules/svelte-select/Select.svelte","../src/lib/components/modals/TransformWizard.svelte","../src/lib/components/controls/selectQueryLanguage/SelectQueryLanguage.svelte","../src/lib/components/modals/TransformModalHeader.svelte","../src/lib/components/controls/createAutoScrollHandler.ts","../src/lib/assets/jump.js/src/easing.ts","../src/lib/assets/jump.js/src/jump.ts","../src/lib/logic/history.ts","../src/lib/utils/timeUtils.ts","../src/lib/logic/validation.ts","../src/lib/components/controls/createFocusTracker.ts","../src/lib/components/controls/Message.svelte","../src/lib/components/controls/ValidationErrorsOverview.svelte","../src/lib/utils/navigatorUtils.ts","../src/lib/components/modals/Header.svelte","../src/lib/components/modals/CopyPasteModal.svelte","../src/lib/typeguards.ts","../src/lib/components/controls/Menu.svelte","../src/lib/components/modals/repair/JSONRepairComponent.svelte","../src/lib/actions/onEscape.ts","../src/lib/components/modals/JSONRepairModal.svelte","../src/lib/components/controls/contextmenu/ContextMenuButton.svelte","../src/lib/components/controls/DropdownButton.svelte","../src/lib/components/controls/contextmenu/ContextMenuDropDownButton.svelte","../src/lib/components/controls/contextmenu/ContextMenu.svelte","../src/lib/components/modes/treemode/contextmenu/TreeContextMenu.svelte","../src/lib/components/modes/treemode/CollapsedItems.svelte","../src/lib/components/controls/contextmenu/ContextMenuPointer.svelte","../src/lib/components/modes/treemode/JSONKey.svelte","../src/lib/components/modes/treemode/JSONValue.svelte","../src/lib/components/modes/treemode/singleton.ts","../src/lib/logic/dragging.ts","../src/lib/utils/jsonPointer.ts","../src/lib/components/modes/treemode/ValidationErrorIcon.svelte","../src/lib/components/modes/treemode/JSONNode.svelte","../src/lib/img/customFontawesomeIcons.ts","../src/lib/components/modes/treemode/menu/TreeMenu.svelte","../src/lib/components/modes/treemode/Welcome.svelte","../node_modules/natural-compare-lite/index.js","../src/lib/logic/sort.ts","../src/lib/components/controls/navigationBar/NavigationBarDropdown.svelte","../src/lib/components/controls/navigationBar/NavigationBarItem.svelte","../src/lib/utils/copyToClipboard.ts","../src/lib/components/controls/navigationBar/NavigationBarPathEditor.svelte","../src/lib/components/controls/navigationBar/NavigationBar.svelte","../src/lib/components/modes/treemode/menu/SearchBox.svelte","../node_modules/memoize-one/dist/memoize-one.esm.js","../src/lib/logic/table.ts","../src/lib/logic/actions.ts","../src/lib/components/controls/JSONPreview.svelte","../src/lib/components/modes/treemode/TreeMode.svelte","../src/lib/components/modals/TransformModal.svelte","../src/lib/components/modals/sortModalState.js","../src/lib/components/modals/SortModal.svelte","../src/lib/utils/noop.ts","../src/lib/utils/fileUtils.ts","../src/lib/components/modes/textmode/menu/TextMenu.svelte","../node_modules/@codemirror/state/dist/index.js","../node_modules/w3c-keyname/index.es.js","../node_modules/style-mod/src/style-mod.js","../node_modules/@codemirror/view/dist/index.js","../node_modules/@lezer/common/dist/index.js","../node_modules/@lezer/highlight/dist/index.js","../node_modules/@codemirror/language/dist/index.js","../node_modules/@codemirror/commands/dist/index.js","../node_modules/crelt/index.es.js","../node_modules/@codemirror/search/dist/index.js","../node_modules/@codemirror/autocomplete/dist/index.js","../node_modules/@codemirror/lint/dist/index.js","../node_modules/codemirror/dist/index.js","../node_modules/@lezer/lr/dist/index.js","../node_modules/@lezer/json/dist/index.es.js","../node_modules/@codemirror/lang-json/dist/index.js","../src/lib/components/modes/textmode/StatusBar.svelte","../src/lib/components/modes/textmode/codemirror/codemirror-theme.ts","../node_modules/@replit/codemirror-indentation-markers/dist/index.js","../src/lib/components/modes/textmode/TextMode.svelte","../src/lib/components/modes/tablemode/menu/TableMenu.svelte","../src/lib/components/modes/tablemode/JSONValue.svelte","../src/lib/components/modes/tablemode/tag/InlineValue.svelte","../src/lib/components/modes/tablemode/ColumnHeader.svelte","../src/lib/actions/resizeObserver.ts","../src/lib/components/modes/tablemode/contextmenu/TableContextMenu.svelte","../src/lib/components/modes/tablemode/TableModeWelcome.svelte","../src/lib/components/modes/tablemode/RefreshColumnHeader.svelte","../src/lib/components/modes/tablemode/TableMode.svelte","../src/lib/components/modes/JSONEditorRoot.svelte","../src/lib/components/modals/JSONEditorModal.svelte","../src/lib/components/modals/ModalRef.svelte","../src/lib/components/JSONEditor.svelte","../src/lib/plugins/value/components/EnumValue.svelte","../src/lib/utils/jsonSchemaUtils.ts","../src/lib/plugins/value/renderJSONSchemaEnum.ts","../node_modules/ajv/dist/compile/codegen/code.js","../node_modules/ajv/dist/compile/codegen/scope.js","../node_modules/ajv/dist/compile/codegen/index.js","../node_modules/ajv/dist/compile/util.js","../node_modules/ajv/dist/compile/names.js","../node_modules/ajv/dist/compile/errors.js","../node_modules/ajv/dist/compile/rules.js","../node_modules/ajv/dist/compile/validate/applicability.js","../node_modules/ajv/dist/compile/validate/dataType.js","../node_modules/ajv/dist/vocabularies/code.js","../node_modules/ajv/dist/compile/validate/keyword.js","../node_modules/fast-deep-equal/index.js","../node_modules/json-schema-traverse/index.js","../node_modules/ajv/dist/compile/resolve.js","../node_modules/ajv/dist/compile/validate/index.js","../node_modules/ajv/dist/compile/validate/boolSchema.js","../node_modules/ajv/dist/compile/validate/defaults.js","../node_modules/ajv/dist/compile/validate/subschema.js","../node_modules/ajv/dist/runtime/validation_error.js","../node_modules/ajv/dist/compile/ref_error.js","../node_modules/ajv/dist/compile/index.js","../node_modules/uri-js/dist/es5/uri.all.js","../node_modules/ajv/dist/runtime/uri.js","../node_modules/ajv/dist/core.js","../node_modules/ajv/dist/vocabularies/core/id.js","../node_modules/ajv/dist/vocabularies/core/ref.js","../node_modules/ajv/dist/vocabularies/core/index.js","../node_modules/ajv/dist/vocabularies/validation/limitNumber.js","../node_modules/ajv/dist/vocabularies/validation/multipleOf.js","../node_modules/ajv/dist/runtime/ucs2length.js","../node_modules/ajv/dist/vocabularies/validation/limitLength.js","../node_modules/ajv/dist/vocabularies/validation/pattern.js","../node_modules/ajv/dist/vocabularies/validation/limitProperties.js","../node_modules/ajv/dist/vocabularies/validation/required.js","../node_modules/ajv/dist/vocabularies/validation/limitItems.js","../node_modules/ajv/dist/runtime/equal.js","../node_modules/ajv/dist/vocabularies/validation/uniqueItems.js","../node_modules/ajv/dist/vocabularies/validation/const.js","../node_modules/ajv/dist/vocabularies/validation/enum.js","../node_modules/ajv/dist/vocabularies/validation/index.js","../node_modules/ajv/dist/vocabularies/applicator/additionalItems.js","../node_modules/ajv/dist/vocabularies/applicator/items.js","../node_modules/ajv/dist/vocabularies/applicator/prefixItems.js","../node_modules/ajv/dist/vocabularies/applicator/items2020.js","../node_modules/ajv/dist/vocabularies/applicator/contains.js","../node_modules/ajv/dist/vocabularies/applicator/dependencies.js","../node_modules/ajv/dist/vocabularies/applicator/propertyNames.js","../node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js","../node_modules/ajv/dist/vocabularies/applicator/properties.js","../node_modules/ajv/dist/vocabularies/applicator/patternProperties.js","../node_modules/ajv/dist/vocabularies/applicator/not.js","../node_modules/ajv/dist/vocabularies/applicator/anyOf.js","../node_modules/ajv/dist/vocabularies/applicator/oneOf.js","../node_modules/ajv/dist/vocabularies/applicator/allOf.js","../node_modules/ajv/dist/vocabularies/applicator/if.js","../node_modules/ajv/dist/vocabularies/applicator/thenElse.js","../node_modules/ajv/dist/vocabularies/applicator/index.js","../node_modules/ajv/dist/vocabularies/format/format.js","../node_modules/ajv/dist/vocabularies/format/index.js","../node_modules/ajv/dist/vocabularies/metadata.js","../node_modules/ajv/dist/vocabularies/draft7.js","../node_modules/ajv/dist/vocabularies/discriminator/types.js","../node_modules/ajv/dist/vocabularies/discriminator/index.js","../node_modules/ajv/dist/ajv.js","../src/lib/plugins/validator/createAjvValidator.ts","../src/lib/plugins/query/lodashQueryLanguage.ts","../node_modules/jmespath/jmespath.js","../src/lib/plugins/query/jmespathQueryLanguage.ts","../node_modules/vanilla-picker/dist/vanilla-picker.mjs"],"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}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && 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}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\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) {\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}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\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\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not \n let children = target.childNodes;\n // If target is , there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\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 comment(content) {\n return document.createComment(content);\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 stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\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 trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\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}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\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_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\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, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +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 init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\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 if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\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');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for