@devoplus/one-sdk 0.0.0-stage → 0.2.0-next.112
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/CHANGELOG.md +268 -0
- package/README.md +894 -2
- package/bin/accessRequest.d.mts +96 -0
- package/bin/accessRequest.mjs +340 -0
- package/bin/appOps.d.mts +97 -0
- package/bin/appOps.mjs +336 -0
- package/bin/dataCommand.mjs +131 -0
- package/bin/devConfig.mjs +132 -0
- package/bin/one.mjs +341 -0
- package/bin/session.mjs +239 -0
- package/dist/agentInput.d.ts +9 -0
- package/dist/agentInput.d.ts.map +1 -0
- package/dist/agentInput.js +102 -0
- package/dist/agentInput.js.map +1 -0
- package/dist/agentTools.d.ts +83 -0
- package/dist/agentTools.d.ts.map +1 -0
- package/dist/agentTools.js +164 -0
- package/dist/agentTools.js.map +1 -0
- package/dist/ai.d.ts +67 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +129 -0
- package/dist/ai.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +58 -0
- package/dist/audit.js.map +1 -0
- package/dist/backend.d.ts +27 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +63 -0
- package/dist/backend.js.map +1 -0
- package/dist/cache.d.ts +20 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +84 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +469 -0
- package/dist/client.js.map +1 -0
- package/dist/components.d.ts +235 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +1491 -0
- package/dist/components.js.map +1 -0
- package/dist/context.d.ts +110 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/data/crud.d.ts +74 -0
- package/dist/data/crud.d.ts.map +1 -0
- package/dist/data/crud.js +614 -0
- package/dist/data/crud.js.map +1 -0
- package/dist/data/ddl.d.ts +76 -0
- package/dist/data/ddl.d.ts.map +1 -0
- package/dist/data/ddl.js +362 -0
- package/dist/data/ddl.js.map +1 -0
- package/dist/data/fold.d.ts +14 -0
- package/dist/data/fold.d.ts.map +1 -0
- package/dist/data/fold.js +76 -0
- package/dist/data/fold.js.map +1 -0
- package/dist/data/model.d.ts +113 -0
- package/dist/data/model.d.ts.map +1 -0
- package/dist/data/model.js +408 -0
- package/dist/data/model.js.map +1 -0
- package/dist/data/values.d.ts +29 -0
- package/dist/data/values.d.ts.map +1 -0
- package/dist/data/values.js +152 -0
- package/dist/data/values.js.map +1 -0
- package/dist/dexa.d.ts +44 -0
- package/dist/dexa.d.ts.map +1 -0
- package/dist/dexa.js +74 -0
- package/dist/dexa.js.map +1 -0
- package/dist/dexaCommand.d.ts +116 -0
- package/dist/dexaCommand.d.ts.map +1 -0
- package/dist/dexaCommand.js +226 -0
- package/dist/dexaCommand.js.map +1 -0
- package/dist/export/columns.d.ts +62 -0
- package/dist/export/columns.d.ts.map +1 -0
- package/dist/export/columns.js +127 -0
- package/dist/export/columns.js.map +1 -0
- package/dist/export/csv.d.ts +10 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/csv.js +30 -0
- package/dist/export/csv.js.map +1 -0
- package/dist/export/report.d.ts +19 -0
- package/dist/export/report.d.ts.map +1 -0
- package/dist/export/report.js +91 -0
- package/dist/export/report.js.map +1 -0
- package/dist/export/response.d.ts +14 -0
- package/dist/export/response.d.ts.map +1 -0
- package/dist/export/response.js +70 -0
- package/dist/export/response.js.map +1 -0
- package/dist/export/xlsx.d.ts +15 -0
- package/dist/export/xlsx.d.ts.map +1 -0
- package/dist/export/xlsx.js +167 -0
- package/dist/export/xlsx.js.map +1 -0
- package/dist/export/zip.d.ts +7 -0
- package/dist/export/zip.d.ts.map +1 -0
- package/dist/export/zip.js +83 -0
- package/dist/export/zip.js.map +1 -0
- package/dist/files.d.ts +52 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +137 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +57 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +157 -0
- package/dist/jobs.js.map +1 -0
- package/dist/log.d.ts +22 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +107 -0
- package/dist/log.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +11 -0
- package/dist/notify.js.map +1 -0
- package/dist/org.d.ts +184 -0
- package/dist/org.d.ts.map +1 -0
- package/dist/org.js +114 -0
- package/dist/org.js.map +1 -0
- package/dist/people.d.ts +39 -0
- package/dist/people.d.ts.map +1 -0
- package/dist/people.js +88 -0
- package/dist/people.js.map +1 -0
- package/dist/problem.d.ts +12 -0
- package/dist/problem.d.ts.map +1 -0
- package/dist/problem.js +33 -0
- package/dist/problem.js.map +1 -0
- package/dist/runtime.d.ts +92 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +8 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scenarios.d.ts +125 -0
- package/dist/scenarios.d.ts.map +1 -0
- package/dist/scenarios.js +251 -0
- package/dist/scenarios.js.map +1 -0
- package/package.json +55 -3
package/dist/client.js
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
// Tarayıcı köprüsü ve görsel dil (D-76). Uygulamanın sayfası iki dosyayı KENDİ origin'inden yükler:
|
|
2
|
+
// <link rel="stylesheet" href="/one-ui.css"> açık/koyu değişkenler + temel bileşenler (U5)
|
|
3
|
+
// <script src="/one-bridge.js"></script> `window.one` — Portal ile konuşan istemci
|
|
4
|
+
// Uygulamanın sunucu tarafı ikisini `clientAssetResponse(pathname)` ile sunar. Satır içi betik platformda KAPALIDIR
|
|
5
|
+
// (`script-src 'self'`); sayfanın kendi betiği de ayrı dosyadan gelir (`scriptResponse`).
|
|
6
|
+
//
|
|
7
|
+
// Hazır arayüz bileşenleri (D-83) üçüncü dosyadır: `<script src="/one-components.js"></script>` (köprüden SONRA).
|
|
8
|
+
//
|
|
9
|
+
// Köprü sözleşmesi (Portal aynı sözleşmeyi uygular — DEĞİŞTİRMEDEN önce Portal ile birlikte değiştirin):
|
|
10
|
+
// uygulama → Portal (yalnız `?parent=` origin'lerine; joker hedef YOK)
|
|
11
|
+
// one:ready · one:navigation { items: [{ path, label: { tr, en? } }] } (≤ 12; tekrar gönderilebilir, son ileti
|
|
12
|
+
// geçerlidir) · one:route { path } · one:resize { height }
|
|
13
|
+
// one:title { title | null } (≤ 120) · one:toast { severity, summary, detail? } · one:confirm { id, message, title?,
|
|
14
|
+
// severity?, acceptLabel?, rejectLabel? } · one:download { name, mime, data: ArrayBuffer } (≤ 25 MB)
|
|
15
|
+
// one:open-external { url } (yalnız https) · one:dirty { dirty }
|
|
16
|
+
// Portal → uygulama (kaynak origin DOĞRULANIR)
|
|
17
|
+
// one:token { token, expiresAt } · one:context { theme, lang, autoHeight, actor: { kind } | null, design? }
|
|
18
|
+
// one:navigate { path } · one:viewport { top, height } · one:confirm-result { id, accepted }
|
|
19
|
+
// Bütün metinler DÜZ METİNDİR (HTML değil); Portal onları HTML olarak yorumlamaz.
|
|
20
|
+
import { COMPONENTS_SCRIPT_PATH, ONE_COMPONENTS_SCRIPT } from './components.js';
|
|
21
|
+
/** Köprü betiğinin ve görsel dil dosyasının uygulama içindeki yolu. */
|
|
22
|
+
export const BRIDGE_SCRIPT_PATH = '/one-bridge.js';
|
|
23
|
+
export const UI_CSS_PATH = '/one-ui.css';
|
|
24
|
+
/** Portal'ın çizdiği menüde en çok öğe (manifest `navigation` tavanıyla aynı). */
|
|
25
|
+
export const NAVIGATION_MAX_ITEMS = 12;
|
|
26
|
+
/** Sayfa başlığı (`one:title`) tavanı; uzunu kesilir. */
|
|
27
|
+
export const TITLE_MAX_LENGTH = 120;
|
|
28
|
+
/** `one:download` ile Portal'a verilebilecek en büyük dosya. */
|
|
29
|
+
export const DOWNLOAD_MAX_BYTES = 25 * 1024 * 1024;
|
|
30
|
+
/** Uygulama içi yol (manifest `navigation[].path` ile aynı kural): `/` ya da `/` ile ayrılmış parçalar; sorgu/`#`/`..` yok. */
|
|
31
|
+
export const ROUTE_PATH_RE = /^\/(?:[A-Za-z0-9_-][A-Za-z0-9._-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9._-]*)*)?$/;
|
|
32
|
+
const ROUTE_PATH_MAX_LENGTH = 200;
|
|
33
|
+
/** Uygulama izin kodu (manifest `PERMISSION_CODE_RE` ile aynı): `One.<Uygulama>.<Eylem>`. */
|
|
34
|
+
export const NAVIGATION_PERMISSION_RE = /^One\.[A-Z][A-Za-z0-9]*\.[A-Z][A-Za-z0-9]*$/;
|
|
35
|
+
/**
|
|
36
|
+
* Kullanıcıya görünecek sekmeler (S10): izinsiz sekme herkese, izinli sekme yalnız izni taşıyana ve yöneticiye. Erişim
|
|
37
|
+
* bilinmiyorsa (`null` — oturum henüz okunmadı) yalnız izinsiz sekmeler. Dönen öğeler `permission` TAŞIMAZ (Portal
|
|
38
|
+
* sözleşmesi `{ path, label }`).
|
|
39
|
+
*/
|
|
40
|
+
export function visibleNavigation(items, access) {
|
|
41
|
+
return items
|
|
42
|
+
.filter((item) => item.permission === undefined || (access !== null && (access.admin === true || access.permissions.includes(item.permission))))
|
|
43
|
+
.map((item) => ({ path: item.path, label: item.label.en === undefined ? { tr: item.label.tr } : { tr: item.label.tr, en: item.label.en } }));
|
|
44
|
+
}
|
|
45
|
+
/** Uygulama içi yol geçerli mi (manifest `navigation[].path` kuralı)? */
|
|
46
|
+
export function isRoutePath(path) {
|
|
47
|
+
return typeof path === 'string' && path.length <= ROUTE_PATH_MAX_LENGTH && ROUTE_PATH_RE.test(path);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Manifest'in `navigation` alanından Portal'a bildirilecek menü (one-ci aynı kuralı yayından önce doğrular). Bozuk öğe
|
|
51
|
+
* atlanır, yinelenen yol bir kez alınır, en çok `NAVIGATION_MAX_ITEMS`. Sunucu tarafı bunu sayfa betiğine gömer.
|
|
52
|
+
* `permission` korunur (biçimi bozuksa öğe ATLANIR — sekme herkese açılmasın diye); süzme köprüdedir.
|
|
53
|
+
*/
|
|
54
|
+
export function navigationFromManifest(manifest) {
|
|
55
|
+
const raw = manifest?.navigation;
|
|
56
|
+
if (!Array.isArray(raw))
|
|
57
|
+
return [];
|
|
58
|
+
const out = [];
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
for (const item of raw) {
|
|
61
|
+
const path = item?.path;
|
|
62
|
+
const label = item?.label;
|
|
63
|
+
if (!isRoutePath(path) || seen.has(path))
|
|
64
|
+
continue;
|
|
65
|
+
if (typeof label?.tr !== 'string' || label.tr.trim() === '')
|
|
66
|
+
continue;
|
|
67
|
+
const tr = label.tr.trim();
|
|
68
|
+
const en = typeof label.en === 'string' && label.en.trim() !== '' ? label.en.trim() : undefined;
|
|
69
|
+
const permission = item.permission;
|
|
70
|
+
if (permission !== undefined && (typeof permission !== 'string' || !NAVIGATION_PERMISSION_RE.test(permission)))
|
|
71
|
+
continue;
|
|
72
|
+
const entry = { path, label: en === undefined ? { tr } : { tr, en } };
|
|
73
|
+
if (permission !== undefined)
|
|
74
|
+
entry.permission = permission;
|
|
75
|
+
out.push(entry);
|
|
76
|
+
seen.add(path);
|
|
77
|
+
if (out.length === NAVIGATION_MAX_ITEMS)
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
const NO_STORE = 'no-store';
|
|
83
|
+
/** Sayfa betiğini (`/shell.js` gibi) doğru içerik türüyle döndürür — `script-src 'self'` ayrı dosya ister. */
|
|
84
|
+
export function scriptResponse(body) {
|
|
85
|
+
return new Response(body, { headers: { 'content-type': 'text/javascript; charset=utf-8', 'cache-control': NO_STORE } });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* `/one-bridge.js`, `/one-components.js` (D-83 hazır bileşenler) ve `/one-ui.css`; başka yolda `null` (uygulamanın kendi
|
|
89
|
+
* yönlendirmesi devam eder).
|
|
90
|
+
*/
|
|
91
|
+
export function clientAssetResponse(pathname) {
|
|
92
|
+
if (pathname === BRIDGE_SCRIPT_PATH)
|
|
93
|
+
return scriptResponse(ONE_BRIDGE_SCRIPT);
|
|
94
|
+
if (pathname === COMPONENTS_SCRIPT_PATH)
|
|
95
|
+
return scriptResponse(ONE_COMPONENTS_SCRIPT);
|
|
96
|
+
if (pathname === UI_CSS_PATH)
|
|
97
|
+
return new Response(ONE_UI_CSS, { headers: { 'content-type': 'text/css; charset=utf-8', 'cache-control': NO_STORE } });
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* `window.one` köprüsü. Tarayıcıda çalışır (derleme yok); `String.raw` ters bölüleri olduğu gibi korur. Değişiklik bu
|
|
102
|
+
* dosyanın testinde sahte DOM'da GERÇEKTEN koşturularak denenir (test-support/shellHarness.ts).
|
|
103
|
+
*/
|
|
104
|
+
export const ONE_BRIDGE_SCRIPT = String.raw `(function (w) {
|
|
105
|
+
'use strict';
|
|
106
|
+
if (w.one && w.one.bridgeVersion) return;
|
|
107
|
+
var NAV_MAX = 12, TITLE_MAX = 120, DOWNLOAD_MAX = 26214400, PATH_MAX = 200;
|
|
108
|
+
var PATH_RE = /^\/(?:[A-Za-z0-9_-][A-Za-z0-9._-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9._-]*)*)?$/;
|
|
109
|
+
var COLOR_RE = /^(?:#[0-9A-Fa-f]{3,8}|(?:rgb|rgba|hsl|hsla)\([0-9.,%\s\/+-]{1,60}\))$/;
|
|
110
|
+
var FONT_RE = /^[A-Za-z0-9 ,'"_-]{1,200}$/;
|
|
111
|
+
var RADIUS_RE = /^[0-9]{1,3}(?:\.[0-9]{1,3})?(?:px|rem|em)$/;
|
|
112
|
+
var SEVERITIES = ['success', 'info', 'warn', 'error'];
|
|
113
|
+
var CONFIRM_SEVERITIES = ['danger', 'warn', 'info'];
|
|
114
|
+
var doc = w.document, root = doc.documentElement;
|
|
115
|
+
var q = new URLSearchParams(w.location.search);
|
|
116
|
+
// Portal origin'leri iframe src sorgusundan gelir; yalnız biçimi origin olanlar alınır.
|
|
117
|
+
var parents = (q.get('parent') || '').split(',').map(function (p) { return p.trim(); })
|
|
118
|
+
.filter(function (p) { return /^https?:\/\/[^\/?#\s]+$/.test(p); });
|
|
119
|
+
var framed = w.parent !== w;
|
|
120
|
+
var token = null, expiresAt = 0, context = null, viewport = null, dirty = false, title = undefined, started = false;
|
|
121
|
+
// Sekme izni (S10): tam menü + erişim; Portal'a yalnız görülebilen sekmeler gider (izin kodu gönderilmez).
|
|
122
|
+
var navAll = null, navAccess = null, navSent = null;
|
|
123
|
+
var path = isPath(w.location.pathname) ? w.location.pathname : '/';
|
|
124
|
+
var listeners = { token: [], context: [], navigate: [], viewport: [] };
|
|
125
|
+
var pending = {}, seq = 0;
|
|
126
|
+
|
|
127
|
+
function isPath(p) { return typeof p === 'string' && p.length <= PATH_MAX && PATH_RE.test(p); }
|
|
128
|
+
function text(v) { return typeof v === 'string' && v.trim() !== ''; }
|
|
129
|
+
function report(e) { if (w.console && w.console.error) w.console.error(e); }
|
|
130
|
+
// Portal'a yalnız bilinen origin'lere gönderilir; joker hedef ('*') KULLANILMAZ. Çerçevesizse ya da origin yoksa false.
|
|
131
|
+
function post(msg) {
|
|
132
|
+
if (!framed || parents.length === 0) return false;
|
|
133
|
+
for (var i = 0; i < parents.length; i++) w.parent.postMessage(msg, parents[i]);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
function on(kind, fn) {
|
|
137
|
+
if (typeof fn !== 'function') throw new TypeError('one: dinleyici bir işlev olmalı');
|
|
138
|
+
listeners[kind].push(fn);
|
|
139
|
+
return function () { var i = listeners[kind].indexOf(fn); if (i >= 0) listeners[kind].splice(i, 1); };
|
|
140
|
+
}
|
|
141
|
+
function emit(kind, value) {
|
|
142
|
+
var list = listeners[kind].slice();
|
|
143
|
+
for (var i = 0; i < list.length; i++) { try { list[i](value); } catch (e) { report(e); } }
|
|
144
|
+
}
|
|
145
|
+
var PERMISSION_RE = /^One\.[A-Z][A-Za-z0-9]*\.[A-Z][A-Za-z0-9]*$/;
|
|
146
|
+
function visibleNav() {
|
|
147
|
+
var out = [];
|
|
148
|
+
for (var i = 0; i < navAll.length; i++) {
|
|
149
|
+
var item = navAll[i];
|
|
150
|
+
if (item.permission && !(navAccess && (navAccess.admin || navAccess.permissions.indexOf(item.permission) >= 0))) continue;
|
|
151
|
+
out.push({ path: item.path, label: item.label });
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
function sendNav() {
|
|
156
|
+
if (!navAll || !started) return;
|
|
157
|
+
var items = visibleNav(), key = JSON.stringify(items);
|
|
158
|
+
if (key === navSent) return;
|
|
159
|
+
navSent = key;
|
|
160
|
+
post({ type: 'one:navigation', items: items });
|
|
161
|
+
}
|
|
162
|
+
function replaceUrl(p) {
|
|
163
|
+
try { if (w.history && w.history.replaceState) w.history.replaceState(w.history.state, '', p + w.location.search); } catch (e) { /* yol yine de bildirilir */ }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ── Yükseklik: içerik yüksekliği Portal'a bildirilir, Portal iframe'i o boyda çizer (tek kaydırma çubuğu). Ölçüt gövdenin
|
|
167
|
+
// alt kenarıdır (belge kaydırma yüksekliği iframe boyundan küçük olamaz → içerik kısalınca yükseklik azalmazdı).
|
|
168
|
+
var canReport = framed && typeof w.ResizeObserver === 'function';
|
|
169
|
+
var lastHeight = -1, heightPending = false;
|
|
170
|
+
// Yatay kaydırma çubuğu iframe'in iç yüksekliğinden yer alır: bildirilen boya eklenir, yoksa en alt satır kesilirdi
|
|
171
|
+
// (autoHeight'ta dikey taşma gizlidir). Çubuğun boyu kendi içeriğine bağlı değildir, ölçüm döngüye girmez.
|
|
172
|
+
function horizontalBar() {
|
|
173
|
+
var inner = w.innerHeight, client = root.clientHeight;
|
|
174
|
+
return typeof inner === 'number' && typeof client === 'number' && inner > client ? inner - client : 0;
|
|
175
|
+
}
|
|
176
|
+
function contentHeight() {
|
|
177
|
+
var b = doc.body, r = b.getBoundingClientRect();
|
|
178
|
+
return Math.ceil(r.bottom + (parseFloat(w.getComputedStyle(b).marginBottom) || 0) + (w.scrollY || 0) + horizontalBar());
|
|
179
|
+
}
|
|
180
|
+
function reportHeight() {
|
|
181
|
+
heightPending = false;
|
|
182
|
+
var h = contentHeight();
|
|
183
|
+
if (h === lastHeight) return;
|
|
184
|
+
lastHeight = h;
|
|
185
|
+
post({ type: 'one:resize', height: h });
|
|
186
|
+
}
|
|
187
|
+
function scheduleHeight() { if (!heightPending) { heightPending = true; w.requestAnimationFrame(reportHeight); } }
|
|
188
|
+
|
|
189
|
+
function setVar(name, value, re) {
|
|
190
|
+
if (typeof value === 'string' && re.test(value.trim()) && root.style && root.style.setProperty) root.style.setProperty(name, value.trim());
|
|
191
|
+
}
|
|
192
|
+
function readDesign(d) {
|
|
193
|
+
if (!d || typeof d !== 'object') return null;
|
|
194
|
+
return { primary: String(d.primary || ''), primaryContrast: String(d.primaryContrast || ''), fontFamily: String(d.fontFamily || ''), radius: String(d.radius || '') };
|
|
195
|
+
}
|
|
196
|
+
function readContext(d) {
|
|
197
|
+
var actor = d.actor && (d.actor.kind === 'delegation' || d.actor.kind === 'impersonation') ? { kind: d.actor.kind } : null;
|
|
198
|
+
return {
|
|
199
|
+
theme: d.theme === 'dark' ? 'dark' : 'light',
|
|
200
|
+
lang: typeof d.lang === 'string' && d.lang ? d.lang : (context ? context.lang : (root.lang || 'tr')),
|
|
201
|
+
autoHeight: d.autoHeight === true,
|
|
202
|
+
actor: actor,
|
|
203
|
+
design: readDesign(d.design)
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function applyContext(c) {
|
|
207
|
+
root.setAttribute('data-theme', c.theme);
|
|
208
|
+
if (c.design) {
|
|
209
|
+
setVar('--one-primary', c.design.primary, COLOR_RE);
|
|
210
|
+
setVar('--one-primary-contrast', c.design.primaryContrast, COLOR_RE);
|
|
211
|
+
setVar('--one-font-family', c.design.fontFamily, FONT_RE);
|
|
212
|
+
setVar('--one-radius', c.design.radius, RADIUS_RE);
|
|
213
|
+
}
|
|
214
|
+
// Portal iframe'i bildirilen boyda çiziyorsa DİKEY iç taşma gizlenir (yatay taşma kaydırılabilir kalır: Portal yalnız
|
|
215
|
+
// yüksekliği ayarlar, geniş içerik başka türlü görünmezdi — Codex #18); bildiremeyen sayfa taşmayı GİZLEMEZ.
|
|
216
|
+
// autoHeight sonradan kapanırsa öznitelik KALDIRILIR: Portal artık boyamıyorsa gizli taşma içeriği keserdi.
|
|
217
|
+
if (c.autoHeight && canReport) root.setAttribute('data-one-height', 'auto');
|
|
218
|
+
else root.removeAttribute('data-one-height');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
w.addEventListener('message', function (ev) {
|
|
222
|
+
// Kaynak DOĞRULANIR: yalnız Portal origin'i ve yalnız üst pencere.
|
|
223
|
+
if (parents.indexOf(ev.origin) < 0 || (framed && ev.source !== w.parent)) return;
|
|
224
|
+
var d = ev.data;
|
|
225
|
+
if (!d || typeof d.type !== 'string') return;
|
|
226
|
+
if (d.type === 'one:token' && typeof d.token === 'string') {
|
|
227
|
+
token = d.token; expiresAt = Number(d.expiresAt) || 0; emit('token', token);
|
|
228
|
+
} else if (d.type === 'one:context') {
|
|
229
|
+
context = readContext(d); applyContext(context); emit('context', context);
|
|
230
|
+
} else if (d.type === 'one:navigate' && isPath(d.path)) {
|
|
231
|
+
path = d.path; replaceUrl(path); emit('navigate', path);
|
|
232
|
+
} else if (d.type === 'one:viewport' && isFinite(d.top) && isFinite(d.height) && d.height >= 0) {
|
|
233
|
+
viewport = { top: Number(d.top), height: Number(d.height) }; emit('viewport', viewport);
|
|
234
|
+
} else if (d.type === 'one:confirm-result' && typeof d.id === 'string' && pending[d.id]) {
|
|
235
|
+
var resolve = pending[d.id]; delete pending[d.id]; resolve(d.accepted === true);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
function isArrayBuffer(x) { return Object.prototype.toString.call(x) === '[object ArrayBuffer]'; }
|
|
240
|
+
function toBuffer(data) {
|
|
241
|
+
if (isArrayBuffer(data)) return Promise.resolve(data);
|
|
242
|
+
if (ArrayBuffer.isView(data)) return Promise.resolve(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
|
|
243
|
+
if (typeof data === 'string') { var u = new TextEncoder().encode(data); return Promise.resolve(u.buffer.slice(u.byteOffset, u.byteOffset + u.byteLength)); }
|
|
244
|
+
if (data && typeof data.arrayBuffer === 'function') return data.arrayBuffer();
|
|
245
|
+
return Promise.reject(new TypeError('one.download: data ArrayBuffer, Uint8Array, Blob ya da metin olmalı'));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
var one = {
|
|
249
|
+
bridgeVersion: 1,
|
|
250
|
+
framed: framed,
|
|
251
|
+
parents: parents.slice(),
|
|
252
|
+
get token() { return token; },
|
|
253
|
+
get tokenExpiresAt() { return expiresAt; },
|
|
254
|
+
get context() { return context; },
|
|
255
|
+
get actor() { return context ? context.actor : null; },
|
|
256
|
+
get path() { return path; },
|
|
257
|
+
viewport: {
|
|
258
|
+
get current() { return viewport; },
|
|
259
|
+
onChange: function (fn) { return on('viewport', fn); }
|
|
260
|
+
},
|
|
261
|
+
start: function (options) {
|
|
262
|
+
if (started) return;
|
|
263
|
+
var nav = options && options.navigation;
|
|
264
|
+
if (nav !== undefined) {
|
|
265
|
+
if (!Array.isArray(nav) || nav.length > NAV_MAX) throw new TypeError('one.start: navigation en çok ' + NAV_MAX + ' öğelik bir dizi olmalı');
|
|
266
|
+
nav = nav.map(function (item) {
|
|
267
|
+
if (!item || !isPath(item.path) || !item.label || !text(item.label.tr)) throw new TypeError('one.start: menü öğesi { path: "/…", label: { tr, en? } } olmalı');
|
|
268
|
+
if (item.permission !== undefined && !(typeof item.permission === 'string' && PERMISSION_RE.test(item.permission)))
|
|
269
|
+
throw new TypeError('one.start: menü öğesinin permission alanı "One.<Uygulama>.<Eylem>" biçiminde bir izin kodu olmalı');
|
|
270
|
+
var label = { tr: String(item.label.tr) };
|
|
271
|
+
if (text(item.label.en)) label.en = String(item.label.en);
|
|
272
|
+
var entry = { path: item.path, label: label };
|
|
273
|
+
if (item.permission !== undefined) entry.permission = item.permission;
|
|
274
|
+
return entry;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
started = true;
|
|
278
|
+
post({ type: 'one:ready' });
|
|
279
|
+
if (nav) { navAll = nav; sendNav(); }
|
|
280
|
+
if (canReport) {
|
|
281
|
+
new w.ResizeObserver(scheduleHeight).observe(doc.body);
|
|
282
|
+
// Gövde boyu değişmeden yatay taşma doğabilir (sabit yükseklikli bölgeye geniş içerik): çubuk iç yüksekliği değiştirir
|
|
283
|
+
// ama ResizeObserver bunu görmez. DOM değişiminde de ölçülür; aynı yükseklik yeniden gönderilmez (Codex #31).
|
|
284
|
+
if (typeof w.MutationObserver === 'function') new w.MutationObserver(scheduleHeight).observe(doc.body, { childList: true, subtree: true, attributes: true, characterData: true });
|
|
285
|
+
scheduleHeight();
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
setNavigationAccess: function (access) {
|
|
289
|
+
if (!access || typeof access !== 'object') throw new TypeError('one.setNavigationAccess: { permissions: [...], admin } olmalı');
|
|
290
|
+
var list = Array.isArray(access.permissions) ? access.permissions.filter(function (p) { return typeof p === 'string'; }) : [];
|
|
291
|
+
navAccess = { permissions: list, admin: access.admin === true };
|
|
292
|
+
sendNav();
|
|
293
|
+
},
|
|
294
|
+
onToken: function (fn) { return on('token', fn); },
|
|
295
|
+
onContext: function (fn) { return on('context', fn); },
|
|
296
|
+
onNavigate: function (fn) { return on('navigate', fn); },
|
|
297
|
+
fetch: function (input, init) {
|
|
298
|
+
init = init || {};
|
|
299
|
+
var headers = new Headers(init.headers || {});
|
|
300
|
+
if (token && !headers.has('authorization')) headers.set('authorization', 'Bearer ' + token);
|
|
301
|
+
var next = {};
|
|
302
|
+
for (var k in init) if (Object.prototype.hasOwnProperty.call(init, k)) next[k] = init[k];
|
|
303
|
+
next.headers = headers;
|
|
304
|
+
return w.fetch(input, next);
|
|
305
|
+
},
|
|
306
|
+
toast: function (t) {
|
|
307
|
+
if (!t || SEVERITIES.indexOf(t.severity) < 0) throw new TypeError('one.toast: severity success | info | warn | error olmalı');
|
|
308
|
+
if (!text(t.summary)) throw new TypeError('one.toast: summary boş olamaz');
|
|
309
|
+
var msg = { type: 'one:toast', severity: t.severity, summary: String(t.summary) };
|
|
310
|
+
if (text(t.detail)) msg.detail = String(t.detail);
|
|
311
|
+
if (!post(msg) && w.console && w.console.info) w.console.info('[' + t.severity + '] ' + msg.summary + (msg.detail ? ' — ' + msg.detail : ''));
|
|
312
|
+
},
|
|
313
|
+
confirm: function (options) {
|
|
314
|
+
return new Promise(function (resolve) {
|
|
315
|
+
var o = typeof options === 'string' ? { message: options } : options;
|
|
316
|
+
if (!o || !text(o.message)) throw new TypeError('one.confirm: message boş olamaz');
|
|
317
|
+
if (o.severity !== undefined && CONFIRM_SEVERITIES.indexOf(o.severity) < 0) throw new TypeError('one.confirm: severity danger | warn | info olmalı');
|
|
318
|
+
if (!framed) { resolve(typeof w.confirm === 'function' ? w.confirm(String(o.message)) === true : false); return; }
|
|
319
|
+
// Portal origin'i yoksa soru hiç sorulamaz: "kabul" varsayılmaz.
|
|
320
|
+
if (parents.length === 0) { resolve(false); return; }
|
|
321
|
+
var id = 'c' + (++seq) + '-' + Math.random().toString(36).slice(2, 10);
|
|
322
|
+
pending[id] = resolve;
|
|
323
|
+
var msg = { type: 'one:confirm', id: id, message: String(o.message) };
|
|
324
|
+
if (text(o.title)) msg.title = String(o.title);
|
|
325
|
+
if (o.severity !== undefined) msg.severity = o.severity;
|
|
326
|
+
if (text(o.acceptLabel)) msg.acceptLabel = String(o.acceptLabel);
|
|
327
|
+
if (text(o.rejectLabel)) msg.rejectLabel = String(o.rejectLabel);
|
|
328
|
+
post(msg);
|
|
329
|
+
});
|
|
330
|
+
},
|
|
331
|
+
download: function (file) {
|
|
332
|
+
if (!file || !text(file.name)) return Promise.reject(new TypeError('one.download: name boş olamaz'));
|
|
333
|
+
if (!text(file.mime)) return Promise.reject(new TypeError('one.download: mime boş olamaz'));
|
|
334
|
+
return toBuffer(file.data).then(function (buffer) {
|
|
335
|
+
if (buffer.byteLength > DOWNLOAD_MAX) throw new RangeError('one.download: dosya en çok 25 MB olabilir');
|
|
336
|
+
var msg = { type: 'one:download', name: String(file.name), mime: String(file.mime), data: buffer };
|
|
337
|
+
if (post(msg)) return;
|
|
338
|
+
// Portal dışında (yerel geliştirme) tarayıcının kendi indirmesi.
|
|
339
|
+
var url = w.URL.createObjectURL(new Blob([buffer], { type: msg.mime }));
|
|
340
|
+
var a = doc.createElement('a'); a.href = url; a.download = msg.name; doc.body.appendChild(a); a.click(); a.remove();
|
|
341
|
+
w.setTimeout(function () { w.URL.revokeObjectURL(url); }, 0);
|
|
342
|
+
});
|
|
343
|
+
},
|
|
344
|
+
openExternal: function (url) {
|
|
345
|
+
var u;
|
|
346
|
+
try { u = new URL(String(url)); } catch (e) { throw new TypeError('one.openExternal: geçerli bir adres değil'); }
|
|
347
|
+
if (u.protocol !== 'https:') throw new TypeError('one.openExternal: yalnız https adresleri açılabilir');
|
|
348
|
+
if (!post({ type: 'one:open-external', url: u.href })) w.open(u.href, '_blank', 'noopener,noreferrer');
|
|
349
|
+
},
|
|
350
|
+
setTitle: function (value) {
|
|
351
|
+
if (value !== null && typeof value !== 'string') throw new TypeError('one.setTitle: metin ya da null olmalı');
|
|
352
|
+
var next = value === null || value.trim() === '' ? null : value.trim().slice(0, TITLE_MAX);
|
|
353
|
+
if (next === title) return;
|
|
354
|
+
title = next;
|
|
355
|
+
post({ type: 'one:title', title: next });
|
|
356
|
+
},
|
|
357
|
+
setDirty: function (value) {
|
|
358
|
+
var next = value === true;
|
|
359
|
+
if (next === dirty) return;
|
|
360
|
+
dirty = next;
|
|
361
|
+
post({ type: 'one:dirty', dirty: next });
|
|
362
|
+
},
|
|
363
|
+
setRoute: function (p) {
|
|
364
|
+
if (!isPath(p)) throw new TypeError('one.setRoute: yol "/" ile başlamalı (sorgu ve "#" yok)');
|
|
365
|
+
if (p === path) return;
|
|
366
|
+
path = p; replaceUrl(p);
|
|
367
|
+
post({ type: 'one:route', path: p });
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
w.one = one;
|
|
371
|
+
})(window);
|
|
372
|
+
`;
|
|
373
|
+
/**
|
|
374
|
+
* Devoplus One görsel dili (D-76 U5). Açık/koyu değişkenler `[data-theme]` ile seçilir (köprü `one:context` ile yazar);
|
|
375
|
+
* Portal tasarım değerleri (`one:context.design`) `--one-primary`, `--one-primary-contrast`, `--one-font-family`,
|
|
376
|
+
* `--one-radius` değişkenlerine yazılır. Sınıflar `one-` önekiyle: düğme · alan · tablo · kart · mesaj · içerik sekmesi.
|
|
377
|
+
* ⚠️ `.one-tabs` içerik İÇİNDEKİ gruplama içindir; uygulama menüsü değildir (menüyü Portal çizer, U1).
|
|
378
|
+
*/
|
|
379
|
+
export const ONE_UI_CSS = `:root{--one-primary:#B60017;--one-primary-contrast:#ffffff;--one-font-family:"Segoe UI",system-ui,-apple-system,Roboto,sans-serif;--one-radius:6px;--one-bg:#ffffff;--one-fg:#222222;--one-muted:#5f5f66;--one-surface:#f4f4f5;--one-raised:#ffffff;--one-border:#d6d6db;--one-input:#ffffff;--one-success:#1b6e2e;--one-success-bg:#e8f5ec;--one-info:#0b5cad;--one-info-bg:#e7f0fb;--one-warn:#7a4f00;--one-warn-bg:#fff4e0;--one-error:#a4161a;--one-error-bg:#fdecec;--one-scroll:rgba(34,34,34,.22);--one-scroll-hover:rgba(34,34,34,.34);--one-chart-1:#b60017;--one-chart-2:#0b5cad;--one-chart-3:#1b6e2e;--one-chart-4:#8a5a00;--one-chart-5:#6b3fa0;--one-chart-6:#00727a;color-scheme:light}
|
|
380
|
+
[data-theme=dark]{--one-primary:#ff5a6e;--one-primary-contrast:#1b1b1f;--one-bg:#1b1b1f;--one-fg:#e8e8e8;--one-muted:#a8a8b3;--one-surface:#26262c;--one-raised:#2e2e35;--one-border:#3a3a42;--one-input:#2e2e35;--one-success:#7ad491;--one-success-bg:#16301e;--one-info:#8cc2ff;--one-info-bg:#142538;--one-warn:#ffc766;--one-warn-bg:#3a2c10;--one-error:#ff8a8a;--one-error-bg:#3d1717;--one-scroll:rgba(232,232,232,.22);--one-scroll-hover:rgba(232,232,232,.34);--one-chart-1:#ff5a6e;--one-chart-2:#8cc2ff;--one-chart-3:#7ad491;--one-chart-4:#ffc766;--one-chart-5:#c9a6ff;--one-chart-6:#5fd3db;color-scheme:dark}
|
|
381
|
+
*,*::before,*::after{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--one-scroll) transparent}
|
|
382
|
+
::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--one-scroll);border-radius:8px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:var(--one-scroll-hover);background-clip:padding-box}
|
|
383
|
+
html[data-one-height=auto]{overflow-x:auto;overflow-y:hidden}
|
|
384
|
+
body{margin:0;padding:16px;min-width:0;font-family:var(--one-font-family);font-size:15px;line-height:1.5;background:var(--one-bg);color:var(--one-fg);overflow-wrap:anywhere}
|
|
385
|
+
h1,h2,h3{line-height:1.25;margin:0 0 8px}h1{font-size:1.4rem}h2{font-size:1.1rem;margin-top:16px}h3{font-size:1rem}
|
|
386
|
+
p{margin:4px 0}
|
|
387
|
+
a{color:var(--one-primary)}
|
|
388
|
+
.one-muted{color:var(--one-muted)}
|
|
389
|
+
.one-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
|
|
390
|
+
.one-stack{display:flex;flex-direction:column;gap:12px}
|
|
391
|
+
.one-btn{font:inherit;display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:36px;padding:6px 14px;border:1px solid var(--one-border);border-radius:var(--one-radius);background:var(--one-raised);color:var(--one-fg);cursor:pointer;text-decoration:none}
|
|
392
|
+
.one-btn:hover{border-color:var(--one-primary)}
|
|
393
|
+
.one-btn-primary{background:var(--one-primary);border-color:var(--one-primary);color:var(--one-primary-contrast)}
|
|
394
|
+
.one-btn-primary:hover{filter:brightness(1.08)}
|
|
395
|
+
.one-btn-danger{background:var(--one-error);border-color:var(--one-error);color:var(--one-bg)}
|
|
396
|
+
.one-btn-text{background:transparent;border-color:transparent;color:var(--one-primary)}
|
|
397
|
+
.one-btn:disabled,.one-btn[aria-disabled=true]{opacity:.55;cursor:not-allowed}
|
|
398
|
+
.one-field{display:flex;flex-direction:column;gap:4px;margin:0 0 12px;min-width:0}
|
|
399
|
+
.one-label{font-size:.875rem;font-weight:600;color:var(--one-muted)}
|
|
400
|
+
.one-input,.one-select,.one-textarea{font:inherit;width:100%;max-width:100%;min-height:36px;padding:6px 10px;border:1px solid var(--one-border);border-radius:var(--one-radius);background:var(--one-input);color:var(--one-fg)}
|
|
401
|
+
.one-textarea{min-height:88px;resize:vertical}
|
|
402
|
+
.one-input[aria-invalid=true],.one-select[aria-invalid=true],.one-textarea[aria-invalid=true]{border-color:var(--one-error)}
|
|
403
|
+
.one-btn:focus-visible,.one-input:focus-visible,.one-select:focus-visible,.one-textarea:focus-visible,.one-tab:focus-visible,a:focus-visible{outline:2px solid var(--one-primary);outline-offset:2px}
|
|
404
|
+
.one-card{background:var(--one-surface);border:1px solid var(--one-border);border-radius:calc(var(--one-radius) + 2px);padding:16px;min-width:0}
|
|
405
|
+
.one-table-wrap{max-width:100%;overflow-x:auto}
|
|
406
|
+
.one-table{width:100%;border-collapse:collapse;font-size:.925rem}
|
|
407
|
+
.one-table th,.one-table td{text-align:left;vertical-align:top;padding:8px 10px;border-bottom:1px solid var(--one-border)}
|
|
408
|
+
.one-table th{font-weight:600;color:var(--one-muted);background:var(--one-surface)}
|
|
409
|
+
.one-table td.one-num,.one-table th.one-num{text-align:right;font-variant-numeric:tabular-nums}
|
|
410
|
+
.one-message{margin:8px 0;padding:10px 12px;border:1px solid var(--one-border);border-left-width:4px;border-radius:var(--one-radius);background:var(--one-surface);color:var(--one-fg)}
|
|
411
|
+
.one-message-success{border-color:var(--one-success);background:var(--one-success-bg)}
|
|
412
|
+
.one-message-info{border-color:var(--one-info);background:var(--one-info-bg)}
|
|
413
|
+
.one-message-warn{border-color:var(--one-warn);background:var(--one-warn-bg)}
|
|
414
|
+
.one-message-error{border-color:var(--one-error);background:var(--one-error-bg)}
|
|
415
|
+
.one-tabs{display:flex;gap:4px;margin:0 0 12px;border-bottom:1px solid var(--one-border);overflow-x:auto}
|
|
416
|
+
.one-tab{font:inherit;padding:8px 12px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--one-muted);cursor:pointer;white-space:nowrap}
|
|
417
|
+
.one-tab[aria-selected=true]{border-bottom-color:var(--one-primary);color:var(--one-fg);font-weight:600}
|
|
418
|
+
.one-empty,.one-loading{padding:16px;text-align:center;color:var(--one-muted)}
|
|
419
|
+
.one-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
|
|
420
|
+
one-table,one-form,one-filter,one-person-picker,one-file-upload,one-chart{display:block;min-width:0}
|
|
421
|
+
.one-table-toolbar{justify-content:space-between;margin:0 0 8px}
|
|
422
|
+
.one-table-search{flex:1 1 220px;margin:0;max-width:420px}
|
|
423
|
+
.one-sort{font:inherit;font-weight:600;color:inherit;background:none;border:0;padding:0;cursor:pointer;display:inline-flex;gap:4px;align-items:center;text-align:inherit}
|
|
424
|
+
.one-sort-icon{font-size:.75em;color:var(--one-muted)}
|
|
425
|
+
.one-table th[aria-sort=ascending] .one-sort-icon,.one-table th[aria-sort=descending] .one-sort-icon{color:var(--one-primary)}
|
|
426
|
+
.one-table .one-select-cell{width:40px}
|
|
427
|
+
.one-table tr[aria-selected=true] td{background:var(--one-surface)}
|
|
428
|
+
.one-table tr.one-clickable{cursor:pointer}
|
|
429
|
+
.one-table tr.one-clickable:hover td{background:var(--one-surface)}
|
|
430
|
+
.one-table tr.one-clickable:focus-visible{outline:2px solid var(--one-primary);outline-offset:-2px}
|
|
431
|
+
.one-pager{justify-content:flex-end;margin:8px 0 0}
|
|
432
|
+
.one-form-actions{margin-top:4px}
|
|
433
|
+
.one-help{margin:0;font-size:.85rem;color:var(--one-muted)}
|
|
434
|
+
.one-field-error{margin:0;font-size:.85rem;color:var(--one-error)}
|
|
435
|
+
.one-required{color:var(--one-error)}
|
|
436
|
+
.one-field-check{flex-direction:row}
|
|
437
|
+
.one-check{display:inline-flex;gap:8px;align-items:center;cursor:pointer}
|
|
438
|
+
.one-filter{align-items:flex-end;gap:12px;margin:0 0 12px}
|
|
439
|
+
.one-filter .one-field{margin:0;flex:1 1 180px;max-width:280px}
|
|
440
|
+
.one-filter-range{border:0;margin:0;padding:0;min-width:0;display:flex;flex-direction:column;gap:4px}
|
|
441
|
+
.one-filter-range legend{padding:0;margin:0 0 4px}
|
|
442
|
+
.one-filter-range .one-input{width:auto}
|
|
443
|
+
.one-listbox{margin:2px 0 0;max-height:260px;overflow-y:auto;padding:4px 0;list-style:none;background:var(--one-raised);border:1px solid var(--one-border);border-radius:var(--one-radius);box-shadow:0 4px 12px rgba(0,0,0,.15)}
|
|
444
|
+
.one-option{display:flex;flex-direction:column;padding:6px 10px;cursor:pointer}
|
|
445
|
+
.one-option[aria-selected=true],.one-option:hover{background:var(--one-surface)}
|
|
446
|
+
.one-option[aria-selected=true]{outline:2px solid var(--one-primary);outline-offset:-2px}
|
|
447
|
+
.one-option-sub{font-size:.85rem}
|
|
448
|
+
.one-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 6px;padding:0;list-style:none}
|
|
449
|
+
.one-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 10px;border:1px solid var(--one-border);border-radius:999px;background:var(--one-surface)}
|
|
450
|
+
.one-chip-remove{font:inherit;line-height:1.2;min-width:28px;min-height:28px;border:0;border-radius:999px;background:transparent;color:var(--one-fg);cursor:pointer}
|
|
451
|
+
.one-chip-remove:focus-visible,.one-sort:focus-visible,.one-check input:focus-visible,.one-filter-range .one-input:focus-visible{outline:2px solid var(--one-primary);outline-offset:2px}
|
|
452
|
+
.one-upload-list{display:flex;flex-direction:column;gap:6px;margin:6px 0 0;padding:0;list-style:none}
|
|
453
|
+
.one-upload-item{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
|
|
454
|
+
.one-upload-item progress{flex:1 1 120px;accent-color:var(--one-primary)}
|
|
455
|
+
.one-chart{margin:0;min-width:0}
|
|
456
|
+
.one-chart-title{font-weight:600;margin:0 0 8px}
|
|
457
|
+
.one-chart svg{display:block;width:100%;height:auto;max-height:360px}
|
|
458
|
+
.one-chart-axis{fill:var(--one-muted);font-size:12px;font-family:var(--one-font-family)}
|
|
459
|
+
.one-chart-grid{stroke:var(--one-border);stroke-width:1;fill:none}
|
|
460
|
+
.one-chart-s1{fill:var(--one-chart-1);stroke:var(--one-chart-1)}.one-chart-s2{fill:var(--one-chart-2);stroke:var(--one-chart-2)}.one-chart-s3{fill:var(--one-chart-3);stroke:var(--one-chart-3)}.one-chart-s4{fill:var(--one-chart-4);stroke:var(--one-chart-4)}.one-chart-s5{fill:var(--one-chart-5);stroke:var(--one-chart-5)}.one-chart-s6{fill:var(--one-chart-6);stroke:var(--one-chart-6)}
|
|
461
|
+
.one-chart rect[class^=one-chart-s],.one-chart path[class^=one-chart-s]{stroke:var(--one-bg);stroke-width:1}
|
|
462
|
+
.one-chart .one-chart-line{fill:none}
|
|
463
|
+
.one-chart-legend{display:flex;flex-wrap:wrap;gap:12px;margin:8px 0 0;padding:0;list-style:none;font-size:.875rem}
|
|
464
|
+
.one-chart-legend li{display:inline-flex;align-items:center;gap:6px}
|
|
465
|
+
.one-chart-swatch{display:inline-block;width:12px;height:12px;border-radius:3px}
|
|
466
|
+
.one-chart-swatch.one-chart-s1{background:var(--one-chart-1)}.one-chart-swatch.one-chart-s2{background:var(--one-chart-2)}.one-chart-swatch.one-chart-s3{background:var(--one-chart-3)}.one-chart-swatch.one-chart-s4{background:var(--one-chart-4)}.one-chart-swatch.one-chart-s5{background:var(--one-chart-5)}.one-chart-swatch.one-chart-s6{background:var(--one-chart-6)}
|
|
467
|
+
[hidden]{display:none !important}
|
|
468
|
+
`;
|
|
469
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|