Begin reimplementing compose

This commit is contained in:
2026-03-12 00:12:57 +00:00
parent 1570f79b62
commit 79766d279d
56 changed files with 2726 additions and 6271 deletions

File diff suppressed because one or more lines are too long

1
core/static/css/bulma-slider.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
core/static/css/bulma-switch.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.tagsinput{height:auto!important}.tagsinput .control{margin-bottom:.1em!important;margin-top:.1em!important}.tagsinput input{border:none;margin-bottom:.1em!important;margin-top:.1em!important}.tagsinput .tag.is-active{background-color:#00d1b2;color:#fff}

1
core/static/css/bulma-tooltip.min.css vendored Normal file

File diff suppressed because one or more lines are too long

3
core/static/css/bulma.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,324 @@
.compose-shell {
display: flex;
flex-direction: column;
gap: 1rem;
}
.compose-shell .compose-shell-head {
gap: 0.75rem;
}
.compose-shell .compose-shell-eyebrow,
.compose-shell .compose-meta-line,
.compose-shell .compose-empty,
.compose-shell .compose-typing,
.compose-shell .compose-msg-meta,
.compose-shell .compose-reply-banner-label {
color: var(--bulma-text-weak, #6b7280);
}
.compose-shell .compose-shell-eyebrow {
letter-spacing: 0.08em;
text-transform: uppercase;
}
.compose-shell .compose-contact-switch,
.compose-shell .compose-platform-switch {
margin-top: 0.5rem;
}
.compose-shell .compose-status {
min-height: 1.25rem;
}
.compose-shell .compose-status .button {
margin-top: 0.5rem;
}
.compose-shell .compose-status-line {
margin: 0;
font-size: 0.875rem;
}
.compose-shell .compose-status-line.is-warning,
.compose-shell .compose-status-line.is-danger {
color: var(--bulma-danger, #cc0f35);
}
.compose-shell .compose-status-line.is-success {
color: var(--bulma-success, #257953);
}
.compose-shell .compose-thread {
display: flex;
flex-direction: column;
gap: 0.75rem;
min-height: 24rem;
max-height: 68vh;
overflow-y: auto;
padding: 0.75rem;
border: 1px solid var(--bulma-border, #dbdbdb);
background: var(--bulma-scheme-main-bis, #f7f8fa);
}
.compose-shell .compose-empty,
.compose-shell .compose-typing {
margin: 0;
font-size: 0.875rem;
}
.compose-shell .compose-row {
display: flex;
flex-direction: column;
gap: 0.35rem;
}
.compose-shell .compose-row.is-in {
align-items: flex-start;
}
.compose-shell .compose-row.is-out {
align-items: flex-end;
}
.compose-shell .compose-row.is-deleted .compose-bubble {
opacity: 0.85;
}
.compose-shell .compose-row.is-target-flash .compose-bubble,
.compose-shell .compose-row.compose-reply-selected .compose-bubble {
box-shadow: 0 0 0 2px rgba(50, 115, 220, 0.24);
}
.compose-shell .compose-bubble {
width: fit-content;
max-width: min(42rem, 100%);
padding: 0.75rem 0.875rem;
border: 1px solid var(--bulma-border, #dbdbdb);
border-radius: 1rem;
background: var(--bulma-scheme-main, #fff);
}
.compose-shell .compose-bubble.is-out {
border-color: rgba(50, 115, 220, 0.2);
background: var(--bulma-link-light, #eef6fc);
}
.compose-shell .compose-reply-ref {
margin-bottom: 0.5rem;
padding-left: 0.75rem;
border-left: 3px solid var(--bulma-border, #dbdbdb);
}
.compose-shell .compose-reply-link {
padding: 0;
border: 0;
background: transparent;
color: var(--bulma-link, #3273dc);
font-size: 0.75rem;
text-align: left;
}
.compose-shell .compose-reply-link:hover {
text-decoration: underline;
}
.compose-shell .compose-source-badge-wrap {
margin-bottom: 0.5rem;
}
.compose-shell .compose-source-badge {
font-size: 0.6875rem;
font-weight: 700;
letter-spacing: 0.02em;
}
.compose-shell .compose-media {
margin: 0 0 0.5rem;
}
.compose-shell .compose-media:last-of-type {
margin-bottom: 0.625rem;
}
.compose-shell .compose-image {
display: block;
max-width: min(26rem, 100%);
max-height: 24rem;
border-radius: 0.75rem;
}
.compose-shell .compose-body {
margin: 0;
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.compose-shell .compose-image-fallback.is-hidden {
display: none;
}
.compose-shell .compose-body + .compose-edit-history,
.compose-shell .compose-media + .compose-body,
.compose-shell .compose-body + .compose-reactions,
.compose-shell .compose-reactions + .compose-msg-meta,
.compose-shell .compose-edit-history + .compose-reactions,
.compose-shell .compose-edit-history + .compose-msg-meta {
margin-top: 0.5rem;
}
.compose-shell .compose-edit-history {
font-size: 0.75rem;
}
.compose-shell .compose-edit-history summary {
cursor: pointer;
}
.compose-shell .compose-edit-history ul {
margin: 0.5rem 0 0;
padding-left: 1rem;
}
.compose-shell .compose-edit-diff {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
margin-top: 0.25rem;
}
.compose-shell .compose-edit-old {
text-decoration: line-through;
opacity: 0.72;
}
.compose-shell .compose-edit-arrow {
opacity: 0.55;
}
.compose-shell .compose-reactions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.compose-shell .compose-reaction-chip {
min-height: 1.7rem;
font-size: 0.875rem;
}
.compose-shell .compose-msg-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem;
margin-top: 0.5rem;
font-size: 0.75rem;
}
.compose-shell .compose-msg-flag {
font-size: 0.6875rem;
text-transform: lowercase;
}
.compose-shell .compose-msg-flag.is-edited {
color: var(--bulma-warning-dark, #7a5a00);
}
.compose-shell .compose-msg-flag.is-deleted {
color: var(--bulma-danger, #cc0f35);
}
.compose-shell .compose-reply-btn {
margin-top: 0.5rem;
}
.compose-shell .compose-form {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.compose-shell .compose-send-safety {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.compose-shell .compose-reply-banner {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
border: 1px solid var(--bulma-border, #dbdbdb);
border-radius: 0.75rem;
background: var(--bulma-scheme-main-bis, #f7f8fa);
}
.compose-shell .compose-reply-banner.is-hidden {
display: none;
}
.compose-shell .compose-reply-banner-label {
font-size: 0.75rem;
font-weight: 700;
}
.compose-shell .compose-reply-banner-text {
flex: 1 1 12rem;
min-width: 0;
overflow-wrap: anywhere;
}
.compose-shell .compose-composer-capsule {
display: flex;
align-items: flex-end;
gap: 0.75rem;
padding: 0.75rem;
border: 1px solid var(--bulma-border, #dbdbdb);
border-radius: 0.875rem;
background: var(--bulma-scheme-main-bis, #f7f8fa);
}
.compose-shell .compose-textarea {
flex: 1 1 auto;
min-height: 2.75rem;
max-height: 8rem;
resize: none;
}
.compose-shell .compose-send-btn {
flex: 0 0 auto;
}
.compose-shell .compose-persistent-cancel {
margin-top: 0.5rem;
}
.compose-shell.is-send-success .compose-composer-capsule {
border-color: rgba(35, 209, 96, 0.55);
}
.compose-shell.is-send-fail .compose-composer-capsule {
border-color: rgba(255, 56, 96, 0.55);
}
@media (max-width: 768px) {
.compose-shell .compose-thread {
max-height: 60vh;
}
.compose-shell .compose-bubble {
max-width: 100%;
}
.compose-shell .compose-composer-capsule {
align-items: stretch;
flex-direction: column;
}
.compose-shell .compose-send-btn {
width: 100%;
}
}

View File

@@ -0,0 +1,293 @@
.icon { border-bottom: 0 !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,
.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;
}
a.panel-block {
transition: all 0.2s ease-in-out;
}
tr:hover,
a.panel-block:hover {
cursor: pointer;
background-color: rgba(221, 224, 255, 0.3) !important;
}
.has-background-grey-lighter {
background-color: rgba(219, 219, 219, 0.5) !important;
}
.navbar {
background-color: rgba(0, 0, 0, 0.03) !important;
}
.gia-brand-shell {
display: inline-flex;
align-items: center;
}
.gia-brand-logo {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.45rem 0.75rem;
border-radius: 16px;
background: rgba(255, 255, 255, 0.82);
border: 1px solid rgba(21, 28, 39, 0.08);
box-shadow: 0 10px 24px rgba(21, 28, 39, 0.08);
}
.gia-brand-logo img {
display: block;
}
[data-theme="dark"] .gia-brand-logo {
background: rgba(255, 255, 255, 0.96);
border-color: rgba(255, 255, 255, 0.82);
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.34);
}
.section > .container.gia-page-shell,
.section > .container {
max-width: 1340px;
}
.gia-page-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 1rem;
margin-bottom: 1rem;
flex-wrap: wrap;
}
.gia-page-header .title,
.gia-page-header .subtitle {
max-width: 72ch;
}
.gia-page-header .subtitle {
margin-bottom: 0;
}
.table thead th {
position: sticky;
top: 0;
background: rgba(248, 250, 252, 0.96) !important;
color: #1b1f2a !important;
backdrop-filter: blur(6px);
z-index: 1;
}
[data-theme="dark"] .table thead th {
background: rgba(44, 44, 44, 0.96) !important;
color: #f3f5f8 !important;
}
.table td,
.table th {
vertical-align: top;
}
.help {
max-width: 78ch;
}
.button.is-light {
border-color: rgba(27, 38, 59, 0.12);
}
.input,
.textarea,
.select select {
border-color: rgba(27, 38, 59, 0.18);
box-shadow: none;
}
.input:focus,
.textarea:focus,
.select select:focus {
border-color: rgba(27, 99, 214, 0.8);
box-shadow: 0 0 0 0.125em rgba(27, 99, 214, 0.14);
}
.grid-stack-item-content,
.floating-window {
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 {
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: 0 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;
}
.task-ui-badge {
background: #f5f5f5 !important;
border: 1px solid #dbdbdb !important;
color: #1f1f1f !important;
font-size: 0.75rem;
line-height: 1.5;
padding: 0.25em 0.75em;
font-weight: 500;
}
.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%;
}
.navbar-dropdown .navbar-item.is-current-route {
background-color: rgba(50, 115, 220, 0.14) !important;
color: #1f4f99 !important;
font-weight: 600;
}
.theme-toggle-button {
display: inline-flex;
align-items: center;
justify-content: center;
}
.brand-theme-toggle {
min-width: 0;
padding: 0;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
line-height: 1;
width: auto;
height: auto;
}
.brand-theme-logo {
display: block;
width: 5.4rem;
height: auto;
shape-rendering: geometricPrecision;
text-rendering: geometricPrecision;
}
.brand-theme-stroke {
stroke: #111827;
}
[data-theme="dark"] .brand-theme-stroke {
stroke: #f8fafc;
}
.security-page-tabs a {
transition: background-color 0.15s ease-in-out, color 0.15s ease-in-out;
}
.reduced-motion,
.reduced-motion * {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}

1
core/static/css/gridstack.min.css vendored Normal file
View File

@@ -0,0 +1 @@
.grid-stack{position:relative}.grid-stack-rtl{direction:ltr}.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,.1);margin:0;position:absolute;width:auto;z-index:0!important}.grid-stack>.grid-stack-item{position:absolute;padding:0;top:0;left:0;width:var(--gs-column-width);height:var(--gs-cell-height)}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item.size-to-content:not(.size-to-content-max)>.grid-stack-item-content{overflow-y:hidden}.grid-stack>.grid-stack-item>.grid-stack-item-content,.grid-stack>.grid-stack-placeholder>.placeholder-content{top:var(--gs-item-margin-top);right:var(--gs-item-margin-right);bottom:var(--gs-item-margin-bottom);left:var(--gs-item-margin-left)}.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack-item>.ui-resizable-ne,.grid-stack-item>.ui-resizable-nw,.grid-stack-item>.ui-resizable-se,.grid-stack-item>.ui-resizable-sw{background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="%23666" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 20 20"><path d="m10 3 2 2H8l2-2v14l-2-2h4l-2 2"/></svg>');background-repeat:no-repeat;background-position:center}.grid-stack-item>.ui-resizable-ne{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-sw{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-nw{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-se{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:var(--gs-item-margin-top);left:var(--gs-item-margin-left)}.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:var(--gs-item-margin-top);left:25px;right:25px}.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:var(--gs-item-margin-top);right:var(--gs-item-margin-right)}.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px;right:var(--gs-item-margin-right)}.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px;bottom:var(--gs-item-margin-bottom);right:var(--gs-item-margin-right)}.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:var(--gs-item-margin-bottom);right:25px}.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px;bottom:var(--gs-item-margin-bottom);left:var(--gs-item-margin-left)}.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px;left:var(--gs-item-margin-left)}.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none!important}.grid-stack-item.ui-draggable-dragging{will-change:left,top}.grid-stack-item.ui-resizable-resizing{will-change:width,height}.ui-draggable-dragging,.ui-resizable-resizing{z-index:10000}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,.2);opacity:.8}.grid-stack-animate,.grid-stack-animate .grid-stack-item{transition:left .3s,top .3s,height .3s,width .3s}.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack-animate .grid-stack-item.ui-resizable-resizing{transition:left 0s,top 0s,height 0s,width 0s}.grid-stack>.grid-stack-item[gs-y="0"]{top:0}.grid-stack>.grid-stack-item[gs-x="0"]{left:0}

File diff suppressed because one or more lines are too long