diff --git a/themes/default/public/css/tailwindcss.css b/themes/default/public/css/tailwindcss.css new file mode 100644 index 0000000..fcfa39f --- /dev/null +++ b/themes/default/public/css/tailwindcss.css @@ -0,0 +1,1142 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} + +/** + * Manually forked from SUIT CSS Base: https://github.com/suitcss/base + * A thin layer on top of normalize.css that provides a starting point more + * suitable for web applications. + */ + +/** + * Removes the default spacing and border for appropriate elements. + */ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +button { + background-color: transparent; + background-image: none; + padding: 0; +} + +/** + * Work around a Firefox/IE bug where the transparent `button` background + * results in a loss of the default `button` focus styles. + */ + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +fieldset { + margin: 0; + padding: 0; +} + +ol, +ul { + list-style: none; + margin: 0; + padding: 0; +} + +/** + * Tailwind custom reset styles + */ + +/** + * 1. Use the user's configured `sans` font-family (with Tailwind's default + * sans-serif font stack as a fallback) as a sane default. + * 2. Use Tailwind's default "normal" line-height so the user isn't forced + * to override it to ensure consistency even when using the default theme. + */ + +html { + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */ + line-height: 1.5; /* 2 */ +} + +/** + * 1. Prevent padding and border from affecting element width. + * + * We used to set this in the html element and inherit from + * the parent element for everything else. This caused issues + * in shadow-dom-enhanced elements like
where the content + * is wrapped by a div with box-sizing set to `content-box`. + * + * https://github.com/mozdevs/cssremedy/issues/4 + * + * + * 2. Allow adding a border to an element by just adding a border-width. + * + * By default, the way the browser specifies that an element should have no + * border is by setting it's border-style to `none` in the user-agent + * stylesheet. + * + * In order to easily add borders to elements by just setting the `border-width` + * property, we change the default border-style for all elements to `solid`, and + * use border-width to hide them instead. This way our `border` utilities only + * need to set the `border-width` property instead of the entire `border` + * shorthand, making our border utilities much more straightforward to compose. + * + * https://github.com/tailwindcss/tailwindcss/pull/116 + */ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: #e2e8f0; /* 2 */ +} + +/* + * Ensure horizontal rules are visible by default + */ + +hr { + border-top-width: 1px; +} + +/** + * Undo the `border-style: none` reset that Normalize applies to images so that + * our `border-{width}` utilities have the expected effect. + * + * The Normalize reset is unnecessary for us since we default the border-width + * to 0 on all elements. + * + * https://github.com/tailwindcss/tailwindcss/issues/362 + */ + +img { + border-style: solid; +} + +textarea { + resize: vertical; +} + +input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { + color: #a0aec0; +} + +input::-moz-placeholder, textarea::-moz-placeholder { + color: #a0aec0; +} + +input:-ms-input-placeholder, textarea:-ms-input-placeholder { + color: #a0aec0; +} + +input::-ms-input-placeholder, textarea::-ms-input-placeholder { + color: #a0aec0; +} + +input::placeholder, +textarea::placeholder { + color: #a0aec0; +} + +button, +[role="button"] { + cursor: pointer; +} + +table { + border-collapse: collapse; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/** + * Reset links to optimize for opt-in styling instead of + * opt-out. + */ + +a { + color: inherit; + text-decoration: inherit; +} + +/** + * Reset form element properties that are easy to forget to + * style explicitly so you don't inadvertently introduce + * styles that deviate from your design system. These styles + * supplement a partial reset that is already applied by + * normalize.css. + */ + +button, +input, +optgroup, +select, +textarea { + padding: 0; + line-height: inherit; + color: inherit; +} + +/** + * Use the configured 'mono' font family for elements that + * are expected to be rendered with a monospace font, falling + * back to the system monospace stack if there is no configured + * 'mono' font family. + */ + +pre, +code, +kbd, +samp { + font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +/** + * Make replaced elements `display: block` by default as that's + * the behavior you want almost all of the time. Inspired by + * CSS Remedy, with `svg` added as well. + * + * https://github.com/mozdevs/cssremedy/issues/14 + */ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + vertical-align: middle; +} + +/** + * Constrain images and videos to the parent width and preserve + * their instrinsic aspect ratio. + * + * https://github.com/mozdevs/cssremedy/issues/14 + */ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Recreate some normal files */ + +h1 { + font-size: 1.5rem; +} + +h2 { + font-size: 1.25rem; +} + +h3 { + font-size: 1.125rem; +} + +/*tailwind start components */ + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +/*tailwind end components */ + +/* Default */ + +body { + background-size: cover; + background-image: repeating-linear-gradient(135deg, #00000033, #00000033 63%, transparent 63%, transparent), + url('../img/backgrounds/only-komona.jpg'); + --text-opacity: 1; + color: #fff; + color: rgba(255, 255, 255, var(--text-opacity)); + min-height: 100vh; +} + +body > * { + padding-left: 1rem; + padding-right: 1rem; +} + +body.rtl { + direction: rtl; +} + +a { + text-decoration: underline; + -webkit-text-decoration-style: dotted; + text-decoration-style: dotted; +} + +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + display: block; + appearance: none; + width: 100%; + border-width: 1px; + --border-opacity: 1; + border-color: #edf2f7; + border-color: rgba(237, 242, 247, var(--border-opacity)); + border-radius: 0.25rem; +} + +/* Navbar */ + +.navbar { + --bg-opacity: 1; + background-color: #2d3748; + background-color: rgba(45, 55, 72, var(--bg-opacity)); + --bg-opacity: 0.75; + width: 100%; + font-size: 1rem; + text-transform: uppercase; +} + +.navbar .navbrand { + font-weight: 700; +} + +.navbar ul li.navbrand * { + border-style: none; +} + +.navbar ul li { + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.navbar ul li * { + vertical-align: middle; + text-decoration: none; + border-style: solid; + --border-opacity: 1; + border-color: #cbd5e0; + border-color: rgba(203, 213, 224, var(--border-opacity)); + border-bottom-width: 4px; +} + +.navbar ul li.active { + font-weight: 700; +} + +.navbar ul li.active * { + border-style: solid; + --border-opacity: 1; + border-color: #4fd1c5; + border-color: rgba(79, 209, 197, var(--border-opacity)); + border-bottom-width: 4px; + text-decoration: none; +} + +.navbar ul li.lang-dropdown { + position: relative; +} + +.navbar ul li.lang-dropdown * { + --border-opacity: 0; +} + +.lang-dropdown span, +.lang-dropdown li { + cursor: pointer; +} + +.lang-dropdown span { + display: ruby; +} + +.navbar ul li.lang-dropdown ul { + --bg-opacity: 1; + background-color: #2d3748; + background-color: rgba(45, 55, 72, var(--bg-opacity)); + --bg-opacity: 1; + position: absolute; + margin-top: 0.25rem; + white-space: nowrap; +} + +/* Not index page */ + +.block-div { + --bg-opacity: 1; + background-color: #1a202c; + background-color: rgba(26, 32, 44, var(--bg-opacity)); + --bg-opacity: 0.75; + margin-top: 1rem; + padding: 1rem; + width: auto; + margin-left: auto; + margin-right: auto; + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + max-width: 60rem; +} + +.block-div a { + --text-opacity: 1; + color: #b2f5ea; + color: rgba(178, 245, 234, var(--text-opacity)); +} + +.block-div a:visited { + --text-opacity: 1; + color: #b794f4; + color: rgba(183, 148, 244, var(--text-opacity)); +} + +/* My files page */ + +.block-div.myfiles hr { + margin-bottom: 0.5rem; +} + +.block-div.myfiles { + line-height: 1.25; +} + +.files-buttons { + margin-top: 1rem; + margin-bottom: 1rem; + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + grid-gap: 0.5rem; + gap: 0.5rem; + text-align: center; +} + +@media (min-width: 1024px) { + .files-buttons { + margin-top: 1rem; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +.files-buttons .btn { + width: 100%; +} + +/* Index page */ + +.upload { + margin-top: 1rem; + margin-bottom: 1rem; + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + grid-gap: 0.5rem; + gap: 0.5rem; +} + +@media (min-width: 1024px) { + .upload { + margin-top: 1rem; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (min-width: 1280px) { + .upload { + margin-top: 1rem; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .upload #results { + grid-column: span 2 / span 2; + } +} + +.upload .upload-form { + --bg-opacity: 1; + background-color: #1a202c; + background-color: rgba(26, 32, 44, var(--bg-opacity)); + --bg-opacity: 0.75; + border-radius: 0.375rem; + padding: 1rem; +} + +@media (min-width: 768px) { + .upload .upload-form { + line-height: 1.625; + } +} + +@media (min-width: 1024px) { + .upload .upload-form { + line-height: 2; + } +} + +.upload .upload-form select { + line-height: 1.5; +} + +.upload .upload-form input { + padding-left: 0.5rem; + line-height: 1.625; +} + +.upload .upload-form select, +.upload .upload-form input, +.upload .upload-form { + --bg-opacity: 1; + background-color: #4a5568; + background-color: rgba(74, 85, 104, var(--bg-opacity)); + --bg-opacity: 0.75; +} + +.upload #results h1 { + font-size: 1.25rem; + text-align: center; +} + +.upload .upload-form .input-field { + position: relative; +} + +.upload .upload-form [type="checkbox"] { + width: 1rem; + height: 1rem; +} + +.upload #files { + text-align: center; + margin-top: 1rem; + padding: 1rem; + border-width: 2px; + --border-opacity: 1; + border-color: #edf2f7; + border-color: rgba(237, 242, 247, var(--border-opacity)); + border-style: dashed; +} + +.upload #results { + --bg-opacity: 1; + background-color: #4a5568; + background-color: rgba(74, 85, 104, var(--bg-opacity)); + --bg-opacity: 0.75; + border-radius: 0.375rem; + padding: 1rem; + margin-left: 2.5rem; + margin-right: 2.5rem; +} + +/* Buttons */ + +.btn, +.btn a { + --text-opacity: 1 !important; + color: #fff !important; + color: rgba(255, 255, 255, var(--text-opacity)) !important; + text-align: center !important; + text-decoration: none !important; +} + +.btn { + background-color: transparent; + font-weight: 700; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + padding-right: 0.5rem; + border-width: 2px; + --border-opacity: 1; + border-color: #38b2ac; + border-color: rgba(56, 178, 172, var(--border-opacity)); + border-radius: 0.25rem; + --text-opacity: 1 !important; + color: #fff !important; + color: rgba(255, 255, 255, var(--text-opacity)) !important; + text-align: center !important; + text-decoration: none !important; +} + +.btn:hover { + --bg-opacity: 1; + background-color: #285e61; + background-color: rgba(40, 94, 97, var(--bg-opacity)); + --bg-opacity: 0.75; + --border-opacity: 1; + border-color: #285e61; + border-color: rgba(40, 94, 97, var(--border-opacity)); +} + +.btn.disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* Icons */ + +svg { + height: 1rem; + width: 1rem; + --text-opacity: 1; + color: #fff; + color: rgba(255, 255, 255, var(--text-opacity)); +} + +svg.icon-hamburger { + height: 2rem; + width: 2rem; +} + +svg.icon-infos { + --text-opacity: 1; + color: #b2f5ea; + color: rgba(178, 245, 234, var(--text-opacity)); + display: inline-block; +} + +svg.icon-upload { + margin-left: auto; + margin-right: auto; + border-radius: 9999px; + border-width: 1px; + --border-opacity: 1; + border-color: #edf2f7; + border-color: rgba(237, 242, 247, var(--border-opacity)); + border-width: 8px; + height: 8rem; + width: 8rem; + --text-opacity: 1; + color: #edf2f7; + color: rgba(237, 242, 247, var(--text-opacity)); +} + +/* Cards */ + +.card { + padding: 1rem; + margin-top: 1rem; +} + +.card.mini { + padding-left: 0.25rem; + padding-right: 0; + padding-top: 0; + padding-bottom: 0; + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + +.card.error { + --bg-opacity: 1; + background-color: #fffaf0; + background-color: rgba(255, 250, 240, var(--bg-opacity)); + --text-opacity: 1; + color: #c05621; + color: rgba(192, 86, 33, var(--text-opacity)); + border-left-width: 4px; + --border-opacity: 1; + border-color: #ed8936; + border-color: rgba(237, 137, 54, var(--border-opacity)); +} + +.card.info { + --bg-opacity: 1; + background-color: #ebf8ff; + background-color: rgba(235, 248, 255, var(--bg-opacity)); + --text-opacity: 1; + color: #2b6cb0; + color: rgba(43, 108, 176, var(--text-opacity)); + border-left-width: 4px; + --border-opacity: 1; + border-color: #4299e1; + border-color: rgba(66, 153, 225, var(--border-opacity)); +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.hidden { + display: none; +} + +.items-center { + align-items: center; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.pointer-events-none { + pointer-events: none; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-y-0 { + top: 0; + bottom: 0; +} + +.right-0 { + right: 0; +} + +.text-left { + text-align: left; +} + +.text-gray-700 { + --text-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--text-opacity)); +} + +.w-full { + width: 100%; +} + +@media (min-width: 640px) { + .sm\:hidden { + display: none; + } +} diff --git a/themes/default/public/css/tailwindcss.min.css b/themes/default/public/css/tailwindcss.min.css new file mode 100644 index 0000000..d177f6f --- /dev/null +++ b/themes/default/public/css/tailwindcss.min.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{-webkit-text-size-adjust:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}body{margin:0;background-size:cover;background-image:repeating-linear-gradient(135deg,#00000033,#00000033 63%,transparent 63%,transparent),url(../img/backgrounds/only-komona.jpg);--text-opacity: 1;color:#fff;color:rgba(255,255,255,var(--text-opacity));min-height:100vh}details,main{display:block}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-size:1em}a{background-color:transparent;color:inherit;text-decoration:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted}abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:solid}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{margin:0;padding:0}legend{color:inherit;display:table;max-width:100%;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto;resize:vertical}[type=checkbox],[type=radio],legend{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}ol,ul{list-style:none;margin:0;padding:0}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e2e8f0}hr{border-top-width:1px}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,input::-ms-input-placeholder,textarea:-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}.lang-dropdown li,.lang-dropdown span,[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}h1{font-size:1.5rem}h2{font-size:1.25rem}h3{font-size:1.125rem}.container,select{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}body>*{padding-left:1rem;padding-right:1rem}body.rtl{direction:rtl}select{-webkit-appearance:none;-moz-appearance:none;display:block;appearance:none;border-width:1px;--border-opacity: 1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity));border-radius:.25rem}.navbar,.navbar ul li.lang-dropdown ul{background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity));--bg-opacity: 1}.navbar{--bg-opacity: 0.75;width:100%;font-size:1rem;text-transform:uppercase}.navbar .navbrand,.navbar ul li.active{font-weight:700}.navbar ul li.navbrand *{border-style:none}.navbar ul li{padding:.25rem .5rem}.navbar ul li *,.navbar ul li.active *{border-style:solid;--border-opacity: 1;border-bottom-width:4px;text-decoration:none}.navbar ul li *{vertical-align:middle;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.navbar ul li.active *{border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.navbar ul li.lang-dropdown,.upload .upload-form .input-field{position:relative}.navbar ul li.lang-dropdown *{--border-opacity: 0}.lang-dropdown span{display:ruby}.navbar ul li.lang-dropdown ul{position:absolute;margin-top:.25rem;white-space:nowrap}.block-div,.files-buttons{margin-top:1rem;display:grid;grid-template-columns:repeat(1,minmax(0,1fr))}.block-div{--bg-opacity: 1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity));--bg-opacity: 0.75;padding:1rem;width:auto;margin-left:auto;margin-right:auto;max-width:60rem}.block-div a{--text-opacity: 1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.block-div a:visited{--text-opacity: 1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.block-div.myfiles hr{margin-bottom:.5rem}.block-div.myfiles{line-height:1.25}.files-buttons{margin-bottom:1rem;grid-gap:.5rem;gap:.5rem;text-align:center}@media (min-width:1024px){.files-buttons{margin-top:1rem;display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}}.files-buttons .btn{width:100%}.upload{margin-top:1rem;margin-bottom:1rem;display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-gap:.5rem;gap:.5rem}@media (min-width:1024px){.upload{margin-top:1rem;display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.upload{margin-top:1rem;display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}.upload #results{grid-column:span 2/span 2}}.upload .upload-form{border-radius:.375rem;padding:1rem}@media (min-width:768px){.upload .upload-form{line-height:1.625}}@media (min-width:1024px){.upload .upload-form{line-height:2}}.upload .upload-form select{line-height:1.5;--bg-opacity: 1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity));--bg-opacity: 0.75}.upload .upload-form input{padding-left:.5rem;line-height:1.625}.upload #results h1{font-size:1.25rem;text-align:center}.upload .upload-form [type=checkbox],svg{width:1rem;height:1rem}.upload #files{text-align:center;margin-top:1rem;padding:1rem;border-width:2px;--border-opacity: 1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity));border-style:dashed}.upload #results,.upload .upload-form,.upload .upload-form input{--bg-opacity: 1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity));--bg-opacity: 0.75}.upload #results{border-radius:.375rem;padding:1rem;margin-left:2.5rem;margin-right:2.5rem}.btn a{--text-opacity: 1 !important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;text-align:center!important;text-decoration:none!important}.btn,.btn:hover{--border-opacity: 1}.btn{background-color:transparent;font-weight:700;padding:.25rem .5rem;border-width:2px;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity));border-radius:.25rem;--text-opacity: 1 !important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;text-align:center!important;text-decoration:none!important}.btn:hover{--bg-opacity: 1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity));--bg-opacity: 0.75;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.btn.disabled{opacity:.5;cursor:not-allowed}svg{--text-opacity: 1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}svg.icon-hamburger{height:2rem;width:2rem}svg.icon-infos{--text-opacity: 1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity));display:inline-block}svg.icon-upload{margin-left:auto;margin-right:auto;border-radius:9999px;--border-opacity: 1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity));border-width:8px;height:8rem;width:8rem;--text-opacity: 1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.card{padding:1rem;margin-top:1rem}.card.mini{padding-left:.25rem;padding-right:0;padding-top:0;padding-bottom:0;margin-top:.25rem;margin-bottom:.25rem}.card.error,.card.info{--bg-opacity: 1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity));--text-opacity: 1;color:#c05621;color:rgba(192,86,33,var(--text-opacity));border-left-width:4px;--border-opacity: 1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.card.info{background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity));color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity));border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.hidden{display:none}.items-center{align-items:center}.mt-2{margin-top:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-y-0{top:0;bottom:0}.right-0{right:0}.text-left{text-align:left}.text-gray-700{--text-opacity: 1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.w-full{width:100%}@media (min-width:640px){.sm\:hidden{display:none}} \ No newline at end of file diff --git a/themes/default/public/img/backgrounds/episode2.jpg b/themes/default/public/img/backgrounds/episode2.jpg new file mode 100644 index 0000000..b6e336c Binary files /dev/null and b/themes/default/public/img/backgrounds/episode2.jpg differ diff --git a/themes/default/public/img/backgrounds/episode27.jpg b/themes/default/public/img/backgrounds/episode27.jpg new file mode 100644 index 0000000..1932f59 Binary files /dev/null and b/themes/default/public/img/backgrounds/episode27.jpg differ diff --git a/themes/default/public/img/backgrounds/komona-sunset.jpg b/themes/default/public/img/backgrounds/komona-sunset.jpg new file mode 100644 index 0000000..cb505a6 Binary files /dev/null and b/themes/default/public/img/backgrounds/komona-sunset.jpg differ diff --git a/themes/default/public/img/backgrounds/only-komona.jpg b/themes/default/public/img/backgrounds/only-komona.jpg new file mode 100644 index 0000000..2adc3c4 Binary files /dev/null and b/themes/default/public/img/backgrounds/only-komona.jpg differ diff --git a/themes/default/public/js/alpine.js b/themes/default/public/js/alpine.js new file mode 100644 index 0000000..14371a2 --- /dev/null +++ b/themes/default/public/js/alpine.js @@ -0,0 +1,1721 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Alpine = factory()); +}(this, (function () { 'use strict'; + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } + + return keys; + } + + function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; + } + + // Thanks @stimulus: + // https://github.com/stimulusjs/stimulus/blob/master/packages/%40stimulus/core/src/application.ts + function domReady() { + return new Promise(resolve => { + if (document.readyState == "loading") { + document.addEventListener("DOMContentLoaded", resolve); + } else { + resolve(); + } + }); + } + function arrayUnique(array) { + return Array.from(new Set(array)); + } + function isTesting() { + return navigator.userAgent.includes("Node.js") || navigator.userAgent.includes("jsdom"); + } + function kebabCase(subject) { + return subject.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/[_\s]/, '-').toLowerCase(); + } + function walk(el, callback) { + if (callback(el) === false) return; + let node = el.firstElementChild; + + while (node) { + walk(node, callback); + node = node.nextElementSibling; + } + } + function debounce(func, wait) { + var timeout; + return function () { + var context = this, + args = arguments; + + var later = function later() { + timeout = null; + func.apply(context, args); + }; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + function saferEval(expression, dataContext, additionalHelperVariables = {}) { + return new Function(['$data', ...Object.keys(additionalHelperVariables)], `var result; with($data) { result = ${expression} }; return result`)(dataContext, ...Object.values(additionalHelperVariables)); + } + function saferEvalNoReturn(expression, dataContext, additionalHelperVariables = {}) { + // For the cases when users pass only a function reference to the caller: `x-on:click="foo"` + // Where "foo" is a function. Also, we'll pass the function the event instance when we call it. + if (Object.keys(dataContext).includes(expression)) { + let methodReference = new Function(['dataContext', ...Object.keys(additionalHelperVariables)], `with(dataContext) { return ${expression} }`)(dataContext, ...Object.values(additionalHelperVariables)); + + if (typeof methodReference === 'function') { + return methodReference.call(dataContext, additionalHelperVariables['$event']); + } + } + + return new Function(['dataContext', ...Object.keys(additionalHelperVariables)], `with(dataContext) { ${expression} }`)(dataContext, ...Object.values(additionalHelperVariables)); + } + const xAttrRE = /^x-(on|bind|data|text|html|model|if|for|show|cloak|transition|ref)\b/; + function isXAttr(attr) { + const name = replaceAtAndColonWithStandardSyntax(attr.name); + return xAttrRE.test(name); + } + function getXAttrs(el, type) { + return Array.from(el.attributes).filter(isXAttr).map(attr => { + const name = replaceAtAndColonWithStandardSyntax(attr.name); + const typeMatch = name.match(xAttrRE); + const valueMatch = name.match(/:([a-zA-Z\-:]+)/); + const modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || []; + return { + type: typeMatch ? typeMatch[1] : null, + value: valueMatch ? valueMatch[1] : null, + modifiers: modifiers.map(i => i.replace('.', '')), + expression: attr.value + }; + }).filter(i => { + // If no type is passed in for filtering, bypass filter + if (!type) return true; + return i.type === type; + }); + } + function isBooleanAttr(attrName) { + // As per HTML spec table https://html.spec.whatwg.org/multipage/indices.html#attributes-3:boolean-attribute + // Array roughly ordered by estimated usage + const booleanAttributes = ['disabled', 'checked', 'required', 'readonly', 'hidden', 'open', 'selected', 'autofocus', 'itemscope', 'multiple', 'novalidate', 'allowfullscreen', 'allowpaymentrequest', 'formnovalidate', 'autoplay', 'controls', 'loop', 'muted', 'playsinline', 'default', 'ismap', 'reversed', 'async', 'defer', 'nomodule']; + return booleanAttributes.includes(attrName); + } + function replaceAtAndColonWithStandardSyntax(name) { + if (name.startsWith('@')) { + return name.replace('@', 'x-on:'); + } else if (name.startsWith(':')) { + return name.replace(':', 'x-bind:'); + } + + return name; + } + function transitionIn(el, show, forceSkip = false) { + // We don't want to transition on the initial page load. + if (forceSkip) return show(); + const attrs = getXAttrs(el, 'transition'); + const showAttr = getXAttrs(el, 'show')[0]; // If this is triggered by a x-show.transition. + + if (showAttr && showAttr.modifiers.includes('transition')) { + let modifiers = showAttr.modifiers; // If x-show.transition.out, we'll skip the "in" transition. + + if (modifiers.includes('out') && !modifiers.includes('in')) return show(); + const settingBothSidesOfTransition = modifiers.includes('in') && modifiers.includes('out'); // If x-show.transition.in...out... only use "in" related modifiers for this transition. + + modifiers = settingBothSidesOfTransition ? modifiers.filter((i, index) => index < modifiers.indexOf('out')) : modifiers; + transitionHelperIn(el, modifiers, show); // Otherwise, we can assume x-transition:enter. + } else if (attrs.length > 0) { + transitionClassesIn(el, attrs, show); + } else { + // If neither, just show that damn thing. + show(); + } + } + function transitionOut(el, hide, forceSkip = false) { + if (forceSkip) return hide(); + const attrs = getXAttrs(el, 'transition'); + const showAttr = getXAttrs(el, 'show')[0]; + + if (showAttr && showAttr.modifiers.includes('transition')) { + let modifiers = showAttr.modifiers; + if (modifiers.includes('in') && !modifiers.includes('out')) return hide(); + const settingBothSidesOfTransition = modifiers.includes('in') && modifiers.includes('out'); + modifiers = settingBothSidesOfTransition ? modifiers.filter((i, index) => index > modifiers.indexOf('out')) : modifiers; + transitionHelperOut(el, modifiers, settingBothSidesOfTransition, hide); + } else if (attrs.length > 0) { + transitionClassesOut(el, attrs, hide); + } else { + hide(); + } + } + function transitionHelperIn(el, modifiers, showCallback) { + // Default values inspired by: https://material.io/design/motion/speed.html#duration + const styleValues = { + duration: modifierValue(modifiers, 'duration', 150), + origin: modifierValue(modifiers, 'origin', 'center'), + first: { + opacity: 0, + scale: modifierValue(modifiers, 'scale', 95) + }, + second: { + opacity: 1, + scale: 100 + } + }; + transitionHelper(el, modifiers, showCallback, () => {}, styleValues); + } + function transitionHelperOut(el, modifiers, settingBothSidesOfTransition, hideCallback) { + // Make the "out" transition .5x slower than the "in". (Visually better) + // HOWEVER, if they explicitly set a duration for the "out" transition, + // use that. + const duration = settingBothSidesOfTransition ? modifierValue(modifiers, 'duration', 150) : modifierValue(modifiers, 'duration', 150) / 2; + const styleValues = { + duration: duration, + origin: modifierValue(modifiers, 'origin', 'center'), + first: { + opacity: 1, + scale: 100 + }, + second: { + opacity: 0, + scale: modifierValue(modifiers, 'scale', 95) + } + }; + transitionHelper(el, modifiers, () => {}, hideCallback, styleValues); + } + + function modifierValue(modifiers, key, fallback) { + // If the modifier isn't present, use the default. + if (modifiers.indexOf(key) === -1) return fallback; // If it IS present, grab the value after it: x-show.transition.duration.500ms + + const rawValue = modifiers[modifiers.indexOf(key) + 1]; + if (!rawValue) return fallback; + + if (key === 'scale') { + // Check if the very next value is NOT a number and return the fallback. + // If x-show.transition.scale, we'll use the default scale value. + // That is how a user opts out of the opacity transition. + if (!isNumeric(rawValue)) return fallback; + } + + if (key === 'duration') { + // Support x-show.transition.duration.500ms && duration.500 + let match = rawValue.match(/([0-9]+)ms/); + if (match) return match[1]; + } + + if (key === 'origin') { + // Support chaining origin directions: x-show.transition.top.right + if (['top', 'right', 'left', 'center', 'bottom'].includes(modifiers[modifiers.indexOf(key) + 2])) { + return [rawValue, modifiers[modifiers.indexOf(key) + 2]].join(' '); + } + } + + return rawValue; + } + + function transitionHelper(el, modifiers, hook1, hook2, styleValues) { + // If the user set these style values, we'll put them back when we're done with them. + const opacityCache = el.style.opacity; + const transformCache = el.style.transform; + const transformOriginCache = el.style.transformOrigin; // If no modifiers are present: x-show.transition, we'll default to both opacity and scale. + + const noModifiers = !modifiers.includes('opacity') && !modifiers.includes('scale'); + const transitionOpacity = noModifiers || modifiers.includes('opacity'); + const transitionScale = noModifiers || modifiers.includes('scale'); // These are the explicit stages of a transition (same stages for in and for out). + // This way you can get a birds eye view of the hooks, and the differences + // between them. + + const stages = { + start() { + if (transitionOpacity) el.style.opacity = styleValues.first.opacity; + if (transitionScale) el.style.transform = `scale(${styleValues.first.scale / 100})`; + }, + + during() { + if (transitionScale) el.style.transformOrigin = styleValues.origin; + el.style.transitionProperty = [transitionOpacity ? `opacity` : ``, transitionScale ? `transform` : ``].join(' ').trim(); + el.style.transitionDuration = `${styleValues.duration / 1000}s`; + el.style.transitionTimingFunction = `cubic-bezier(0.4, 0.0, 0.2, 1)`; + }, + + show() { + hook1(); + }, + + end() { + if (transitionOpacity) el.style.opacity = styleValues.second.opacity; + if (transitionScale) el.style.transform = `scale(${styleValues.second.scale / 100})`; + }, + + hide() { + hook2(); + }, + + cleanup() { + if (transitionOpacity) el.style.opacity = opacityCache; + if (transitionScale) el.style.transform = transformCache; + if (transitionScale) el.style.transformOrigin = transformOriginCache; + el.style.transitionProperty = null; + el.style.transitionDuration = null; + el.style.transitionTimingFunction = null; + } + + }; + transition(el, stages); + } + function transitionClassesIn(el, directives, showCallback) { + const enter = (directives.find(i => i.value === 'enter') || { + expression: '' + }).expression.split(' ').filter(i => i !== ''); + const enterStart = (directives.find(i => i.value === 'enter-start') || { + expression: '' + }).expression.split(' ').filter(i => i !== ''); + const enterEnd = (directives.find(i => i.value === 'enter-end') || { + expression: '' + }).expression.split(' ').filter(i => i !== ''); + transitionClasses(el, enter, enterStart, enterEnd, showCallback, () => {}); + } + function transitionClassesOut(el, directives, hideCallback) { + const leave = (directives.find(i => i.value === 'leave') || { + expression: '' + }).expression.split(' ').filter(i => i !== ''); + const leaveStart = (directives.find(i => i.value === 'leave-start') || { + expression: '' + }).expression.split(' ').filter(i => i !== ''); + const leaveEnd = (directives.find(i => i.value === 'leave-end') || { + expression: '' + }).expression.split(' ').filter(i => i !== ''); + transitionClasses(el, leave, leaveStart, leaveEnd, () => {}, hideCallback); + } + function transitionClasses(el, classesDuring, classesStart, classesEnd, hook1, hook2) { + const originalClasses = el.__x_original_classes || []; + const stages = { + start() { + el.classList.add(...classesStart); + }, + + during() { + el.classList.add(...classesDuring); + }, + + show() { + hook1(); + }, + + end() { + // Don't remove classes that were in the original class attribute. + el.classList.remove(...classesStart.filter(i => !originalClasses.includes(i))); + el.classList.add(...classesEnd); + }, + + hide() { + hook2(); + }, + + cleanup() { + el.classList.remove(...classesDuring.filter(i => !originalClasses.includes(i))); + el.classList.remove(...classesEnd.filter(i => !originalClasses.includes(i))); + } + + }; + transition(el, stages); + } + function transition(el, stages) { + stages.start(); + stages.during(); + requestAnimationFrame(() => { + // Note: Safari's transitionDuration property will list out comma separated transition durations + // for every single transition property. Let's grab the first one and call it a day. + let duration = Number(getComputedStyle(el).transitionDuration.replace(/,.*/, '').replace('s', '')) * 1000; + stages.show(); + requestAnimationFrame(() => { + stages.end(); + setTimeout(() => { + stages.hide(); // Adding an "isConnected" check, in case the callback + // removed the element from the DOM. + + if (el.isConnected) { + stages.cleanup(); + } + }, duration); + }); + }); + } + function isNumeric(subject) { + return !isNaN(subject); + } + + function handleForDirective(component, templateEl, expression, initialUpdate, extraVars) { + warnIfNotTemplateTag(templateEl); + let iteratorNames = parseForExpression(expression); + let items = evaluateItemsAndReturnEmptyIfXIfIsPresentAndFalseOnElement(component, templateEl, iteratorNames, extraVars); // As we walk the array, we'll also walk the DOM (updating/creating as we go). + + let currentEl = templateEl; + items.forEach((item, index) => { + let iterationScopeVariables = getIterationScopeVariables(iteratorNames, item, index, items, extraVars()); + let currentKey = generateKeyForIteration(component, templateEl, index, iterationScopeVariables); + let nextEl = currentEl.nextElementSibling; // If there's no previously x-for processed element ahead, add one. + + if (!nextEl || nextEl.__x_for_key === undefined) { + nextEl = addElementInLoopAfterCurrentEl(templateEl, currentEl); // And transition it in if it's not the first page load. + + transitionIn(nextEl, () => {}, initialUpdate); + nextEl.__x_for = iterationScopeVariables; + component.initializeElements(nextEl, () => nextEl.__x_for); + } else { + nextEl = lookAheadForMatchingKeyedElementAndMoveItIfFound(nextEl, currentKey); // If we haven't found a matching key, just insert the element at the current position + + if (!nextEl) { + nextEl = addElementInLoopAfterCurrentEl(templateEl, currentEl); + } // Temporarily remove the key indicator to allow the normal "updateElements" to work + + + delete nextEl.__x_for_key; + nextEl.__x_for = iterationScopeVariables; + component.updateElements(nextEl, () => nextEl.__x_for); + } + + currentEl = nextEl; + currentEl.__x_for_key = currentKey; + }); + removeAnyLeftOverElementsFromPreviousUpdate(currentEl); + } // This was taken from VueJS 2.* core. Thanks Vue! + + function parseForExpression(expression) { + let forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/; + let stripParensRE = /^\(|\)$/g; + let forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/; + let inMatch = expression.match(forAliasRE); + if (!inMatch) return; + let res = {}; + res.items = inMatch[2].trim(); + let item = inMatch[1].trim().replace(stripParensRE, ''); + let iteratorMatch = item.match(forIteratorRE); + + if (iteratorMatch) { + res.item = item.replace(forIteratorRE, '').trim(); + res.index = iteratorMatch[1].trim(); + + if (iteratorMatch[2]) { + res.collection = iteratorMatch[2].trim(); + } + } else { + res.item = item; + } + + return res; + } + + function getIterationScopeVariables(iteratorNames, item, index, items, extraVars) { + // We must create a new object, so each iteration has a new scope + let scopeVariables = extraVars ? _objectSpread2({}, extraVars) : {}; + scopeVariables[iteratorNames.item] = item; + if (iteratorNames.index) scopeVariables[iteratorNames.index] = index; + if (iteratorNames.collection) scopeVariables[iteratorNames.collection] = items; + return scopeVariables; + } + + function generateKeyForIteration(component, el, index, iterationScopeVariables) { + let bindKeyAttribute = getXAttrs(el, 'bind').filter(attr => attr.value === 'key')[0]; // If the dev hasn't specified a key, just return the index of the iteration. + + if (!bindKeyAttribute) return index; + return component.evaluateReturnExpression(el, bindKeyAttribute.expression, () => iterationScopeVariables); + } + + function warnIfNotTemplateTag(el) { + if (el.tagName.toLowerCase() !== 'template') console.warn('Alpine: [x-for] directive should only be added to