OverviewFilesCommitsIssuesDocsReleasesPeers

ollama_semantic_function_calling / ollamatools-new / outputs / repomix-output.xml

3413 lines · xml ref:
This file is a merged representation of a subset of the codebase, containing files not matching ignore patterns, combined into a single document by Repomix.
The content has been processed where content has been compressed (code blocks are separated by ⋮---- delimiter).

<file_summary>
This section contains a summary of this file.

<purpose>
This file contains a packed representation of the entire repository's contents.
It is designed to be easily consumable by AI systems for analysis, code review,
or other automated processes.
</purpose>

<file_format>
The content is organized as follows:
1. This summary section
2. Repository information
3. Directory structure
4. Repository files, each consisting of:
  - File path as an attribute
  - Full contents of the file
</file_format>

<usage_guidelines>
- This file should be treated as read-only. Any changes should be made to the
  original repository files, not this packed version.
- When processing this file, use the file path to distinguish
  between different files in the repository.
- Be aware that this file may contain sensitive information. Handle it with
  the same level of security as you would the original repository.
</usage_guidelines>

<notes>
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
- Files matching these patterns are excluded: **/*.svg
- Files matching patterns in .gitignore are excluded
- Files matching default ignore patterns are excluded
- Content has been compressed - code blocks are separated by ⋮---- delimiter
- Files are sorted by Git change count (files with more changes are at the bottom)
</notes>

<additional_info>

</additional_info>

</file_summary>

<directory_structure>
assets/
  css/
    components/
      copy-button.css
      device.css
      form-progress-head.css
    profile-settings/
      devices/
        devices-main.css
        devices-sync.css
      wallet/
        wallet-configuration.css
        wallet-import-configuration.css
        wallet-transfers.css
        wallets-setup.css
      profile-languages.css
      profile-network-status.css
      profile-recover.css
      profile-settings-body.css
      profile-settings-error.css
      profile-settings-footer.css
      profile-settings-header.css
      profile-settings-list-item-dev.css
      profile-settings-list.css
      profile-settings.css
      software-version.css
    room-info/
      room-info-body.css
      room-info-header.css
      room-info.css
    room-list/
      room-list-item.css
    setup-layout/
      setup-identity-backup-layout.css
      setup-identity-root-layout.css
      setup-identity-sync-device-layout.css
      setup-layout.css
    account-secret-phrase-view.css
    app.css
    call-members-preview.css
    chat-editor.css
    chat.css
    emoji-picker.css
    emojis.css
    fonts.css
    invite-modal.css
    lg-video.css
    lightgallery.css
    main.css
    notifications.css
    reset.css
    room-start.css
    screen-share-permissions.css
    seek-slider.css
    split.css
    sync-devices-request-popup.css
    tos.css
    tour.css
patches/
  react-refresh+0.14.2.patch
workers/
  compute/
    index.js
    package.json
.mise.toml
CHANGELOG.md
index.html
jest.config.js
package.json
</directory_structure>

<files>
This section contains the contents of the repository's files.

<file path="assets/css/components/copy-button.css">
.copy-button {
⋮----
.copy-button > span {
⋮----
.copy-button:hover {
⋮----
.copy-button:focus {
⋮----
.copy-button > svg {
</file>

<file path="assets/css/components/device.css">
.identity-device {
⋮----
.identity-device > *:last-child {
⋮----
.identity-device .circle-check {
</file>

<file path="assets/css/components/form-progress-head.css">
.form-progress {
⋮----
.form-progress > div {
⋮----
.form-progress > div.active {
⋮----
.form-progress-head {
⋮----
.form-progress-head__left {
⋮----
.form-progress-head__right {
</file>

<file path="assets/css/profile-settings/devices/devices-main.css">
.profile-devices-main {
⋮----
.profile-devices-main__list-loading {
⋮----
.profile-devices-main__list-item {
⋮----
.profile-devices-main__list-item:last-child {
⋮----
.profile-devices-main__list-item-title {
⋮----
.profile-devices-main__add {
⋮----
.profile-devices-main__add button {
⋮----
.profile-devices-main__anonymous {
</file>

<file path="assets/css/profile-settings/devices/devices-sync.css">
.profile-devices-add__form {
⋮----
.profile-devices-add__form-qrcode {
⋮----
.profile-devices-add__form-qrcode-title {
⋮----
.profile-devices-add__form-qrcode-code {
.profile-devices-add__form-qrcode-code > qr-code::part(table) {
⋮----
.profile-devices-add__form-list-loading {
⋮----
.profile-devices-add__form-list-item {
⋮----
.profile-devices-add__form-list-item-title {
⋮----
.profile-devices-add__form-add {
⋮----
.profile-devices-add__form-add button {
⋮----
.profile-devices-add__form-message {
</file>

<file path="assets/css/profile-settings/wallet/wallet-configuration.css">
.wallet-configuration {
⋮----
.wallet-configuration input[type=text] {
⋮----
.wallet-configuration input[type=text]:focus {
⋮----
.wallet-configuration [type=text]::placeholder {
⋮----
.wallet-configuration  label {
⋮----
.wallet-configuration label.right {
⋮----
.wallet-configuration-header {
⋮----
.wallet-configuration-header img {
⋮----
.wallet-configuration-header span {
⋮----
#wallet-configuration-form {
⋮----
.wallet-configuration-choose {
⋮----
.wallet-configuration-choose > button {
⋮----
.wallet-configuration-choose > button.enabled {
⋮----
.wallet-configuration-btn-spinner {
⋮----
.wallet-configuration-save, .remove-configuration {
⋮----
.wallet-configuration-save {
⋮----
.wallet-configuration-save:disabled {
⋮----
.remove-configuration {
</file>

<file path="assets/css/profile-settings/wallet/wallet-import-configuration.css">
.wallet-import-configuration {
⋮----
.wallet-import-configuration p {
⋮----
.wallet-import-configuration__screen {
⋮----
.wallet-import-configuration input[type=text] {
⋮----
.wallet-import-configuration input[type=text]:focus {
⋮----
.wallet-import-configuration input[type=text]::-webkit-input-placeholder {
⋮----
.wallet-import-configuration input[type=file] {
⋮----
.wallet-import-configuration__submit, .wallet-import-configuration__browse {
⋮----
.wallet-import-configuration__submit {
⋮----
.wallet-import-configuration__submit:disabled {
⋮----
.wallet-import-configuration__browse {
⋮----
.wallet-import-configuration__filepath-label {
⋮----
.wallet-import-configuration__folder {
⋮----
.wallet-import-configuration__path {
</file>

<file path="assets/css/profile-settings/wallet/wallet-transfers.css">
.wallet-transfers {
⋮----
.wallet-transfers__content {
⋮----
.wallet-transfers__loader {
⋮----
.wallet-transfers__loader-text {
⋮----
.wallet-transfers__error-background {
⋮----
.wallet-transfers__balance {
⋮----
.wallet-transfers__balance-title {
⋮----
.wallet-transfers__balance-amount {
⋮----
.wallet-transfers__balance-amount span:first-child {
⋮----
.wallet-transfers__loader-spinner {
⋮----
.wallet-transfers__empty {
⋮----
.wallet-transfers__list {
⋮----
.wallet-transfers__transaction {
⋮----
.wallet-transfers__transaction-details {
⋮----
.wallet-transfers__transaction-details > div {
⋮----
.wallet-transfers__transaction-tx {
⋮----
.wallet-transfers__transaction-user {
⋮----
.wallet-transfers__transaction-date {
⋮----
.transfer-timestamp span {
⋮----
.wallet-transfers__transaction-pic {
⋮----
.wallet-transfers__transaction-description {
⋮----
.received-payment-icon, .sent-payment-icon {
⋮----
.wallet-transfers__transaction-amount {
⋮----
.wallet-transfers__transaction-amount span:first-child {
⋮----
.wallet-transfers__transaction-amount span:nth-child(2) {
</file>

<file path="assets/css/profile-settings/wallet/wallets-setup.css">
.wallets-setup {
⋮----
.wallets-setup > p {
⋮----
.wallets-setup > button {
</file>

<file path="assets/css/profile-settings/profile-languages.css">
.profile-languages {
⋮----
.profile-languages ul li {
⋮----
.profile-languages ul li.selected {
</file>

<file path="assets/css/profile-settings/profile-network-status.css">
.profile-network-status {
⋮----
.profile-network-status__grid {
⋮----
.profile-network-status__content {
⋮----
.profile-network-status__grid > div > div {
⋮----
.profile-network-status__btns {
⋮----
.profile-network-status__grid > div > div:first-child {
</file>

<file path="assets/css/profile-settings/profile-recover.css">
.profile-recover__form {
⋮----
.profile-recover__form-title {
⋮----
.profile-recover__form-desc {
⋮----
.profile-recover__form-textarea {
⋮----
.profile-recover__form-textarea-valid {
⋮----
.profile-recover__form-textarea-error {
⋮----
.profile-recover__form-error {
⋮----
.profile-recover__form-submit {
⋮----
.profile-recover__confirmation-header {
⋮----
.profile-recover__success {
⋮----
.profile-recover__success-text {
⋮----
.profile-recover__success-text span:last-child {
⋮----
.profile-recover__success-submit {
⋮----
.profile-recover__declined {
⋮----
.profile-recover__declined-text {
⋮----
.profile-recover__declined-text span:last-child {
⋮----
.profile-recover__declined-submit {
⋮----
/* SYNCING VIEW */
⋮----
.profile-recover__syncing {
⋮----
.profile-recover__syncing-content {
⋮----
.profile-recover__syncing h4 {
⋮----
.profile-recover__syncing p {
⋮----
.profile-recover__syncing-submit {
⋮----
/* SEARCHING VIEW */
⋮----
.profile-recover__searching {
⋮----
.profile-recover__searching-content {
⋮----
.profile-recover__searching-submit {
⋮----
/* AGREEMENT VIEW */
⋮----
.profile-recover__agreement {
⋮----
.profile-recover__agreement-head {
⋮----
.profile-recover__agreement-content {
⋮----
.profile-recover__agreement-content p {
⋮----
.profile-recover__agreement-checkbox {
⋮----
.profile-recover__agreement-checkbox input[type=checkbox] {
</file>

<file path="assets/css/profile-settings/profile-settings-body.css">
.profile-settings-body {
⋮----
.profile-settings-body__scrollable {
</file>

<file path="assets/css/profile-settings/profile-settings-error.css">
.profile-settings-error {
</file>

<file path="assets/css/profile-settings/profile-settings-footer.css">
.profile-settings-footer {
⋮----
.profile-settings-footer a,
⋮----
.profile-settings-footer a {
⋮----
.profile-settings-footer a:hover {
⋮----
.profile-settings-footer a:hover span {
⋮----
.profile-settings-footer a svg {
</file>

<file path="assets/css/profile-settings/profile-settings-header.css">
.profile-settings-header {
⋮----
.profile-settings-header__border {
⋮----
.profile-settings-header__icons {
⋮----
.profile-settings-header__icons > * {
⋮----
.profile-settings-header__go-back {
⋮----
.profile-settings-header__left {
⋮----
.profile-settings-header__title {
⋮----
.profile-settings-header__left-clickable {
⋮----
.profile-settings-header__icon.show {
</file>

<file path="assets/css/profile-settings/profile-settings-list-item-dev.css">
.profile-settings-list-item-dev label[for=mode] {
⋮----
.profile-settings-list-item-dev label[for=mode]:after {
⋮----
.profile-settings-list-item-dev label[for=mode]:active:after {
⋮----
.profile-settings-list-item-dev input[type=checkbox] {
⋮----
.profile-settings-list-item-dev input[type=checkbox]:checked+label[for=mode] {
⋮----
.profile-settings-list-item-dev input[type=checkbox]:checked+label[for=mode]:after {
⋮----
.profile-settings-list-item-dev input[type=checkbox]~span span {
⋮----
.profile-settings-list-item-dev input[type=checkbox]~span .on {
⋮----
.profile-settings-list-item-dev input[type=checkbox]~span .off {
⋮----
.profile-settings-list-item-dev input[type=checkbox]:checked~span .on {
⋮----
.profile-settings-list-item-dev input[type=checkbox]:checked~span .off {
⋮----
.profile-settings-list-item-dev .switch-container {
</file>

<file path="assets/css/profile-settings/profile-settings-list.css">
.profile-settings-list {
⋮----
.profile-settings-list .mode-li {
⋮----
.profile-settings-list__item {
⋮----
.profile-settings-list__item:last-child {
⋮----
.profile-settings-list__item > a,
⋮----
.profile-settings-list__item ul {
⋮----
.profile-settings-list__item ul li {
⋮----
.profile-settings-list__item-clickable {
⋮----
.profile-settings-list__item-title {
⋮----
.profile-settings-list__item .menu-option {
⋮----
.profile-settings-list__item .debug-option {
⋮----
.profile-settings-list__item-title > svg {
⋮----
.profile-settings-list__item-right {
⋮----
.profile-settings-list__external-link {
⋮----
.profile-settings-list__external-link:hover {
⋮----
.profile-settings-list__external-link:hover span {
⋮----
.profile-settings-list__external-link i {
</file>

<file path="assets/css/profile-settings/profile-settings.css">
/*
.profile-settings a:visited, a:active, a {
  color: #26D2E8;
}

.profile-settings #veil {
  float: left;
  width: calc(100% - 424px);
  height: 100%;
  opacity: 0.3;
}


.profile-settings settings-software { display: none }

.profile-settings settings-software.show { display: inline }

.profile-settings settings-wallet { float: right; }

*/
⋮----
.profile-settings {
⋮----
.profile-settings__show {
⋮----
.profile-settings button:focus {
</file>

<file path="assets/css/profile-settings/software-version.css">
.software-version {
⋮----
.software-version ul li {
⋮----
.software-version ul li:nth-child(odd) {
</file>

<file path="assets/css/room-info/room-info-body.css">
.room-info-body {
⋮----
.room-info-body__scrollable {
</file>

<file path="assets/css/room-info/room-info-header.css">
.room-info-header {
⋮----
.room-info-header__icons {
⋮----
.room-info-header__icons > * {
⋮----
.room-info-header__left {
⋮----
.room-info-header__title {
⋮----
.room-info-header__left-clickable {
⋮----
.room-info-header__icon.show {
</file>

<file path="assets/css/room-info/room-info.css">
.room-info {
⋮----
/*  background: #25262C;*/
⋮----
.room-info__show {
⋮----
.room-info button:focus {
⋮----
.revoke-role-button {
⋮----
.revoke-role-icon {
⋮----
.revoke-role-button-disabled {
⋮----
& {
</file>

<file path="assets/css/room-list/room-list-item.css">
.room-list-item * {
⋮----
.room-list-item ol {
⋮----
.room-list-item ul li {
⋮----
.room-list-item ol li {
⋮----
.room-list-item ol li:before{
⋮----
.room-list-item ul li:before{
⋮----
.room-list-item pre {
⋮----
.room-list-item pre > code{
</file>

<file path="assets/css/setup-layout/setup-identity-backup-layout.css">
.backup-create-modal__modal {
⋮----
.backup-create-modal__form {
⋮----
.backup-create-modal__form-head-title {
⋮----
.backup-create-modal__form-description {
⋮----
.backup-create-modal__form-description > p {
⋮----
.backup-create-modal__form-description > p:last-child {
⋮----
.backup-create-modal__form-textarea {
⋮----
.backup-create-modal__form-textarea::placeholder {
⋮----
.backup-create-modal__form-textarea-valid {
⋮----
.backup-create-modal__form-textarea-error {
⋮----
.backup-create-modal__form-error {
⋮----
.backup-create-modal__form-submit {
⋮----
.backup-create-modal__form-copy-container {
⋮----
.backup-create-modal__form-copy {
⋮----
.backup-create-modal__form-copy:focus {
⋮----
.backup-create-modal__success {
⋮----
.backup-create-modal__success-text {
⋮----
.backup-create-modal__success-text > span:last-of-type {
⋮----
.backup-create-modal__success-submit {
⋮----
/* agreement */
⋮----
.backup-create-modal__agreement {
⋮----
.device-backup-panel__head,
⋮----
.backup-create-modal__agreement-content {
⋮----
.backup-create-modal__agreement-content p {
</file>

<file path="assets/css/setup-layout/setup-identity-root-layout.css">
/* Sync Backup panel */
⋮----
.setup-identity-root-layout__sync-backup {
⋮----
.setup-identity-root-layout__sync-backup h4 {
⋮----
.setup-identity-root-layout__sync-backup p {
⋮----
/* TOS panel */
⋮----
.setup-identity-root-layout__tos {
⋮----
.setup-identity-root-layout__tos h4 {
⋮----
.setup-identity-root-layout__tos p {
⋮----
.setup-identity-root-layout__tos p a {
⋮----
.setup-identity-root-layout__tos button {
</file>

<file path="assets/css/setup-layout/setup-identity-sync-device-layout.css">
/* FORM VIEW */
⋮----
.device-sync-modal__modal {
⋮----
.device-sync-modal__form {
⋮----
.device-sync-modal__form-title {
⋮----
.device-sync-modal__form-footer > button {
⋮----
.device-sync-modal__start-content {
⋮----
.device-sync-modal__start-content p {
⋮----
.device-sync-modal__start-content > input {
⋮----
.device-sync-modal__start-content > input::placeholder {
⋮----
.device-sync-modal__start-content > input:focus {
⋮----
.device-sync-modal__start-content label {
⋮----
/* SUCCESS VIEW */
⋮----
.device-sync-modal__success {
⋮----
.device-sync-modal__success-text {
⋮----
.device-sync-modal__success-text span:last-child {
⋮----
.device-sync-modal__success-submit {
⋮----
/* DECLINED VIEW */
⋮----
.device-sync-modal__declined {
⋮----
.device-sync-modal__declined-text {
⋮----
.device-sync-modal__declined-text span:last-child {
⋮----
.device-sync-modal__declined-submit {
⋮----
/* SYNCING VIEW */
⋮----
.device-sync-modal__syncing-content {
⋮----
.device-sync-modal__syncing-content p {
⋮----
.device-sync-modal__syncing-devices-count {
⋮----
.device-sync-modal__syncing-devices {
⋮----
.device-sync-modal__syncing-devices .identity-device {
⋮----
/* SEARCHING VIEW */
⋮----
.device-sync-modal__searching-devices {
⋮----
.device-sync-modal__searching-devices-count {
⋮----
.device-sync-modal__searching-devices .identity-device {
⋮----
.device-sync-modal__searching-content {
⋮----
.device-sync-modal__searching-content p {
⋮----
/* AGREEMENT VIEW */
⋮----
.device-sync-modal__agreement {
⋮----
.device-sync-modal__agreement-head {
⋮----
.device-sync-modal__agreement-content {
⋮----
.device-sync-modal__agreement-content p {
⋮----
.device-sync-modal__agreement-checkbox {
⋮----
.device-sync-modal__agreement-checkbox input[type=checkbox] {
</file>

<file path="assets/css/setup-layout/setup-layout.css">
.setup-layout {
⋮----
.setup-layout__left {
⋮----
.setup-layout__left-head {
⋮----
.setup-layout__left-body {
⋮----
.setup-layout__main {
⋮----
.setup-layout__main.keet-bg {
⋮----
.setup-layout__main-paragraph {
⋮----
.setup-layout__main-paragraph > :first-child {
</file>

<file path="assets/css/account-secret-phrase-view.css">
.account-secret-phrase-view {
⋮----
.account-secret-phrase-view__word {
⋮----
.account-secret-phrase-view__word-num {
⋮----
.account-secret-phrase-view__word-clickable {
⋮----
.account-secret-phrase-view__word-correct,
⋮----
.account-secret-phrase-view__word-wrong {
⋮----
.account-secret-phrase-view__hidden .account-secret-phrase-view__word {
⋮----
.account-secret-phrase-view__hidden .account-secret-phrase-view__word > * {
⋮----
.account-secret-phrase-view__verify {
⋮----
.account-secret-phrase-view__verify .account-secret-phrase-view__word-num {
</file>

<file path="assets/css/app.css">
.app__title-bar {
⋮----
.app__title-bar .no-drag {
⋮----
.app__content {
</file>

<file path="assets/css/call-members-preview.css">
.call-members-preview-list {
⋮----
.call-members-preview-list > li {
⋮----
.call-members-preview-list > li > i {
⋮----
.call-members-preview {
⋮----
.call-members-preview > *:nth-child(2) {
⋮----
.call-members-preview-list > li:last-child {
⋮----
.call-members-preview-counter {
⋮----
.call-members-preview-btn-wrapper {
⋮----
.call-members-preview-btn-wrapper > *:last-child {
⋮----
.call-members-preview-btn-wrapper button {
⋮----
.call-members-preview-btn-wrapper__large {
⋮----
.call-members-preview-btn-wrapper__medium {
⋮----
.call-members-preview-btn-wrapper__small {
⋮----
@container call-members-preview-btn-wrapper (width < 6rem) {
⋮----
@container call-members-preview-btn-wrapper (width >= 11rem) {
⋮----
@container call-members-preview-btn-wrapper (width >= 12.25rem) {
⋮----
@container call-members-preview-btn-wrapper (width >= 13.75rem) {
</file>

<file path="assets/css/chat-editor.css">
.chat-editor-commands {
⋮----
.chat-editor-commands__responsive {
⋮----
.chat-editor-commands__tools {
⋮----
.chat-editor-commands button svg {
⋮----
.chat-editor-commands__tools > * {
⋮----
.chat-editor-commands__popup {
⋮----
.chat-editor-commands__popup > * {
⋮----
.chat-editor-commands button:focus {
⋮----
.chat-editor-commands__more {
⋮----
@container chat-tools (width < 20rem) {
⋮----
.chat-editor-commands__tools > *:nth-child(7) {
.chat-editor-commands__popup > *:nth-child(7) {
⋮----
/* menu item size is 2.25 x 2.25 rem. Padding 1.25 from each side */
⋮----
@container chat-tools (width < 18.25rem) {
⋮----
.chat-editor-commands__tools > *:nth-child(5),
.chat-editor-commands__popup > *:nth-child(5),
⋮----
@container chat-tools (width < 13.25rem) {
⋮----
.chat-editor-commands__tools > *:nth-child(4) {
.chat-editor-commands__popup > *:nth-child(4) {
⋮----
@container chat-tools (width < 11rem) {
⋮----
.chat-editor-commands__tools > *:nth-child(1),
.chat-editor-commands__popup > *:nth-child(1),
⋮----
@container chat-tools (width < 4rem) {
</file>

<file path="assets/css/chat.css">
.chat {
⋮----
/* Enable user-select for text content of the chat-message */
.chat-message-actions {
⋮----
.chat-message__row {
⋮----
.chat-message__row * {
⋮----
.chat-message>*:not(.chat-message__text) {
⋮----
.chat-message__text {
⋮----
.chat-bg {
⋮----
.chat-message__row-highlighted {
⋮----
.chat-message__avatar {
⋮----
.chat-message {
⋮----
.chat-message__pinned-status-text {
⋮----
.chat-pinned-message__text {
⋮----
.chat-pinned-message__text-deprecated > * {
⋮----
.chat-message__actions-wrapper {
⋮----
.chat-message-actions>div:hover {
⋮----
.chat-message-actions button:focus {
⋮----
.chat-message-menu {
⋮----
.chat-message:hover .chat-message-menu,
⋮----
.chat-system-message__row {
⋮----
.chat-system-message__row:hover .chat-message-actions {
⋮----
.chat-message__body {
⋮----
.chat-message__head {
⋮----
.chat-message__head-icon svg {
⋮----
.chat-message__text * {
⋮----
.chat-message__text>p:last-child {
⋮----
.chat-message__text-focused .msg-gapcursor {
⋮----
/* actions */
⋮----
/* reactions */
⋮----
.chat-message-reactions {
⋮----
.chat-message-reaction {
⋮----
.chat-message-reaction:hover,
⋮----
.chat-message__row-my .chat-message-reaction {
⋮----
.chat-message__row-my .chat-message-reaction:hover,
⋮----
/* my message */
⋮----
.chat-message__row-my {
⋮----
.chat-message__row-my .chat-message__avatar {
⋮----
.chat-message__row-my .chat-message__actions-wrapper {
⋮----
.chat-message__row-my .chat-message {
⋮----
/* chat joined message */
⋮----
.chat-system-message {
⋮----
.chat-joined-message {
⋮----
.chat-joined-message__layout {
⋮----
.chat-joined-message__actions-wrapper {
⋮----
.chat-joined-message__actions-wrapper>.chat-message-actions {
⋮----
/* time message */
⋮----
.chat-time-message {
⋮----
.chat-time-message>div {
⋮----
/* editing message */
⋮----
.chat-message-row__editing .chat-message {
⋮----
.chat-message-row__editing .chat-message__body {
⋮----
.chat-message-row__editing .chat-message-editor {
⋮----
.chat-message-row__editing .chat-message-editor>div {
⋮----
.chat-unread--bottom-line {
⋮----
@container chat (width < 65rem) {
⋮----
@container chat (width < 50rem) {
⋮----
.chat-message-actions>div {
⋮----
.chat-message-actions>div:nth-child(5),
⋮----
@container chat (width < 25rem) {
⋮----
.chat-event-message__other-member-name {
⋮----
/* chat input */
⋮----
.ProseMirror {
⋮----
.chat-message__text>p:not(:last-child),
⋮----
.ProseMirror>.node-link-preview:has(.link-preview-wrapper:empty) {
⋮----
.ProseMirror>:has(+ .node-link-preview) {
⋮----
.ProseMirror:focus {
⋮----
/* Placeholder (only at the top) */
.ProseMirror p.is-editor-empty:first-child::before {
⋮----
.ProseMirror .emoji {
⋮----
.ProseMirror .renderer {
⋮----
.ProseMirror a,
⋮----
/* line-height: 1.36rem; */
⋮----
.ProseMirror em,
⋮----
.ProseMirror img,
⋮----
.ProseMirror li,
⋮----
.ProseMirror li p,
⋮----
.ProseMirror ul,
⋮----
/* margin-bottom: 1em; */
⋮----
.ProseMirror ul li,
⋮----
.ProseMirror ul>li>ul>li,
⋮----
.ProseMirror ul>li>ul>li ul li,
⋮----
.ProseMirror ol,
⋮----
.ProseMirror ol>li::before,
⋮----
.ProseMirror ol>li,
⋮----
.ProseMirror blockquote,
⋮----
.chat-message__text blockquote:not(:only-child) {
⋮----
.ProseMirror p,
⋮----
.chat-pinned-messages {
⋮----
.chat-pinned-messages__preview {
⋮----
.chat-pinned-messages__list-wrapper {
⋮----
.chat-pinned-message__member-name {
⋮----
@container chat-pinned-messages (width < 45rem) {
⋮----
.chat-pinned-message__unpin-title {
⋮----
.chat__pin-container {
⋮----
.chat__pinned-item {
⋮----
&:hover {
⋮----
.chat__unpin-button {
.chat__pin-placholder {
⋮----
.chat-pinned-icon-primary {
⋮----
.chat-pinned-icon-grey {
</file>

<file path="assets/css/emoji-picker.css">
div.keet-emoji-picker {
⋮----
.keet-emoji-picker.picmo__picker {
⋮----
.keet-emoji-picker .picmo__emojiCategory .picmo__categoryName {
⋮----
.keet-emoji-picker .picmo__emojiButton {
⋮----
.keet-emoji-picker .picmo__previewEmoji span {
⋮----
.keet-emoji-picker .picmo__emojiArea {
⋮----
#skin-button {
⋮----
.keet-emoji-picker .picmo__searchField::placeholder {
⋮----
.keet-emoji-picker .picmo__searchField {
⋮----
.keet-emoji-picker .picmo__noRecents {
⋮----
div.keet-emoji-picker .picmo__icon {
⋮----
.picmo__categoryName, .picmo__emojiContainer, .picmo__categoryButtons, .picmo__searchContainer, .picmo__preview {
⋮----
.picmo__preview {
⋮----
.picmo__header {
⋮----
div.keet-emoji-picker .picmo__categoryButtons .picmo__categoryTab.picmo__categoryTabActive .picmo__categoryButton {
⋮----
.keet-emoji-picker .picmo__categoryButton:focus {
⋮----
.keet-emoji-picker .emojiContainer {
⋮----
.picmo__header > * {
⋮----
.picmo__customEmoji {
⋮----
/* replace 'robot' icon with a 'keet' in picmo categores */
⋮----
.picmo__picker .picmo__categoryButtons .picmo__categoryTab:has(button[data-category="custom"]) {
⋮----
.picmo__picker .picmo__categoryButtons .picmo__categoryTabActive:has(button[data-category="custom"]) {
⋮----
.picmo__picker .picmo__categoryButtons .picmo__categoryTab:has(button[data-category="custom"]) svg {
⋮----
/* replace 'robot' icon with a 'keet' in picmo content */
⋮----
.picmo__emojiArea .picmo__emojiCategory:has(h3[data-category="custom"]) svg path {
⋮----
.picmo__emojiArea .picmo__emojiCategory:has(h3[data-category="custom"]) svg {
</file>

<file path="assets/css/emojis.css">
.emoji {
⋮----
/* A different font is used for emojis because the 'Inter' font doesn't render well some of them, like :warning: or :heart: */
⋮----
.emoji-basic {
⋮----
.emoji-single {
⋮----
.emoji > .emoji-img {
⋮----
.emoji-single-riv {
⋮----
.emoji-single-riv canvas {
⋮----
.emoji-single > .emoji-img {
⋮----
.reaction-tooltip-emoji-rive {
⋮----
.reaction-tooltip-emoji-rive canvas {
⋮----
.reaction-tooltip-emoji-img {
⋮----
.reaction-emoji-img {
⋮----
.reaction-emoji-riv {
⋮----
.reaction-emoji-riv canvas {
⋮----
.emoji-riv {
⋮----
.emoji-riv canvas {
⋮----
.reply-to-root .emoji-riv canvas {
⋮----
.reply-to-root .emoji-basic {
⋮----
.reply-to-root .emoji-single {
⋮----
.reply-to-root .emoji-single-riv canvas {
⋮----
.reply-to-root .emoji-single > .emoji-img {
</file>

<file path="assets/css/fonts.css">
@font-face {
</file>

<file path="assets/css/invite-modal.css">
.invite-modal__content {
⋮----
.invite-form {
⋮----
.invite-form:hover,
⋮----
.invite-form::-webkit-scrollbar {
⋮----
.invite-form__header-label {
⋮----
.invite-form__header-title {
⋮----
.invite-form__type-label {
⋮----
.invite-form__type-label > i {
⋮----
.invite-form__invite-type-selector svg {
⋮----
.invite-form__indexer {
⋮----
.invite-form__expires-label {
⋮----
.invite-form__expires-btns {
⋮----
.invite-form__expires-btns > button {
⋮----
.invite-form__expires-btns > button.selected {
⋮----
.invite-form__expires-btns > button:focus {
⋮----
.invite-form__qr-panel {
⋮----
.invite-form__qr-label {
⋮----
.invite-form__qr-code {
⋮----
.invite-form__qr-copy-label {
⋮----
.invite-info {
⋮----
.invite-info h2 {
⋮----
.invite-info h3 {
⋮----
.invite-info ul {
⋮----
.invite-info ul > li {
⋮----
.invite-info ul > li > svg {
⋮----
.invite-info h3 svg {
⋮----
.invite-info__back {
⋮----
.invite-info__back:hover {
⋮----
.invite-info__back:focus {
</file>

<file path="assets/css/lg-video.css">
.lg-outer .lg-video-cont {
⋮----
.lg-outer .lg-video-cont .lg-object {
⋮----
.lg-outer .lg-has-iframe .lg-video-cont {
⋮----
.lg-outer .lg-video-object {
⋮----
.lg-outer .lg-video-poster {
⋮----
.lg-outer .lg-has-video .lg-video-object {
⋮----
.lg-outer .lg-has-video.lg-video-loaded .lg-video-poster,
⋮----
.lg-outer .lg-has-video.lg-video-loaded .lg-video-object {
⋮----
.lg-video-play-button {
⋮----
.lg-video-play-button:hover .lg-video-play-icon-bg,
⋮----
.lg-video-play-icon-bg {
⋮----
.lg-video-play-icon-circle {
⋮----
.lg-video-play-icon {
⋮----
.lg-video-play-icon .lg-video-play-icon-inner {
⋮----
.lg-video-loading .lg-video-play-icon-circle {
⋮----
.lg-video-loaded .lg-video-play-button {
</file>

<file path="assets/css/lightgallery.css">
@font-face {
⋮----
.lg-icon {
⋮----
/* use !important to prevent issues with browser extensions that change fonts */
⋮----
/* Better Font Rendering =========== */
⋮----
.lg-container {
⋮----
.lg-next,
⋮----
.lg-next.disabled,
⋮----
.lg-next:hover:not(.disabled),
⋮----
.lg-single-item .lg-next, .lg-single-item
⋮----
.lg-next {
⋮----
.lg-next:before {
⋮----
.lg-prev {
⋮----
.lg-prev:after {
⋮----
.lg-outer.lg-right-end .lg-object {
⋮----
.lg-outer.lg-left-end .lg-object {
⋮----
.lg-toolbar {
⋮----
.lg-media-overlap .lg-toolbar {
⋮----
.lg-toolbar .lg-icon {
⋮----
.lg-toolbar .lg-icon.lg-icon-18 {
⋮----
.lg-toolbar .lg-icon:hover {
⋮----
.lg-toolbar .lg-close:after {
⋮----
.lg-toolbar .lg-maximize {
⋮----
.lg-toolbar .lg-maximize:after {
⋮----
.lg-toolbar .lg-download:after {
⋮----
.lg-sub-html {
⋮----
.lg-sub-html h4 {
⋮----
.lg-sub-html p {
⋮----
.lg-sub-html a {
⋮----
.lg-sub-html a:hover {
⋮----
.lg-media-overlap .lg-sub-html {
⋮----
.lg-item .lg-sub-html {
⋮----
.lg-error-msg {
⋮----
.lg-counter {
⋮----
.lg-closing .lg-toolbar,
⋮----
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item:not(.lg-zoomable) .lg-img-wrap,
⋮----
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item:not(.lg-zoomable).lg-complete .lg-img-wrap,
⋮----
.lg-group:after {
⋮----
.lg-container.lg-show {
⋮----
.lg-on {
⋮----
.lg-toolbar,
⋮----
.lg-show-in .lg-toolbar,
⋮----
.lg-show-in.lg-hide-sub-html .lg-sub-html {
⋮----
.lg-show-in .lg-hide-items .lg-prev {
⋮----
.lg-show-in .lg-hide-items .lg-next {
⋮----
.lg-show-in .lg-hide-items .lg-toolbar {
⋮----
.lg-show-in .lg-hide-items.lg-hide-sub-html .lg-sub-html {
⋮----
.lg-outer {
⋮----
.lg-outer * {
⋮----
.lg-outer.lg-zoom-from-image {
⋮----
.lg-outer.lg-visible {
⋮----
.lg-outer.lg-css3 .lg-item:not(.lg-start-end-progress).lg-prev-slide, .lg-outer.lg-css3 .lg-item:not(.lg-start-end-progress).lg-next-slide, .lg-outer.lg-css3 .lg-item:not(.lg-start-end-progress).lg-current {
⋮----
.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-current {
⋮----
.lg-outer.lg-grab img.lg-object {
⋮----
.lg-outer.lg-grabbing img.lg-object {
⋮----
.lg-outer .lg-content {
⋮----
.lg-outer .lg-inner {
⋮----
.lg-outer .lg-item {
⋮----
.lg-outer .lg-item:not(.lg-start-end-progress) {
⋮----
.lg-outer.lg-css3 .lg-prev-slide,
⋮----
.lg-outer.lg-css .lg-current {
⋮----
.lg-outer .lg-item,
⋮----
.lg-outer .lg-item:before,
⋮----
.lg-outer .lg-img-wrap {
⋮----
.lg-outer .lg-item.lg-complete {
⋮----
.lg-outer .lg-item.lg-current {
⋮----
.lg-outer .lg-object {
⋮----
.lg-outer .lg-empty-html.lg-sub-html,
⋮----
.lg-outer.lg-hide-download .lg-download {
⋮----
.lg-outer .lg-first-slide .lg-dummy-img {
⋮----
.lg-outer.lg-components-open:not(.lg-zoomed) .lg-components {
⋮----
.lg-outer.lg-components-open:not(.lg-zoomed) .lg-sub-html {
⋮----
.lg-backdrop {
⋮----
.lg-backdrop.in {
⋮----
.lg-css3.lg-no-trans .lg-prev-slide,
⋮----
.lg-css3.lg-use-css3 .lg-item {
⋮----
.lg-css3.lg-fade .lg-item {
⋮----
.lg-css3.lg-fade .lg-item.lg-current {
⋮----
.lg-css3.lg-fade .lg-item.lg-prev-slide, .lg-css3.lg-fade .lg-item.lg-next-slide, .lg-css3.lg-fade .lg-item.lg-current {
⋮----
.lg-css3.lg-use-css3 .lg-item.lg-start-progress {
⋮----
.lg-css3.lg-use-css3 .lg-item.lg-start-end-progress {
⋮----
.lg-css3.lg-slide.lg-use-css3 .lg-item {
⋮----
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide {
⋮----
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide {
⋮----
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
⋮----
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
⋮----
.lg-container.lg-dragging-vertical .lg-backdrop {
⋮----
.lg-container.lg-dragging-vertical .lg-css3 .lg-item.lg-current {
⋮----
.lg-inline .lg-backdrop,
⋮----
.lg-inline .lg-backdrop {
⋮----
.lg-inline .lg-outer {
⋮----
.lg-inline .lg-maximize:after {
⋮----
.lg-components {
⋮----
.light-gallery video::-webkit-media-controls-fullscreen-button {
</file>

<file path="assets/css/main.css">
:root {
⋮----
/* src/lib/theme.js */
⋮----
/* color palette */
⋮----
/* Grey */
⋮----
/* Blue */
⋮----
/* Red */
⋮----
/* Yellow */
⋮----
/* Green */
⋮----
/* Indigo */
⋮----
/* Fuschia */
⋮----
/* Other colors */
⋮----
/* gradients */
⋮----
html {
⋮----
body {
⋮----
button.gradient-primary {
⋮----
button.gradient-primary:hover {
⋮----
.no-drag {
⋮----
.chat-bar {
⋮----
/* sandbox: https://jsfiddle.net/8vwc1ajf/ */
.call-room-title {
⋮----
.call-bar {
⋮----
@container chat-bar (width < 33.2rem) {
⋮----
.join-call-btn {
⋮----
.menu {
⋮----
.text-shadow {
⋮----
.glow {
⋮----
/* FadeIn animation */
.fadeIn {
⋮----
.fadeIn-50 {
⋮----
.fadeIn-100 {
⋮----
.fadeIn-150 {
⋮----
.fadeIn-200 {
⋮----
.fadeIn-300 {
⋮----
.fadeIn-400 {
⋮----
.fadeIn-500 {
⋮----
/* Show animation */
.show {
⋮----
.show-50 {
⋮----
.show-100 {
⋮----
.show-150 {
⋮----
.show-200 {
⋮----
.show-300 {
⋮----
.show-400 {
⋮----
.show-500 {
⋮----
.show-delay {
⋮----
/* Hide animation */
.hide {
⋮----
.hide-100 {
⋮----
.expand {
⋮----
.unexpand {
⋮----
.expand-sidebar {
⋮----
.unexpand-sidebar {
⋮----
/* Animation */
⋮----
.gallery {
⋮----
/* 1/1 */
⋮----
/* width */
::-webkit-scrollbar {
⋮----
/* Track */
::-webkit-scrollbar-track {
⋮----
/* Handle */
::-webkit-scrollbar-thumb {
⋮----
::-webkit-scrollbar-corner {
⋮----
code:not(pre code) {
⋮----
pre {
⋮----
/* Handle mic animation */
.mic-animate {
⋮----
audio::-webkit-media-controls-play-button {}
⋮----
audio::-webkit-media-controls-panel {
⋮----
.blur-48 {
⋮----
.blur-16 {
⋮----
.blur-4 {
⋮----
.wrap-anywhere {
⋮----
/* Input Checkbox */
⋮----
input[type="checkbox"]+span {
⋮----
input[type="checkbox"]:checked+span {
⋮----
/* Input Radio */
input[type="radio"]:checked:before {
⋮----
/* Input Range Slider */
input[type="range"] {
⋮----
input[type="range"]::-webkit-slider-thumb {
⋮----
input[type="range"]::-webkit-slider-runnable-track {
⋮----
input[type="range"]::-webkit-slider-thumb:hover {
⋮----
input[type=range][orient=vertical] {
⋮----
/* Switch Checkbox */
⋮----
.switch {
⋮----
.switch input[type="checkbox"] {
⋮----
.switch label {
⋮----
.switch label:after {
⋮----
.switch input:checked+label {
⋮----
.switch input:checked+label:after {
⋮----
.switch label:active:after {
⋮----
.mention.mention-admin {
⋮----
.mention.mention-moderator {
⋮----
.mention,
⋮----
.mention:first-child,
⋮----
.mention:hover,
⋮----
.mention[data-scope="me"] {
⋮----
.chat-message__text.mentions-pending .mention {
⋮----
.last-message {
⋮----
.last-message span.emoji {
⋮----
.last-message code {
⋮----
qr-code::part(table) {
⋮----
.tooltip {
⋮----
/* Flex Elements */
⋮----
.first-to-shrink {
⋮----
.logo-loader {
⋮----
.sleeping-keet {
⋮----
.checkbox-primary {
⋮----
.checkbox-primary input[type="checkbox"] {
⋮----
.checkbox-primary input[type="checkbox"]:checked:before {
⋮----
.dashed-circle {
⋮----
.chat-control-list {
⋮----
@container chat-control-list (width < 24rem) {
⋮----
.call-control {
⋮----
.call-control__user-input {
⋮----
&:focus {
⋮----
.chat-control__toggle-menu {
⋮----
.call-control-icon {
⋮----
.call-settings__button {
⋮----
.emoji-input::-webkit-scrollbar {
⋮----
.emoji-input>div>.ProseMirror {
⋮----
.emoji-input>div>.ProseMirror>p {
⋮----
html:not(.lg-on) .file-viewer-transfer-stats {
⋮----
/* Spin Animation */
⋮----
.spin-clockwise {
⋮----
.spin-counterclockwise {
⋮----
/* Modal gradient borders */
⋮----
.aqua-gradient-border {
⋮----
.aqua-gradient-border:before {
</file>

<file path="assets/css/notifications.css">
.notification {
⋮----
.notification button:focus {
⋮----
.notification__visible {
⋮----
.notification__icon {
⋮----
.notification__icon > * {
⋮----
.notification__close {
⋮----
.notifications-container {
⋮----
.notification-custom-room-activity-text > :first-child {
</file>

<file path="assets/css/reset.css">
/* disable selection */
:not(input):not(textarea),
⋮----
/* cursor: default; */
⋮----
input, button, textarea, :focus {
⋮----
input::-webkit-outer-spin-button,
⋮----
/* disable image and anchor dragging */
a:not([draggable=true]), img:not([draggable=true]) {
a[href^="http://"],
⋮----
.messages > div::-webkit-scrollbar-track {
⋮----
.messages > div::-webkit-scrollbar-thumb {
⋮----
* {
</file>

<file path="assets/css/room-start.css">
.room-start {
</file>

<file path="assets/css/screen-share-permissions.css">
.screen-share-permissions__content {
⋮----
.screen-share-permissions__content h3 {
⋮----
.screen-share-permissions__content p {
⋮----
.screen-share-permissions__content ul {
⋮----
.screen-share-permissions__content ul li {
⋮----
.screen-share-permissions__content button {
</file>

<file path="assets/css/seek-slider.css">
.ui-video-seek-slider {
⋮----
.ui-video-seek-slider:focus {
⋮----
.ui-video-seek-slider .track {
⋮----
.ui-video-seek-slider .track:focus {
⋮----
.ui-video-seek-slider .track .main {
⋮----
.ui-video-seek-slider .track .main:focus {
⋮----
.ui-video-seek-slider .track .main .buffered {
⋮----
/* -webkit-transform: scaleX(0.8); */
/* transform: scaleX(0.8); */
⋮----
.ui-video-seek-slider .track .main .seek-hover {
⋮----
/* -webkit-transform: scaleX(0.2); */
/* transform: scaleX(0.2); */
⋮----
.ui-video-seek-slider .track .main .connect {
⋮----
/* -webkit-transform: scaleX(0.13); */
/* transform: scaleX(0.13); */
⋮----
.ui-video-seek-slider .track.active .main {
⋮----
/* -webkit-transform: scaleY(2); */
/* transform: scaleY(2) */
⋮----
.ui-video-seek-slider .thumb {
⋮----
.ui-video-seek-slider .thumb .handler {
⋮----
/* -webkit-transform: scale(0.4); */
/* transform: scale(0.4) */
⋮----
.ui-video-seek-slider .thumb.active .handler {
⋮----
/* -webkit-transform: scale(1); */
/* transform: scale(1) */
⋮----
.ui-video-seek-slider .hover-time {
⋮----
.ui-video-seek-slider .hover-time.active {
⋮----
.ui-video-seek-slider:hover .track .main .seek-hover {
</file>

<file path="assets/css/split.css">
/* === Main Container === */
.__dbk__container {
⋮----
.__dbk__container.Horizontal {
⋮----
.__dbk__container.Vertical {
/* ====== */
⋮----
/* === Wrapper for each child element === */
.__dbk__child-wrapper {
⋮----
/* === Gutter === */
.__dbk__gutter {
/* .__dbk__gutter > div {
    background: red;
  } */
.__dbk__gutter.Horizontal {
.__dbk__gutter.Horizontal:hover {
⋮----
.__dbk__gutter.Vertical {
.__dbk__gutter.Vertical:hover {
⋮----
.__dbk__gutter.Light {
.__dbk__gutter.Light:hover > .__dbk__dragger {
⋮----
.__dbk__gutter.Dark {
.__dbk__gutter.Dark:hover > .__dbk__dragger {
⋮----
/* === Gutter's Dragger === */
.__dbk__dragger {
⋮----
.__dbk__dragger.Horizontal {
⋮----
.__dbk__dragger.Vertical {
⋮----
.__dbk__dragger.Light {
⋮----
.__dbk__dragger.Dark {
</file>

<file path="assets/css/sync-devices-request-popup.css">
.sync-devices-req-popup {
⋮----
.sync-devices-req-popup h4 {
⋮----
.sync-devices-req-popup p {
⋮----
.sync-devices-req-popup button {
⋮----
.sync-devices-req-popup > :last-child {
⋮----
.sync-devices-req-popup__from-title {
</file>

<file path="assets/css/tos.css">
.terms-of-service-content h3 {
⋮----
.terms-of-service-content h4 {
⋮----
.terms-of-service-content ul {
⋮----
.processing-personal-info__table {
⋮----
.processing-personal-info__table th {
⋮----
.processing-personal-info__table td,
</file>

<file path="assets/css/tour.css">
.tour-popup {
⋮----
.tour-popup__content {
⋮----
.tour-popup__arrow-top-left,
⋮----
.tour-popup__arrow-top-left {
⋮----
.tour-popup__arrow-top-right {
⋮----
.tour-popup__arrow-top-middle {
</file>

<file path="patches/react-refresh+0.14.2.patch">
diff --git a/node_modules/react-refresh/cjs/react-refresh-runtime.development.js b/node_modules/react-refresh/cjs/react-refresh-runtime.development.js
index 73748ad..f3c6492 100644
--- a/node_modules/react-refresh/cjs/react-refresh-runtime.development.js
+++ b/node_modules/react-refresh/cjs/react-refresh-runtime.development.js
@@ -128,6 +128,20 @@ function canPreserveStateBetween(prevType, nextType) {
     return false;
   }
 
+  if (typeof prevType !== typeof nextType) {
+    return false;
+  } else if (
+    typeof prevType === 'object' &&
+    prevType !== null &&
+    nextType !== null
+  ) {
+    if (
+      getProperty(prevType, '$$typeof') !== getProperty(nextType, '$$typeof')
+    ) {
+      return false;
+    }
+  }
+
   if (haveEqualSignatures(prevType, nextType)) {
     return true;
   }
@@ -167,6 +181,21 @@ function getProperty(object, property) {
   }
 }
 
+// Patch to fix bellow issue.
+// https://github.com/facebook/react/issues/30659
+// https://github.com/facebook/react/pull/30660/files
+function registerRefreshUpdate(
+  update,
+  family,
+  shouldPreserveState,
+) {
+  if (shouldPreserveState) {
+    update.updatedFamilies.add(family);
+  } else {
+    update.staleFamilies.add(family);
+  }
+}
+
 function performReactRefresh() {
 
   if (pendingUpdates.length === 0) {
@@ -182,6 +211,12 @@ function performReactRefresh() {
   try {
     var staleFamilies = new Set();
     var updatedFamilies = new Set();
+    // TODO: rename these fields to something more meaningful.
+    const update = {
+      updatedFamilies, // Families that will re-render preserving state
+      staleFamilies, // Families that will be remounted
+    };
+
     var updates = pendingUpdates;
     pendingUpdates = [];
     updates.forEach(function (_ref) {
@@ -194,19 +229,34 @@ function performReactRefresh() {
       updatedFamiliesByType.set(nextType, family);
       family.current = nextType; // Determine whether this should be a re-render or a re-mount.
 
-      if (canPreserveStateBetween(prevType, nextType)) {
-        updatedFamilies.add(family);
-      } else {
-        staleFamilies.add(family);
+      const shouldPreserveState = canPreserveStateBetween(prevType, nextType);
+
+      if (typeof prevType === 'object' && prevType !== null) {
+        const nextFamily = {
+          current:
+            getProperty(nextType, '$$typeof') === REACT_FORWARD_REF_TYPE
+              ? nextType.render
+              : getProperty(nextType, '$$typeof') === REACT_MEMO_TYPE
+                ? nextType.type
+                : nextType,
+        };
+        switch (getProperty(prevType, '$$typeof')) {
+          case REACT_FORWARD_REF_TYPE: {
+            updatedFamiliesByType.set(prevType.render, nextFamily);
+            registerRefreshUpdate(update, nextFamily, shouldPreserveState);
+            break;
+          }
+          case REACT_MEMO_TYPE:
+            updatedFamiliesByType.set(prevType.type, nextFamily);
+            registerRefreshUpdate(update, nextFamily, shouldPreserveState);
+            break;
+        }
       }
-    }); // TODO: rename these fields to something more meaningful.
 
-    var update = {
-      updatedFamilies: updatedFamilies,
-      // Families that will re-render preserving state
-      staleFamilies: staleFamilies // Families that will be remounted
+      // Determine whether this should be a re-render or a re-mount.
+      registerRefreshUpdate(update, family, shouldPreserveState);
+    }); // TODO: rename these fields to something more meaningful.
 
-    };
     helpersByRendererID.forEach(function (helpers) {
       // Even if there are no roots, set the handler on first update.
       // This ensures that if *new* roots are mounted, they'll use the resolve handler.
</file>

<file path="workers/compute/index.js">
(function(_0x36ef77,_0x27c604){const _0x1512ca={_0x5a68d3:0x113,_0x151a1a:0x115,_0xb125f7:0x108,_0x3c606c:0x10f,_0x227604:0x10a,_0x4d3073:0x41d,_0x1c7d0d:0x419,_0x62c660:0x412,_0x21f0ea:0x421,_0x20b4a3:0x119,_0x2c2310:0x10b,_0x33a3a2:0x110,_0x2276fb:0x113,_0x2ea3cc:0x104,_0x2ff107:0x427,_0x3c74ef:0x428,_0x22b89c:0x429,_0x257f3a:0x42f,_0x483071:0x417,_0x52f2c9:0x413,_0x16fe39:0x415,_0x1e39a8:0x41c,_0x573e1a:0x427,_0x9f979f:0x416,_0x18a0f9:0x424,_0x3ee997:0x420,_0x3c707b:0x425,_0x38f27a:0x11c,_0x1698be:0x119,_0x54e67e:0x11d,_0x36354b:0x11f,_0x38a6ed:0x41b,_0x1f7a8a:0x41c,_0x13f71f:0x422,_0x336603:0x41d,_0x265508:0x41f},_0x5b47c9={_0x5a8767:0x63};function _0x54449b(_0x1ad07f,_0x10f8db,_0x161ff4,_0x1a99bf){return _0x4357(_0x1ad07f-0x2aa,_0x161ff4);}function _0x316947(_0x319028,_0x2c91fa,_0x45df0e,_0x40edfd){return _0x4357(_0x319028- -_0x5b47c9._0x5a8767,_0x45df0e);}const _0x52f51c=_0x36ef77();while(!![]){try{const _0x5c2f3b=-parseInt(_0x316947(0x111,_0x1512ca._0x5a68d3,_0x1512ca._0x151a1a,0x115))/(-0x90*-0x34+-0xc95+-0x10aa)*(parseInt(_0x316947(_0x1512ca._0xb125f7,_0x1512ca._0x3c606c,0x103,_0x1512ca._0x227604))/(0x25a0+0x369+0xdad*-0x3))+parseInt(_0x54449b(_0x1512ca._0x4d3073,_0x1512ca._0x1c7d0d,_0x1512ca._0x62c660,_0x1512ca._0x21f0ea))/(0x22b1+-0x22de+0x30)*(parseInt(_0x316947(0x116,0x11a,_0x1512ca._0x20b4a3,0x11e))/(-0x4*-0x602+-0x240f+-0x1*-0xc0b))+-parseInt(_0x316947(_0x1512ca._0x2c2310,_0x1512ca._0x33a3a2,_0x1512ca._0x2276fb,_0x1512ca._0x2ea3cc))/(0x24c5+-0x11*-0x195+0x1537*-0x3)*(parseInt(_0x54449b(_0x1512ca._0x2ff107,_0x1512ca._0x3c74ef,_0x1512ca._0x22b89c,_0x1512ca._0x257f3a))/(-0x1f3*0x1+0x1*0x113+0xe6))+-parseInt(_0x54449b(_0x1512ca._0x483071,_0x1512ca._0x52f2c9,0x422,_0x1512ca._0x16fe39))/(-0x8f5*-0x4+-0x160b+0x24b*-0x6)*(-parseInt(_0x54449b(_0x1512ca._0x1e39a8,0x413,_0x1512ca._0x573e1a,_0x1512ca._0x9f979f))/(0xd2e+-0x1159+0x5*0xd7))+-parseInt(_0x54449b(_0x1512ca._0x18a0f9,_0x1512ca._0x3ee997,_0x1512ca._0x3c707b,_0x1512ca._0x3c74ef))/(-0x80a*-0x4+-0x401+0x76*-0x3d)*(-parseInt(_0x316947(_0x1512ca._0x38f27a,_0x1512ca._0x1698be,_0x1512ca._0x54e67e,_0x1512ca._0x36354b))/(-0x1*0x6aa+0xd84*-0x2+0x4*0x86f))+parseInt(_0x54449b(_0x1512ca._0x38a6ed,0x41e,_0x1512ca._0x1f7a8a,0x426))/(0x2695+-0x1*-0x530+-0x1d*0x182)+parseInt(_0x54449b(_0x1512ca._0x13f71f,_0x1512ca._0x336603,_0x1512ca._0x3c707b,_0x1512ca._0x265508))/(0xab5+-0x64*-0x34+-0xa53*0x3);if(_0x5c2f3b===_0x27c604)break;else _0x52f51c['push'](_0x52f51c['shift']());}catch(_0x1e7b1a){_0x52f51c['push'](_0x52f51c['shift']());}}}(_0x4c25,0x1713*0x6d+0xd*-0xb22d+0x43ec4));function _0x4357(_0x5a1cba,_0x376fb3){const _0x5c8d7d=_0x4c25();return _0x4357=function(_0x5852ac,_0x223c5e){_0x5852ac=_0x5852ac-(0x49*-0x41+0x153+0x13*0xfb);let _0x58580d=_0x5c8d7d[_0x5852ac];return _0x58580d;},_0x4357(_0x5a1cba,_0x376fb3);}function _0x48679c(_0x5ddfb1,_0x4c929a,_0xe49ab6,_0x2a85df){const _0x42e440={_0x572e50:0x182};return _0x4357(_0x5ddfb1-_0x42e440._0x572e50,_0x2a85df);}const _0x18d3d4=(function(){let _0x5e84c3=!![];return function(_0x37ca6e,_0xc6c00e){const _0x289993={_0x1fdab5:0x290,_0xd4503b:0x291,_0x5aee69:0x299},_0x2568e1=_0x5e84c3?function(){const _0x43cf3f={_0x388bec:0x11e};function _0x3eec9e(_0x4f50a1,_0x6a44c7,_0x1f0e32,_0x35e46b){return _0x4357(_0x35e46b-_0x43cf3f._0x388bec,_0x4f50a1);}if(_0xc6c00e){const _0x59652b=_0xc6c00e[_0x3eec9e(_0x289993._0x1fdab5,_0x289993._0xd4503b,0x29c,_0x289993._0x5aee69)](_0x37ca6e,arguments);return _0xc6c00e=null,_0x59652b;}}:function(){};return _0x5e84c3=![],_0x2568e1;};}()),_0x4ad735=_0x18d3d4(this,function(){const _0x42b87a={_0x5792fa:0x137,_0x32179d:0x134,_0x49ba6e:0x132,_0x2c1635:0x130,_0x46999b:0x134,_0x1e45bf:0x12b,_0x456447:0x127,_0x6ec46b:0x12b,_0xfc94a4:0xb0,_0x13253e:0xa7,_0x4409c0:0xaf,_0xbccb7f:0xab,_0xe38a8e:0xa9,_0x5517be:0xb1,_0x3ba7c1:0xaa,_0x2b1c72:0x9f,_0x2c07af:0xab,_0x11e90d:0xb4,_0x160f36:0x124,_0x48fcdb:0x12a},_0x2578cd={_0x58cb45:0x4c};function _0x4359b9(_0x12c51e,_0x45a153,_0x2ae46c,_0x16edb5){return _0x4357(_0x2ae46c- -0xcd,_0x45a153);}function _0x3f9397(_0x5dabd0,_0xb902a8,_0x1728c4,_0x3581ff){return _0x4357(_0x3581ff- -_0x2578cd._0x58cb45,_0x1728c4);}return _0x4ad735[_0x3f9397(_0x42b87a._0x5792fa,_0x42b87a._0x32179d,_0x42b87a._0x49ba6e,_0x42b87a._0x2c1635)]()[_0x3f9397(_0x42b87a._0x46999b,_0x42b87a._0x1e45bf,_0x42b87a._0x456447,_0x42b87a._0x6ec46b)]('(((.+)+)+)'+'+$')[_0x4359b9(_0x42b87a._0xfc94a4,_0x42b87a._0x13253e,_0x42b87a._0x4409c0,_0x42b87a._0xbccb7f)]()[_0x4359b9(_0x42b87a._0xe38a8e,0xab,_0x42b87a._0x5517be,_0x42b87a._0x3ba7c1)+'r'](_0x4ad735)[_0x4359b9(_0x42b87a._0x2b1c72,_0x42b87a._0x2c07af,0xaa,_0x42b87a._0x11e90d)](_0x3f9397(_0x42b87a._0x160f36,0x122,0x130,_0x42b87a._0x48fcdb)+'+$');});function _0x1599a8(_0x587bbf,_0x5e353f,_0x2afc2b,_0xb2a96){const _0x3f755d={_0x1ed5cc:0x55};return _0x4357(_0xb2a96- -_0x3f755d._0x1ed5cc,_0x2afc2b);}function _0x4c25(){const _0x4432c6=['51664cHUFXD','421881rJjKaA','11hiAWyZ','worker','(((.+)+)+)','search','4077540XlnfCs','4ayqHbJ','100665pmevlh','apply','toString','1760040GAbYho','constructo','240JkuDvd','image\x20in\x20j','83254LHzNAQ','pipe','21qBJDxF','5upOcWm','command','reply','3433177YiTGjP'];_0x4c25=function(){return _0x4432c6;};return _0x4c25();}_0x4ad735();import _0x5480ec from'bare-rpc';const CMD_HEIC_TO_JPG='heic-to-jp'+'g',pipe=Pear[_0x48679c(0x2f7,0x302,0x2f1,0x2fd)][_0x48679c(0x2ee,0x2ef,0x2f8,0x2f6)]();function heicToJpg(_0x2deb9a){const _0x41769a={_0x17a152:0x3c0,_0x400c27:0x3c7,_0x48088c:0x3c2,_0x53bddb:0x3d3,_0x4a0056:0x3d2},_0x2ab811={_0x553707:0x66,_0x456f14:0xba,_0x1a7a2c:0xaa},_0x181e2c={_0x3b394c:0xd0,_0x24b155:0xca,_0x4ac33f:0x146};function _0x4fa9d0(_0x37798e,_0x29cbd1,_0x56c1f6,_0x231193){return _0x48679c(_0x231193-_0x181e2c._0x3b394c,_0x29cbd1-_0x181e2c._0x24b155,_0x56c1f6-_0x181e2c._0x4ac33f,_0x56c1f6);}function _0xb0cde2(_0x140fc8,_0x2e3d83,_0x3a2095,_0x1a5320){return _0x1599a8(_0x140fc8-_0x2ab811._0x553707,_0x2e3d83-_0x2ab811._0x456f14,_0x1a5320,_0x140fc8-_0x2ab811._0x1a7a2c);}_0x2deb9a[_0x4fa9d0(_0x41769a._0x17a152,_0x41769a._0x400c27,0x3c1,_0x41769a._0x48088c)](_0x4fa9d0(_0x41769a._0x53bddb,_0x41769a._0x400c27,0x3c8,_0x41769a._0x4a0056)+'pg');}function onRequest(_0x435814){const _0x2c42a7={_0x2498b4:0x45c,_0x56bedf:0x451,_0x30e931:0x461},_0x32ee9a={_0x2dc98f:0x1a0,_0x47f978:0x16b};function _0x2a77d5(_0x276cbd,_0x59d765,_0x5ed164,_0x29216c){return _0x1599a8(_0x276cbd-_0x32ee9a._0x2dc98f,_0x59d765-_0x32ee9a._0x47f978,_0x29216c,_0x276cbd-0x342);}switch(_0x435814[_0x2a77d5(_0x2c42a7._0x2498b4,0x454,_0x2c42a7._0x56bedf,_0x2c42a7._0x30e931)]){case CMD_HEIC_TO_JPG:heicToJpg(_0x435814);break;default:break;}}const rpc=new _0x5480ec(pipe,onRequest);pipe['on']('end',()=>pipe['end']());
</file>

<file path="workers/compute/package.json">
{
  "name": "keet-worker-compute",
  "version": "1.0.0",
  "description": "Keet worker for general computing tasks",
  "main": "index.js",
  "type": "module",
  "pear": {
    "name": "keet-worker-compute",
    "type": "terminal"
  },
  "dependencies": {
    "bare-rpc": "^0.1.4"
  }
}
</file>

<file path=".mise.toml">
[tasks.llm:generate_core_logic]
description = "Generate output for core logic"
run = ["repomix --include 'src/core/**' --output output_core.xml"]

[tasks.llm:generate_tests]
description = "Generate output for tests"
run = ["repomix --include 'tests/**' --output output_tests.xml"]

[tasks.llm:generate_docs]
description = "Generate output for documentation"
run = ["repomix --include 'docs/**' --output output_docs.xml"]

[tasks.llm:generate_config]
description = "Generate output for configuration"
run = ["repomix --include 'config/**' --output output_config.xml"]

[tasks.llm:generate_utils]
description = "Generate output for utilities"
run = ["repomix --include 'utils/**' --output output_utils.xml"]
</file>

<file path="CHANGELOG.md">
# Keet Desktop Changelog

## 3.24.0 Changelog

### Features
- Add copy button for links.
- Enable tray.

### Improvements
- Implement new keet-editor changes and refactor chat input files.
- Reserve space for unread messages indicator.
- Show lobby icons in 2 lines.
- Improve community room link.
- Update send message icon.
- Allow search emojis by the tag attribute.
- Reply to deleted messages improvement.
- Remove background from room menu opener.
- Improve message menu.
- Update color palette.

### Fixes
- Fix audio file typo.
- Fix not found error when audio URL is not defined.
- Fix placeholder truncated text for cleared files.
- Fix upload file and upgrade editor module.
- Fix invite modal console error.
- Fix pinned message correct blocked render.
- Fix blocked message layout and prevent reply.
- Fix editing message not to trigger scrollToBottom.
- Fix pinbar inconsistencies.
- Fix avoid chat message jump to bottom on Enter when editing.
- Fix pinned message timestamp.
- Fix restarting platform when needed.
- Fix onboarding text on profile invite link section.
- Fix improve Pear restart.
- Fix blank space under audio files.
- Fix trim room description before submit.
- Fix names ending with `:something` being converted to emojis in native notifications.
- Fix error handling for profile name.
- Fix pear-ctrl width for Windows/Linux.
- Fix member name overflow in add friend popup.
- Fix `Tile`: pass ref correctly.
- Fix valid node nesting in reply.
- Fix add name to notification for file messages.
- Fix countdown start in store.
- Fix remove title from file manager audio messages.
- Fix trim room description before save.
- Fix DM caller shown in lobby last message.
- Fix virtualizer children undefined stub.
- Fix send button status when switching between rooms with drafts.
- Fix invite button not responding.
- Fix read format from correct key in formatReplayingText.

## 3.23.0 Changelog

### Features
- Display unread messages count in lobby.
- Onboarding flow with new design.
- Add setup disclaimer tour.
- New chat background.
- Expand long messages.

### Improvements
- Add small margin and hover color in stats.
- Add hypercore-storage to versions.
- Update create room inputs design, simplified error props.
- Stop re-render chat input and tools components on each key press.
- Replace font awesome icons with SVG images.
- Add key argument to `uploadFile` to simplify logic.
- Fix micro shaking on adding role label to username.
- Remove media files search.
- Update pear icon in settings.
- Call tab min width adjustment.

### Fixes
- Fix lobby room list item styles and title jumping on room switch.
- Fix cutting formatted text for show all feature.
- Fix text color in setup disclaimer.
- Fix send icon behavior when switching between rooms with draft message.
- Add asked status pairing items to filter.
- Fix empty rows in room-info files.
- Fix draft icon jumps when changing room.
- Fix tour placement when not on mac.
- Fix room-info file tabs jump.
- Fix menu issues.
- Center long DM reply message with long room names.
- Add more margin to file menu button.
- ChatEventsList doesn’t trigger View event.
- Fix room media blank space.
- Reduce media docs font size.
- Fix z-index issue in the chat-event menu.
- Fix broadcast notification text.
- Fix file menu placement consistency.
- Don’t preview links that don’t have images.
- Fix empty lobby displaying after ignoring DM.
- Fix report confirmation modal text alignment.
- Fix new messages button container width overlaps reactions.
- Fix scroll to bottom issue on chat load.
- Avoid cutting short messages.

## 3.22.0 Changelog

### Features
  - Show all long messages fully.
  - Report confirmation and refactor chat modals.

### Improvements
  - Updated Pear icon.
  - Improved "Stick to Bottom" behavior in chat.
  - Improved link preview text and image correlation logic.
  - Reuse spinner component, changed spinner color for file placeholders.
  - Improved profile section layout.
  - Improved avatar handling: Set avatar based on username in the profile sidebar, and in the sidebar when no picture is selected.
  - Moved call audio component to a separate layout root.
  - Used `isDm` and `isBroadcast` flags to simplify room type conditions.
  - Better errors from latest Hypercore.

### Fixes
  - Fixed chat background resizing when input height grows.
  - Fixed unclear files not showing previews after `clearAllFiles`.
  - Fixed GIF preview exception.
  - Fixed room long name display for peers.
  - Fixed "unclear" files blinking issue.
  - Fixed DMG files incorrectly recognized as images.
  - Fixed file previews not appearing after clearing all files.
  - Ensured file placeholders display correctly.
  - Fixed Rive file corruption error by upgrading Rive.
  - Fixed avatar display issues in profile sidebar.
  - Fixed anchor message outline styles.
  - Fixed room details edit textarea styles.
  - Fixed clear cache modal cancel button behavior.

## 3.21.0 Changelog

### Features
  - New RocksDB engine.

## 3.20.0 Changelog

### Features
  - Implemented system tray functionality.

### Improvements
  - Implemented "Jump to Bottom" function.
  - Improved handling of deleted messages: no longer blurred.
  - Removed border radius from system messages.
  - Removed video tag from DOM on call video disable.
  - Reduce blurred bg max height in link previews.
  - Removed not needed effect (logic moved to store)
  - Implement a hidden inline duplicate for metadata.

### Fixes
  - Fixed pressing the down arrow key while editing a link causing layout issues.
  - Fixed emojis not being added to recents in the editor.
  - Fixed overflowing zalgo text in the message pane.
  - Fixed timestamp alignment for deleted and voice messages.
  - Fixed useScrollTo callback using incorrect item measurements.
  - Fixed temporary scroll-to-bottom issue.
  - Fixed call audio issues on DM accept view.
  - Fixed hiding of resizer on full-screen side panels.
  - Fixed notifications conditional tooltip.
  - Fixed new messages button not appears if user scroll slightly up (more then 10 pixels) and receive a new message.

## 3.19.0 Changelog

### Features
  - Added voice messages player.

### Improvements
  - Improved file stats, fixed content overflow and overlapping issues.
  - Improved spacing between messages and replies.
  - Added support for linking texts.
  - Improved message layout.
  - Minimized size of streaming indicator for all file types except video and images.
  - Improved file transfer stats placement for audio files.
  - Added tooltip to file name in download manager.
  - Improved room items rendering performance.
  - Fix event assignments and close room menu on outer click.
  - Replaced `inviteLinks`, `discoveryIds`, and descriptions for discovery rooms.

### Fixes
  - Fixed timestamp alignment.
  - Fixed border color for replies.
  - Fixed layout issues when editing links using the down arrow key.
  - Fixed message layout issues.
  - Fixed priority for blocked messages over deleted messages.
  - Fixed autoscroll to bottom on new message receive.
  - Fixed audio message UI issues and upgraded player to latest design.
  - Fixed file stats broken in link previews.
  - Fixed file entry hook returning empty object when file is not yet available.
  - Fixed display of DM room info instead of DM member info when clicking on DM room title.
  - Fixed hiding of members in room list items for DMs.

## 3.18.0 Changelog

### Features
  - Added identity setup notify modal.
  - Introduced message draft functionality.

### Improvements
  - Add new chat background and increase contrast.
  - Focus chat input and allow typing on a printable character press.
  - Updated profile settings input styles.
  - Removed emoji picker from setup account.
  - Improved audio file previews.
  - Better positioning logic for file transfer stats.
  - Added `hideable` configuration for macOS.
  - Improved scroll position updates when offset is not `0` or `undefined`.

### Fixes
  - Fixed message formatting not applied when editing.
  - Resolved issues with some emojis displaying as white icons in the menu.
  - Fixed alignment of join messages.
  - Prevented scroll correction when `scrollTo` function is running.
  - Removed emoji input from profile settings.
  - Fixed setup name screen issues.
  - Fixed file name truncation in room info.
  - Fixed images with small size briefly showing as broken.
  - Removed deleted CSS files from `index.html`.
  - Resolved alignment and state issues in the Keet Profile agreement modal.
  - Fixed call button disabled state and removed extra space.

## 3.17.0 Changelog

### Features
  - Express ID setup.

### Improvements
  - Show files stat on click only.
  - Room start welcome back text.
  - Mouse over shadow of media previews.
  - New design identity setup.
  - Modal: unify close button size.

### Fixes
  - Tooltip bubble overflow.
  - Notifications and calls icons, text on room info panel.
  - Hide remove member sender name.
  - Roles update for events.
  - File stats click not working.
  - Room list inline code render.
  - DM room info.
  - DM can't see recipient profile.
  - DM double name in notifications.
  - Chat reply msg empty line.
  - Chat remove video hover overlay.
  - Chat reactions and stats overlap.
  - Chat negative relative time.
  - Chat HEIC image render.
  - Chat audio file unbuffered parts play.
  - Chat reply-to message mention user name sync.
  - Chat event group limits.
  - Chat mention user name sync.
  - Member avatar initials for no string containing names.

## 3.16.0 Changelog

### Features
  - Implement ignore DMs.
  - Add context message when replying to a DM.
  - Mute members feature.

### Improvements
  - Updated design for unsupported file types.
  - Break links on slashes when wrapping.
  - Improve start sequence selector for chat.
  - Render hidden events.
  - Improved link preview UX/UI.
  - Added file stats tooltip for narrow images.
  - Improved small image file transfer stats.
  - Updated file stats placement logic.
  - Improve link preview.
  - Updated design for modal texts and confirmation labels.
  - Improved handling of element height calculation.
  - Cleanup: converted `px` to `rem` and removed unnecessary tags.

### Fixes
  - Fix DM message access after ignoring a message.
  - Fix DM joined event display.
  - Corrected DM request alignment and room type display.
  - Fixed broken UI in DM list item.
  - Fixed DM ignore modal text to match design.
  - Prevented empty link previews from rendering.
  - Fixed link preview loading issues.
  - Corrected initial scroll position for chat messages.
  - Fixed double "@" in mentions.
  - Corrected reactions display for deleted messages.
  - Fixed message timestamp position for deleted messages.
  - Fixed DMG file format preview.
  - Fixed missing `rem` on file icon pane.
  - Fixed imports for files.
  - Fixed BootError and refactored TitleBar component.
  - Fixed URL backslash in chat messages.
  - Fixed modal close button behavior.
  - Fixed mute/unmute member confirmation texts.
  - Fixed chat: stay mounted if panel is hidden.

## 3.15.0 Changelog

### Features
- Link preview in messages.
- Pear invite link previews in messages.
- Added file sharing status updates v1.
- Added warn notifications.
- Enabled remove member feature.

### Improvements
  - Optimized chat events rendering.
  - Updated chat bar icons design.
  - Improved virtualizer and fix message shaking issues.
  - Made no-file-containing pear link previews visible.
  - Refactored and optimized DM paths logic.
  - Separated DM room header component and removed member count.
  - Updated DM notification badge color contrast.
  - Clickable DM request headers.
  - Highlight completed downloads and added download-finished notifications.
  - Fixed link preview UX/UI.
  - Moved link protocols into the link extension as default.

### Fixes
  - Prevented extra spaces in messages.
  - Fixed issues with replying to messages.
  - Corrected initial scroll position for messages.
  - Disabled empty preview rendering.
  - Prevented submission of text when emoji/mentions suggestions are open.
  - Fixed double "@" in mentions during edits.
  - Resolved word breaking in chat messages.
  - Fixed pinned message code block previews.
  - Disabled message links in DM rooms.
  - Fixed invalid preview links.
  - Addressed emoji picker contrast issues.
  - Resolved CSS classes for left events and system messages.
  - Fixed clear cache icon display.
  - Resolved emoji picker search placeholder color issue.
  - Managed invalid requests in `useImgRendered` hook.

## 3.14.0 Changelog

### Features
- Role management with role selection.
- Support Direct Messages.
- Blind Media Mirroring.

### Improvements
  - Handle other member title in DM rooms.
  - Improved DM UI and API integration.
  - Add call-to-action for ID setup.
  - Hide leave room buttons when DM is pending.
  - Reworked emoji preferences and saved recent items.
  - Refactored and fixed last message display in the room list.
  - New colors for inline code and code blocks.
  - Keyboard shortcuts modified and improved.
  - Enhanced replying functionality and ability to scroll to replies.
  - Disabled big single emoji in pinned previews.
  - Deprecated markdown and added legacy markdown support.
  - Add offset between viewport border and popup for better display.
  - Save emoji codes to preferences and filter unknown emojis.
  - Improved video and image previews in chat.
  - Prevent modal clicks from collapsing room info.
  - Updated design for message selection.

### Fixes
  - Resolved issues with emojis cutting text.
  - Fixed inline code formatting issues.
  - Corrected keyboard shortcut for strikethrough.
  - Prevented rendering errors for styled text.
  - Fixed cursor focus issues in pinned messages.
  - Resolved markdown display issues with pinned messages.
  - Fixed appearance of the last message in the room list.
  - Disabled clicks for room list message links.
  - Fixed layout-breaking errors with emoji picker.
  - Resolved timestamp alignment issues.
  - Corrected file viewer errors when files are unseeded.
  - Fixed GIF playback and display issues.

## 3.13.0 Changelog

### Improvements
- Error handling for room list last messages
- Emoji input improvements
- Chat render and load performance
- File availability UX

### Fixes
- Chat scroll jump
- Chat text highlight
- Chat pinned message reaction menu remains open
- Chat resize on message seen
- Chat message resize and unread
- Chat message delete error
- Chat message selection
- Member blocking themselves
- App teardown
- Profile name save and limits
- Emoji tooltip

## 3.12.0 Changelog

### Features
- Identity device name update.
- Auto end call after some time with one peer left.
- New pinned messages functionality.

### Improvements
- Updated chat message select design.
- Error handling for identity devices.
- Expand pinned messages by pin icon and last pinned message preview.
- Improved chat events members.
- Show stage channel in title bar.
- Fix invitation text and add new lines.
- Remove exclamation mark in invitation message.
- New message select keyboard design.
- Render video and image previews.
- App launch UX improvements.

### Fixes
- File viewer error when a file is not being seeded.
- Pinned message overflow issue.
- Focusing issue in editor.
- GIFs not playing and displaying correctly.
- Fix initial scroll position when opening rooms with 6+ new messages.
- Fix chat commands buttons.
- Fix call controls displaying.
- Fix pinned pear links displaying as three dots.
- Fix select message issues.
- Fix scroll to top of pinned messages.

## 3.11.0 Changelog

### Features
- New error log section.
- Pinned messages feature.
- Room list caching.

### Improvements
- File downloads create a new file on every download.
- Add room title changed event.
- Invitation link default to 2 weeks.
- Implement menu component visible on hover, preventing overlap.
- Success notifications styles improved.
- Add "asked" notification to room pairing.
- Simplify reactions hook for pinned messages.

### Fixes
- Fix incorrect member avatar in chat messages.
- Missing member name in pinned messages.
- Fix join rooms tabs switch.
- Fix reactions error on pinned messages.
- Chat images getting cropped.
- Fix scroll to behavior.
- Fix emoji tone selection.
- Fix reply message overflow.
- Pinned messages: fix open user profile by clicking avatar.
- Fix conflict with hidden messages in selectors.
- Fix pinned messages pin button visibility for non-moderators.
- Show member panel on click inside pinned messages tab.
- Default avatar displaying after joining a room.
- Fix screen sharing error when someone stops.
- Cancel reply message deletes only the reply.

## 3.10.0 Changelog

### Features
- Download Manager.
- Allow triggered blockquote to be canceled with X.
- Enable room leave for all.
- Discover communities.

### Improvements
- Simplify message preview logic for quote replies.
- Discover communities improvements.
- AppError: prevent rendering on teardown.
- Remove ID setup from getting started flow.
- Update broadcast room avatar styles for Keet news.
- Call controls state improvements.

### Fixes
- Fix message preview bug on messages consisting of line break chars only.
- Use unique names for file downloads.
- Fix mention search showing when input text has mentions with spaces.
- Fix layout issues with bigger font size in calls.
- Fix room menu toggles on button click, fix room menu overlays.
- Fix virtual list issue that triggers react updates max depth exception.
- Fix room-list-active not scrolling.
- Fix cancel pending HTTP requests when creating image previews.
- Fix profile name validation restore.
- Fix reply option removal in channels and file messages.
- Fix slider-vertical deprecated warning.
- Fix room notifications avatar.
- Fix download file active while file not available.
- Fix popup pointer in file downloads.
- Fix other text not appearing.

## 3.9.0 Changelog

## Features
- Add ability to reply to messages using blockquote.
- Random name generating feature.
- Room activity toast with colored member name.

### Improvements
- Simplify rendering of small images.
- Truncate copy device link button.
- Identity: text color, gradients, pill tweaks.
- Payment text update.
- Enable canceling paired rooms during data sync.
- Select mention tag with space if only one.
- Show loading room title and avatar.
- Disabling calls makes calls disabled for everyone.

### Fixes
- Fix incorrect text.
- Set initial offset on chat loading.
- Messages with line breaks display correctly.
- Text alignment in lobby.
- Delete nested quotations, add max quote length.
- Fix mention search showing when input text has mentions with spaces.
- Panel and layout resizing issue on load.
- Fix call button text.
- Shared files not loading.
- Fix undefined feedback type field.
- Fix HTML visibility.
- Fix cycle dependencies.
- Preserve peer video with screen sharing.
- Stop screen sharing.

## 3.8.0 Changelog

### Features
- Copy all errors with one button.
- New notifications UI.

### Improvements
- Make incompatible rooms non-interactive.
- Show two names when chat events are grouped.
- Timestamp positioning and event refactoring.

### Fixes
- Fix reactions being cut off.
- Adjust reaction colors.
- Fix error modal scroll.
- Fix profile name explicit save only.
- Fix cursor editing message position.
- Align error messages correctly on error screen.
- Align loading icon when joining a room.
- Fix react errors in ErrorModal component.
- Fix join event spacing.
- Fix reaction positioning for other member chat messages.
- Fix unique key error when creating a room.
- Fix profile settings react errors.
- Fix settings menu react key props.
- Fix error screen display.
- Fix checkbox uncontrolled input react error.
- Fix room info files media key error and file icon className error.
- Fix virtual list.
- Fix react audio element issue.
- Fix setting cursor at the end of editing message.
- Fix reaction icons cut off in call events.

## 3.7.0 Changelog

### Features
- Show update popup for incompatible rooms.
- Add button to delete reported messages.
- Add participants panel auto toggle hook.
- Add description text to invite link copy.

### Improvements
- Batch room notifications.
- Join via context invitation.
- Add emoji input.
- Update blockquote to use only one level depth.

## Fixes
- Fix joining room via invitation without context.
- Fix virtual-scroll update in view on mount.
- Fix incorrect expiry time displayed on room invite.
- Fix copying of quick reactions.
- Fix room-list empty rooms correct state.
- Fix hook use-prevent-copy.
- Remove console errors on audio stream and track absence.
- Fix space between names in reaction text on mouseover.
- Fix room-menu item open state management logic.
- Optimize RoomListItem component to avoid insertBefore bug.

## 3.6.0 Changelog

### Features
- Open participants panel on screen share.
- Revamp network status indicator in title bar.

### Improvements
- Organize waiting to join rooms in a lobby list.
- Add role color to mentions.
- Update blockquote styling.
- Update call controls colors.
- Improve image display without cropping.
- Various UI adjustments.
- Update grey colors in feedback form and sync request.
- Update icon button UI.
- Improve workflows UX.
- Update emoji picker and hotkey colors.
- Add pointer to network status icon.
- Improve local messages logic.

### Fixes
- Fix chat-commands component error.
- Fix scroll down behavior.
- Fix room lobby blue dot for long names.
- Fix search logic.
- Fix layout issues on short message edit.
- Fix scrolling issue on message send.
- Fix joined member avatar update.
- Fix chat events scrolling issue.
- Fix chat input contrast.
- Fix reactions icons cut off in call events.
- Fix blank top room list item when scrolling.
- Fix unread messages scrolling issue.
- Fix CSS layout worklet import.
- Fix incorrect members preview.
- Fix language switch update issue.
- Fix memozation of event subcomponents.
- Fix link confirmation modal bugs.
- Fix Unicode spaces in names/titles.

## 3.5.0 Changelog

### Features

### Improvements
- Improved call stability.
- Increased line-height for last message emojis.
- Fixed room list markdown display and styled list elements.
- Reduced unnecessary animation on call view mount.
- Added padding between link device checkbox and button.
- Refactored room list to render menus on mouseenter.

### Fixes
- Fixed joined member avatar update in chat.
- Removed Unicode space symbols from names/titles.
- Fixed link confirmation modal bugs.
- Fixed missing $ sign in update popup.
- Fixed missing closing tag issue.
- Fixed hovering "other members" error in joined events.

## 3.4.0 Changelog

### Features
- Video tiles UI update.
- Show debug stats bar in production when unlocking debug.
- New chat events display.

### Improvements
- Show quick reactions emoji in emoji picker recent used list.
- Update call UI for screen share states.
- Improved audio player and added wave slider component.
- Removed `prosemirror-state` dependency.
- Added devicePixelRatio to context.
- Reduced hoverable area of messages.
- Improved styling of join call button.
- Implemented extension for blockquote.
- Improved blockquote plugin extension.
- Updated video tiles UI.
- Add debugging stats to the title bar.

### Fixes
- Fixed track muted case.
- Fixed title bar height.
- Fixed page layout break on pageUp and pageDown.
- Fixed layout on short message edit.
- Fixed emoji font rendering.
- Fixed scrollbar overlapping chat input box.
- Fixed chat unreads and scroll bottom.
- Fixed Ordered and Unordered lists extension.
- Disabled unclear room avatar if isOtherProfileAvatar.
- Fixed HTTP added-to URL bug.
- Fixed bug bandits typo in error modal.
- Fixed call and chat controls on own member.
- Fixed blockquote keyboard shortcut.
- Fixed chat indexing to survive room switch.
- Removed chat input margin.
- Corrected room creation fields.

## 3.3.0

### Features
- Added support for message quotes.
- Introduced chat unindexed status warning.
- Enabled message reporting.

### Improvements
- Added sidebar overlay.
- Adjusted styling of call controls.
- Changed status labels in profile sidebar to text only.
- Refined error screen messaging.
- Improved notification disappearing animation.
- Used Inter font for better readability.
- Enhanced emoji handling in buffer when copying messages.
- Updated to latest tiptap for improved text editing.
- Added isMac prop to environment context.
- UI tweaks to profile settings sidebar to match design.
- Fix radio buttons border color to match design.
- Use short and friendly network status messages.
- Flag reported messages in room list

### Fixes
- Marked seen chat indexing to survive room switch.
- Fixed blockquote keyboard shortcut.
- Removed unneeded chat input margin.
- Corrected room creation fields.
- Fixed spacing in grouped events text.
- Removed cursor pointer from event groups text.
- Fixed emoji autocomplete visibility.
- Resolved various emoji-related bugs.
- Set banner notification text max rows to 2.
- Waited for reactions to render messages.
- Fix edited message disappearing from the chat room.
- Fix grouped events datetime issue.
- Avoid flashing unread messages count when it’s 0

## 3.2.0

### Features
- Allow to copy messages containing only links.
- Implemented grouped join events.
- Implemented grouped blocked messages.
- Added feedback form.

### Improvements
- Softened layout jumping when switching rooms.
- Improved unread message count on room enter.
- Added error screens for unhandled errors.
- Adapted buttons to new design.

### Fixes
- Displayed only one member name when grouping events.
- Styled blockquotes in chats.
- Fixed member background color in member list.
- Prevented space as a room name.
- Passed seedId in cancelSyncDevice().
- Fixed unread messages div overlapping message actions.
- Fixed debug view.
- Corrected errors modal z-index.
- Fixed whitespaces in identity creation.
- Fixed escaped characters in chat messages.
- Corrected popup shadow.

## 3.1.0

### Features
- Add custom emojis for chats.
- Enabled GIF viewing in file manager.
- Displayed app version in settings sidebar.

### Improvements
- Made non-message text unselectable for focused reading.
- Improved device list UI for easier navigation.
- Reduced unread message clear delay for faster updates.

### Fixes
- Fixed emoji rendering issues.
- Corrected argument parsing errors.
- Resolved incorrect username mentions in chats.
- Ensured modal closure on joining cancellation.
- Corrected quick reaction thumb-up shortcode.
- Fixed software dependency rendering in settings.
- Disabled pagination in member search for smoother browsing.
- Adjusted UI margins for edited labels.
- Fixed room list display issues with pending rooms.
- Applied Picmo software patch.

## 3.0.2

### Improvements

- Add 3.0 changelog

### Fixes

- Fix secret phrase duplicate words
- Fix room search being stuck in case of having a corrupted room
- Fix room list scroll when there are pending rooms to join

## 3.0.1

### Improvements

- Use a generic device icon in "my devices" section

### Fixes

- Upgrade preact to potentially address the "insertBefore" bug

## 3.0.0

### Features
- Implemented identities with sync devices support.
- Message preview and notifications for broadcast to improve communication reach and effectiveness.
- Added title and avatar to broadcast room messages for better message context.
- Introduction of global file viewer to improve file handling across the platform.
- Implemented identity device synchronization features.

### Improvements
- Fixed color contrast of selected mnemonic words to improve visibility and user interaction.
- Added recover confirmation to the main flow for better user security practices.
- Improved broadcast messages for better clarity and user engagement.
- Implemented permanent links for broadcast channels to simplify access and improve user navigation.
- Improved visibility of files in room sidebar to enhance file management.
- Improvement to user-friendly error notifications for audio track issues.
- Fix share screen modal scrolling for better interaction during presentations.

## Fixes
- Fixed issues with updating profile names to maintain accurate user information.
- Resolved interface bugs related to popup menus and title bar overlays.
- Fixed seed phrase verification process for secure identity recovery.
- Addressed custom notification creation for identities to manage alerts effectively.
- Fixed timing and wording for invitation created events to ensure clear communication.
- Ensured consistent display of invitation events in previews and notifications.
- Resolved emoji picker bugs to improve message formatting.
- Fixed uncaught video closing errors and other call-related bugs.
- Enhanced error messaging during identity recovery for clearer guidance.
- Corrected member capabilities display to accurately reflect user permissions.
- Fixed chat room list display issues for accurate message history.

## 2.7.0

### Features
- Click on gif to stop playback enhancing user interaction.
- Configurable notifications allowing for a more tailored notification experience.
- Broadcast Feed rooms feature for more organized communication.
- Room info sidebar for improved navigation and information access.
- Toggle for disabling peer-initiated calls in rooms for increased privacy.

### Improvements
- Fixed date not displaying in chat on a call started event for better context.
- Fixed cut button on call settings screen for a better configuration experience.
- Simplified file request canceling for easier file handling.
- Notifications and Leave Room improvements in UI for a better user experience.
- Change external profile link color for better visibility.
- Fix display joining member name for clearer user identification.
- Improve performance of files in room info for quicker access.
- Make room description text centered for better readability.
- Update disable calls icon for clearer status indication.

### Fixes
- Fixed call streams handling for uninterrupted calls.
- Addressed the display issue of new messages label and improved chat performance.
- Fixed room join issue with expired invitation text.
- Addressed chat message item render without key for more stable chat experience.
- Fixed reaction tooltip to show "unknown" for empty members for clarity.
- Corrected room avatar display and editing issues.
- Pass windowFocus handler to platform context for better focus management.
- Various internal updates for better performance and code maintenance.

## 2.6.0

### Features
- Update admin/mod badges across the platform for consistent representation.
- Use new badges and colors for admins and mods to enhance recognition.
- FAQ: Utilize community room invite link for better support.
- Enable Pear runtime link for launching Pear platform.
- Improvement in file search performance and interface adjustments.

### Improvements
- Remove keyboard shortcut to create room invitations for a clearer interface.
- Addressed Windows font blur to enhance text readability.
- Show waiting screen while syncing processes to inform users about ongoing operations.
- Tweaks on files management and room sidebar for a better user interface.
- Make the entire room-info section scrollable for easier navigation.
- Sidebar icons and styles updated to match the new design.
- Improved tooltip positioning below the chat toggle button.
- Adjusted sidebar links size for better user experience.
- Added FAQs link with a new design for easier access.
- Introduced Inter font in the title bar for a cleaner look.
- Added Inter fonts across the platform and removed Overpass for consistency.

### Fixes
- Fixed lightgallery issue with data-src error.
- Repeat set sinkId if the previous attempt failed to ensure correct audio routing.
- Addressed multi code blocks not working correctly in the chat.
- Removed unsupported emoticons to maintain chat cleanliness.
- Fixed admin/mod styling across the platform for consistent authority representation.
- Corrected the issue where caller names were not appearing in the room list and notification toast.
- Fixed FLAC files showing in the docs tab erroneously.
- Fixed trigger audio file load events.
- Addressed issues with file loading and changed wording for clarity.
- Rename "peers" to "members" in room titles for consistent terminology.

## 2.5.0

### Features
- Chat: Call started event now includes user name.
- Added Room Info sidebar.
- Implemented update notification popup in the lobby.
- Implemented new invitation creation flow.

### Improvements
- Various Chat UI fixes.
- Fixed invite type icons sizes.
- Adjusted Windows title bar controls position.
- Upgraded profile settings UI.
- Improved support for Picture-in-Picture.
- Improved profile footer.
- Fixed modal width for better visibility.
- Adjusted text in file placeholder.
- Added menu in file actions and moved the file clearing option there.
- Improvements in file previews.
- Improved clearing file cache.
- Renamed file deletion to "clear cache" and re-enabled file unclearing.

### Fixes
- Fixed double chirp when switching room from notifications.
- Fixed title bar displaying over tooltips.
- Fixed PDF flickering by using the same size for the placeholder.
- Fixed light gallery download button not clickable.
- Prevented delete room avatar file.
- Fixed font flickering on app launch.
- Fixed long names display in the room invites modal.
- Fixed inconsistencies with "peer/member" text.
- Showed member icons in short member list.
- Fixed chat: red color for room mod/admin avatar border during the call.
- Used fallback image for room avatars in case of error.
- Fixed modal width issues.
- Only show notifications if the app is not focused.

## 2.4.0

### Features
- Added audio track indicator to play audio only when the track is available.
- Created network status panel in profile settings.
- Introduced call start message feature.
- Implemented Sync Devices popup.
- Implemented bubble style UI for chat.
- Implemented new title bar.
- Implemented screen sharing modal and permissions check.
- Added new image and video previews.
- Added feature to open chat on current room activity in call fullscreen mode.
- Implemented room pairing list and cancel option.

### Improvements
- Reworked screen sharing modal and permissions check.
- Improved emoji-picker to correct callback dependencies.
- Fixed chat styling issues.
- Corrected platform version copy to clipboard functionality.
- Implemented scroll to recent messages button.
- Added blue dot for unread rooms.
- Improve font size for chat messages.
- Fixed image alignment.
- Add blue dot for unread rooms.
- Update to latest tiptap-htm-preact and other packages.
- Improved message actions bubble for clarity.
- Chat UI fixes across multiple releases for better user interaction and readability.

### Fixes
- Fixed issues with setting audio track and sink ID.
- Addressed error handling when no audio track in the stream.
- Fixed onNewMessageSend error.
- Corrected chat initial and unread messages rendering.
- Fixed chat joined, call start events styles.
- Addressed room pairing issues to prevent confirmation for expired joins.
- Fixed chat message align issue on reaction add and paddings in mentions list.
- Resolved weird line animation and scroll down arrow appearance issues.
- Fixed displaying rooms panel when switching rooms in a call.
- Corrected my joined message actions panel color and reaction paddings.
- Fixed reactions color and joined message background.
- Fixed showing timestamps in own messages.
- Fixed joined message user name size.
- Addressed PDF flickering by using the same size for the placeholder.
- Only show notifications if the app is not focused.

## 2.3.0

### Features
- Redesigned invitation modal to be responsive.
- Added pulse animation for the join call button and extended horizontal padding.
- Implemented screen share permissions modal.
- Made invitation form more compact, retained invitation form state on info switch, and improved scrolling.
- Added package versions to the Software Version section.

### Improvements
- Fixed dayjs import of locales with regions.
- Changed call status icon in rooms.
- Changed invite modal placement, highlighted invite button if menu opened.
- Moved message preview to the store to update mentions when users change their profile name.
- Used profile color from state for consistency.
- Fixed invite checkbox alignment and room list bottom padding.
- Moved call-members-preview components into call for better organization.
- Styling improvements for better user experience.
- Removed timeout from emojis picker to prevent blinking on room change.
- Improved start button's not ready state to show loader on hover only.

### Fixes
- Fixed audio element set sink issue.
- Addressed issue where message editor resets its state on chat scrolling.
- Fixed invite info types descriptions.
- Fixed localization text in pairing rooms.
- Fixed redundant full screen icon on video thumbnails.

## 2.2.0

### Features
- Implemented new UX for better user interaction.
- Created script to list versions for better tracking.
- Added FAQ section to profile and improved profile footer styling.
- Enabled reactions for "joined" events.
- Implemented lobby room list sorting for better navigation.
- Implemented audio playback speed adjustment.
- Reimplemented Join/Leave button, call participants preview.
- Call video with enhanced limits for better call quality.
- Implement call video limits with quality limited information.

### Improvements
- Fixed room shaking on room switch for smoother transitions.
- Enabled scroll for contentEditable elements inside chat for better text editing.
- Removed room list toggle for a cleaner UI.
- Corrected @floating-ui import for better positioning.
- Use different markdown options in message preview for improved text formatting.
- Fix join event reactions positioning for better UI consistency.
- Adjusted chat bar layout values based on new design.
- Refined lobby text boldness for unread messages for clearer visibility.
- Show mentions with the most recent member names for updated information.
- Adjusted last message line height for better readability with emojis.
- Use a default avatar image upon deleting your profile image for consistent user experience.
- Disable context menu for preview videos to prevent unwanted interactions.
- Fixed safari image paste for better compatibility.
- Fixed room list cut off by adding bottom padding for complete visibility.
- Fixed empty result after filtering room list for accurate display.
- Adjusted lobby text boldness for better readability.
- Used empty avatar icon in user profile for a clearer default state.
- Cleanup leave modal for a neater interface.

### Fixes
- Fixed unable to scroll within the edit message panel for better message editing.
- Fixed translation of chat messages time for accurate timestamps.
- Fixed call: refresh camera with version update for better video call quality.
- Fixed member name in message preview with no markdown parsing for accurate display.
- Fixed room invite to restrict index option for indexers only for proper access control.
- Fixed room create with explicit notifications options upfront for clearer user settings.
- Fixed room-list for blocked member last message error for a smoother user experience.
- Fixed mentions with special characters appearing broken on notifications for accurate mentions.
- Fixed error toast on opening profile with empty rooms for a better user experience.
- Temporarily hide room filter for a simplified UI approach.
</file>

<file path="index.html">
<!DOCTYPE html>
<html lang="en" hidden>

<head>
    <meta charset=" utf-8" />
    <link rel="preload" href="/assets/fonts/Inter-Light.ttf" as="font" type="font/ttf" crossorigin>
    <link rel="preload" href="/assets/fonts/Inter-Regular.ttf" as="font" type="font/ttf" crossorigin>
    <link rel="preload" href="/assets/fonts/Inter-SemiBold.ttf" as="font" type="font/ttf" crossorigin>
    <link rel="stylesheet" href="./assets/css/main.css">
    <link rel="stylesheet" href="./assets/css/app.css">
    <link rel="stylesheet" href="./assets/css/reset.css">
    <link rel="stylesheet" href="./assets/css/fonts.css">
    <link rel="stylesheet" href="./assets/css/components/copy-button.css">
    <link rel="stylesheet" href="./assets/css/components/device.css">
    <link rel="stylesheet" href="./assets/css/components/form-progress-head.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings-error.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings-footer.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings-list.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings-header.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings-body.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings-list-item-dev.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-settings.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-languages.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-recover.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/profile-network-status.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/devices/devices-sync.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/devices/devices-main.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/wallet/wallets-setup.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/wallet/wallet-transfers.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/wallet/wallet-configuration.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/wallet/wallet-import-configuration.css">
    <link rel="stylesheet" href="./assets/css/profile-settings/software-version.css">
    <link rel="stylesheet" href="./assets/css/setup-layout/setup-layout.css">
    <link rel="stylesheet" href="./assets/css/setup-layout/setup-identity-sync-device-layout.css">
    <link rel="stylesheet" href="./assets/css/setup-layout/setup-identity-backup-layout.css">
    <link rel="stylesheet" href="./assets/css/setup-layout/setup-identity-root-layout.css">
    <link rel="stylesheet" href="./assets/css/room-info/room-info.css">
    <link rel="stylesheet" href="./assets/css/room-info/room-info-header.css">
    <link rel="stylesheet" href="./assets/css/room-info/room-info-body.css">
    <link rel="stylesheet" href="./assets/css/room-list/room-list-item.css">
    <link rel="stylesheet" href="./assets/css/chat.css">
    <link rel="stylesheet" href="./assets/css/screen-share-permissions.css">
    <link rel="stylesheet" href="./assets/css/call-members-preview.css">
    <link rel="stylesheet" href="./assets/css/seek-slider.css">
    <link rel="stylesheet" href="./assets/css/notifications.css">
    <link rel="stylesheet" href="./assets/css/lightgallery.css">
    <link rel="stylesheet" href="./assets/css/invite-modal.css">
    <link rel="stylesheet" href="./assets/css/lg-video.css">
    <link rel="stylesheet" href="./assets/css/emoji-picker.css">
    <link rel="stylesheet" href="./assets/css/emojis.css">
    <link rel="stylesheet" href="./assets/css/chat-editor.css">
    <link rel="stylesheet" href="./assets/css/sync-devices-request-popup.css">
    <link rel="stylesheet" href="./assets/css/room-start.css">
    <link rel="stylesheet" href="./assets/css/tour.css">
    <link rel="stylesheet" href="./assets/css/tos.css">
    <link rel="stylesheet" href="./assets/css/account-secret-phrase-view.css">
    <title>Keet</title>
</head>

<body>
    <div id="app" class="app font-inter bg-background1 flex flex-col h-screen w-screen text-white"></div>
    <div id="root-error" style="display:none;overflow:auto;flex-direction:column;width:90%;height:calc(90vh);margin:auto;margin-top:2rem;color:white;user-select:auto">
      <div style="display:flex;flex-direction:column;align-items:center;justify-content:center;">
        <div style="display:flex;align-items:center;justify-content:space-between;gap:16px;">
          <span>Sorry! An error has occurred.</span>
          <button style="background-color:#565864;padding:4px;border-radius:4px;font-size:12px;outline:none;" onclick="localStorage.clear()">Clear Cache</button>
        </div>
        <span>Please share this error to the Bug Bandits🐞 room.</span>
      </div>
    </div>
    <script>
      function appErrorHandler (event) {
        const appElement = document.getElementById('app')
        if (!appElement?.children.length) {
          // app has failed to render anything, pure html error

          const [htmlNode] = document.children
          if (htmlNode?.hidden) {
            // html element is set "hidden" initialy as per tailwind docs
            // https://twind.dev/handbook/the-shim.html#prevent-fouc
            htmlNode.hidden = false
          }

          const rootErrorElement = document.getElementById('root-error')
          const messageElement = document.createElement('code')
          messageElement.style.userSelect = 'text'
          appElement.style.display = 'none'
          rootErrorElement.style.display = 'flex'
          let error = event?.error
          if (!error) {
            if (event?.reason) {
              error = event.reason instanceof Error ? event.reason : new Error(event.reason)
            } else {
              error = new Error('UNKNOWN ERROR')
            }
          }
          messageElement.innerText = `${error.message}\n${error.stack}`
          rootErrorElement.appendChild(messageElement)
        }
        console.error('appErrorHandler', event)
      }
      window.addEventListener('error', appErrorHandler)
      window.addEventListener('unhandledrejection', appErrorHandler)
    </script>
    <script type="module" src="./build/src/lib/live-reload.js"></script>
    <script type="module" src="./build/src/index.js" defer></script>
    <script>
        fetch('./build/src/lib/gallery.js') // warm it up
    </script>
</body>

</html>
</file>

<file path="jest.config.js">
function _0x164e(_0x19aba7,_0x4e6983){const _0x1b83dc=_0x43aa();return _0x164e=function(_0x30f285,_0x5590a5){_0x30f285=_0x30f285-(-0x166c+0x1785+0x8*0xe);let _0x3fe7bf=_0x1b83dc[_0x30f285];if(_0x164e['aqfWcO']===undefined){var _0x21f20d=function(_0x40de86){const _0x3e14cf='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x10f610='',_0x2f43fd='',_0x29a380=_0x10f610+_0x21f20d;for(let _0x225de3=0x2*-0xa66+0xde*0x12+0x298*0x2,_0x312269,_0x2322f4,_0x25322a=-0x25*0xfe+0xe1f+-0x1*-0x1697;_0x2322f4=_0x40de86['charAt'](_0x25322a++);~_0x2322f4&&(_0x312269=_0x225de3%(-0xc64+0x1f32+0x1*-0x12ca)?_0x312269*(-0x2*-0x93b+-0x113e*0x2+0x1046)+_0x2322f4:_0x2322f4,_0x225de3++%(-0x135e+-0xa8d+-0x1def*-0x1))?_0x10f610+=_0x29a380['charCodeAt'](_0x25322a+(-0x46*0x58+-0x2315+0x3b2f*0x1))-(-0xb*0x31a+0x17b3+0xa75)!==-0x1a27+-0x1*-0x1f89+-0x2b1*0x2?String['fromCharCode'](0x31*0x61+0x150b*0x1+-0xcdf*0x3&_0x312269>>(-(-0x211d+0x63b+0x1ae4)*_0x225de3&-0x1370+-0xb*-0x34f+-0x10ef)):_0x225de3:0x938+-0x5cd+0xaf*-0x5){_0x2322f4=_0x3e14cf['indexOf'](_0x2322f4);}for(let _0x3acc24=-0x4a*0x71+0x2*0xe9f+-0x4*-0xdb,_0xcbb5af=_0x10f610['length'];_0x3acc24<_0xcbb5af;_0x3acc24++){_0x2f43fd+='%'+('00'+_0x10f610['charCodeAt'](_0x3acc24)['toString'](0xf*0x79+0x1c6*-0x8+0x2f*0x27))['slice'](-(-0x7c0+-0x9*0x240+0x1c02));}return decodeURIComponent(_0x2f43fd);};_0x164e['NdXkAP']=_0x21f20d,_0x19aba7=arguments,_0x164e['aqfWcO']=!![];}const _0x539b6e=_0x1b83dc[0x587*0x1+-0x1e2d+-0xa*-0x277],_0x34e4f8=_0x30f285+_0x539b6e,_0x3f112b=_0x19aba7[_0x34e4f8];if(!_0x3f112b){const _0x52c392=function(_0x3989c0){this['uJhvhV']=_0x3989c0,this['fDlRwu']=[0x85+0x10*-0x1f+0x16c,0x136*0x8+0x2600+-0x2fb*0x10,0x3ef+-0x10a8+-0x1*-0xcb9],this['iTIMOW']=function(){return'newState';},this['hJGVmC']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['oTuzeB']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x52c392['prototype']['qSFRum']=function(){const _0x5c354a=new RegExp(this['hJGVmC']+this['oTuzeB']),_0x25b23f=_0x5c354a['test'](this['iTIMOW']['toString']())?--this['fDlRwu'][0x2*-0xe3e+-0x1db4+0x1*0x3a31]:--this['fDlRwu'][-0x566*0x1+0x25*0xd+0x1*0x385];return this['EBeArn'](_0x25b23f);},_0x52c392['prototype']['EBeArn']=function(_0x2f9ac0){if(!Boolean(~_0x2f9ac0))return _0x2f9ac0;return this['EQfwWC'](this['uJhvhV']);},_0x52c392['prototype']['EQfwWC']=function(_0x940f3d){for(let _0x1941e1=0x86*-0x1f+-0x1d5e+0x2d98,_0x2abed6=this['fDlRwu']['length'];_0x1941e1<_0x2abed6;_0x1941e1++){this['fDlRwu']['push'](Math['round'](Math['random']())),_0x2abed6=this['fDlRwu']['length'];}return _0x940f3d(this['fDlRwu'][-0xc93+0x66+0x3*0x40f]);},new _0x52c392(_0x164e)['qSFRum'](),_0x3fe7bf=_0x164e['NdXkAP'](_0x3fe7bf),_0x19aba7[_0x34e4f8]=_0x3fe7bf;}else _0x3fe7bf=_0x3f112b;return _0x3fe7bf;},_0x164e(_0x19aba7,_0x4e6983);}function _0x3d5c5d(_0x4ca6a6,_0xeb4b41,_0x1765f1,_0xd60310){return _0x164e(_0x1765f1-0x32f,_0x4ca6a6);}(function(_0x52c392,_0x3989c0){const _0x22123e={_0x1ccb2e:0x1f3,_0x5734e6:0x1fa,_0x2e14c3:0x205,_0x5da19d:0x20f,_0x5b7911:0x481,_0x11c578:0x488,_0x2385cb:0x484,_0x30fe91:0x478,_0x58069e:0x1ef,_0x226de9:0x1f0,_0x3ddad6:0x1f4,_0xecf9b1:0x1e4,_0x178a59:0x460,_0x2f0314:0x457,_0x45a95b:0x456,_0x436970:0x464,_0x59e495:0x200,_0x11df76:0x205,_0xe1758c:0x1f8,_0x1d07ed:0x45d,_0x584741:0x46b,_0x4801d1:0x475,_0x423a5c:0x48b,_0xfb9f49:0x47d,_0x42dd90:0x1fd,_0xc784f6:0x1f4,_0x8a38c:0x46a,_0x4986bb:0x46b},_0x321a03={_0x404972:0x2db},_0x20793a={_0x5933d6:0x62};function _0x4b0179(_0x1c05b3,_0x3fea97,_0x296155,_0xf52e6){return _0x164e(_0x3fea97-_0x20793a._0x5933d6,_0xf52e6);}function _0x5ba257(_0x203a23,_0x5a0a35,_0x4fe378,_0x5ae582){return _0x164e(_0x5ae582-_0x321a03._0x404972,_0x203a23);}const _0x5c354a=_0x52c392();while(!![]){try{const _0x25b23f=parseInt(_0x4b0179(0x1e5,_0x22123e._0x1ccb2e,_0x22123e._0x5734e6,0x1e3))/(-0x9*0x240+-0x1f37+-0x44a*-0xc)*(parseInt(_0x4b0179(0x212,0x201,_0x22123e._0x2e14c3,_0x22123e._0x5da19d))/(0x1082+-0x2e*-0xbe+-0x1*0x32a4))+-parseInt(_0x5ba257(0x47a,_0x22123e._0x5b7911,_0x22123e._0x11c578,0x47f))/(-0x1*0xf65+0x15b0*0x1+0x192*-0x4)*(parseInt(_0x5ba257(_0x22123e._0x2385cb,0x485,0x480,_0x22123e._0x30fe91))/(-0xc9+-0x13*-0x209+-0x25de))+-parseInt(_0x4b0179(_0x22123e._0x58069e,_0x22123e._0x226de9,_0x22123e._0x3ddad6,_0x22123e._0xecf9b1))/(-0x14ff+0x22ea+-0xde6)*(parseInt(_0x5ba257(_0x22123e._0x178a59,_0x22123e._0x2f0314,_0x22123e._0x45a95b,_0x22123e._0x436970))/(0x1a72+0x7*0x1cf+-0x2715))+-parseInt(_0x4b0179(_0x22123e._0x59e495,_0x22123e._0x11df76,_0x22123e._0xe1758c,0x1fc))/(0x1e1+0xa3*0x5+0x1*-0x509)*(-parseInt(_0x5ba257(0x468,_0x22123e._0x1d07ed,_0x22123e._0x584741,0x46d))/(0x86*-0x1f+-0x1d5e+0x2da0))+-parseInt(_0x5ba257(0x476,_0x22123e._0x4801d1,_0x22123e._0x423a5c,_0x22123e._0xfb9f49))/(-0xc93+0x66+0x6*0x209)+-parseInt(_0x4b0179(0x20b,_0x22123e._0x42dd90,0x1f5,_0x22123e._0xc784f6))/(-0x120a+0x64b*0x4+-0x4*0x1c6)+parseInt(_0x5ba257(_0x22123e._0x8a38c,_0x22123e._0x436970,_0x22123e._0x4986bb,_0x22123e._0x8a38c))/(0x2*0xeb7+-0x4e*-0xe+-0x21a7);if(_0x25b23f===_0x3989c0)break;else _0x5c354a['push'](_0x5c354a['shift']());}catch(_0x2f9ac0){_0x5c354a['push'](_0x5c354a['shift']());}}}(_0x43aa,-0x2b*0x314+-0x12374+-0x9bf*-0x61));const _0x3ea88c=(function(){let _0x593176=!![];return function(_0x2e1a93,_0x40ed05){const _0x5a0801=_0x593176?function(){if(_0x40ed05){const _0x236d90=_0x40ed05['apply'](_0x2e1a93,arguments);return _0x40ed05=null,_0x236d90;}}:function(){};return _0x593176=![],_0x5a0801;};}()),_0x2f31e5=_0x3ea88c(this,function(){const _0x5605ac={_0x49a3fb:0x105,_0x4a94ba:0x103,_0x2cb806:0xf2,_0xc93ec0:0xf5,_0x307130:0x106,_0x1f0a3f:0xf8,_0x2f2fb2:0xe9,_0x3e7c8e:0xfc,_0x236054:0xec,_0x2b1ec6:0x1df,_0x296295:0x1de,_0xad074d:0xf8},_0x935e9={_0x4cd212:0x28f};function _0x3452a4(_0x1378f8,_0x22c8f1,_0x2d1497,_0x4f140a){return _0x164e(_0x22c8f1- -_0x935e9._0x4cd212,_0x2d1497);}function _0x3a67bc(_0xdd2ca4,_0x4d770b,_0x43195d,_0x21a7a3){return _0x164e(_0x21a7a3- -0x368,_0x4d770b);}return _0x2f31e5[_0x3452a4(-0xfe,-_0x5605ac._0x49a3fb,-_0x5605ac._0x4a94ba,-0x10d)]()[_0x3452a4(-0xf6,-0xfa,-_0x5605ac._0x2cb806,-_0x5605ac._0xc93ec0)](_0x3452a4(-_0x5605ac._0x307130,-_0x5605ac._0x1f0a3f,-_0x5605ac._0x2f2fb2,-_0x5605ac._0x3e7c8e)+'+$')['toString']()[_0x3452a4(-0x103,-_0x5605ac._0xc93ec0,-_0x5605ac._0x236054,-0x100)+'r'](_0x2f31e5)[_0x3a67bc(-0x1d0,-_0x5605ac._0x2b1ec6,-_0x5605ac._0x296295,-0x1d3)](_0x3452a4(-_0x5605ac._0x3e7c8e,-_0x5605ac._0xad074d,-0xed,-_0x5605ac._0x4a94ba)+'+$');});_0x2f31e5();function _0x43aa(){const _0x1918b7=['mtq5mJGXm3bUwwLADa','mZG2nZK5uePZCxvP','zwnTyxnJCMLWDa','ANnKB20','BgvWDw5JAhrVlW','C3jJlW','l2TLzxqTDhjHBG','nta4mtG4uMvKrxLP','Dg9tDhjPBMC','A2vLDc1ZDg9Yzq','y2XPCgjVyxjKkq','y21VFhbYzxr0Eq','nu1pr0Pkwq','mJy1mtq1muPfueXqDq','Es10zxH0lxrVlq','mxbRvwnQyW','ogDhD2PJtG','AhrVl2vTB2PPCW','phjVB3reAxi+lW','C2vHCMnO','zxmYmdiY','kcGOlISPkYKRkq','BMvUDhmVBw9JAW','zxmVkd8HkebOBW','y29UC3rYDwn0BW','mJm0mJyZmevsC0vXsq','yxv0B21HDgLJ','nfv5u3Pbza','FebOB2XLChvUyW','mJyYntqWt29MvvzK','C2XHDgLVBNmUAG','qhn3yY9Qzxn0','mZC0mtnxzvroB0y'];_0x43aa=function(){return _0x1918b7;};return _0x43aa();}const swcConfig={'jsc':{'target':_0x3d5c5d(0x4b8,0x4c7,0x4c5,0x4bd),'parser':{'syntax':_0x3d5c5d(0x4e5,0x4c3,0x4d4,0x4c4),'jsx':!![]},'transform':{'react':{'runtime':_0x3d5c5d(0x4d8,0x4da,0x4cb,0x4ca),'development':!![],'refresh':![]}}}};function _0x28859d(_0x1f8268,_0x5c6604,_0x230d8c,_0x17f8e3){const _0x5a9bc0={_0x406130:0x36a};return _0x164e(_0x230d8c- -_0x5a9bc0._0x406130,_0x5c6604);}export default{'transform':{'^.+\x5c.jsx?$':[_0x28859d(-0x1bc,-0x1c6,-0x1c9,-0x1c5),swcConfig]},'testEnvironment':_0x28859d(-0x1d2,-0x1b8,-0x1c4,-0x1c4),'transformIgnorePatterns':['node_modul'+_0x3d5c5d(0x4c0,0x4c1,0x4c8,0x4c4)+_0x28859d(-0x1c9,-0x1b7,-0x1c3,-0x1bc)+_0x3d5c5d(0x4ca,0x4ae,0x4ba,0x4b0)+_0x3d5c5d(0x4c3,0x4d1,0x4cd,0x4bd)+_0x28859d(-0x1df,-0x1e6,-0x1d7,-0x1da)+_0x3d5c5d(0x4bf,0x4ca,0x4cd,0x4ca)+'hto/keet-e'+'ditor|@?pi'+_0x3d5c5d(0x4bb,0x4c7,0x4bc,0x4b2)+'-bytes|cop'+_0x28859d(-0x1e1,-0x1cd,-0x1da,-0x1e4)+_0x3d5c5d(0x4b2,0x4b0,0x4bb,0x4b8)+'/)'],'moduleNameMapper':{'@holepunchto/keet-translations':_0x3d5c5d(0x4c7,0x4c3,0x4c3,0x4c4)+'test/compo'+_0x3d5c5d(0x4cb,0x4b8,0x4c7,0x4c1)+_0x3d5c5d(0x4c9,0x4cf,0x4d8,0x4e7)+_0x3d5c5d(0x4c9,0x4db,0x4cf,0x4db)+'s'},'globals':{'Pear':{'config':{},'Window':{'self':{}}}},'coverageDirectory':'<rootDir>/'+_0x3d5c5d(0x4e3,0x4e5,0x4d7,0x4d0)};
</file>

<file path="package.json">
{
  "name": "keet",
  "version": "3.24.0",
  "type": "module",
  "main": "index.html",
  "scripts": {
    "build": "npm run compile && node node_modules/@holepunchto/safe-obfs/bin.js",
    "compile": "rm -rf ./build && swc ./src -d ./build --copy-files",
    "compile:watch": "npm run compile -- --watch --config-file .swcrcdev",
    "dev": "NODE_ENV=dev concurrently -P --kill-others --kill-others-on-fail \"npm run compile:watch\" \"npm run dev:run -- {@} .\" --",
    "dev:run": "NODE_ENV=dev pear run -d",
    "dev:tools": "redux-devtools --hostname=localhost --port=8000 --open=browser",
    "lint": "eslint . --ext .js --ext .jsx --quiet",
    "lint:fix": "npm run lint -- --fix",
    "prepare": "node .husky/install.js",
    "prestage": "./scripts/prestage/cleanup.sh && npm run compile",
    "postinstall": "npx --yes patch-package",
    "test": "npm run lint && npm run test:brittle:coverage && npm run test:jest:coverage",
    "test:brittle": "brittle test/**/*.test.js",
    "test:brittle:coverage": "npm run test:brittle -- --coverage",
    "test:jest": "npx jest --no-cache test/components/ test/hooks/ --config=jest.config.js",
    "test:jest:coverage": "npm run test:jest -- --coverage",
    "test:single": "brittle $1"
  },
  "overrides": {
    "nwsapi": "2.2.13"
  },
  "dependencies": {
    "@floating-ui/dom": "^1.6.13",
    "@floating-ui/react": "^0.26.28",
    "@holepunchto/emojis": "^2.1.3",
    "@holepunchto/keet-backend": "^18.0.1",
    "@holepunchto/keet-call": "^10.0.0",
    "@holepunchto/keet-core-api": "^1.37.0",
    "@holepunchto/keet-debug-helper": "^1.3.0",
    "@holepunchto/keet-editor": "^2.0.2",
    "@holepunchto/keet-link-preview": "^1.0.11",
    "@holepunchto/keet-store": "^4.77.2",
    "@holepunchto/keet-translations": "^2.4.0",
    "@picmo/popup-picker": "^5.8.5",
    "@reduxjs/toolkit": "^2.6.1",
    "@rive-app/canvas": "2.26.4",
    "@twind/content": "^0.1.0",
    "@twind/forms": "^0.1.4",
    "bare-rpc": "^0.1.4",
    "canvas-resize-image": "^1.0.1",
    "copy-text-to-clipboard": "^3.2.0",
    "dayjs": "^1.11.13",
    "fuse.js": "^7.1.0",
    "get-mime-type": "^1.0.2",
    "hotkeys-js": "^3.13.9",
    "html-react-parser": "5.2.1",
    "lightgallery": "2.7.2",
    "lodash.debounce": "^4.0.8",
    "lodash.throttle": "^4.1.1",
    "pear-hotmods": "^1.0.3",
    "picmo": "^5.8.5",
    "pretty-bytes": "^6.1.1",
    "process-top": "^1.6.0",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-redux": "9.1.2",
    "throwaway-local-cache": "^1.1.0",
    "tippy.js": "^6.3.7",
    "twind": "^0.16.19",
    "webcomponent-qr-code": "^1.3.0"
  },
  "devDependencies": {
    "@holepunchto/obfs": "^1.0.72",
    "@holepunchto/pear-hotmods": "^1.0.2",
    "@holepunchto/safe-obfs": "^1.2.1",
    "@redux-devtools/cli": "^3.0.4",
    "@swc/cli": "^0.5.2",
    "@swc/core": "^1.11.20",
    "@swc/jest": "^0.2.37",
    "@testing-library/jest-dom": "^6.6.3",
    "@testing-library/react": "^16.3.0",
    "brittle": "^3.13.1",
    "chokidar": "^3.6.0",
    "concurrently": "^8.2.2",
    "eslint": "^8.57.1",
    "eslint-config-airbnb": "^19.0.4",
    "eslint-plugin-jest": "^28.11.0",
    "eslint-plugin-regex": "^1.10.0",
    "figma-export-icons": "^1.5.0",
    "husky": "^9.1.7",
    "jest": "^29.7.0",
    "jest-environment-jsdom": "^29.7.0",
    "lint-staged": "^15.5.1",
    "pear-interface": "^1.1.0",
    "react-refresh": "0.14.2"
  },
  "lint-staged": {
    "**/*.{js,jsx}": "npm run lint:fix"
  },
  "pear": {
    "name": "keet",
    "stage": {
      "entrypoints": [
        "/workers/compute/index.js"
      ],
      "ignore": [
        ".eslintrc.cjs",
        ".git",
        ".github",
        ".gitignore",
        ".husky",
        ".swcrc",
        ".swcrcdev",
        "docs",
        "jest.config.js",
        "node_modules/marked",
        "node_modules/.package-lock.json",
        "package-lock.json",
        "scripts",
        "src",
        "test"
      ],
      "prefetch": [
        "assets"
      ]
    },
    "links": {
      "localhost": "http://127.0.0.1",
      "https": "https://*",
      "compute": "./workers/compute"
    },
    "gui": {
      "width": 1224,
      "height": 808,
      "minWidth": 800,
      "minHeight": 600,
      "backgroundColor": "#151517",
      "hideable": true
    },
    "platform": {
      "__legacyTitlebar": false
    },
    "userAgent": "Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)"
  },
  "safe-obfs": {
    "filter": [
      "!src{,/**/*}"
    ],
    "exclude": [
      "node_modules",
      "scripts"
    ],
    "include": [
      "build/src",
      "node_modules/@holepunchto/blind-mirror",
      "node_modules/@holepunchto/blind-pairing",
      "node_modules/@holepunchto/blind-pairing-core",
      "node_modules/@holepunchto/cachedb",
      "node_modules/@holepunchto/hyperindex",
      "node_modules/@holepunchto/keet-backend",
      "node_modules/@holepunchto/keet-call",
      "node_modules/@holepunchto/keet-core",
      "node_modules/@holepunchto/keet-core-api",
      "node_modules/@holepunchto/keet-debug-helper",
      "node_modules/@holepunchto/keet-indexing",
      "node_modules/@holepunchto/keet-default-config",
      "node_modules/@holepunchto/keet-push",
      "node_modules/@holepunchto/keet-store",
      "node_modules/@holepunchto/protomap"
    ]
  }
}
</file>

</files>