Изменения документа App
Редактировал(а) A1MTestAdmin 2026/10/20 11:19
От версии 43.1
отредактировано A1MTestAdmin
на 2026/10/19 02:16
на 2026/10/19 02:16
Изменить комментарий:
Imported from XAR
К версии 38.1
отредактировано A1MTestAdmin
на 2026/10/17 17:15
на 2026/10/17 17:15
Изменить комментарий:
К данной версии нет комментариев
Сводка
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
-
Вложения (0 изменено, 0 добавлено, 3 удалено)
-
Объекты (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,12 +1,19 @@ 1 1 {{velocity}} 2 2 #set($discard = $xwiki.ssx.use('A1M.App')) 3 3 #set($discard = $xwiki.jsx.use('A1M.App')) 4 -#if($request.getMethod() == 'GET') 5 -$services.a1mRead.render() 6 -#else 7 - 8 -{{a1m/}} 9 - 4 +## Keep the existing protected workflow renderer and replace its legacy overview slot. 5 +#set($rendered = $xwiki.getDocument('A1M.Renderer').getRenderedContent()) 6 +#set($legacyPanel = '<section class="panel"><div class="panel-head">01–03 · Основополагающие направления</div>') 7 +#set($start = $rendered.indexOf($legacyPanel)) 8 +#if($start >= 0) 9 + #set($end = $rendered.indexOf('</section>', $start) + 10) 10 + #set($before = $rendered.substring(0, $start)) 11 + #set($after = $rendered.substring($end)) 12 + #set($panel = $xwiki.getDocument('A1M.FoundationPanel').getRenderedContent()) 13 + #set($rendered = $before + $panel + $after) 10 10 #end 15 +{{html clean="false" wiki="false"}} 16 +$rendered 17 +{{/html}} 11 11 {{/velocity}} 12 12
- A1M-wordmark-r04.svg
-
- Автор
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.A1MTestAdmin - Размер
-
... ... @@ -1,1 +1,0 @@ 1 -1.5 MB - Содержимое
- ATLAS-wordmark-r04.svg
-
- Автор
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.A1MTestAdmin - Размер
-
... ... @@ -1,1 +1,0 @@ 1 -1.5 MB - Содержимое
- GolosText-VariableFont_wght.ttf
-
- Автор
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.A1MTestAdmin - Размер
-
... ... @@ -1,1 +1,0 @@ 1 -180.0 KB - Содержимое
- XWiki.JavaScriptExtension[0]
-
- code
-
... ... @@ -74,128 +74,3 @@ 74 74 else enhance(); 75 75 })(); 76 76 77 -/* Derived view of permission-filtered XWiki DTOs. No storage, write API or editor. */ 78 -(function (root) { 79 - 'use strict'; 80 - const roles={direct:'Прямой вклад',support:'Необходимая опора',context:'Смежный контекст',unassessed:'Не оценено',unjustified:'Связь не обоснована',unrelated:'Рассмотрено, не относится'}; 81 - function assess(record,goal) { 82 - const a=(record.assessments||[]).find(x=>x.goal===goal.id); 83 - if(!a)return {role:'unassessed',reason:'Ручная оценка для этой цели ещё не сохранена.'}; 84 - if(a.goal_revision!==goal.version||a.record_revision!==record.version)return {role:'unassessed',reason:'Оценка относится к другой редакции. Требуется пересмотр.',previous:a}; 85 - return a; 86 - } 87 - function filter(records,selected,mode='any',query='') { 88 - const norm=s=>s.toLocaleLowerCase('ru').replaceAll('ё','е'); 89 - return records.filter(r=>!r.goal&&!r.taxonomy_family&&(!query||norm([r.title,r.summary,r.id,r.search_text||''].join(' ')).includes(norm(query)))&&Object.entries(selected).every(([field,values])=>!values.length||(Array.isArray(r[field])?(mode==='all'?values.every(v=>r[field].includes(v)):values.some(v=>r[field].includes(v))):values.includes(String(r[field]))))); 90 - } 91 - function layout(records,goal,group='kind') { 92 - const keys=[...new Set(records.map(r=>Array.isArray(r[group])?(r[group][0]||'Не указано'):r[group]||'Не указано'))].sort(); 93 - const buckets=new Map(),unknown=[]; 94 - records.slice().sort((a,b)=>a.id.localeCompare(b.id)).forEach(r=>{ 95 - const a=assess(r,goal),ring=['direct','support','context'].indexOf(a.role); 96 - if(ring<0){unknown.push({record:r,assessment:a});return;} 97 - const sector=Array.isArray(r[group])?(r[group][0]||'Не указано'):r[group]||'Не указано'; 98 - const k=ring+'|'+sector;if(!buckets.has(k))buckets.set(k,[]);buckets.get(k).push({record:r,assessment:a,ring,sector}); 99 - }); 100 - const nodes=[]; 101 - for(const bucket of buckets.values())bucket.forEach((n,i)=>{ 102 - const si=keys.indexOf(n.sector),angle=-Math.PI/2+2*Math.PI*(si+(i+1)/(bucket.length+1))/keys.length; 103 - const radius=[95,185,275][n.ring]+(i%3-1)*12; 104 - nodes.push({...n,x:350+Math.cos(angle)*radius,y:350+Math.sin(angle)*radius}); 105 - }); 106 - return {nodes,unknown,sectors:keys}; 107 - } 108 - const api={roles,assess,filter,layout}; 109 - if(typeof module!=='undefined')module.exports=api; 110 - root.A1MCentre=api; 111 - if(typeof document==='undefined')return; 112 - function element(tag,text,parent,attrs={}) { 113 - const el=document.createElement(tag);if(text)el.textContent=text; 114 - for(const [k,v] of Object.entries(attrs))el.setAttribute(k,v); 115 - if(parent)parent.append(el);return el; 116 - } 117 - function svgEl(tag,attrs,parent,text) { 118 - const el=document.createElementNS('http://www.w3.org/2000/svg',tag); 119 - for(const [k,v] of Object.entries(attrs))el.setAttribute(k,String(v)); 120 - if(text)el.textContent=text;parent.append(el);return el; 121 - } 122 - function init(host) { 123 - let data; 124 - try {data=JSON.parse(host.dataset.payload);if(data.schema!=='a1m-centre/2.0')throw Error('schema');} 125 - catch {element('p','Не удалось прочитать данные. Обновите страницу; это технический сбой.',host,{role:'alert'});return;} 126 - const all=data.records,byId=new Map(all.map(r=>[r.id,r])),selected={},controls=element('div','',host,{class:'centre-filters'}); 127 - const q=element('input','',element('label','Поиск',controls),{type:'search'}); 128 - const mode=element('select','',element('label','Внутри семейства',controls)); 129 - element('option','Любое выбранное значение',mode,{value:'any'});element('option','Все выбранные значения',mode,{value:'all'}); 130 - const familyDetails=element('details','',host);element('summary','Смысловые семейства и независимые состояния',familyDetails); 131 - const familyControls=element('div','',familyDetails,{class:'centre-filters'}); 132 - const fields={...data.families,kind:'Вид',state:'Редактура',whole:'Концептуальная цельность'}; 133 - for(const [field,label] of Object.entries(fields)) { 134 - selected[field]=[]; 135 - const values=[...new Set(all.filter(r=>!r.goal&&!r.taxonomy_family).flatMap(r=>Array.isArray(r[field])?r[field]:r[field]==null?[]:[String(r[field])]))].sort(); 136 - const select=element('select','',element('label',label,familyControls),{multiple:'',size:'3','aria-label':label}); 137 - if(!values.length){element('option','Пока не указано',select,{value:''});select.disabled=true;} 138 - values.forEach(v=>element('option',field==='whole'?(v==='true'?'Цельность отмечена':'Цельность не отмечена'):(byId.get(v)?.title||v),select,{value:v})); 139 - select.addEventListener('change',()=>{selected[field]=[...select.selectedOptions].map(o=>o.value);render();}); 140 - select.dataset.field=field; 141 - } 142 - const active=element('div','',host,{class:'centre-active','aria-label':'Выбранные условия'}); 143 - const goals=all.filter(r=>r.goal),goalSelect=element('select','',element('label','Цель карты',controls)); 144 - goals.forEach(g=>element('option',g.title,goalSelect,{value:g.id})); 145 - const groupSelect=element('select','',element('label','Секторы',controls)); 146 - element('option','Вид материала',groupSelect,{value:'kind'});element('option','Основное направление',groupSelect,{value:'family_direction'}); 147 - const reset=element('button','Сбросить условия и вид',host,{type:'button'}); 148 - reset.onclick=()=>{Object.keys(selected).forEach(k=>selected[k]=[]);familyControls.querySelectorAll('select[multiple]').forEach(s=>[...s.options].forEach(o=>o.selected=false));q.value='';groupSelect.value='kind';render();}; 149 - const status=element('p','',host,{'aria-live':'polite',role:'status'}); 150 - element('p','Точка — концептуальная цельность. Она не означает истинность, публикацию или завершение проекта. Кольцо — ручная оценка вклада в выбранную цель; сила связи от неё независима.',host,{class:'centre-note'}); 151 - const output=element('div','',host); 152 - function render() { 153 - active.replaceChildren(); 154 - for(const [field,values] of Object.entries(selected))values.forEach(v=>{ 155 - const b=element('button',fields[field]+': '+(byId.get(v)?.title||v)+' ×',active,{type:'button'}); 156 - b.onclick=()=>{selected[field]=selected[field].filter(x=>x!==v);familyControls.querySelectorAll('select[multiple]').forEach(s=>{if(s.dataset.field===field)[...s.options].forEach(o=>o.selected=selected[field].includes(o.value));});render();}; 157 - }); 158 - const rows=filter(all,selected,mode.value,q.value);output.replaceChildren();status.textContent='Доступных материалов: '+rows.length; 159 - if(!rows.length)element('p','Материалы не найдены. Измените или сбросьте условия.',output); 160 - const goal=byId.get(goalSelect.value); 161 - if(host.dataset.mode==='map'&&goal) { 162 - element('h2',goal.title,output);element('p','Критерий: '+(goal.criterion||'Не указан'),output); 163 - const map=layout(rows,goal,groupSelect.value),svg=svgEl('svg',{viewBox:'0 0 700 700',class:'centre-map',role:'img','aria-label':'Три кольца вклада и подписанные секторы; полный список с объяснениями ниже'},output); 164 - const defs=svgEl('defs',{},svg),marker=svgEl('marker',{id:'centre-arrow',viewBox:'0 0 10 10',refX:9,refY:5,markerWidth:5,markerHeight:5,orient:'auto'},defs); 165 - svgEl('path',{d:'M1 1 L9 5 L1 9',fill:'none',stroke:'#596169'},marker); 166 - [120,210,300].forEach((radius,i)=>{svgEl('circle',{cx:350,cy:350,r:radius,fill:'none',stroke:'#9aa6b2','stroke-width':1},svg);svgEl('text',{x:358,y:350-radius+18},svg,roles[['direct','support','context'][i]]);}); 167 - map.sectors.forEach((key,i)=>{const angle=-Math.PI/2+i*2*Math.PI/map.sectors.length;svgEl('line',{x1:350,y1:350,x2:350+Math.cos(angle)*310,y2:350+Math.sin(angle)*310,stroke:'#ced3d8'},svg);const mid=angle+Math.PI/map.sectors.length;svgEl('text',{x:350+Math.cos(mid)*325,y:350+Math.sin(mid)*325,'text-anchor':'middle'},svg,(byId.get(key)?.title||key).slice(0,30));}); 168 - element('p','Секторы: '+map.sectors.map(k=>byId.get(k)?.title||k).join(' · '),output,{class:'centre-note'}); 169 - const placed=new Map(map.nodes.map(n=>[n.record.id,n])); 170 - (data.edges||[]).forEach(e=>{const a=placed.get(e.source),b=placed.get(e.target);if(!a||!b)return;const l=svgEl('line',{x1:a.x,y1:a.y,x2:b.x,y2:b.y,stroke:'#596169','stroke-width':e.strength?0.6+e.strength*.25:.6,...(e.direction==='forward'?{'marker-end':'url(#centre-arrow)'}:{})},svg);svgEl('title',{},l,e.type+' · '+(e.strength||'не оценена')+' · '+e.note);}); 171 - map.nodes.forEach(n=>{ 172 - const a=svgEl('a',{href:n.record.url,'aria-label':n.record.title},svg),g=svgEl('g',{transform:`translate(${n.x},${n.y})`,fill:'#fff',stroke:'#0749a9','stroke-width':1.2,class:'node-shape'},a); 173 - const kind=n.record.kind; 174 - if(kind==='Вопрос')svgEl('path',{d:'M0 -10 L10 8 L-10 8 Z'},g); 175 - else if(['Проект','План'].includes(kind))svgEl('rect',{x:-8,y:-8,width:16,height:16},g); 176 - else if(kind==='Разбор опыта')svgEl('rect',{x:-11,y:-6,width:22,height:12},g); 177 - else if(['Источник','Ресурс'].includes(kind))svgEl('path',{d:'M0 -10 L10 0 L0 10 L-10 0 Z'},g); 178 - else svgEl('circle',{cx:0,cy:0,r:9},g); 179 - if(n.record.whole)svgEl('circle',{cx:0,cy:0,r:2,fill:'#1a1a1a',stroke:'none'},g); 180 - svgEl('title',{},a,n.record.title+' · '+roles[n.assessment.role]+' · '+n.assessment.reason); 181 - svgEl('text',{x:n.x+13,y:n.y+4},a,n.record.id); 182 - }); 183 - element('p','Сектор направления использует первое указанное направление; остальные сохраняются в фильтрах. Полные названия и объяснения доступны в списке. При плотной карте пользуйтесь фильтрами.',output,{class:'centre-note'}); 184 - element('h3','Оценённые материалы',output);renderList(map.nodes.map(n=>n.record),goal); 185 - element('h3','Вне колец: не оценено / связь не обоснована / не относится',output);renderList(map.unknown.map(n=>n.record),goal); 186 - } else { 187 - if(host.dataset.mode==='map')element('p','Доступных целей нет. Создайте цель в штатном редакторе XWiki.',output); 188 - renderList(rows,null); 189 - } 190 - function renderList(items,target) { 191 - const list=element('ul','',output,{class:'centre-list'}); 192 - items.forEach(r=>{const li=element('li','',list);element('a',r.title,li,{href:r.url});element('div',r.kind+' · '+r.id+' · '+(r.whole?'● Цельность отмечена':'○ Цельность не отмечена')+' · '+({draft:'Черновик',review:'На проверке',ready:'Готово к выпуску',published:'Опубликовано'}[r.state]||r.state),li,{class:'meta'});element('p',r.summary,li);if(target){const a=assess(r,target);element('p',roles[a.role]+': '+a.reason,li);} }); 193 - } 194 - } 195 - [q,mode,goalSelect,groupSelect].forEach(el=>el.addEventListener('input',render));render(); 196 - document.querySelectorAll('.a1m-fallback-registry').forEach(el=>el.classList.add('enhanced')); 197 - } 198 - function boot(){document.querySelectorAll('#a1m-centre:not([data-initialised])').forEach(h=>{h.dataset.initialised='true';init(h);});} 199 - if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot(); 200 -})(typeof globalThis!=='undefined'?globalThis:this); 201 - - name
-
... ... @@ -1,1 +1,1 @@ 1 -A1M centre2.01 +A1M interface 1.0.1
- XWiki.StyleSheetExtension[0]
-
- code
-
... ... @@ -1,46 +1,107 @@ 1 -/* A1M / ATLAS 2.0. Scope: author centre only. Raster marks retain source viewBox. */ 2 -@font-face{font-family:"Jost";src:url(/bin/download/A1M/App/Jost-VariableFont_wght.ttf) format("truetype");font-weight:100 900;font-display:swap} 3 -@font-face{font-family:"Golos Text";src:url(/bin/download/A1M/App/GolosText-VariableFont_wght.ttf) format("truetype");font-weight:100 900;font-display:swap} 1 +.a1m-shell{--olive:#343e2d;--deep:#283023;--accent:#d9c878;--canvas:#f4f4ee;--paper:#fdfdf9;--ink:#272d23;--muted:#656d5b;--line:#d7dcd0;color:var(--ink);background:var(--canvas);font:15px/1.5 'Avenir Next','Segoe UI',Arial,sans-serif;min-height:100vh;display:grid;grid-template-columns:228px minmax(0,1fr);text-align:left} 2 +.a1m-shell *{box-sizing:border-box}.a1m-shell a{color:inherit;text-underline-offset:3px}.a1m-shell a:focus-visible,.a1m-shell button:focus-visible,.a1m-shell input:focus-visible,.a1m-shell select:focus-visible,.a1m-shell textarea:focus-visible,.a1m-shell summary:focus-visible{outline:3px solid #8b7420;outline-offset:3px}.a1m-shell .side{background:var(--olive);color:#e3e8da;padding:25px 12px;min-height:100vh}.a1m-shell .identity{padding:0 12px 23px;border-bottom:1px solid #596448;margin-bottom:18px}.a1m-shell .logo{font-size:34px;letter-spacing:-2px;text-decoration:none;display:block}.a1m-shell .logo:after{content:'';display:block;background:var(--accent);height:2px;width:30px;margin:8px 0 17px}.a1m-shell .side nav a{display:block;min-height:44px;padding:11px 12px;text-decoration:none;border-left:2px solid transparent}.a1m-shell .side nav a:hover{background:#47533c;border-left-color:var(--accent)}.a1m-shell .side small{display:block;padding:12px;color:#c8d0be;font-size:12px}.a1m-shell .workspace{min-width:0}.a1m-shell .top{height:58px;background:var(--paper);border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;padding:0 28px;gap:12px;font-size:12px}.a1m-shell .main{padding:24px 28px;max-width:1440px;margin:auto}.a1m-shell h1{font-size:28px;line-height:1.25;font-weight:500;margin:0 0 6px;overflow-wrap:anywhere}.a1m-shell h2{font-size:18px;font-weight:500;margin:0}.a1m-shell .intro{color:var(--muted);font-size:13px;margin:0 0 20px}.a1m-shell .grid{display:grid;grid-template-columns:minmax(0,1.618fr) minmax(230px,1fr);gap:18px;align-items:start}.a1m-shell .panel{background:var(--paper);border:1px solid var(--line);border-radius:3px;margin-bottom:18px;min-width:0}.a1m-shell .panel-head{padding:11px 15px;border-bottom:1px solid var(--line);background:#f8f9f3;font-size:15px}.a1m-shell .row{padding:12px 15px;border-bottom:1px solid var(--line)}.a1m-shell .row:last-child{border-bottom:0}.a1m-shell .row-title{font-size:18px;font-weight:500;text-decoration:none}.a1m-shell .summary{font-size:13px;line-height:1.6;color:#555f4a;margin:5px 0}.a1m-shell .tags{display:flex;gap:5px;flex-wrap:wrap;margin-top:8px}.a1m-shell .tag{font-size:12px;line-height:1.6;padding:1px 6px;background:#e8ecdf;border:1px solid #ccd4c2;border-radius:2px}.a1m-shell .priority{background:#f0eddd;border-color:#d7d0ad;color:#625725}.a1m-shell .filters{display:flex;align-items:end;flex-wrap:wrap;gap:9px;padding:12px 13px;border-bottom:1px solid var(--line)}.a1m-shell label{font-size:12px;color:var(--muted);display:flex;flex-direction:column;gap:4px}.a1m-shell input,.a1m-shell select,.a1m-shell textarea{font:inherit;padding:7px 9px;border:1px solid #aebba0;border-radius:3px;background:var(--paper);color:var(--ink);min-height:38px;max-width:100%}.a1m-shell .query{flex:1;min-width:180px}.a1m-shell .query input{width:100%}.a1m-shell button,.a1m-shell .button{min-height:38px;padding:7px 12px;border:1px solid #9eac8e;border-radius:3px;background:var(--paper);color:var(--ink);font:inherit;font-size:13px;display:inline-flex;align-items:center;justify-content:center;text-decoration:none;cursor:pointer}.a1m-shell .button.primary,.a1m-shell button.primary{background:#47533c;color:white}.a1m-shell .actions{display:flex;gap:8px;flex-wrap:wrap;margin:15px 0}.a1m-shell .registry-row{display:grid;grid-template-columns:92px minmax(0,1fr) 135px;gap:10px;align-items:start;padding:12px 15px;border-bottom:1px solid #e8ebe2}.a1m-shell .registry-row a{font-size:15px;text-decoration:none}.a1m-shell .meta{font-size:12px;color:var(--muted)}.a1m-shell .message{padding:16px;border-left:2px solid var(--accent);background:#ecefdf;margin:12px 0}.a1m-shell .reading{max-width:72ch;font-size:17px;line-height:1.7;padding:24px 28px;background:var(--paper);border:1px solid var(--line);overflow-wrap:anywhere}.a1m-shell .reading h2{font-size:21px;margin:24px 0 10px}.a1m-shell .form{display:grid;gap:14px;max-width:74ch}.a1m-shell .form textarea{min-height:160px}.a1m-shell .menu{display:none}.a1m-shell .error{border-left:3px solid #8d351f;padding:12px;background:#fff2e9}.a1m-shell .skip{position:absolute;left:-9999px}.a1m-shell .skip:focus{left:240px;top:5px;background:var(--accent);padding:10px;z-index:1000} 3 +body:has(.a1m-shell){margin:0;background:#f4f4ee}body:has(.a1m-shell) #headerglobal,body:has(.a1m-shell) #footerglobal,body:has(.a1m-shell) #contentmenu,body:has(.a1m-shell) #hierarchy,body:has(.a1m-shell) #document-title,body:has(.a1m-shell) #document-info,body:has(.a1m-shell) #xdocFooter{display:none}body:has(.a1m-shell) #xwikimaincontainer,body:has(.a1m-shell) #xwikimaincontainerinner,body:has(.a1m-shell) #xwikicontent{padding:0;margin:0;max-width:none;width:auto}body:has(.a1m-shell) #contentcolumn{width:100%;float:none;padding:0} 4 +@media(max-width:800px){.a1m-shell{display:block}.a1m-shell .side{display:none;min-height:0}.a1m-shell:has(#a1m-menu:checked) .side{display:block}.a1m-shell .menu{display:inline-flex;min-height:44px;align-items:center;cursor:pointer}.a1m-shell .main{padding:20px 16px}.a1m-shell .top{padding:0 16px}.a1m-shell .grid{grid-template-columns:1fr}.a1m-shell .registry-row{grid-template-columns:minmax(0,1fr)}.a1m-shell input,.a1m-shell select,.a1m-shell textarea{font-size:16px;min-height:44px}.a1m-shell button,.a1m-shell .button{min-height:44px}.a1m-shell .reading{padding:20px 16px}.a1m-shell h1{font-size:25px}.a1m-shell .skip:focus{left:4px}.a1m-shell .filters>*{max-width:100%}} 5 +@media print{.a1m-shell{display:block}.a1m-shell .side,.a1m-shell .top,.a1m-shell .actions,.a1m-shell .filters{display:none}.a1m-shell .main{padding:0}.a1m-shell .reading{max-width:none;border:0}} 4 4 5 -.a1m-shell{--ink:#1a1a1a;--muted:#596169;--line:#ced3d8;--paper:#fff;--blue:#0749a9;--amber:#fbbd5b;color:var(--ink);background:#fafbf9;font:15px/1.65 "Golos Text",sans-serif;display:grid;grid-template-columns:224px minmax(0,1fr);min-height:100vh;text-align:left} 6 -.a1m-shell *{box-sizing:border-box}.a1m-shell a{color:inherit;text-underline-offset:4px}.a1m-shell :is(a,button,input,select,textarea,summary):focus-visible{outline:2px solid var(--blue);outline-offset:4px}.a1m-shell .side{border-right:1px solid var(--line);padding:36px 22px;background:#fff}.a1m-shell .logo{display:block;width:140px;margin-bottom:24px}.a1m-shell .logo svg{display:block;width:100%;height:auto}.a1m-shell .identity div{font-size:12px;color:var(--muted)}.a1m-shell .identity{padding-bottom:24px;border-bottom:1px solid var(--amber)}.a1m-shell nav{margin:22px 0}.a1m-shell .side nav a{display:block;padding:9px 0;text-decoration:none;min-height:44px}.a1m-shell .side nav a:hover,.a1m-shell .side nav a[aria-current=page]{color:var(--blue)}.a1m-shell small,.a1m-shell .meta,.a1m-shell .summary{color:var(--muted);font-size:12px}.a1m-shell .workspace{min-width:0}.a1m-shell .top{padding:16px 32px;display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--line);background:#fff;min-height:64px}.a1m-shell .main{max-width:1440px;margin:auto;padding:40px 36px;width:100%;min-width:0}.a1m-shell h1,.a1m-shell h2,.a1m-shell h3{font-family:Jost,sans-serif;font-weight:450;line-height:1.16;overflow-wrap:anywhere}.a1m-shell h1{font-size:clamp(30px,4vw,48px);letter-spacing:-.025em;margin:0 0 18px}.a1m-shell h2{font-size:25px;margin:20px 0 12px}.a1m-shell h3{font-size:20px}.a1m-shell .intro{max-width:64ch;color:var(--muted);margin-bottom:28px}.a1m-shell .grid{display:grid;grid-template-columns:1.5fr 1fr;gap:28px}.a1m-shell .panel{background:#fff;border:1px solid var(--line);margin-bottom:24px;min-width:0;overflow-wrap:anywhere}.a1m-shell .panel-head,.a1m-shell .row{padding:16px 20px;margin:0;border-bottom:1px solid var(--line)}.a1m-shell .panel-head{font-family:Jost;font-size:20px}.a1m-shell .row-title{font-size:20px}.a1m-shell .registry-row{display:grid;grid-template-columns:100px minmax(0,1fr) 130px;gap:20px;padding:20px;border-top:1px solid var(--line);overflow-wrap:anywhere}.a1m-shell .registry-row a{font-family:Jost;font-size:21px;text-decoration:none}.a1m-shell .registry-row .summary{margin:7px 0 0;font-size:13px}.a1m-shell .tag{font-size:12px;color:var(--muted)}.a1m-shell .filters{display:flex;flex-wrap:wrap;gap:16px;padding:20px;border-bottom:1px solid var(--line);align-items:end}.a1m-shell label{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--muted)}.a1m-shell :is(input,select,textarea,button,.button){font:inherit;max-width:100%;min-height:44px;border:1px solid #9aa6b2;border-radius:0;padding:9px 12px;background:#fff;color:var(--ink)}.a1m-shell input[type=checkbox]{min-height:18px;width:18px}.a1m-shell select{min-width:120px}.a1m-shell button,.a1m-shell .button{cursor:pointer;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;justify-content:center}.a1m-shell .primary{background:var(--blue);color:#fff;border-color:var(--blue)}.a1m-shell .actions{display:flex;flex-wrap:wrap;gap:12px;margin:20px 0}.a1m-shell .form{display:grid;gap:20px;padding:24px;max-width:80ch}.a1m-shell .form textarea{min-height:100px}.a1m-shell .reading{font-size:17px;line-height:1.8;max-width:74ch;padding:28px;background:#fff;border:1px solid var(--line);overflow-wrap:anywhere}.a1m-shell .reading :is(table,pre){display:block;max-width:100%;overflow:auto}.a1m-shell .reading img{max-width:100%;height:auto}.a1m-shell .article-toc{max-width:74ch;padding:20px;border:1px solid var(--line)}.a1m-shell .message,.a1m-shell .error{padding:20px;border-left:2px solid var(--amber);background:#fff}.a1m-shell .error{border-color:#d63031}.a1m-shell .skip{position:absolute;left:-9999px}.a1m-shell .skip:focus{left:8px;top:8px;z-index:50;background:#fff}.a1m-shell .menu,.a1m-shell .menu-toggle{display:none}.a1m-shell .centre-filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(155px,1fr));gap:16px;margin:24px 0}.a1m-shell .centre-filters label{min-width:0}.a1m-shell .centre-filters select{width:100%;min-width:0}.a1m-shell .centre-active{display:flex;flex-wrap:wrap;gap:8px}.a1m-shell .centre-map{width:100%;height:auto;display:block;background:#fff}.a1m-shell .centre-map text{font:13px "Golos Text",sans-serif;fill:var(--ink)}.a1m-shell .centre-map a:focus{outline:none}.a1m-shell .centre-map a:focus .node-shape{stroke-width:3}.a1m-shell .centre-list li{margin:16px 0;overflow-wrap:anywhere}.a1m-shell .centre-note{max-width:80ch;color:var(--muted);font-size:13px}.a1m-shell .product-mark{width:155px;display:block;margin:24px 0}.a1m-shell .product-mark svg{width:100%;height:auto}.a1m-shell .a1m-fallback-registry.enhanced{display:none} 7 -body:has(.a1m-shell){margin:0}body:has(.a1m-shell) :is(#headerglobal,#footerglobal,#contentmenu,#hierarchy,#document-title,#document-info,#xdocFooter,#menuview,#hierarchy_breadcrumb,#leftPanels,#rightPanels,#leftPanelsToggle,#rightPanelsToggle){display:none}body:has(.a1m-shell:not(.a1m-native-extra)) #xwikidata{display:none}body:has(.a1m-shell) :is(#xwikimaincontainer,#xwikimaincontainerinner,#xwikicontent,#contentcontainer,#mainContentArea,#contentcolumn){padding:0!important;margin:0!important;max-width:none!important;width:100%!important;border:0;float:none}body:has(.a1m-shell) #mainContentArea>.document-header{display:none} 8 -@media(max-width:800px){.a1m-shell{display:block}.a1m-shell .side{display:none}.a1m-shell:has(#a1m-menu:checked) .side{display:block}.a1m-shell .menu{display:block;cursor:pointer}.a1m-shell .menu-toggle{display:block;position:absolute;clip-path:inset(50%);width:1px;height:1px;min-height:0}.a1m-shell:has(.menu-toggle:focus-visible) .menu{outline:2px solid var(--blue)}.a1m-shell .main{padding:24px 16px}.a1m-shell .top{padding:12px 16px}.a1m-shell .grid,.a1m-shell .registry-row{grid-template-columns:1fr}.a1m-shell .reading{padding:20px 16px}.a1m-shell :is(input,select,textarea){font-size:16px}.a1m-shell .centre-map text{font-size:15px}} 9 -@media(prefers-reduced-motion:reduce){.a1m-shell *{scroll-behavior:auto!important;animation:none!important;transition:none!important}}@media print{.a1m-shell{display:block}.a1m-shell :is(.side,.top,.filters,.actions){display:none}.a1m-shell .reading{border:0}} 7 +.a1m-shell .menu-toggle{display:none}.a1m-shell .article-toc{padding:14px 18px;max-width:72ch;background:var(--paper);border:1px solid var(--line);margin-bottom:15px}.a1m-shell .reading table{display:block;max-width:100%;overflow-x:auto}.a1m-shell .reading img{max-width:100%;height:auto} 8 +@media(max-width:800px){.a1m-shell .menu-toggle{display:block;position:absolute;clip-path:inset(50%);width:1px;height:1px;min-height:0;max-height:1px;overflow:hidden;white-space:nowrap}.a1m-shell:has(#a1m-menu:focus-visible) .menu{outline:3px solid #8b7420;outline-offset:3px}} 10 10 11 -.a1m-shell .a1m-wordmark{display:block;width:100%;aspect-ratio:498/173;background:url("/bin/download/A1M/App/A1M-wordmark-r04.svg") center/contain no-repeat} 10 +/* IDs verified in the native full Flamingo response. Native editors/login have no a1m-shell. */ 11 +body:has(.a1m-shell) #menuview,body:has(.a1m-shell) #hierarchy_breadcrumb,body:has(.a1m-shell) #leftPanels,body:has(.a1m-shell) #rightPanels,body:has(.a1m-shell) #leftPanelsToggle,body:has(.a1m-shell) #rightPanelsToggle{display:none} 12 +body:has(.a1m-shell:not(.a1m-native-extra)) #xwikidata{display:none} 13 +body:has(.a1m-shell) #contentcontainer,body:has(.a1m-shell) #mainContentArea{padding:0;margin:0;max-width:none;width:auto;border:0} 12 12 13 -.a1m-shell .atlas-wordmark{display:block;width:100%;aspect-ratio:776/188;background:url("/bin/download/A1M/App/ATLAS-wordmark-r04.svg") center/contain no-repeat} 14 - 15 -/* A1M fallback filter repair D1. Append to the existing A1M.App SSX code only. */ 16 -.a1m-shell .a1m-fallback-registry .filters{ 17 - display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr)); 18 - gap:16px;align-items:end;min-width:0; 15 +/* A1M 1.0.1: isolate the application from Flamingo's columns and Bootstrap rows. */ 16 +@font-face{font-family:Jost;src:url('/bin/download/A1M/App/Jost-VariableFont_wght.ttf') format('truetype');font-weight:100 900;font-style:normal;font-display:swap} 17 +html:has(.a1m-shell){scroll-padding-top:76px} 18 +body:has(.a1m-shell){font-family:Jost,'Avenir Next','Segoe UI',Arial,sans-serif} 19 +body:has(.a1m-shell) #contentcontainer{display:block!important;min-width:0} 20 +body:has(.a1m-shell) #contentcolumn{width:100%!important;max-width:none!important;flex:none;float:none;margin:0;padding:0;min-width:0} 21 +body:has(.a1m-shell) #contentcolumn>.main{padding:0!important;margin:0;border:0;background:transparent;position:static} 22 +body:has(.a1m-shell) #mainContentArea{margin:0!important;padding:0!important;border:0;box-shadow:none;background:transparent} 23 +body:has(.a1m-shell) #mainContentArea>.document-header, 24 +body:has(.a1m-shell) #mainContentArea>hr{display:none} 25 +body:has(.a1m-shell) #mainContentArea>.row:not(.document-header){margin:0;display:block} 26 +body:has(.a1m-shell) #xwikicontent{position:static;float:none;width:100%;margin:0;padding:0;overflow:visible} 27 +body:has(.a1m-shell) #xwikimaincontainer, 28 +body:has(.a1m-shell) #xwikimaincontainerinner{width:100%;min-width:0;max-width:none;margin:0;padding:0} 29 +body:has(.a1m-shell) #mainContentArea .a1m-shell{font:15px/1.5 Jost,'Avenir Next','Segoe UI',Arial,sans-serif;min-height:100vh;grid-template-columns:228px minmax(0,1fr)} 30 +body:has(.a1m-shell) #mainContentArea .a1m-shell .main{padding:24px 28px 36px!important;margin:0 auto;position:static;width:100%;max-width:1440px} 31 +.a1m-shell .side{position:sticky;top:0;height:100vh;min-height:0;overflow-y:auto;padding:26px 12px 20px} 32 +.a1m-shell .side .identity{padding-bottom:22px} 33 +.a1m-shell .side .logo{color:#fdfdf9;font-weight:500;line-height:1;text-decoration:none} 34 +.a1m-shell .side nav a{font-size:14px;line-height:1.5;min-height:42px;padding:10px 12px} 35 +.a1m-shell .side nav a[aria-current=page]{color:#fff;background:#4b563e;border-left-color:#d9c878} 36 +.a1m-shell .side small{font-size:11px;line-height:1.65;margin-top:18px} 37 +.a1m-shell .workspace{width:100%;min-width:0} 38 +.a1m-shell .top{position:sticky;top:0;z-index:20;min-height:58px;height:auto;padding:10px 28px} 39 +.a1m-shell .top .session{margin:0} 40 +.a1m-shell h1{letter-spacing:-.025em;font-size:28px;line-height:1.2;margin:0 0 6px;font-weight:500} 41 +.a1m-shell .intro{font-size:13px;line-height:1.6;margin:0 0 20px} 42 +.a1m-shell .grid{display:grid;gap:18px;grid-template-columns:minmax(0,1.618fr) minmax(280px,1fr)} 43 +.a1m-shell .panel{border:1px solid var(--line);border-radius:3px;box-shadow:none;background:var(--paper);overflow-wrap:anywhere;margin:0 0 18px} 44 +.a1m-shell .panel-head{font-size:15px;font-weight:500;padding:11px 15px;min-height:45px;line-height:1.5} 45 +.a1m-shell .row{margin:0;display:block;float:none;padding:12px 15px;width:auto;line-height:1.55} 46 +.a1m-shell .row-title{font-size:18px;line-height:1.35;font-weight:500;text-decoration:none} 47 +.a1m-shell .row-title:hover,.a1m-shell .registry-row a:hover{text-decoration:underline} 48 +.a1m-shell .summary{font-size:13px;line-height:1.55;margin:5px 0;color:#555f4a} 49 +.a1m-shell .tags{display:flex;gap:5px;flex-wrap:wrap;margin-top:8px} 50 +.a1m-shell .tag{display:inline-flex;width:auto;max-width:100%;align-items:center;font-size:11px;line-height:1.55;padding:2px 6px;border-radius:2px} 51 +.a1m-shell .filters{gap:10px;align-items:flex-end;padding:13px 15px} 52 +.a1m-shell .filters label{display:flex;flex-direction:column;font-weight:400;font-size:12px;line-height:1.5;margin:0;min-width:110px;gap:5px} 53 +.a1m-shell .filters label.query{min-width:210px;flex:1 1 250px} 54 +.a1m-shell input,.a1m-shell textarea,.a1m-shell select{font-family:inherit;font-weight:400;font-size:14px;line-height:1.4;margin:0;border:1px solid #bdc6b0;box-shadow:none;border-radius:3px;background:var(--paper)} 55 +.a1m-shell input::placeholder,.a1m-shell textarea::placeholder{color:#737b68;font-weight:400;opacity:1} 56 +.a1m-shell .filters select{min-height:36px;max-width:190px} 57 +.a1m-shell .filters select[multiple]{min-width:140px} 58 +.a1m-shell .filters>button{min-height:36px} 59 +.a1m-shell .filters>a{font-size:12px;padding:9px 0;white-space:nowrap} 60 +.a1m-shell .theme-options{flex:1 0 100%;border:0;padding:0;margin:0;min-width:0;display:flex;flex-wrap:wrap;gap:4px 14px;align-items:center} 61 +.a1m-shell .theme-options legend{font:400 12px/1.5 Jost,'Avenir Next',Arial,sans-serif;color:var(--muted);padding:0;margin:0 0 4px;float:none;width:100%;border:0} 62 +.a1m-shell .theme-options label{display:inline-flex;flex-direction:row;align-items:center;gap:6px;min-width:0;min-height:32px;font-size:12px;cursor:pointer} 63 +.a1m-shell .theme-options input[type=checkbox]{width:15px;height:15px;min-height:0;margin:0;padding:0;accent-color:var(--olive);flex:0 0 auto} 64 +.a1m-shell .theme-options button{font-size:11px;min-height:28px;padding:3px 7px;border-color:transparent;text-decoration:underline;color:var(--muted);background:transparent} 65 +.a1m-shell .registry-row{margin:0;display:grid;grid-template-columns:96px minmax(0,1fr) 138px;gap:12px;padding:11px 15px;line-height:1.5} 66 +.a1m-shell .registry-row a{font-size:14px;line-height:1.5;text-decoration:none} 67 +.a1m-shell .registry-row .summary{font-size:12px;margin:4px 0 0} 68 +.a1m-shell .registry-row .tag{justify-self:start;max-width:100%} 69 +.a1m-shell .actions{gap:8px;margin:0 0 20px} 70 +.a1m-shell .button,.a1m-shell button{font-family:inherit;font-weight:400;font-size:13px;line-height:1.5;min-height:36px;padding:7px 11px} 71 +.a1m-shell form.form{display:grid;padding:18px;gap:16px;max-width:780px} 72 +.a1m-shell .form label{display:flex;flex-direction:column;gap:6px;font-size:13px;font-weight:400;margin:0} 73 +.a1m-shell .form input,.a1m-shell .form select,.a1m-shell .form textarea{width:100%} 74 +.a1m-shell .form label textarea[name=summary]{min-height:80px} 75 +.a1m-shell .form .primary{justify-self:start} 76 +.a1m-shell .reading{max-width:74ch;font-size:17px;line-height:1.7;padding:24px 28px} 77 +.a1m-shell .reading p{margin:0 0 1em} 78 +.a1m-shell .reading pre{white-space:pre-wrap;overflow-wrap:anywhere} 79 +.a1m-shell .article-toc{max-width:74ch} 80 +.a1m-native-form{font:15px/1.5 Jost,'Avenir Next','Segoe UI',Arial,sans-serif;max-width:900px} 81 +.a1m-native-form .xform{margin:14px 0} 82 +.a1m-native-form .xform>label{font-weight:500;display:block;margin:0 0 5px} 83 +.a1m-native-form input[type=text],.a1m-native-form textarea{max-width:100%;width:100%} 84 +@media(max-width:1150px){.a1m-shell .grid{grid-template-columns:1fr}} 85 +@media(max-width:800px){ 86 + body:has(.a1m-shell) #mainContentArea .a1m-shell{display:block} 87 + .a1m-shell .side{position:static;height:auto;min-height:0;display:none;overflow:visible} 88 + .a1m-shell:has(#a1m-menu:checked) .side{display:block} 89 + .a1m-shell .top{min-height:58px;padding:7px 16px} 90 + body:has(.a1m-shell) #mainContentArea .a1m-shell .main{padding:20px 16px 28px!important} 91 + .a1m-shell .grid{grid-template-columns:1fr} 92 + .a1m-shell .filters{padding:12px;gap:10px} 93 + .a1m-shell .filters label{flex:1 1 130px;min-width:0} 94 + .a1m-shell .filters label.query{flex:1 0 100%;min-width:0} 95 + .a1m-shell .filters select{max-width:none;width:100%;min-height:44px;font-size:16px} 96 + .a1m-shell .theme-options label{flex:none;min-height:44px;font-size:13px} 97 + .a1m-shell .theme-options button{min-height:44px} 98 + .a1m-shell input,.a1m-shell textarea{font-size:16px;min-height:44px} 99 + .a1m-shell .button,.a1m-shell button{min-height:44px} 100 + .a1m-shell .registry-row{grid-template-columns:minmax(0,1fr);gap:4px;padding:12px} 101 + .a1m-shell .registry-row .meta{font-size:11px} 102 + .a1m-shell .registry-row a{font-size:15px} 103 + .a1m-shell .reading{padding:18px 16px;font-size:17px} 104 + .a1m-shell .form{padding:14px} 19 19 } 20 -.a1m-shell .a1m-fallback-registry .filters>*{min-width:0;max-width:100%;margin:0} 21 -.a1m-shell .a1m-fallback-registry .filters>.query{ 22 - grid-column:1/-1;width:100%;display:flex;flex-direction:column; 23 -} 24 -.a1m-shell .a1m-fallback-registry .filters>.query input{width:100%;min-width:0;box-sizing:border-box} 25 -.a1m-shell .a1m-fallback-registry .filters :is(fieldset.theme-filter,fieldset.theme-options){ 26 - grid-column:1/-1;display:flex;flex-flow:row wrap;align-items:center;gap:8px 16px; 27 - width:100%;min-width:0;border:0;padding:0;margin:0; 28 -} 29 -.a1m-shell .a1m-fallback-registry .filters :is(.theme-filter,.theme-options)>legend{ 30 - float:none;display:block;width:100%;max-width:100%;margin:0 0 6px;padding:0; 31 - border:0;font:inherit;color:var(--muted,#596169);line-height:1.4; 32 -} 33 -.a1m-shell .a1m-fallback-registry .filters :is(.theme-filter,.theme-options) label{ 34 - display:inline-flex;flex:0 1 auto;flex-direction:row;align-items:center;gap:8px; 35 - min-width:0;max-width:100%;margin:0;overflow-wrap:anywhere; 36 -} 37 -.a1m-shell .a1m-fallback-registry .filters :is(.theme-filter,.theme-options) input[type=checkbox]{ 38 - flex:0 0 18px;width:18px;height:18px;min-height:18px;margin:0; 39 -} 40 -.a1m-shell .a1m-fallback-registry .filters>label:not(.query){display:flex;flex-direction:column;width:100%} 41 -.a1m-shell .a1m-fallback-registry .filters>label select{width:100%;min-width:0;box-sizing:border-box} 42 -@media(max-width:600px){ 43 - .a1m-shell .a1m-fallback-registry .filters{grid-template-columns:minmax(0,1fr);gap:14px;padding:16px} 44 - .a1m-shell .a1m-fallback-registry .filters :is(.theme-filter,.theme-options){gap:10px 16px} 45 -} 106 +@media print{.a1m-shell .side,.a1m-shell .top,.a1m-shell .filters,.a1m-shell .actions{display:none!important}body:has(.a1m-shell) #mainContentArea .a1m-shell{display:block}.a1m-shell .reading{border:0;max-width:none}} 46 46 - name
-
... ... @@ -1,1 +1,1 @@ 1 -A1M centre2.01 +A1M interface 1.0.1