Portal: remove unused Components section (#7005)

# Description of Changes

Deletes the unused Components catalogue section (view, cards, SDK mocks)
along with its sidebar entry and route.

Part of a portal (processor) UI-consistency pass, split into small
focused PRs.

## Before / after

<!-- paste before / after screenshots here -->

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### UI Changes (if applicable)

- [x] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have run `task check` to verify linters, typechecks, and tests
pass
- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#7-testing)
for more details.
This commit is contained in:
Anthony Stirling
2026-07-15 14:49:13 +00:00
committed by GitHub
parent 83e5319661
commit 5cb5a866ca
61 changed files with 4 additions and 4297 deletions
@@ -6521,63 +6521,6 @@ title_other = "عالِج {{allowance}} ملفات PDF مجانًا"
titleWithRate_one = "عالِج {{allowance}} ملف PDF مجانًا، ثم {{rate}}/PDF"
titleWithRate_other = "عالِج {{allowance}} ملفات PDF مجانًا، ثم {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "مقفل"
openAriaLabel = "فتح مكون {{name}}"
[portal.catalogue.detail]
addToProject = "إضافة إلى المشروع"
ariaLabel = "تفاصيل المكون"
tabsAriaLabel = "أقسام تفاصيل المكون"
upgradeToUnlock = "الترقية لإلغاء القفل"
[portal.catalogue.detail.code]
install = "تثبيت"
usage = "الاستخدام"
[portal.catalogue.detail.locked]
description = "{{name}} مضمن بدءًا من خطة {{tier}}. قم بالترقية لتضمينه."
title = "غير متاح في خطتك"
[portal.catalogue.detail.preview]
badge = "معاينة مباشرة"
note = "يتم عرض صندوق الرمل التفاعلي هنا"
[portal.catalogue.detail.pricing]
note = "مقاس لكل {{unit}}. تتم فوترة الاستخدام بعد الحصة الشهرية المجانية على حسابك ويُفصّل ضمن الاستخدام والفوترة."
[portal.catalogue.detail.stats]
billedOn = "تتم الفوترة على"
embeds30d = "التضمينات (30 يومًا)"
freeQuota = "الحصة المجانية"
freeQuotaValue = "{{amount}} / شهر"
maturity = "النضج"
none = "لا شيء"
perAction = "لكل إجراء"
price = "السعر"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "نظرة عامة"
pricing = "التسعير"
props = "Props / API"
[portal.catalogue.props]
optional = "اختياري"
required = "مطلوب"
[portal.catalogue.props.columns]
description = "الوصف"
name = "Prop"
required = "مطلوب"
type = "النوع"
[portal.catalogue.summary]
componentsGa = "مكونات GA"
componentSpendMtd = "إنفاق المكونات (MTD)"
embedsThisMonth = "التضمينات هذا الشهر"
inBeta = "في Beta"
[portal.components.billingUnit]
approval = "موافقة"
check = "فحص"
@@ -6591,18 +6534,6 @@ signature = "توقيع"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "ودجات SDK قابلة للتضمين تضعها في تطبيقك — عارض، وتدفق توقيع إلكتروني، ولوحة مراجعة AI. كل منها مقاس لكل إجراء. انقر على بطاقة للتثبيت والاستخدام وprops."
title = "المكونات"
[portal.componentsView.empty]
description = "تعذر تحميل كتالوج المكونات. حاول مرة أخرى قريبًا."
title = "لا توجد مكونات متاحة"
[portal.componentsView.lockedBanner]
description = "مكونات GA متاحة على Pay-as-you-go؛ وبعض مكونات Beta مخصصة للمؤسسات فقط. تعرض البطاقات المقفلة تلميحًا للترقية."
title = "تحتاج بعض المكونات إلى خطة مدفوعة"
[portal.docs.authentication]
codeCaption = "كل طلب"
eyebrow = "البدء"
@@ -6521,63 +6521,6 @@ title_other = "{{allowance}} PDF-i pulsuz emal edin"
titleWithRate_one = "{{allowance}} PDF-i pulsuz emal edin, sonra {{rate}}/PDF"
titleWithRate_other = "{{allowance}} PDF-i pulsuz emal edin, sonra {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Kilidli"
openAriaLabel = "{{name}} komponentini aç"
[portal.catalogue.detail]
addToProject = "Layihəyə əlavə et"
ariaLabel = "Komponent təfərrüatı"
tabsAriaLabel = "Komponent təfərrüatı bölmələri"
upgradeToUnlock = "Kilidi açmaq üçün yüksəldin"
[portal.catalogue.detail.code]
install = "Quraşdır"
usage = "İstifadə"
[portal.catalogue.detail.locked]
description = "{{name}} {{tier}} planından başlayaraq daxildir. Onu daxil etmək üçün yüksəldin."
title = "Planınızda mövcud deyil"
[portal.catalogue.detail.preview]
badge = "Canlı önizləmə"
note = "İnteraktiv sandbox burada render olunur"
[portal.catalogue.detail.pricing]
note = "{{unit}} başına ölçülür. Aylıq pulsuz kvotadan artıq istifadə hesabınıza yazılır və Usage & Billing altında maddələnir."
[portal.catalogue.detail.stats]
billedOn = "Hesablanma üzrə"
embeds30d = "Daxiletmələr (30g)"
freeQuota = "Pulsuz kvota"
freeQuotaValue = "{{amount}} / ay"
maturity = "Yetkinlik"
none = "Yoxdur"
perAction = "Hər hərəkət üçün"
price = "Qiymət"
[portal.catalogue.detail.tabs]
code = "Kod"
overview = "İcmal"
pricing = "Qiymətləndirmə"
props = "Props / API"
[portal.catalogue.props]
optional = "istəyə bağlı"
required = "tələb olunur"
[portal.catalogue.props.columns]
description = "Təsvir"
name = "Prop"
required = "Tələb olunur"
type = "Tip"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Komponent xərci (MTD)"
embedsThisMonth = "Bu ay daxiletmələr"
inBeta = "Beta-da"
[portal.components.billingUnit]
approval = "təsdiq"
check = "yoxlama"
@@ -6591,18 +6534,6 @@ signature = "imza"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Öz tətbiqinizə yerləşdirə biləcəyiniz daxil edilə bilən SDK vidcetləri — görüntüləyici, e-imza axını, AI baxış paneli. Hər biri hərəkət üzrə ölçülür. Quraşdırma, istifadə və props üçün karta klikləyin."
title = "Komponentlər"
[portal.componentsView.empty]
description = "Komponent kataloqu yüklənə bilmədi. Bir az sonra yenidən cəhd edin."
title = "Mövcud komponent yoxdur"
[portal.componentsView.lockedBanner]
description = "GA komponentləri Pay-as-you-go planında mövcuddur; bəzi Beta komponentləri yalnız enterprise üçündür. Kilidli kartlar yüksəltmə təklifi göstərir."
title = "Bəzi komponentlər üçün ödənişli plan lazımdır"
[portal.docs.authentication]
codeCaption = "hər sorğu"
eyebrow = "BAŞLANĞIC"
@@ -6521,63 +6521,6 @@ title_other = "Обработете {{allowance}} PDF безплатно"
titleWithRate_one = "Обработете {{allowance}} PDF безплатно, после {{rate}}/PDF"
titleWithRate_other = "Обработете {{allowance}} PDF безплатно, после {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Заключено"
openAriaLabel = "Отвори компонент {{name}}"
[portal.catalogue.detail]
addToProject = "Добави към проект"
ariaLabel = "Детайли за компонента"
tabsAriaLabel = "Секции с детайли за компонента"
upgradeToUnlock = "Надстройте, за да отключите"
[portal.catalogue.detail.code]
install = "Инсталиране"
usage = "Употреба"
[portal.catalogue.detail.locked]
description = "{{name}} е включен от план {{tier}}. Надстройте, за да го вградите."
title = "Не е налично във вашия план"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Интерактивният sandbox се рендира тук"
[portal.catalogue.detail.pricing]
note = "Измерва се на {{unit}}. Използването над месечната безплатна квота се таксува към вашия акаунт и се детайлизира в Usage & Billing."
[portal.catalogue.detail.stats]
billedOn = "Таксува се по"
embeds30d = "Вграждания (30 дни)"
freeQuota = "Безплатна квота"
freeQuotaValue = "{{amount}} / мес"
maturity = "Зрялост"
none = "Няма"
perAction = "На действие"
price = "Цена"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Общ преглед"
pricing = "Ценообразуване"
props = "Props / API"
[portal.catalogue.props]
optional = "по избор"
required = "задължително"
[portal.catalogue.props.columns]
description = "Описание"
name = "Prop"
required = "Задължително"
type = "Тип"
[portal.catalogue.summary]
componentsGa = "Компоненти GA"
componentSpendMtd = "Разход за компоненти (MTD)"
embedsThisMonth = "Вграждания този месец"
inBeta = "В beta"
[portal.components.billingUnit]
approval = "одобрение"
check = "проверка"
@@ -6591,18 +6534,6 @@ signature = "подпис"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Вградими SDK widgets, които поставяте в собственото си приложение — viewer, e-sign поток, AI панел за преглед. Всеки се измерва на действие. Щракнете върху карта за инсталиране, употреба и props."
title = "Компоненти"
[portal.componentsView.empty]
description = "Каталогът с компоненти не можа да бъде зареден. Опитайте отново след малко."
title = "Няма налични компоненти"
[portal.componentsView.lockedBanner]
description = "GA компонентите са налични при Pay-as-you-go; няколко Beta компонента са само за enterprise. Заключените карти показват подкана за надстройване."
title = "Някои компоненти изискват платен план"
[portal.docs.authentication]
codeCaption = "всяка заявка"
eyebrow = "GETTING STARTED"
@@ -6521,63 +6521,6 @@ title_other = "Processa {{allowance}} PDF de franc"
titleWithRate_one = "Processa {{allowance}} PDF de franc, després {{rate}}/PDF"
titleWithRate_other = "Processa {{allowance}} PDF de franc, després {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Bloquejat"
openAriaLabel = "Obre el component {{name}}"
[portal.catalogue.detail]
addToProject = "Afegeix al projecte"
ariaLabel = "Detall del component"
tabsAriaLabel = "Seccions de detall del component"
upgradeToUnlock = "Actualitza per desbloquejar"
[portal.catalogue.detail.code]
install = "Instal·la"
usage = "Ús"
[portal.catalogue.detail.locked]
description = "{{name}} s'inclou a partir del pla {{tier}}. Actualitza per incrustar-lo."
title = "No disponible al teu pla"
[portal.catalogue.detail.preview]
badge = "Previsualització en directe"
note = "El sandbox interactiu es renderitza aquí"
[portal.catalogue.detail.pricing]
note = "Mesurat per {{unit}}. L'ús més enllà de la quota gratuïta mensual es factura al teu compte i es detalla a Ús i facturació."
[portal.catalogue.detail.stats]
billedOn = "Facturat per"
embeds30d = "Incrustacions (30 d)"
freeQuota = "Quota gratuïta"
freeQuotaValue = "{{amount}} / mes"
maturity = "Maduresa"
none = "Cap"
perAction = "Per acció"
price = "Preu"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Resum"
pricing = "Preus"
props = "Props / API"
[portal.catalogue.props]
optional = "opcional"
required = "obligatori"
[portal.catalogue.props.columns]
description = "Descripció"
name = "Prop"
required = "Obligatori"
type = "Tipus"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Despesa en components (MTD)"
embedsThisMonth = "Incrustacions aquest mes"
inBeta = "En beta"
[portal.components.billingUnit]
approval = "aprovació"
check = "comprovació"
@@ -6591,18 +6534,6 @@ signature = "signatura"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widgets SDK incrustables que deixes anar a la teva pròpia aplicació: un visor, un flux de signatura electrònica, un panell de revisió d'AI. Cadascun es mesura per acció. Fes clic en una targeta per veure instal·lació, ús i props."
title = "Components"
[portal.componentsView.empty]
description = "No s'ha pogut carregar el catàleg de components. Torna-ho a provar d'aquí a poc."
title = "No hi ha components disponibles"
[portal.componentsView.lockedBanner]
description = "Els components GA estan disponibles amb pagament per ús; alguns components Beta són només per a empreses. Les targetes bloquejades mostren una invitació a actualitzar."
title = "Alguns components necessiten un pla de pagament"
[portal.docs.authentication]
codeCaption = "cada sol·licitud"
eyebrow = "PRIMERS PASSOS"
@@ -6521,63 +6521,6 @@ title_other = "Zpracujte {{allowance}} PDFs zdarma"
titleWithRate_one = "Zpracujte {{allowance}} PDFs zdarma, poté {{rate}}/PDF"
titleWithRate_other = "Zpracujte {{allowance}} PDFs zdarma, poté {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zamčeno"
openAriaLabel = "Otevřít komponentu {{name}}"
[portal.catalogue.detail]
addToProject = "Přidat do projektu"
ariaLabel = "Detail komponenty"
tabsAriaLabel = "Sekce detailu komponenty"
upgradeToUnlock = "Upgradujte pro odemknutí"
[portal.catalogue.detail.code]
install = "Instalace"
usage = "Použití"
[portal.catalogue.detail.locked]
description = "{{name}} je zahrnuto od plánu {{tier}}. Upgradujte, abyste ji mohli vložit."
title = "Není dostupné ve vašem plánu"
[portal.catalogue.detail.preview]
badge = "Živý náhled"
note = "Interaktivní sandbox se vykreslí zde"
[portal.catalogue.detail.pricing]
note = "Měřeno za {{unit}}. Využití nad měsíční bezplatnou kvótu je účtováno vašemu účtu a rozepsáno v části Využití a fakturace."
[portal.catalogue.detail.stats]
billedOn = "Účtováno za"
embeds30d = "Vložení (30 dní)"
freeQuota = "Bezplatná kvóta"
freeQuotaValue = "{{amount}} / měs."
maturity = "Vyspělost"
none = "Žádné"
perAction = "Za akci"
price = "Cena"
[portal.catalogue.detail.tabs]
code = "Kód"
overview = "Přehled"
pricing = "Ceník"
props = "Props / API"
[portal.catalogue.props]
optional = "volitelné"
required = "povinné"
[portal.catalogue.props.columns]
description = "Popis"
name = "Prop"
required = "Povinné"
type = "Typ"
[portal.catalogue.summary]
componentsGa = "Komponenty GA"
componentSpendMtd = "Výdaje za komponenty (MTD)"
embedsThisMonth = "Vložení tento měsíc"
inBeta = "V beta verzi"
[portal.components.billingUnit]
approval = "schválení"
check = "kontrola"
@@ -6591,18 +6534,6 @@ signature = "podpis"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Vložitelné SDK widgety, které vložíte do své aplikace — prohlížeč, tok e-podpisu, panel AI kontroly. Každý je měřen za akci. Kliknutím na kartu zobrazíte instalaci, použití a props."
title = "Komponenty"
[portal.componentsView.empty]
description = "Katalog komponent se nepodařilo načíst. Zkuste to brzy znovu."
title = "Žádné dostupné komponenty"
[portal.componentsView.lockedBanner]
description = "Komponenty GA jsou dostupné v režimu Pay-as-you-go; několik komponent Beta je pouze pro enterprise. Zamčené karty zobrazují výzvu k upgradu."
title = "Některé komponenty vyžadují placený plán"
[portal.docs.authentication]
codeCaption = "každý požadavek"
eyebrow = "ZAČÍNÁME"
@@ -6521,63 +6521,6 @@ title_other = "Behandl {{allowance}} PDFs gratis"
titleWithRate_one = "Behandl {{allowance}} PDFs gratis, derefter {{rate}}/PDF"
titleWithRate_other = "Behandl {{allowance}} PDFs gratis, derefter {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Låst"
openAriaLabel = "Åbn {{name}}-komponent"
[portal.catalogue.detail]
addToProject = "Føj til projekt"
ariaLabel = "Komponentdetalje"
tabsAriaLabel = "Komponentdetaljesektioner"
upgradeToUnlock = "Opgrader for at låse op"
[portal.catalogue.detail.code]
install = "Installér"
usage = "Brug"
[portal.catalogue.detail.locked]
description = "{{name}} er inkluderet fra {{tier}}-planen. Opgrader for at indlejre den."
title = "Ikke tilgængelig på din plan"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interaktiv sandbox renderes her"
[portal.catalogue.detail.pricing]
note = "Måles pr. {{unit}}. Brug ud over den månedlige gratis kvote faktureres til din konto og specificeres under Brug og fakturering."
[portal.catalogue.detail.stats]
billedOn = "Faktureres på"
embeds30d = "Indlejringer (30d)"
freeQuota = "Gratis kvote"
freeQuotaValue = "{{amount}} / md."
maturity = "Modenhed"
none = "Ingen"
perAction = "Pr. handling"
price = "Pris"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Oversigt"
pricing = "Priser"
props = "Props / API"
[portal.catalogue.props]
optional = "valgfri"
required = "påkrævet"
[portal.catalogue.props.columns]
description = "Beskrivelse"
name = "Prop"
required = "Påkrævet"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Komponenter GA"
componentSpendMtd = "Komponentforbrug (MTD)"
embedsThisMonth = "Indlejringer denne måned"
inBeta = "I beta"
[portal.components.billingUnit]
approval = "godkendelse"
check = "kontrol"
@@ -6591,18 +6534,6 @@ signature = "signatur"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Indlejrbare SDK-widgets, du kan lægge ind i din egen app — en viewer, et e-sign-flow, et AI-gennemgangspanel. Hver måles pr. handling. Klik på et kort for installation, brug og props."
title = "Komponenter"
[portal.componentsView.empty]
description = "Komponentkataloget kunne ikke indlæses. Prøv igen om lidt."
title = "Ingen komponenter tilgængelige"
[portal.componentsView.lockedBanner]
description = "GA-komponenter er tilgængelige på Pay-as-you-go; nogle få Beta-komponenter er kun til enterprise. Låste kort viser en opgraderingsopfordring."
title = "Nogle komponenter kræver en betalt plan"
[portal.docs.authentication]
codeCaption = "hver forespørgsel"
eyebrow = "KOM GODT I GANG"
@@ -6553,63 +6553,6 @@ title_other = "{{allowance}} PDFs kostenlos verarbeiten"
titleWithRate_one = "{{allowance}} PDFs kostenlos verarbeiten, danach {{rate}}/PDF"
titleWithRate_other = "{{allowance}} PDFs kostenlos verarbeiten, danach {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Gesperrt"
openAriaLabel = "Komponente {{name}} öffnen"
[portal.catalogue.detail]
addToProject = "Zum Projekt hinzufügen"
ariaLabel = "Komponentendetail"
tabsAriaLabel = "Komponentendetail-Abschnitte"
upgradeToUnlock = "Upgrade zum Entsperren"
[portal.catalogue.detail.code]
install = "Installieren"
usage = "Usage"
[portal.catalogue.detail.locked]
description = "{{name}} ist ab dem {{tier}}-Tarif enthalten. Führen Sie ein Upgrade durch, um es einzubetten."
title = "In Ihrem Tarif nicht verfügbar"
[portal.catalogue.detail.preview]
badge = "Live-Vorschau"
note = "Interaktive Sandbox wird hier gerendert"
[portal.catalogue.detail.pricing]
note = "Nutzungsbasiert pro {{unit}}. Nutzung über das monatliche Freikontingent hinaus wird Ihrem Konto berechnet und unter Nutzung & Abrechnung einzeln aufgeführt."
[portal.catalogue.detail.stats]
billedOn = "Abgerechnet nach"
embeds30d = "Einbettungen (30T)"
freeQuota = "Freikontingent"
freeQuotaValue = "{{amount}} / Mon."
maturity = "Reifegrad"
none = "Keine"
perAction = "Pro Aktion"
price = "Preis"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Übersicht"
pricing = "Preise"
props = "Props / API"
[portal.catalogue.props]
optional = "optional"
required = "erforderlich"
[portal.catalogue.props.columns]
description = "Beschreibung"
name = "Prop"
required = "Erforderlich"
type = "Typ"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Komponentenausgaben (MTD)"
embedsThisMonth = "Einbettungen diesen Monat"
inBeta = "In Beta"
[portal.components.billingUnit]
approval = "Genehmigung"
check = "Prüfung"
@@ -6623,18 +6566,6 @@ signature = "Signatur"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Einbettbare SDK-Widgets, die Sie in Ihre eigene App einfügen — ein Viewer, ein E-Sign-Flow, ein KI-Review-Panel. Jedes wird pro Aktion nutzungsbasiert abgerechnet. Klicken Sie auf eine Karte für Installation, Nutzung und Props."
title = "Komponenten"
[portal.componentsView.empty]
description = "Der Komponentenkatalog konnte nicht geladen werden. Versuchen Sie es in Kürze erneut."
title = "Keine Komponenten verfügbar"
[portal.componentsView.lockedBanner]
description = "GA-Komponenten sind mit Pay-as-you-go verfügbar; einige Beta-Komponenten sind nur für Enterprise. Gesperrte Karten zeigen einen Upgrade-Hinweis."
title = "Einige Komponenten benötigen einen kostenpflichtigen Tarif"
[portal.docs.authentication]
codeCaption = "jede Anfrage"
eyebrow = "ERSTE SCHRITTE"
@@ -6521,63 +6521,6 @@ title_other = "Επεξεργαστείτε {{allowance}} PDFs δωρεάν"
titleWithRate_one = "Επεξεργαστείτε {{allowance}} PDFs δωρεάν και μετά {{rate}}/PDF"
titleWithRate_other = "Επεξεργαστείτε {{allowance}} PDFs δωρεάν και μετά {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Κλειδωμένο"
openAriaLabel = "Άνοιγμα στοιχείου {{name}}"
[portal.catalogue.detail]
addToProject = "Προσθήκη στο έργο"
ariaLabel = "Λεπτομέρειες στοιχείου"
tabsAriaLabel = "Ενότητες λεπτομερειών στοιχείου"
upgradeToUnlock = "Αναβαθμίστε για ξεκλείδωμα"
[portal.catalogue.detail.code]
install = "Εγκατάσταση"
usage = "Χρήση"
[portal.catalogue.detail.locked]
description = "Το {{name}} περιλαμβάνεται από το πλάνο {{tier}}. Αναβαθμίστε για να το ενσωματώσετε."
title = "Δεν είναι διαθέσιμο στο πλάνο σας"
[portal.catalogue.detail.preview]
badge = "Ζωντανή προεπισκόπηση"
note = "Το διαδραστικό sandbox αποδίδεται εδώ"
[portal.catalogue.detail.pricing]
note = "Μετρημένο ανά {{unit}}. Η χρήση πέρα από τη μηνιαία δωρεάν ποσόστωση χρεώνεται στον λογαριασμό σας και αναλύεται στην ενότητα Χρήση & Χρέωση."
[portal.catalogue.detail.stats]
billedOn = "Χρεώνεται σε"
embeds30d = "Ενσωματώσεις (30ημ.)"
freeQuota = "Δωρεάν ποσόστωση"
freeQuotaValue = "{{amount}} / μήνα"
maturity = "Ωριμότητα"
none = "Καμία"
perAction = "Ανά ενέργεια"
price = "Τιμή"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Επισκόπηση"
pricing = "Τιμολόγηση"
props = "Props / API"
[portal.catalogue.props]
optional = "προαιρετικό"
required = "απαιτείται"
[portal.catalogue.props.columns]
description = "Περιγραφή"
name = "Prop"
required = "Απαιτείται"
type = "Τύπος"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Δαπάνη components (MTD)"
embedsThisMonth = "Ενσωματώσεις αυτόν τον μήνα"
inBeta = "Σε beta"
[portal.components.billingUnit]
approval = "έγκριση"
check = "έλεγχος"
@@ -6591,18 +6534,6 @@ signature = "υπογραφή"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Ενσωματώσιμα SDK widgets που τοποθετείτε στη δική σας εφαρμογή — ένας viewer, μια ροή e-sign, ένα πάνελ ελέγχου AI. Κάθε ένα μετριέται ανά ενέργεια. Κάντε κλικ σε μια κάρτα για εγκατάσταση, χρήση και props."
title = "Components"
[portal.componentsView.empty]
description = "Δεν ήταν δυνατή η φόρτωση του καταλόγου components. Δοκιμάστε ξανά σύντομα."
title = "Δεν υπάρχουν διαθέσιμα components"
[portal.componentsView.lockedBanner]
description = "Τα GA components είναι διαθέσιμα στο Pay-as-you-go. Μερικά Beta components είναι μόνο για enterprise. Οι κλειδωμένες κάρτες εμφανίζουν προτροπή αναβάθμισης."
title = "Ορισμένα components χρειάζονται πληρωμένο πλάνο"
[portal.docs.authentication]
codeCaption = "κάθε αίτημα"
eyebrow = "ΞΕΚΙΝΩΝΤΑΣ"
@@ -6521,63 +6521,6 @@ title_other = "Process {{allowance}} PDFs free"
titleWithRate_one = "Process {{allowance}} PDFs free, then {{rate}}/PDF"
titleWithRate_other = "Process {{allowance}} PDFs free, then {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Locked"
openAriaLabel = "Open {{name}} component"
[portal.catalogue.detail]
addToProject = "Add to project"
ariaLabel = "Component detail"
tabsAriaLabel = "Component detail sections"
upgradeToUnlock = "Upgrade to unlock"
[portal.catalogue.detail.code]
install = "Install"
usage = "Usage"
[portal.catalogue.detail.locked]
description = "{{name}} is included from the {{tier}} plan. Upgrade to embed it."
title = "Not available on your plan"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interactive sandbox renders here"
[portal.catalogue.detail.pricing]
note = "Metered per {{unit}}. Usage beyond the monthly free quota is billed to your account and itemised under Usage & Billing."
[portal.catalogue.detail.stats]
billedOn = "Billed on"
embeds30d = "Embeds (30d)"
freeQuota = "Free quota"
freeQuotaValue = "{{amount}} / mo"
maturity = "Maturity"
none = "None"
perAction = "Per action"
price = "Price"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Overview"
pricing = "Pricing"
props = "Props / API"
[portal.catalogue.props]
optional = "optional"
required = "required"
[portal.catalogue.props.columns]
description = "Description"
name = "Prop"
required = "Required"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Component spend (MTD)"
embedsThisMonth = "Embeds this month"
inBeta = "In beta"
[portal.components.billingUnit]
approval = "approval"
check = "check"
@@ -6591,18 +6534,6 @@ signature = "signature"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Embeddable SDK widgets you drop into your own app — a viewer, an e-sign flow, an AI review panel. Each is metered per action. Click a card for install, usage and props."
title = "Components"
[portal.componentsView.empty]
description = "The component catalogue could not be loaded. Try again shortly."
title = "No components available"
[portal.componentsView.lockedBanner]
description = "GA components are available on Pay-as-you-go; a few Beta components are enterprise-only. Locked cards show an upgrade nudge."
title = "Some components need a paid plan"
[portal.docs.authentication]
codeCaption = "every request"
eyebrow = "GETTING STARTED"
@@ -6421,63 +6421,6 @@ title_other = "Process {{allowance}} PDFs free"
titleWithRate_one = "Process {{allowance}} PDFs free, then {{rate}}/PDF"
titleWithRate_other = "Process {{allowance}} PDFs free, then {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Locked"
openAriaLabel = "Open {{name}} component"
[portal.catalogue.detail]
addToProject = "Add to project"
ariaLabel = "Component detail"
tabsAriaLabel = "Component detail sections"
upgradeToUnlock = "Upgrade to unlock"
[portal.catalogue.detail.code]
install = "Install"
usage = "Usage"
[portal.catalogue.detail.locked]
description = "{{name}} is included from the {{plan}}. Upgrade to embed it."
title = "Not available on your plan"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interactive sandbox renders here"
[portal.catalogue.detail.pricing]
note = "Metered per {{unit}}. Usage beyond the monthly free quota is billed to your account and itemised under Usage & Billing."
[portal.catalogue.detail.stats]
billedOn = "Billed on"
embeds30d = "Embeds (30d)"
freeQuota = "Free quota"
freeQuotaValue = "{{amount}} / mo"
maturity = "Maturity"
none = "None"
perAction = "Per action"
price = "Price"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Overview"
pricing = "Pricing"
props = "Props / API"
[portal.catalogue.props]
optional = "optional"
required = "required"
[portal.catalogue.props.columns]
description = "Description"
name = "Prop"
required = "Required"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Component spend (MTD)"
embedsThisMonth = "Embeds this month"
inBeta = "In beta"
[portal.components.billingUnit]
approval = "approval"
check = "check"
@@ -6491,18 +6434,6 @@ signature = "signature"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Embeddable SDK widgets you drop into your own app — a viewer, an e-sign flow, an AI review panel. Each is metered per action. Click a card for install, usage and props."
title = "Components"
[portal.componentsView.empty]
description = "The component catalogue could not be loaded. Try again shortly."
title = "No components available"
[portal.componentsView.lockedBanner]
description = "GA components are available on Pay-as-you-go; a few Beta components are enterprise-only. Locked cards show an upgrade nudge."
title = "Some components need a paid plan"
[portal.connections]
createTitle = "New S3 connection"
delete = "Delete"
@@ -6521,63 +6521,6 @@ title_other = "Procesa {{allowance}} PDFs gratis"
titleWithRate_one = "Procesa {{allowance}} PDFs gratis, luego {{rate}}/PDF"
titleWithRate_other = "Procesa {{allowance}} PDFs gratis, luego {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Bloqueado"
openAriaLabel = "Abrir componente {{name}}"
[portal.catalogue.detail]
addToProject = "Añadir al proyecto"
ariaLabel = "Detalle del componente"
tabsAriaLabel = "Secciones de detalle del componente"
upgradeToUnlock = "Actualiza para desbloquear"
[portal.catalogue.detail.code]
install = "Instalar"
usage = "Uso"
[portal.catalogue.detail.locked]
description = "{{name}} está incluido desde el plan {{tier}}. Actualiza para incrustarlo."
title = "No disponible en tu plan"
[portal.catalogue.detail.preview]
badge = "Vista previa en vivo"
note = "El sandbox interactivo se renderiza aquí"
[portal.catalogue.detail.pricing]
note = "Medido por {{unit}}. El uso que supere la cuota gratuita mensual se factura a tu cuenta y se detalla en Uso y facturación."
[portal.catalogue.detail.stats]
billedOn = "Facturado por"
embeds30d = "Incrustaciones (30 d)"
freeQuota = "Cuota gratuita"
freeQuotaValue = "{{amount}} / mes"
maturity = "Madurez"
none = "Ninguna"
perAction = "Por acción"
price = "Precio"
[portal.catalogue.detail.tabs]
code = "Código"
overview = "Resumen"
pricing = "Precios"
props = "Props / API"
[portal.catalogue.props]
optional = "opcional"
required = "obligatorio"
[portal.catalogue.props.columns]
description = "Descripción"
name = "Prop"
required = "Obligatorio"
type = "Tipo"
[portal.catalogue.summary]
componentsGa = "Componentes GA"
componentSpendMtd = "Gasto en componentes (MTD)"
embedsThisMonth = "Incrustaciones este mes"
inBeta = "En beta"
[portal.components.billingUnit]
approval = "aprobación"
check = "comprobación"
@@ -6591,18 +6534,6 @@ signature = "firma"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widgets SDK incrustables que colocas en tu propia app: un visor, un flujo de firma electrónica, un panel de revisión de IA. Cada uno se mide por acción. Haz clic en una tarjeta para instalación, uso y props."
title = "Componentes"
[portal.componentsView.empty]
description = "No se ha podido cargar el catálogo de componentes. Inténtalo de nuevo en breve."
title = "No hay componentes disponibles"
[portal.componentsView.lockedBanner]
description = "Los componentes GA están disponibles en pago por uso; algunos componentes Beta son solo para empresas. Las tarjetas bloqueadas muestran un aviso para actualizar."
title = "Algunos componentes necesitan un plan de pago"
[portal.docs.authentication]
codeCaption = "cada solicitud"
eyebrow = "PRIMEROS PASOS"
@@ -6521,63 +6521,6 @@ title_other = "Prozesatu {{allowance}} PDF doan"
titleWithRate_one = "Prozesatu {{allowance}} PDF doan, gero {{rate}}/PDF"
titleWithRate_other = "Prozesatu {{allowance}} PDF doan, gero {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Blokeatuta"
openAriaLabel = "Ireki {{name}} osagaia"
[portal.catalogue.detail]
addToProject = "Gehitu proiektuari"
ariaLabel = "Osagaiaren xehetasuna"
tabsAriaLabel = "Osagaiaren xehetasun-atalak"
upgradeToUnlock = "Eguneratu desblokeatzeko"
[portal.catalogue.detail.code]
install = "Instalatu"
usage = "Erabilera"
[portal.catalogue.detail.locked]
description = "{{name}} {{tier}} planetik aurrera dago barne. Eguneratu plana txertatzeko."
title = "Ez dago erabilgarri zure planean"
[portal.catalogue.detail.preview]
badge = "Zuzeneko aurrebista"
note = "Sandbox interaktiboa hemen errendatuko da"
[portal.catalogue.detail.pricing]
note = "{{unit}} bakoitzeko neurtua. Hileko doako kuotatik gorako erabilera zure kontuan fakturatzen da eta Erabilera eta fakturazioa atalean xehatzen da."
[portal.catalogue.detail.stats]
billedOn = "Honetan fakturatua"
embeds30d = "Txertaketak (30 egun)"
freeQuota = "Doako kuota"
freeQuotaValue = "{{amount}} / hil"
maturity = "Heldutasuna"
none = "Bat ere ez"
perAction = "Ekintza bakoitzeko"
price = "Prezioa"
[portal.catalogue.detail.tabs]
code = "Kodea"
overview = "Ikuspegi orokorra"
pricing = "Prezioak"
props = "Props / API"
[portal.catalogue.props]
optional = "aukerakoa"
required = "beharrezkoa"
[portal.catalogue.props.columns]
description = "Deskribapena"
name = "Prop"
required = "Beharrezkoa"
type = "Mota"
[portal.catalogue.summary]
componentsGa = "GA osagaiak"
componentSpendMtd = "Osagaien gastua (MTD)"
embedsThisMonth = "Txertaketak hilabete honetan"
inBeta = "Beta-n"
[portal.components.billingUnit]
approval = "onarpena"
check = "egiaztapena"
@@ -6591,18 +6534,6 @@ signature = "sinadura"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Zure aplikazioan txertatzeko SDK widgetak — bistaratzailea, sinadura elektronikoaren fluxua, AI berrikuspen-panela. Bakoitza ekintza bakoitzeko neurtzen da. Egin klik txartel batean instalazioa, erabilera eta props ikusteko."
title = "Osagaiak"
[portal.componentsView.empty]
description = "Ezin izan da osagaien katalogoa kargatu. Saiatu berriro laster."
title = "Ez dago osagairik erabilgarri"
[portal.componentsView.lockedBanner]
description = "GA osagaiak Pay-as-you-go planean daude erabilgarri; Beta osagai batzuk Enterprise-rako soilik dira. Blokeatutako txartelek eguneratzeko iradokizuna erakusten dute."
title = "Osagai batzuek ordainpeko plana behar dute"
[portal.docs.authentication]
codeCaption = "eskaera bakoitza"
eyebrow = "HASTEN"
@@ -6521,63 +6521,6 @@ title_other = "{{allowance}} PDF را رایگان پردازش کنید"
titleWithRate_one = "{{allowance}} PDF را رایگان پردازش کنید، سپس {{rate}}/PDF"
titleWithRate_other = "{{allowance}} PDF را رایگان پردازش کنید، سپس {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "قفل‌شده"
openAriaLabel = "باز کردن مؤلفه {{name}}"
[portal.catalogue.detail]
addToProject = "افزودن به پروژه"
ariaLabel = "جزئیات مؤلفه"
tabsAriaLabel = "بخش‌های جزئیات مؤلفه"
upgradeToUnlock = "برای باز کردن قفل ارتقا دهید"
[portal.catalogue.detail.code]
install = "نصب"
usage = "استفاده"
[portal.catalogue.detail.locked]
description = "{{name}} از طرح {{tier}} شامل می‌شود. برای جاسازی آن ارتقا دهید."
title = "در طرح شما در دسترس نیست"
[portal.catalogue.detail.preview]
badge = "پیش‌نمایش زنده"
note = "sandbox تعاملی اینجا رندر می‌شود"
[portal.catalogue.detail.pricing]
note = "بر اساس {{unit}} اندازه‌گیری می‌شود. استفاده فراتر از سهمیه رایگان ماهانه به حساب شما صورت‌حساب می‌شود و زیر Usage & Billing به‌صورت موردی نمایش داده می‌شود."
[portal.catalogue.detail.stats]
billedOn = "صورت‌حساب بر اساس"
embeds30d = "جاسازی‌ها (30 روز)"
freeQuota = "سهمیه رایگان"
freeQuotaValue = "{{amount}} / ماه"
maturity = "بلوغ"
none = "هیچ‌کدام"
perAction = "به‌ازای هر اقدام"
price = "قیمت"
[portal.catalogue.detail.tabs]
code = "کد"
overview = "نمای کلی"
pricing = "قیمت‌گذاری"
props = "Props / API"
[portal.catalogue.props]
optional = "اختیاری"
required = "الزامی"
[portal.catalogue.props.columns]
description = "توضیحات"
name = "Prop"
required = "الزامی"
type = "نوع"
[portal.catalogue.summary]
componentsGa = "مؤلفه‌های GA"
componentSpendMtd = "هزینه مؤلفه (MTD)"
embedsThisMonth = "جاسازی‌ها در این ماه"
inBeta = "در Beta"
[portal.components.billingUnit]
approval = "تأیید"
check = "بررسی"
@@ -6591,18 +6534,6 @@ signature = "امضا"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "ویجت‌های SDK قابل جاسازی که در برنامه خودتان قرار می‌دهید — یک نمایشگر، جریان e-sign، پنل بازبینی AI. هرکدام به‌ازای هر اقدام اندازه‌گیری می‌شود. برای نصب، استفاده و props روی کارت کلیک کنید."
title = "مؤلفه‌ها"
[portal.componentsView.empty]
description = "کاتالوگ مؤلفه‌ها بارگیری نشد. کمی بعد دوباره تلاش کنید."
title = "هیچ مؤلفه‌ای در دسترس نیست"
[portal.componentsView.lockedBanner]
description = "مؤلفه‌های GA در Pay-as-you-go در دسترس هستند؛ چند مؤلفه Beta فقط برای enterprise هستند. کارت‌های قفل‌شده یک پیشنهاد ارتقا نشان می‌دهند."
title = "برخی مؤلفه‌ها به طرح پولی نیاز دارند"
[portal.docs.authentication]
codeCaption = "هر درخواست"
eyebrow = "شروع به کار"
@@ -6521,63 +6521,6 @@ title_other = "Traitez {{allowance}} PDF gratuitement"
titleWithRate_one = "Traitez {{allowance}} PDF gratuitement, puis {{rate}}/PDF"
titleWithRate_other = "Traitez {{allowance}} PDF gratuitement, puis {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Verrouillé"
openAriaLabel = "Ouvrir le composant {{name}}"
[portal.catalogue.detail]
addToProject = "Ajouter au projet"
ariaLabel = "Détail du composant"
tabsAriaLabel = "Sections de détail du composant"
upgradeToUnlock = "Passer à un niveau supérieur pour déverrouiller"
[portal.catalogue.detail.code]
install = "Installer"
usage = "Utilisation"
[portal.catalogue.detail.locked]
description = "{{name}} est inclus à partir du plan {{tier}}. Passez à un niveau supérieur pour lintégrer."
title = "Non disponible avec votre plan"
[portal.catalogue.detail.preview]
badge = "Aperçu en direct"
note = "Le bac à sable interactif saffiche ici"
[portal.catalogue.detail.pricing]
note = "Mesuré par {{unit}}. Lutilisation au-delà du quota mensuel gratuit est facturée à votre compte et détaillée sous Utilisation et facturation."
[portal.catalogue.detail.stats]
billedOn = "Facturé sur"
embeds30d = "Intégrations (30 j)"
freeQuota = "Quota gratuit"
freeQuotaValue = "{{amount}} / mois"
maturity = "Maturité"
none = "Aucun"
perAction = "Par action"
price = "Prix"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Vue densemble"
pricing = "Tarification"
props = "Props / API"
[portal.catalogue.props]
optional = "facultatif"
required = "obligatoire"
[portal.catalogue.props.columns]
description = "Description"
name = "Prop"
required = "Obligatoire"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Composants GA"
componentSpendMtd = "Dépenses des composants (MTD)"
embedsThisMonth = "Intégrations ce mois-ci"
inBeta = "En beta"
[portal.components.billingUnit]
approval = "approbation"
check = "vérification"
@@ -6591,18 +6534,6 @@ signature = "signature"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widgets SDK intégrables que vous ajoutez à votre propre application — une visionneuse, un flux de signature électronique, un panneau dexamen AI. Chacun est mesuré par action. Cliquez sur une carte pour linstallation, lutilisation et les props."
title = "Composants"
[portal.componentsView.empty]
description = "Le catalogue des composants na pas pu être chargé. Réessayez bientôt."
title = "Aucun composant disponible"
[portal.componentsView.lockedBanner]
description = "Les composants GA sont disponibles en paiement à lusage ; quelques composants Beta sont réservés à Enterprise. Les cartes verrouillées affichent une invitation à passer à un niveau supérieur."
title = "Certains composants nécessitent un plan payant"
[portal.docs.authentication]
codeCaption = "chaque requête"
eyebrow = "BIEN DÉMARRER"
@@ -6521,63 +6521,6 @@ title_other = "Próiseáil {{allowance}} PDFs saor in aisce"
titleWithRate_one = "Próiseáil {{allowance}} PDF saor in aisce, ansin {{rate}}/PDF"
titleWithRate_other = "Próiseáil {{allowance}} PDFs saor in aisce, ansin {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Faoi ghlas"
openAriaLabel = "Oscail comhpháirt {{name}}"
[portal.catalogue.detail]
addToProject = "Cuir le tionscadal"
ariaLabel = "Sonraí comhpháirte"
tabsAriaLabel = "Rannáin shonraí comhpháirte"
upgradeToUnlock = "Uasghrádaigh chun díghlasáil"
[portal.catalogue.detail.code]
install = "Suiteáil"
usage = "Úsáid"
[portal.catalogue.detail.locked]
description = "Tá {{name}} san áireamh ón bplean {{tier}} ar aghaidh. Uasghrádaigh chun é a leabú."
title = "Níl sé ar fáil ar do phlean"
[portal.catalogue.detail.preview]
badge = "Réamhamharc beo"
note = "Rindreálfar bosca gainimh idirghníomhach anseo"
[portal.catalogue.detail.pricing]
note = "Méadraithe in aghaidh {{unit}}. Billeáiltear úsáid thar an gcuóta míosúil saor in aisce ar do chuntas agus mírítear í faoi Úsáid & Billeáil."
[portal.catalogue.detail.stats]
billedOn = "Billeáilte ar"
embeds30d = "Leabuithe (30l)"
freeQuota = "Cuóta saor in aisce"
freeQuotaValue = "{{amount}} / mí"
maturity = "Aibíocht"
none = "Dada"
perAction = "In aghaidh gnímh"
price = "Praghas"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Forbhreathnú"
pricing = "Praghsáil"
props = "Props / API"
[portal.catalogue.props]
optional = "roghnach"
required = "riachtanach"
[portal.catalogue.props.columns]
description = "Cur síos"
name = "Prop"
required = "Riachtanach"
type = "Cineál"
[portal.catalogue.summary]
componentsGa = "Comhpháirteanna GA"
componentSpendMtd = "Caiteachas comhpháirte (MTD)"
embedsThisMonth = "Leabuithe an mhí seo"
inBeta = "I mBeta"
[portal.components.billingUnit]
approval = "faomhadh"
check = "seiceáil"
@@ -6591,18 +6534,6 @@ signature = "síniú"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Giuirléidí SDK inleabaithe a chuireann tú isteach i daip féin — breathnóir, sreabhadh e-sign, painéal athbhreithnithe AI. Méadraítear gach ceann in aghaidh gnímh. Cliceáil cárta le haghaidh suiteála, úsáide agus props."
title = "Comhpháirteanna"
[portal.componentsView.empty]
description = "Níorbh fhéidir catalóg na gcomhpháirteanna a luchtú. Bain triail eile as gan mhoill."
title = "Níl aon chomhpháirteanna ar fáil"
[portal.componentsView.lockedBanner]
description = "Tá comhpháirteanna GA ar fáil ar Pay-as-you-go; tá cúpla comhpháirt Beta don fhiontar amháin. Taispeánann cártaí faoi ghlas leid uasghrádaithe."
title = "Teastaíonn plean íoctha ó roinnt comhpháirteanna"
[portal.docs.authentication]
codeCaption = "gach iarratas"
eyebrow = "AG TOSÚ"
@@ -6521,63 +6521,6 @@ title_other = "{{allowance}} PDFs मुफ़्त process करें"
titleWithRate_one = "{{allowance}} PDFs मुफ़्त process करें, फिर {{rate}}/PDF"
titleWithRate_other = "{{allowance}} PDFs मुफ़्त process करें, फिर {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Locked"
openAriaLabel = "{{name}} component खोलें"
[portal.catalogue.detail]
addToProject = "project में जोड़ें"
ariaLabel = "Component detail"
tabsAriaLabel = "Component detail sections"
upgradeToUnlock = "अनलॉक करने के लिए upgrade करें"
[portal.catalogue.detail.code]
install = "Install"
usage = "Usage"
[portal.catalogue.detail.locked]
description = "{{name}} {{tier}} प्लान से शामिल है। इसे embed करने के लिए upgrade करें।"
title = "आपके प्लान पर उपलब्ध नहीं"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interactive sandbox यहाँ render होता है"
[portal.catalogue.detail.pricing]
note = "प्रति {{unit}} metered। मासिक free quota से अधिक usage का बिल आपके account से लिया जाता है और Usage & Billing के अंतर्गत itemise किया जाता है।"
[portal.catalogue.detail.stats]
billedOn = "Billed on"
embeds30d = "Embeds (30d)"
freeQuota = "Free quota"
freeQuotaValue = "{{amount}} / mo"
maturity = "Maturity"
none = "कोई नहीं"
perAction = "Per action"
price = "Price"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Overview"
pricing = "Pricing"
props = "Props / API"
[portal.catalogue.props]
optional = "optional"
required = "required"
[portal.catalogue.props.columns]
description = "विवरण"
name = "Prop"
required = "Required"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Component spend (MTD)"
embedsThisMonth = "इस माह embeds"
inBeta = "Beta में"
[portal.components.billingUnit]
approval = "approval"
check = "check"
@@ -6591,18 +6534,6 @@ signature = "signature"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Embeddable SDK widgets जिन्हें आप अपने app में डालते हैं — viewer, e-sign flow, AI review panel। हर action पर metered। install, usage और props के लिए card पर क्लिक करें।"
title = "Components"
[portal.componentsView.empty]
description = "component catalogue लोड नहीं किया जा सका। थोड़ी देर में फिर कोशिश करें।"
title = "कोई components उपलब्ध नहीं"
[portal.componentsView.lockedBanner]
description = "GA components Pay-as-you-go पर उपलब्ध हैं; कुछ Beta components केवल enterprise के लिए हैं। Locked cards upgrade nudge दिखाते हैं।"
title = "कुछ components के लिए paid plan चाहिए"
[portal.docs.authentication]
codeCaption = "हर request"
eyebrow = "शुरुआत करें"
@@ -6521,63 +6521,6 @@ title_other = "Obradite {{allowance}} PDF-ova besplatno"
titleWithRate_one = "Obradite {{allowance}} PDF-ova besplatno, zatim {{rate}}/PDF"
titleWithRate_other = "Obradite {{allowance}} PDF-ova besplatno, zatim {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zaključano"
openAriaLabel = "Otvori komponentu {{name}}"
[portal.catalogue.detail]
addToProject = "Dodaj u projekt"
ariaLabel = "Detalji komponente"
tabsAriaLabel = "Odjeljci detalja komponente"
upgradeToUnlock = "Nadogradite za otključavanje"
[portal.catalogue.detail.code]
install = "Instalacija"
usage = "Upotreba"
[portal.catalogue.detail.locked]
description = "{{name}} je uključeno od plana {{tier}}. Nadogradite da biste ga ugradili."
title = "Nije dostupno na vašem planu"
[portal.catalogue.detail.preview]
badge = "Pregled uživo"
note = "Interaktivni sandbox prikazuje se ovdje"
[portal.catalogue.detail.pricing]
note = "Mjereno po {{unit}}. Upotreba iznad mjesečne besplatne kvote naplaćuje se vašem računu i prikazuje po stavkama u odjeljku Upotreba i naplata."
[portal.catalogue.detail.stats]
billedOn = "Naplaćuje se po"
embeds30d = "Ugradnje (30 d)"
freeQuota = "Besplatna kvota"
freeQuotaValue = "{{amount}} / mj."
maturity = "Zrelost"
none = "Ništa"
perAction = "Po radnji"
price = "Cijena"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Pregled"
pricing = "Cijene"
props = "Props / API"
[portal.catalogue.props]
optional = "neobavezno"
required = "obavezno"
[portal.catalogue.props.columns]
description = "Opis"
name = "Prop"
required = "Obavezno"
type = "Vrsta"
[portal.catalogue.summary]
componentsGa = "Komponente GA"
componentSpendMtd = "Potrošnja komponenti (MTD)"
embedsThisMonth = "Ugradnje ovog mjeseca"
inBeta = "U beta verziji"
[portal.components.billingUnit]
approval = "odobrenje"
check = "provjera"
@@ -6591,18 +6534,6 @@ signature = "potpis"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Ugradivi SDK widgeti koje ubacujete u vlastitu aplikaciju — preglednik, tijek e-potpisa, AI panel za pregled. Svaki se mjeri po radnji. Kliknite karticu za instalaciju, upotrebu i props."
title = "Komponente"
[portal.componentsView.empty]
description = "Katalog komponenti nije moguće učitati. Pokušajte ponovno uskoro."
title = "Nema dostupnih komponenti"
[portal.componentsView.lockedBanner]
description = "GA komponente dostupne su na planu Pay-as-you-go; nekoliko Beta komponenti dostupno je samo za Enterprise. Zaključane kartice prikazuju poticaj za nadogradnju."
title = "Neke komponente zahtijevaju plaćeni plan"
[portal.docs.authentication]
codeCaption = "svaki zahtjev"
eyebrow = "POČETAK RADA"
@@ -6521,63 +6521,6 @@ title_other = "Dolgozzon fel {{allowance}} PDF-et ingyen"
titleWithRate_one = "Dolgozzon fel {{allowance}} PDF-et ingyen, utána {{rate}}/PDF"
titleWithRate_other = "Dolgozzon fel {{allowance}} PDF-et ingyen, utána {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zárolva"
openAriaLabel = "{{name}} komponens megnyitása"
[portal.catalogue.detail]
addToProject = "Hozzáadás a projekthez"
ariaLabel = "Komponens részletei"
tabsAriaLabel = "Komponens részleteinek szakaszai"
upgradeToUnlock = "Váltson magasabb csomagra a feloldáshoz"
[portal.catalogue.detail.code]
install = "Telepítés"
usage = "Használat"
[portal.catalogue.detail.locked]
description = "A(z) {{name}} a(z) {{tier}} csomagtól érhető el. Váltson magasabb csomagra a beágyazásához."
title = "Nem érhető el az Ön csomagjában"
[portal.catalogue.detail.preview]
badge = "Élő előnézet"
note = "Az interaktív sandbox itt jelenik meg"
[portal.catalogue.detail.pricing]
note = "Mérés {{unit}} alapján. A havi ingyenes kvótán túli használatot a fiókjára számlázzuk, és a Használat és számlázás alatt tételesen megjelenik."
[portal.catalogue.detail.stats]
billedOn = "Számlázás alapja"
embeds30d = "Beágyazások (30 nap)"
freeQuota = "Ingyenes kvóta"
freeQuotaValue = "{{amount}} / hó"
maturity = "Érettség"
none = "Nincs"
perAction = "Műveletenként"
price = "Ár"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Áttekintés"
pricing = "Árazás"
props = "Props / API"
[portal.catalogue.props]
optional = "opcionális"
required = "kötelező"
[portal.catalogue.props.columns]
description = "Leírás"
name = "Prop"
required = "Kötelező"
type = "Típus"
[portal.catalogue.summary]
componentsGa = "GA komponensek"
componentSpendMtd = "Komponensköltés (MTD)"
embedsThisMonth = "Beágyazások ebben a hónapban"
inBeta = "Beta állapotban"
[portal.components.billingUnit]
approval = "jóváhagyás"
check = "ellenőrzés"
@@ -6591,18 +6534,6 @@ signature = "aláírás"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Beágyazható SDK widgetek, amelyeket a saját alkalmazásába illeszthet — megjelenítő, e-aláírási folyamat, AI felülvizsgálati panel. Mindegyik műveletenként mért. Kattintson egy kártyára a telepítéshez, használathoz és props megtekintéséhez."
title = "Komponensek"
[portal.componentsView.empty]
description = "A komponenskatalógust nem sikerült betölteni. Próbálja újra rövidesen."
title = "Nincsenek elérhető komponensek"
[portal.componentsView.lockedBanner]
description = "A GA komponensek Pay-as-you-go csomagban érhetők el; néhány Beta komponens csak vállalati csomagban. A zárolt kártyák frissítési javaslatot mutatnak."
title = "Egyes komponensekhez fizetős csomag szükséges"
[portal.docs.authentication]
codeCaption = "minden kérés"
eyebrow = "ELSŐ LÉPÉSEK"
@@ -6521,63 +6521,6 @@ title_other = "Proses {{allowance}} PDF gratis"
titleWithRate_one = "Proses {{allowance}} PDF gratis, lalu {{rate}}/PDF"
titleWithRate_other = "Proses {{allowance}} PDF gratis, lalu {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Terkunci"
openAriaLabel = "Buka komponen {{name}}"
[portal.catalogue.detail]
addToProject = "Tambahkan ke proyek"
ariaLabel = "Detail komponen"
tabsAriaLabel = "Bagian detail komponen"
upgradeToUnlock = "Upgrade untuk membuka akses"
[portal.catalogue.detail.code]
install = "Instal"
usage = "Penggunaan"
[portal.catalogue.detail.locked]
description = "{{name}} disertakan mulai paket {{tier}}. Upgrade untuk menyematkannya."
title = "Tidak tersedia pada paket Anda"
[portal.catalogue.detail.preview]
badge = "Pratinjau langsung"
note = "Sandbox interaktif dirender di sini"
[portal.catalogue.detail.pricing]
note = "Bermeter per {{unit}}. Penggunaan di luar kuota gratis bulanan ditagihkan ke akun Anda dan dirinci di Penggunaan & Penagihan."
[portal.catalogue.detail.stats]
billedOn = "Ditagih pada"
embeds30d = "Embed (30h)"
freeQuota = "Kuota gratis"
freeQuotaValue = "{{amount}} / bln"
maturity = "Kematangan"
none = "Tidak ada"
perAction = "Per tindakan"
price = "Harga"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Ikhtisar"
pricing = "Harga"
props = "Props / API"
[portal.catalogue.props]
optional = "opsional"
required = "wajib"
[portal.catalogue.props.columns]
description = "Deskripsi"
name = "Prop"
required = "Wajib"
type = "Tipe"
[portal.catalogue.summary]
componentsGa = "Komponen GA"
componentSpendMtd = "Pengeluaran komponen (MTD)"
embedsThisMonth = "Embed bulan ini"
inBeta = "Dalam beta"
[portal.components.billingUnit]
approval = "persetujuan"
check = "pemeriksaan"
@@ -6591,18 +6534,6 @@ signature = "tanda tangan"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widget SDK yang dapat disematkan dan Anda letakkan di aplikasi sendiri — viewer, alur e-sign, panel tinjauan AI. Masing-masing bermeter per tindakan. Klik kartu untuk instalasi, penggunaan, dan props."
title = "Komponen"
[portal.componentsView.empty]
description = "Katalog komponen tidak dapat dimuat. Coba lagi sebentar lagi."
title = "Tidak ada komponen tersedia"
[portal.componentsView.lockedBanner]
description = "Komponen GA tersedia pada Bayar sesuai pemakaian; beberapa komponen Beta hanya untuk enterprise. Kartu terkunci menampilkan dorongan upgrade."
title = "Beberapa komponen memerlukan paket berbayar"
[portal.docs.authentication]
codeCaption = "setiap permintaan"
eyebrow = "MEMULAI"
@@ -6521,63 +6521,6 @@ title_other = "Elabora {{allowance}} PDF gratuitamente"
titleWithRate_one = "Elabora {{allowance}} PDF gratuitamente, poi {{rate}}/PDF"
titleWithRate_other = "Elabora {{allowance}} PDF gratuitamente, poi {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Bloccato"
openAriaLabel = "Apri componente {{name}}"
[portal.catalogue.detail]
addToProject = "Aggiungi al progetto"
ariaLabel = "Dettaglio componente"
tabsAriaLabel = "Sezioni dettaglio componente"
upgradeToUnlock = "Esegui l'upgrade per sbloccare"
[portal.catalogue.detail.code]
install = "Installazione"
usage = "Uso"
[portal.catalogue.detail.locked]
description = "{{name}} è incluso dal piano {{tier}}. Esegui l'upgrade per incorporarlo."
title = "Non disponibile nel tuo piano"
[portal.catalogue.detail.preview]
badge = "Anteprima live"
note = "La sandbox interattiva viene renderizzata qui"
[portal.catalogue.detail.pricing]
note = "Misurato per {{unit}}. L'uso oltre la quota gratuita mensile viene addebitato al tuo account e dettagliato in Uso e fatturazione."
[portal.catalogue.detail.stats]
billedOn = "Fatturato su"
embeds30d = "Incorporamenti (30g)"
freeQuota = "Quota gratuita"
freeQuotaValue = "{{amount}} / mese"
maturity = "Maturità"
none = "Nessuno"
perAction = "Per azione"
price = "Prezzo"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Panoramica"
pricing = "Prezzi"
props = "Props / API"
[portal.catalogue.props]
optional = "facoltativo"
required = "obbligatorio"
[portal.catalogue.props.columns]
description = "Descrizione"
name = "Prop"
required = "Obbligatorio"
type = "Tipo"
[portal.catalogue.summary]
componentsGa = "Componenti GA"
componentSpendMtd = "Spesa componenti (MTD)"
embedsThisMonth = "Incorporamenti questo mese"
inBeta = "In beta"
[portal.components.billingUnit]
approval = "approvazione"
check = "controllo"
@@ -6591,18 +6534,6 @@ signature = "firma"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widget SDK incorporabili che inserisci nella tua app — un visualizzatore, un flusso di firma elettronica, un pannello di revisione AI. Ognuno è misurato per azione. Fai clic su una scheda per installazione, uso e props."
title = "Componenti"
[portal.componentsView.empty]
description = "Impossibile caricare il catalogo dei componenti. Riprova tra poco."
title = "Nessun componente disponibile"
[portal.componentsView.lockedBanner]
description = "I componenti GA sono disponibili con Pay-as-you-go; alcuni componenti Beta sono solo enterprise. Le schede bloccate mostrano un invito all'upgrade."
title = "Alcuni componenti richiedono un piano a pagamento"
[portal.docs.authentication]
codeCaption = "ogni richiesta"
eyebrow = "PER INIZIARE"
@@ -6521,63 +6521,6 @@ title_other = "{{allowance}} 件のPDFを無料で処理"
titleWithRate_one = "{{allowance}} 件のPDFを無料で処理、その後 {{rate}}/PDF"
titleWithRate_other = "{{allowance}} 件のPDFを無料で処理、その後 {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "ロック中"
openAriaLabel = "{{name}} コンポーネントを開く"
[portal.catalogue.detail]
addToProject = "プロジェクトに追加"
ariaLabel = "コンポーネント詳細"
tabsAriaLabel = "コンポーネント詳細セクション"
upgradeToUnlock = "アップグレードしてロック解除"
[portal.catalogue.detail.code]
install = "インストール"
usage = "使用方法"
[portal.catalogue.detail.locked]
description = "{{name}} は {{tier}} プランから含まれます。埋め込むにはアップグレードしてください。"
title = "ご利用のプランでは利用できません"
[portal.catalogue.detail.preview]
badge = "ライブプレビュー"
note = "インタラクティブなサンドボックスがここにレンダリングされます"
[portal.catalogue.detail.pricing]
note = "{{unit}} ごとに従量課金されます。月間無料枠を超えた使用量はアカウントに請求され、Usage & Billing に明細表示されます。"
[portal.catalogue.detail.stats]
billedOn = "請求単位"
embeds30d = "埋め込み(30日)"
freeQuota = "無料枠"
freeQuotaValue = "{{amount}} / 月"
maturity = "成熟度"
none = "なし"
perAction = "アクションごと"
price = "価格"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "概要"
pricing = "料金"
props = "Props / API"
[portal.catalogue.props]
optional = "任意"
required = "必須"
[portal.catalogue.props.columns]
description = "説明"
name = "Prop"
required = "必須"
type = "タイプ"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "コンポーネント利用額(MTD"
embedsThisMonth = "今月の埋め込み数"
inBeta = "Beta 中"
[portal.components.billingUnit]
approval = "承認"
check = "チェック"
@@ -6591,18 +6534,6 @@ signature = "署名"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "自分のアプリに組み込める SDK ウィジェット — ビューア、電子署名フロー、AI レビューパネル。各項目はアクションごとの従量課金です。カードをクリックすると、インストール、使用方法、props を確認できます。"
title = "コンポーネント"
[portal.componentsView.empty]
description = "コンポーネントカタログを読み込めませんでした。しばらくしてからもう一度お試しください。"
title = "利用可能なコンポーネントはありません"
[portal.componentsView.lockedBanner]
description = "GA コンポーネントは従量課金で利用できます。一部の Beta コンポーネントは Enterprise 専用です。ロックされたカードにはアップグレード案内が表示されます。"
title = "一部のコンポーネントには有料プランが必要です"
[portal.docs.authentication]
codeCaption = "すべてのリクエスト"
eyebrow = "はじめに"
@@ -6521,63 +6521,6 @@ title_other = "PDF {{allowance}}개 무료 처리"
titleWithRate_one = "PDF {{allowance}}개 무료 처리 후 {{rate}}/PDF"
titleWithRate_other = "PDF {{allowance}}개 무료 처리 후 {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "잠김"
openAriaLabel = "{{name}} 구성 요소 열기"
[portal.catalogue.detail]
addToProject = "프로젝트에 추가"
ariaLabel = "구성 요소 상세"
tabsAriaLabel = "구성 요소 상세 섹션"
upgradeToUnlock = "업그레이드하여 잠금 해제"
[portal.catalogue.detail.code]
install = "설치"
usage = "사용법"
[portal.catalogue.detail.locked]
description = "{{name}}은(는) {{tier}} 플랜부터 포함됩니다. 임베드하려면 업그레이드하세요."
title = "현재 플랜에서 사용할 수 없음"
[portal.catalogue.detail.preview]
badge = "라이브 미리보기"
note = "Interactive sandbox가 여기에 렌더링됩니다"
[portal.catalogue.detail.pricing]
note = "{{unit}}당 종량제입니다. 월별 무료 할당량을 초과한 사용량은 계정에 청구되며 Usage & Billing에 항목별로 표시됩니다."
[portal.catalogue.detail.stats]
billedOn = "청구 기준"
embeds30d = "임베드(30일)"
freeQuota = "무료 할당량"
freeQuotaValue = "{{amount}} / 월"
maturity = "성숙도"
none = "없음"
perAction = "작업당"
price = "가격"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "개요"
pricing = "가격"
props = "Props / API"
[portal.catalogue.props]
optional = "선택 사항"
required = "필수"
[portal.catalogue.props.columns]
description = "설명"
name = "Prop"
required = "필수"
type = "유형"
[portal.catalogue.summary]
componentsGa = "구성 요소 GA"
componentSpendMtd = "구성 요소 지출(MTD)"
embedsThisMonth = "이번 달 임베드"
inBeta = "Beta 중"
[portal.components.billingUnit]
approval = "승인"
check = "확인"
@@ -6591,18 +6534,6 @@ signature = "서명"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "자체 앱에 넣을 수 있는 임베드 가능한 SDK 위젯 — viewer, e-sign 흐름, AI 검토 패널. 각 항목은 작업당 종량제입니다. 설치, 사용법, props를 보려면 카드를 클릭하세요."
title = "구성 요소"
[portal.componentsView.empty]
description = "구성 요소 카탈로그를 불러올 수 없습니다. 잠시 후 다시 시도하세요."
title = "사용 가능한 구성 요소 없음"
[portal.componentsView.lockedBanner]
description = "GA 구성 요소는 Pay-as-you-go에서 사용할 수 있으며, 일부 Beta 구성 요소는 enterprise 전용입니다. 잠긴 카드에는 업그레이드 안내가 표시됩니다."
title = "일부 구성 요소에는 유료 플랜이 필요합니다"
[portal.docs.authentication]
codeCaption = "모든 요청"
eyebrow = "시작하기"
@@ -6521,63 +6521,6 @@ title_other = "{{allowance}} PDFs സൗജന്യമായി പ്രോസ
titleWithRate_one = "{{allowance}} PDFs സൗജന്യമായി പ്രോസസ് ചെയ്യുക, തുടർന്ന് {{rate}}/PDF"
titleWithRate_other = "{{allowance}} PDFs സൗജന്യമായി പ്രോസസ് ചെയ്യുക, തുടർന്ന് {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "ലോക്ക് ചെയ്തിരിക്കുന്നു"
openAriaLabel = "{{name}} component തുറക്കുക"
[portal.catalogue.detail]
addToProject = "Project-ിലേക്ക് ചേർക്കുക"
ariaLabel = "Component detail"
tabsAriaLabel = "Component detail വിഭാഗങ്ങൾ"
upgradeToUnlock = "അൺലോക്ക് ചെയ്യാൻ upgrade ചെയ്യുക"
[portal.catalogue.detail.code]
install = "Install"
usage = "Usage"
[portal.catalogue.detail.locked]
description = "{{name}} {{tier}} plan മുതൽ ഉൾപ്പെടുത്തിയിരിക്കുന്നു. Embed ചെയ്യാൻ upgrade ചെയ്യുക."
title = "നിങ്ങളുടെ plan-ൽ ലഭ്യമല്ല"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interactive sandbox ഇവിടെ render ചെയ്യും"
[portal.catalogue.detail.pricing]
note = "{{unit}} ഓരോന്നിനും metered. Monthly free quota-യെ കടക്കുന്ന usage നിങ്ങളുടെ അക്കൗണ്ടിൽ ബിൽ ചെയ്ത് Usage & Billing-ൽ itemise ചെയ്യും."
[portal.catalogue.detail.stats]
billedOn = "ബിൽ ചെയ്യുന്നത്"
embeds30d = "Embeds (30d)"
freeQuota = "Free quota"
freeQuotaValue = "{{amount}} / mo"
maturity = "Maturity"
none = "ഒന്നുമില്ല"
perAction = "ഓരോ action-നും"
price = "വില"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Overview"
pricing = "Pricing"
props = "Props / API"
[portal.catalogue.props]
optional = "ഐച്ഛികം"
required = "ആവശ്യമാണ്"
[portal.catalogue.props.columns]
description = "വിവരണം"
name = "Prop"
required = "ആവശ്യമാണ്"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Component spend (MTD)"
embedsThisMonth = "ഈ മാസത്തെ embeds"
inBeta = "Beta-യിൽ"
[portal.components.billingUnit]
approval = "approval"
check = "check"
@@ -6591,18 +6534,6 @@ signature = "signature"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "നിങ്ങളുടെ സ്വന്തം app-ിലേക്ക് drop ചെയ്യാവുന്ന embeddable SDK widgets — viewer, e-sign flow, AI review panel. ഓരോന്നും action അനുസരിച്ച് metered ആണ്. Install, usage, props കാണാൻ card click ചെയ്യുക."
title = "Components"
[portal.componentsView.empty]
description = "Component catalogue ലോഡ് ചെയ്യാനായില്ല. കുറച്ച് കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക."
title = "ലഭ്യമായ components ഇല്ല"
[portal.componentsView.lockedBanner]
description = "GA components Pay-as-you-go-യിൽ ലഭ്യമാണ്; ചില Beta components enterprise-only ആണ്. Locked cards upgrade nudge കാണിക്കും."
title = "ചില components-ന് paid plan വേണം"
[portal.docs.authentication]
codeCaption = "ഓരോ request-വും"
eyebrow = "GETTING STARTED"
@@ -6521,63 +6521,6 @@ title_other = "Verwerk {{allowance}} PDF's gratis"
titleWithRate_one = "Verwerk {{allowance}} PDF's gratis, daarna {{rate}}/PDF"
titleWithRate_other = "Verwerk {{allowance}} PDF's gratis, daarna {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Vergrendeld"
openAriaLabel = "Component {{name}} openen"
[portal.catalogue.detail]
addToProject = "Toevoegen aan project"
ariaLabel = "Componentdetail"
tabsAriaLabel = "Componentdetailsecties"
upgradeToUnlock = "Upgrade om te ontgrendelen"
[portal.catalogue.detail.code]
install = "Installeren"
usage = "Gebruik"
[portal.catalogue.detail.locked]
description = "{{name}} is inbegrepen vanaf het {{tier}}-abonnement. Upgrade om het in te sluiten."
title = "Niet beschikbaar in je abonnement"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interactieve sandbox wordt hier weergegeven"
[portal.catalogue.detail.pricing]
note = "Verbruiksgemeten per {{unit}}. Gebruik boven het maandelijkse gratis quotum wordt gefactureerd aan je account en gespecificeerd onder Gebruik en facturering."
[portal.catalogue.detail.stats]
billedOn = "Gefactureerd op"
embeds30d = "Embeds (30d)"
freeQuota = "Gratis quotum"
freeQuotaValue = "{{amount}} / mnd"
maturity = "Volwassenheid"
none = "Geen"
perAction = "Per actie"
price = "Prijs"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Overzicht"
pricing = "Prijzen"
props = "Props / API"
[portal.catalogue.props]
optional = "optioneel"
required = "vereist"
[portal.catalogue.props.columns]
description = "Beschrijving"
name = "Prop"
required = "Vereist"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Componenten GA"
componentSpendMtd = "Componentuitgaven (MTD)"
embedsThisMonth = "Embeds deze maand"
inBeta = "In beta"
[portal.components.billingUnit]
approval = "goedkeuring"
check = "controle"
@@ -6591,18 +6534,6 @@ signature = "handtekening"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Insluitbare SDK-widgets die je in je eigen app plaatst — een viewer, een e-sign-flow, een AI-beoordelingspaneel. Elk wordt per actie gemeten. Klik op een kaart voor installatie, gebruik en props."
title = "Componenten"
[portal.componentsView.empty]
description = "De componentencatalogus kon niet worden geladen. Probeer het binnenkort opnieuw."
title = "Geen componenten beschikbaar"
[portal.componentsView.lockedBanner]
description = "GA-componenten zijn beschikbaar met Pay-as-you-go; enkele Beta-componenten zijn alleen voor enterprise. Vergrendelde kaarten tonen een upgrade-aanmoediging."
title = "Sommige componenten hebben een betaald abonnement nodig"
[portal.docs.authentication]
codeCaption = "elk verzoek"
eyebrow = "AAN DE SLAG"
@@ -6521,63 +6521,6 @@ title_other = "Behandle {{allowance}} PDF-er gratis"
titleWithRate_one = "Behandle {{allowance}} PDF-er gratis, deretter {{rate}}/PDF"
titleWithRate_other = "Behandle {{allowance}} PDF-er gratis, deretter {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Låst"
openAriaLabel = "Åpne {{name}}-komponent"
[portal.catalogue.detail]
addToProject = "Legg til i prosjekt"
ariaLabel = "Komponentdetalj"
tabsAriaLabel = "Komponentdetaljseksjoner"
upgradeToUnlock = "Oppgrader for å låse opp"
[portal.catalogue.detail.code]
install = "Installer"
usage = "Bruk"
[portal.catalogue.detail.locked]
description = "{{name}} er inkludert fra {{tier}}-planen. Oppgrader for å bygge den inn."
title = "Ikke tilgjengelig i planen din"
[portal.catalogue.detail.preview]
badge = "Live-forhåndsvisning"
note = "Interaktiv sandbox gjengis her"
[portal.catalogue.detail.pricing]
note = "Målt per {{unit}}. Bruk utover den månedlige gratiskvoten faktureres kontoen din og spesifiseres under Bruk og fakturering."
[portal.catalogue.detail.stats]
billedOn = "Faktureres på"
embeds30d = "Innbygginger (30 d)"
freeQuota = "Gratiskvote"
freeQuotaValue = "{{amount}} / mnd"
maturity = "Modenhet"
none = "Ingen"
perAction = "Per handling"
price = "Pris"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Oversikt"
pricing = "Priser"
props = "Props / API"
[portal.catalogue.props]
optional = "valgfritt"
required = "påkrevd"
[portal.catalogue.props.columns]
description = "Beskrivelse"
name = "Prop"
required = "Påkrevd"
type = "Type"
[portal.catalogue.summary]
componentsGa = "Komponenter GA"
componentSpendMtd = "Komponentforbruk (MTD)"
embedsThisMonth = "Innbygginger denne måneden"
inBeta = "I beta"
[portal.components.billingUnit]
approval = "godkjenning"
check = "sjekk"
@@ -6591,18 +6534,6 @@ signature = "signatur"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Innbyggbare SDK-widgets du slipper inn i din egen app — en viser, en e-sign-flyt, et AI-gjennomgangspanel. Hver måles per handling. Klikk på et kort for installasjon, bruk og props."
title = "Komponenter"
[portal.componentsView.empty]
description = "Komponentkatalogen kunne ikke lastes. Prøv igjen om kort tid."
title = "Ingen komponenter tilgjengelig"
[portal.componentsView.lockedBanner]
description = "GA-komponenter er tilgjengelige med betal etter bruk; noen få Beta-komponenter er kun for Enterprise. Låste kort viser en oppgraderingsoppfordring."
title = "Noen komponenter trenger en betalt plan"
[portal.docs.authentication]
codeCaption = "hver forespørsel"
eyebrow = "KOM I GANG"
@@ -6521,63 +6521,6 @@ title_other = "Przetwórz {{allowance}} PDF bezpłatnie"
titleWithRate_one = "Przetwórz {{allowance}} PDF bezpłatnie, potem {{rate}}/PDF"
titleWithRate_other = "Przetwórz {{allowance}} PDF bezpłatnie, potem {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zablokowane"
openAriaLabel = "Otwórz komponent {{name}}"
[portal.catalogue.detail]
addToProject = "Dodaj do projektu"
ariaLabel = "Szczegóły komponentu"
tabsAriaLabel = "Sekcje szczegółów komponentu"
upgradeToUnlock = "Przejdź na wyższy plan, aby odblokować"
[portal.catalogue.detail.code]
install = "Instalacja"
usage = "Użycie"
[portal.catalogue.detail.locked]
description = "{{name}} jest dostępny od planu {{tier}}. Przejdź na wyższy plan, aby go osadzić."
title = "Niedostępne w Twoim planie"
[portal.catalogue.detail.preview]
badge = "Podgląd na żywo"
note = "Interaktywna piaskownica renderuje tutaj"
[portal.catalogue.detail.pricing]
note = "Rozliczane wg użycia za {{unit}}. Użycie ponad miesięczny bezpłatny limit jest rozliczane na Twoim koncie i wyszczególnione w sekcji Użycie i rozliczenia."
[portal.catalogue.detail.stats]
billedOn = "Rozliczane za"
embeds30d = "Osadzenia (30 dni)"
freeQuota = "Bezpłatny limit"
freeQuotaValue = "{{amount}} / mies."
maturity = "Dojrzałość"
none = "Brak"
perAction = "Za akcję"
price = "Cena"
[portal.catalogue.detail.tabs]
code = "Kod"
overview = "Przegląd"
pricing = "Cennik"
props = "Props / API"
[portal.catalogue.props]
optional = "opcjonalne"
required = "wymagane"
[portal.catalogue.props.columns]
description = "Opis"
name = "Prop"
required = "Wymagane"
type = "Typ"
[portal.catalogue.summary]
componentsGa = "Komponenty GA"
componentSpendMtd = "Wydatki na komponenty (MTD)"
embedsThisMonth = "Osadzenia w tym miesiącu"
inBeta = "W beta"
[portal.components.billingUnit]
approval = "zatwierdzenie"
check = "sprawdzenie"
@@ -6591,18 +6534,6 @@ signature = "podpis"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Osadzalne widżety SDK, które dodajesz do własnej aplikacji — przeglądarka, przepływ e-podpisu, panel przeglądu AI. Każdy jest rozliczany wg użycia za akcję. Kliknij kartę, aby zobaczyć instalację, użycie i props."
title = "Komponenty"
[portal.componentsView.empty]
description = "Nie udało się wczytać katalogu komponentów. Spróbuj ponownie za chwilę."
title = "Brak dostępnych komponentów"
[portal.componentsView.lockedBanner]
description = "Komponenty GA są dostępne w modelu Pay-as-you-go; kilka komponentów Beta jest tylko dla Enterprise. Zablokowane karty pokazują zachętę do przejścia na wyższy plan."
title = "Niektóre komponenty wymagają płatnego planu"
[portal.docs.authentication]
codeCaption = "każde żądanie"
eyebrow = "PIERWSZE KROKI"
@@ -6521,63 +6521,6 @@ title_other = "Processe {{allowance}} PDFs grátis"
titleWithRate_one = "Processe {{allowance}} PDFs grátis, depois {{rate}}/PDF"
titleWithRate_other = "Processe {{allowance}} PDFs grátis, depois {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Bloqueado"
openAriaLabel = "Abrir componente {{name}}"
[portal.catalogue.detail]
addToProject = "Adicionar ao projeto"
ariaLabel = "Detalhes do componente"
tabsAriaLabel = "Seções de detalhes do componente"
upgradeToUnlock = "Faça upgrade para desbloquear"
[portal.catalogue.detail.code]
install = "Instalação"
usage = "Uso"
[portal.catalogue.detail.locked]
description = "{{name}} está incluído a partir do plano {{tier}}. Faça upgrade para incorporá-lo."
title = "Não disponível no seu plano"
[portal.catalogue.detail.preview]
badge = "Prévia ao vivo"
note = "Sandbox interativo renderiza aqui"
[portal.catalogue.detail.pricing]
note = "Medido por {{unit}}. O uso além da cota gratuita mensal é cobrado da sua conta e detalhado em Uso e cobrança."
[portal.catalogue.detail.stats]
billedOn = "Cobrado por"
embeds30d = "Incorporações (30d)"
freeQuota = "Cota gratuita"
freeQuotaValue = "{{amount}} / mês"
maturity = "Maturidade"
none = "Nenhum"
perAction = "Por ação"
price = "Preço"
[portal.catalogue.detail.tabs]
code = "Código"
overview = "Visão geral"
pricing = "Preços"
props = "Props / API"
[portal.catalogue.props]
optional = "opcional"
required = "obrigatório"
[portal.catalogue.props.columns]
description = "Descrição"
name = "Prop"
required = "Obrigatório"
type = "Tipo"
[portal.catalogue.summary]
componentsGa = "Componentes GA"
componentSpendMtd = "Gasto com componentes (MTD)"
embedsThisMonth = "Incorporações este mês"
inBeta = "Em beta"
[portal.components.billingUnit]
approval = "aprovação"
check = "verificação"
@@ -6591,18 +6534,6 @@ signature = "assinatura"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widgets SDK incorporáveis que você coloca no seu próprio app — um visualizador, um fluxo de assinatura eletrônica, um painel de revisão de IA. Cada um é medido por ação. Clique em um cartão para instalação, uso e props."
title = "Componentes"
[portal.componentsView.empty]
description = "Não foi possível carregar o catálogo de componentes. Tente novamente em breve."
title = "Nenhum componente disponível"
[portal.componentsView.lockedBanner]
description = "Componentes GA estão disponíveis no pagamento conforme o uso; alguns componentes Beta são exclusivos para empresas. Cartões bloqueados mostram um incentivo de upgrade."
title = "Alguns componentes precisam de um plano pago"
[portal.docs.authentication]
codeCaption = "cada solicitação"
eyebrow = "INTRODUÇÃO"
@@ -6521,63 +6521,6 @@ title_other = "Processe {{allowance}} PDF gratuitamente"
titleWithRate_one = "Processe {{allowance}} PDF gratuitamente, depois {{rate}}/PDF"
titleWithRate_other = "Processe {{allowance}} PDF gratuitamente, depois {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Bloqueado"
openAriaLabel = "Abrir componente {{name}}"
[portal.catalogue.detail]
addToProject = "Adicionar ao projeto"
ariaLabel = "Detalhe do componente"
tabsAriaLabel = "Secções de detalhe do componente"
upgradeToUnlock = "Atualizar para desbloquear"
[portal.catalogue.detail.code]
install = "Instalar"
usage = "Utilização"
[portal.catalogue.detail.locked]
description = "{{name}} está incluído a partir do plano {{tier}}. Atualize para o incorporar."
title = "Não disponível no seu plano"
[portal.catalogue.detail.preview]
badge = "Pré-visualização em direto"
note = "A sandbox interativa é renderizada aqui"
[portal.catalogue.detail.pricing]
note = "Medido por {{unit}}. A utilização para além da quota gratuita mensal é faturada na sua conta e discriminada em Utilização e faturação."
[portal.catalogue.detail.stats]
billedOn = "Faturado em"
embeds30d = "Incorporações (30 d)"
freeQuota = "Quota gratuita"
freeQuotaValue = "{{amount}} / mês"
maturity = "Maturidade"
none = "Nenhum"
perAction = "Por ação"
price = "Preço"
[portal.catalogue.detail.tabs]
code = "Código"
overview = "Visão geral"
pricing = "Preços"
props = "Props / API"
[portal.catalogue.props]
optional = "opcional"
required = "obrigatório"
[portal.catalogue.props.columns]
description = "Descrição"
name = "Prop"
required = "Obrigatório"
type = "Tipo"
[portal.catalogue.summary]
componentsGa = "Componentes GA"
componentSpendMtd = "Gasto com componentes (MTD)"
embedsThisMonth = "Incorporações este mês"
inBeta = "Em beta"
[portal.components.billingUnit]
approval = "aprovação"
check = "verificação"
@@ -6591,18 +6534,6 @@ signature = "assinatura"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widgets SDK incorporáveis que coloca na sua própria aplicação — um visualizador, um fluxo de assinatura eletrónica, um painel de revisão por IA. Cada um é medido por ação. Clique num cartão para instalação, utilização e props."
title = "Componentes"
[portal.componentsView.empty]
description = "Não foi possível carregar o catálogo de componentes. Tente novamente em breve."
title = "Nenhum componente disponível"
[portal.componentsView.lockedBanner]
description = "Os componentes GA estão disponíveis em Pay-as-you-go; alguns componentes Beta são exclusivos para enterprise. Os cartões bloqueados mostram um incentivo à atualização."
title = "Alguns componentes precisam de um plano pago"
[portal.docs.authentication]
codeCaption = "cada pedido"
eyebrow = "INTRODUÇÃO"
@@ -6521,63 +6521,6 @@ title_other = "Procesează gratuit {{allowance}} PDF-uri"
titleWithRate_one = "Procesează gratuit {{allowance}} PDF, apoi {{rate}}/PDF"
titleWithRate_other = "Procesează gratuit {{allowance}} PDF-uri, apoi {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Blocat"
openAriaLabel = "Deschide componenta {{name}}"
[portal.catalogue.detail]
addToProject = "Adaugă la proiect"
ariaLabel = "Detalii componentă"
tabsAriaLabel = "Secțiuni detalii componentă"
upgradeToUnlock = "Fă upgrade pentru a debloca"
[portal.catalogue.detail.code]
install = "Instalare"
usage = "Utilizare"
[portal.catalogue.detail.locked]
description = "{{name}} este inclus începând cu planul {{tier}}. Fă upgrade pentru a-l încorpora."
title = "Nu este disponibil în planul tău"
[portal.catalogue.detail.preview]
badge = "Previzualizare live"
note = "Sandbox-ul interactiv se redă aici"
[portal.catalogue.detail.pricing]
note = "Contorizat per {{unit}}. Utilizarea peste cota gratuită lunară este facturată în contul tău și detaliată la Utilizare și facturare."
[portal.catalogue.detail.stats]
billedOn = "Facturat la"
embeds30d = "Încorporări (30z)"
freeQuota = "Cotă gratuită"
freeQuotaValue = "{{amount}} / lună"
maturity = "Maturitate"
none = "Niciuna"
perAction = "Per acțiune"
price = "Preț"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Prezentare generală"
pricing = "Prețuri"
props = "Props / API"
[portal.catalogue.props]
optional = "opțional"
required = "obligatoriu"
[portal.catalogue.props.columns]
description = "Descriere"
name = "Prop"
required = "Obligatoriu"
type = "Tip"
[portal.catalogue.summary]
componentsGa = "Componente GA"
componentSpendMtd = "Cheltuieli componente (MTD)"
embedsThisMonth = "Încorporări luna aceasta"
inBeta = "În Beta"
[portal.components.billingUnit]
approval = "aprobare"
check = "verificare"
@@ -6591,18 +6534,6 @@ signature = "semnătură"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Widgeturi SDK încorporabile pe care le introduci în propria aplicație — un viewer, un flux de semnare electronică, un panou de revizuire AI. Fiecare este contorizat per acțiune. Apasă pe un card pentru instalare, utilizare și props."
title = "Componente"
[portal.componentsView.empty]
description = "Catalogul de componente nu a putut fi încărcat. Încearcă din nou în curând."
title = "Nu există componente disponibile"
[portal.componentsView.lockedBanner]
description = "Componentele GA sunt disponibile pe Pay-as-you-go; câteva componente Beta sunt doar pentru enterprise. Cardurile blocate afișează un îndemn de upgrade."
title = "Unele componente necesită un plan plătit"
[portal.docs.authentication]
codeCaption = "fiecare solicitare"
eyebrow = "ÎNCEPUT"
@@ -6521,63 +6521,6 @@ title_other = "Обработайте {{allowance}} PDF бесплатно"
titleWithRate_one = "Обработайте {{allowance}} PDF бесплатно, затем {{rate}}/PDF"
titleWithRate_other = "Обработайте {{allowance}} PDF бесплатно, затем {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Заблокировано"
openAriaLabel = "Открыть компонент {{name}}"
[portal.catalogue.detail]
addToProject = "Добавить в проект"
ariaLabel = "Сведения о компоненте"
tabsAriaLabel = "Разделы сведений о компоненте"
upgradeToUnlock = "Обновите план, чтобы разблокировать"
[portal.catalogue.detail.code]
install = "Установка"
usage = "Использование"
[portal.catalogue.detail.locked]
description = "{{name}} включён начиная с плана {{tier}}. Обновите план, чтобы встроить его."
title = "Недоступно на вашем плане"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Здесь отображается интерактивная песочница"
[portal.catalogue.detail.pricing]
note = "Тарифицируется за {{unit}}. Использование сверх месячной бесплатной квоты списывается с вашего аккаунта и деталлизируется в разделе Usage & Billing."
[portal.catalogue.detail.stats]
billedOn = "Тарифицируется по"
embeds30d = "Встраивания (30 дн.)"
freeQuota = "Бесплатная квота"
freeQuotaValue = "{{amount}} / мес."
maturity = "Зрелость"
none = "Нет"
perAction = "За действие"
price = "Цена"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Обзор"
pricing = "Цены"
props = "Свойства / API"
[portal.catalogue.props]
optional = "необязательно"
required = "обязательно"
[portal.catalogue.props.columns]
description = "Описание"
name = "Свойство"
required = "Обязательно"
type = "Тип"
[portal.catalogue.summary]
componentsGa = "Компоненты GA"
componentSpendMtd = "Расходы на компоненты (MTD)"
embedsThisMonth = "Встраивания в этом месяце"
inBeta = "В Beta"
[portal.components.billingUnit]
approval = "утверждение"
check = "проверка"
@@ -6591,18 +6534,6 @@ signature = "подпись"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Встраиваемые виджеты SDK, которые можно добавить в ваше приложение — просмотрщик, поток e-sign, панель AI-проверки. Каждый тарифицируется за действие. Нажмите карточку, чтобы увидеть установку, использование и свойства."
title = "Компоненты"
[portal.componentsView.empty]
description = "Не удалось загрузить каталог компонентов. Попробуйте снова чуть позже."
title = "Нет доступных компонентов"
[portal.componentsView.lockedBanner]
description = "Компоненты GA доступны на Pay-as-you-go; некоторые компоненты Beta доступны только для enterprise. Заблокированные карточки показывают подсказку об обновлении."
title = "Для некоторых компонентов нужен платный план"
[portal.docs.authentication]
codeCaption = "каждый запрос"
eyebrow = "GETTING STARTED"
@@ -6521,63 +6521,6 @@ title_other = "Spracujte {{allowance}} PDF zadarmo"
titleWithRate_one = "Spracujte {{allowance}} PDF zadarmo, potom {{rate}}/PDF"
titleWithRate_other = "Spracujte {{allowance}} PDF zadarmo, potom {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zamknuté"
openAriaLabel = "Otvoriť komponent {{name}}"
[portal.catalogue.detail]
addToProject = "Pridať do projektu"
ariaLabel = "Detail komponentu"
tabsAriaLabel = "Sekcie detailu komponentu"
upgradeToUnlock = "Prejdite na vyšší plán na odomknutie"
[portal.catalogue.detail.code]
install = "Inštalácia"
usage = "Použitie"
[portal.catalogue.detail.locked]
description = "{{name}} je zahrnuté od plánu {{tier}}. Prejdite na vyšší plán, aby ste ho mohli vložiť."
title = "Nie je dostupné vo vašom pláne"
[portal.catalogue.detail.preview]
badge = "Živý náhľad"
note = "Interaktívny sandbox sa vykreslí tu"
[portal.catalogue.detail.pricing]
note = "Merané za {{unit}}. Použitie nad mesačnú bezplatnú kvótu sa účtuje na váš účet a je rozpísané v časti Použitie a fakturácia."
[portal.catalogue.detail.stats]
billedOn = "Účtované podľa"
embeds30d = "Vloženia (30 d)"
freeQuota = "Bezplatná kvóta"
freeQuotaValue = "{{amount}} / mes."
maturity = "Vyspelosť"
none = "Žiadne"
perAction = "Za akciu"
price = "Cena"
[portal.catalogue.detail.tabs]
code = "Kód"
overview = "Prehľad"
pricing = "Ceny"
props = "Props / API"
[portal.catalogue.props]
optional = "voliteľné"
required = "povinné"
[portal.catalogue.props.columns]
description = "Popis"
name = "Prop"
required = "Povinné"
type = "Typ"
[portal.catalogue.summary]
componentsGa = "Komponenty GA"
componentSpendMtd = "Výdavky na komponenty (MTD)"
embedsThisMonth = "Vloženia tento mesiac"
inBeta = "V beta"
[portal.components.billingUnit]
approval = "schválenie"
check = "kontrola"
@@ -6591,18 +6534,6 @@ signature = "podpis"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Vložiteľné SDK widgety, ktoré pridáte do vlastnej aplikácie — prehliadač, tok e-podpisu, panel AI kontroly. Každý je meraný za akciu. Kliknite na kartu pre inštaláciu, použitie a props."
title = "Komponenty"
[portal.componentsView.empty]
description = "Katalóg komponentov sa nepodarilo načítať. Skúste to čoskoro znova."
title = "Nie sú dostupné žiadne komponenty"
[portal.componentsView.lockedBanner]
description = "Komponenty GA sú dostupné v režime Pay-as-you-go; niekoľko komponentov Beta je iba pre Enterprise. Zamknuté karty zobrazujú výzvu na upgrade."
title = "Niektoré komponenty vyžadujú platený plán"
[portal.docs.authentication]
codeCaption = "každá požiadavka"
eyebrow = "ZAČÍNAME"
@@ -6521,63 +6521,6 @@ title_other = "Obdelajte {{allowance}} PDF-jev brezplačno"
titleWithRate_one = "Obdelajte {{allowance}} PDF-jev brezplačno, nato {{rate}}/PDF"
titleWithRate_other = "Obdelajte {{allowance}} PDF-jev brezplačno, nato {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zaklenjeno"
openAriaLabel = "Odpri komponento {{name}}"
[portal.catalogue.detail]
addToProject = "Dodaj v projekt"
ariaLabel = "Podrobnosti komponente"
tabsAriaLabel = "Razdelki podrobnosti komponente"
upgradeToUnlock = "Nadgradite za odklepanje"
[portal.catalogue.detail.code]
install = "Namesti"
usage = "Uporaba"
[portal.catalogue.detail.locked]
description = "{{name}} je vključeno od paketa {{tier}} naprej. Nadgradite za vdelavo."
title = "Ni na voljo v vašem paketu"
[portal.catalogue.detail.preview]
badge = "Predogled v živo"
note = "Interaktivni sandbox se prikaže tukaj"
[portal.catalogue.detail.pricing]
note = "Merjeno na {{unit}}. Uporaba nad mesečno brezplačno kvoto se zaračuna vašemu računu in je razčlenjena pod Uporaba in obračun."
[portal.catalogue.detail.stats]
billedOn = "Obračunano po"
embeds30d = "Vdelave (30 d)"
freeQuota = "Brezplačna kvota"
freeQuotaValue = "{{amount}} / mesec"
maturity = "Zrelost"
none = "Brez"
perAction = "Na dejanje"
price = "Cena"
[portal.catalogue.detail.tabs]
code = "Koda"
overview = "Pregled"
pricing = "Cene"
props = "Props / API"
[portal.catalogue.props]
optional = "neobvezno"
required = "obvezno"
[portal.catalogue.props.columns]
description = "Opis"
name = "Prop"
required = "Obvezno"
type = "Vrsta"
[portal.catalogue.summary]
componentsGa = "Komponente GA"
componentSpendMtd = "Poraba komponent (MTD)"
embedsThisMonth = "Vdelave ta mesec"
inBeta = "V Beta"
[portal.components.billingUnit]
approval = "odobritev"
check = "preverjanje"
@@ -6591,18 +6534,6 @@ signature = "podpis"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Vdeljivi SDK gradniki, ki jih spustite v svojo aplikacijo — pregledovalnik, tok e-podpisa, plošča za AI pregled. Vsak je merjen na dejanje. Kliknite kartico za namestitev, uporabo in props."
title = "Komponente"
[portal.componentsView.empty]
description = "Kataloga komponent ni bilo mogoče naložiti. Poskusite znova kmalu."
title = "Ni razpoložljivih komponent"
[portal.componentsView.lockedBanner]
description = "Komponente GA so na voljo pri plačilu po porabi; nekaj komponent Beta je samo za Enterprise. Zaklenjene kartice prikazujejo poziv za nadgradnjo."
title = "Nekatere komponente zahtevajo plačljiv paket"
[portal.docs.authentication]
codeCaption = "vsaka zahteva"
eyebrow = "ZAČETEK"
@@ -6521,63 +6521,6 @@ title_other = "Obradite {{allowance}} PDF dokumenata besplatno"
titleWithRate_one = "Obradite {{allowance}} PDF dokumenata besplatno, zatim {{rate}}/PDF"
titleWithRate_other = "Obradite {{allowance}} PDF dokumenata besplatno, zatim {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Zaključano"
openAriaLabel = "Otvori komponentu {{name}}"
[portal.catalogue.detail]
addToProject = "Dodaj u projekat"
ariaLabel = "Detalji komponente"
tabsAriaLabel = "Odeljci detalja komponente"
upgradeToUnlock = "Nadogradite za otključavanje"
[portal.catalogue.detail.code]
install = "Instalacija"
usage = "Upotreba"
[portal.catalogue.detail.locked]
description = "{{name}} je uključeno od {{tier}} plana. Nadogradite da biste ga ugradili."
title = "Nije dostupno na vašem planu"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Interaktivni sandbox se prikazuje ovde"
[portal.catalogue.detail.pricing]
note = "Mereno po {{unit}}. Korišćenje preko mesečne besplatne kvote naplaćuje se vašem nalogu i stavlja pod Usage & Billing."
[portal.catalogue.detail.stats]
billedOn = "Naplaćuje se po"
embeds30d = "Ugradnje (30d)"
freeQuota = "Besplatna kvota"
freeQuotaValue = "{{amount}} / mes"
maturity = "Zrelost"
none = "Nema"
perAction = "Po radnji"
price = "Cena"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Pregled"
pricing = "Cene"
props = "Props / API"
[portal.catalogue.props]
optional = "opciono"
required = "obavezno"
[portal.catalogue.props.columns]
description = "Opis"
name = "Prop"
required = "Obavezno"
type = "Tip"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Potrošnja komponente (MTD)"
embedsThisMonth = "Ugradnje ovog meseca"
inBeta = "U beta verziji"
[portal.components.billingUnit]
approval = "odobrenje"
check = "provera"
@@ -6591,18 +6534,6 @@ signature = "potpis"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Ugradivi SDK widget-i koje ubacujete u svoju aplikaciju — viewer, tok e-potpisa, AI panel za pregled. Svaki se meri po radnji. Kliknite karticu za instalaciju, upotrebu i props."
title = "Komponente"
[portal.componentsView.empty]
description = "Katalog komponenti nije moguće učitati. Pokušajte ponovo uskoro."
title = "Nema dostupnih komponenti"
[portal.componentsView.lockedBanner]
description = "GA komponente su dostupne na Pay-as-you-go; nekoliko Beta komponenti je samo za Enterprise. Zaključane kartice prikazuju podsticaj za nadogradnju."
title = "Neke komponente zahtevaju plaćeni plan"
[portal.docs.authentication]
codeCaption = "svaki zahtev"
eyebrow = "POČETAK"
@@ -6521,63 +6521,6 @@ title_other = "Bearbeta {{allowance}} PDF:er gratis"
titleWithRate_one = "Bearbeta {{allowance}} PDF:er gratis, sedan {{rate}}/PDF"
titleWithRate_other = "Bearbeta {{allowance}} PDF:er gratis, sedan {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Låst"
openAriaLabel = "Öppna komponenten {{name}}"
[portal.catalogue.detail]
addToProject = "Lägg till i projekt"
ariaLabel = "Komponentdetalj"
tabsAriaLabel = "Sektioner för komponentdetalj"
upgradeToUnlock = "Uppgradera för att låsa upp"
[portal.catalogue.detail.code]
install = "Installera"
usage = "Användning"
[portal.catalogue.detail.locked]
description = "{{name}} ingår från {{tier}}-planen. Uppgradera för att bädda in den."
title = "Inte tillgängligt i din plan"
[portal.catalogue.detail.preview]
badge = "Liveförhandsvisning"
note = "Interaktiv sandbox renderas här"
[portal.catalogue.detail.pricing]
note = "Mätt per {{unit}}. Användning utöver den månatliga gratiskvoten faktureras ditt konto och specificeras under Användning och fakturering."
[portal.catalogue.detail.stats]
billedOn = "Faktureras på"
embeds30d = "Inbäddningar (30 d)"
freeQuota = "Gratiskvot"
freeQuotaValue = "{{amount}} / mån"
maturity = "Mognad"
none = "Ingen"
perAction = "Per åtgärd"
price = "Pris"
[portal.catalogue.detail.tabs]
code = "Kod"
overview = "Översikt"
pricing = "Prissättning"
props = "Props / API"
[portal.catalogue.props]
optional = "valfritt"
required = "obligatoriskt"
[portal.catalogue.props.columns]
description = "Beskrivning"
name = "Prop"
required = "Obligatoriskt"
type = "Typ"
[portal.catalogue.summary]
componentsGa = "Komponenter GA"
componentSpendMtd = "Komponentutgifter (MTD)"
embedsThisMonth = "Inbäddningar denna månad"
inBeta = "I beta"
[portal.components.billingUnit]
approval = "godkännande"
check = "kontroll"
@@ -6591,18 +6534,6 @@ signature = "signatur"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Inbäddningsbara SDK-widgets som du släpper in i din egen app — en visare, ett e-sign-flöde, en AI-granskningspanel. Varje mäts per åtgärd. Klicka på ett kort för installation, användning och props."
title = "Komponenter"
[portal.componentsView.empty]
description = "Komponentkatalogen kunde inte läsas in. Försök igen snart."
title = "Inga komponenter tillgängliga"
[portal.componentsView.lockedBanner]
description = "GA-komponenter är tillgängliga med Pay-as-you-go; några Beta-komponenter är endast för enterprise. Låsta kort visar en uppgraderingsuppmaning."
title = "Vissa komponenter kräver en betald plan"
[portal.docs.authentication]
codeCaption = "varje förfrågan"
eyebrow = "KOM IGÅNG"
@@ -6521,63 +6521,6 @@ title_other = "ประมวลผล {{allowance}} PDFs ฟรี"
titleWithRate_one = "ประมวลผล {{allowance}} PDFs ฟรี จากนั้น {{rate}}/PDF"
titleWithRate_other = "ประมวลผล {{allowance}} PDFs ฟรี จากนั้น {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "ถูกล็อก"
openAriaLabel = "เปิดคอมโพเนนต์ {{name}}"
[portal.catalogue.detail]
addToProject = "เพิ่มไปยังโปรเจกต์"
ariaLabel = "รายละเอียดคอมโพเนนต์"
tabsAriaLabel = "ส่วนรายละเอียดคอมโพเนนต์"
upgradeToUnlock = "อัปเกรดเพื่อปลดล็อก"
[portal.catalogue.detail.code]
install = "ติดตั้ง"
usage = "การใช้งาน"
[portal.catalogue.detail.locked]
description = "{{name}} รวมอยู่ตั้งแต่แผน {{tier}} อัปเกรดเพื่อฝังใช้งาน"
title = "ไม่มีในแผนของคุณ"
[portal.catalogue.detail.preview]
badge = "ตัวอย่างสด"
note = "แซนด์บ็อกซ์แบบโต้ตอบจะแสดงที่นี่"
[portal.catalogue.detail.pricing]
note = "คิดตามปริมาณต่อ {{unit}} การใช้งานเกินโควต้าฟรีรายเดือนจะถูกเรียกเก็บเงินไปยังบัญชีของคุณและแยกรายการใต้ Usage & Billing"
[portal.catalogue.detail.stats]
billedOn = "เรียกเก็บเงินตาม"
embeds30d = "การฝัง (30d)"
freeQuota = "โควต้าฟรี"
freeQuotaValue = "{{amount}} / เดือน"
maturity = "ระดับความพร้อม"
none = "ไม่มี"
perAction = "ต่อการดำเนินการ"
price = "ราคา"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "ภาพรวม"
pricing = "ราคา"
props = "Props / API"
[portal.catalogue.props]
optional = "ไม่บังคับ"
required = "จำเป็น"
[portal.catalogue.props.columns]
description = "คำอธิบาย"
name = "Prop"
required = "จำเป็น"
type = "ประเภท"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "ค่าใช้จ่ายคอมโพเนนต์ (MTD)"
embedsThisMonth = "การฝังในเดือนนี้"
inBeta = "อยู่ใน Beta"
[portal.components.billingUnit]
approval = "การอนุมัติ"
check = "การตรวจสอบ"
@@ -6591,18 +6534,6 @@ signature = "ลายเซ็น"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "วิดเจ็ต SDK ที่ฝังได้ซึ่งคุณวางในแอปของคุณเอง — viewer, โฟลว์ e-sign, แผงรีวิว AI แต่ละรายการคิดตามปริมาณต่อการดำเนินการ คลิกการ์ดเพื่อดูการติดตั้ง การใช้งาน และ props"
title = "คอมโพเนนต์"
[portal.componentsView.empty]
description = "ไม่สามารถโหลดแค็ตตาล็อกคอมโพเนนต์ได้ ลองอีกครั้งในไม่ช้า"
title = "ไม่มีคอมโพเนนต์พร้อมใช้งาน"
[portal.componentsView.lockedBanner]
description = "คอมโพเนนต์ GA พร้อมใช้งานในแบบจ่ายตามการใช้งาน; คอมโพเนนต์ Beta บางรายการสำหรับ enterprise เท่านั้น การ์ดที่ถูกล็อกจะแสดงคำแนะนำให้อัปเกรด"
title = "คอมโพเนนต์บางรายการต้องใช้แผนแบบชำระเงิน"
[portal.docs.authentication]
codeCaption = "ทุกคำขอ"
eyebrow = "เริ่มต้นใช้งาน"
@@ -6521,63 +6521,6 @@ title_other = "{{allowance}} PDF'yi ücretsiz işleyin"
titleWithRate_one = "{{allowance}} PDF'yi ücretsiz işleyin, sonra PDF başına {{rate}}"
titleWithRate_other = "{{allowance}} PDF'yi ücretsiz işleyin, sonra PDF başına {{rate}}"
[portal.catalogue.card]
lockedAriaLabel = "Kilitli"
openAriaLabel = "{{name}} bileşenini aç"
[portal.catalogue.detail]
addToProject = "Projeye ekle"
ariaLabel = "Bileşen ayrıntısı"
tabsAriaLabel = "Bileşen ayrıntı bölümleri"
upgradeToUnlock = "Kilidi açmak için yükselt"
[portal.catalogue.detail.code]
install = "Kurulum"
usage = "Kullanım"
[portal.catalogue.detail.locked]
description = "{{name}}, {{tier}} planından itibaren dahildir. Gömülü kullanmak için yükseltin."
title = "Planınızda mevcut değil"
[portal.catalogue.detail.preview]
badge = "Canlı önizleme"
note = "Etkileşimli sandbox burada oluşturulur"
[portal.catalogue.detail.pricing]
note = "{{unit}} başına ölçümlenir. Aylık ücretsiz kotanın üzerindeki kullanım hesabınıza faturalandırılır ve Kullanım ve Faturalandırma altında kalemlendirilir."
[portal.catalogue.detail.stats]
billedOn = "Faturalandırma ölçütü"
embeds30d = "Embed'ler (30g)"
freeQuota = "Ücretsiz kota"
freeQuotaValue = "{{amount}} / ay"
maturity = "Olgunluk"
none = "Yok"
perAction = "Eylem başına"
price = "Fiyat"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Genel bakış"
pricing = "Fiyatlandırma"
props = "Props / API"
[portal.catalogue.props]
optional = "isteğe bağlı"
required = "gerekli"
[portal.catalogue.props.columns]
description = "Açıklama"
name = "Prop"
required = "Gerekli"
type = "Tür"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "Bileşen harcaması (MTD)"
embedsThisMonth = "Bu ayki embed'ler"
inBeta = "Beta'da"
[portal.components.billingUnit]
approval = "onay"
check = "kontrol"
@@ -6591,18 +6534,6 @@ signature = "imza"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Kendi uygulamanıza ekleyebileceğiniz gömülebilir SDK widget'ları — bir görüntüleyici, e-imza akışı, AI inceleme paneli. Her biri eylem başına ölçümlenir. Kurulum, kullanım ve props için bir karta tıklayın."
title = "Bileşenler"
[portal.componentsView.empty]
description = "Bileşen kataloğu yüklenemedi. Kısa süre sonra tekrar deneyin."
title = "Kullanılabilir bileşen yok"
[portal.componentsView.lockedBanner]
description = "GA bileşenleri Pay-as-you-go planında mevcuttur; birkaç Beta bileşeni yalnızca enterprise içindir. Kilitli kartlar yükseltme önerisi gösterir."
title = "Bazı bileşenler ücretli plan gerektirir"
[portal.docs.authentication]
codeCaption = "her istek"
eyebrow = "BAŞLANGIÇ"
@@ -6521,63 +6521,6 @@ title_other = "Обробіть {{allowance}} PDF безкоштовно"
titleWithRate_one = "Обробіть {{allowance}} PDF безкоштовно, потім {{rate}}/PDF"
titleWithRate_other = "Обробіть {{allowance}} PDF безкоштовно, потім {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Заблоковано"
openAriaLabel = "Відкрити компонент {{name}}"
[portal.catalogue.detail]
addToProject = "Додати до проєкту"
ariaLabel = "Відомості про компонент"
tabsAriaLabel = "Розділи відомостей про компонент"
upgradeToUnlock = "Оновіть план, щоб розблокувати"
[portal.catalogue.detail.code]
install = "Встановлення"
usage = "Використання"
[portal.catalogue.detail.locked]
description = "{{name}} включено з плану {{tier}}. Оновіть план, щоб вбудувати його."
title = "Недоступно у вашому плані"
[portal.catalogue.detail.preview]
badge = "Live preview"
note = "Інтерактивна sandbox відображається тут"
[portal.catalogue.detail.pricing]
note = "За лічильником за {{unit}}. Використання понад щомісячну безкоштовну квоту виставляється на ваш обліковий запис і деталізується в Usage & Billing."
[portal.catalogue.detail.stats]
billedOn = "Оплачується за"
embeds30d = "Вбудовування (30 дн.)"
freeQuota = "Безкоштовна квота"
freeQuotaValue = "{{amount}} / міс."
maturity = "Зрілість"
none = "Немає"
perAction = "За дію"
price = "Ціна"
[portal.catalogue.detail.tabs]
code = "Код"
overview = "Огляд"
pricing = "Ціни"
props = "Props / API"
[portal.catalogue.props]
optional = "необов’язково"
required = "обов’язково"
[portal.catalogue.props.columns]
description = "Опис"
name = "Prop"
required = "Обов’язково"
type = "Тип"
[portal.catalogue.summary]
componentsGa = "Компоненти GA"
componentSpendMtd = "Витрати на компоненти (MTD)"
embedsThisMonth = "Вбудовувань цього місяця"
inBeta = "У beta"
[portal.components.billingUnit]
approval = "схвалення"
check = "перевірка"
@@ -6591,18 +6534,6 @@ signature = "підпис"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Вбудовувані SDK-віджети, які ви додаєте у власний застосунок — переглядач, процес e-sign, панель AI-перевірки. Кожен оплачується за дію. Натисніть картку, щоб переглянути встановлення, використання та props."
title = "Компоненти"
[portal.componentsView.empty]
description = "Не вдалося завантажити каталог компонентів. Спробуйте ще раз незабаром."
title = "Немає доступних компонентів"
[portal.componentsView.lockedBanner]
description = "Компоненти GA доступні на Pay-as-you-go; кілька компонентів Beta доступні лише для Enterprise. Заблоковані картки показують пропозицію оновлення."
title = "Деяким компонентам потрібен платний план"
[portal.docs.authentication]
codeCaption = "кожен запит"
eyebrow = "ПОЧАТОК РОБОТИ"
@@ -6521,63 +6521,6 @@ title_other = "Xử lý {{allowance}} PDF miễn phí"
titleWithRate_one = "Xử lý {{allowance}} PDF miễn phí, sau đó {{rate}}/PDF"
titleWithRate_other = "Xử lý {{allowance}} PDF miễn phí, sau đó {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "Đã khóa"
openAriaLabel = "Mở thành phần {{name}}"
[portal.catalogue.detail]
addToProject = "Thêm vào dự án"
ariaLabel = "Chi tiết thành phần"
tabsAriaLabel = "Các phần chi tiết thành phần"
upgradeToUnlock = "Nâng cấp để mở khóa"
[portal.catalogue.detail.code]
install = "Cài đặt"
usage = "Cách dùng"
[portal.catalogue.detail.locked]
description = "{{name}} được bao gồm từ gói {{tier}}. Nâng cấp để nhúng nó."
title = "Không khả dụng trên gói của bạn"
[portal.catalogue.detail.preview]
badge = "Xem trước trực tiếp"
note = "Sandbox tương tác hiển thị tại đây"
[portal.catalogue.detail.pricing]
note = "Tính theo mức sử dụng mỗi {{unit}}. Mức sử dụng vượt quá hạn mức miễn phí hàng tháng sẽ được tính phí vào tài khoản của bạn và liệt kê chi tiết trong Sử dụng & Thanh toán."
[portal.catalogue.detail.stats]
billedOn = "Tính phí theo"
embeds30d = "Lượt nhúng (30 ngày)"
freeQuota = "Hạn mức miễn phí"
freeQuotaValue = "{{amount}} / tháng"
maturity = "Mức độ trưởng thành"
none = "Không có"
perAction = "Mỗi hành động"
price = "Giá"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "Tổng quan"
pricing = "Giá"
props = "Props / API"
[portal.catalogue.props]
optional = "tùy chọn"
required = "bắt buộc"
[portal.catalogue.props.columns]
description = "Mô tả"
name = "Prop"
required = "Bắt buộc"
type = "Loại"
[portal.catalogue.summary]
componentsGa = "Thành phần GA"
componentSpendMtd = "Chi tiêu thành phần (MTD)"
embedsThisMonth = "Lượt nhúng tháng này"
inBeta = "Đang beta"
[portal.components.billingUnit]
approval = "phê duyệt"
check = "kiểm tra"
@@ -6591,18 +6534,6 @@ signature = "chữ ký"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "Các widget SDK có thể nhúng mà bạn thả vào ứng dụng của mình — trình xem, luồng e-sign, bảng xem xét AI. Mỗi widget được tính theo mức sử dụng mỗi hành động. Nhấp vào thẻ để xem cài đặt, cách dùng và props."
title = "Thành phần"
[portal.componentsView.empty]
description = "Không thể tải catalogue thành phần. Hãy thử lại sau ít phút."
title = "Không có thành phần nào khả dụng"
[portal.componentsView.lockedBanner]
description = "Các thành phần GA có sẵn trên Pay-as-you-go; một số thành phần Beta chỉ dành cho doanh nghiệp. Thẻ bị khóa hiển thị lời nhắc nâng cấp."
title = "Một số thành phần cần gói trả phí"
[portal.docs.authentication]
codeCaption = "mọi yêu cầu"
eyebrow = "BẮT ĐẦU"
@@ -6521,63 +6521,6 @@ title_other = "免费处理 {{allowance}} 个 PDFs"
titleWithRate_one = "免费处理 {{allowance}} 个 PDFs,之后 {{rate}}/PDF"
titleWithRate_other = "免费处理 {{allowance}} 个 PDFs,之后 {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "已锁定"
openAriaLabel = "打开 {{name}} 组件"
[portal.catalogue.detail]
addToProject = "添加到项目"
ariaLabel = "组件详情"
tabsAriaLabel = "组件详情部分"
upgradeToUnlock = "升级以解锁"
[portal.catalogue.detail.code]
install = "安装"
usage = "用法"
[portal.catalogue.detail.locked]
description = "{{name}} 从 {{tier}} 方案开始包含。升级以嵌入它。"
title = "您的方案不可用"
[portal.catalogue.detail.preview]
badge = "实时预览"
note = "交互式沙盒将在此处渲染"
[portal.catalogue.detail.pricing]
note = "按 {{unit}} 计量。超出每月免费额度的使用量会计入您的账户,并在使用情况和账单中逐项列出。"
[portal.catalogue.detail.stats]
billedOn = "计费依据"
embeds30d = "嵌入次数(30 天)"
freeQuota = "免费额度"
freeQuotaValue = "{{amount}} / 月"
maturity = "成熟度"
none = "无"
perAction = "按操作"
price = "价格"
[portal.catalogue.detail.tabs]
code = "代码"
overview = "概览"
pricing = "定价"
props = "Props / API"
[portal.catalogue.props]
optional = "可选"
required = "必需"
[portal.catalogue.props.columns]
description = "描述"
name = "Prop"
required = "必需"
type = "类型"
[portal.catalogue.summary]
componentsGa = "组件 GA"
componentSpendMtd = "组件支出(MTD"
embedsThisMonth = "本月嵌入次数"
inBeta = "Beta 中"
[portal.components.billingUnit]
approval = "批准"
check = "检查"
@@ -6591,18 +6534,6 @@ signature = "签名"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "可嵌入的 SDK 小组件,可放入您自己的应用——查看器、电子签流程、AI 审核面板。每个都按操作计量。点击卡片查看安装、用法和 props。"
title = "组件"
[portal.componentsView.empty]
description = "无法加载组件目录。请稍后重试。"
title = "没有可用组件"
[portal.componentsView.lockedBanner]
description = "GA 组件在按量付费中可用;少数 Beta 组件仅限企业使用。锁定卡片会显示升级提示。"
title = "部分组件需要付费方案"
[portal.docs.authentication]
codeCaption = "每个请求"
eyebrow = "入门"
@@ -6521,63 +6521,6 @@ title_other = "免费处理 {{allowance}} 个 PDFs"
titleWithRate_one = "免费处理 {{allowance}} 个 PDFs,之后 {{rate}}/PDF"
titleWithRate_other = "免费处理 {{allowance}} 个 PDFs,之后 {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "已锁定"
openAriaLabel = "打开 {{name}} 组件"
[portal.catalogue.detail]
addToProject = "添加到项目"
ariaLabel = "组件详情"
tabsAriaLabel = "组件详情部分"
upgradeToUnlock = "升级以解锁"
[portal.catalogue.detail.code]
install = "安装"
usage = "用法"
[portal.catalogue.detail.locked]
description = "{{name}} 自 {{tier}} 计划起包含。升级后可嵌入它。"
title = "您的计划不可用"
[portal.catalogue.detail.preview]
badge = "实时预览"
note = "交互式沙盒将在此处渲染"
[portal.catalogue.detail.pricing]
note = "按每 {{unit}} 计量。超出每月免费额度的使用量会计入您的账户,并在使用与账单中逐项列出。"
[portal.catalogue.detail.stats]
billedOn = "计费依据"
embeds30d = "嵌入次数(30 天)"
freeQuota = "免费额度"
freeQuotaValue = "{{amount}} / 月"
maturity = "成熟度"
none = "无"
perAction = "按操作"
price = "价格"
[portal.catalogue.detail.tabs]
code = "代码"
overview = "概览"
pricing = "定价"
props = "Props / API"
[portal.catalogue.props]
optional = "可选"
required = "必填"
[portal.catalogue.props.columns]
description = "描述"
name = "Prop"
required = "必填"
type = "类型"
[portal.catalogue.summary]
componentsGa = "组件 GA"
componentSpendMtd = "组件支出(MTD"
embedsThisMonth = "本月嵌入次数"
inBeta = "Beta 中"
[portal.components.billingUnit]
approval = "审批"
check = "检查"
@@ -6591,18 +6534,6 @@ signature = "签名"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "可嵌入的 SDK 小部件,可放入您自己的应用——查看器、电子签流程、AI 审核面板。每个都按操作计量。点击卡片查看安装、用法和 props。"
title = "组件"
[portal.componentsView.empty]
description = "无法加载组件目录。请稍后重试。"
title = "没有可用组件"
[portal.componentsView.lockedBanner]
description = "GA 组件在按量付费计划中可用;少数 Beta 组件仅限企业版。锁定的卡片会显示升级提示。"
title = "部分组件需要付费计划"
[portal.docs.authentication]
codeCaption = "每个请求"
eyebrow = "入门"
@@ -6521,63 +6521,6 @@ title_other = "免費處理 {{allowance}} 個 PDFs"
titleWithRate_one = "免費處理 {{allowance}} 個 PDFs,之後 {{rate}}/PDF"
titleWithRate_other = "免費處理 {{allowance}} 個 PDFs,之後 {{rate}}/PDF"
[portal.catalogue.card]
lockedAriaLabel = "已鎖定"
openAriaLabel = "開啟 {{name}} 元件"
[portal.catalogue.detail]
addToProject = "新增至專案"
ariaLabel = "元件詳細資料"
tabsAriaLabel = "元件詳細資料區段"
upgradeToUnlock = "升級以解鎖"
[portal.catalogue.detail.code]
install = "安裝"
usage = "使用方式"
[portal.catalogue.detail.locked]
description = "{{name}} 自 {{tier}} 方案起包含。升級以嵌入它。"
title = "您的方案不提供"
[portal.catalogue.detail.preview]
badge = "即時預覽"
note = "互動式 sandbox 會在此呈現"
[portal.catalogue.detail.pricing]
note = "依每 {{unit}} 計量。超過每月免費額度的使用量會向您的帳戶收費,並列於 Usage & Billing 下。"
[portal.catalogue.detail.stats]
billedOn = "計費依據"
embeds30d = "嵌入(30 天)"
freeQuota = "免費額度"
freeQuotaValue = "{{amount}} / 月"
maturity = "成熟度"
none = "無"
perAction = "每次動作"
price = "價格"
[portal.catalogue.detail.tabs]
code = "Code"
overview = "概觀"
pricing = "價格"
props = "Props / API"
[portal.catalogue.props]
optional = "選填"
required = "必填"
[portal.catalogue.props.columns]
description = "描述"
name = "Prop"
required = "必填"
type = "類型"
[portal.catalogue.summary]
componentsGa = "Components GA"
componentSpendMtd = "元件支出(MTD"
embedsThisMonth = "本月嵌入"
inBeta = "Beta 中"
[portal.components.billingUnit]
approval = "核准"
check = "檢查"
@@ -6591,18 +6534,6 @@ signature = "簽章"
beta = "Beta"
ga = "GA"
[portal.componentsView]
subtitle = "可嵌入的 SDK 小工具,可放入您自己的應用程式 — 檢視器、電子簽流程、AI 審查面板。每個都依動作計量。點選卡片以查看安裝、使用方式和 props。"
title = "元件"
[portal.componentsView.empty]
description = "無法載入元件目錄。請稍後再試。"
title = "沒有可用元件"
[portal.componentsView.lockedBanner]
description = "GA 元件可在 Pay-as-you-go 使用;少數 Beta 元件僅限企業使用。鎖定的卡片會顯示升級提示。"
title = "部分元件需要付費方案"
[portal.docs.authentication]
codeCaption = "每個請求"
eyebrow = "開始使用"
@@ -1,18 +1,11 @@
import {
GROUP_PRIMARY,
GROUP_OPERATIONAL as BASE_OPERATIONAL,
GROUP_OPERATIONAL,
GROUP_PLATFORM,
type NavEntry,
} from "@portal-proprietary/components/sidebarGroups";
export { GROUP_PRIMARY, GROUP_PLATFORM };
// SaaS shadows the base nav groups so sections not yet shipped there can be
// dropped. Nothing is currently removed, so the base groups pass through as-is.
export { GROUP_PRIMARY, GROUP_OPERATIONAL, GROUP_PLATFORM };
export type { NavEntry };
/**
* SaaS pre-release: the Components section isn't shipped there yet, so drop it
* from the operational nav. Everything else is inherited from the base groups, so
* new nav items appear in SaaS automatically — only Components is removed here.
*/
export const GROUP_OPERATIONAL: NavEntry[] = BASE_OPERATIONAL.filter(
(entry) => entry.id !== "components",
);
@@ -8,7 +8,6 @@ import { Sources } from "@portal/views/Sources";
import { SourceBuilder } from "@portal/views/SourceBuilder";
import { AgentBuilder } from "@portal/views/AgentBuilder";
import { Policies } from "@portal/views/Policies";
import { Components } from "@portal/views/Components";
import { EditorAdmin } from "@portal/views/EditorAdmin";
import { Infrastructure } from "@portal/views/Infrastructure";
import { PortalBillingGate } from "@portal/components/billing/PortalBillingGate";
@@ -51,7 +50,6 @@ export function ViewRouter() {
/>
<Route path={rel(VIEW_PATHS.policies)} element={<Policies />} />
<Route path={rel(VIEW_PATHS.documents)} element={<Documents />} />
<Route path={rel(VIEW_PATHS.components)} element={<Components />} />
<Route path={rel(VIEW_PATHS.editor)} element={<EditorAdmin />} />
<Route
path={rel(VIEW_PATHS.infrastructure)}
@@ -1,138 +0,0 @@
import { apiClient } from "@portal/api/http";
import type { Tier } from "@portal/contexts/TierContext";
/*
* "Components" are embeddable React/Vue/Vanilla SDK widgets a developer drops
* into their own product — a PDF Viewer, an E-Sign flow, an AI Review panel —
* each metered per action (per render, per review, per signature). Every
* component carries its npm package, maturity, supported frameworks, per-action
* price, an install/usage snippet, and its key props.
*/
/* ──────────────────────────────────────────────────────────────────────── */
/* Types */
/* ──────────────────────────────────────────────────────────────────────── */
export type ComponentMaturity = "ga" | "beta";
export type Framework = "React" | "Vue" | "Vanilla";
/** The action a component bills against — surfaces in the price unit label. */
export type BillingUnit =
| "render"
| "review"
| "approval"
| "signature"
| "check"
| "event"
| "session";
export interface ComponentProp {
name: string;
/** TypeScript-ish type expression, shown verbatim in the API table. */
type: string;
required: boolean;
description: string;
}
export interface ComponentPricing {
/** Price per billed action in USD. */
pricePerAction: number;
unit: BillingUnit;
/** Free-tier monthly allowance before metering kicks in; 0 = none. */
freeQuota: number;
}
export interface SdkComponent {
id: string;
name: string;
/** Package suffix — full name is `@stirling/<package>`. */
package: string;
description: string;
maturity: ComponentMaturity;
frameworks: Framework[];
pricing: ComponentPricing;
/** Install command (npm). */
install: string;
/** Minimal usage snippet shown under the Code tab. */
usage: string;
props: ComponentProp[];
/**
* Embeds attributed to this component over the trailing 30 days — drives the
* per-card usage line. Zero for never-embedded components.
*/
embeds30d: number;
/**
* Tier at which the component becomes available. Components above the active
* tier render locked with an upgrade nudge. `pro` is the default floor.
*/
minTier: Tier;
}
export interface ComponentsSummary {
/** Count of GA (production-ready) components available to the tier. */
gaCount: number;
/** Count of Beta components available to the tier. */
betaCount: number;
/** Total embeds across all components this month. */
embedsThisMonth: number;
/** Month-to-date spend attributed to component actions, in USD. */
spendThisMonth: number;
}
export interface ComponentsResponse {
summary: ComponentsSummary;
components: SdkComponent[];
}
/* ──────────────────────────────────────────────────────────────────────── */
/* Presentation metadata (client-side product copy, not data) */
/* ──────────────────────────────────────────────────────────────────────── */
export interface MaturityMeta {
label: string;
tone: "success" | "info";
}
/** `label` values are i18n keys — render with t(). */
export const MATURITY_META: Record<ComponentMaturity, MaturityMeta> = {
ga: { label: "portal.components.maturity.ga", tone: "success" },
beta: { label: "portal.components.maturity.beta", tone: "info" },
};
/** Values are i18n keys — render with t(). */
export const BILLING_UNIT_LABEL: Record<BillingUnit, string> = {
render: "portal.components.billingUnit.render",
review: "portal.components.billingUnit.review",
approval: "portal.components.billingUnit.approval",
signature: "portal.components.billingUnit.signature",
check: "portal.components.billingUnit.check",
event: "portal.components.billingUnit.event",
session: "portal.components.billingUnit.session",
};
/** Format a price as the per-action string shown on cards, e.g. "$0.04 / review". */
export function formatPrice(
pricing: ComponentPricing,
t: (key: string) => string,
): string {
return `$${pricing.pricePerAction.toFixed(2)} / ${t(BILLING_UNIT_LABEL[pricing.unit])}`;
}
const TIER_RANK: Record<Tier, number> = { free: 0, pro: 1, enterprise: 2 };
/** Whether a component is usable at the given tier (vs locked/upgrade). */
export function isUnlocked(component: SdkComponent, tier: Tier): boolean {
return TIER_RANK[tier] >= TIER_RANK[component.minTier];
}
/* ──────────────────────────────────────────────────────────────────────── */
/* Endpoints */
/* ──────────────────────────────────────────────────────────────────────── */
/** GET /v1/components?tier=… — summary strip + the embeddable SDK catalogue. */
export async function fetchComponents(tier: Tier): Promise<ComponentsResponse> {
return apiClient.local.json<ComponentsResponse>(
`/v1/components?tier=${encodeURIComponent(tier)}`,
);
}
@@ -1,27 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { componentsFor } from "@portal/mocks/sdkComponents";
import { ComponentCard } from "@portal/components/catalogue/ComponentCard";
const PRO = componentsFor("pro");
const GA = PRO.find((c) => c.maturity === "ga")!;
const BETA = PRO.find((c) => c.maturity === "beta")!;
const meta: Meta<typeof ComponentCard> = {
title: "Portal/Components/ComponentCard",
component: ComponentCard,
parameters: { layout: "padded" },
args: { component: GA, unlocked: true, onOpen: () => {} },
};
export default meta;
type Story = StoryObj<typeof ComponentCard>;
export const GeneralAvailability: Story = {};
export const Beta: Story = {
args: { component: BETA },
};
/** Sits above the tier — dimmed with a lock affordance. */
export const Locked: Story = {
args: { component: BETA, unlocked: false },
};
@@ -1,79 +0,0 @@
import { useTranslation } from "react-i18next";
import { Card, Chip, StatusBadge } from "@app/ui";
import {
type SdkComponent,
MATURITY_META,
formatPrice,
} from "@portal/api/sdkComponents";
import "@portal/views/Components.css";
interface ComponentCardProps {
component: SdkComponent;
/** False when the component sits above the active tier — renders locked. */
unlocked: boolean;
onOpen: (component: SdkComponent) => void;
}
/** A single catalogue tile: name, maturity, description, price and frameworks. */
export function ComponentCard({
component,
unlocked,
onOpen,
}: ComponentCardProps) {
const { t } = useTranslation();
const maturity = MATURITY_META[component.maturity];
return (
<Card
interactive
padding="default"
className={"portal-components__card" + (unlocked ? "" : " is-locked")}
role="button"
tabIndex={0}
aria-label={t("portal.catalogue.card.openAriaLabel", {
name: component.name,
})}
onClick={() => onOpen(component)}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
onOpen(component);
}
}}
>
<div className="portal-components__card-head">
<h3 className="portal-components__card-name">{component.name}</h3>
<StatusBadge tone={maturity.tone} size="sm" showDot={false}>
{t(maturity.label)}
</StatusBadge>
{!unlocked && (
<span
className="portal-components__lock"
aria-label={t("portal.catalogue.card.lockedAriaLabel")}
>
🔒
</span>
)}
</div>
<p className="portal-components__card-desc">{component.description}</p>
<div className="portal-components__card-meta">
<span className="portal-components__price">
{formatPrice(component.pricing, t)}
</span>
<span className="portal-components__pkg">
@stirling/{component.package}
</span>
</div>
<div className="portal-components__frameworks">
{component.frameworks.map((fw) => (
<Chip key={fw} size="sm">
{fw}
</Chip>
))}
</div>
</Card>
);
}
@@ -1,27 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { componentsFor } from "@portal/mocks/sdkComponents";
import { ComponentDetailModal } from "@portal/components/catalogue/ComponentDetailModal";
const PRO = componentsFor("pro");
const VIEWER = PRO.find((c) => c.id === "viewer")!;
const TOOLKIT = PRO.find((c) => c.id === "toolkit")!;
const meta: Meta<typeof ComponentDetailModal> = {
title: "Portal/Components/ComponentDetailModal",
component: ComponentDetailModal,
parameters: { layout: "fullscreen" },
args: { component: VIEWER, unlocked: true, onClose: () => {} },
};
export default meta;
type Story = StoryObj<typeof ComponentDetailModal>;
export const Unlocked: Story = {};
/** Enterprise-only component opened on a lower tier — shows the upgrade nudge. */
export const Locked: Story = {
args: { component: TOOLKIT, unlocked: false },
};
export const Closed: Story = {
args: { component: null },
};
@@ -1,233 +0,0 @@
import { useState } from "react";
import { useTranslation } from "react-i18next";
import {
Banner,
Button,
Chip,
CodeBlock,
Modal,
StatTile,
StatusBadge,
Tabs,
} from "@app/ui";
import {
type SdkComponent,
BILLING_UNIT_LABEL,
MATURITY_META,
formatPrice,
} from "@portal/api/sdkComponents";
import { TIER_INFO } from "@portal/contexts/TierContext";
import { ComponentPropsTable } from "@portal/components/catalogue/ComponentPropsTable";
import "@portal/views/Components.css";
type DetailTab = "overview" | "code" | "props" | "pricing";
const TAB_KEYS: DetailTab[] = ["overview", "code", "props", "pricing"];
interface ComponentDetailModalProps {
component: SdkComponent | null;
/** False when the open component sits above the active tier. */
unlocked: boolean;
onClose: () => void;
}
/**
* Detail overlay for a catalogue component: a live-preview placeholder plus
* Overview / Code / Props / Pricing tabs. Locked components swap the install
* CTA for an upgrade nudge.
*/
export function ComponentDetailModal({
component,
unlocked,
onClose,
}: ComponentDetailModalProps) {
const { t } = useTranslation();
const [tab, setTab] = useState<DetailTab>("overview");
// Reset to the first tab whenever a new component is opened.
const open = component !== null;
if (!component) {
return (
<Modal
open={false}
onClose={onClose}
ariaLabel={t("portal.catalogue.detail.ariaLabel")}
/>
);
}
const tabs = TAB_KEYS.map((key) => ({
key,
label: t(`portal.catalogue.detail.tabs.${key}`),
}));
const maturity = MATURITY_META[component.maturity];
const npm = `@stirling/${component.package}`;
return (
<Modal
key={component.id}
open={open}
onClose={() => {
onClose();
setTab("overview");
}}
width="xl"
title={
<span className="portal-components__modal-title">
{component.name}
<StatusBadge tone={maturity.tone} size="sm" showDot={false}>
{t(maturity.label)}
</StatusBadge>
</span>
}
subtitle={npm}
footer={
unlocked ? (
<div className="portal-components__modal-footer">
<span className="portal-components__price">
{formatPrice(component.pricing, t)}
</span>
<Button
size="sm"
// TODO(backend): open the package quickstart / provision a
// publishable key scoped to this component.
onClick={() => onClose()}
>
{t("portal.catalogue.detail.addToProject")}
</Button>
</div>
) : (
<Button
size="sm"
accent="premium"
// TODO(backend): route to the upgrade / contact-sales flow.
onClick={() => onClose()}
>
{t("portal.catalogue.detail.upgradeToUnlock")}
</Button>
)
}
>
{!unlocked && (
<Banner
tone="warning"
title={t("portal.catalogue.detail.locked.title")}
description={t("portal.catalogue.detail.locked.description", {
name: component.name,
plan: t(TIER_INFO[component.minTier].labelKey),
})}
/>
)}
{/* Live-preview sandbox — a styled placeholder until a real host mounts. */}
<div className="portal-components__preview" aria-hidden>
{/* TODO(backend)/host: mount the live <Sandbox> here, booting the
component against a demo document and the dev's publishable key. */}
<span className="portal-components__preview-badge">
{t("portal.catalogue.detail.preview.badge")}
</span>
<span className="portal-components__preview-note">
{t("portal.catalogue.detail.preview.note")}
</span>
</div>
<Tabs<DetailTab>
className="portal-components__tabs"
items={tabs}
activeKey={tab}
onChange={setTab}
variant="underline"
ariaLabel={t("portal.catalogue.detail.tabsAriaLabel")}
/>
<div className="portal-components__tab-body">
{tab === "overview" && (
<div className="portal-components__overview">
<p className="portal-components__overview-desc">
{component.description}
</p>
<div className="portal-components__frameworks">
{component.frameworks.map((fw) => (
<Chip key={fw} size="sm">
{fw}
</Chip>
))}
</div>
<div className="portal-components__stat-grid">
<StatTile
label={t("portal.catalogue.detail.stats.maturity")}
value={t(maturity.label)}
/>
<StatTile
label={t("portal.catalogue.detail.stats.price")}
value={formatPrice(component.pricing, t)}
/>
<StatTile
label={t("portal.catalogue.detail.stats.freeQuota")}
value={
component.pricing.freeQuota > 0
? t("portal.catalogue.detail.stats.freeQuotaValue", {
amount: component.pricing.freeQuota.toLocaleString(),
})
: t("portal.catalogue.detail.stats.none")
}
/>
<StatTile
label={t("portal.catalogue.detail.stats.embeds30d")}
value={component.embeds30d.toLocaleString()}
/>
</div>
</div>
)}
{tab === "code" && (
<div className="portal-components__code">
<CodeBlock
code={component.install}
lang="bash"
caption={t("portal.catalogue.detail.code.install")}
/>
<CodeBlock
code={component.usage}
lang="typescript"
caption={t("portal.catalogue.detail.code.usage")}
/>
</div>
)}
{tab === "props" && <ComponentPropsTable props={component.props} />}
{tab === "pricing" && (
<div className="portal-components__pricing">
<div className="portal-components__stat-grid">
<StatTile
label={t("portal.catalogue.detail.stats.perAction")}
value={formatPrice(component.pricing, t)}
/>
<StatTile
label={t("portal.catalogue.detail.stats.billedOn")}
value={t(BILLING_UNIT_LABEL[component.pricing.unit])}
/>
<StatTile
label={t("portal.catalogue.detail.stats.freeQuota")}
value={
component.pricing.freeQuota > 0
? t("portal.catalogue.detail.stats.freeQuotaValue", {
amount: component.pricing.freeQuota.toLocaleString(),
})
: t("portal.catalogue.detail.stats.none")
}
/>
</div>
<p className="portal-components__pricing-note">
{t("portal.catalogue.detail.pricing.note", {
unit: t(BILLING_UNIT_LABEL[component.pricing.unit]),
})}
</p>
</div>
)}
</div>
</Modal>
);
}
@@ -1,24 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { componentsFor } from "@portal/mocks/sdkComponents";
import { ComponentGrid } from "@portal/components/catalogue/ComponentGrid";
const meta: Meta<typeof ComponentGrid> = {
title: "Portal/Components/ComponentGrid",
component: ComponentGrid,
parameters: { layout: "padded" },
args: { components: componentsFor("pro"), tier: "pro", onOpen: () => {} },
};
export default meta;
type Story = StoryObj<typeof ComponentGrid>;
export const Pro: Story = {};
/** Free locks every paid component — the whole grid shows upgrade nudges. */
export const Free: Story = {
args: { components: componentsFor("free"), tier: "free" },
};
/** Enterprise unlocks the enterprise-only Beta components. */
export const Enterprise: Story = {
args: { components: componentsFor("enterprise"), tier: "enterprise" },
};
@@ -1,30 +0,0 @@
import { type SdkComponent, isUnlocked } from "@portal/api/sdkComponents";
import type { Tier } from "@portal/contexts/TierContext";
import { ComponentCard } from "@portal/components/catalogue/ComponentCard";
import "@portal/views/Components.css";
interface ComponentGridProps {
components: SdkComponent[];
tier: Tier;
onOpen: (component: SdkComponent) => void;
}
/** Responsive grid of catalogue cards; locks components above the tier. */
export function ComponentGrid({
components,
tier,
onOpen,
}: ComponentGridProps) {
return (
<div className="portal-components__grid">
{components.map((c) => (
<ComponentCard
key={c.id}
component={c}
unlocked={isUnlocked(c, tier)}
onOpen={onOpen}
/>
))}
</div>
);
}
@@ -1,16 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { componentsFor } from "@portal/mocks/sdkComponents";
import { ComponentPropsTable } from "@portal/components/catalogue/ComponentPropsTable";
const VIEWER = componentsFor("pro").find((c) => c.id === "viewer")!;
const meta: Meta<typeof ComponentPropsTable> = {
title: "Portal/Components/ComponentPropsTable",
component: ComponentPropsTable,
parameters: { layout: "padded" },
args: { props: VIEWER.props },
};
export default meta;
type Story = StoryObj<typeof ComponentPropsTable>;
export const Default: Story = {};
@@ -1,62 +0,0 @@
import { useMemo } from "react";
import { useTranslation } from "react-i18next";
import { Chip, Table, type TableColumn } from "@app/ui";
import type { ComponentProp } from "@portal/api/sdkComponents";
import "@portal/views/Components.css";
interface ComponentPropsTableProps {
props: ComponentProp[];
}
/** Small Props/API reference shown under the detail modal's Props tab. */
export function ComponentPropsTable({ props: rows }: ComponentPropsTableProps) {
const { t } = useTranslation();
const columns = useMemo<TableColumn<ComponentProp>[]>(
() => [
{
key: "name",
header: t("portal.catalogue.props.columns.name"),
render: (p) => (
<span className="portal-components__prop-name">{p.name}</span>
),
},
{
key: "type",
header: t("portal.catalogue.props.columns.type"),
render: (p) => (
<code className="portal-components__prop-type">{p.type}</code>
),
},
{
key: "required",
header: t("portal.catalogue.props.columns.required"),
render: (p) =>
p.required ? (
<Chip size="sm" accent="warning">
{t("portal.catalogue.props.required")}
</Chip>
) : (
<span className="portal-components__muted">
{t("portal.catalogue.props.optional")}
</span>
),
},
{
key: "description",
header: t("portal.catalogue.props.columns.description"),
render: (p) => (
<span className="portal-components__prop-desc">{p.description}</span>
),
},
],
[t],
);
return (
<Table<ComponentProp>
columns={columns}
rows={rows}
rowKey={(p) => p.name}
/>
);
}
@@ -1,42 +0,0 @@
import { useTranslation } from "react-i18next";
import { MetricCard, MetricStrip } from "@app/ui";
import type { ComponentsResponse } from "@portal/api/sdkComponents";
/**
* Labels are product copy — they describe what each metric IS, not its value,
* so the strip's structure stays stable across loading / empty / ready states.
* Only values flow from the API.
*/
const KPI_LABEL_KEYS = [
"portal.catalogue.summary.componentsGa",
"portal.catalogue.summary.inBeta",
"portal.catalogue.summary.embedsThisMonth",
"portal.catalogue.summary.componentSpendMtd",
] as const;
interface ComponentsSummaryStripProps {
data: ComponentsResponse | null;
loading: boolean;
}
export function ComponentsSummaryStrip({
data,
loading,
}: ComponentsSummaryStripProps) {
const { t } = useTranslation();
const s = loading ? undefined : data?.summary;
const values: (string | number)[] = [
s?.gaCount ?? "—",
s?.betaCount ?? "—",
s ? s.embedsThisMonth.toLocaleString() : "—",
s ? `$${s.spendThisMonth.toLocaleString()}` : "—",
];
return (
<MetricStrip>
{KPI_LABEL_KEYS.map((labelKey, i) => (
<MetricCard key={labelKey} label={t(labelKey)} value={values[i]} />
))}
</MetricStrip>
);
}
@@ -221,17 +221,6 @@ export function PoliciesIcon(props: IconProps) {
);
}
export function ComponentsIcon(props: IconProps) {
return (
<Svg {...props}>
<rect x="3" y="3" width="7" height="7" rx="1" />
<rect x="14" y="3" width="7" height="7" rx="1" />
<rect x="3" y="14" width="7" height="7" rx="1" />
<rect x="14" y="14" width="7" height="7" rx="1" />
</Svg>
);
}
export function AgentBuilderIcon(props: IconProps) {
return (
<Svg {...props}>
@@ -7,7 +7,6 @@ import {
PoliciesIcon,
PipelinesIcon,
DocumentsIcon,
ComponentsIcon,
InfrastructureIcon,
UsageIcon,
DocsIcon,
@@ -34,7 +33,6 @@ export const GROUP_OPERATIONAL: NavEntry[] = [
{ id: "policies", icon: <PoliciesIcon /> },
{ id: "pipelines", icon: <PipelinesIcon /> },
{ id: "documents", icon: <DocumentsIcon /> },
{ id: "components", icon: <ComponentsIcon /> },
];
export const GROUP_PLATFORM: NavEntry[] = [
@@ -11,7 +11,6 @@ export type ViewId =
| "policies"
| "pipelines"
| "documents"
| "components"
| "infrastructure"
| "usage"
| "docs"
@@ -27,7 +26,6 @@ export const VIEW_LABELS: Record<ViewId, string> = {
policies: "Policies",
pipelines: "Pipelines",
documents: "Documents",
components: "Components",
infrastructure: "Infrastructure",
usage: "Usage & Billing",
docs: "Developer Docs",
@@ -44,7 +42,6 @@ export const VIEW_PATHS: Record<ViewId, string> = {
policies: "/policies",
pipelines: "/pipelines",
documents: "/documents",
components: "/components",
infrastructure: "/infrastructure",
usage: "/usage",
docs: "/docs",
@@ -14,7 +14,6 @@ import { agentsHandlers } from "@portal/mocks/handlers/agents";
import { policiesHandlers } from "@portal/mocks/handlers/policies";
import { classificationHandlers } from "@portal/mocks/handlers/classification";
import { documentsHandlers } from "@portal/mocks/handlers/documents";
import { sdkComponentsHandlers } from "@portal/mocks/handlers/sdkComponents";
import { editorDeployHandlers } from "@portal/mocks/handlers/editorDeploy";
import { linkHandlers } from "@portal/mocks/handlers/link";
@@ -35,7 +34,6 @@ export const handlers = [
...policiesHandlers,
...classificationHandlers,
...documentsHandlers,
...sdkComponentsHandlers,
...editorDeployHandlers,
...linkHandlers,
];
@@ -1,12 +0,0 @@
import { http, HttpResponse, delay } from "msw";
import type { Tier } from "@portal/contexts/TierContext";
import { buildComponentsResponse } from "@portal/mocks/sdkComponents";
export const sdkComponentsHandlers = [
http.get("/v1/components", async ({ request }) => {
await delay(120);
const url = new URL(request.url);
const tier = (url.searchParams.get("tier") ?? "pro") as Tier;
return HttpResponse.json(buildComponentsResponse(tier));
}),
];
@@ -1,413 +0,0 @@
/**
* Components surface fixtures. Types and presentation metadata live in
* api/sdkComponents.ts (the backend contract); this module only builds fake
* data for Storybook and tests.
*
* "Components" are embeddable React/Vue/Vanilla SDK widgets a developer drops
* into their own product — a PDF Viewer, an E-Sign flow, an AI Review panel —
* each metered per action (per render, per review, per signature). Every
* component carries its npm package, maturity, supported frameworks, per-action
* price, an install/usage snippet, and its key props.
*/
import { isUnlocked } from "@portal/api/sdkComponents";
import type {
ComponentPricing,
ComponentsResponse,
ComponentsSummary,
SdkComponent,
} from "@portal/api/sdkComponents";
import type { Tier } from "@portal/contexts/TierContext";
/* ──────────────────────────────────────────────────────────────────────── */
/* Fixtures */
/* ──────────────────────────────────────────────────────────────────────── */
/**
* The catalogue. Authored once, then filtered/repriced per tier so a dev can
* see tier variation (locked Beta components on free, enterprise discounts).
*/
const CATALOGUE: SdkComponent[] = [
{
id: "viewer",
name: "Viewer",
package: "viewer",
description:
"Drop-in PDF viewer with text selection, search, thumbnails and lazy page rendering. The cheapest, highest-volume primitive.",
maturity: "ga",
frameworks: ["React", "Vue", "Vanilla"],
pricing: { pricePerAction: 0.01, unit: "render", freeQuota: 1000 },
install: "npm install @stirling/viewer",
usage: `import { Viewer } from "@stirling/viewer";
export function DocumentPage({ fileUrl }: { fileUrl: string }) {
return (
<Viewer
src={fileUrl}
apiKey={process.env.STIRLING_KEY}
onRender={(p) => console.log("rendered page", p.page)}
/>
);
}`,
props: [
{
name: "src",
type: "string | Blob",
required: true,
description: "Document URL or in-memory blob to render.",
},
{
name: "apiKey",
type: "string",
required: true,
description: "Publishable key used to meter renders.",
},
{
name: "initialPage",
type: "number",
required: false,
description: "Page to open on first render. Defaults to 1.",
},
{
name: "onRender",
type: "(e: RenderEvent) => void",
required: false,
description: "Fires per rendered page — one billed render each.",
},
],
embeds30d: 184200,
minTier: "pro",
},
{
id: "review",
name: "Review",
package: "review",
description:
"AI-assisted document review panel — surfaces extracted fields, risks and suggested redactions for a human to accept or reject.",
maturity: "ga",
frameworks: ["React", "Vue"],
pricing: { pricePerAction: 0.04, unit: "review", freeQuota: 50 },
install: "npm install @stirling/review",
usage: `import { Review } from "@stirling/review";
export function ReviewPane({ docId }: { docId: string }) {
return (
<Review
documentId={docId}
pipeline="invoice-v3"
apiKey={process.env.STIRLING_KEY}
onComplete={(r) => save(r.fields)}
/>
);
}`,
props: [
{
name: "documentId",
type: "string",
required: true,
description: "Id of an ingested document to review.",
},
{
name: "pipeline",
type: "string",
required: true,
description: "Pipeline whose extraction schema drives the panel.",
},
{
name: "onComplete",
type: "(r: ReviewResult) => void",
required: false,
description: "Called when the reviewer submits — bills one review.",
},
],
embeds30d: 42800,
minTier: "pro",
},
{
id: "confidence",
name: "Confidence",
package: "confidence",
description:
"Inline confidence overlay — paints per-field certainty heatmaps over extracted values so reviewers triage low-confidence fields first.",
maturity: "ga",
frameworks: ["React", "Vue", "Vanilla"],
pricing: { pricePerAction: 0.02, unit: "check", freeQuota: 200 },
install: "npm install @stirling/confidence",
usage: `import { Confidence } from "@stirling/confidence";
export function FieldOverlay({ result }: { result: ExtractResult }) {
return <Confidence fields={result.fields} threshold={0.85} />;
}`,
props: [
{
name: "fields",
type: "ExtractedField[]",
required: true,
description: "Fields with per-value confidence scores.",
},
{
name: "threshold",
type: "number",
required: false,
description: "Highlight fields below this 0..1 score. Defaults to 0.8.",
},
],
embeds30d: 31500,
minTier: "pro",
},
{
id: "approval",
name: "Approval",
package: "approval",
description:
"Routable approval flow — assign reviewers, collect sign-offs and enforce approval order before a document advances.",
maturity: "ga",
frameworks: ["React", "Vue"],
pricing: { pricePerAction: 0.1, unit: "approval", freeQuota: 0 },
install: "npm install @stirling/approval",
usage: `import { Approval } from "@stirling/approval";
export function ApprovalGate({ docId }: { docId: string }) {
return (
<Approval
documentId={docId}
approvers={["ap@acme.com", "controller@acme.com"]}
order="sequential"
onApproved={() => advance(docId)}
/>
);
}`,
props: [
{
name: "documentId",
type: "string",
required: true,
description: "Document the approval gate guards.",
},
{
name: "approvers",
type: "string[]",
required: true,
description: "Ordered list of approver email addresses.",
},
{
name: "order",
type: '"sequential" | "parallel"',
required: false,
description: "Routing mode. Defaults to sequential.",
},
],
embeds30d: 9600,
minTier: "pro",
},
{
id: "esign",
name: "E-Sign",
package: "esign",
description:
"Legally-binding e-signature ceremony — signer fields, audit-grade consent capture and a tamper-evident completion certificate.",
maturity: "ga",
frameworks: ["React", "Vue", "Vanilla"],
pricing: { pricePerAction: 0.35, unit: "signature", freeQuota: 0 },
install: "npm install @stirling/esign",
usage: `import { ESign } from "@stirling/esign";
export function SignFlow({ docId }: { docId: string }) {
return (
<ESign
documentId={docId}
signers={[{ email: "client@acme.com", role: "signer" }]}
onSigned={(cert) => store(cert.certificateUrl)}
/>
);
}`,
props: [
{
name: "documentId",
type: "string",
required: true,
description: "Document to be signed.",
},
{
name: "signers",
type: "Signer[]",
required: true,
description: "Ordered signers with email + role.",
},
{
name: "onSigned",
type: "(c: Certificate) => void",
required: false,
description: "Fires on completion — bills one signature per signer.",
},
],
embeds30d: 5400,
minTier: "pro",
},
{
id: "audit-trail",
name: "Audit Trail",
package: "audit-trail",
description:
"Read-only event timeline for a document — every render, edit, approval and signature, exportable as a compliance-grade ledger.",
maturity: "ga",
frameworks: ["React", "Vue"],
pricing: { pricePerAction: 0.01, unit: "event", freeQuota: 500 },
install: "npm install @stirling/audit-trail",
usage: `import { AuditTrail } from "@stirling/audit-trail";
export function History({ docId }: { docId: string }) {
return <AuditTrail documentId={docId} export="pdf" />;
}`,
props: [
{
name: "documentId",
type: "string",
required: true,
description: "Document whose events are shown.",
},
{
name: "export",
type: '"pdf" | "csv" | false',
required: false,
description: "Enable a ledger export button. Defaults to false.",
},
],
embeds30d: 14200,
minTier: "pro",
},
{
id: "markup",
name: "Markup",
package: "markup",
description:
"Collaborative annotation layer — highlights, comments, stamps and freehand drawing synced live across reviewers.",
maturity: "beta",
frameworks: ["React", "Vue"],
pricing: { pricePerAction: 0.03, unit: "session", freeQuota: 25 },
install: "npm install @stirling/markup@beta",
usage: `import { Markup } from "@stirling/markup";
export function AnnotateLayer({ docId }: { docId: string }) {
return (
<Markup
documentId={docId}
collaborative
tools={["highlight", "comment", "stamp"]}
/>
);
}`,
props: [
{
name: "documentId",
type: "string",
required: true,
description: "Document to annotate.",
},
{
name: "collaborative",
type: "boolean",
required: false,
description: "Enable live multi-user sync. Defaults to false.",
},
{
name: "tools",
type: "MarkupTool[]",
required: false,
description: "Visible annotation tools. Defaults to all.",
},
],
embeds30d: 2100,
minTier: "pro",
},
{
id: "toolkit",
name: "Toolkit",
package: "toolkit",
description:
"Headless operations toolkit — merge, split, redact, compress and convert exposed as composable hooks with no UI of its own.",
maturity: "beta",
frameworks: ["React", "Vue", "Vanilla"],
pricing: { pricePerAction: 0.05, unit: "event", freeQuota: 0 },
install: "npm install @stirling/toolkit@beta",
usage: `import { useToolkit } from "@stirling/toolkit";
export function MergeButton({ files }: { files: File[] }) {
const { merge } = useToolkit({ apiKey: process.env.STIRLING_KEY });
return <button onClick={() => merge(files)}>Merge</button>;
}`,
props: [
{
name: "apiKey",
type: "string",
required: true,
description: "Publishable key used to meter operations.",
},
{
name: "operations",
type: "Operation[]",
required: false,
description: "Restrict the toolkit to a subset of operations.",
},
],
// Beta + enterprise-only: still gated to design partners, never embedded
// on lower tiers.
embeds30d: 0,
minTier: "enterprise",
},
];
/* ──────────────────────────────────────────────────────────────────────── */
/* Tier shaping */
/* ──────────────────────────────────────────────────────────────────────── */
/**
* Enterprise negotiates volume pricing — renders and reviews come in cheaper.
* Applied as a flat per-tier multiplier so the catalogue stays single-sourced.
*/
function priceFor(component: SdkComponent, tier: Tier): ComponentPricing {
if (tier !== "enterprise") return component.pricing;
return {
...component.pricing,
pricePerAction: Number((component.pricing.pricePerAction * 0.8).toFixed(3)),
};
}
/**
* The catalogue for a tier. Every component is returned at every tier so the
* grid is browsable — the view locks the ones above the tier and shows an
* upgrade nudge. Pricing is re-stamped per tier.
*/
export function componentsFor(tier: Tier): SdkComponent[] {
return CATALOGUE.map((c) => ({ ...c, pricing: priceFor(c, tier) }));
}
export function summaryFor(tier: Tier): ComponentsSummary {
const components = componentsFor(tier);
const unlocked = components.filter((c) => isUnlocked(c, tier));
const gaCount = unlocked.filter((c) => c.maturity === "ga").length;
const betaCount = unlocked.filter((c) => c.maturity === "beta").length;
if (tier === "free") {
// Free hasn't embedded anything yet — the strip reads as a cold start.
return { gaCount, betaCount, embedsThisMonth: 0, spendThisMonth: 0 };
}
const embedsThisMonth = unlocked.reduce((sum, c) => sum + c.embeds30d, 0);
// Spend = embeds beyond the free quota, billed at the tier price.
const spendThisMonth = unlocked.reduce((sum, c) => {
const billable = Math.max(0, c.embeds30d - c.pricing.freeQuota);
return sum + billable * c.pricing.pricePerAction;
}, 0);
return {
gaCount,
betaCount,
embedsThisMonth,
spendThisMonth: Number(spendThisMonth.toFixed(2)),
};
}
export function buildComponentsResponse(tier: Tier): ComponentsResponse {
return { summary: summaryFor(tier), components: componentsFor(tier) };
}
@@ -1,244 +0,0 @@
.portal-components {
display: flex;
flex-direction: column;
gap: 1.25rem;
padding: 1.5rem;
max-width: 84rem;
margin: 0 auto;
}
/* Header */
.portal-components__head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 1rem;
}
.portal-components__title {
margin: 0;
font-size: 1.375rem;
font-weight: 650;
color: var(--color-text-1);
}
.portal-components__sub {
margin: 0.25rem 0 0;
font-size: 0.8125rem;
line-height: 1.5;
color: var(--color-text-3);
max-width: 46rem;
}
/* ──────────────────────────────────────────────────────────────────────── */
/* Catalogue grid */
/* ──────────────────────────────────────────────────────────────────────── */
.portal-components__grid,
.portal-components__grid-skeleton {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
gap: 1rem;
}
.portal-components__card {
display: flex;
flex-direction: column;
gap: 0.75rem;
cursor: pointer;
height: 100%;
}
/* Locked cards read as available-but-gated: dimmed, never disabled. */
.portal-components__card.is-locked {
opacity: 0.7;
}
.portal-components__card-head {
display: flex;
align-items: center;
gap: 0.5rem;
}
.portal-components__card-name {
margin: 0;
font-size: 1rem;
font-weight: 600;
color: var(--color-text-1);
}
.portal-components__lock {
margin-left: auto;
font-size: 0.875rem;
line-height: 1;
}
.portal-components__card-desc {
margin: 0;
font-size: 0.8125rem;
line-height: 1.5;
color: var(--color-text-3);
flex: 1;
}
.portal-components__card-meta {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 0.5rem;
}
.portal-components__price {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 600;
color: var(--color-text-1);
}
.portal-components__pkg {
font-family: var(--font-mono);
font-size: 0.6875rem;
color: var(--color-text-4);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.portal-components__frameworks {
display: flex;
flex-wrap: wrap;
gap: 0.375rem;
}
/* ──────────────────────────────────────────────────────────────────────── */
/* Detail modal */
/* ──────────────────────────────────────────────────────────────────────── */
.portal-components__modal-title {
display: inline-flex;
align-items: center;
gap: 0.625rem;
}
.portal-components__modal-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
width: 100%;
}
/* Live-preview sandbox placeholder */
.portal-components__preview {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.375rem;
min-height: 9rem;
margin-bottom: 1rem;
border: 1px dashed var(--color-border-strong, var(--color-border));
border-radius: var(--radius-lg);
background: repeating-linear-gradient(
45deg,
var(--color-bg-subtle),
var(--color-bg-subtle) 10px,
var(--color-surface) 10px,
var(--color-surface) 20px
);
}
.portal-components__preview-badge {
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--color-blue);
padding: 0.1875rem 0.5rem;
border-radius: var(--radius-sm);
background: var(--color-blue-light);
}
.portal-components__preview-note {
font-size: 0.75rem;
color: var(--color-text-4);
}
.portal-components__tabs {
margin-bottom: 1rem;
}
.portal-components__tab-body {
display: flex;
flex-direction: column;
gap: 1rem;
min-height: 12rem;
}
.portal-components__overview {
display: flex;
flex-direction: column;
gap: 1rem;
}
.portal-components__overview-desc {
margin: 0;
font-size: 0.875rem;
line-height: 1.55;
color: var(--color-text-2);
}
.portal-components__code {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.portal-components__stat-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0.875rem;
}
@media (max-width: 48rem) {
.portal-components__stat-grid {
grid-template-columns: repeat(2, 1fr);
}
}
.portal-components__pricing {
display: flex;
flex-direction: column;
gap: 1rem;
}
.portal-components__pricing-note {
margin: 0;
font-size: 0.8125rem;
line-height: 1.55;
color: var(--color-text-3);
}
/* Props table cells */
.portal-components__prop-name {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 600;
color: var(--color-text-1);
}
.portal-components__prop-type {
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--color-blue);
}
.portal-components__prop-desc {
font-size: 0.8125rem;
color: var(--color-text-3);
}
.portal-components__muted {
font-size: 0.8125rem;
color: var(--color-text-4);
}
@@ -1,90 +0,0 @@
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { Banner, EmptyState, Skeleton } from "@app/ui";
import { useTier } from "@portal/contexts/TierContext";
import { useAsync, useSectionFlags } from "@portal/hooks/useAsync";
import {
fetchComponents,
isUnlocked,
type ComponentsResponse,
type SdkComponent,
} from "@portal/api/sdkComponents";
import { ComponentsSummaryStrip } from "@portal/components/catalogue/ComponentsSummaryStrip";
import { ComponentGrid } from "@portal/components/catalogue/ComponentGrid";
import { ComponentDetailModal } from "@portal/components/catalogue/ComponentDetailModal";
import "@portal/views/Components.css";
export function Components() {
const { t } = useTranslation();
const { tier } = useTier();
const state = useAsync<ComponentsResponse>(
() => fetchComponents(tier),
[tier],
);
const { data, loading } = state;
const { isLoading, isEmpty } = useSectionFlags(state);
const [openId, setOpenId] = useState<string | null>(null);
const components = data?.components ?? [];
const open = components.find((c) => c.id === openId) ?? null;
const hasLocked = components.some((c) => !isUnlocked(c, tier));
function handleOpen(component: SdkComponent) {
setOpenId(component.id);
}
return (
<div className="portal-components">
<header className="portal-components__head">
<div>
<h1 className="portal-components__title">
{t("portal.componentsView.title")}
</h1>
<p className="portal-components__sub">
{t("portal.componentsView.subtitle")}
</p>
</div>
</header>
<ComponentsSummaryStrip data={data} loading={loading} />
{tier === "free" && hasLocked && (
<Banner
tone="info"
title={t("portal.componentsView.lockedBanner.title")}
description={t("portal.componentsView.lockedBanner.description")}
/>
)}
{isLoading && (
<div className="portal-components__grid-skeleton" aria-hidden>
{Array.from({ length: 6 }).map((_, i) => (
<Skeleton key={i} height="11rem" />
))}
</div>
)}
{isEmpty && (
<EmptyState
title={t("portal.componentsView.empty.title")}
description={t("portal.componentsView.empty.description")}
/>
)}
{!isLoading && !isEmpty && components.length > 0 && (
<ComponentGrid
components={components}
tier={tier}
onOpen={handleOpen}
/>
)}
<ComponentDetailModal
component={open}
unlocked={open ? isUnlocked(open, tier) : false}
onClose={() => setOpenId(null)}
/>
</div>
);
}