МожливостіСутності
Документація
    Ring Platform

    Децентралізоване самобудівне майбутнє

    Увійти
    Сутності
    Можливості
    Магазин
    Документація
    Концепції
    RING ЕкономікаSonoratek LLCГлобальний впливAI зустрічає Web3
    Розпочати
    Швидкий стартКалькуляторДорожня карта
    Конфіденційність|Контакти
    v1.104.23|Sonoratek LLC

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Кредитні винагороди
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    AI Matcher
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Кредитні винагороди
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    AI Matcher
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Кредитні винагороди
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    AI Matcher
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Віджети профілю облікового запису

    Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Публічні поверхні /{username} є окремими — див. Public Profile Pages. Каталог сутностей, на якому працює Organization, описано в Entities.

    Авторизовані учасники керують основними даними облікового запису на /profile. На вкладці Professional працюють три складені віджети з components/profile/ (UI застосунку — не MDX ring-віджети):

    ВіджетЗавдання
    OrganizationEntitySelectВибір організації з усіх Entities через Davinci-droplist
    PositionTagCloud / SkillsTagCloudХмари множинних тегів FsModal (спільний ProfileTagCloud)
    CurriculumVitaeWidgetРедактор CV у Markdown + завантаження файлу profile:cv

    Людський каталог (із місцями виклику Davinci-droplist): components/docs/WIDGETS-README.md → App UI profile widgets. Машинний індекс: AI-CONTEXT/concepts/ring-docs.nodus.json → ring_widgets.index.sections.app_ui_profile.

    Чому це важливо для вашого клону

    Професійні поля перетворюють порожній обліковий запис на обличчя, якому можна доручити найм або партнерство: яку організацію представляє учасник, які ролі та навички заявляє, і яке CV може редагувати на телефоні без боротьби з відступами chrome.

    Типові сценарії:

    1. Учасник відкриває /profile → Professional → натискає Organization → бачить список сутностей із пошуком (FsModal) → вибір зберігається одразу.
    2. Учасник додає теги Position / Skills із відомого каталогу або власний текст; вибрані чипи залишаються видимими всередині модального вікна вибору.
    3. Учасник натискає Edit у My Curriculum Vitae, пише Markdown на весь екран мобільного пристрою, покладається на автозбереження локальної чернетки, а потім натискає Save & Exit, щоб зберегти зміни у профілі.

    Публічний профіль

    Після резервування імені користувача — публічне представлення довіри за адресою /.

    Entities

    Карта модулів (перевірено)

    ПоверхняШлях
    Оболонка облікового записуfeatures/auth/components/profile-content.tsx
    Organizationcomponents/profile/organization-entity-select.tsx → DavinciDroplist → GET /api/entities
    Хмари тегівcomponents/profile/profile-tag-cloud.tsx (+ position-tag-cloud.tsx, skills-tag-cloud.tsx)
    Каталоги тегівfeatures/auth/lib/profile-tags.ts, position-tags.ts, skill-tags.ts
    Віджет CVcomponents/profile/curriculum-vitae-widget.tsx
    Редактор CVдинамічний WikiRichEditor (features/wiki/components/wiki-rich-editor.tsx) — SSOT Markdown
    ЗбереженняServer Action — / / / FormData

    Related documentation

    Public Profile Pages

    Наступний крок: публічне /{username} як представлення довіри після заповнення Professional-полів.

    Entities

    Залежність: OrganizationEntitySelect перелічує Entities через GET /api/entities.

    Authentication

    Той самий процес: основні дані /profile та Auth.js session.update після updateProfile.

    Scientific Editor

    Див. також: публікації використовують useAutoSave для /api/publications; чернетки CV використовують натомість useLocalStorage.

    1. Документація
    2. /Функції
    3. /Віджети профілю облікового запису

    Оновлено 6 вер. 2026 р.3 хв прослуховування

    Віджети профілю облікового запису

    Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Публічні поверхні /{username} є окремими — див. Public Profile Pages. Каталог сутностей, на якому працює Organization, описано в Entities.

    Авторизовані учасники керують основними даними облікового запису на /profile. На вкладці Professional працюють три складені віджети з components/profile/ (UI застосунку — не MDX ring-віджети):

    ВіджетЗавдання
    OrganizationEntitySelectВибір організації з усіх Entities через Davinci-droplist
    PositionTagCloud / SkillsTagCloudХмари множинних тегів FsModal (спільний ProfileTagCloud)
    CurriculumVitaeWidgetРедактор CV у Markdown + завантаження файлу profile:cv

    Людський каталог (із місцями виклику Davinci-droplist): components/docs/WIDGETS-README.md → App UI profile widgets. Машинний індекс: AI-CONTEXT/concepts/ring-docs.nodus.json → ring_widgets.index.sections.app_ui_profile.

    Чому це важливо для вашого клону

    Професійні поля перетворюють порожній обліковий запис на обличчя, якому можна доручити найм або партнерство: яку організацію представляє учасник, які ролі та навички заявляє, і яке CV може редагувати на телефоні без боротьби з відступами chrome.

    Типові сценарії:

    1. Учасник відкриває /profile → Professional → натискає Organization → бачить список сутностей із пошуком (FsModal) → вибір зберігається одразу.
    2. Учасник додає теги Position / Skills із відомого каталогу або власний текст; вибрані чипи залишаються видимими всередині модального вікна вибору.
    3. Учасник натискає Edit у My Curriculum Vitae, пише Markdown на весь екран мобільного пристрою, покладається на автозбереження локальної чернетки, а потім натискає Save & Exit, щоб зберегти зміни у профілі.

    Публічний профіль

    Після резервування імені користувача — публічне представлення довіри за адресою /.

    Entities

    Карта модулів (перевірено)

    ПоверхняШлях
    Оболонка облікового записуfeatures/auth/components/profile-content.tsx
    Organizationcomponents/profile/organization-entity-select.tsx → DavinciDroplist → GET /api/entities
    Хмари тегівcomponents/profile/profile-tag-cloud.tsx (+ position-tag-cloud.tsx, skills-tag-cloud.tsx)
    Каталоги тегівfeatures/auth/lib/profile-tags.ts, position-tags.ts, skill-tags.ts
    Віджет CVcomponents/profile/curriculum-vitae-widget.tsx
    Редактор CVдинамічний WikiRichEditor (features/wiki/components/wiki-rich-editor.tsx) — SSOT Markdown
    ЗбереженняServer Action — / / / FormData

    Related documentation

    Public Profile Pages

    Наступний крок: публічне /{username} як представлення довіри після заповнення Professional-полів.

    Entities

    Залежність: OrganizationEntitySelect перелічує Entities через GET /api/entities.

    Authentication

    Той самий процес: основні дані /profile та Auth.js session.update після updateProfile.

    Scientific Editor

    Див. також: публікації використовують useAutoSave для /api/publications; чернетки CV використовують натомість useLocalStorage.

    1. Документація
    2. /Функції
    3. /Віджети профілю облікового запису

    Оновлено 6 вер. 2026 р.3 хв прослуховування

    Віджети профілю облікового запису

    Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Публічні поверхні /{username} є окремими — див. Public Profile Pages. Каталог сутностей, на якому працює Organization, описано в Entities.

    Авторизовані учасники керують основними даними облікового запису на /profile. На вкладці Professional працюють три складені віджети з components/profile/ (UI застосунку — не MDX ring-віджети):

    ВіджетЗавдання
    OrganizationEntitySelectВибір організації з усіх Entities через Davinci-droplist
    PositionTagCloud / SkillsTagCloudХмари множинних тегів FsModal (спільний ProfileTagCloud)
    CurriculumVitaeWidgetРедактор CV у Markdown + завантаження файлу profile:cv

    Людський каталог (із місцями виклику Davinci-droplist): components/docs/WIDGETS-README.md → App UI profile widgets. Машинний індекс: AI-CONTEXT/concepts/ring-docs.nodus.json → ring_widgets.index.sections.app_ui_profile.

    Чому це важливо для вашого клону

    Професійні поля перетворюють порожній обліковий запис на обличчя, якому можна доручити найм або партнерство: яку організацію представляє учасник, які ролі та навички заявляє, і яке CV може редагувати на телефоні без боротьби з відступами chrome.

    Типові сценарії:

    1. Учасник відкриває /profile → Professional → натискає Organization → бачить список сутностей із пошуком (FsModal) → вибір зберігається одразу.
    2. Учасник додає теги Position / Skills із відомого каталогу або власний текст; вибрані чипи залишаються видимими всередині модального вікна вибору.
    3. Учасник натискає Edit у My Curriculum Vitae, пише Markdown на весь екран мобільного пристрою, покладається на автозбереження локальної чернетки, а потім натискає Save & Exit, щоб зберегти зміни у профілі.

    Публічний профіль

    Після резервування імені користувача — публічне представлення довіри за адресою /.

    Entities

    Карта модулів (перевірено)

    ПоверхняШлях
    Оболонка облікового записуfeatures/auth/components/profile-content.tsx
    Organizationcomponents/profile/organization-entity-select.tsx → DavinciDroplist → GET /api/entities
    Хмари тегівcomponents/profile/profile-tag-cloud.tsx (+ position-tag-cloud.tsx, skills-tag-cloud.tsx)
    Каталоги тегівfeatures/auth/lib/profile-tags.ts, position-tags.ts, skill-tags.ts
    Віджет CVcomponents/profile/curriculum-vitae-widget.tsx
    Редактор CVдинамічний WikiRichEditor (features/wiki/components/wiki-rich-editor.tsx) — SSOT Markdown
    ЗбереженняServer Action — / / / FormData

    Related documentation

    Public Profile Pages

    Наступний крок: публічне /{username} як представлення довіри після заповнення Professional-полів.

    Entities

    Залежність: OrganizationEntitySelect перелічує Entities через GET /api/entities.

    Authentication

    Той самий процес: основні дані /profile та Auth.js session.update після updateProfile.

    Scientific Editor

    Див. також: публікації використовують useAutoSave для /api/publications; чернетки CV використовують натомість useLocalStorage.

    1. Документація
    2. /Функції
    3. /Віджети профілю облікового запису

    Оновлено 6 вер. 2026 р.3 хв прослуховування

    Список організацій у droplist читає той самий каталог Entities, до якого приєднуються та який демонструють учасники.

    Резервування імені користувача

    @handle розташований на вкладці Messengers (над Telegram), а не в hero-блоці Professional.

    updateProfile
    curriculumVitae
    organization
    position
    skills
    ЗавантаженняPOST /api/uploads, призначення profile:cv (lib/uploads/upload-types.ts)
    Форма сховищаusers.data.curriculumVitae (CurriculumVitae у features/auth/types.ts)
    Чернеткиключ useLocalStorage profile_cv_draft_{userId} + useDebounce (той самий безпечний для hydration шаблон, що й у chat composer)
    ОболонкаFsModal — мобільні hideTitleOnMobile, closeClassName="max-sm:hidden", футер Close + Save & Exit

    Розташування Davinci-droplist

    OrganizationEntitySelect — мігроване місце виклику Davinci-droplist (theme enhancer §7 / DL11), поряд із CountrySelect, TimezoneSelect, ProductRepSelect, VendorEntitySelect. ProfileTagCloud повторно використовує DavinciDroplistItem + QuickSearchFilter усередині FsModal для підтвердження множинних тегів (не single-select із закриттям після натискання).

    Chrome мобільного редактора CV

    На десктопі залишаються підписи Cancel + Save і стандартна кнопка .modal-close-button у правому верхньому куті.

    1. 1

      Підключіть Organization

      Імпортуйте OrganizationEntitySelect у вкладку Professional; передайте поточний рядок organization і onSaved, щоб оновити локальний стан профілю після updateProfile.

    2. 2

      Підключіть Position / Skills

      Використовуйте обгортки PositionTagCloud / SkillsTagCloud (або безпосередньо ProfileTagCloud із field + knownTags). Вибрані чипи відображаються і зовні, і всередині FsModal.

    3. 3

      Підключіть Curriculum Vitae

      Змонтуйте CurriculumVitaeWidget із value={user.curriculumVitae}. Переконайтеся, що призначення завантаження profile:cv дозволене в upload-core, а updateProfile розбирає JSON curriculumVitae у users.data.

    Doc System

    Поглиблення: App UI profile widgets у WIDGETS-README + секція ring-docs.nodus app_ui_profile.

    Список організацій у droplist читає той самий каталог Entities, до якого приєднуються та який демонструють учасники.

    Резервування імені користувача

    @handle розташований на вкладці Messengers (над Telegram), а не в hero-блоці Professional.

    updateProfile
    curriculumVitae
    organization
    position
    skills
    ЗавантаженняPOST /api/uploads, призначення profile:cv (lib/uploads/upload-types.ts)
    Форма сховищаusers.data.curriculumVitae (CurriculumVitae у features/auth/types.ts)
    Чернеткиключ useLocalStorage profile_cv_draft_{userId} + useDebounce (той самий безпечний для hydration шаблон, що й у chat composer)
    ОболонкаFsModal — мобільні hideTitleOnMobile, closeClassName="max-sm:hidden", футер Close + Save & Exit

    Розташування Davinci-droplist

    OrganizationEntitySelect — мігроване місце виклику Davinci-droplist (theme enhancer §7 / DL11), поряд із CountrySelect, TimezoneSelect, ProductRepSelect, VendorEntitySelect. ProfileTagCloud повторно використовує DavinciDroplistItem + QuickSearchFilter усередині FsModal для підтвердження множинних тегів (не single-select із закриттям після натискання).

    Chrome мобільного редактора CV

    На десктопі залишаються підписи Cancel + Save і стандартна кнопка .modal-close-button у правому верхньому куті.

    1. 1

      Підключіть Organization

      Імпортуйте OrganizationEntitySelect у вкладку Professional; передайте поточний рядок organization і onSaved, щоб оновити локальний стан профілю після updateProfile.

    2. 2

      Підключіть Position / Skills

      Використовуйте обгортки PositionTagCloud / SkillsTagCloud (або безпосередньо ProfileTagCloud із field + knownTags). Вибрані чипи відображаються і зовні, і всередині FsModal.

    3. 3

      Підключіть Curriculum Vitae

      Змонтуйте CurriculumVitaeWidget із value={user.curriculumVitae}. Переконайтеся, що призначення завантаження profile:cv дозволене в upload-core, а updateProfile розбирає JSON curriculumVitae у users.data.

    Doc System

    Поглиблення: App UI profile widgets у WIDGETS-README + секція ring-docs.nodus app_ui_profile.

    Список організацій у droplist читає той самий каталог Entities, до якого приєднуються та який демонструють учасники.

    Резервування імені користувача

    @handle розташований на вкладці Messengers (над Telegram), а не в hero-блоці Professional.

    updateProfile
    curriculumVitae
    organization
    position
    skills
    ЗавантаженняPOST /api/uploads, призначення profile:cv (lib/uploads/upload-types.ts)
    Форма сховищаusers.data.curriculumVitae (CurriculumVitae у features/auth/types.ts)
    Чернеткиключ useLocalStorage profile_cv_draft_{userId} + useDebounce (той самий безпечний для hydration шаблон, що й у chat composer)
    ОболонкаFsModal — мобільні hideTitleOnMobile, closeClassName="max-sm:hidden", футер Close + Save & Exit

    Розташування Davinci-droplist

    OrganizationEntitySelect — мігроване місце виклику Davinci-droplist (theme enhancer §7 / DL11), поряд із CountrySelect, TimezoneSelect, ProductRepSelect, VendorEntitySelect. ProfileTagCloud повторно використовує DavinciDroplistItem + QuickSearchFilter усередині FsModal для підтвердження множинних тегів (не single-select із закриттям після натискання).

    Chrome мобільного редактора CV

    На десктопі залишаються підписи Cancel + Save і стандартна кнопка .modal-close-button у правому верхньому куті.

    1. 1

      Підключіть Organization

      Імпортуйте OrganizationEntitySelect у вкладку Professional; передайте поточний рядок organization і onSaved, щоб оновити локальний стан профілю після updateProfile.

    2. 2

      Підключіть Position / Skills

      Використовуйте обгортки PositionTagCloud / SkillsTagCloud (або безпосередньо ProfileTagCloud із field + knownTags). Вибрані чипи відображаються і зовні, і всередині FsModal.

    3. 3

      Підключіть Curriculum Vitae

      Змонтуйте CurriculumVitaeWidget із value={user.curriculumVitae}. Переконайтеся, що призначення завантаження profile:cv дозволене в upload-core, а updateProfile розбирає JSON curriculumVitae у users.data.

    Doc System

    Поглиблення: App UI profile widgets у WIDGETS-README + секція ring-docs.nodus app_ui_profile.

    ts
    
    // Draft key SSOT (curriculum-vitae-widget.tsx)
    const draftKey = userId ? `profile_cv_draft_${userId}` : 'profile_cv_draft'
    const [storedDraft, setStoredDraft] = useLocalStorage<string>(draftKey, '')
    text
    
    max-sm: повний viewport, body padding 0, header прихований
    footer: [Close] ············ [Save & Exit]
    draft:  useLocalStorage autosave while open
    action: Save & Exit → updateProfile → clear draft → close
    ts
    
    // Draft key SSOT (curriculum-vitae-widget.tsx)
    const draftKey = userId ? `profile_cv_draft_${userId}` : 'profile_cv_draft'
    const [storedDraft, setStoredDraft] = useLocalStorage<string>(draftKey, '')
    text
    
    max-sm: повний viewport, body padding 0, header прихований
    footer: [Close] ············ [Save & Exit]
    draft:  useLocalStorage autosave while open
    action: Save & Exit → updateProfile → clear draft → close
    ts
    
    // Draft key SSOT (curriculum-vitae-widget.tsx)
    const draftKey = userId ? `profile_cv_draft_${userId}` : 'profile_cv_draft'
    const [storedDraft, setStoredDraft] = useLocalStorage<string>(draftKey, '')
    text
    
    max-sm: повний viewport, body padding 0, header прихований
    footer: [Close] ············ [Save & Exit]
    draft:  useLocalStorage autosave while open
    action: Save & Exit → updateProfile → clear draft → close