<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>··• Misha is typing</title><generator>teletype.in</generator><description><![CDATA[··• Misha is typing]]></description><image><url>https://img4.teletype.in/files/b1/f8/b1f8aa97-8ebb-462c-ad1e-c0ecfe44f39b.png</url><title>··• Misha is typing</title><link>https://teletype.in/@og_mishgun</link></image><link>https://teletype.in/@og_mishgun?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/og_mishgun?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/og_mishgun?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 19 Jun 2026 03:35:48 GMT</pubDate><lastBuildDate>Fri, 19 Jun 2026 03:35:48 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@og_mishgun/connect-wallet-2023</guid><link>https://teletype.in/@og_mishgun/connect-wallet-2023?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun</link><comments>https://teletype.in/@og_mishgun/connect-wallet-2023?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun#comments</comments><dc:creator>og_mishgun</dc:creator><title>3 способа подключить кошелёк в 2023</title><pubDate>Thu, 18 May 2023 19:38:47 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2b/60/2b606947-d299-4a21-8e22-dd7cf831c595.png"></media:content><category>Фронтенд</category><description><![CDATA[<img src="https://img3.teletype.in/files/a8/f0/a8f0d894-3977-4ec2-be31-8bc4e3cd13d7.png"></img>Привет! В этой статье я расскажу о трёх библиотеках для подключения EVM-кошелька в web3-приложение.]]></description><content:encoded><![CDATA[
  <p id="yX7X">Привет! В этой статье я расскажу о трёх библиотеках для подключения EVM-кошелька в web3-приложение.</p>
  <p id="qaZc"></p>
  <figure id="EIUs" class="m_column">
    <img src="https://img3.teletype.in/files/a8/f0/a8f0d894-3977-4ec2-be31-8bc4e3cd13d7.png" width="2062" />
  </figure>
  <h2 id="jqIt"><a href="https://web3modal.com/" target="_blank">Web3Modal</a></h2>
  <p id="re1c">Это библиотека от WalletConnect, поэтому здесь всегда будет отличная поддержка свежих версий WC. <a href="https://docs.walletconnect.com/2.0/web3modal/theming" target="_blank">Кастомизируется через CSS-переменные</a>, хотя кастомизация не очень глубокая. У них нет интеграции с Sign In With Ethereum, но зато есть своё облачное решение для аутентификации — <a href="https://docs.walletconnect.com/2.0/api/auth" target="_blank">WalletConnect Auth</a>. Если вас не беспокоит вендор лок, то выглядит это удобнее чем SIWE.</p>
  <h3 id="P5L6">Пример кода</h3>
  <pre id="jMFN" data-lang="javascript">import { EthereumClient, w3mConnectors, w3mProvider } from &#x27;@web3modal/ethereum&#x27;
import { Web3Modal, Web3Button } from &#x27;@web3modal/react&#x27;
import { configureChains, createConfig, WagmiConfig } from &#x27;wagmi&#x27;
import { arbitrum, mainnet, polygon } from &#x27;wagmi/chains&#x27;

const chains = [arbitrum, mainnet, polygon]
const projectId = &#x27;YOUR_PROJECT_ID&#x27;

const { publicClient } = configureChains(chains, [w3mProvider({ projectId })])
const wagmiConfig = createConfig({
  autoConnect: true,
  connectors: w3mConnectors({ projectId, version: 1, chains }),
  publicClient
})
const ethereumClient = new EthereumClient(wagmiConfig, chains)

function App() {
  return (
    &lt;&gt;
      &lt;WagmiConfig config={wagmiConfig}&gt;
        &lt;HomePage /&gt;
      &lt;/WagmiConfig&gt;

      &lt;Web3Modal projectId={projectId} ethereumClient={ethereumClient} /&gt;
      
      &lt;Web3Button /&gt;
    &lt;/&gt;
  )
}</pre>
  <p id="IcU8">Кстати, Web3Modal поддерживает не только Реакт, в отличие от аналогов.</p>
  <p id="ON4K"></p>
  <hr />
  <figure id="543D" class="m_column">
    <img src="https://img2.teletype.in/files/93/24/93249e90-eafd-485c-b434-3274681cc3af.png" width="2240" />
  </figure>
  <h2 id="72JE"><a href="https://www.rainbowkit.com/" target="_blank">RainbowKit</a></h2>
  <p id="9QOW">Библиотека от создателей кошелька Rainbow, интерфейс подключения кошелька сделан в том же стиле. Самый главный минус это, пожалуй, очень скудная кастомизация, в которой даже нельзя задать начертание для шрифта. Есть интеграция с Sign In With Ethereum. </p>
  <h3 id="Z0Ce">Пример кода</h3>
  <pre id="kTs9" data-lang="javascript">import &#x27;@rainbow-me/rainbowkit/styles.css&#x27;;

import {
  getDefaultWallets,
  RainbowKitProvider,
} from &#x27;@rainbow-me/rainbowkit&#x27;;
import { configureChains, createConfig, WagmiConfig } from &#x27;wagmi&#x27;;
import { mainnet, polygon, optimism, arbitrum } from &#x27;wagmi/chains&#x27;;
import { alchemyProvider } from &#x27;wagmi/providers/alchemy&#x27;;
import { publicProvider } from &#x27;wagmi/providers/public&#x27;;

const { chains, publicClient } = configureChains(
  [mainnet, polygon, optimism, arbitrum],
  [
    alchemyProvider({ apiKey: process.env.ALCHEMY_ID }),
    publicProvider()
  ]
);

const { connectors } = getDefaultWallets({
  appName: &#x27;My RainbowKit App&#x27;,
  projectId: &#x27;YOUR_PROJECT_ID&#x27;,
  chains
});

const wagmiConfig = createConfig({
  autoConnect: true,
  connectors,
  publicClient
})

const App = () =&gt; {
  return (
    &lt;WagmiConfig config={wagmiConfig}&gt;
      &lt;RainbowKitProvider chains={chains}&gt;
        /* Your App */
        &lt;ConnectButton /&gt;
      &lt;/RainbowKitProvider&gt;
    &lt;/WagmiConfig&gt;
  );
};</pre>
  <p id="zgHg">Кстати, в RainbowKit есть <a href="https://www.rainbowkit.com/docs/recent-transactions" target="_blank">поддержка отображения статуса транзакций</a>, которые нужно добавлять вручную.</p>
  <p id="Ea9x"></p>
  <hr />
  <figure id="2vMv" class="m_column">
    <img src="https://img4.teletype.in/files/b0/73/b0734343-902f-4eb3-bbf2-27293d296dd1.png" width="1526" />
  </figure>
  <h2 id="2IFl"><a href="https://docs.family.co/connectkit" target="_blank">ConnectKit</a></h2>
  <p id="MW6R">Моя любимая библиотека: минималистичный интерфейс, приятные анимации, чем-то напоминает Телеграм. Глубоко кастомизируется, можно даже аватарку подгрузить произвольную. Тоже есть интеграция с Sign In With Ethereum.</p>
  <p id="Bqgi">В отличие от первых двух библиотек, тут есть <a href="https://docs.family.co/connectkit/translations#translations" target="_blank">поддержка нескольких языков</a>. Пока что есть только небольшое количество, среди которых японский, он самый стильный кстати.</p>
  <h3 id="ktrT">Пример кода</h3>
  <pre id="ftMK" data-lang="javascript">import { WagmiConfig, createClient } from &quot;wagmi&quot;;
import { ConnectKitProvider, ConnectKitButton, getDefaultClient } from &quot;connectkit&quot;;

const alchemyId = process.env.ALCHEMY_ID;

const client = createClient(
  getDefaultClient({
    appName: &quot;Your App Name&quot;,
    alchemyId,
  }),
);

const App = () =&gt; {
  return (
    &lt;WagmiConfig client={client}&gt;
      &lt;ConnectKitProvider&gt;
        /* Your App */
        &lt;ConnectKitButton /&gt;
      &lt;/ConnectKitProvider&gt;
    &lt;/WagmiConfig&gt;
  );
};</pre>
  <p id="3IFR">Удобно, что в документации ConntectKit есть <a href="https://docs.family.co/connectkit/going-live#going-live-checklist" target="_blank">чеклист</a> того, что нужно проверить перед деплоем в продакшн.</p>
  <p id="LTuV"></p>
  <hr />
  <figure id="uJGj" class="m_column">
    <img src="https://user-images.githubusercontent.com/55061526/185308497-3d70e503-d4c8-4b9f-a5fd-9bf9083c4793.png" width="1200" />
  </figure>
  <h2 id="QttD"><a href="https://github.com/viaprotocol/web3-wallets" target="_blank">Бонус: @viaprotocol/web3-wallets</a></h2>
  <p id="oor0">Библиотека от команды via.exchange. Не уверен, что она ещё активно поддерживается, но если вам нужно подключать не только EVM-кошельки, то можно обратить внимание на то, как это сделано здесь. Библиотека может работать с кошельками для Solana, Tron, Bitcoin. Полный список сетей можно посмотреть в файле <a href="https://github.com/viaprotocol/web3-wallets/blob/main/src/networks.ts" target="_blank">networks.ts</a>.</p>
  <h3 id="pum9">Пример кода</h3>
  <pre id="pIWF" data-lang="javascript">import { useContext } from &#x27;react&#x27;
import { WalletContext, WalletProvider } from &#x27;@viaprotocol/web3-wallets&#x27;

function App() {
  return (
    &lt;WalletProvider&gt;
      &lt;NestedComponent /&gt;
    &lt;/WalletProvider&gt;
  )
}

function NestedComponent() {
  const { connect, isConnected, address } = useContext(WalletContext)

  if (!isConnected) {
    return (
      // Select MetaMask and connect to ETH Mainnet
      &lt;button
        type=&quot;button&quot;
        onClick={() =&gt; connect({ name: &#x27;MetaMask&#x27;, chainId: 1 })}
      &gt;Connect wallet&lt;/button&gt;
    )
  }

  return (
    &lt;p&gt;{address}&lt;/p&gt;
  )
}</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@og_mishgun/native-ux-for-web</guid><link>https://teletype.in/@og_mishgun/native-ux-for-web?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun</link><comments>https://teletype.in/@og_mishgun/native-ux-for-web?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun#comments</comments><dc:creator>og_mishgun</dc:creator><title>5 способов сделать мобильный фронтенд похожим на нативное приложение</title><pubDate>Sat, 27 Aug 2022 19:03:00 GMT</pubDate><category>Фронтенд</category><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:438/1*zDJyeq4CJqqVqDHM4q1ivA.gif"></img>Когда я делаю PWA, гибридное приложение или даже просто мобильную вёрстку, я хочу, чтобы интерфейс ощущался как нативное приложение. В вебе сложно достичь нативной плавности, это правда. Но даже быстрые и красивые веб-приложения легко отличить от нативных из-за специфичного для браузера UX.]]></description><content:encoded><![CDATA[
  <p id="BAKr">Когда я делаю PWA, гибридное приложение или даже просто мобильную вёрстку, я хочу, чтобы интерфейс ощущался как нативное приложение. В вебе сложно достичь нативной плавности, это правда. Но даже быстрые и красивые веб-приложения легко отличить от нативных из-за специфичного для браузера UX.</p>
  <p id="VhvL">В этой статье я покажу несколько трюков, которые могут даже опытных пользователей заставить сомневаться в том, что перед ними не нативный интерфейс. Эти трюки я использовал в мобильной версии <a href="https://timestripe.com/" target="_blank">Timestripe</a>, примеры в статье будут оттуда.</p>
  <h2 id="U4lK">Добавляем манифест</h2>
  <figure id="iF3R" class="m_original">
    <img src="https://miro.medium.com/v2/resize:fit:438/1*zDJyeq4CJqqVqDHM4q1ivA.gif" width="219" />
  </figure>
  <p id="pI3e">Web App Manifest — часть технологии Progressive Web Application (PWA).</p>
  <blockquote id="hJns">PWA это веб-приложение, которые можно установить на устройство и запускать без интерфейса браузера в собственном окне. Хорошее PWA это классно. Мгновенная установка, доступ к нативным API, offline-first и так далее.</blockquote>
  <p id="rh6X">Чтобы сделать из сайта топовое offline-first PWA, нужно потратить не один спринт. Но для начала можно просто добавить в папку со статикой <code>manifest.json</code>, тогда при добавлении приложения на рабочий стол оно будет запускать отдельно от браузера! Далее можете докрутить остальные PWA-приколы, про это <a href="https://web.dev/progressive-web-apps/" target="_blank">читайте здесь</a>.</p>
  <p id="Qe3t"><a href="https://developer.mozilla.org/en-US/docs/Web/Manifest" target="_blank">Подробнее о манифестах веб-приложений на MDN</a>.</p>
  <p id="aooI"><a href="https://timestripe.com/static/v2/manifest.webmanifest.json" target="_blank">А здесь</a> можно посмотреть на крохотный манифест Таймстрайпа.</p>
  <h2 id="LAdv">Ставим прозрачный -webkit-tap-highlight-color</h2>
  <figure id="cIcp" class="m_original">
    <img src="https://miro.medium.com/v2/resize:fit:1200/1*GDUcq1Vz8rp-OMZZ-6Z2cw.gif" width="600" />
  </figure>
  <p id="Mtu2">Свойство -webkit-tap-highlight-color определяет цвет полупрозрачных прямоугольников, которые появляются над интерактивными элементами UI во время нажатия.</p>
  <p id="RwKS">Эта штука нужна на всякий случай, чтобы пользователю было понятно, что взаимодействие с интерфейсом произошло. Поэтому если у ваших UI-элементов нет проблем с визуальным фидбэком, можете смело сделать эти хайлайты прозрачными:</p>
  <pre id="GLDA" data-lang="css">body {
  -webkit-tap-highlight-color: transparent;
}</pre>
  <h2 id="MsxS">Фиксим стили ховеров</h2>
  <figure id="sHWo" class="m_original">
    <img src="https://miro.medium.com/v2/resize:fit:1200/1*9YkXfRldxMO0uGbGEbeY2w.gif" width="600" />
    <figcaption>Обратите внимание на кнопку &quot;Goal options&quot;</figcaption>
  </figure>
  <p id="ESho">На тачскринах нет ховера! Не знали? Про это писал здесь, почитайте: <a href="https://teletype.in/@og_mishgun/editor/the-right-hover" target="_blank">https://teletype.in/@og_mishgun/editor/the-right-hover</a></p>
  <h2 id="zCe4">Выключаем pinch-to-zoom</h2>
  <figure id="i8pN" class="m_original">
    <img src="https://miro.medium.com/v2/resize:fit:438/1*et30Ne_Kqcq68RIrF8flkw.gif" width="219" />
  </figure>
  <p id="TWsF">Потому что нативные приложения не зумятся!</p>
  <p id="cYAU">Ставим <code>user-scalable: 0</code> в <code>meta viewport</code>. Пример из тэга <code>head</code> Таймстрайпа:</p>
  <pre id="DW8G" data-lang="html"> &lt;meta
   name=&quot;viewport&quot;
   content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0&quot;
 /&gt;</pre>
  <h2 id="fyAE">Убираем оверскролл в Сафари</h2>
  <figure id="Wu8h" class="m_original">
    <img src="https://miro.medium.com/v2/resize:fit:438/1*8bmSfMejoCkCqFsvhJNCfg.gif" />
  </figure>
  <p id="fFmm">Под оверскроллом я подразумеваю визуальный эффект эластичности прокрутки. Сам по себе он не является чем-то плохим, но опытный пользователь при виде него почувствует запах веба.</p>
  <p id="maIb">На эту тему есть <a href="https://www.bram.us/2016/05/02/prevent-overscroll-bounce-in-ios-mobilesafari-pure-css/" target="_blank">хорошая статья</a>.</p>
  <h2 id="BWRZ">Бонус: <s>react-easy-swipe</s> use-gesture</h2>
  <figure id="MKea" class="m_original">
    <img src="https://miro.medium.com/v2/resize:fit:1200/1*p4vMYS81V36AusnFOlaRMw.gif" width="600" />
  </figure>
  <p id="uuo6"><s>Для Реакт-приложений есть супер-инструмент — <a href="https://github.com/leandrowd/react-easy-swipe" target="_blank">библиотека react-easy-swipe</a>. С помощью неё можно добавить в любой компонент поддержку свайпов.</s></p>
  <p id="4lLF"><s>В Таймстрайпе она используется для сайдбара, экранов с горизонтальными свайпами и каруселей.</s></p>
  <p id="Wb7q">Update: недавно появилась <a href="https://use-gesture.netlify.app/" target="_blank">библиотека use-gesture</a>, мне удалось попробовать её на одном из проектов и хочу сказать что она гораздо удобнее и функциональнее react-easy-swipe. В документации есть красивые примеры, в том числе с использованием <a href="https://github.com/pmndrs/react-spring" target="_blank">react-spring</a>. Пока что эти две либы дали мне лучший DX в сложных интерфейсных анимациях. </p>
  <h2 id="llLD">Ещё по теме</h2>
  <ul id="qB05">
    <li id="jZDh"><a href="https://web.dev/app-like-pwas/" target="_blank">Make your PWA feel more like an app, Thomas Stainer</a></li>
    <li id="9it3"><a href="https://spicefactory.co/blog/2019/10/18/native-like-pwas/" target="_blank">Building Native-like Experiences on the Web with PWAs, Miloš Žikić</a></li>
    <li id="sCZH"><a href="https://medium.com/swlh/how-you-can-develop-progressive-web-apps-that-feel-native-5110fbbcbf4b" target="_blank">How you can develop Progressive Web Apps that feel like native mobile apps, Samuele Dassatti</a></li>
  </ul>
  <h2 id="VDLt" data-align="center">***</h2>
  <p id="3aHU">Понравилась статья? Подпишитесь на мой <a href="https://t.me/og_mishgun" target="_blank">канал</a>, там я пишу про фронтенд, крипту и лайфстайл.</p>
  <p id="lDlG">А ещё подпишитесь на <a href="https://instagram.com/timestripe.pro" target="_blank">Таймстрайп в Инстаграме</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@og_mishgun/the-right-hover</guid><link>https://teletype.in/@og_mishgun/the-right-hover?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun</link><comments>https://teletype.in/@og_mishgun/the-right-hover?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=og_mishgun#comments</comments><dc:creator>og_mishgun</dc:creator><title>Правильный :hover</title><pubDate>Sat, 27 Aug 2022 19:01:00 GMT</pubDate><category>Фронтенд</category><description><![CDATA[Если вы стилизуете ховер через CSS, то у меня для вас новости.]]></description><content:encoded><![CDATA[
  <p id="5GOp">Если вы стилизуете ховер через CSS, то у меня для вас новости.</p>
  <p id="CTsy"><strong>НА ТАЧСКРИНАХ НЕТ ХОВЕРА</strong>!</p>
  <p id="QzKf">Почему? Да потому что ховер это состояние элемента, над которым занесли поинтер (курсор мыши). Очевидно, что смартфон не знает, над каким элементом висит палец пользователя.</p>
  <p id="Kmne">Я не знаю, где была логика разработчиков мобильных браузеров, но почему-то они решили включать стили ховера <em>при нажатии на элемент</em>. Проблема в том, что нажатие на элемент на тачскрине приводит к зависанию стилей в состоянии ховера. Как это выглядит: пользователь делает тап по кнопке, а она начинает гореть так, будто на неё навели курсор. И это состояние сохраняется до следующего тапа или скролла.</p>
  <p id="E0ZJ">В современном вебе таких гадостей быть не должно, а интерактивные элементы должны вести себя также, как и в нативных приложениях.</p>
  <h2 id="6yP7">Что делать?</h2>
  <p id="BNed">В CSS есть специальная фича — <a href="https://caniuse.com/css-media-interaction" target="_blank">Interaction media features</a>. Это медиа-запрос, который определяет может ли пользователь наводиться на элементы и использует ли он точный (мышь или стилус) или неточный (палец) поинтер. Пример:</p>
  <pre id="60ZS" data-lang="css">/* smartphones, touchscreens */
@media (hover: none) and (pointer: coarse) { /* ... */ }

/* stylus-based screens */
@media (hover: none) and (pointer: fine) { /* ... */ }

/* Nintendo Wii controller, Microsoft Kinect */
@media (hover: hover) and (pointer: coarse) { /* ... */ }

/* mouse, touch pad */
@media (hover: hover) and (pointer: fine) { /* ... */ }</pre>
  <p id="ukt0">Если у вас SCSS, то напишите пожалуйста себе миксин.</p>
  <p id="RfCY">А вот пользователям Tailwind 3+ ничего писать не надо: там коробки есть фича-флаг, который делает всё по красоте:</p>
  <pre id="JQpL" data-lang="javascript">// tailwind.config.js
module.exports = {
  future: {
    hoverOnlyWhenSupported: true,
  },
  // ...
}</pre>
  <p id="2efe"></p>
  <h2 id="JOqc" data-align="center">***</h2>
  <p id="DECP">Понравилась статья? Подпишитесь на мой <a href="https://t.me/og_mishgun" target="_blank">канал</a>, там я пишу про фронтенд, крипту и лайфстайл.</p>

]]></content:encoded></item></channel></rss>