diff --git a/css/mastodon-timeline-3.12.0-2.css b/css/mastodon-timeline-3.12.0-2.css
new file mode 100644
index 0000000..425bb7c
--- /dev/null
+++ b/css/mastodon-timeline-3.12.0-2.css
@@ -0,0 +1,416 @@
+/* Mastodon embed feed timeline v3.12.0-1 */
+/* More info at: */
+/* https://gitlab.com/clvgt12/mastodon-embed-feed-timeline */
+
+/* Variables */
+:root {
+ --text-max-lines: none;
+}
+
+/* Theme colors */
+:root,
+html[data-theme="light"] {
+ --bg-color: #fff;
+ --bg-hover-color: #d9e1e8;
+ --line-gray-color: #c0cdd9;
+ --content-text: #000;
+ --link-color: #3a3bff;
+ --contrast-gray-color: #606984;
+ --error-text-color: #8b0000;
+}
+html[data-theme="dark"] {
+ --bg-color: #fff;
+ --bg-hover-color: #d9e1e8;
+ --line-gray-color: #c0cdd9;
+ --content-text: #000;
+ --link-color: #3a3bff;
+ --contrast-gray-color: #606984;
+ --error-text-color: #8b0000;
+}
+
+/* Main container */
+.mt-container {
+ height: 100%;
+ overflow-y: auto;
+ position: relative;
+ background-color: var(--bg-color);
+ scrollbar-color: var(--line-gray-color) var(--bg-color);
+ scrollbar-width: thin;
+}
+.mt-container::-webkit-scrollbar {
+ width: 0.25rem;
+ height: 0.25rem;
+}
+.mt-container::-webkit-scrollbar-thumb {
+ background-color: var(--line-gray-color);
+ border: none;
+ border-radius: 3rem;
+}
+.mt-container::-webkit-scrollbar-thumb:hover,
+.mt-container::-webkit-scrollbar-thumb:active {
+ background-color: var(--line-gray-color);
+}
+.mt-container::-webkit-scrollbar-track {
+ background-color: var(--bg-color);
+ border: none;
+ border-radius: 0;
+}
+.mt-container::-webkit-scrollbar-track:hover,
+.mt-container::-webkit-scrollbar-track:active,
+.mt-container::-webkit-scrollbar-corner {
+ background-color: var(--bg-color);
+}
+.mt-container a:link,
+.mt-container a:active,
+.mt-container a {
+ text-decoration: none;
+ color: var(--link-color);
+}
+.mt-container a:not(.mt-toot-preview):hover {
+ text-decoration: underline;
+}
+.mt-body {
+ padding: 1rem clamp(0.25rem, 4vw, 1.5rem);
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ background-color: var(--bg-color);
+}
+.mt-body .invisible {
+ font-size: 0;
+ line-height: 0;
+ display: inline-block;
+ width: 0;
+ height: 0;
+ position: absolute;
+}
+.mt-body a {
+ color: var(--link-color);
+ text-decoration: none;
+}
+.mt-body a:hover {
+color: var(--link-color);
+text-decoration: underline;
+}
+
+/* Toot container */
+.mt-toot {
+ margin: 0.25rem;
+ padding: 1rem 0.5rem;
+ position: relative;
+ min-height: 3.75rem;
+ border-bottom: 1px solid var(--line-gray-color);
+ font-family: sans-serif;
+}
+.mt-toot:hover,
+.mt-toot:focus {
+ cursor: pointer;
+ background-color: var(--bg-hover-color);
+}
+.mt-toot p:last-child {
+ margin-bottom: 0;
+}
+
+/* User avatar */
+.mt-toot-avatar {
+ margin-right: 0.75rem;
+}
+.mt-toot-avatar-standard {
+ width: 2.25rem;
+ height: 2.25rem;
+}
+.mt-toot-avatar-boosted {
+ width: 3rem;
+ height: 3rem;
+ position: relative;
+}
+.mt-toot-avatar-image-big img {
+ aspect-ratio: 1/1;
+ width: 2.25rem;
+ height: 2.25rem;
+ border-radius: 0.25rem;
+ overflow: hidden;
+}
+.mt-toot-avatar-image-small img {
+ aspect-ratio: 1/1;
+ width: 1.5rem;
+ height: 1.5rem;
+ top: 1.5rem;
+ left: 1.5rem;
+ position: absolute;
+ border-radius: 0.25rem;
+ overflow: hidden;
+}
+
+/* User name and date */
+.mt-toot-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+.mt-toot-header-user {
+ font-weight: 600;
+ padding-right: 1rem;
+}
+.mt-toot-header-user > a {
+ display: flex;
+ align-items: flex-start;
+ color: var(--content-text) !important;
+ overflow-wrap: anywhere;
+ text-decoration: none;
+}
+.mt-toot-header-date {
+ font-size: 0.75rem;
+ text-align: right;
+ margin: 0 0 0 auto;
+}
+.mt-toot-header-date > a {
+ color: var(--contrast-gray-color) !important;
+ text-decoration: none;
+}
+
+/* Text */
+.mt-toot-text {
+ margin-bottom: 1rem;
+ color: var(--content-text);
+}
+.mt-toot-text .spoiler-btn {
+ display: inline-block;
+}
+.mt-toot-text .spoiler-text-hidden {
+ display: none;
+}
+.mt-toot-text.truncate {
+ display: -webkit-box;
+ overflow: hidden;
+ -webkit-line-clamp: var(--text-max-lines);
+ -webkit-box-orient: vertical;
+}
+.mt-toot-text:not(.truncate) .ellipsis::after {
+ content: "...";
+}
+.mt-toot-text blockquote {
+ border-left: 0.25rem solid var(--line-gray-color);
+ margin-left: 0;
+ padding-left: 0.5rem;
+}
+.mt-toot-header-user .custom-emoji,
+.mt-toot-text .custom-emoji {
+ height: 1.5rem;
+ min-width: 1.5rem;
+ margin-bottom: -0.25rem;
+ width: auto;
+}
+
+/* Poll */
+.mt-toot-poll {
+ margin-bottom: 1rem;
+ color: var(--content-text);
+}
+.mt-toot-poll ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+.mt-toot-poll ul li {
+ font-size: 0.9rem;
+ margin-bottom: 0.5rem;
+}
+.mt-toot-poll.mt-toot-poll-expired ul li {
+ color: var(--contrast-gray-color);
+}
+.mt-toot-poll ul li:not(:last-child) {
+ margin-bottom: 0.25rem;
+}
+.mt-toot-poll ul li:before {
+ content: "◯";
+ padding-right: 0.5rem;
+}
+.mt-toot-poll.mt-toot-poll-expired ul li:before {
+ content: "";
+ padding-right: 0;
+}
+
+/* Medias */
+.mt-toot-media {
+ overflow: hidden;
+ margin-bottom: 1rem;
+ border-radius: 0.75rem;
+}
+.mt-toot-media > .spoiler-btn {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 1;
+ transform: translate(-50%, -50%);
+}
+.mt-toot-media-spoiler > img {
+ filter: blur(2rem);
+}
+.img-ratio14_7 {
+ position: relative;
+ padding-top: 56.95%;
+ width: 100%;
+}
+.img-ratio14_7 > img {
+ width: 100%;
+ height: auto;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center;
+ color: var(--content-text);
+}
+
+/* Preview link */
+.mt-toot-preview {
+ min-height: 4rem;
+ display: flex;
+ flex-direction: column;
+ border: 1px solid var(--line-gray-color);
+ border-radius: 0.75rem;
+ color: var(--link-color);
+ font-size: 0.8rem;
+ margin: 1rem 0;
+ overflow: hidden;
+}
+.mt-toot-preview-image {
+ width: 100%;
+ align-self: stretch;
+}
+.mt-toot-preview-image img {
+ display: block;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ color: var(--content-text);
+}
+.mt-toot-preview-noImage {
+ width: 40%;
+ font-size: 1.5rem;
+ align-self: inherit;
+ text-align: left;
+}
+.mt-toot-preview-content {
+ width: 95%;
+ display: flex;
+ align-self: center;
+ flex-direction: column;
+ padding: 0.5rem 1rem;
+ gap: 0.5rem;
+}
+.mt-toot-preview-title {
+ font-weight: 600;
+ font-size: 1.0rem;
+ font-family: serif;
+}
+
+/* Spoiler button */
+.spoiler-btn {
+ border-radius: 2px;
+ background-color: var(--line-gray-color);
+ border: 0;
+ color: var(--content-text);
+ font-weight: 700;
+ font-size: 0.7rem;
+ padding: 0 0.35rem;
+ text-transform: uppercase;
+ line-height: 1.25rem;
+ cursor: pointer;
+ vertical-align: top;
+}
+
+/* Counter bar */
+.mt-toot-counter-bar {
+ display: flex;
+ min-width: 6rem;
+ max-width: 40rem;
+ justify-content: space-between;
+ color: var(--contrast-gray-color);
+ max-height: 1.0rem;
+}
+.mt-toot-counter-bar-replies,
+.mt-toot-counter-bar-reblog,
+.mt-toot-counter-bar-favorites {
+ display: flex;
+ font-size: 0.75rem;
+ gap: 0.25rem;
+ align-items: center;
+ opacity: 0.5;
+}
+.mt-toot-counter-bar-replies > svg,
+.mt-toot-counter-bar-reblog > svg,
+.mt-toot-counter-bar-favorites > svg {
+ width: 1rem;
+ fill: var(--contrast-gray-color);
+}
+
+/* Error */
+.mt-error {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ color: var(--error-text-color);
+ padding: 0.75rem;
+ text-align: center;
+}
+.mt-error-icon {
+ font-size: 2rem;
+}
+.mt-error-message {
+ padding: 1rem 0;
+}
+.mt-error-message hr {
+ color: var(--line-gray-color);
+}
+
+/* Loading spinner */
+.mt-body > .loading-spinner {
+ position: absolute;
+ width: 3rem;
+ height: 3rem;
+ margin: auto;
+ top: calc(50% - 1.5rem);
+ right: calc(50% - 1.5rem);
+}
+.loading-spinner {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128'%3E%3Cg%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 64 64' to='360 64 64' dur='1000ms' repeatCount='indefinite'/%3E%3Cpath d='M64 6.69a57.3 57.3 0 1 1 0 114.61A57.3 57.3 0 0 1 6.69 64' fill='none' stroke='%23404040' stroke-width='12'/%3E%3C/g%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-color: transparent;
+ background-size: min(2.5rem, calc(100% - 0.5rem));
+}
+
+/* Footer (See more link) */
+.mt-footer {
+ margin: unset;
+ padding: unset;
+ text-align: center;
+ font-family: sans-serif;
+ font-size: 0.8rem;
+ height: 3.0rem;
+ background-color: var(--bg-color);
+}
+.mt-footer a {
+ color: var(--link-color);
+ text-decoration: none;
+}
+.mt-footer a:hover {
+ color: var(--link-color);
+ text-decoration: underline;
+}
+
+/* Hidden elements */
+.visually-hidden {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
\ No newline at end of file
diff --git a/js/mastodon-timeline-3.12.0-2.js b/js/mastodon-timeline-3.12.0-2.js
new file mode 100644
index 0000000..3c5db40
--- /dev/null
+++ b/js/mastodon-timeline-3.12.0-2.js
@@ -0,0 +1,890 @@
+/**
+ * Mastodon embed feed timeline v3.12.0-1
+ * More info at:
+ * https://gitlab.com/idotj/mastodon-embed-feed-timeline
+ */
+/**
+ * This file contains modifications to the above upstream project.
+ * The file repository for these modifications can be found here:
+ * https://gitlab.com/clvgt12/mastodon-embed-feed-timeline
+ *
+ * Mastodon embed feed timeline
+ * Copyright (C) 2022 clvgt12
+ * Copyright (C) 2021 i.j
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
>", + "
", + "" + ); + } + + return content; +}; + +/** + * Add target="_blank" to all #hashtags and @mentions in the toot + * @param {string} c Text content + * @returns {string} Text content modified + */ +MastodonApi.prototype.addTarget2hashtagMention = function (c) { + let content = c.replaceAll('rel="tag"', 'rel="tag" target="_blank"'); + content = content.replaceAll( + 'class="u-url mention"', + 'class="u-url mention" target="_blank"' + ); + + return content; +}; + +/** + * Find all custom emojis shortcode and replace by image + * @param {string} c Text content + * @param {array} e List with all custom emojis + * @returns {string} Text content modified + */ +MastodonApi.prototype.showEmojos = function (c, e) { + if (c.includes(":")) { + for (const emojo of e) { + const regex = new RegExp(`\\:${emojo.shortcode}\\:`, "g"); + c = c.replace( + regex, + `` + ); + } + + return c; + } else { + return c; + } +}; + +/** + * Find all start/end", + "