nothumanallowed 13.4.9 → 13.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/constants.mjs +1 -1
- package/src/services/web-ui.mjs +73 -39
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.5.0",
|
|
4
4
|
"description": "NotHumanAllowed — 38 AI agents, 80 tools, Studio (visual agentic workflows). Email, calendar, browser automation, screen capture, canvas, cron/heartbeat, Alexandria E2E messaging, GitHub, Notion, Slack, voice chat, free AI (Liara), 28 languages. Zero-dependency CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/src/constants.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'url';
|
|
|
5
5
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = path.dirname(__filename);
|
|
7
7
|
|
|
8
|
-
export const VERSION = '13.
|
|
8
|
+
export const VERSION = '13.5.0';
|
|
9
9
|
export const BASE_URL = 'https://nothumanallowed.com/cli';
|
|
10
10
|
export const API_BASE = 'https://nothumanallowed.com/api/v1';
|
|
11
11
|
|
package/src/services/web-ui.mjs
CHANGED
|
@@ -729,6 +729,7 @@ function openCanvasPanel(){
|
|
|
729
729
|
var cp = document.getElementById('canvasPanel');
|
|
730
730
|
if (!cp) return;
|
|
731
731
|
cp.classList.add('open');
|
|
732
|
+
document.body.classList.add('canvas-open');
|
|
732
733
|
// Always reset tracker so renderCanvasPanel reloads fresh content
|
|
733
734
|
_canvasFrameLoadedHtml = null;
|
|
734
735
|
canvasMode = 'canvas';
|
|
@@ -746,7 +747,7 @@ function reopenCanvas(){
|
|
|
746
747
|
else{canvasMode='canvas';} // show empty state
|
|
747
748
|
renderCanvasPanel();
|
|
748
749
|
}
|
|
749
|
-
function closeCanvas(){var p=document.getElementById('canvasPanel');if(p)p.classList.remove('open');}
|
|
750
|
+
function closeCanvas(){var p=document.getElementById('canvasPanel');if(p)p.classList.remove('open');document.body.classList.remove('canvas-open');}
|
|
750
751
|
function canvasDownloadHTML(){
|
|
751
752
|
var d=getConvCanvasData();var item=d.canvases[canvasIdx];
|
|
752
753
|
var html=(item&&item.html)||studioState.canvas;
|
|
@@ -3423,12 +3424,14 @@ function buildWorkflowChar(n) {
|
|
|
3423
3424
|
var shirt = shirtColors[skinIdx];
|
|
3424
3425
|
var hairColors = [\x27#1a1a1a\x27,\x27#4a3728\x27,\x27#c4a35a\x27,\x27#8b0000\x27,\x27#2c4a7c\x27,\x27#3d2b1f\x27];
|
|
3425
3426
|
var hair = hairColors[skinIdx];
|
|
3426
|
-
|
|
3427
|
-
var
|
|
3428
|
-
var
|
|
3427
|
+
// Idle agents still have lit screens (dim amber glow — standby mode)
|
|
3428
|
+
var accentColor = isActive ? \x27#6366f1\x27 : (isDone ? \x27#22c55e\x27 : \x27#3b3b6e\x27);
|
|
3429
|
+
var idleScreenColor = \x27#1e1b38\x27; // dim purple-blue for idle screens — lit but standby
|
|
3430
|
+
var deskBg = isDone ? \x27#1a3a1a\x27 : (isActive ? \x27#1a1a3e\x27 : \x27#181830\x27);
|
|
3431
|
+
var monGlow = isActive ? \x27filter:drop-shadow(0 0 4px #6366f1)\x27 : (isDone ? \x27filter:drop-shadow(0 0 3px #22c55e44)\x27 : \x27filter:drop-shadow(0 0 3px #3b3b6e66)\x27);
|
|
3429
3432
|
var armCls = isActive ? \x27class="prl-arm"\x27 : \x27\x27;
|
|
3430
3433
|
var headCls = isActive ? \x27class="prl-head"\x27 : \x27\x27;
|
|
3431
|
-
var glowStyle = isActive ? \x27filter:drop-shadow(0 0 5px #6366f1)\x27 : \x27\x27;
|
|
3434
|
+
var glowStyle = isActive ? \x27filter:drop-shadow(0 0 5px #6366f1)\x27 : (isDone ? \x27filter:drop-shadow(0 0 4px #22c55e44)\x27 : \x27\x27);
|
|
3432
3435
|
var svg = \x27<svg viewBox="0 0 80 96" width="70" height="84" xmlns="http://www.w3.org/2000/svg" style="\x27+glowStyle+\x27;display:block;margin:0 auto">\x27+
|
|
3433
3436
|
// Desk
|
|
3434
3437
|
\x27<path d="M4 55 L76 55 L76 63 L4 63 Z" fill="\x27+deskBg+\x27" stroke="\x27+accentColor+\x27" stroke-width="1.2"/>\x27+
|
|
@@ -3443,7 +3446,8 @@ function buildWorkflowChar(n) {
|
|
|
3443
3446
|
\x27<rect x="33" y="50" width="4" height="6" rx="1" fill="#1a1a2e"/>\x27+
|
|
3444
3447
|
\x27<rect x="17" y="26" width="36" height="25" rx="4" fill="#050510"/>\x27+
|
|
3445
3448
|
\x27<rect x="18" y="27" width="34" height="23" rx="3" fill="#0d0d20" stroke="\x27+accentColor+\x27" stroke-width="\x27+(isActive?\x272\x27:\x271\x27)+\x27" style="\x27+monGlow+\x27"/>\x27+
|
|
3446
|
-
|
|
3449
|
+
// Screen glass — idle=dim standby blue, done=dim green, active=lit
|
|
3450
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="\x27+(isDone?\x27#0a1a0a\x27:(isActive?\x27#0a0a18\x27:\x27#0e0e22\x27))+\x27"/>\x27+
|
|
3447
3451
|
(isActive ?
|
|
3448
3452
|
\x27<defs><linearGradient id="wsg\x27+skinIdx+\x27" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#6366f122"/><stop offset="1" stop-color="#6366f108"/></linearGradient></defs>\x27+
|
|
3449
3453
|
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="url(#wsg\x27+skinIdx+\x27)"/>\x27+
|
|
@@ -3452,13 +3456,24 @@ function buildWorkflowChar(n) {
|
|
|
3452
3456
|
\x27<line x1="22" y1="38" x2="46" y2="38" stroke="#6366f188" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
3453
3457
|
\x27<line x1="22" y1="41" x2="40" y2="41" stroke="#6366f166" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
3454
3458
|
\x27<line x1="22" y1="44" x2="43" y2="44" stroke="#6366f144" stroke-width="1" stroke-linecap="round"/>\x27
|
|
3459
|
+
: isDone ?
|
|
3460
|
+
// Done: green screen with completed code
|
|
3461
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="#0a1a0a88"/>\x27+
|
|
3462
|
+
\x27<line x1="22" y1="32" x2="44" y2="32" stroke="#22c55e99" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
3463
|
+
\x27<line x1="22" y1="35" x2="46" y2="35" stroke="#22c55e77" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
3464
|
+
\x27<line x1="22" y1="38" x2="40" y2="38" stroke="#22c55e55" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
3465
|
+
\x27<line x1="22" y1="41" x2="43" y2="41" stroke="#22c55e44" stroke-width="1" stroke-linecap="round"/>\x27
|
|
3455
3466
|
:
|
|
3456
|
-
|
|
3457
|
-
\x27<
|
|
3458
|
-
\x27<line x1="22" y1="
|
|
3459
|
-
\x27<line x1="22" y1="
|
|
3467
|
+
// Idle: dim standby screen — agent is waiting, screen lit but quiet
|
|
3468
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="rgba(63,63,120,.18)"/>\x27+
|
|
3469
|
+
\x27<line x1="22" y1="33" x2="46" y2="33" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".7"/>\x27+
|
|
3470
|
+
\x27<line x1="22" y1="36" x2="38" y2="36" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".5"/>\x27+
|
|
3471
|
+
\x27<line x1="22" y1="39" x2="44" y2="39" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".4"/>\x27+
|
|
3472
|
+
\x27<line x1="22" y1="42" x2="34" y2="42" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".3"/>\x27+
|
|
3473
|
+
// Standby dot — blinking cursor
|
|
3474
|
+
\x27<circle cx="22" cy="45" r="1" fill="#6366f1" opacity=".6" class="prl-doc-hold"/>\x27
|
|
3460
3475
|
)+
|
|
3461
|
-
\x27<circle cx="35" cy="28.2" r=".9" fill="\x27+(isActive?\x27#6366f1\x27:\x27#
|
|
3476
|
+
\x27<circle cx="35" cy="28.2" r=".9" fill="\x27+(isActive?\x27#6366f1\x27:(isDone?\x27#22c55e\x27:\x27#4040a0\x27))+\x27"/>\x27+
|
|
3462
3477
|
// Keyboard
|
|
3463
3478
|
\x27<rect x="13" y="48" width="36" height="7" rx="2.5" fill="#0c0c1e" stroke="#202036" stroke-width="1"/>\x27+
|
|
3464
3479
|
\x27<rect x="14" y="49.5" width="3" height="2" rx=".5" fill="#181830"/>\x27+
|
|
@@ -4276,7 +4291,7 @@ async function runStudio() {
|
|
|
4276
4291
|
pb.style.width = \x27calc(100vw - 32px)\x27;
|
|
4277
4292
|
pb.style.maxWidth = \x27860px\x27;
|
|
4278
4293
|
pb.style.top = \x27\x27;
|
|
4279
|
-
pb.style.zIndex = \
|
|
4294
|
+
pb.style.zIndex = \x271010\x27;
|
|
4280
4295
|
pb.style.boxShadow = \x270 8px 40px rgba(99,102,241,.5),0 2px 0 rgba(99,102,241,.2)\x27;
|
|
4281
4296
|
}
|
|
4282
4297
|
|
|
@@ -4374,8 +4389,8 @@ async function runStudio() {
|
|
|
4374
4389
|
\x27<rect x="17" y="26" width="36" height="25" rx="4" fill="#050510"/>\x27+
|
|
4375
4390
|
// Monitor bezel
|
|
4376
4391
|
\x27<rect x="18" y="27" width="34" height="23" rx="3" fill="#0d0d20" stroke="\x27+(isActive?phaseColor:\x27#252535\x27)+\x27" stroke-width="\x27+(isActive?\x272\x27:\x271\x27)+\x27" style="\x27+monitorGlow+\x27"/>\x27+
|
|
4377
|
-
// Screen glass —
|
|
4378
|
-
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="#0a0a18"/>\x27+
|
|
4392
|
+
// Screen glass — idle=standby blue, done=green, active=lit
|
|
4393
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="\x27+(isDone?\x27#0a1a0a\x27:(isActive?\x27#0a0a18\x27:\x27#0e0e22\x27))+\x27"/>\x27+
|
|
4379
4394
|
// Screen content
|
|
4380
4395
|
(isActive ?
|
|
4381
4396
|
// Active: glowing code/data on screen
|
|
@@ -4387,15 +4402,24 @@ async function runStudio() {
|
|
|
4387
4402
|
\x27<line x1="22" y1="41" x2="40" y2="41" stroke="\x27+phaseColor+\x2766" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
4388
4403
|
\x27<line x1="22" y1="44" x2="43" y2="44" stroke="\x27+phaseColor+\x2744" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
4389
4404
|
\x27<rect x="22" y="30" width="10" height="2.5" rx="1" fill="\x27+phaseColor+\x2733"/>\x27
|
|
4405
|
+
: isDone ?
|
|
4406
|
+
// Done: green screen with completed output
|
|
4407
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="#0a1a0a88"/>\x27+
|
|
4408
|
+
\x27<line x1="22" y1="32" x2="44" y2="32" stroke="#22c55e99" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
4409
|
+
\x27<line x1="22" y1="35" x2="46" y2="35" stroke="#22c55e77" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
4410
|
+
\x27<line x1="22" y1="38" x2="40" y2="38" stroke="#22c55e55" stroke-width="1" stroke-linecap="round"/>\x27+
|
|
4411
|
+
\x27<line x1="22" y1="41" x2="43" y2="41" stroke="#22c55e44" stroke-width="1" stroke-linecap="round"/>\x27
|
|
4390
4412
|
:
|
|
4391
|
-
// Idle: dim screen
|
|
4392
|
-
\x27<
|
|
4393
|
-
\x27<line x1="22" y1="
|
|
4394
|
-
\x27<line x1="22" y1="
|
|
4395
|
-
\x27<line x1="22" y1="
|
|
4413
|
+
// Idle: dim standby screen — waiting, lit but quiet
|
|
4414
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="rgba(63,63,120,.18)"/>\x27+
|
|
4415
|
+
\x27<line x1="22" y1="33" x2="46" y2="33" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".7"/>\x27+
|
|
4416
|
+
\x27<line x1="22" y1="36" x2="38" y2="36" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".5"/>\x27+
|
|
4417
|
+
\x27<line x1="22" y1="39" x2="44" y2="39" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".4"/>\x27+
|
|
4418
|
+
\x27<line x1="22" y1="42" x2="34" y2="42" stroke="#5b5b8e" stroke-width="1" stroke-linecap="round" opacity=".3"/>\x27+
|
|
4419
|
+
\x27<circle cx="22" cy="45" r="1" fill="#6366f1" opacity=".6" class="prl-doc-hold"/>\x27
|
|
4396
4420
|
)+
|
|
4397
4421
|
// Monitor camera dot
|
|
4398
|
-
\x27<circle cx="35" cy="28.2" r=".9" fill="\x27+(isActive?phaseColor:\x27#
|
|
4422
|
+
\x27<circle cx="35" cy="28.2" r=".9" fill="\x27+(isActive?phaseColor:(isDone?\x27#22c55e\x27:\x27#4040a0\x27))+\x27"/>\x27+
|
|
4399
4423
|
// ════ KEYBOARD (detailed, realistic) ════
|
|
4400
4424
|
\x27<rect x="13" y="48" width="36" height="7" rx="2.5" fill="#0c0c1e" stroke="#202036" stroke-width="1"/>\x27+
|
|
4401
4425
|
// Key rows
|
|
@@ -4840,7 +4864,7 @@ async function runStudio() {
|
|
|
4840
4864
|
} catch(e3) {
|
|
4841
4865
|
if (e3.name !== \x27AbortError\x27) {
|
|
4842
4866
|
studioLog(\x27Parlamento\x27, \x27♖\x27, \x27Deliberazione non disponibile: \x27 + (e3.message || String(e3)), \x27error\x27);
|
|
4843
|
-
|
|
4867
|
+
// Do NOT hide the parliament block if it already has content — user is watching it
|
|
4844
4868
|
}
|
|
4845
4869
|
}
|
|
4846
4870
|
}
|
|
@@ -4914,7 +4938,7 @@ function saveStudioSession(task, nodes, log, result) {
|
|
|
4914
4938
|
sessions.unshift({
|
|
4915
4939
|
id: Date.now(),
|
|
4916
4940
|
task: task,
|
|
4917
|
-
nodes: nodes.map(function(n){return {label:n.label,icon:n.icon,agent:n.agent};}),
|
|
4941
|
+
nodes: nodes.map(function(n){return {label:n.label,icon:n.icon,agent:n.agent,output:n.output||''};}),
|
|
4918
4942
|
result: result,
|
|
4919
4943
|
canvas: studioState.canvas || null,
|
|
4920
4944
|
parlHtml: parlHtml,
|
|
@@ -4958,7 +4982,7 @@ function restoreStudioSession(idx) {
|
|
|
4958
4982
|
var sessions = loadStudioSessions();
|
|
4959
4983
|
var s = sessions[idx]; if (!s) return;
|
|
4960
4984
|
studioState.task = s.task;
|
|
4961
|
-
studioState.nodes = s.nodes.map(function(n){return {icon:n.icon,agent:n.agent,label:n.label,status:'done'};});
|
|
4985
|
+
studioState.nodes = s.nodes.map(function(n){return {icon:n.icon,agent:n.agent,label:n.label,output:n.output||'',status:'done'};});
|
|
4962
4986
|
studioState.log = s.log;
|
|
4963
4987
|
studioState.result = s.result;
|
|
4964
4988
|
studioState.canvas = s.canvas || null;
|
|
@@ -5888,6 +5912,8 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
5888
5912
|
.prl-wrap{background:#07070f;border:1.5px solid #6366f1;border-radius:14px;padding:14px 16px 12px;margin-bottom:16px;animation:stNodeIn .35s ease forwards;overflow:hidden}
|
|
5889
5913
|
#studioParliamentBlock[style*="fixed"] .prl-wrap{animation:stNodeIn .35s ease forwards,parlPulse 2.2s ease-in-out infinite}
|
|
5890
5914
|
#studioParliamentBlock[style*="fixed"]{backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
|
|
5915
|
+
/* When canvas panel is open, shift parliament left so they don't overlap */
|
|
5916
|
+
body.canvas-open #studioParliamentBlock[style*="fixed"]{left:16px!important;transform:none!important;max-width:calc(100vw - 520px)!important}
|
|
5891
5917
|
@keyframes parlPulse{0%,100%{border-color:#6366f1;box-shadow:none}50%{border-color:#818cf8;box-shadow:0 0 20px rgba(99,102,241,.3)}}
|
|
5892
5918
|
.prl-header{display:flex;align-items:center;margin-bottom:10px}
|
|
5893
5919
|
.prl-phase-chip{font-size:10px;font-weight:800;font-family:var(--mono);letter-spacing:.3px;color:var(--pc,#6366f1);background:rgba(99,102,241,.12);border:1px solid rgba(99,102,241,.35);border-radius:20px;padding:3px 12px;display:inline-block}
|
|
@@ -5918,22 +5944,30 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
5918
5944
|
.prl-master{position:absolute;bottom:8px;right:8px;display:flex;flex-direction:column;align-items:center;gap:1px;z-index:3;transition:right .8s cubic-bezier(.4,0,.2,1)}
|
|
5919
5945
|
.prl-master-label{font-size:8px;font-family:var(--mono);font-weight:700;letter-spacing:.4px;text-align:center;text-shadow:0 0 8px currentColor}
|
|
5920
5946
|
/* Walking animation — smooth left-right patrol */
|
|
5921
|
-
|
|
5922
|
-
|
|
5923
|
-
|
|
5924
|
-
@keyframes
|
|
5925
|
-
|
|
5926
|
-
|
|
5927
|
-
|
|
5928
|
-
@keyframes
|
|
5929
|
-
|
|
5930
|
-
|
|
5931
|
-
|
|
5932
|
-
|
|
5933
|
-
.prl-master-walk
|
|
5934
|
-
|
|
5935
|
-
|
|
5936
|
-
.prl-master-
|
|
5947
|
+
/* Executive walk: slow measured patrol left↔right */
|
|
5948
|
+
@keyframes parlMasterWalk{0%{right:8px;transform:scaleX(1)}35%{right:calc(100% - 70px);transform:scaleX(1)}40%{right:calc(100% - 70px);transform:scaleX(-1)}75%{right:8px;transform:scaleX(-1)}80%{right:8px;transform:scaleX(1)}100%{right:8px;transform:scaleX(1)}}
|
|
5949
|
+
/* Legs: slow dignified stride */
|
|
5950
|
+
@keyframes parlMasterLegL{0%,100%{transform:rotate(0deg)}25%{transform:rotate(18deg)}75%{transform:rotate(-14deg)}}
|
|
5951
|
+
@keyframes parlMasterLegR{0%,100%{transform:rotate(0deg)}25%{transform:rotate(-14deg)}75%{transform:rotate(18deg)}}
|
|
5952
|
+
/* Arms: clipboard-holding executive swing — tight, not flailing */
|
|
5953
|
+
@keyframes parlMasterArmL{0%,100%{transform:rotate(0deg)}50%{transform:rotate(-12deg)}}
|
|
5954
|
+
@keyframes parlMasterArmR{0%,100%{transform:rotate(0deg)}50%{transform:rotate(8deg)}}
|
|
5955
|
+
/* Clipboard bob while walking — authority gesture */
|
|
5956
|
+
@keyframes parlMasterClipboard{0%,100%{transform:rotate(0deg) translateY(0)}30%{transform:rotate(-6deg) translateY(-1px)}70%{transform:rotate(4deg) translateY(1px)}}
|
|
5957
|
+
/* Whole body: subtle sway of a confident executive */
|
|
5958
|
+
@keyframes parlMasterBodySway{0%,100%{transform:translateY(0) rotate(0deg)}25%{transform:translateY(-2px) rotate(.6deg)}75%{transform:translateY(-1px) rotate(-.5deg)}}
|
|
5959
|
+
.prl-master-walk{animation:parlMasterWalk 8s cubic-bezier(.45,0,.55,1) infinite}
|
|
5960
|
+
.prl-master-walk .prl-master-leg-l{transform-origin:50% 0;animation:parlMasterLegL 1s ease-in-out infinite}
|
|
5961
|
+
.prl-master-walk .prl-master-leg-r{transform-origin:50% 0;animation:parlMasterLegR 1s ease-in-out infinite}
|
|
5962
|
+
.prl-master-walk .prl-master-arm-l{transform-origin:50% 0;animation:parlMasterArmL 1.2s ease-in-out infinite}
|
|
5963
|
+
.prl-master-walk .prl-master-arm-r{transform-origin:50% 0;animation:parlMasterArmR 1.2s ease-in-out infinite}
|
|
5964
|
+
/* R2 supervise: executive pacing — short back-and-forth at the active desk */
|
|
5965
|
+
@keyframes parlMasterSupervise{0%{right:8px}30%{right:28px}60%{right:10px}80%{right:24px}100%{right:8px}}
|
|
5966
|
+
.prl-master-supervise{animation:parlMasterSupervise 4s ease-in-out infinite}
|
|
5967
|
+
.prl-master-supervise .prl-master-leg-l{transform-origin:50% 0;animation:parlMasterLegL 1s ease-in-out infinite}
|
|
5968
|
+
.prl-master-supervise .prl-master-leg-r{transform-origin:50% 0;animation:parlMasterLegR 1s ease-in-out infinite}
|
|
5969
|
+
.prl-master-supervise .prl-master-arm-l{transform-origin:50% 0;animation:parlMasterArmL 1.2s ease-in-out infinite}
|
|
5970
|
+
.prl-master-supervise .prl-master-arm-r{transform-origin:50% 0;animation:parlMasterArmR 1.2s ease-in-out infinite}
|
|
5937
5971
|
/* Flying documents: smooth parabolic arc between agents */
|
|
5938
5972
|
.prl-fly-container{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden;z-index:4}
|
|
5939
5973
|
@keyframes parlFlyDoc{0%{transform:translate(0,70px) scale(.6) rotate(-20deg);opacity:0}15%{opacity:1;transform:translate(8%,20px) scale(.9) rotate(-5deg)}40%{transform:translate(30%,-15px) scale(1.1) rotate(3deg);opacity:1}65%{transform:translate(60%,5px) scale(.95) rotate(8deg);opacity:.9}85%{opacity:.6}100%{transform:translate(90%,60px) scale(.6) rotate(15deg);opacity:0}}
|