From e286a75ccc4779a95f03dc7d2b0bd63f290fbec6 Mon Sep 17 00:00:00 2001 From: Rick Peterman Date: Fri, 26 Apr 2024 11:02:45 -0500 Subject: [PATCH 1/5] feat(twpreviews): add plugin --- .gitignore | 1 + .lando.yml | 24 + node_modules/.package-lock.json | 7 - .../configs/global/global-plugins.php | 1 + .../plugins/tw-previews/preview/preview.php | 22 + wp-content/plugins/tw-previews/preview/ui.php | 134 + .../tw-previews/preview/ui/.eslintrc.js | 18 + .../plugins/tw-previews/preview/ui/.gitignore | 2 + .../tw-previews/preview/ui/babel.config.json | 11 + .../plugins/tw-previews/preview/ui/codegen.ts | 13 + .../tw-previews/preview/ui/components.json | 16 + .../tw-previews/preview/ui/dist/bundle.js | 1815 ++ .../preview/ui/dist/bundle.js.LICENSE.txt | 56 + .../tw-previews/preview/ui/jsconfig.json | 7 + .../tw-previews/preview/ui/package-lock.json | 22431 ++++++++++++++++ .../tw-previews/preview/ui/package.json | 58 + .../tw-previews/preview/ui/postcss.config.js | 5 + .../tw-previews/preview/ui/prettier.config.js | 11 + .../tw-previews/preview/ui/src/App.tsx | 127 + .../preview/ui/src/components/ui/alert.tsx | 59 + .../preview/ui/src/components/ui/badge.tsx | 36 + .../preview/ui/src/components/ui/button.tsx | 56 + .../preview/ui/src/components/ui/skeleton.tsx | 16 + .../preview/ui/src/components/ui/toast.tsx | 127 + .../preview/ui/src/components/ui/toaster.tsx | 34 + .../preview/ui/src/components/ui/use-toast.ts | 192 + .../tw-previews/preview/ui/src/index.tsx | 23 + .../preview/ui/src/lib/contexts/AppContext.ts | 13 + .../preview/ui/src/lib/utils/css/cn.js | 6 + .../preview/ui/src/lib/utils/css/index.js | 1 + .../preview/ui/src/lib/utils/index.ts | 1 + .../preview/ui/src/styles/global.scss | 103 + .../preview/ui/src/types/dom/events.ts | 4 + .../preview/ui/src/types/global.d.ts | 13 + .../preview/ui/src/types/index.d.ts | 11 + .../preview/ui/src/types/state/app.ts | 20 + .../tw-previews/preview/ui/tailwind.config.js | 76 + .../tw-previews/preview/ui/tsconfig.json | 35 + .../plugins/tw-previews/preview/ui/ui.css | 11 + .../tw-previews/preview/ui/webpack.config.js | 56 + .../plugins/tw-previews/tw-previews.php | 23 + wp-content/themes/the-world/css/editor.css | 5 +- wp-content/themes/the-world/functions.php | 3 +- 43 files changed, 25674 insertions(+), 9 deletions(-) delete mode 100644 node_modules/.package-lock.json create mode 100644 wp-content/plugins/tw-previews/preview/preview.php create mode 100644 wp-content/plugins/tw-previews/preview/ui.php create mode 100644 wp-content/plugins/tw-previews/preview/ui/.eslintrc.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/.gitignore create mode 100644 wp-content/plugins/tw-previews/preview/ui/babel.config.json create mode 100644 wp-content/plugins/tw-previews/preview/ui/codegen.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/components.json create mode 100644 wp-content/plugins/tw-previews/preview/ui/dist/bundle.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/dist/bundle.js.LICENSE.txt create mode 100644 wp-content/plugins/tw-previews/preview/ui/jsconfig.json create mode 100644 wp-content/plugins/tw-previews/preview/ui/package-lock.json create mode 100644 wp-content/plugins/tw-previews/preview/ui/package.json create mode 100644 wp-content/plugins/tw-previews/preview/ui/postcss.config.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/prettier.config.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/App.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/alert.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/badge.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/button.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/skeleton.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/toast.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/toaster.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/components/ui/use-toast.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/index.tsx create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/lib/contexts/AppContext.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/lib/utils/css/cn.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/lib/utils/css/index.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/lib/utils/index.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/styles/global.scss create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/types/dom/events.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/types/global.d.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/types/index.d.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/src/types/state/app.ts create mode 100644 wp-content/plugins/tw-previews/preview/ui/tailwind.config.js create mode 100644 wp-content/plugins/tw-previews/preview/ui/tsconfig.json create mode 100644 wp-content/plugins/tw-previews/preview/ui/ui.css create mode 100644 wp-content/plugins/tw-previews/preview/ui/webpack.config.js create mode 100644 wp-content/plugins/tw-previews/tw-previews.php diff --git a/.gitignore b/.gitignore index 809b80bdc..0723ea26f 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ reference/ # Node Dependencies # ##################### node_modules +!node_modules/.package-lock.json diff --git a/.lando.yml b/.lando.yml index 2ea996ebe..d03128725 100644 --- a/.lando.yml +++ b/.lando.yml @@ -16,6 +16,30 @@ services: build: - npm install - chmod +x scripts/* + appserver_nginx: + scanner: + retry: 10 + okCodes: + - 302 + - 401 + - 402 + - 403 + edge: + scanner: + retry: 10 + okCodes: + - 302 + - 401 + - 402 + - 403 + edge_ssl: + scanner: + retry: 10 + okCodes: + - 302 + - 401 + - 402 + - 403 mailhog: type: mailhog portforward: false diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json deleted file mode 100644 index 800dcdf1e..000000000 --- a/node_modules/.package-lock.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "the-world-wp", - "version": "0.0.0-development", - "lockfileVersion": 2, - "requires": true, - "packages": {} -} diff --git a/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php b/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php index 8f4170256..b31a06e68 100644 --- a/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php +++ b/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php @@ -33,6 +33,7 @@ 'tw-media/tw-media.php', 'tw-menus/tw-menus.php', 'tw-newsletters/tw-newsletters.php', + 'tw-previews/tw-previews.php', 'tw-programs/tw-programs.php', 'tw-qa-block/tw-qa-block.php', 'tw-datawrapper-block/tw-datawrapper-block.php', diff --git a/wp-content/plugins/tw-previews/preview/preview.php b/wp-content/plugins/tw-previews/preview/preview.php new file mode 100644 index 000000000..2ebc5b526 --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/preview.php @@ -0,0 +1,22 @@ + + + + + + + Document + + + +
+ + diff --git a/wp-content/plugins/tw-previews/preview/ui.php b/wp-content/plugins/tw-previews/preview/ui.php new file mode 100644 index 000000000..ddb42e025 --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui.php @@ -0,0 +1,134 @@ + -1 ) { + // Faust uses `basename` on the current URL path to compare with exclusion list. + // `basename` is meant for use with file paths, and will only grab the last segment of the path, including query string. + // Since the last segment of our preview URL is dynamic, and we have no idea if query string params have been added, + // we have to add our exclude route dynamically using the same URL parsing Faust uses. + // TODO: Keep an eye on this when Faust is updated. They may improve or alter their logic for path exlcusion. + $excluded = array_merge( + $excluded, + array( + basename( $route ), + ) + ); + } + + return $excluded; + } +} +add_filter( + 'faustwp_exclude_from_public_redirect', + 'tw_previews_faust_exclude_redirect_preview_route', + 20, + 1 +); + +if ( ! function_exists( 'tw_previews_template_include_preview' ) ) { + /** + * Use custom template for previews. + * + * @param string $template Current template path. + * @return string + */ + function tw_previews_template_include_preview( $template ) { + $route = add_query_arg( null, null ); + + if ( strpos( $route, 'preview/' ) > -1 ) { + if ( ! is_user_logged_in() ) { + header( 'Status: 403 Forbidden', true, 403 ); + exit(); + } + return TW_PREVIEWS_PATH . '/preview/preview.php'; + } + + return $template; + } +} +add_action( 'template_include', 'tw_previews_template_include_preview' ); + +if ( ! function_exists( 'tw_previews_preview_post_link' ) ) { + /** + * Update preview post link. + * + * @param string $preview_link Current preview link. + * @param WP_Post $post Post object preview link is being created for. + * + * @return string New post preview link URL. + */ + function tw_previews_preview_post_link( $preview_link, $post ) { + // We will work with a global ID that WPGraphQL uses. Will make queries easier down the line. + $post_id = base64_encode( "post:{$post->ID}" ); + $preview_path = "/preview/{$post_id}"; + + return $preview_path; + } +} +add_filter( 'preview_post_link', 'tw_previews_preview_post_link', 100000, 2 ); + +/** + * Render HTML and enqueue scripts for admin page. + * + * @return void + */ +function tw_previews_preview_page_html() { + + global $wp; + + $not_preview = ! preg_match( '~^preview/~', $wp->request ); + + if ( ! $wp->request || $not_preview ) { + return; + } + + list(, $post_id) = explode( '/', $wp->request ); + list(, $post_database_id) = explode( ':', base64_decode( $post_id ) ); + $post = get_post( $post_database_id ); + + if ( in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) { + $post->filter = 'sample'; + } + + $permalink = get_permalink( $post, true ); + $preview_url = preg_replace( '~(?<=/)[^/]+$~', "preview/{$post_id}", $permalink ); + + if ( function_exists( 'WPE\FaustWP\Replacement\equivalent_frontend_url' ) ) { + $preview_url = WPE\FaustWP\Replacement\equivalent_frontend_url( $preview_url ); + } + + wp_enqueue_style( 'tw-previews-preview-ui', TW_PREVIEWS_URL . 'preview/ui/ui.css', array(), wp_rand() ); + wp_enqueue_script( 'tw-previews-preview-ui', TW_PREVIEWS_URL . 'preview/ui/dist/bundle.js', array(), wp_rand(), array( 'strategy' => 'defer' ) ); + wp_localize_script( + 'tw-previews-preview-ui', + 'appLocalizer', + array( + 'appContainerId' => TW_PREVIEWS_APP_CONTAINER_ID, + 'restUrl' => home_url( '/wp-json/wp/v2/' ), + 'gqlUrl' => trailingslashit( site_url() ) . 'index.php?' . \WPGraphQL\Router::$route, + 'nonce' => wp_create_nonce( 'wp_rest' ), + 'id' => $post_id, + 'previewUrl' => $preview_url, + ) + ); +} +add_action( 'wp_print_scripts', 'tw_previews_preview_page_html' ); diff --git a/wp-content/plugins/tw-previews/preview/ui/.eslintrc.js b/wp-content/plugins/tw-previews/preview/ui/.eslintrc.js new file mode 100644 index 000000000..42c6c3a97 --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + extends: [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "eslint-config-prettier", + ], + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: "latest", + sourceType: "module", + }, + rules: { + "react/prop-types": 0, + }, + plugins: ["react", "@typescript-eslint"], +}; diff --git a/wp-content/plugins/tw-previews/preview/ui/.gitignore b/wp-content/plugins/tw-previews/preview/ui/.gitignore new file mode 100644 index 000000000..55e81a970 --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui/.gitignore @@ -0,0 +1,2 @@ +# Ignore generated graphql types +src/types/api/graphql.ts diff --git a/wp-content/plugins/tw-previews/preview/ui/babel.config.json b/wp-content/plugins/tw-previews/preview/ui/babel.config.json new file mode 100644 index 000000000..31698efbe --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui/babel.config.json @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": "defaults" + } + ], + "@babel/preset-react" + ] +} diff --git a/wp-content/plugins/tw-previews/preview/ui/codegen.ts b/wp-content/plugins/tw-previews/preview/ui/codegen.ts new file mode 100644 index 000000000..b76866811 --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui/codegen.ts @@ -0,0 +1,13 @@ +import type { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + overwrite: true, + schema: 'http://the-world-wp.lndo.site/graphql', + generates: { + 'src/types/api/graphql.ts': { + plugins: ['typescript'] + } + } +}; + +export default config; diff --git a/wp-content/plugins/tw-previews/preview/ui/components.json b/wp-content/plugins/tw-previews/preview/ui/components.json new file mode 100644 index 000000000..b97b849d3 --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "./tailwind.config.js", + "css": "./src/styles/global.scss", + "baseColor": "slate", + "cssVariables": true + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/wp-content/plugins/tw-previews/preview/ui/dist/bundle.js b/wp-content/plugins/tw-previews/preview/ui/dist/bundle.js new file mode 100644 index 000000000..98be3f8ac --- /dev/null +++ b/wp-content/plugins/tw-previews/preview/ui/dist/bundle.js @@ -0,0 +1,1815 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/styles/global.scss": +/*!*******************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/styles/global.scss ***! + \*******************************************************************************************************************************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/*\\n! tailwindcss v3.3.5 | MIT License | https://tailwindcss.com\\n*/ /*\\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\\n*/\\n*,\\n::before,\\n::after {\\n box-sizing: border-box; /* 1 */\\n border-width: 0; /* 2 */\\n border-style: solid; /* 2 */\\n border-color: #e5e7eb; /* 2 */\\n}\\n\\n::before,\\n::after {\\n --tw-content: \\\"\\\";\\n}\\n\\n/*\\n1. Use a consistent sensible line-height in all browsers.\\n2. Prevent adjustments of font size after orientation changes in iOS.\\n3. Use a more readable tab size.\\n4. Use the user's configured `sans` font-family by default.\\n5. Use the user's configured `sans` font-feature-settings by default.\\n6. Use the user's configured `sans` font-variation-settings by default.\\n*/\\nhtml {\\n line-height: 1.5; /* 1 */\\n -webkit-text-size-adjust: 100%; /* 2 */\\n -moz-tab-size: 4; /* 3 */\\n -o-tab-size: 4;\\n tab-size: 4; /* 3 */\\n font-family: var(--font-sans), ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\"; /* 4 */\\n font-feature-settings: normal; /* 5 */\\n font-variation-settings: normal; /* 6 */\\n}\\n\\n/*\\n1. Remove the margin in all browsers.\\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\\n*/\\nbody {\\n margin: 0; /* 1 */\\n line-height: inherit; /* 2 */\\n}\\n\\n/*\\n1. Add the correct height in Firefox.\\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\\n3. Ensure horizontal rules are visible by default.\\n*/\\nhr {\\n height: 0; /* 1 */\\n color: inherit; /* 2 */\\n border-top-width: 1px; /* 3 */\\n}\\n\\n/*\\nAdd the correct text decoration in Chrome, Edge, and Safari.\\n*/\\nabbr:where([title]) {\\n text-decoration: underline;\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\n\\n/*\\nRemove the default font size and weight for headings.\\n*/\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n\\n/*\\nReset links to optimize for opt-in styling instead of opt-out.\\n*/\\na {\\n color: inherit;\\n text-decoration: inherit;\\n}\\n\\n/*\\nAdd the correct font weight in Edge and Safari.\\n*/\\nb,\\nstrong {\\n font-weight: bolder;\\n}\\n\\n/*\\n1. Use the user's configured `mono` font family by default.\\n2. Correct the odd `em` font sizing in all browsers.\\n*/\\ncode,\\nkbd,\\nsamp,\\npre {\\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace; /* 1 */\\n font-size: 1em; /* 2 */\\n}\\n\\n/*\\nAdd the correct font size in all browsers.\\n*/\\nsmall {\\n font-size: 80%;\\n}\\n\\n/*\\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\\n*/\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\n\\nsub {\\n bottom: -0.25em;\\n}\\n\\nsup {\\n top: -0.5em;\\n}\\n\\n/*\\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\\n3. Remove gaps between table borders by default.\\n*/\\ntable {\\n text-indent: 0; /* 1 */\\n border-color: inherit; /* 2 */\\n border-collapse: collapse; /* 3 */\\n}\\n\\n/*\\n1. Change the font styles in all browsers.\\n2. Remove the margin in Firefox and Safari.\\n3. Remove default padding in all browsers.\\n*/\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n font-family: inherit; /* 1 */\\n font-feature-settings: inherit; /* 1 */\\n font-variation-settings: inherit; /* 1 */\\n font-size: 100%; /* 1 */\\n font-weight: inherit; /* 1 */\\n line-height: inherit; /* 1 */\\n color: inherit; /* 1 */\\n margin: 0; /* 2 */\\n padding: 0; /* 3 */\\n}\\n\\n/*\\nRemove the inheritance of text transform in Edge and Firefox.\\n*/\\nbutton,\\nselect {\\n text-transform: none;\\n}\\n\\n/*\\n1. Correct the inability to style clickable types in iOS and Safari.\\n2. Remove default button styles.\\n*/\\nbutton,\\n[type=button],\\n[type=reset],\\n[type=submit] {\\n -webkit-appearance: button; /* 1 */\\n background-color: transparent; /* 2 */\\n background-image: none; /* 2 */\\n}\\n\\n/*\\nUse the modern Firefox focus style for all focusable elements.\\n*/\\n:-moz-focusring {\\n outline: auto;\\n}\\n\\n/*\\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\\n*/\\n:-moz-ui-invalid {\\n box-shadow: none;\\n}\\n\\n/*\\nAdd the correct vertical alignment in Chrome and Firefox.\\n*/\\nprogress {\\n vertical-align: baseline;\\n}\\n\\n/*\\nCorrect the cursor style of increment and decrement buttons in Safari.\\n*/\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n height: auto;\\n}\\n\\n/*\\n1. Correct the odd appearance in Chrome and Safari.\\n2. Correct the outline style in Safari.\\n*/\\n[type=search] {\\n -webkit-appearance: textfield; /* 1 */\\n outline-offset: -2px; /* 2 */\\n}\\n\\n/*\\nRemove the inner padding in Chrome and Safari on macOS.\\n*/\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n\\n/*\\n1. Correct the inability to style clickable types in iOS and Safari.\\n2. Change font properties to `inherit` in Safari.\\n*/\\n::-webkit-file-upload-button {\\n -webkit-appearance: button; /* 1 */\\n font: inherit; /* 2 */\\n}\\n\\n/*\\nAdd the correct display in Chrome and Safari.\\n*/\\nsummary {\\n display: list-item;\\n}\\n\\n/*\\nRemoves the default spacing and border for appropriate elements.\\n*/\\nblockquote,\\ndl,\\ndd,\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6,\\nhr,\\nfigure,\\np,\\npre {\\n margin: 0;\\n}\\n\\nfieldset {\\n margin: 0;\\n padding: 0;\\n}\\n\\nlegend {\\n padding: 0;\\n}\\n\\nol,\\nul,\\nmenu {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\n\\n/*\\nReset default styling for dialogs.\\n*/\\ndialog {\\n padding: 0;\\n}\\n\\n/*\\nPrevent resizing textareas horizontally by default.\\n*/\\ntextarea {\\n resize: vertical;\\n}\\n\\n/*\\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\\n2. Set the default placeholder color to the user's configured gray 400 color.\\n*/\\ninput::-moz-placeholder, textarea::-moz-placeholder {\\n opacity: 1; /* 1 */\\n color: #9ca3af; /* 2 */\\n}\\n\\ninput::placeholder,\\ntextarea::placeholder {\\n opacity: 1; /* 1 */\\n color: #9ca3af; /* 2 */\\n}\\n\\n/*\\nSet the default cursor for buttons.\\n*/\\nbutton,\\n[role=button] {\\n cursor: pointer;\\n}\\n\\n/*\\nMake sure disabled buttons don't get the pointer cursor.\\n*/\\n:disabled {\\n cursor: default;\\n}\\n\\n/*\\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\\n This can trigger a poorly considered lint error in some tools but is included by design.\\n*/\\nimg,\\nsvg,\\nvideo,\\ncanvas,\\naudio,\\niframe,\\nembed,\\nobject {\\n display: block; /* 1 */\\n vertical-align: middle; /* 2 */\\n}\\n\\n/*\\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\\n*/\\nimg,\\nvideo {\\n max-width: 100%;\\n height: auto;\\n}\\n\\n/* Make elements with the HTML hidden attribute stay hidden by default */\\n[hidden] {\\n display: none;\\n}\\n\\n:root {\\n --background: 0 0% 100%;\\n --foreground: 222.2 47.4% 11.2%;\\n --muted: 210 40% 96.1%;\\n --muted-foreground: 215.4 16.3% 46.9%;\\n --popover: 0 0% 100%;\\n --popover-foreground: 222.2 47.4% 11.2%;\\n --border: 214.3 31.8% 91.4%;\\n --input: 214.3 31.8% 91.4%;\\n --card: 0 0% 100%;\\n --card-foreground: 222.2 47.4% 11.2%;\\n --primary: 207 69% 41%;\\n --primary-foreground: 210 40% 98%;\\n --secondary: 210 40% 90.1%;\\n --secondary-foreground: 222.2 47.4% 11.2%;\\n --accent: 210 40% 96.1%;\\n --accent-foreground: 222.2 47.4% 11.2%;\\n --destructive: 0 100% 50%;\\n --destructive-foreground: 210 40% 98%;\\n --ring: 215 20.2% 65.1%;\\n --radius: 0px;\\n}\\n\\n* {\\n border-color: hsl(214.3, 31.8%, 91.4%);\\n border-color: hsl(var(--border));\\n}\\n\\nbody {\\n font-family: Avenir, Montserrat, Corbel, \\\"URW Gothic\\\", source-sans-pro, sans-serif;\\n font-weight: normal;\\n font-feature-settings: \\\"rlig\\\" 1, \\\"calt\\\" 1;\\n}\\n\\n*, ::before, ::after {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgba(59, 130, 246, 0.5);\\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\\n --tw-shadow: 0 0 rgba(0,0,0,0);\\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n}\\n\\n::backdrop {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgba(59, 130, 246, 0.5);\\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\\n --tw-shadow: 0 0 rgba(0,0,0,0);\\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n}\\n\\n.pointer-events-auto {\\n pointer-events: auto;\\n}\\n\\n.static {\\n position: static;\\n}\\n\\n.fixed {\\n position: fixed;\\n}\\n\\n.absolute {\\n position: absolute;\\n}\\n\\n.relative {\\n position: relative;\\n}\\n\\n.sticky {\\n position: sticky;\\n}\\n\\n.right-2 {\\n right: 0.5rem;\\n}\\n\\n.top-0 {\\n top: 0px;\\n}\\n\\n.top-2 {\\n top: 0.5rem;\\n}\\n\\n.z-40 {\\n z-index: 40;\\n}\\n\\n.mb-1 {\\n margin-bottom: 0.25rem;\\n}\\n\\n.inline {\\n display: inline;\\n}\\n\\n.flex {\\n display: flex;\\n}\\n\\n.inline-flex {\\n display: inline-flex;\\n}\\n\\n.table {\\n display: table;\\n}\\n\\n.grid {\\n display: grid;\\n}\\n\\n.contents {\\n display: contents;\\n}\\n\\n.hidden {\\n display: none;\\n}\\n\\n.h-10 {\\n height: 2.5rem;\\n}\\n\\n.h-11 {\\n height: 2.75rem;\\n}\\n\\n.h-4 {\\n height: 1rem;\\n}\\n\\n.h-8 {\\n height: 2rem;\\n}\\n\\n.h-9 {\\n height: 2.25rem;\\n}\\n\\n.h-full {\\n height: 100%;\\n}\\n\\n.h-screen {\\n height: 100vh;\\n}\\n\\n.max-h-screen {\\n max-height: 100vh;\\n}\\n\\n.w-10 {\\n width: 2.5rem;\\n}\\n\\n.w-4 {\\n width: 1rem;\\n}\\n\\n.w-full {\\n width: 100%;\\n}\\n\\n.w-screen {\\n width: 100vw;\\n}\\n\\n.shrink-0 {\\n flex-shrink: 0;\\n}\\n\\n@keyframes pulse {\\n 50% {\\n opacity: 0.5;\\n }\\n}\\n.animate-pulse {\\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\\n}\\n\\n.flex-col-reverse {\\n flex-direction: column-reverse;\\n}\\n\\n.items-center {\\n align-items: center;\\n}\\n\\n.justify-center {\\n justify-content: center;\\n}\\n\\n.justify-between {\\n justify-content: space-between;\\n}\\n\\n.gap-1 {\\n gap: 0.25rem;\\n}\\n\\n.space-x-4 > :not([hidden]) ~ :not([hidden]) {\\n --tw-space-x-reverse: 0;\\n margin-right: 0rem;\\n margin-right: calc(1rem * var(--tw-space-x-reverse));\\n margin-left: 1rem;\\n margin-left: calc(1rem * (1 - var(--tw-space-x-reverse)));\\n margin-left: 1rem;\\n margin-left: calc(1rem * (1 - var(--tw-space-x-reverse)));\\n}\\n\\n.overflow-hidden {\\n overflow: hidden;\\n}\\n\\n.whitespace-nowrap {\\n white-space: nowrap;\\n}\\n\\n.rounded-full {\\n border-radius: 9999px;\\n}\\n\\n.rounded-lg {\\n border-radius: 0px;\\n border-radius: var(--radius);\\n}\\n\\n.rounded-md {\\n border-radius: 0;\\n border-radius: max(0, var(--radius) - 2px);\\n}\\n\\n.border {\\n border-width: 1px;\\n}\\n\\n.border-destructive {\\n border-color: hsl(0, 100%, 50%);\\n border-color: hsl(var(--destructive));\\n}\\n\\n.border-destructive\\\\/50 {\\n border-color: hsla(0, 100%, 50%, 0.5);\\n border-color: hsl(var(--destructive)/0.5);\\n}\\n\\n.border-input {\\n border-color: hsl(214.3, 31.8%, 91.4%);\\n border-color: hsl(var(--input));\\n}\\n\\n.border-transparent {\\n border-color: transparent;\\n}\\n\\n.bg-background {\\n background-color: hsl(0, 0%, 100%);\\n background-color: hsl(var(--background));\\n}\\n\\n.bg-destructive {\\n background-color: hsl(0, 100%, 50%);\\n background-color: hsl(var(--destructive));\\n}\\n\\n.bg-muted {\\n background-color: hsl(210, 40%, 96.1%);\\n background-color: hsl(var(--muted));\\n}\\n\\n.bg-primary {\\n background-color: hsl(207, 69%, 41%);\\n background-color: hsl(var(--primary));\\n}\\n\\n.bg-secondary {\\n background-color: hsl(210, 40%, 90.1%);\\n background-color: hsl(var(--secondary));\\n}\\n\\n.bg-transparent {\\n background-color: transparent;\\n}\\n\\n.bg-white {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255, 255, 255);\\n background-color: rgba(255, 255, 255, var(--tw-bg-opacity));\\n}\\n\\n.p-1 {\\n padding: 0.25rem;\\n}\\n\\n.p-4 {\\n padding: 1rem;\\n}\\n\\n.p-6 {\\n padding: 1.5rem;\\n}\\n\\n.px-2 {\\n padding-left: 0.5rem;\\n padding-right: 0.5rem;\\n}\\n\\n.px-2\\\\.5 {\\n padding-left: 0.625rem;\\n padding-right: 0.625rem;\\n}\\n\\n.px-3 {\\n padding-left: 0.75rem;\\n padding-right: 0.75rem;\\n}\\n\\n.px-4 {\\n padding-left: 1rem;\\n padding-right: 1rem;\\n}\\n\\n.px-8 {\\n padding-left: 2rem;\\n padding-right: 2rem;\\n}\\n\\n.py-0 {\\n padding-top: 0px;\\n padding-bottom: 0px;\\n}\\n\\n.py-0\\\\.5 {\\n padding-top: 0.125rem;\\n padding-bottom: 0.125rem;\\n}\\n\\n.py-2 {\\n padding-top: 0.5rem;\\n padding-bottom: 0.5rem;\\n}\\n\\n.pr-8 {\\n padding-right: 2rem;\\n}\\n\\n.text-sm {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n\\n.text-xs {\\n font-size: 0.75rem;\\n line-height: 1rem;\\n}\\n\\n.font-medium {\\n font-weight: 500;\\n}\\n\\n.font-semibold {\\n font-weight: 600;\\n}\\n\\n.leading-none {\\n line-height: 1;\\n}\\n\\n.tracking-tight {\\n letter-spacing: -0.025em;\\n}\\n\\n.text-destructive {\\n color: hsl(0, 100%, 50%);\\n color: hsl(var(--destructive));\\n}\\n\\n.text-destructive-foreground {\\n color: hsl(210, 40%, 98%);\\n color: hsl(var(--destructive-foreground));\\n}\\n\\n.text-foreground {\\n color: hsl(222.2, 47.4%, 11.2%);\\n color: hsl(var(--foreground));\\n}\\n\\n.text-foreground\\\\/50 {\\n color: hsla(222.2, 47.4%, 11.2%, 0.5);\\n color: hsl(var(--foreground)/0.5);\\n}\\n\\n.text-primary {\\n color: hsl(207, 69%, 41%);\\n color: hsl(var(--primary));\\n}\\n\\n.text-primary-foreground {\\n color: hsl(210, 40%, 98%);\\n color: hsl(var(--primary-foreground));\\n}\\n\\n.text-secondary-foreground {\\n color: hsl(222.2, 47.4%, 11.2%);\\n color: hsl(var(--secondary-foreground));\\n}\\n\\n.underline-offset-4 {\\n text-underline-offset: 4px;\\n}\\n\\n.opacity-0 {\\n opacity: 0;\\n}\\n\\n.opacity-90 {\\n opacity: 0.9;\\n}\\n\\n.shadow-lg {\\n --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);\\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\\n box-shadow: 0 0 rgba(0, 0, 0, 0), 0 0 rgba(0, 0, 0, 0), 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);\\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-ring-shadow, 0 0 rgba(0, 0, 0, 0)), var(--tw-shadow);\\n}\\n\\n.outline {\\n outline-style: solid;\\n}\\n\\n.ring-offset-background {\\n --tw-ring-offset-color: hsl(var(--background));\\n}\\n\\n.filter {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n\\n.transition-all {\\n transition-property: all;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n\\n.transition-colors {\\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n\\n.transition-opacity {\\n transition-property: opacity;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n\\n@keyframes enter {\\n from {\\n opacity: 1;\\n opacity: var(--tw-enter-opacity, 1);\\n transform: translate3d(0, 0, 0) scale3d(1, 1, 1) rotate(0);\\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\\n }\\n}\\n@keyframes exit {\\n to {\\n opacity: 1;\\n opacity: var(--tw-exit-opacity, 1);\\n transform: translate3d(0, 0, 0) scale3d(1, 1, 1) rotate(0);\\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\\n }\\n}\\n.paused {\\n animation-play-state: paused;\\n}\\n\\n.rdp-dropdown_icon {\\n display: inline-block;\\n}\\n\\n.rdp-caption_dropdowns {\\n gap: 0.5rem;\\n}\\n\\n.rdp-caption_dropdowns :has(.rdp-dropdown_icon) {\\n display: inline-flex;\\n align-items: center;\\n}\\n\\n.hover\\\\:bg-accent:hover {\\n background-color: hsl(210, 40%, 96.1%);\\n background-color: hsl(var(--accent));\\n}\\n\\n.hover\\\\:bg-destructive\\\\/80:hover {\\n background-color: hsla(0, 100%, 50%, 0.8);\\n background-color: hsl(var(--destructive)/0.8);\\n}\\n\\n.hover\\\\:bg-destructive\\\\/90:hover {\\n background-color: hsla(0, 100%, 50%, 0.9);\\n background-color: hsl(var(--destructive)/0.9);\\n}\\n\\n.hover\\\\:bg-primary\\\\/80:hover {\\n background-color: hsla(207, 69%, 41%, 0.8);\\n background-color: hsl(var(--primary)/0.8);\\n}\\n\\n.hover\\\\:bg-primary\\\\/90:hover {\\n background-color: hsla(207, 69%, 41%, 0.9);\\n background-color: hsl(var(--primary)/0.9);\\n}\\n\\n.hover\\\\:bg-secondary:hover {\\n background-color: hsl(210, 40%, 90.1%);\\n background-color: hsl(var(--secondary));\\n}\\n\\n.hover\\\\:bg-secondary\\\\/80:hover {\\n background-color: hsla(210, 40%, 90.1%, 0.8);\\n background-color: hsl(var(--secondary)/0.8);\\n}\\n\\n.hover\\\\:text-accent-foreground:hover {\\n color: hsl(222.2, 47.4%, 11.2%);\\n color: hsl(var(--accent-foreground));\\n}\\n\\n.hover\\\\:text-foreground:hover {\\n color: hsl(222.2, 47.4%, 11.2%);\\n color: hsl(var(--foreground));\\n}\\n\\n.hover\\\\:underline:hover {\\n text-decoration-line: underline;\\n}\\n\\n.focus\\\\:opacity-100:focus {\\n opacity: 1;\\n}\\n\\n.focus\\\\:outline-none:focus {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n\\n.focus\\\\:ring-2:focus {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color), var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color), 0 0 rgba(0, 0, 0, 0);\\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0, 0, 0, 0));\\n}\\n\\n.focus\\\\:ring-ring:focus {\\n --tw-ring-color: hsl(var(--ring));\\n}\\n\\n.focus\\\\:ring-offset-2:focus {\\n --tw-ring-offset-width: 2px;\\n}\\n\\n.focus-visible\\\\:outline-none:focus-visible {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n\\n.focus-visible\\\\:ring-2:focus-visible {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color), var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color), 0 0 rgba(0, 0, 0, 0);\\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0, 0, 0, 0));\\n}\\n\\n.focus-visible\\\\:ring-ring:focus-visible {\\n --tw-ring-color: hsl(var(--ring));\\n}\\n\\n.focus-visible\\\\:ring-offset-2:focus-visible {\\n --tw-ring-offset-width: 2px;\\n}\\n\\n.disabled\\\\:pointer-events-none:disabled {\\n pointer-events: none;\\n}\\n\\n.disabled\\\\:opacity-50:disabled {\\n opacity: 0.5;\\n}\\n\\n.group:hover .group-hover\\\\:opacity-100 {\\n opacity: 1;\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:border-muted\\\\/40 {\\n border-color: hsla(210, 40%, 96.1%, 0.4);\\n border-color: hsl(var(--muted)/0.4);\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:text-red-300 {\\n --tw-text-opacity: 1;\\n color: rgb(252, 165, 165);\\n color: rgba(252, 165, 165, var(--tw-text-opacity));\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:hover\\\\:border-destructive\\\\/30:hover {\\n border-color: hsla(0, 100%, 50%, 0.3);\\n border-color: hsl(var(--destructive)/0.3);\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:hover\\\\:bg-destructive:hover {\\n background-color: hsl(0, 100%, 50%);\\n background-color: hsl(var(--destructive));\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:hover\\\\:text-destructive-foreground:hover {\\n color: hsl(210, 40%, 98%);\\n color: hsl(var(--destructive-foreground));\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:hover\\\\:text-red-50:hover {\\n --tw-text-opacity: 1;\\n color: rgb(254, 242, 242);\\n color: rgba(254, 242, 242, var(--tw-text-opacity));\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:focus\\\\:ring-destructive:focus {\\n --tw-ring-color: hsl(var(--destructive));\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:focus\\\\:ring-red-400:focus {\\n --tw-ring-opacity: 1;\\n --tw-ring-color: rgba(248, 113, 113, var(--tw-ring-opacity));\\n}\\n\\n.group.destructive .group-\\\\[\\\\.destructive\\\\]\\\\:focus\\\\:ring-offset-red-600:focus {\\n --tw-ring-offset-color: #dc2626;\\n}\\n\\n.data-\\\\[swipe\\\\=cancel\\\\]\\\\:translate-x-0[data-swipe=cancel] {\\n --tw-translate-x: 0px;\\n transform: translate(0px, var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n\\n.data-\\\\[swipe\\\\=end\\\\]\\\\:translate-x-\\\\[var\\\\(--radix-toast-swipe-end-x\\\\)\\\\][data-swipe=end] {\\n --tw-translate-x: var(--radix-toast-swipe-end-x);\\n transform: translate(var(--radix-toast-swipe-end-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n\\n.data-\\\\[swipe\\\\=move\\\\]\\\\:translate-x-\\\\[var\\\\(--radix-toast-swipe-move-x\\\\)\\\\][data-swipe=move] {\\n --tw-translate-x: var(--radix-toast-swipe-move-x);\\n transform: translate(var(--radix-toast-swipe-move-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n\\n.data-\\\\[swipe\\\\=move\\\\]\\\\:transition-none[data-swipe=move] {\\n transition-property: none;\\n}\\n\\n.data-\\\\[state\\\\=open\\\\]\\\\:animate-in[data-state=open] {\\n animation-name: enter;\\n animation-duration: 150ms;\\n --tw-enter-opacity: initial;\\n --tw-enter-scale: initial;\\n --tw-enter-rotate: initial;\\n --tw-enter-translate-x: initial;\\n --tw-enter-translate-y: initial;\\n}\\n\\n.data-\\\\[state\\\\=closed\\\\]\\\\:animate-out[data-state=closed] {\\n animation-name: exit;\\n animation-duration: 150ms;\\n --tw-exit-opacity: initial;\\n --tw-exit-scale: initial;\\n --tw-exit-rotate: initial;\\n --tw-exit-translate-x: initial;\\n --tw-exit-translate-y: initial;\\n}\\n\\n.data-\\\\[swipe\\\\=end\\\\]\\\\:animate-out[data-swipe=end] {\\n animation-name: exit;\\n animation-duration: 150ms;\\n --tw-exit-opacity: initial;\\n --tw-exit-scale: initial;\\n --tw-exit-rotate: initial;\\n --tw-exit-translate-x: initial;\\n --tw-exit-translate-y: initial;\\n}\\n\\n.data-\\\\[state\\\\=closed\\\\]\\\\:fade-out-80[data-state=closed] {\\n --tw-exit-opacity: 0.8;\\n}\\n\\n.data-\\\\[state\\\\=closed\\\\]\\\\:slide-out-to-right-full[data-state=closed] {\\n --tw-exit-translate-x: 100%;\\n}\\n\\n.data-\\\\[state\\\\=open\\\\]\\\\:slide-in-from-top-full[data-state=open] {\\n --tw-enter-translate-y: -100%;\\n}\\n\\n.dark .dark\\\\:border-destructive {\\n border-color: hsl(0, 100%, 50%);\\n border-color: hsl(var(--destructive));\\n}\\n\\n@media (min-width: 640px) {\\n .sm\\\\:bottom-0 {\\n bottom: 0px;\\n }\\n .sm\\\\:right-0 {\\n right: 0px;\\n }\\n .sm\\\\:top-auto {\\n top: auto;\\n }\\n .sm\\\\:flex-col {\\n flex-direction: column;\\n }\\n .data-\\\\[state\\\\=open\\\\]\\\\:sm\\\\:slide-in-from-bottom-full[data-state=open] {\\n --tw-enter-translate-y: 100%;\\n }\\n}\\n@media (min-width: 768px) {\\n .md\\\\:max-w-\\\\[420px\\\\] {\\n max-width: 420px;\\n }\\n}\\n.\\\\[\\\\&\\\\>svg\\\\+div\\\\]\\\\:translate-y-\\\\[-3px\\\\] > svg + div {\\n --tw-translate-y: -3px;\\n transform: translate(var(--tw-translate-x), -3px) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n\\n.\\\\[\\\\&\\\\>svg\\\\]\\\\:absolute > svg {\\n position: absolute;\\n}\\n\\n.\\\\[\\\\&\\\\>svg\\\\]\\\\:left-4 > svg {\\n left: 1rem;\\n}\\n\\n.\\\\[\\\\&\\\\>svg\\\\]\\\\:top-4 > svg {\\n top: 1rem;\\n}\\n\\n.\\\\[\\\\&\\\\>svg\\\\]\\\\:text-destructive > svg {\\n color: hsl(0, 100%, 50%);\\n color: hsl(var(--destructive));\\n}\\n\\n.\\\\[\\\\&\\\\>svg\\\\]\\\\:text-foreground > svg {\\n color: hsl(222.2, 47.4%, 11.2%);\\n color: hsl(var(--foreground));\\n}\\n\\n.\\\\[\\\\&\\\\>svg\\\\~\\\\*\\\\]\\\\:pl-7 > svg ~ * {\\n padding-left: 1.75rem;\\n}\\n\\n.\\\\[\\\\&_p\\\\]\\\\:leading-relaxed p {\\n line-height: 1.625;\\n}\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./src/styles/global.scss?./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/runtime/api.js": +/*!*****************************************************!*\ + !*** ./node_modules/css-loader/dist/runtime/api.js ***! + \*****************************************************/ +/***/ (function(module) { + +eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/css-loader/dist/runtime/api.js?"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js": +/*!**************************************************************!*\ + !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***! + \**************************************************************/ +/***/ (function(module) { + +eval("\n\nmodule.exports = function (i) {\n return i[1];\n};\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/css-loader/dist/runtime/noSourceMaps.js?"); + +/***/ }), + +/***/ "./node_modules/graphql-tag/lib/index.js": +/*!***********************************************!*\ + !*** ./node_modules/graphql-tag/lib/index.js ***! + \***********************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ disableExperimentalFragmentVariables: function() { return /* binding */ disableExperimentalFragmentVariables; },\n/* harmony export */ disableFragmentWarnings: function() { return /* binding */ disableFragmentWarnings; },\n/* harmony export */ enableExperimentalFragmentVariables: function() { return /* binding */ enableExperimentalFragmentVariables; },\n/* harmony export */ gql: function() { return /* binding */ gql; },\n/* harmony export */ resetCaches: function() { return /* binding */ resetCaches; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ \"./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var graphql__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! graphql */ \"./node_modules/graphql/language/parser.mjs\");\n\n\nvar docCache = new Map();\nvar fragmentSourceMap = new Map();\nvar printFragmentWarnings = true;\nvar experimentalFragmentVariables = false;\nfunction normalize(string) {\n return string.replace(/[\\s,]+/g, ' ').trim();\n}\nfunction cacheKeyFromLoc(loc) {\n return normalize(loc.source.body.substring(loc.start, loc.end));\n}\nfunction processFragments(ast) {\n var seenKeys = new Set();\n var definitions = [];\n ast.definitions.forEach(function (fragmentDefinition) {\n if (fragmentDefinition.kind === 'FragmentDefinition') {\n var fragmentName = fragmentDefinition.name.value;\n var sourceKey = cacheKeyFromLoc(fragmentDefinition.loc);\n var sourceKeySet = fragmentSourceMap.get(fragmentName);\n if (sourceKeySet && !sourceKeySet.has(sourceKey)) {\n if (printFragmentWarnings) {\n console.warn(\"Warning: fragment with name \" + fragmentName + \" already exists.\\n\"\n + \"graphql-tag enforces all fragment names across your application to be unique; read more about\\n\"\n + \"this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names\");\n }\n }\n else if (!sourceKeySet) {\n fragmentSourceMap.set(fragmentName, sourceKeySet = new Set);\n }\n sourceKeySet.add(sourceKey);\n if (!seenKeys.has(sourceKey)) {\n seenKeys.add(sourceKey);\n definitions.push(fragmentDefinition);\n }\n }\n else {\n definitions.push(fragmentDefinition);\n }\n });\n return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__assign)((0,tslib__WEBPACK_IMPORTED_MODULE_0__.__assign)({}, ast), { definitions: definitions });\n}\nfunction stripLoc(doc) {\n var workSet = new Set(doc.definitions);\n workSet.forEach(function (node) {\n if (node.loc)\n delete node.loc;\n Object.keys(node).forEach(function (key) {\n var value = node[key];\n if (value && typeof value === 'object') {\n workSet.add(value);\n }\n });\n });\n var loc = doc.loc;\n if (loc) {\n delete loc.startToken;\n delete loc.endToken;\n }\n return doc;\n}\nfunction parseDocument(source) {\n var cacheKey = normalize(source);\n if (!docCache.has(cacheKey)) {\n var parsed = (0,graphql__WEBPACK_IMPORTED_MODULE_1__.parse)(source, {\n experimentalFragmentVariables: experimentalFragmentVariables,\n allowLegacyFragmentVariables: experimentalFragmentVariables\n });\n if (!parsed || parsed.kind !== 'Document') {\n throw new Error('Not a valid GraphQL document.');\n }\n docCache.set(cacheKey, stripLoc(processFragments(parsed)));\n }\n return docCache.get(cacheKey);\n}\nfunction gql(literals) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (typeof literals === 'string') {\n literals = [literals];\n }\n var result = literals[0];\n args.forEach(function (arg, i) {\n if (arg && arg.kind === 'Document') {\n result += arg.loc.source.body;\n }\n else {\n result += arg;\n }\n result += literals[i + 1];\n });\n return parseDocument(result);\n}\nfunction resetCaches() {\n docCache.clear();\n fragmentSourceMap.clear();\n}\nfunction disableFragmentWarnings() {\n printFragmentWarnings = false;\n}\nfunction enableExperimentalFragmentVariables() {\n experimentalFragmentVariables = true;\n}\nfunction disableExperimentalFragmentVariables() {\n experimentalFragmentVariables = false;\n}\nvar extras = {\n gql: gql,\n resetCaches: resetCaches,\n disableFragmentWarnings: disableFragmentWarnings,\n enableExperimentalFragmentVariables: enableExperimentalFragmentVariables,\n disableExperimentalFragmentVariables: disableExperimentalFragmentVariables\n};\n(function (gql_1) {\n gql_1.gql = extras.gql, gql_1.resetCaches = extras.resetCaches, gql_1.disableFragmentWarnings = extras.disableFragmentWarnings, gql_1.enableExperimentalFragmentVariables = extras.enableExperimentalFragmentVariables, gql_1.disableExperimentalFragmentVariables = extras.disableExperimentalFragmentVariables;\n})(gql || (gql = {}));\ngql[\"default\"] = gql;\n/* harmony default export */ __webpack_exports__[\"default\"] = (gql);\n//# sourceMappingURL=index.js.map\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/graphql-tag/lib/index.js?"); + +/***/ }), + +/***/ "./node_modules/lucide-react/dist/esm/createLucideIcon.js": +/*!****************************************************************!*\ + !*** ./node_modules/lucide-react/dist/esm/createLucideIcon.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ createLucideIcon; },\n/* harmony export */ toKebabCase: function() { return /* binding */ toKebabCase; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _defaultAttributes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultAttributes.js */ \"./node_modules/lucide-react/dist/esm/defaultAttributes.js\");\n/**\n * lucide-react v0.292.0 - ISC\n */\n\n\n\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(\n ({ color = \"currentColor\", size = 24, strokeWidth = 2, absoluteStrokeWidth, children, ...rest }, ref) => (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(\n \"svg\",\n {\n ref,\n ..._defaultAttributes_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: `lucide lucide-${toKebabCase(iconName)}`,\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]) || []\n ]\n )\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\n\n//# sourceMappingURL=createLucideIcon.js.map\n\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/lucide-react/dist/esm/createLucideIcon.js?"); + +/***/ }), + +/***/ "./node_modules/lucide-react/dist/esm/defaultAttributes.js": +/*!*****************************************************************!*\ + !*** ./node_modules/lucide-react/dist/esm/defaultAttributes.js ***! + \*****************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ defaultAttributes; }\n/* harmony export */ });\n/**\n * lucide-react v0.292.0 - ISC\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\n\n//# sourceMappingURL=defaultAttributes.js.map\n\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/lucide-react/dist/esm/defaultAttributes.js?"); + +/***/ }), + +/***/ "./node_modules/lucide-react/dist/esm/icons/check-circle.js": +/*!******************************************************************!*\ + !*** ./node_modules/lucide-react/dist/esm/icons/check-circle.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CheckCircle; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * lucide-react v0.292.0 - ISC\n */\n\n\n\nconst CheckCircle = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"CheckCircle\", [\n [\"path\", { d: \"M22 11.08V12a10 10 0 1 1-5.93-9.14\", key: \"g774vq\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\n\n//# sourceMappingURL=check-circle.js.map\n\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/lucide-react/dist/esm/icons/check-circle.js?"); + +/***/ }), + +/***/ "./node_modules/lucide-react/dist/esm/icons/loader.js": +/*!************************************************************!*\ + !*** ./node_modules/lucide-react/dist/esm/icons/loader.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Loader; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * lucide-react v0.292.0 - ISC\n */\n\n\n\nconst Loader = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Loader\", [\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"2\", y2: \"6\", key: \"gza1u7\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"18\", y2: \"22\", key: \"1qhbu9\" }],\n [\"line\", { x1: \"4.93\", x2: \"7.76\", y1: \"4.93\", y2: \"7.76\", key: \"xae44r\" }],\n [\n \"line\",\n { x1: \"16.24\", x2: \"19.07\", y1: \"16.24\", y2: \"19.07\", key: \"bxnmvf\" }\n ],\n [\"line\", { x1: \"2\", x2: \"6\", y1: \"12\", y2: \"12\", key: \"89khin\" }],\n [\"line\", { x1: \"18\", x2: \"22\", y1: \"12\", y2: \"12\", key: \"pb8tfm\" }],\n [\"line\", { x1: \"4.93\", x2: \"7.76\", y1: \"19.07\", y2: \"16.24\", key: \"1uxjnu\" }],\n [\"line\", { x1: \"16.24\", x2: \"19.07\", y1: \"7.76\", y2: \"4.93\", key: \"6duxfx\" }]\n]);\n\n\n//# sourceMappingURL=loader.js.map\n\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/lucide-react/dist/esm/icons/loader.js?"); + +/***/ }), + +/***/ "./node_modules/lucide-react/dist/esm/icons/x.js": +/*!*******************************************************!*\ + !*** ./node_modules/lucide-react/dist/esm/icons/x.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ X; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * lucide-react v0.292.0 - ISC\n */\n\n\n\nconst X = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\n\n//# sourceMappingURL=x.js.map\n\n\n//# sourceURL=webpack://tw-episode-importer-admin-ui/./node_modules/lucide-react/dist/esm/icons/x.js?"); + +/***/ }), + +/***/ "./node_modules/react-dom/cjs/react-dom.development.js": +/*!*************************************************************!*\ + !*** ./node_modules/react-dom/cjs/react-dom.development.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +eval("/**\n * @license React\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nif (true) {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\nvar Scheduler = __webpack_require__(/*! scheduler */ \"./node_modules/scheduler/index.js\");\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nvar suppressWarning = false;\nfunction setSuppressWarning(newSuppressWarning) {\n {\n suppressWarning = newSuppressWarning;\n }\n} // In DEV, calls to console.warn and console.error get replaced\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n {\n if (!suppressWarning) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n printWarning('warn', format, args);\n }\n }\n}\nfunction error(format) {\n {\n if (!suppressWarning) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar ScopeComponent = 21;\nvar OffscreenComponent = 22;\nvar LegacyHiddenComponent = 23;\nvar CacheComponent = 24;\nvar TracingMarkerComponent = 25;\n\n// -----------------------------------------------------------------------------\n\nvar enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing\n// the react-reconciler package.\n\nvar enableNewReconciler = false; // Support legacy Primer support on internal FB www\n\nvar enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics.\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n\nvar enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz\n// React DOM Chopping Block\n//\n// Similar to main Chopping Block but only flags related to React DOM. These are\n// grouped because we will likely batch all of them into a single major release.\n// -----------------------------------------------------------------------------\n// Disable support for comment nodes as React DOM containers. Already disabled\n// in open source, but www codebase still relies on it. Need to remove.\n\nvar disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection.\n// and client rendering, mostly to allow JSX attributes to apply to the custom\n// element's object properties instead of only HTML attributes.\n// https://github.com/facebook/react/issues/11347\n\nvar enableCustomElementPropertySupport = false; // Disables children for