685 lines
23 KiB
HTML
685 lines
23 KiB
HTML
{% load static %}
|
|
{% load cache %}
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="en-GB">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>GIA - {{ request.path_info }}</title>
|
|
<link rel="shortcut icon" href="{% static 'favicon.ico' %}">
|
|
<link rel="manifest" href="{% static 'manifest.webmanifest' %}">
|
|
<link rel="stylesheet" href="{% static 'css/bulma.min.css' %}">
|
|
<link rel="stylesheet" href="{% static 'css/bulma-tooltip.min.css' %}">
|
|
<link rel="stylesheet" href="https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css">
|
|
<link rel="stylesheet" href="{% static 'css/bulma-slider.min.css' %}">
|
|
<link rel="stylesheet" href="{% static 'css/bulma-calendar.min.css' %}">
|
|
<link rel="stylesheet" href="{% static 'css/bulma-tagsinput.min.css' %}">
|
|
<link rel="stylesheet" href="{% static 'css/bulma-switch.min.css' %}">
|
|
<link rel="stylesheet" href="{% static 'css/gridstack.min.css' %}">
|
|
<script src="{% static 'js/bulma-calendar.min.js' %}" integrity="sha384-DThNif0xGXbopX7+PE+UabkuClfI/zELNhaVqoGLutaWB76dyMw0vIQBGmUxSfVQ" crossorigin="anonymous"></script>
|
|
<script src="{% static 'js/bulma-slider.min.js' %}" integrity="sha384-wbyps8iLG8QzJE02viYc/27BtT5HSa11+b5V7QPR1/huVuA8f4LRTNGc82qAIeIZ" crossorigin="anonymous"></script>
|
|
<script src="{% static 'js/htmx.min.js' %}" integrity="sha384-cZuAZ+ZbwkNRnrKi05G/fjBX+azI9DNOkNYysZ0I/X5ZFgsmMiBXgDZof30F5ofc" crossorigin="anonymous"></script>
|
|
<script defer src="{% static 'js/remove-me.js' %}" integrity="sha384-6fHcFNoQ8QEI3ZDgw9Z/A6Brk64gF7AnFbLgdrumo8/kBbsKQ/wo7wPegj5WkzuG" crossorigin="anonymous"></script>
|
|
<script defer src="{% static 'js/hyperscript.min.js' %}" integrity="sha384-6GYN8BDHOJkkru6zcpGOUa//1mn+5iZ/MyT6mq34WFIpuOeLF52kSi721q0SsYF9" crossorigin="anonymous"></script>
|
|
<script src="{% static 'js/bulma-tagsinput.min.js' %}"></script>
|
|
<script src="{% static 'js/jquery.min.js' %}"></script>
|
|
<script src="{% static 'js/gridstack-all.js' %}"></script>
|
|
<script defer src="{% static 'js/magnet.min.js' %}"></script>
|
|
<script>
|
|
document.addEventListener("restore-scroll", function(event) {
|
|
var scrollpos = localStorage.getItem('scrollpos');
|
|
if (scrollpos) {
|
|
window.scrollTo(0, scrollpos)
|
|
};
|
|
});
|
|
|
|
document.addEventListener("htmx:beforeSwap", function(event) {
|
|
localStorage.setItem('scrollpos', window.scrollY);
|
|
|
|
});
|
|
</script>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
|
|
// Get all "navbar-burger" elements
|
|
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
|
|
|
|
// Add a click event on each of them
|
|
$navbarBurgers.forEach( el => {
|
|
el.addEventListener('click', () => {
|
|
|
|
// Get the target from the "data-target" attribute
|
|
const target = el.dataset.target;
|
|
const $target = document.getElementById(target);
|
|
|
|
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
|
|
el.classList.toggle('is-active');
|
|
$target.classList.toggle('is-active');
|
|
|
|
});
|
|
});
|
|
|
|
const composeLink = document.getElementById('nav-compose-link');
|
|
const composeDropdown = document.getElementById('nav-compose-contacts');
|
|
let composePreviewLoaded = false;
|
|
let composePreviewLoading = false;
|
|
if (composeLink && composeDropdown) {
|
|
composeLink.addEventListener('mouseenter', () => {
|
|
const previewUrl = composeLink.dataset.previewUrl || '';
|
|
if (!previewUrl || composePreviewLoaded || composePreviewLoading) {
|
|
return;
|
|
}
|
|
composePreviewLoading = true;
|
|
fetch(previewUrl, {
|
|
method: 'GET',
|
|
credentials: 'same-origin',
|
|
headers: { 'HX-Request': 'true' },
|
|
})
|
|
.then((response) => {
|
|
if (!response.ok) {
|
|
throw new Error('Failed contacts preview fetch.');
|
|
}
|
|
return response.text();
|
|
})
|
|
.then((html) => {
|
|
composeDropdown.innerHTML = html;
|
|
composePreviewLoaded = true;
|
|
})
|
|
.catch(() => {
|
|
composePreviewLoaded = false;
|
|
})
|
|
.finally(() => {
|
|
composePreviewLoading = false;
|
|
});
|
|
});
|
|
}
|
|
|
|
});
|
|
</script>
|
|
<style>
|
|
.icon { border-bottom: 0px !important;}
|
|
.wrap {
|
|
word-wrap: break-word;
|
|
}
|
|
.nowrap-parent {
|
|
white-space: nowrap;
|
|
}
|
|
.nowrap-child {
|
|
display: inline-block;
|
|
}
|
|
.htmx-indicator{
|
|
opacity:0;
|
|
transition: opacity 500ms ease-in;
|
|
}
|
|
.htmx-request .htmx-indicator{
|
|
opacity:1
|
|
}
|
|
.htmx-request.htmx-indicator{
|
|
opacity:1
|
|
}
|
|
|
|
.tooltiptext {
|
|
visibility: hidden;
|
|
background-color: black;
|
|
color: #fff;
|
|
text-align: center;
|
|
padding: 5px 0;
|
|
border-radius: 6px;
|
|
position: absolute;
|
|
z-index: 1;
|
|
}
|
|
|
|
.rounded-tooltip:hover .tooltiptext {
|
|
visibility: visible;
|
|
}
|
|
|
|
.table {
|
|
background: transparent !important;
|
|
}
|
|
|
|
tr {
|
|
transition: all 0.2s ease-in-out;
|
|
}
|
|
|
|
tr:hover {
|
|
cursor:pointer;
|
|
background-color:rgba(221, 224, 255, 0.3) !important;
|
|
}
|
|
|
|
a.panel-block {
|
|
transition: all 0.2s ease-in-out;
|
|
}
|
|
|
|
a.panel-block:hover {
|
|
cursor:pointer;
|
|
background-color:rgba(221, 224, 255, 0.3) !important;
|
|
}
|
|
@media (prefers-color-scheme: dark) {
|
|
:root {
|
|
--background-color: rgba(84, 84, 84, 0.9) !important;
|
|
--modal-color: rgba(81, 81, 81, 0.9) !important;
|
|
}
|
|
}
|
|
|
|
:root {
|
|
--background-color-light: rgba(210, 210, 210, 0.9) !important;
|
|
--background-color-dark: rgba(84, 84, 84, 0.9) !important;
|
|
--background-color-modal-light: rgba(250, 250, 250, 0.5) !important;
|
|
--background-color-modal-dark: rgba(210, 210, 210, 0.9) !important;
|
|
}
|
|
|
|
[data-theme="light"] {
|
|
--background-color: var(--background-color-light);
|
|
--modal-color: var(--background-color-modal-light);
|
|
}
|
|
|
|
[data-theme="dark"] {
|
|
--background-color: var(--background-color-dark);
|
|
--modal-color: var(--background-color-modal-dark);
|
|
}
|
|
|
|
.panel, .box, .modal {
|
|
/* background-color:rgba(250, 250, 250, 0.5) !important; */
|
|
background-color: var(--modal-color) !important;
|
|
}
|
|
.modal, .modal.box{
|
|
/* background-color:rgba(210, 210, 210, 0.9) !important; */
|
|
background-color: var(--background-color) !important;
|
|
}
|
|
.modal-background{
|
|
background-color:rgba(255, 255, 255, 0.3) !important;
|
|
}
|
|
#modals-here .modal-background {
|
|
background-color: rgba(0, 0, 0, 0.34) !important;
|
|
}
|
|
#modals-here .modal-content > .box {
|
|
background-color: rgba(255, 255, 255, 0.97) !important;
|
|
color: inherit;
|
|
}
|
|
#modals-here .modal-content .input,
|
|
#modals-here .modal-content .textarea,
|
|
#modals-here .modal-content .select select {
|
|
background-color: rgba(255, 255, 255, 0.98) !important;
|
|
}
|
|
[data-theme="dark"] #modals-here .modal-content > .box {
|
|
background-color: rgba(45, 45, 45, 0.97) !important;
|
|
}
|
|
[data-theme="dark"] #modals-here .modal-content .input,
|
|
[data-theme="dark"] #modals-here .modal-content .textarea,
|
|
[data-theme="dark"] #modals-here .modal-content .select select {
|
|
background-color: rgba(33, 33, 33, 0.98) !important;
|
|
}
|
|
|
|
.has-background-grey-lighter{
|
|
background-color:rgba(219, 219, 219, 0.5) !important;
|
|
}
|
|
.navbar {
|
|
background-color:rgba(0, 0, 0, 0.03) !important;
|
|
}
|
|
|
|
.grid-stack-item-content {
|
|
display: flex !important;
|
|
flex-direction: column !important;
|
|
overflow-x: hidden !important;
|
|
overflow-y: hidden !important;
|
|
}
|
|
|
|
.panel {
|
|
display: flex !important;
|
|
flex-direction: column !important;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.panel-block {
|
|
overflow-y:auto;
|
|
overflow-x:auto;
|
|
min-height: 90%;
|
|
display: block;
|
|
}
|
|
|
|
.floating-window {
|
|
/* background-color:rgba(210, 210, 210, 0.6) !important; */
|
|
display: flex !important;
|
|
flex-direction: column !important;
|
|
overflow-x: hidden !important;
|
|
overflow-y: hidden !important;
|
|
max-height: 300px;
|
|
z-index: 9000;
|
|
position: absolute;
|
|
top: 50px;
|
|
left: 50px;
|
|
}
|
|
|
|
.floating-window .panel {
|
|
background-color:rgba(250, 250, 250, 0.8) !important;
|
|
}
|
|
|
|
.float-right {
|
|
float: right;
|
|
padding-right: 5px;
|
|
padding-left: 5px;
|
|
}
|
|
.grid-stack-item:hover .ui-resizable-handle {
|
|
display: block !important;
|
|
}
|
|
.ui-resizable-handle {
|
|
z-index: 39 !important;
|
|
}
|
|
|
|
.osint-table-shell {
|
|
border: 1px solid rgba(127, 127, 127, 0.2);
|
|
border-radius: 14px;
|
|
padding: 0.9rem;
|
|
background: rgba(255, 255, 255, 0.45);
|
|
}
|
|
|
|
.osint-table-toolbar {
|
|
margin-bottom: 0.75rem;
|
|
}
|
|
|
|
.osint-results-table-wrap {
|
|
border-radius: 10px;
|
|
overflow: auto;
|
|
}
|
|
|
|
.osint-results-table th {
|
|
font-size: 0.8rem;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
}
|
|
|
|
.osint-sort-link {
|
|
color: inherit;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 0.25rem;
|
|
}
|
|
|
|
.osint-sort-link:hover {
|
|
color: #3273dc;
|
|
}
|
|
|
|
.osint-search-form .button.is-fullwidth {
|
|
width: 100%;
|
|
}
|
|
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<nav class="navbar" role="navigation" aria-label="main navigation">
|
|
<div class="navbar-brand">
|
|
<a class="navbar-item" href="{% url 'home' %}">
|
|
<img src="{% static 'logo.svg' %}" width="112" height="28" alt="logo">
|
|
</a>
|
|
|
|
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="bar">
|
|
<span aria-hidden="true"></span>
|
|
<span aria-hidden="true"></span>
|
|
<span aria-hidden="true"></span>
|
|
</a>
|
|
</div>
|
|
|
|
<div id="bar" class="navbar-menu">
|
|
<div class="navbar-start">
|
|
<a class="navbar-item" href="{% url 'home' %}">
|
|
Home
|
|
</a>
|
|
{% if user.is_authenticated %}
|
|
<div class="navbar-item has-dropdown is-hoverable">
|
|
<a
|
|
id="nav-compose-link"
|
|
class="navbar-link"
|
|
data-preview-url="{% url 'compose_contacts_dropdown' %}"
|
|
data-full-url="{% url 'compose_contacts_dropdown' %}?all=1"
|
|
hx-get="{% url 'compose_contacts_dropdown' %}?all=1"
|
|
hx-target="#nav-compose-contacts"
|
|
hx-trigger="click"
|
|
hx-swap="innerHTML">
|
|
<span class="icon is-small"><i class="fa-solid fa-paper-plane"></i></span>
|
|
<span style="margin-left: 0.35rem;">Message</span>
|
|
</a>
|
|
<div class="navbar-dropdown" id="nav-compose-contacts">
|
|
<a
|
|
class="navbar-item"
|
|
hx-get="{% url 'compose_contacts_dropdown' %}?all=1"
|
|
hx-target="#nav-compose-contacts"
|
|
hx-swap="innerHTML">
|
|
Fetch Contacts
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<a class="navbar-item" href="{% url 'ai_workspace' %}">
|
|
AI
|
|
</a>
|
|
<a class="navbar-item" href="{% url 'osint_search' type='page' %}">
|
|
Search
|
|
</a>
|
|
<a class="navbar-item" href="{% url 'queues' type='page' %}">
|
|
Queue
|
|
</a>
|
|
|
|
<a class="navbar-item" href="{% url 'osint_workspace' %}">
|
|
OSINT
|
|
</a>
|
|
{% endif %}
|
|
<a class="navbar-item add-button">
|
|
Install
|
|
</a>
|
|
</div>
|
|
|
|
<div class="navbar-end">
|
|
{% if user.is_authenticated %}
|
|
<div class="navbar-item has-dropdown is-hoverable">
|
|
<a class="navbar-link">
|
|
Services
|
|
</a>
|
|
|
|
<div class="navbar-dropdown">
|
|
<a class="navbar-item" href="{% url 'signal' %}">
|
|
Signal
|
|
</a>
|
|
<a class="navbar-item" href="{% url 'whatsapp' %}">
|
|
WhatsApp
|
|
</a>
|
|
<a class="navbar-item" href="{% url 'instagram' %}">
|
|
Instagram
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="navbar-item has-dropdown is-hoverable">
|
|
<a class="navbar-link">
|
|
Storage
|
|
</a>
|
|
|
|
<div class="navbar-dropdown">
|
|
<a class="navbar-item" href="{% url 'sessions' type='page' %}">
|
|
Sessions
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="navbar-item has-dropdown is-hoverable">
|
|
<a class="navbar-link">
|
|
Settings
|
|
</a>
|
|
|
|
<div class="navbar-dropdown">
|
|
<a class="navbar-item" href="{% url 'two_factor:profile' %}">
|
|
Security
|
|
</a>
|
|
<a class="navbar-item" href="{% url 'notifications_update' type='page' %}">
|
|
Notifications
|
|
</a>
|
|
<a class="navbar-item" href="{% url 'ais' type='page' %}">
|
|
AI
|
|
</a>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="navbar-item">
|
|
<div class="buttons">
|
|
{% if not user.is_authenticated %}
|
|
<a class="button is-info" href="{% url 'signup' %}">
|
|
<strong>Sign up</strong>
|
|
</a>
|
|
<a class="button" href="{% url 'two_factor:login' %}">
|
|
Log in
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if user.is_authenticated %}
|
|
<a class="button is-dark" href="{% url 'logout' %}">Logout</a>
|
|
{% endif %}
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<script>
|
|
let deferredPrompt;
|
|
const addBtn = document.querySelector('.add-button');
|
|
addBtn.style.display = 'none';
|
|
window.addEventListener('beforeinstallprompt', (e) => {
|
|
// Prevent Chrome 67 and earlier from automatically showing the prompt
|
|
e.preventDefault();
|
|
// Stash the event so it can be triggered later.
|
|
deferredPrompt = e;
|
|
// Update UI to notify the user they can add to home screen
|
|
addBtn.style.display = 'block';
|
|
|
|
addBtn.addEventListener('click', (e) => {
|
|
// hide our user interface that shows our A2HS button
|
|
addBtn.style.display = 'none';
|
|
// Show the prompt
|
|
deferredPrompt.prompt();
|
|
// Wait for the user to respond to the prompt
|
|
deferredPrompt.userChoice.then((choiceResult) => {
|
|
if (choiceResult.outcome === 'accepted') {
|
|
console.log('User accepted the A2HS prompt');
|
|
} else {
|
|
console.log('User dismissed the A2HS prompt');
|
|
}
|
|
deferredPrompt = null;
|
|
});
|
|
});
|
|
});
|
|
|
|
window.giaPrepareWidgetTarget = function () {
|
|
const target = document.getElementById("widgets-here");
|
|
if (target) {
|
|
target.style.display = "block";
|
|
}
|
|
};
|
|
|
|
window.giaCanSpawnWidgets = function () {
|
|
return !!(
|
|
window.grid &&
|
|
typeof window.grid.addWidget === "function" &&
|
|
document.getElementById("grid-stack-main") &&
|
|
document.getElementById("widgets-here")
|
|
);
|
|
};
|
|
|
|
window.giaEnableWidgetSpawnButtons = function (root) {
|
|
const scope = root && root.querySelectorAll ? root : document;
|
|
const canSpawn = window.giaCanSpawnWidgets();
|
|
scope.querySelectorAll(".js-widget-spawn-trigger").forEach(function (button) {
|
|
const widgetUrl = String(
|
|
button.getAttribute("data-widget-url")
|
|
|| button.getAttribute("hx-get")
|
|
|| ""
|
|
).trim();
|
|
const visible = canSpawn && !!widgetUrl;
|
|
button.classList.toggle("is-hidden", !visible);
|
|
button.setAttribute("aria-hidden", visible ? "false" : "true");
|
|
});
|
|
};
|
|
|
|
window.giaPrepareWindowAnchor = function (trigger) {
|
|
if (!trigger || !trigger.getBoundingClientRect) {
|
|
window.giaWindowAnchor = null;
|
|
return;
|
|
}
|
|
const rect = trigger.getBoundingClientRect();
|
|
window.giaWindowAnchor = {
|
|
left: rect.left,
|
|
right: rect.right,
|
|
top: rect.top,
|
|
bottom: rect.bottom,
|
|
width: rect.width,
|
|
height: rect.height,
|
|
ts: Date.now(),
|
|
};
|
|
};
|
|
|
|
window.giaPositionFloatingWindow = function (windowEl) {
|
|
if (!windowEl) {
|
|
return;
|
|
}
|
|
const isMobile = window.matchMedia("(max-width: 768px)").matches;
|
|
const margin = 12;
|
|
const rect = windowEl.getBoundingClientRect();
|
|
const anchor = window.giaWindowAnchor || null;
|
|
windowEl.style.position = "fixed";
|
|
|
|
if (isMobile) {
|
|
const centeredLeftViewport = Math.max(
|
|
margin,
|
|
Math.round((window.innerWidth - rect.width) / 2)
|
|
);
|
|
const centeredTopViewport = Math.max(
|
|
margin,
|
|
Math.round((window.innerHeight - rect.height) / 2)
|
|
);
|
|
windowEl.style.left = centeredLeftViewport + "px";
|
|
windowEl.style.top = centeredTopViewport + "px";
|
|
windowEl.style.right = "auto";
|
|
windowEl.style.bottom = "auto";
|
|
windowEl.style.transform = "none";
|
|
windowEl.setAttribute("tabindex", "-1");
|
|
if (typeof windowEl.focus === "function") {
|
|
windowEl.focus({preventScroll: true});
|
|
}
|
|
if (typeof windowEl.scrollIntoView === "function") {
|
|
windowEl.scrollIntoView({block: "center", inline: "center", behavior: "smooth"});
|
|
}
|
|
window.giaWindowAnchor = null;
|
|
return;
|
|
}
|
|
|
|
if (!anchor || (Date.now() - anchor.ts) > 10000) {
|
|
return;
|
|
}
|
|
|
|
const desiredLeftViewport = anchor.left;
|
|
const desiredTopViewport = anchor.bottom + 6;
|
|
const maxLeftViewport = window.innerWidth - rect.width - margin;
|
|
const maxTopViewport = window.innerHeight - rect.height - margin;
|
|
const boundedLeftViewport = Math.max(
|
|
margin,
|
|
Math.min(desiredLeftViewport, maxLeftViewport)
|
|
);
|
|
const boundedTopViewport = Math.max(
|
|
margin,
|
|
Math.min(desiredTopViewport, maxTopViewport)
|
|
);
|
|
windowEl.style.left = boundedLeftViewport + "px";
|
|
windowEl.style.top = boundedTopViewport + "px";
|
|
windowEl.style.right = "auto";
|
|
windowEl.style.bottom = "auto";
|
|
windowEl.style.transform = "none";
|
|
window.giaWindowAnchor = null;
|
|
};
|
|
|
|
window.giaEnableFloatingWindowInteractions = function (windowEl) {
|
|
if (!windowEl || windowEl.dataset.giaWindowInteractive === "1") {
|
|
return;
|
|
}
|
|
windowEl.dataset.giaWindowInteractive = "1";
|
|
|
|
// Disable magnet-block global drag so text inputs remain editable.
|
|
windowEl.setAttribute("unmovable", "");
|
|
|
|
const heading = windowEl.querySelector(".panel-heading");
|
|
if (!heading) {
|
|
return;
|
|
}
|
|
|
|
let dragging = false;
|
|
let startX = 0;
|
|
let startY = 0;
|
|
let startLeft = 0;
|
|
let startTop = 0;
|
|
|
|
const onMove = function (event) {
|
|
if (!dragging) {
|
|
return;
|
|
}
|
|
const deltaX = event.clientX - startX;
|
|
const deltaY = event.clientY - startY;
|
|
windowEl.style.left = (startLeft + deltaX) + "px";
|
|
windowEl.style.top = (startTop + deltaY) + "px";
|
|
windowEl.style.right = "auto";
|
|
windowEl.style.bottom = "auto";
|
|
};
|
|
|
|
const stopDrag = function () {
|
|
dragging = false;
|
|
document.removeEventListener("pointermove", onMove);
|
|
document.removeEventListener("pointerup", stopDrag);
|
|
};
|
|
|
|
heading.addEventListener("pointerdown", function (event) {
|
|
if (event.button !== 0) {
|
|
return;
|
|
}
|
|
const interactive = event.target.closest(
|
|
"button, a, input, textarea, select, label, .delete, .icon"
|
|
);
|
|
if (interactive) {
|
|
return;
|
|
}
|
|
const rect = windowEl.getBoundingClientRect();
|
|
windowEl.style.position = "fixed";
|
|
startLeft = rect.left;
|
|
startTop = rect.top;
|
|
startX = event.clientX;
|
|
startY = event.clientY;
|
|
dragging = true;
|
|
document.addEventListener("pointermove", onMove);
|
|
document.addEventListener("pointerup", stopDrag);
|
|
event.preventDefault();
|
|
});
|
|
};
|
|
|
|
document.addEventListener("click", function (event) {
|
|
const trigger = event.target.closest(".js-widget-spawn-trigger");
|
|
if (!trigger) {
|
|
return;
|
|
}
|
|
window.giaPrepareWidgetTarget();
|
|
});
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
window.giaEnableWidgetSpawnButtons(document);
|
|
});
|
|
|
|
document.body.addEventListener("htmx:afterSwap", function (event) {
|
|
const target = (event && event.target) || document;
|
|
window.giaEnableWidgetSpawnButtons(target);
|
|
const targetId = (target && target.id) || "";
|
|
if (targetId === "windows-here") {
|
|
const floatingWindows = target.querySelectorAll(".floating-window");
|
|
floatingWindows.forEach(function (floatingWindow) {
|
|
window.setTimeout(function () {
|
|
window.giaPositionFloatingWindow(floatingWindow);
|
|
window.giaEnableFloatingWindowInteractions(floatingWindow);
|
|
}, 0);
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
{% block outer_content %}
|
|
{% endblock %}
|
|
<section class="section">
|
|
<div class="container">
|
|
{% block content_wrapper %}
|
|
{% block content %}
|
|
{% endblock %}
|
|
{% endblock %}
|
|
<div id="modals-here">
|
|
</div>
|
|
<div id="windows-here" style="z-index: 120;">
|
|
</div>
|
|
<div id="widgets-here" style="display: none;">
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</body>
|
|
</html>
|