<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>··• Misha is typing</title><author><name>··• Misha is typing</name></author><id>https://teletype.in/atom/og_mishgun</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/og_mishgun?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@og_mishgun?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=og_mishgun"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/og_mishgun?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-19T03:35:06.397Z</updated><entry><id>og_mishgun:connect-wallet-2023</id><link rel="alternate" type="text/html" href="https://teletype.in/@og_mishgun/connect-wallet-2023?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=og_mishgun"></link><title>3 способа подключить кошелёк в 2023</title><published>2023-05-18T19:38:47.850Z</published><updated>2023-05-18T20:28:02.161Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/2b/60/2b606947-d299-4a21-8e22-dd7cf831c595.png"></media:thumbnail><category term="frontend" label="Фронтенд"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/a8/f0/a8f0d894-3977-4ec2-be31-8bc4e3cd13d7.png&quot;&gt;Привет! В этой статье я расскажу о трёх библиотеках для подключения EVM-кошелька в web3-приложение.</summary><content type="html">
  &lt;p id=&quot;yX7X&quot;&gt;Привет! В этой статье я расскажу о трёх библиотеках для подключения EVM-кошелька в web3-приложение.&lt;/p&gt;
  &lt;p id=&quot;qaZc&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;EIUs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a8/f0/a8f0d894-3977-4ec2-be31-8bc4e3cd13d7.png&quot; width=&quot;2062&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;jqIt&quot;&gt;&lt;a href=&quot;https://web3modal.com/&quot; target=&quot;_blank&quot;&gt;Web3Modal&lt;/a&gt;&lt;/h2&gt;
  &lt;p id=&quot;re1c&quot;&gt;Это библиотека от WalletConnect, поэтому здесь всегда будет отличная поддержка свежих версий WC. &lt;a href=&quot;https://docs.walletconnect.com/2.0/web3modal/theming&quot; target=&quot;_blank&quot;&gt;Кастомизируется через CSS-переменные&lt;/a&gt;, хотя кастомизация не очень глубокая. У них нет интеграции с Sign In With Ethereum, но зато есть своё облачное решение для аутентификации — &lt;a href=&quot;https://docs.walletconnect.com/2.0/api/auth&quot; target=&quot;_blank&quot;&gt;WalletConnect Auth&lt;/a&gt;. Если вас не беспокоит вендор лок, то выглядит это удобнее чем SIWE.&lt;/p&gt;
  &lt;h3 id=&quot;P5L6&quot;&gt;Пример кода&lt;/h3&gt;
  &lt;pre id=&quot;jMFN&quot; data-lang=&quot;javascript&quot;&gt;import { EthereumClient, w3mConnectors, w3mProvider } from &amp;#x27;@web3modal/ethereum&amp;#x27;
import { Web3Modal, Web3Button } from &amp;#x27;@web3modal/react&amp;#x27;
import { configureChains, createConfig, WagmiConfig } from &amp;#x27;wagmi&amp;#x27;
import { arbitrum, mainnet, polygon } from &amp;#x27;wagmi/chains&amp;#x27;

const chains = [arbitrum, mainnet, polygon]
const projectId = &amp;#x27;YOUR_PROJECT_ID&amp;#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 (
    &amp;lt;&amp;gt;
      &amp;lt;WagmiConfig config={wagmiConfig}&amp;gt;
        &amp;lt;HomePage /&amp;gt;
      &amp;lt;/WagmiConfig&amp;gt;

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

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

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

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

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

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

const alchemyId = process.env.ALCHEMY_ID;

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

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

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

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

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

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

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

</content></entry><entry><id>og_mishgun:the-right-hover</id><link rel="alternate" type="text/html" href="https://teletype.in/@og_mishgun/the-right-hover?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=og_mishgun"></link><title>Правильный :hover</title><published>2022-08-27T19:01:00.233Z</published><updated>2022-08-27T19:08:37.973Z</updated><category term="frontend" label="Фронтенд"></category><summary type="html">Если вы стилизуете ховер через CSS, то у меня для вас новости.</summary><content type="html">
  &lt;p id=&quot;5GOp&quot;&gt;Если вы стилизуете ховер через CSS, то у меня для вас новости.&lt;/p&gt;
  &lt;p id=&quot;CTsy&quot;&gt;&lt;strong&gt;НА ТАЧСКРИНАХ НЕТ ХОВЕРА&lt;/strong&gt;!&lt;/p&gt;
  &lt;p id=&quot;QzKf&quot;&gt;Почему? Да потому что ховер это состояние элемента, над которым занесли поинтер (курсор мыши). Очевидно, что смартфон не знает, над каким элементом висит палец пользователя.&lt;/p&gt;
  &lt;p id=&quot;Kmne&quot;&gt;Я не знаю, где была логика разработчиков мобильных браузеров, но почему-то они решили включать стили ховера &lt;em&gt;при нажатии на элемент&lt;/em&gt;. Проблема в том, что нажатие на элемент на тачскрине приводит к зависанию стилей в состоянии ховера. Как это выглядит: пользователь делает тап по кнопке, а она начинает гореть так, будто на неё навели курсор. И это состояние сохраняется до следующего тапа или скролла.&lt;/p&gt;
  &lt;p id=&quot;E0ZJ&quot;&gt;В современном вебе таких гадостей быть не должно, а интерактивные элементы должны вести себя также, как и в нативных приложениях.&lt;/p&gt;
  &lt;h2 id=&quot;6yP7&quot;&gt;Что делать?&lt;/h2&gt;
  &lt;p id=&quot;BNed&quot;&gt;В CSS есть специальная фича — &lt;a href=&quot;https://caniuse.com/css-media-interaction&quot; target=&quot;_blank&quot;&gt;Interaction media features&lt;/a&gt;. Это медиа-запрос, который определяет может ли пользователь наводиться на элементы и использует ли он точный (мышь или стилус) или неточный (палец) поинтер. Пример:&lt;/p&gt;
  &lt;pre id=&quot;60ZS&quot; data-lang=&quot;css&quot;&gt;/* 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) { /* ... */ }&lt;/pre&gt;
  &lt;p id=&quot;ukt0&quot;&gt;Если у вас SCSS, то напишите пожалуйста себе миксин.&lt;/p&gt;
  &lt;p id=&quot;RfCY&quot;&gt;А вот пользователям Tailwind 3+ ничего писать не надо: там коробки есть фича-флаг, который делает всё по красоте:&lt;/p&gt;
  &lt;pre id=&quot;JQpL&quot; data-lang=&quot;javascript&quot;&gt;// tailwind.config.js
module.exports = {
  future: {
    hoverOnlyWhenSupported: true,
  },
  // ...
}&lt;/pre&gt;
  &lt;p id=&quot;2efe&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;JOqc&quot; data-align=&quot;center&quot;&gt;***&lt;/h2&gt;
  &lt;p id=&quot;DECP&quot;&gt;Понравилась статья? Подпишитесь на мой &lt;a href=&quot;https://t.me/og_mishgun&quot; target=&quot;_blank&quot;&gt;канал&lt;/a&gt;, там я пишу про фронтенд, крипту и лайфстайл.&lt;/p&gt;

</content></entry></feed>