@devoplus/one-sdk 0.2.0-next.112 → 0.2.0-next.155

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 CHANGED
@@ -10,6 +10,43 @@ Biçim: [Keep a Changelog](https://keepachangelog.com/tr/1.1.0/); sürümleme [S
10
10
  > `0.2.0-next.<n>` ön sürümleri `next` etiketiyle çıkar; kararlı 0.2.0 `main`'den `latest` etiketiyle çıkar ve tarihi o
11
11
  > zaman yazılır. Aşağıdaki maddeler 0.1.0'dan bu yana birikenlerdir; kararlı yayına kadar yeni maddeler bu başlığa eklenir.
12
12
 
13
+ ### Eklendi (D-96 — hazır arayüz bileşenleri ilk dalga ve Portal karartması, 20.10.2026)
14
+
15
+ - **`/one-ui.css` sınıfları:** rozet (`one-badge` + `-success`, `-info`, `-warn`, `-error`, `-primary`), anahtar
16
+ (`one-switch`, `role="switch"`), radyo grubu (`one-radio-group`, `-inline`), ilerleme çubuğu (`one-progress`, belirsiz kip
17
+ dahil), yükleniyor göstergesi (`one-spinner`, `one-spinner-lg`, `one-loading-inline`). Renkler tema değişkenlerinden;
18
+ hareket azaltma tercihine uyulur. Yeni değişkenler: `--one-backdrop`, `--one-shadow`.
19
+ - **Yeni bileşenler** (`/one-components.js`): `<one-select>` (aranabilir, tekli/çoklu), `<one-tag-input>`, `<one-dialog>`
20
+ (onay penceresi dahil), `<one-tooltip>`, `<one-menu>`, `<one-avatar>`, `<one-tabs>`, `<one-accordion>`. Hepsi iki dilli,
21
+ klavye ve ekran okuyucu kalıplarına (APG) uygun, düz metin; satır içi betik ya da stil gerektirmez.
22
+ - **Köprü:** `one.setModal(open)` (`one:modal { open }`) ve `one.onModalDismiss(fn)` (`one:modal-dismiss`): uygulama
23
+ içinde pencere açıkken Portal da kendi ekranını karartır; kullanıcı Portal'da vazgeçerse karartmayı Portal kaldırır ve
24
+ pencere kapanır. Köprü `one:viewport` değerini `--one-viewport-top` / `--one-viewport-height` değişkenlerine de yazar.
25
+ Açık açılır öğenin (`data-one-popup`) alt kenarı otomatik yükseklik ölçütüne katılır.
26
+ - Onay penceresi (`<one-dialog accept-label reject-label>`) Portal içindeyken Portal'ın onay penceresiyle (`one.confirm`)
27
+ sorulur; bildirim Portal içindeyken Portal'da çizilir (D-76 U4 değişmedi). Portal dışında (yerel geliştirme)
28
+ `one.toast` hazır bileşenler yüklüyse artık konsol yerine sayfada gösterilir.
29
+ - ⚠️ Portal karartması Portal'ın bu iletiyi tanıyan sürümünü ister; tanımayan Portal'da pencere yalnız iframe içinde
30
+ karartılır, başka bir şey değişmez.
31
+ - **Olay tipleri bileşen başına:** `OneComponentEvents[etiket][olay]` ve `OneComponentEvent<etiket, olay>` her bileşenin
32
+ yaydığı olayın yükünü verir (`<one-dialog>` `cancel` `{ reason }`, `close` `{ returnValue }`, `<one-tabs>` `change`
33
+ `{ tab }`, `<one-menu>` `select` `{ id }` …); `ONE_COMPONENT_EVENTS` aynı kümeyi çalışma anında taşır. Eski
34
+ `OneComponentEventMap` tek haritada aynı adlı olayların birleşimidir ve `@deprecated` işaretlidir.
35
+ - **Tek doğruluk kaynağı:** `<one-tabs>` seçimi `selected` özniteliğindedir (başlangıçta da özellikte görünür, seçili
36
+ sekmeye yeniden tıklamak `change` üretmez); `<one-dialog open>` özniteliği pencereyi açar/kapatır; `<one-accordion>`
37
+ `data-open` iki yönlüdür; `<one-select>` `multiple` kaldırılınca tek seçime iner.
38
+ - **Yeniden bağlanma:** sayfadan ayrılıp yeniden eklenen bileşen ayrıyken değişen öznitelikleri uygular (`src` değişen
39
+ tablo bir kez yeniden yüklenir, `open` alan pencere kipli açılır); eski değerine dönen öznitelik yok sayılır. Ayrılan açık
40
+ pencere içteki görünümüyle birlikte kapanır; ayrılan açık liste kapanır. Portal'a bildirilen kirli durum sayfadaki bağlı
41
+ kirli formların birleşimidir: bir formun ayrılması ötekinin korumasını kaldırmaz.
42
+ - `<one-select>`: seçimi yalnız `null` / `undefined` temizler; `''` yalnız `''` değerli bir seçenek varsa seçilir.
43
+ - **Köprü (D-96):** `one.start()`'tan önce açılmış pencere `one:ready`'nin ardından yeniden bildirilir (Portal `one:ready`'de
44
+ karartmayı sıfırlar; önceden pencere açık ama Portal karartmasız kalıyordu). Pencere açıkken iframe içindeki Escape'i
45
+ uygulama işlemezse köprü `one:modal-escape` ile Portal'a iletir; olay `stopPropagation()` ile durdurulduysa, iptal edildiyse,
46
+ pencere kapandıysa ya da sayfada kipli bir `<dialog>` varsa iletmez (Escape'i zaman uyumsuz işleyen uygulama `preventDefault()` çağırır). Kipli `<dialog>` denetimi tuş
47
+ anında (yakalama aşamasında) yapılır. Sayfa giderken açık pencere kapalı bildirilir (`pagehide`); geri/ileri önbelleğinden
48
+ dönüşte pencere hâlâ açıksa yeniden açık bildirilir (`pageshow`). ⚠️ Portal'ın bu iletiyi tanıyan sürümü gerekir; tanımayan Portal iletiyi yok sayar.
49
+
13
50
  ### Değişti (C7 — DEXA sorgusunda uygulamanın bağlam kodu göndermesi, 18.10.2026)
14
51
 
15
52
  - `queryDexa` / `buildDexaQueryRequest` artık `UserCode` · `CompanyCode` · `CostCenterCode`'u kabul eder (ad harf
package/README.md CHANGED
@@ -5,8 +5,7 @@ servislerine **ince istemcisi**. SDK sır taşımaz, kiracı seçmez ve
5
5
  belirteç üretmez: kimliği platform kapısının yazdığı başlıklardan **okur**, backend'e kullanıcının uygulama
6
6
  belirteciyle gider, dosyayı kuruluma bağlı dosya deposuna yazar.
7
7
 
8
- Platformun tamamı: `devoplus/devoplus-one` (mimari `docs/architecture.md`); kararlar
9
- `devoplus-root/docs/devoplus-one-karar-defteri.md`; örnek uygulama `apps/hello`.
8
+ Platformun tamamı: `devoplus/devoplus-one` (mimari `docs/architecture.md`, örnek uygulama `apps/hello`).
10
9
 
11
10
  ## Kurulum
12
11
 
@@ -23,23 +22,23 @@ Paket yalnız **ESM** dağıtılır (`dist/index.js` + `dist/index.d.ts`); Node
23
22
 
24
23
  ### Yerel geliştirme: `one` komutu
25
24
 
26
- Paket `one` komutunu da getirir (D-72); uygulamanın kök dizininde çalışır ve `one.manifest.json`'u okur:
25
+ Paket `one` komutunu da getirir; uygulamanın kök dizininde çalışır ve `one.manifest.json`'u okur:
27
26
 
28
27
  | Komut | Ne yapar |
29
28
  |---|---|
30
29
  | `one dev [--port n] [--api-base url]` | Uygulamayı yerelde çalıştırır. Devoplus servisleri varsayılan olarak test ortamındadır (`ONE_API_BASE` ile değişir). İstekler Portal'dan geçmediği için kimlik başlıklarını (`X-One-*`) elle gönderirsiniz. |
31
30
  | `one migrate` | `migrations/` altındaki SQL dosyalarını **yerel** veritabanına uygular (`one dev` aynı veriyi görür). |
32
31
  | `one build` | Yükleme provası: kodu paketler, hiçbir yere göndermez (çıktı `.one/dist/`). |
33
- | `one data generate [--check]` | `one.data.json` veri modelinden yeni migration + `src/data/types.ts` üretir; yalnız ekleyen değişiklik ([Veri modeli](#veri-modeli-ve-kayıt-işlemleri-d-84-️-geliştirici-onayı-bekliyor)). |
32
+ | `one data generate [--check]` | `one.data.json` veri modelinden yeni migration + `src/data/types.ts` üretir; yalnız ekleyen değişiklik ([Veri modeli](#veri-modeli-ve-kayıt-işlemleri)). |
34
33
 
35
34
  Yerel yapılandırma ve veri `.one/` altındadır, depoya girmez ve her komutta manifest'ten yeniden üretilir. Gerçek
36
35
  yükleme Devoplus GitLab hattıyla yapılır; geliştirici makinesinden yükleme yoktur. Komutun ekrana yazdığı ayrıntılar
37
36
  (araç adı, sürüm satırı) yerel çalışma ortamına aittir ve gizlenmez.
38
37
 
39
- ### Erişim talebi: `one login`, `one request`, `one requests` (D-75)
38
+ ### Erişim talebi: `one login`, `one request`, `one requests`
40
39
 
41
40
  Uygulamanız bir kuruluma, DEXA sorgusuna, uygulama izni atamasına ya da yetki alanına ihtiyaç duyduğunda izni
42
- yöneticiden komut satırından isteyebilirsiniz. Talep izni kendiliğinden VERMEZ; yönetici Admin Console'da onaylar ve
41
+ yöneticiden komut satırından isteyebilirsiniz. Talep izni kendiliğinden VERMEZ; yönetici Devoplus Console'da onaylar ve
43
42
  sonuç size e-postayla bildirilir.
44
43
 
45
44
  | Komut | Ne yapar |
@@ -55,7 +54,7 @@ One.Hello.Manage="Yönetir"` (tekrar edilebilir, en çok 16; İngilizce ad `--pe
55
54
  portalın şirket yöneticisi, yetki alanı talebini platform yöneticisi onaylar. Kayıt talebi dışındaki türleri yalnız uygulamanın sahibi gönderebilir. Vekalet ya da Yerine Görüntüle oturumuyla talep
56
55
  gönderilemez. Aynı istemci Devoplus One MCP sunucusunda da kullanılır (`@devoplus/one-sdk/access-request`).
57
56
 
58
- ### Yayın ve kullanım panosu: `one publish`, `one promote`, `one rollback`, `one deployments`, `one status` (D-86, D-87)
57
+ ### Yayın ve kullanım panosu: `one publish`, `one promote`, `one rollback`, `one deployments`, `one status`
59
58
 
60
59
  Kod yine bu bilgisayardan yüklenmez: komut Devoplus'a bir **yayın isteği** bırakır, Devoplus isteği kaydeder ve yayın
61
60
  hattını kendisi başlatır; hattın kapılarının hiçbiri atlanmaz. Komutlar `one login` oturumuyla çalışır; uygulamanın
@@ -74,8 +73,8 @@ kısa adı `one.manifest.json`'dan okunur (`--app` ile değişir), `--json` ham
74
73
  sayısı istek gönderilmeden denetlenir; tanınmayan bir seçenek (`--portl`) açık hatadır.
75
74
  - Yanıt *"Yayın hattı bu ortamda yapılandırılmamış"* ya da *"Kullanım ve hata panosu bu ortamda yapılandırılmamış"*
76
75
  ise o ortamda bu özellik henüz kullanılamıyor demektir.
77
- - Aynı istemci Devoplus One MCP sunucusunun `one_publish`, `one_deployments` ve `one_app_health` araçlarında da
78
- kullanılır (`@devoplus/one-sdk/app-ops`).
76
+ - Aynı istemci Devoplus One MCP sunucusunun yayın ve kullanım panosu araçlarında da kullanılır
77
+ (`@devoplus/one-sdk/app-ops`).
79
78
 
80
79
  ## Hızlı başlangıç
81
80
 
@@ -128,20 +127,20 @@ export default {
128
127
  |---|---|
129
128
  | `readContext(headers): OneContext` | `X-One-App`, `X-One-Portal-Key`, `X-One-Portal`, (`X-One-Auth=user` ya da kuyruk işinde `job` + `X-One-Sub`, `X-One-Scope`, `X-One-Global-Admin`, `X-One-Permissions`, `X-One-Admin`). Üç kurulum başlığından biri yoksa `ONE-SDK-E-001` (500): istek dispatch üzerinden gelmemiştir. |
130
129
  | `OneContext` | `{ app, portalKey, portalId, user: OneUser \| null, actor?: OneActor \| null, mode?, admin?, jobServices? }`. `portalId` kiracıdır (24-hex); veri her zaman buna bağlıdır. `mode`: `'user'` (kullanıcının isteği), `'job'` (kuyruk / zamanlanmış iş), `'agent'` (Devoplus ajanının araç çağrısı). `admin` = `user.admin` (oturumsuzda ve işte `false`). `jobServices`: işte manifest `jobs.services` beyanı, diğer yollarda boş. |
131
- | `OneActor`, `isActingSession(ctx)` | Vekalet / Yerine Görüntüle oturumu (D-76 U3; `X-One-Actor-Sub` + `X-One-Session-Kind`): `{ sub, kind: 'delegation' \| 'impersonation' }`. `user.sub` adına çalışılan kişidir (veri onundur), `actor.sub` oturumu kullanan kişidir; "kim yaptı" kaydına bu yazılır. Kendi oturumunda `null`. ⛔ Bu oturumlar varsayılan **salt-okunurdur**: platform GET/HEAD dışındaki isteği uygulamaya ulaşmadan **403 `ONE-DSP-E-009`** ile reddeder; uygulama manifest'te `"actingSessions": "write"` beyan ederse yazma isteği geçer. |
132
- | `OneUser` | `{ sub, scope: readonly string[], globalAdmin, permissions: readonly string[], admin }`. `sub` devoplus-auth kimlik uzayıdır (`UserAccount._id`), Organization Schema `User._id` DEĞİLDİR. `permissions` yalnız bu uygulamanın ad alanındaki (`One.<Uygulama>.*`) izinlerdir (D-49); `admin` = şirket ya da küresel yönetici rolü. |
130
+ | `OneActor`, `isActingSession(ctx)` | Vekalet / Yerine Görüntüle oturumu (`X-One-Actor-Sub` + `X-One-Session-Kind`): `{ sub, kind: 'delegation' \| 'impersonation' }`. `user.sub` adına çalışılan kişidir (veri onundur), `actor.sub` oturumu kullanan kişidir; "kim yaptı" kaydına bu yazılır. Kendi oturumunda `null`. ⛔ Bu oturumlar varsayılan **salt-okunurdur**: platform GET/HEAD dışındaki isteği uygulamaya ulaşmadan **403 `ONE-DSP-E-009`** ile reddeder; uygulama manifest'te `"actingSessions": "write"` beyan ederse yazma isteği geçer. |
131
+ | `OneUser` | `{ sub, scope: readonly string[], globalAdmin, permissions: readonly string[], admin }`. `sub` devoplus-auth kimlik uzayıdır (`UserAccount._id`), Organization Schema `User._id` DEĞİLDİR. `permissions` yalnız bu uygulamanın ad alanındaki (`One.<Uygulama>.*`) izinlerdir; `admin` = şirket ya da küresel yönetici rolü. |
133
132
  | `requireUser(ctx): OneUser` | anonimse `ONE-SDK-E-002` (401). |
134
133
  | `requireScope(ctx, scope): OneUser` | belirteçte scope yoksa `ONE-SDK-E-003` (403). Onaya bağlı scope'ta metin kullanıcıya izni nereden vereceğini de söyler. |
135
134
  | `requireServiceScope(ctx, scope)` | Devoplus servisinin yerel kapısı, üç yolu ayırır (bkz. "Devoplus servisleri arka plan işinde ve ajan aracında"): kullanıcıda `requireScope`; ajan aracında süreli onay gerektiren scope'lar hiç kullanılamaz; işte kullanıcı gerekmez, scope `jobs.services`'te beyanlı olmalı. İhlal `ONE-SDK-E-003` (403); asıl karar sunucudadır. |
136
- | `CONSENT_SCOPES`, `awaitsUserConsent(ctx, scope): boolean` | Kullanıcının **ayrıca ve süreli** onay vermesi gereken scope'lar (D-59): `dexa.write`, `mail.execute`, `sms.execute` ve `push.execute`. `awaitsUserConsent` scope onaya bağlıysa ve belirteçte yoksa `true` döner; ilgili düğmeyi kapatıp kullanıcıya "portaldaki İzinleri incele düğmesiyle izin verin" demek için. ⚠️ Manifest'te hiç beyan edilmemiş scope için de `true` döner (beyan uygulamanın bilgisidir). |
137
- | `hasPermission(ctx, code): boolean` | uygulama izni (D-49): kullanıcıda kod varsa ya da `admin` ise `true` (backend'in yönetici baypasıyla aynı); anonimde `false`. Kod manifest `permission`/`permissions` içinde beyan edilir, atamayı portal yöneticisi Yetki Yönetimi'nde kullanıcı gruplarına (org düğümlerine) yapar. ⚠️ Ad alanı süzgeci bir kolaylıktır, gizlilik sınırı değildir: `Authorization` belirteci kullanıcının bütün izinlerini taşır. |
135
+ | `CONSENT_SCOPES`, `awaitsUserConsent(ctx, scope): boolean` | Kullanıcının **ayrıca ve süreli** onay vermesi gereken scope'lar: `dexa.write`, `mail.execute`, `sms.execute` ve `push.execute`. `awaitsUserConsent` scope onaya bağlıysa ve belirteçte yoksa `true` döner; ilgili düğmeyi kapatıp kullanıcıya "portaldaki İzinleri incele düğmesiyle izin verin" demek için. ⚠️ Manifest'te hiç beyan edilmemiş scope için de `true` döner (beyan uygulamanın bilgisidir). |
136
+ | `hasPermission(ctx, code): boolean` | uygulama izni: kullanıcıda kod varsa ya da `admin` ise `true` (backend'in yönetici baypasıyla aynı); anonimde `false`. Kod manifest `permission`/`permissions` içinde beyan edilir, atamayı portal yöneticisi Yetki Yönetimi'nde kullanıcı gruplarına (org düğümlerine) yapar. ⚠️ Ad alanı süzgeci bir kolaylıktır, gizlilik sınırı değildir: `Authorization` belirteci kullanıcının bütün izinlerini taşır. |
138
137
  | `requirePermission(ctx, code): OneUser` | oturum yoksa 401, izin yoksa `ONE-SDK-E-004` (403). |
139
138
  | `OneError` | `status`, `code`, `message` (kullanıcıya görünen Türkçe metin). |
140
139
 
141
140
  Uygulama kodu `X-One-*` başlıklarını **asla kendisi yazmaz**; dispatch istemciden gelenleri siler ve belirteçten
142
141
  yeniden kurar.
143
142
 
144
- **Kullanıcı onayı (D-59, 16.10.2026).** ERP'ye veri yazma (`dexa.write`) ve kullanıcı adına e-posta/SMS/mobil bildirim
143
+ **Kullanıcı onayı.** ERP'ye veri yazma (`dexa.write`) ve kullanıcı adına e-posta/SMS/mobil bildirim
145
144
  (`mail.execute`, `sms.execute`, `push.execute`) manifest'te beyan edilmiş ve kullanıcının yetkisi olsa bile, kullanıcı bu uygulamaya
146
145
  **o portalda** ayrıca onay vermeden belirtece girmez. Onay bir kez verilir, **30 gün** geçerlidir; portal uygulamanın
147
146
  üstünde bir uyarı ve "İzinleri incele" düğmesi gösterir, onay devoplus-auth ekranında verilir ve oradaki "Yetkili
@@ -150,7 +149,7 @@ yüzden bu işleri yapan rotalar `requireScope` ile korunmalı, arayüz `awaitsU
150
149
  yönlendirme yazabilir. Onay kaldırılınca sonraki her belirteç hassas scope'u taşımaz (devoplus-auth onayı güçlü tutarlı
151
150
  bir Durable Object'te tutar); daha önce verilmiş belirteç iptal edilmez, en çok ömrü kadar (10 dk) geçerli kalır.
152
151
 
153
- ## Portal köprüsü ve görsel dil (D-76)
152
+ ## Portal köprüsü ve görsel dil
154
153
 
155
154
  Uygulama sayfası Portal'da iframe içinde açılır. Sayfa üç dosyayı **kendi** adresinden yükler; satır içi betik
156
155
  platformda kapalıdır (`script-src 'self'`) ve `one-ci validate` satır içi ya da harici (`https://...`) betiği yayından önce
@@ -176,9 +175,9 @@ if (url.pathname === '/shell.js') return scriptResponse(renderShellScript(NAVIGA
176
175
 
177
176
  | Sunucu üyesi | Açıklama |
178
177
  |---|---|
179
- | `clientAssetResponse(pathname): Response \| null` | `/one-bridge.js` (`ONE_BRIDGE_SCRIPT`, `text/javascript`), `/one-components.js` (`ONE_COMPONENTS_SCRIPT`, hazır bileşenler, D-83) ve `/one-ui.css` (`ONE_UI_CSS`, `text/css`); başka yolda `null`. |
178
+ | `clientAssetResponse(pathname): Response \| null` | `/one-bridge.js` (`ONE_BRIDGE_SCRIPT`, `text/javascript`), `/one-components.js` (`ONE_COMPONENTS_SCRIPT`, hazır bileşenler) ve `/one-ui.css` (`ONE_UI_CSS`, `text/css`); başka yolda `null`. |
180
179
  | `scriptResponse(body)` | Sayfa betiği için doğru içerik türüyle yanıt. |
181
- | `navigationFromManifest(manifest)` | Manifest `navigation` alanı: bozuk/yinelenen öğe atlanır, en çok `NAVIGATION_MAX_ITEMS` (12). Yol kuralı `ROUTE_PATH_RE` / `isRoutePath` (manifest şemasıyla aynı). Sekme izni (`permission`, S10) korunur; biçimi bozuk izinli öğe atlanır. |
180
+ | `navigationFromManifest(manifest)` | Manifest `navigation` alanı: bozuk/yinelenen öğe atlanır, en çok `NAVIGATION_MAX_ITEMS` (12). Yol kuralı `ROUTE_PATH_RE` / `isRoutePath` (manifest şemasıyla aynı). Sekme izni (`permission`) korunur; biçimi bozuk izinli öğe atlanır. |
182
181
  | `visibleNavigation(items, access)` | Kişinin görebildiği sekmeler (`access`: `{ permissions, admin }` ya da `null` = yalnız izinsiz sekmeler); dönen öğeler izin kodu taşımaz. |
183
182
 
184
183
  Tarayıcıdaki `window.one` (tip: `OneBridge`):
@@ -186,22 +185,26 @@ Tarayıcıdaki `window.one` (tip: `OneBridge`):
186
185
  | Üye | İleti | Açıklama |
187
186
  |---|---|---|
188
187
  | `one.start({ navigation })` | `one:ready` + `one:navigation` | Sayfa hazır olunca **bir kez**; yükseklik bildirimini de başlatır (`one:resize`). Menü sözleşmeye uymuyorsa fırlatır. İzinli sekmeler (`permission`) erişim bildirilene kadar gönderilmez. |
189
- | `one.setNavigationAccess({ permissions, admin })` | `one:navigation` | Oturumdaki kişinin uygulama izinleri (S10): görebildiği izinli sekmeler menüye eklenir (menü değiştiyse ileti yeniden gönderilir; Portal son iletiyi geçerli sayar). Yönetici her sekmeyi görür. Oturum bilgisini okuyunca çağırın (`GET /api/session`). |
188
+ | `one.setNavigationAccess({ permissions, admin })` | `one:navigation` | Oturumdaki kişinin uygulama izinleri: görebildiği izinli sekmeler menüye eklenir (menü değiştiyse ileti yeniden gönderilir; Portal son iletiyi geçerli sayar). Yönetici her sekmeyi görür. Oturum bilgisini okuyunca çağırın (`GET /api/session`). |
190
189
  | `one.token`, `one.onToken(fn)`, `one.fetch(yol, init)` | `one:token` | Belirteç yalnız Portal'dan gelir; `one.fetch` `Authorization: Bearer ...` ekler. |
191
190
  | `one.context`, `one.onContext(fn)`, `one.actor` | `one:context` | `{ theme, lang, autoHeight, actor: { kind } \| null, design }`. Köprü `data-theme`'i köke yazar, tasarım değerlerini (`primary`, `primaryContrast`, `fontFamily`, `radius`; biçimi tutmayan değer yazılmaz) `--one-primary` ve benzeri değişkenlere geçirir, `autoHeight` gelince sayfanın kendi dikey taşmasını gizler (yatay taşma kaydırılabilir kalır; yatay kaydırma çubuğu bildirilen yüksekliğe eklenir). `one.actor` yalnız gösterim içindir; yazma kapısı sunucudadır. |
192
191
  | `one.onNavigate(fn)`, `one.path` | `one:navigate` | Portal sekmesine tıklandı; görünümü değiştirin. Adres geçmiş kaydı eklenmeden güncellenir; geri bildirim gönderilmez. |
193
192
  | `one.setRoute(yol)` | `one:route` | Uygulama kendi içinde görünüm değiştirdi; Portal adresi güncellenir. Yol `/` ile başlar, sorgu/`#` yok. |
194
193
  | `one.setTitle(metin \| null)` | `one:title` | Alt sayfa başlığı (en çok `TITLE_MAX_LENGTH` = 120, uzunu kesilir); `null` kaldırır. |
195
- | `one.toast({ severity, summary, detail? })` | `one:toast` | `success`, `info`, `warn`, `error`; Portal çizer. Düz metin. |
194
+ | `one.toast({ severity, summary, detail? })` | `one:toast` | `success`, `info`, `warn`, `error`; Portal içindeyken Portal çizer. Düz metin. Portal dışında hazır bileşenler yüklüyse sayfanın köşesinde gösterilir, değilse konsola yazılır. |
196
195
  | `await one.confirm({ message, title?, severity?, acceptLabel?, rejectLabel? })` | `one:confirm`, yanıt `one:confirm-result` | `true`/`false`. `severity`: `danger`, `warn`, `info`. Portal origin'i yoksa `false`. ⚠️ Portal bu iletiyi tanımıyorsa söz çözülmez. |
197
196
  | `await one.download({ name, mime, data })` | `one:download` | `data` ArrayBuffer (Uint8Array, Blob ve metin çevrilir); en çok `DOWNLOAD_MAX_BYTES` (25 MB). iframe'de indirme kapalıdır; Portal kaydeder. |
198
197
  | `one.openExternal(url)` | `one:open-external` | Yalnız `https://`; Portal kullanıcıya sorup yeni sekmede açar. |
199
198
  | `one.setDirty(bool)` | `one:dirty` | Kaydedilmemiş değişiklik; Portal ayrılmadan önce sorar. Yalnız değişince gönderilir. |
200
- | `one.viewport.current`, `one.viewport.onChange(fn)` | `one:viewport` | iframe'in ekranda görünen kısmı `{ top, height }` (iframe CSS pikseli). Kendi penceresini görünen alana yerleştirmek için kullanılır. |
199
+ | `one.viewport.current`, `one.viewport.onChange(fn)` | `one:viewport` | iframe'in ekranda görünen kısmı `{ top, height }` (iframe CSS pikseli). Kendi penceresini görünen alana yerleştirmek için kullanılır. Köprü aynı değeri `--one-viewport-top` / `--one-viewport-height` CSS değişkenlerine de yazar (`<one-dialog>` bunlarla yerleşir; betik konum yazmaz). |
200
+ | `one.setModal(bool)` | `one:modal { open }` | Uygulama içinde pencere açık mı? `true` Portal'a kendi ekranını, çerçevenin görünen kısmı DIŞINDA aynı renkle karartmasını söyler; `false` karartmayı kaldırır. Yalnız değişince gönderilir; `one.start()`'tan önce açılmış pencere `one:ready`'nin ardından yeniden bildirilir. Sayfa giderken (tam sayfa gezinme, yeniden yükleme) açık pencere Portal'a kapalı bildirilir; sayfa geri/ileri önbelleğinden dönerse ve pencere açık kalmışsa yeniden açık bildirilir. `<one-dialog>` bunu kendisi çağırır; elle yalnız kendi penceresini çizen uygulama kullanır. |
201
+ | (köprü kendisi) | `one:modal-escape` | Pencere açıkken odak iframe'de olduğu için Escape Portal'a ulaşmaz. Uygulama tuşu işlemezse köprü onu Portal'a iletir ve Portal bunu vazgeçme sayar (`one:modal-dismiss` döner). İletilmediği durumlar: tuşa basıldığı anda sayfada kipli bir `<dialog>` vardı (tarayıcı Escape'i yalnız kipli `<dialog>`'da, `showModal()` ile açılmışsa, `cancel` olarak kendisi işler; `<one-dialog>` da öyle; pencereyi `close` olayında kapatmanız yeterlidir), Escape `stopPropagation()` ya da `preventDefault()` ile işlendi ya da olay bittiğinde pencere kapanmıştı. Escape'i zaman uyumsuz işliyorsanız `preventDefault()` çağırın; yoksa Portal da vazgeçer. |
202
+ | `one.onModalDismiss(fn)` | `one:modal-dismiss` | Kullanıcı Portal'ın karartılmış alanına tıkladı ya da Portal'da Escape'e bastı: Portal karartmayı **beklemeden kendisi** kaldırmıştır; açık pencereyi "vazgeçildi" diye kapatın. Uygulama Portal'ı kilitleyemez (karartma ayrıca uygulama/kimlik değişince, Portal gezintisinde, sayfa yeniden yüklenince kalkar; açılış hız sınırlıdır). |
201
203
 
202
204
  Bütün iletiler yalnız iframe `src`'sindeki `parent` origin'lerine gönderilir (joker yok); gelen ileti origin ve üst
203
205
  pencere doğrulanarak alınır. Portal dışında (yerel geliştirme) ileti gönderilmez: `confirm` tarayıcının kendi sorusuna,
204
- `download` tarayıcı indirmesine, `openExternal` yeni pencereye, `toast` konsola düşer.
206
+ `download` tarayıcı indirmesine, `openExternal` yeni pencereye düşer; `toast` hazır bileşenler yüklüyse sayfada, değilse
207
+ konsolda görünür.
205
208
 
206
209
  **Görsel dil (`/one-ui.css`):** açık/koyu değişkenler (`--one-bg`, `--one-fg`, `--one-muted`, `--one-surface`,
207
210
  `--one-border`, `--one-primary`, `--one-primary-contrast`, `--one-font-family`, `--one-radius`, durum renkleri) ve
@@ -210,9 +213,20 @@ sınıflar: `one-btn` (`-primary`, `-danger`, `-text`), `one-field` + `one-label
210
213
  `-error`), içerik sekmeleri `one-tabs` + `one-tab` (`aria-selected`), `one-row`, `one-stack`, `one-muted`, `one-empty`,
211
214
  `one-loading`, `one-sr-only`. ⚠️ `one-tabs` içerik içi gruplama içindir; uygulama menüsünü Portal çizer.
212
215
 
213
- ## Hazır arayüz bileşenleri (D-83)
216
+ **Ek sınıflar** (renkler tema değişkenlerinden; hareket azaltma tercihine uyulur):
214
217
 
215
- Liste, form, süzgeç, kişi seçimi, dosya yükleme ve grafik için hazır bileşenler `/one-components.js`'tedir. Bileşenler
218
+ | Sınıf | İşaretleme | Not |
219
+ |---|---|---|
220
+ | `one-badge` (+ `-success`, `-info`, `-warn`, `-error`, `-primary`) | `<span class="one-badge one-badge-success">Onaylandı</span>` | Durum rozeti. Durumu yalnız renkle anlatmayın; metin taşır. |
221
+ | `one-switch` | `<label class="one-check"><input type="checkbox" role="switch" class="one-switch"> Bildirimler</label>` | Açık/kapalı anahtarı; tarayıcının onay kutusudur (klavye ve ekran okuyucu hazır). |
222
+ | `one-radio-group` (+ `-inline`) | `<fieldset class="one-radio-group" role="radiogroup"><legend class="one-label">Öncelik</legend><label class="one-check"><input type="radio" name="p"> Düşük</label>...</fieldset>` | Ok tuşları tarayıcının kendi radyo davranışıdır. |
223
+ | `one-progress` | `<progress class="one-progress" max="100" value="60">%60</progress>` | `value` yoksa belirsiz (akan) kip. Etiketi `<label for>` ya da `aria-label` ile verin. |
224
+ | `one-spinner` (+ `-lg`), `one-loading-inline` | `<span class="one-loading-inline" role="status"><span class="one-spinner" aria-hidden="true"></span> Yükleniyor</span>` | Yalnız döner simge kullanılacaksa `role="status"` + `aria-label` verin. |
225
+
226
+ ## Hazır arayüz bileşenleri
227
+
228
+ Liste, form, süzgeç, kişi seçimi, dosya yükleme ve grafik için hazır bileşenler `/one-components.js`'tedir; açılır
229
+ liste, etiket girişi, pencere, ipucu, avatar, eylem menüsü, sekmeler ve akordeon da oradadır (aşağıda). Bileşenler
216
230
  bağımlılıksızdır, uygulamanın **kendi** adresinden yüklenir (satır içi betik gerekmez), `/one-ui.css` görsel dilini
217
231
  kullanır, Portal'ın tema ve dil değişimini (`one:context`) kendiliğinden izler ve bütün metinleri Türkçe + İngilizce
218
232
  taşır. Tarih `gg.aa.yyyy`, sayı ve para `tr-TR` biçimindedir. İstekler yalnız uygulamanın kendi adresine gider ve
@@ -275,7 +289,8 @@ Süzgeç değerleri `<one-filter>`'dan parametre olarak gelir: metin için `q`,
275
289
  iletilerle; hatalı alan `aria-invalid` alır ve odak ilk hataya gider. Sunucu 4xx yanıtındaki RFC 9457 `errors` alanı
276
290
  (`{ "alan": "ileti" | ["ileti"] }` ya da `[{ "field" | "pointer": "#/alan", "detail": "..." }]`) alanlara bağlanır;
277
291
  eşleşmeyen iletiler ve `detail` formun üstünde gösterilir. Kaydedilmemiş değişiklik köprüye bildirilir
278
- (`one.setDirty`); Vazgeç değişiklik varsa Portal'da onay sorar. Başkası adına açılmış oturumda (Vekalet / Yerine
292
+ (`one.setDirty`; sayfada birden çok form varsa herhangi biri kirli olduğu sürece Portal sorar, sayfadan ayrılan form
293
+ sayılmaz, yeniden eklenen kirli form yeniden sayılır); Vazgeç değişiklik varsa Portal'da onay sorar. Başkası adına açılmış oturumda (Vekalet / Yerine
279
294
  Görüntüle) Kaydet kapalıdır; manifest `actingSessions: "write"` beyan eden uygulama forma `acting-write` yazar.
280
295
 
281
296
  **Kişi araması:** bileşen uygulamanın kendi ucuna gider; ucu SDK hazırlar:
@@ -299,10 +314,90 @@ tarayıcıda denetlenir; sunucu yine kendi sınırını uygular. Kaldır düğme
299
314
  **Grafik** SVG'dir: `role="img"` + `aria-label`, ekran okuyucu için gizli veri tablosu, renkler `--one-chart-1` ile
300
315
  `--one-chart-6` arasındaki değişkenlerden (açık/koyu).
301
316
 
317
+ ### Açılır liste, pencere ve gezinme bileşenleri
318
+
319
+ | Bileşen | Özellikler (JS) | Öznitelikler | Olaylar |
320
+ |---|---|---|---|
321
+ | `<one-select>` | `options` (`[{ value, label, description?, disabled? }]`), `value` (tekli: değer ya da `null`; `multiple`: dizi), `label` | `label`, `multiple`, `required`, `disabled`, `placeholder`, `lang` | `change` `{ value }` |
322
+ | `<one-tag-input>` | `value` (`string[]`), `suggestions` (`string[]`, isteğe bağlı), `label` | `label`, `max` (adet, varsayılan 50), `max-length` (karakter, varsayılan 50), `required`, `disabled`, `placeholder`, `lang` | `change` `{ value }` |
323
+ | `<one-dialog>` | `label`, `body` (gövde öğesi), `open` (salt okunur), `show()` (`Promise<string>` döner), `close(değer?)` | `label` (başlık), `size` (`sm`, `lg`), `accept-label` / `reject-label` (onay penceresi), `severity` (`danger`, `warn`, `info`), `alert` (`role="alertdialog"`), `open` (eklenince açılır, kaldırılınca kapanır), `lang` | `open`; `cancel` `{ reason }` (iptal edilebilir; `escape`, `close`, `backdrop`, `portal`); `close` `{ returnValue }` |
324
+ | `<one-tooltip>` | `text` (`{ tr, en }` ya da metin) | `text`, `text-en`, `placement="bottom"`, `lang` | Yok |
325
+ | `<one-menu>` | `items` (`[{ id, label, danger?, disabled? }]`, ayraç `{ separator: true }`), `label` | `label`, `compact` (yalnız `⋯` düğmesi; `label` erişilebilir ad olur), `disabled`, `lang` | `select` `{ id }` |
326
+ | `<one-avatar>` | Yok | `name`, `src` (kendi adresi, `https:`, `data:image/`, `blob:`), `size` (`sm`, `lg`), `lang` | Yok |
327
+ | `<one-tabs>` | `selected` (sekme anahtarı) | `label` (sekme şeridinin erişilebilir adı), `selected`, `lang` | `change` `{ tab }` |
328
+ | `<one-accordion>` | Yok | `multiple`, `heading-level` (2-6, varsayılan 3), `lang` | `toggle` `{ index, open, key }` |
329
+
330
+ **Açılır liste** (`<one-select>`): APG "combobox + listbox" kalıbı. Yazınca Türkçe harf duyarsız süzer (`ı`/`i`, `ş`/`s`
331
+ gibi), ok tuşları etkin seçeneği taşır (devre dışı seçenek atlanır), Enter seçer, Escape önce listeyi kapatır (olay dışarı,
332
+ ör. pencereye, taşmaz), Alt+Aşağı listeyi açar. Çoklu seçimde liste açık kalır, seçilenler etiket olarak görünür ve boş
333
+ alanda Geri son seçimi kaldırır. En çok 200 seçenek gösterilir (fazlası için "aramayı daraltın" yazar). Liste giriş alanının
334
+ altında akış içindedir (Portal iframe'i içerik boyunda çizer; akış dışındaki liste kesilirdi). Değer seçeneğin `value`'sudur
335
+ (sayı ve mantıksal değer korunur). Seçimi yalnız `null` (ya da `undefined`) atamak temizler. `''` yalnız `''` değerli bir
336
+ seçenek varsa seçilir: önce `options`, sonra `value` atayın; seçenekler değişince artık seçenek olmayan `''` seçimden düşer.
337
+
338
+ **Etiket girişi** (`<one-tag-input>`): Enter ya da virgül etiket ekler; yapıştırılan virgüllü/çok satırlı liste ayrı
339
+ etiketlere bölünür; alandan ayrılınca yazılı kalan metin etikete dönüşür; aynı etiket (büyük/küçük harf ve Türkçe harf
340
+ duyarsız) ikinci kez eklenmez. Uzunluk, adet ve yinelenme nedenini durum satırı söyler. `suggestions` verilirse kutu
341
+ combobox olur ve öneriler listelenir.
342
+
343
+ **Pencere** (`<one-dialog>`): tarayıcının kipli penceresidir (`<dialog>.showModal()`): odak pencerede kalır, sayfanın geri
344
+ kalanı etkisizdir. Alt öğeler gövdeye taşınır; `data-one-dialog-footer` taşıyan öğe alt bilgiye gider. `data-one-close="değer"`
345
+ taşıyan her düğme pencereyi o değerle kapatır (`<form method="dialog">` da çalışır). İlk odak sırası: `autofocus`, onay
346
+ penceresinde "vazgeç", gövdedeki ilk odaklanabilir öğe, kapat düğmesi; kapanınca odak açan öğeye döner. Escape, kapat
347
+ düğmesi ve karartmaya tıklama iptal edilebilir `cancel` olayıdır (`preventDefault` pencereyi açık tutar).
348
+
349
+ - Pencere iframe'in **görünen** dilimine yerleşir (uzun sayfada kullanıcının baktığı yerde açılır).
350
+ - Açılınca köprü `one.setModal(true)` ile Portal'a bildirir; Portal kendi ekranını aynı renkle karartır ve iki karartma
351
+ kenarda birleşir. Kullanıcı Portal'ın karartılmış alanına tıklarsa ya da Portal'da Escape'e basarsa Portal karartmayı
352
+ kendisi kaldırır ve pencere `cancel` (`reason: "portal"`) ile kapanır. `cancel` iptal edilirse pencere açık kalır ama
353
+ Portal yeniden karartılmaz.
354
+ - **Onay penceresi** (`accept-label` / `reject-label`): sonuç `'accept'` ya da `'reject'`. ⛔ Portal içindeyken pencere
355
+ iframe'de ÇİZİLMEZ, Portal'ın onay penceresiyle (`one.confirm`) sorulur: başlık `label`, ileti gövdenin DÜZ
356
+ METNİ (HTML ve biçim taşınmaz), düğmeler `accept-label` / `reject-label`, `severity`. Portal'ın onay penceresi
357
+ uygulamadan kapatılamaz (`close()` etkisizdir). Portal dışında (yerel geliştirme) aynı pencere sayfada çizilir.
358
+ - Zengin içerikli onay (biçimli metin, alan) gerekiyorsa onay öznitelikleri olmadan genel pencere kullanın ve düğmeleri
359
+ `data-one-close` ile kendiniz koyun; o pencere Portal içinde de iframe'de çizilir.
360
+
361
+ **Bildirim** için ayrı bileşen yoktur: `one.toast(...)` Portal içindeyken bildirimi Portal'a verir (tek görünüm); Portal
362
+ dışında hazır bileşenler yüklüyse sayfanın köşesinde gösterir (hata 8, diğerleri 5 saniye; kapatılabilir).
363
+
364
+ **İpucu** (`<one-tooltip>`): ilk alt öğe tetikleyicidir ve **odaklanabilir** olmalıdır (düğme, bağlantı). Fareyle üzerine
365
+ gelince ve klavye odağıyla görünür, Escape ile kapanır, fare ipucunun üzerine geçebilir (WCAG 1.4.13). Tetikleyiciye
366
+ `aria-describedby` bağlanır. İpucuna önemli bilgi koymayın; ipucu dokunmatik ekranda görünmeyebilir.
367
+
368
+ **Eylem menüsü** (`<one-menu>`): APG "menu button". Düğme `aria-haspopup="menu"`; açınca ilk öğe odaklanır (Yukarı ok ile
369
+ son öğe), oklar/Home/End gezinir, harf yazınca o harfle başlayan öğeye atlar, Enter/Boşluk seçer, Escape kapatıp odağı
370
+ düğmeye döndürür. Devre dışı öğe odaklanır ama seçilmez. Menü aşağıda yer yoksa yukarı açılır.
371
+
372
+ **Avatar** (`<one-avatar>`): baş harfler Türkçe büyük harfle (`şule yıldız` için `ŞY`), renk addan kararlı biçimde seçilir;
373
+ erişilebilir ad kişinin adıdır. Görsel yüklenemezse baş harflere döner.
374
+
375
+ **Sekmeler** (`<one-tabs>`): alt öğeler paneldir: `data-label` (+ `data-label-en`), isteğe bağlı `data-tab` (anahtar) ve
376
+ `data-disabled`. APG "tabs": oklar devre dışı sekmeyi atlayarak gezer ve seçer, Home/End uçlara gider. Uygulama menüsü
377
+ DEĞİLDİR (menüyü Portal çizer); içerik içi gruplama içindir. Seçimin tek kaynağı `selected` özniteliğidir: `selected`
378
+ özelliği başlangıçta da gösterilen sekmeyi döndürür, kullanıcının seçimi özniteliğe yazılır, uygulama özniteliği sonradan
379
+ da değiştirebilir. `change` yalnız seçim gerçekten değişince yayılır. Panel sonradan eklenir ya da `data-label`,
380
+ `data-tab`, `data-disabled` değişirse şerit yenilenir.
381
+
382
+ **Akordeon** (`<one-accordion>`): alt öğeler bölümdür: `data-label` (+ `data-label-en`), başlangıçta açık olan için
383
+ `data-open`. Başlık düğmesi `aria-expanded` taşır, oklar başlıklar arasında gezer; `multiple` yoksa aynı anda tek bölüm açıktır.
384
+ `data-open` iki yönlüdür: kullanıcı bölüm açınca öznitelik eklenir, kapatınca kalkar; uygulama özniteliği ekleyip
385
+ kaldırarak bölümü açıp kapatabilir.
386
+
387
+ **Sayfadan ayrılıp yeniden eklenen bileşen:** ayrıyken değişen öznitelikler yeniden eklenince uygulanır (ör. `src`
388
+ değişen tablo bir kez yeniden yüklenir, `open` alan pencere açılır, `selected` alan sekmeler o sekmeyi gösterir); ayrıyken
389
+ değişip eski değerine dönen öznitelik yok sayılır (tablo bulunduğu sayfada kalır). Ayrılan açık pencere `''` ile kapanır
390
+ ve Portal karartması kalkar; yeniden eklenince kapalı görünür, `show()` ya da `open` ile yeniden açılır (Portal'ın onay
391
+ penceresi hariç: o yanıt gelince sonuçlanır). Açık liste, menü ve ipucu kapanır.
392
+
393
+ **Açılır öğeler ve yükseklik:** menü ve ipucu kapsayıcılarına göre mutlak konumludur; açıkken alt kenarları otomatik
394
+ yükseklik ölçütüne katılır (`data-one-popup`), sayfanın altındaki menü iframe'in alt kenarında kesilmez.
395
+
302
396
  | Sabit | Değer |
303
397
  |---|---|
304
398
  | `COMPONENTS_SCRIPT_PATH` | `/one-components.js` (`ONE_COMPONENTS_SCRIPT`) |
305
- | `ONE_COMPONENT_TAGS` | altı etiket adı |
399
+ | `ONE_COMPONENT_TAGS` | on dört etiket adı |
400
+ | `ONE_COMPONENT_EVENTS` | etiket başına yayılan olay adları (`OneComponentEvents` ile aynı küme) |
306
401
  | `PEOPLE_SEARCH_PATH`, `PEOPLE_SEARCH_MIN_QUERY`, `PEOPLE_SEARCH_MAX_QUERY`, `PEOPLE_SEARCH_MAX_RESULTS` | `/api/one/people`, 2, 100, 20 |
307
402
  | `FILE_UPLOAD_DEFAULT_ACTION`, `FILE_UPLOAD_DEFAULT_MAX_BYTES` | `/api/files`, 5 MB |
308
403
  | `TABLE_DEFAULT_PAGE_SIZE`, `TABLE_MAX_PAGE_SIZE` | 20, 100 |
@@ -310,7 +405,11 @@ tarayıcıda denetlenir; sunucu yine kendi sınırını uygular. Kaldır düğme
310
405
  Tipler: `OneTableColumn`, `OneTableElement`, `OneListResponse`, `OneFormField`, `OneFormElement`, `OneFormErrors`,
311
406
  `OneFilterField`, `OneFilterElement`, `OneFilterChange`, `OnePerson`, `OnePersonPickerElement`, `OneUploadedFile`,
312
407
  `OneFileUploadElement`, `OneChartData`, `OneChartSeries`, `OneChartElement`, `OneChoiceOption`, `OneLocalizedText`,
313
- `OneFieldType`, `OneComponentEventMap`; sunucu: `peopleSearchHandler`, `searchPeople` (saf), `foldPersonText`,
408
+ `OneFieldType`, `OneSelectElement`, `OneSelectOption`, `OneSelectValue`, `OneTagInputElement`, `OneDialogElement`,
409
+ `OneDialogCancelReason`, `OneTooltipElement`, `OneMenuElement`, `OneMenuItem`, `OneTabsElement`. Olay yükleri bileşen
410
+ başına `OneComponentEvents[etiket][olay]` (ör. `OneComponentEvents['one-dialog']['cancel']` = `{ reason }`) ya da
411
+ `OneComponentEvent<etiket, olay>` (`CustomEvent`) ile yazılır; eski birleşik `OneComponentEventMap` yükü daraltamaz
412
+ ve kullanımdan kalkacaktır. Sunucu: `peopleSearchHandler`, `searchPeople` (saf), `foldPersonText`,
314
413
  `PeopleSearchItem`, `PeopleSearchEnv`, `PeopleSearchOptions`.
315
414
 
316
415
  ## Backend istemcisi
@@ -328,7 +427,7 @@ Backend "kullanıcı yetkisi ∩ scope" kuralını kendisi uygular; SDK ek bir y
328
427
 
329
428
  ## Dosya servisi
330
429
 
331
- Manifest'te `services.files: true` ise platform kurulum başına bir dosya deposu açar ve `env.FILES`'a bağlar (D-32).
430
+ Manifest'te `services.files: true` ise platform kurulum başına bir dosya deposu açar ve `env.FILES`'a bağlar.
332
431
  İzolasyon depo sınırındadır: anahtara `portalId` eklenmez, başka kurulumun deposu görünmez.
333
432
 
334
433
  | Üye | Açıklama |
@@ -343,7 +442,7 @@ Manifest'te `services.files: true` ise platform kurulum başına bir dosya depos
343
442
 
344
443
  ## Önbellek servisi
345
444
 
346
- Manifest'te `services.cache: true` ise platform kurulum başına bir önbellek açar ve `env.CACHE`'e bağlar (D-35). İzolasyon
445
+ Manifest'te `services.cache: true` ise platform kurulum başına bir önbellek açar ve `env.CACHE`'e bağlar. İzolasyon
347
446
  önbellek sınırındadır. Bu bir **önbellektir**: nihai tutarlıdır (yazma başka bölgelerde 60 sn'ye kadar gecikebilir).
348
447
  Sayaç, kilit ya da kalıcı kayıt için kullanılmaz; kalıcı veri veritabanındadır.
349
448
 
@@ -367,9 +466,9 @@ yalnız hiçbir ileti kuyruğa girmez **ve** atlananların tamamı `rate-limited
367
466
  girmeyen istek **200** + `queued: 0` alır. Sonucu `skipped[].reason` ile denetleyin (backend `OneServiceHandlers`,
368
467
  okundu 15.10.2026).
369
468
 
370
- **Org kimliğiyle alıcı (D-47):** `toOrgUserIds` alanı org şemasındaki kullanıcı kimliğini (legacy `User._id`, 24-hex) kabul eder. Yönetici zinciri ve grup üyeleri bu uzayda geldiği için onlara `sub` bulmadan bildirim gönderilebilir. `toSubjects` ile birlikte verilebilir; toplam alıcı en çok 50'dir, aynı kişi iki kez sayılmaz. Biçimi bozuk org kimliği `invalid-org-user`, portalın aktif kullanıcısı olmayan kimlik `not-in-portal` ile atlanır. ⛔ İki kimlik uzayını karıştırmayın: `ctx.user.sub` org kimliği DEĞİLDİR (ikisi de 24-hex; karışırsa hata vermez, kişi `not-in-portal` ile sessizce atlanır).
469
+ **Org kimliğiyle alıcı:** `toOrgUserIds` alanı org şemasındaki kullanıcı kimliğini (legacy `User._id`, 24-hex) kabul eder. Yönetici zinciri ve grup üyeleri bu uzayda geldiği için onlara `sub` bulmadan bildirim gönderilebilir. `toSubjects` ile birlikte verilebilir; toplam alıcı en çok 50'dir, aynı kişi iki kez sayılmaz. Biçimi bozuk org kimliği `invalid-org-user`, portalın aktif kullanıcısı olmayan kimlik `not-in-portal` ile atlanır. ⛔ İki kimlik uzayını karıştırmayın: `ctx.user.sub` org kimliği DEĞİLDİR (ikisi de 24-hex; karışırsa hata vermez, kişi `not-in-portal` ile sessizce atlanır).
371
470
 
372
- ### Mobil bildirim (D-55; ⚠️ geliştirici onayı bekliyor)
471
+ ### Mobil bildirim
373
472
 
374
473
  `sendPush(api, { toSubjects, toOrgUserIds?, title, text })`, `POST One/services/push` ucunu çağırır; scope `push.execute`. Devoplus
375
474
  Portal mobil uygulamasına **yalnız başlık + metin** gider (başlık 1-100, metin 1-300 karakter; bu sınırı sunucu uygular, SDK
@@ -379,7 +478,7 @@ Portal mobil uygulamasına **yalnız başlık + metin** gider (başlık 1-100, m
379
478
  ⚠️ Push bugün **hiçbir ortamda açık değildir**: uç kuyruğa almadan `OneError` `ONE-APP-E-029` ile reddeder (kapalı
380
479
  kanal sessiz başarı gibi görünmesin). Kodunuz bu hatada çalışmayı sürdürmeli; `notify` kanalları bağımsız gönderir.
381
480
 
382
- ### Hazır bildirim senaryoları (D-47)
481
+ ### Hazır bildirim senaryoları
383
482
 
384
483
  `approvalRequest`, `approvalResult`, `reminder`, `systemNotice`, `operationResult`, `verificationCode` aynı girdiden e-posta konusu + gövdesi ve SMS metni üretir (`ScenarioMessage { subject, text, smsText }`; Türkçe resmi "siz" ya da `lang: 'en'`). Metinler backend sınırlarına göre kırpılır (konu ≤ 200, SMS ≤ 300; e-posta gövdesi 10.000'i aşarsa `ONE-SDK-E-062`). Bağlantı yalnız `https` olabilir ve kullanıcı adı/parola taşıyamaz (`normalizeLink`, `ONE-SDK-E-061`). `notify(api, message, { toSubjects?, toOrgUserIds?, channels })` kanalları (`mail`, `sms`, `push`) **bağımsız** gönderir: SMS ya da push düşse de e-posta gider; sonuç kanal adıyla döner, düşen kanal `{ error }` taşır. `toPush(message, to)` başlığı e-posta konusundan (≤ 100, `PUSH_TITLE_MAX_LENGTH`), metni SMS metninden (≤ 300, `PUSH_TEXT_MAX_LENGTH`) kurar; kırpma bir emojiyi ortasından bölmez.
385
484
 
@@ -397,11 +496,11 @@ if (me) {
397
496
  }
398
497
  ```
399
498
 
400
- ### Doğrulama kodu (D-47)
499
+ ### Doğrulama kodu
401
500
 
402
501
  `generateVerificationCode(digits = 6)` (4-10 hane, yanlılıksız); `generateSalt()`; `hashVerificationCode({ code, salt, purpose, sub })`; `verificationCodeMatches({ ..., hash })` (sabit süreli karşılaştırma). Özet **amaca ve kişiye** bağlıdır: başka bir işlem ya da başka bir kişi için üretilmiş kod kabul edilmez. Kodun kendisini değil `salt + hash + son kullanma + deneme sayısı`nı uygulamanın **veritabanında** saklayın (önbellek nihai tutarlıdır; deneme sayacı ve tek kullanım orada güvenilir değildir). Süreyi ve deneme tavanını (ör. 5) uygulama uygular; doğru koddan sonra kaydı silin.
403
502
 
404
- ## Organizasyon şeması (D-47)
503
+ ## Organizasyon şeması
405
504
 
406
505
  Scope `orgschema.read` (salt okuma) + kullanıcının kendi `Portal.Generic.Read` izni. Veri aktif portalın aktif kayıtlarıdır.
407
506
 
@@ -418,9 +517,9 @@ Saf yardımcılar (ağ yok): `managerOf(users, orgUserId, kind?)`; `approvalChai
418
517
  ## DEXA (ERP okuma) servisi
419
518
 
420
519
  `queryDexa(api, key, parameters?)`, `POST One/services/dexa/query` ucunu çağırır. Uygulama ERP verisini **yalnız önceden tanımlı
421
- QueryStore anahtarlarıyla** okur (D-09; uç D-42, ⚠️ geliştirici onayı bekliyor): serbest SQL, ERP'ye yazan anahtar ya
520
+ QueryStore anahtarlarıyla** okur: serbest SQL, ERP'ye yazan anahtar ya
422
521
  da desteklenmeyen sorgu türü çalıştırılamaz. Hangi anahtarın çalışabileceğinin **tek kaynağı platform kayıt
423
- defteridir**: anahtarları Admin Console'da uygulamanın kaydına yönetici ekler; kayıtta olmayan anahtar 403
522
+ defteridir**: anahtarları Devoplus Console'da uygulamanın kaydına yönetici ekler; kayıtta olmayan anahtar 403
424
523
  `ONE-APP-E-024` alır. Manifest `services.dexa.queryKeys` yalnız **beyandır** (çalışma anında okunmaz) ve `scopes`
425
524
  içinde `dexa.read` ile birlikte yazılır; biri eksikse manifest doğrulaması düşer. Belirteçte `dexa.read` yoksa
426
525
  backend 403 `ONE-APP-E-017` döner.
@@ -473,7 +572,7 @@ başına saatte 600 sorgu); 400 `ONE-APP-E-076` (gönderilen bağlam kodu geçer
473
572
  karakteri içeriyor); 403 `ONE-APP-E-077` (gönderilen `UserCode` ya da `CompanyCode` kurulumun portalında tanımlı değil);
474
573
  400 `ONE-APP-E-078` (arka plan işinde sorgu bir bağlam kodu istiyor ve uygulama onu göndermedi).
475
574
 
476
- ### Bağlam kodları: `UserCode`, `CompanyCode`, `CostCenterCode` (C7)
575
+ ### Bağlam kodları: `UserCode`, `CompanyCode`, `CostCenterCode`
477
576
 
478
577
  Sorgu bu kodlardan birini bildiriyorsa değer şu sırayla belirlenir:
479
578
 
@@ -498,14 +597,14 @@ Sorgu bu kodlardan birini bildiriyorsa değer şu sırayla belirlenir:
498
597
  const stock = await queryDexa(api, 'Ornek.MagazaStok', { CompanyCode: '01', StoreCode: storeCode })
499
598
  ```
500
599
 
501
- ## DEXA işlemleri: ERP'ye veri yazma (D-56; ⚠️ geliştirici onayı bekliyor)
600
+ ## DEXA işlemleri: ERP'ye veri yazma
502
601
 
503
602
  `runDexaCommand(api, key, parameters, { idempotencyKey })`, `POST One/services/dexa/command` ucunu `Idempotency-Key`
504
603
  başlığıyla çağırır; `getDexaCommandStatus(api, idempotencyKey)` ise `GET One/services/dexa/command/{anahtar}` ucunu. Scope **`dexa.write`**.
505
604
  Okuma sorgularından (`queryDexa`) ayrıdır: bu uç ERP'ye **VERİ YAZAR**. Çalışması dört kapının kesişimidir:
506
605
 
507
606
  1. Belirteçte `dexa.write` (yoksa 403 `ONE-APP-E-017`).
508
- 2. Anahtar uygulamanın kayıt defterindeki işlem izin listesinde (`dexaCommandKeys`, Admin Console; yoksa 403 `ONE-APP-E-030`).
607
+ 2. Anahtar uygulamanın kayıt defterindeki işlem izin listesinde (`dexaCommandKeys`, Devoplus Console; yoksa 403 `ONE-APP-E-030`).
509
608
  3. Anahtar koddaki ERP komut kataloğunda **One uygulamalarına açık** (yoksa 404 `ERPCMD-APP-E-006`; açmak backend kod
510
609
  değişikliğidir; ⚠️ bugün açık hiçbir işlem yoktur).
511
610
  4. Kullanıcının o işleme özgü izni (yoksa 403 `ERPCMD-APP-E-0xx`).
@@ -568,10 +667,10 @@ Sorgulardaki ayrılmış bağlam parametresi yasağı (`LangCode` vb.) işlemler
568
667
  uygulamıyor. 4xx yanıtların hepsi ERP'ye **hiçbir şey gönderilmediği** anlamına gelir; ayrıca 429 `ONE-APP-E-018`
569
668
  (kurulum başına saatte 300 işlem).
570
669
 
571
- ## Zamanlanmış görev ve kuyruk (D-80)
670
+ ## Zamanlanmış görev ve kuyruk
572
671
 
573
672
  Uygulama işi manifest `jobs` ile **beyan eder** ve işleyicisini yazar; işi platform tetikler. Ayrıntı ve örnek:
574
- ajan belgesi `/docs/jobs.md`; manifest kuralları `docs/manifest.md` içindeki `jobs` bölümünde.
673
+ belgelerdeki `/docs/jobs` sayfası; manifest kuralları `/docs/manifest` sayfasındaki `jobs` bölümünde.
575
674
 
576
675
  | Üye | Açıklama |
577
676
  |---|---|
@@ -587,7 +686,7 @@ taşınmaz. Zamanlanmış iş kullanıcısızdır (`ctx.user` null). İkisinde d
587
686
  çağrılır (bkz. aşağıdaki bölüm). `/__one/` yolu platforma ayrılmıştır ve internetten kapalıdır. Yerelde (`one dev`) zamanlama
588
687
  tetiklenmez ve `enqueue` 503 döner.
589
688
 
590
- ## Devoplus servisleri arka plan işinde ve ajan aracında (C6)
689
+ ## Devoplus servisleri arka plan işinde ve ajan aracında
591
690
 
592
691
  İşte ve ajan aracında tarayıcıdan gelen bir belirteç yoktur; servis istemcileri (`BackendClient`) yine de çağrı yapar:
593
692
  platform çıkış katmanı isteği doğru kimlikle Devoplus'a taşır (`new BackendClient({ baseUrl, authorization: null })` ya
@@ -610,9 +709,9 @@ Devoplus'a **iletilmez**.
610
709
  `logEvent(ctx, level, message, data?)` sistem/çalışma zamanı olayı; `logError(ctx, message, error, data?)` beklenmeyen
611
710
  hata (ad, ileti ve en çok 4.000 karakterlik yığın; `OneError` kodu ve durumu korunur); `logAudit(ctx, action, target?,
612
711
  data?)` kritik kullanıcı işlemi; aktör zorunludur (anonim bağlamda fırlatır). Hepsi tek satır JSON olarak yazılır ve
613
- **platform günlüğünde saklanır**: platform her kurulumda günlüğü açar (D-45), örnekleme manifest
712
+ **platform günlüğünde saklanır**: platform her kurulumda günlüğü açar, örnekleme manifest
614
713
  `observability.headSamplingRate` (varsayılan 1). Satırları platform ekibi kurulum (uygulama × portal) süzgeciyle
615
- görür; uygulama geliştiricisine açık bir görüntüleme ekranı bu sürümde yoktur.
714
+ görür; uygulamanın son hata kayıtları kısaltılmış olarak kullanım ve hata panosunda görünür (`one status`).
616
715
 
617
716
  Koruma: `data` içinde adı parola, token, secret, authorization, cookie, API anahtarı, private key, credential ya da
618
717
  parola/şifre geçen alanların değeri `"[gizli]"` olur (her derinlikte, girdi değişmez; `redact`); JSON'u 8 KiB'ı aşan
@@ -624,7 +723,7 @@ metin döner.
624
723
  ## Denetim günlüğü (kalıcı)
625
724
 
626
725
  `recordAudit(api, ctx, action, target?, data?)`, `logAudit` izini yazar **ve** `POST One/services/audit` ile
627
- Devoplus denetim günlüğüne kaydeder (scope `audit.write`; D-36). Kayıt Admin Console Denetim Günlüğü'nde "Devoplus
726
+ Devoplus denetim günlüğüne kaydeder (scope `audit.write`). Kayıt Devoplus Console Denetim Günlüğü'nde "Devoplus
628
727
  One uygulaması" türüyle, `reason = {slug}:{action}`, `targetLabel = target`, `details = data` olarak görünür; aktör
629
728
  ve portal istekle gönderilmez, backend doğrulanmış bağlamdan alır. Kurallar sunucuyla birebir: `action`
630
729
  `^[a-z0-9][a-z0-9._:-]*$` ≤ 64, `target` ≤ 200, `data` JSON nesnesi ≤ 4 KiB (`buildAuditRequest`; ihlal
@@ -632,7 +731,7 @@ ve portal istekle gönderilmez, backend doğrulanmış bağlamdan alır. Kuralla
632
731
  `{ recorded: false }` + uyarı olayı döner, isteğiniz düşmez. ⛔ `target`/`data`ya kişisel veri ya da sır yazmayın
633
732
  (365 gün saklanır).
634
733
 
635
- ## Yapay zeka servisi (D-88 a; ⚠️ öneri, geliştirici onayı bekliyor)
734
+ ## Yapay zeka servisi
636
735
 
637
736
  `completeAi(api, ctx, istek)` (eşdeğeri `ai.complete`), `POST One/services/ai` ucunu çağırır (scope `ai.use`; kullanıcıdan ayrıca
638
737
  onay istenmez). Diğer `One/services/*` uçlarıyla aynı kapıdan geçer; kullanıcı, portal ve uygulama istekle GÖNDERİLMEZ.
@@ -658,7 +757,7 @@ olup olmadığı Devoplus'tadır: kapalı/yapılandırılmamış portalda 503, k
658
757
  hesaplamaz** ve **kayıt yazmaz**: tutar/toplam/tarih farkı kodda hesaplanıp `input`'a hazır verilir; çıktı bir öneridir,
659
758
  veritabanına yazmadan önce kod doğrular. `input`'a sır ya da işin gerektirmediği kişisel veri konmaz.
660
759
 
661
- ## Devoplus yapay zekasına açılan araçlar (D-88 b; ⚠️ öneri, geliştirici onayı bekliyor)
760
+ ## Devoplus yapay zekasına açılan araçlar
662
761
 
663
762
  Devoplus yapay zekası, kullanıcı Devoplus'ta bir soru sorduğunda uygulamanın verisine ve işlemlerine yalnız manifest
664
763
  `agent.tools[]` ile beyan edilen **araçlarla**, kullanıcının kendi kimliğiyle ulaşır. Her araç üç yerde durur: manifest
@@ -700,7 +799,7 @@ Girdi şeması JSON Schema'nın dar bir alt kümesidir: `type` (`object`, `strin
700
799
  `app: { slug, name }` + `agent`) ve `GET /.well-known/one-agent.md` (`AGENT_GUIDE.md`, ≤ 256 KiB) sunar; manifest'te
701
800
  `agent` yoksa 404. Rehbere kullanıcı verisi, sır ya da iç adres yazılmaz.
702
801
 
703
- ## Veri modeli ve kayıt işlemleri (D-84; ⚠️ geliştirici onayı bekliyor)
802
+ ## Veri modeli ve kayıt işlemleri
704
803
 
705
804
  Kayıt tutan uygulamada tabloyu, tipleri ve uçları elle yazmak yerine `one.data.json`'da **varlıkları ve alanları**
706
805
  tanımlayın; gerisini `one data generate` ve `createCrudHandler` yapar.
@@ -791,7 +890,7 @@ modelden seçilir.
791
890
  bulunur. ⚠️ Bir metin alanını **elle yazdığınız SQL ile güncelliyorsanız** arama kolonunu da yazın
792
891
  (`"<alan>_fold" = ?` + `foldSearchText(değer)`) ya da `NULL` yapın; yoksa arama eski metne göre bulur.
793
892
 
794
- ## Rapor ve dışa aktarma (D-85; ⚠️ geliştirici onayı bekliyor)
893
+ ## Rapor ve dışa aktarma
795
894
 
796
895
  `toCsv(rows, columns, { lang, delimiter, timeZone })`; `toXlsx(rows, columns, { lang, sheetName, timeZone })`;
797
896
  `exportResponse(içerik, { fileName, format: 'csv' | 'xlsx' | 'html' })`; `renderPrintableReport({ title, subtitle,
@@ -814,8 +913,8 @@ columns, rows, totals, lang })`. Sütun: `{ key, title: { tr, en }, type?: 'text
814
913
  |---|---|---|
815
914
  | `ONE-SDK-E-001` | 500 | Platform bağlamı eksik (dispatch dışından çağrı) |
816
915
  | `ONE-SDK-E-002` | 401 | Oturum gerekli |
817
- | `ONE-SDK-E-003` | 403 | Scope yok (onaya bağlı scope'ta kullanıcı henüz izin vermemiş olabilir, D-59) |
818
- | `ONE-SDK-E-004` | 403 | Uygulama izni yok (`requirePermission`, D-49) |
916
+ | `ONE-SDK-E-003` | 403 | Scope yok (onaya bağlı scope'ta kullanıcı henüz izin vermemiş olabilir) |
917
+ | `ONE-SDK-E-004` | 403 | Uygulama izni yok (`requirePermission`) |
819
918
  | `ONE-SDK-E-010...013` | 400 | Dosya anahtarı / adı geçersiz |
820
919
  | `ONE-SDK-E-014` | 413 | Dosya boyut tavanı (`put` ve `readBoundedBody`) |
821
920
  | `ONE-SDK-E-015` | 500 | Dosya yazılamadı |
@@ -879,7 +978,7 @@ Backend'den dönen kodlar (`ONE-APP-E-*`, `USRDIR-*` vb.) `OneError.code` ile ol
879
978
  ## Sürümleme
880
979
 
881
980
  SemVer; `0.x` boyunca küçük sürüm artışı kırıcı olabilir; `CHANGELOG.md` **Kırıcı** başlığına bakın. Paket iki
882
- kanaldan otomatik yayımlanır (`Publish SDK (npm)` iş akışı, D-60 ve D-94):
981
+ kanaldan otomatik yayımlanır (`Publish SDK (npm)` iş akışı):
883
982
 
884
983
  | Kanal | Ne zaman | Sürüm | npm etiketi |
885
984
  |---|---|---|---|
package/dist/client.d.ts CHANGED
@@ -116,6 +116,20 @@ export interface OneBridge {
116
116
  setTitle(title: string | null): void;
117
117
  setDirty(dirty: boolean): void;
118
118
  setRoute(path: string): void;
119
+ /**
120
+ * Uygulama içinde bir pencere (modal) açık mı (D-96)? `true` Portal'a arka planı karartmasını söyler, `false` karartmayı
121
+ * kaldırır; aynı değer yeniden gönderilmez. `<one-dialog>` bunu kendisi çağırır — elle yalnız kendi penceresini çizen
122
+ * uygulama kullanır. Karartma Portal'ındır: kullanıcı Portal'ın karartılmış alanına tıklarsa ya da Escape'e basarsa Portal
123
+ * karartmayı kaldırır ve `onModalDismiss` dinleyicileri çağrılır (uygulama Portal'ı kilitleyemez). Pencere açıkken odak
124
+ * iframe'de olduğundan Escape Portal'a ulaşmaz: uygulama tuşu işlemezse (tuşa basıldığı anda sayfada KİPLİ bir
125
+ * `<dialog>` yoktu, olay `stopPropagation()` ile durdurulmadı, iptal edilmedi ve olay bittiğinde pencere hâlâ açık)
126
+ * köprü onu Portal'a iletir. Tarayıcı Escape'i yalnız kipli `<dialog>`'da
127
+ * (`showModal()`) kendisi `cancel` olarak işler; `<one-dialog>` da öyle. Escape'i zaman uyumsuz işleyen uygulama
128
+ * `preventDefault()` çağırmalıdır; aksi hâlde Portal da vazgeçer.
129
+ */
130
+ setModal(open: boolean): void;
131
+ /** Portal karartmayı kullanıcı isteğiyle kaldırdı: açık pencere "vazgeçildi" diye kapatılmalı (D-96). */
132
+ onModalDismiss(fn: () => void): () => void;
119
133
  }
120
134
  /** Uygulama içi yol geçerli mi (manifest `navigation[].path` kuralı)? */
121
135
  export declare function isRoutePath(path: unknown): path is string;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AA4BA,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAClD,eAAO,MAAM,WAAW,gBAAgB,CAAA;AAExC,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,MAAM,CAAA;AACnC,gEAAgE;AAChE,eAAO,MAAM,kBAAkB,QAAmB,CAAA;AAClD,+HAA+H;AAC/H,eAAO,MAAM,aAAa,QAA6E,CAAA;AAGvG,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,sGAAsG;AACtG,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,6FAA6F;AAC7F,eAAO,MAAM,wBAAwB,QAAgD,CAAA;AAErF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,iBAAiB,EAAE,CAI9H;AACD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AACpE,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AACD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,8GAA8G;IAC9G,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM,CAAA;CACpD;AACD,gHAAgH;AAChH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AACD,wGAAwG;AACxG,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf;AACD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,OAAO,CAAA;IACnB,sGAAsG;IACtG,KAAK,EAAE;QAAE,IAAI,EAAE,YAAY,GAAG,eAAe,CAAA;KAAE,GAAG,IAAI,CAAA;IACtD,MAAM,EAAE,SAAS,GAAG,IAAI,CAAA;CACzB;AAED,sGAAsG;AACtG,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,mHAAmH;IACnH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACzC,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;KAAE,CAAA;IAC/G;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACpE;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACtD,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAChD,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAC1D,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAClD,uEAAuE;IACvE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3D,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC5B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9D,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,yGAAyG;IACzG,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC3C;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAqB7E;AAID,8GAA8G;AAC9G,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAErD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAMrE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAqV/B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAsLxB,CAAA"}