npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dilmurod3037729/liquidglass-web

v0.4.1

Published

Physically based liquid glass (refraction, dispersion, fluid merging, depth) for the web, WebGL2

Readme

liquidglass-web

qattiq oyna suv rejimi

Fizikaga asoslangan "suyuq shisha" (WebGL2), bog'liqliksiz ES modul. Ikki rejim:

  • glass (asosiy): toza qattiq oyna. Markazi tiniq, sinish faqat ingichka chetda. Snell sinishi, dispersiya, Fresnel, to'liq ichki qaytish, yutilish, soya/kaustika, shakllarning suyuqdek qo'shilishi va fokusga qarab chuqurlik (orqadagi oynani oldingi shisha sindiradi).
  • water (ixtiyoriy): zarrachali erkin suv. Yopishadi, siqilmaydi, oynada og'ir sirpanadi.

O'rnatish (npm)

npm install @dilmurod3037729/liquidglass-web
import { createLiquidGlass } from '@dilmurod3037729/liquidglass-web';

Tez ulash (CDN, o'rnatishsiz)

import { createLiquidGlass } from 'https://cdn.jsdelivr.net/gh/dilmurod3037729-max/liquidglass@main/web/src/index.js';

Tez boshlash

node scripts/serve.mjs      # http://localhost:5173/demo/        (qattiq oyna, jonli sozlash paneli bilan)
                            # http://localhost:5173/demo/water.html   (suv)
import { createLiquidGlass } from './src/index.js';

const glass = createLiquidGlass(canvas, { mode: 'glass', source: sceneCanvas });   // canvas | img | video | ImageBitmap
glass.add({ w: 220, h: 58, radius: 29 }, { x: 300, y: 200 }, labelElement);
glass.add({ w: 150, h: 52, radius: 26, draggable: false }, { x: 500, y: 600 });   // qo'zg'almas panel/tugma

Sozlash (qattiq oyna)

Hamma narsa glass.params orqali jonli o'zgaradi. Har sozlama GLASS_SCHEMA dagi oraliqqa qirqiladi.

| Sozlama | Nima qiladi | Standart | |---|---|---| | ior | sinish ko'rsatkichi (katta = kuchliroq egilish) | 1.55 | | thick | shisha qalinligi (siljish kuchi) | 40 | | bevel | chet kengligi, px. Jism yarmidan oshmaydi, markaz doim tiniq | 26 | | disp | dispersiya: chetdagi rang ajralishi | 0.04 | | blur | sochilish (xiralik) | 0.35 | | merge | yaqin shakllar qo'shilish radiusi, px | 48 | | elastic | suyuq cho'zilish. 0 = qattiq oyna, kattaroq = og'irroq tomchi | 0 | | spec | yaltirash | 1.1 | | absorb | yutilish (qalin joyda to'qroq tus) | 0.5 |

glass.params.bevel = 18;
glass.params.elastic = 1;   // qattiq oyna o'rniga suyuq cho'zilishni yoqish

Jonli panel: demo/index.html. Panel GLASS_SCHEMA dan avtomatik quriladi, o'zingizning UI'ingiz uchun ham shu sxemani ishlating.

Qanday ishlaydi

  • Shisha sahna teksturasini sindiradi (source). Shuning uchun shisha ostidagi tugma va matn ham egiladi.
  • Shakllar bitta umumiy maydonga smin bilan qo'shiladi: yaqinlashganda tomchidek ulanadi.
  • Ikki o'tish: orqadagi shakllar FBO'ga, oldingi shisha uni sindiradi. Oxirgi bosilgan shakl oldinga chiqadi.
  • Kadr faqat biror narsa qimirlaganda chiziladi (tinch holatda GPU ishlamaydi). Jonli video uchun { live: true }.

Erkin suv (zarrachali suyuqlik)

Tomchi suyaksiz: ko'p mayda zarrachadan iborat suv. Yopishadi (sirt tarangligi), siqilmaydi (to'xtaganda shishadi), oynada og'ir sirpanadi. Shisha shu zarrachalar hosil qilgan yuzani sindiradi. Tomchilar bir-biriga tegsa o'zi qo'shiladi.

const water = createLiquidGlass(canvas, { mode: 'water', source: sceneCanvas, preset: 'water' });   // 'water' | 'honey' | 'mercury'
water.add({ w: 220, h: 58, radius: 29 }, { x: 300, y: 200 }, labelElement);
water.add({ w: 150, h: 52, radius: 26, draggable: false, anchored: true }, { x: 500, y: 600 }, btnLabel);   // joyida turadigan tugma

water.fluid.set({ viscosity: 50, cohesion: 3000 });   // jonli sozlash
water.fluid.preset('honey');
water.glass.thick = 90;                               // shisha ko'rinishi

| Sozlama | Nima qiladi | |---|---| | stiffness | zarrachalar qanchalik siqilmaydi (katta = qattiq) | | cohesion | yopishish / sirt tarangligi (katta = sharga yig'ilishga moyil) | | viscosity | qovushqoqlik: tomchi ichidagi tezlik farqi so'nishi | | glassFriction | oyna ishqalanishi: katta = og'ir va sust | | shapeMemory | qo'yib yuborilganda UI shakliga (kapsula, to'rtburchak) qaytish kuchi | | grabForce, grabSize, grabBody | ushlab tortish kuchi, ushlanadigan joy hajmi, butun tanaga tortish ulushi | | spacing | zarracha masofasi (px): kichik = aniqroq, lekin og'irroq | | maxSpeed | zarracha tezligi chegarasi |

Har sozlama ruxsat etilgan oraliqda (PARAM_SCHEMA); undan chiqqan qiymat avtomatik qirqiladi, shuning uchun simulyatsiya portlamaydi. mercury presetida shapeMemory past: tomchilar sharga aylanadi (UI shakli saqlanmaydi), bu ataylab.

Mavjud ilovaga ulash (ilova kodiga tegmasdan)

Shisha sahifadagi HAQIQIY tugmalarni materialga almashtira oladi: elementlar topiladi, asl ko'rinishi yashiriladi (opacity: 0, bosiladigan qoladi), o'rniga shisha va yozuv nusxasi qo'yiladi. Yozuv rangi shisha ostidagi fon yorug'ligiga moslashadi.

Electron (main jarayonda, oyna yaratilgandan keyin):

const { enable } = require('@dilmurod3037729/liquidglass-web/electron');
enable(mainWindow, { selector: 'button, .btn', params: { bevel: 20 } });

Sahifa surati main jarayonda webContents.capturePage() bilan olinadi (WebGL DOM'ni o'qiy olmaydi). Sahifa o'zgarsa (bo'lim almashdi, ro'yxat yangilandi) surat va shisha ~0.2 s ichida qayta quriladi. Oldin npm run build (dist/liquidglass.js yig'iladi).

Brauzer / boshqa muhit: o'zingiz sahifa suratini beradigan funksiya bering (masalan html2canvas):

import { attach } from './src/index.js';
attach({ selector: 'button, .btn', snapshot: async () => await html2canvas(document.body) });

Tugma ustiga kursor kelganda shisha biroz kattalashadi (hover), bosilganda ko'proq. Sahifa surilganda shisha asl elementlarga zudlik bilan ergashadi, surilish tugagach surat qayta olinadi.

Sozlamalar: selector, exclude, maxShapes (standart 128, eng ko'pi 256), minSize, params (glass.params), labelContrast. Native (HTML'siz) oynalarda ishlamaydi. Cheklov: bir vaqtda 256 tagacha element (standart 128); sahifa surati har o'zgarishda qayta olinadi (~100 ms).

Cheklovlar (halol)

  • DOM'ni sindirmaydi. WebGL sahifadagi oddiy HTML'ni o'qiy olmaydi. Sindiriladigan narsa source ga (canvas/rasm/video) berilishi kerak. Shisha ustidagi yozuv (labelElement) esa oddiy HTML.
  • glass rejimida eng ko'pi bilan 256 ta shakl (ma'lumot teksturasida), yumaloq burchakli to'rtburchaklar. Yaqin shakllar qo'shilishi uchun params.merge ni kamaytiring.
  • Suv rejimida hozircha oldingi/orqadagi oyna qatlami yo'q.
  • Shisha butun ekran canvas'i orqali chiziladi (hozircha fixed, ekran o'lchamida).

Yagona manba va testlar

src/shader.js avtomatik hosil qilinadi: core/shaders/liquidglass.frag -> npm run sync-shader. src/scene.js C++ yadroning (core/src/scene.cpp) nusxasi; npm test ikkalasi bir xil natija berishini tekshiradi (oltin test) va suv simulyatsiyasining barqarorligini (eng chekka sozlamalarda ham).

Litsenziya

MIT, LICENSE fayliga qarang.

Unumdorlik (o'lchov)

node tests/bench.mjs haqiqiy GPU'da (headless Chrome, D3D11) kartani 8 soniya sudraydi va nvidia-smi bilan yuklamani o'lchaydi. Bir namuna (RTX 2080 SUPER, 1400x800, glass rejimi): sudrash paytida GPU o'rtacha ~19-22%, eng yuqorisi 35-37%; tinch holatda sahifa 0 ta kadr chizadi. Tinch holatdagi GPU foizi brauzer/kompozitor va boshqa ilovalarni ham o'z ichiga oladi, shuning uchun asosiy ko'rsatkich "tinch 5 soniyada chizilgan kadrlar soni". Raqamlar qurilmaga bog'liq, o'z kompyuteringizda ishga tushirib ko'ring.

Shakllar soniga qarab kadr vaqti

node tests/bench-shapes.mjs har kadrni readPixels bilan GPU tugaguncha kutib o'lchaydi (RTX 2080 SUPER, 1400x800, dpr 1, qo'zg'almas shakllar):

| Shakllar | 5 | 50 | 128 | 256 | |---|---|---|---|---| | Kadr vaqti | ~1.9 ms | ~3.0 ms | ~3.5 ms | ~2.6 ms |

Ekran 32 pikselli bo'laklarga bo'linadi va har bo'lak uchun faqat unga yaqin shakllar ro'yxati beriladi (R32F tekstura), shuning uchun shakllar soni ko'paysa ham narx deyarli o'smaydi (bo'laklarsiz 256 shaklda ~16 ms edi). Orqada shisha bo'lmasa (ilova adapteri) orqa o'tish butunlay o'tkazib yuboriladi. Kadr faqat o'zgarganda chiziladi.