diff --git a/.forgejo/workflows/dependency-builds.yml b/.forgejo/workflows/dependency-builds.yml
index dc1748f..c7fae8c 100644
--- a/.forgejo/workflows/dependency-builds.yml
+++ b/.forgejo/workflows/dependency-builds.yml
@@ -4,7 +4,6 @@ on:
pull_request:
env:
- NIX_CONFIG: experimental-features = nix-command flakes
FORGEJO_TOKEN: ""
GITHUB_TOKEN: ""
@@ -14,8 +13,7 @@ jobs:
name: Build & Lint
runs-on: nixos
steps:
- - run: nix profile add nixpkgs#nodejs_24
- - uses: https://data.forgejo.org/actions/checkout@v4
+ - uses: https://data.forgejo.org/actions/checkout@v7
with:
persist-credentials: false
- run: nix develop .#electron --command pnpm install --frozen-lockfile
diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml
index 982ef6f..8c162e9 100644
--- a/.forgejo/workflows/deploy.yaml
+++ b/.forgejo/workflows/deploy.yaml
@@ -14,7 +14,7 @@ jobs:
run: nix profile add nixpkgs#nodejs_24 nixpkgs#pnpm nixpkgs#rsync nixpkgs#jq nixpkgs#gnused
- name: Check out repo
- uses: https://data.forgejo.org/actions/checkout@v4
+ uses: https://data.forgejo.org/actions/checkout@v7
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/README.md b/README.md
index a67747e..70a4a7b 100644
--- a/README.md
+++ b/README.md
@@ -3,37 +3,3 @@
```sh
pnpm install https://git.methanium.net/methanium/ui/releases/download/latest/methanium-ui.tgz
```
-
-## Markdown
-
-The renderer is available from the package root. The live editor, compact text
-renderer, and emoji APIs use the `@methanium/ui/markdown` entry point.
-
-```tsx
-import { Markdown } from "@methanium/ui";
-import {
- EmojiProvider,
- Input,
- createEmojiRegistry,
-} from "@methanium/ui/markdown";
-
-const registry = createEmojiRegistry({
- customEmojis: [
- {
- shortcode: ":party_parrot:",
- aliases: [":parrot_party:"],
- src: "/emoji/party-parrot.webp",
- },
- ],
-});
-
-
-
-
-;
-```
-
-Custom shortcodes and aliases must be unique and may not collide with built-in
-Twemoji names. Twemoji graphics are bundled locally and do not use a CDN. The
-graphics are provided by the [Twemoji project](https://github.com/jdecked/twemoji)
-under CC-BY 4.0; code is licensed under MIT.
diff --git a/apps/showcase/index.html b/apps/showcase/index.html
index 0226942..e03a0c5 100644
--- a/apps/showcase/index.html
+++ b/apps/showcase/index.html
@@ -2,7 +2,10 @@
-
+
Methanium UI Showcase
diff --git a/apps/showcase/src/App.tsx b/apps/showcase/src/App.tsx
index f67cc0d..8657a88 100644
--- a/apps/showcase/src/App.tsx
+++ b/apps/showcase/src/App.tsx
@@ -17,6 +17,7 @@ import {
SelectValue,
Sidebar,
SidebarContent,
+ SidebarFooter,
SidebarGroup,
SidebarGroupContent,
SidebarInset,
@@ -205,6 +206,15 @@ export default function App() {
+
+
+ Privacy Policy
+
+
diff --git a/apps/showcase/src/MarkdownShowcase.tsx b/apps/showcase/src/MarkdownShowcase.tsx
index ded9d7a..ddf95a1 100644
--- a/apps/showcase/src/MarkdownShowcase.tsx
+++ b/apps/showcase/src/MarkdownShowcase.tsx
@@ -28,7 +28,7 @@ const markdownContent = [
"",
"Shortcodes use local Twemoji assets :fire: :white_check_mark:, while applications can register their own images :methanium:.",
"",
- "Visit the [Methanium repository](https://github.com/methanium) or jump to the [code examples](#code-examples). Bare URLs are supported too: https://example.com.",
+ "Visit the [Methanium](https://methanium.net) or jump to the [code examples](#code-examples). Bare URLs are supported too: https://example.com.",
"",
"",
"",
diff --git a/package.json b/package.json
index 2851cfd..1e336be 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@methanium/ui",
- "version": "0.0.23",
+ "version": "0.0.29",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -66,8 +66,8 @@
"emojibase-data": "^17.0.0",
"hast-util-to-jsx-runtime": "^2.3.6",
"input-otp": "^1.4.2",
- "katex": "^0.18.2",
- "lucide-react": "^1.30.0",
+ "katex": "^0.18.3",
+ "lucide-react": "^1.31.0",
"next-themes": "^0.4.6",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^4.12.2",
@@ -80,7 +80,7 @@
"remark-math": "^6.0.0",
"shadcn": "^4.16.2",
"shiki": "^4.4.2",
- "sonner": "^2.0.7",
+ "sonner": "^2.0.8",
"tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0",
"unist-util-visit": "^5.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a500ae3..25f06d9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -10,7 +10,7 @@ importers:
dependencies:
'@base-ui/react':
specifier: ^1.7.0
- version: 1.7.0(@date-fns/tz@1.5.0)(@types/react@19.2.18)(date-fns@4.4.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ version: 1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@codemirror/autocomplete':
specifier: ^6.20.3
version: 6.20.3
@@ -57,11 +57,11 @@ importers:
specifier: ^1.4.2
version: 1.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
katex:
- specifier: ^0.18.2
- version: 0.18.2
+ specifier: ^0.18.3
+ version: 0.18.3
lucide-react:
- specifier: ^1.30.0
- version: 1.30.0(react@19.2.8)
+ specifier: ^1.31.0
+ version: 1.31.0(react@19.2.8)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -79,7 +79,7 @@ importers:
version: 4.12.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
recharts:
specifier: 3.10.1
- version: 3.10.1(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react-is@19.2.7)(react@19.2.8)(redux@5.0.1)
+ version: 3.10.1(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react-is@19.2.8)(react@19.2.8)(redux@5.0.1)
rehype-autolink-headings:
specifier: ^7.1.0
version: 7.1.0
@@ -105,8 +105,8 @@ importers:
specifier: ^4.4.2
version: 4.4.2
sonner:
- specifier: ^2.0.7
- version: 2.0.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ specifier: ^2.0.8
+ version: 2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
tailwind-merge:
specifier: ^3.6.0
version: 3.6.0
@@ -146,7 +146,7 @@ importers:
version: 7.0.2
vite:
specifier: ^8.2.1
- version: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)
+ version: 8.2.1(@types/node@26.2.0)(jiti@2.7.0)
apps/showcase:
dependencies:
@@ -165,7 +165,7 @@ importers:
version: 10.0.1(eslint@10.8.1(jiti@2.7.0))
'@tailwindcss/vite':
specifier: ^4.3.3
- version: 4.3.3(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0))
+ version: 4.3.3(vite@8.2.1(@types/node@26.2.0)(jiti@2.7.0))
'@types/node':
specifier: ^26.2.0
version: 26.2.0
@@ -180,7 +180,7 @@ importers:
version: typescript@7.0.2
'@vitejs/plugin-react':
specifier: ^6.0.5
- version: 6.0.5(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0))
+ version: 6.0.5(vite@8.2.1(@types/node@26.2.0)(jiti@2.7.0))
eslint:
specifier: ^10.8.1
version: 10.8.1(jiti@2.7.0)
@@ -201,7 +201,7 @@ importers:
version: 8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0))
vite:
specifier: ^8.2.1
- version: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)
+ version: 8.2.1(@types/node@26.2.0)(jiti@2.7.0)
packages:
@@ -395,9 +395,6 @@ packages:
'@codemirror/view@6.43.8':
resolution: {integrity: sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==}
- '@date-fns/tz@1.5.0':
- resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==}
-
'@dotenvx/dotenvx@1.75.1':
resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==}
hasBin: true
@@ -405,162 +402,6 @@ packages:
'@dotenvx/primitives@0.8.0':
resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==}
- '@esbuild/aix-ppc64@0.28.1':
- resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [aix]
-
- '@esbuild/android-arm64@0.28.1':
- resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm@0.28.1':
- resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-x64@0.28.1':
- resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/darwin-arm64@0.28.1':
- resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.28.1':
- resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/freebsd-arm64@0.28.1':
- resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.28.1':
- resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/linux-arm64@0.28.1':
- resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm@0.28.1':
- resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-ia32@0.28.1':
- resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-loong64@0.28.1':
- resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==}
- engines: {node: '>=18'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.28.1':
- resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==}
- engines: {node: '>=18'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.28.1':
- resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.28.1':
- resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==}
- engines: {node: '>=18'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-s390x@0.28.1':
- resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==}
- engines: {node: '>=18'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-x64@0.28.1':
- resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/netbsd-arm64@0.28.1':
- resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
- '@esbuild/netbsd-x64@0.28.1':
- resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/openbsd-arm64@0.28.1':
- resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openbsd]
-
- '@esbuild/openbsd-x64@0.28.1':
- resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openharmony-arm64@0.28.1':
- resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openharmony]
-
- '@esbuild/sunos-x64@0.28.1':
- resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/win32-arm64@0.28.1':
- resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-ia32@0.28.1':
- resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-x64@0.28.1':
- resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [win32]
-
'@eslint-community/eslint-utils@4.10.1':
resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1756,9 +1597,6 @@ packages:
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
engines: {node: '>=12'}
- date-fns@4.4.0:
- resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==}
-
debounce-fn@4.0.0:
resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==}
engines: {node: '>=10'}
@@ -1851,8 +1689,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- electron-to-chromium@1.5.402:
- resolution: {integrity: sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==}
+ electron-to-chromium@1.5.403:
+ resolution: {integrity: sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==}
embla-carousel-react@8.6.0:
resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==}
@@ -1917,11 +1755,6 @@ packages:
es-toolkit@1.50.0:
resolution: {integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==}
- esbuild@0.28.1:
- resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
- engines: {node: '>=18'}
- hasBin: true
-
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
@@ -2444,8 +2277,8 @@ packages:
resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==}
hasBin: true
- katex@0.18.2:
- resolution: {integrity: sha512-3snve4y0SXTMequLim1FMiPvLGElySam0blN5xQZBqEY3lOJz1TnuaaiugnBZBqHzlSAGmFTYL7MCQkORuLKCA==}
+ katex@0.18.3:
+ resolution: {integrity: sha512-6kbPr8KiYZpRfNNIw+8Td33njnFzK/ELcw6bI9FzIHysYPatAUdepQimfCX1vG2VCD/5Lv+Gu6P5YA58k8HHmw==}
hasBin: true
keyv@4.5.4:
@@ -2632,8 +2465,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lucide-react@1.30.0:
- resolution: {integrity: sha512-tUIr2jXLbWpCkdtH8XP7P7YppM9ueWgTky99lpWDY6z5REs6B+O6ZQ3U5tHkUUY59ANyOv/PBcs8E4Fe3KO3eA==}
+ lucide-react@1.31.0:
+ resolution: {integrity: sha512-G8u2eEtoHUnUa9f8lbvqDhCiORMnYLdUEo06EEG9MQvHQrInKcX3Pa2TH39MM5qyzRcWETxB0+aOwAPI1g1kEg==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -3058,8 +2891,8 @@ packages:
peerDependencies:
react: ^19.2.8
- react-is@19.2.7:
- resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==}
+ react-is@19.2.8:
+ resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==}
react-markdown@10.1.0:
resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==}
@@ -3279,11 +3112,15 @@ packages:
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
- sonner@2.0.7:
- resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==}
+ sonner@2.0.8:
+ resolution: {integrity: sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==}
peerDependencies:
+ '@types/react': ^18.0.0 || ^19.0.0
react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
@@ -3826,7 +3663,7 @@ snapshots:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
- '@base-ui/react@1.7.0(@date-fns/tz@1.5.0)(@types/react@19.2.18)(date-fns@4.4.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ '@base-ui/react@1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@babel/runtime': 7.29.7
'@base-ui/utils': 0.3.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -3836,9 +3673,7 @@ snapshots:
react-dom: 19.2.8(react@19.2.8)
use-sync-external-store: 1.6.0(react@19.2.8)
optionalDependencies:
- '@date-fns/tz': 1.5.0
'@types/react': 19.2.18
- date-fns: 4.4.0
'@base-ui/utils@0.3.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
@@ -3931,9 +3766,6 @@ snapshots:
style-mod: 4.1.3
w3c-keyname: 2.2.8
- '@date-fns/tz@1.5.0':
- optional: true
-
'@dotenvx/dotenvx@1.75.1':
dependencies:
'@dotenvx/primitives': 0.8.0
@@ -3955,84 +3787,6 @@ snapshots:
'@dotenvx/primitives@0.8.0': {}
- '@esbuild/aix-ppc64@0.28.1':
- optional: true
-
- '@esbuild/android-arm64@0.28.1':
- optional: true
-
- '@esbuild/android-arm@0.28.1':
- optional: true
-
- '@esbuild/android-x64@0.28.1':
- optional: true
-
- '@esbuild/darwin-arm64@0.28.1':
- optional: true
-
- '@esbuild/darwin-x64@0.28.1':
- optional: true
-
- '@esbuild/freebsd-arm64@0.28.1':
- optional: true
-
- '@esbuild/freebsd-x64@0.28.1':
- optional: true
-
- '@esbuild/linux-arm64@0.28.1':
- optional: true
-
- '@esbuild/linux-arm@0.28.1':
- optional: true
-
- '@esbuild/linux-ia32@0.28.1':
- optional: true
-
- '@esbuild/linux-loong64@0.28.1':
- optional: true
-
- '@esbuild/linux-mips64el@0.28.1':
- optional: true
-
- '@esbuild/linux-ppc64@0.28.1':
- optional: true
-
- '@esbuild/linux-riscv64@0.28.1':
- optional: true
-
- '@esbuild/linux-s390x@0.28.1':
- optional: true
-
- '@esbuild/linux-x64@0.28.1':
- optional: true
-
- '@esbuild/netbsd-arm64@0.28.1':
- optional: true
-
- '@esbuild/netbsd-x64@0.28.1':
- optional: true
-
- '@esbuild/openbsd-arm64@0.28.1':
- optional: true
-
- '@esbuild/openbsd-x64@0.28.1':
- optional: true
-
- '@esbuild/openharmony-arm64@0.28.1':
- optional: true
-
- '@esbuild/sunos-x64@0.28.1':
- optional: true
-
- '@esbuild/win32-arm64@0.28.1':
- optional: true
-
- '@esbuild/win32-ia32@0.28.1':
- optional: true
-
- '@esbuild/win32-x64@0.28.1':
- optional: true
-
'@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0))':
dependencies:
eslint: 10.8.1(jiti@2.7.0)
@@ -4566,12 +4320,12 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
'@tailwindcss/oxide-win32-x64-msvc': 4.3.3
- '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0))':
+ '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@26.2.0)(jiti@2.7.0))':
dependencies:
'@tailwindcss/node': 4.3.3
'@tailwindcss/oxide': 4.3.3
tailwindcss: 4.3.3
- vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)
+ vite: 8.2.1(@types/node@26.2.0)(jiti@2.7.0)
'@tauri-apps/api@2.11.1': {}
@@ -4808,10 +4562,10 @@ snapshots:
'@ungap/structured-clone@1.3.3': {}
- '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0))':
+ '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@26.2.0)(jiti@2.7.0))':
dependencies:
'@rolldown/pluginutils': 1.0.1
- vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)
+ vite: 8.2.1(@types/node@26.2.0)(jiti@2.7.0)
accepts@2.0.0:
dependencies:
@@ -4896,7 +4650,7 @@ snapshots:
dependencies:
baseline-browser-mapping: 2.11.13
caniuse-lite: 1.0.30001809
- electron-to-chromium: 1.5.402
+ electron-to-chromium: 1.5.403
node-releases: 2.0.53
update-browserslist-db: 1.3.0(browserslist@4.28.8)
@@ -5055,9 +4809,6 @@ snapshots:
d3-timer@3.0.1: {}
- date-fns@4.4.0:
- optional: true
-
debounce-fn@4.0.0:
dependencies:
mimic-fn: 3.1.0
@@ -5119,7 +4870,7 @@ snapshots:
ee-first@1.1.1: {}
- electron-to-chromium@1.5.402: {}
+ electron-to-chromium@1.5.403: {}
embla-carousel-react@8.6.0(react@19.2.8):
dependencies:
@@ -5171,36 +4922,6 @@ snapshots:
es-toolkit@1.50.0: {}
- esbuild@0.28.1:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.28.1
- '@esbuild/android-arm': 0.28.1
- '@esbuild/android-arm64': 0.28.1
- '@esbuild/android-x64': 0.28.1
- '@esbuild/darwin-arm64': 0.28.1
- '@esbuild/darwin-x64': 0.28.1
- '@esbuild/freebsd-arm64': 0.28.1
- '@esbuild/freebsd-x64': 0.28.1
- '@esbuild/linux-arm': 0.28.1
- '@esbuild/linux-arm64': 0.28.1
- '@esbuild/linux-ia32': 0.28.1
- '@esbuild/linux-loong64': 0.28.1
- '@esbuild/linux-mips64el': 0.28.1
- '@esbuild/linux-ppc64': 0.28.1
- '@esbuild/linux-riscv64': 0.28.1
- '@esbuild/linux-s390x': 0.28.1
- '@esbuild/linux-x64': 0.28.1
- '@esbuild/netbsd-arm64': 0.28.1
- '@esbuild/netbsd-x64': 0.28.1
- '@esbuild/openbsd-arm64': 0.28.1
- '@esbuild/openbsd-x64': 0.28.1
- '@esbuild/openharmony-arm64': 0.28.1
- '@esbuild/sunos-x64': 0.28.1
- '@esbuild/win32-arm64': 0.28.1
- '@esbuild/win32-ia32': 0.28.1
- '@esbuild/win32-x64': 0.28.1
- optional: true
-
escalade@3.2.0: {}
escape-html@1.0.3: {}
@@ -5768,7 +5489,7 @@ snapshots:
dependencies:
commander: 8.3.0
- katex@0.18.2:
+ katex@0.18.3:
dependencies:
commander: 8.3.0
@@ -5905,7 +5626,7 @@ snapshots:
dependencies:
yallist: 3.1.1
- lucide-react@1.30.0(react@19.2.8):
+ lucide-react@1.31.0(react@19.2.8):
dependencies:
react: 19.2.8
@@ -6538,7 +6259,7 @@ snapshots:
react: 19.2.8
scheduler: 0.27.0
- react-is@19.2.7: {}
+ react-is@19.2.8: {}
react-markdown@10.1.0(@types/react@19.2.18)(react@19.2.8):
dependencies:
@@ -6609,7 +6330,7 @@ snapshots:
tiny-invariant: 1.3.3
tslib: 2.8.1
- recharts@3.10.1(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react-is@19.2.7)(react@19.2.8)(redux@5.0.1):
+ recharts@3.10.1(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react-is@19.2.8)(react@19.2.8)(redux@5.0.1):
dependencies:
'@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1))(react@19.2.8)
clsx: 2.1.1
@@ -6619,7 +6340,7 @@ snapshots:
immer: 11.1.16
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
- react-is: 19.2.7
+ react-is: 19.2.8
react-redux: 9.3.0(@types/react@19.2.18)(react@19.2.8)(redux@5.0.1)
reselect: 5.2.0
tiny-invariant: 1.3.3
@@ -6896,10 +6617,12 @@ snapshots:
sisteransi@1.0.5: {}
- sonner@2.0.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ sonner@2.0.8(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
dependencies:
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
+ optionalDependencies:
+ '@types/react': 19.2.18
source-map-js@1.2.1: {}
@@ -7171,7 +6894,7 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
- vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0):
+ vite@8.2.1(@types/node@26.2.0)(jiti@2.7.0):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.5
@@ -7180,7 +6903,6 @@ snapshots:
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 26.2.0
- esbuild: 0.28.1
fsevents: 2.3.3
jiti: 2.7.0
diff --git a/src/cmp/alert-dialog.tsx b/src/cmp/alert-dialog.tsx
index a0a9c26..848b7a9 100644
--- a/src/cmp/alert-dialog.tsx
+++ b/src/cmp/alert-dialog.tsx
@@ -52,7 +52,7 @@ function AlertDialogContent({
data-slot="alert-dialog-content"
data-size={size}
className={cn(
- "group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
+ "group/alert-dialog-content fixed top-[calc((100dvh+max(1rem,var(--ui-safe-area-top))-max(1rem,var(--ui-safe-area-bottom)))/2)] left-[calc((100%+max(1rem,var(--ui-safe-area-left))-max(1rem,var(--ui-safe-area-right)))/2)] z-50 grid w-[calc(100%-max(1rem,var(--ui-safe-area-left))-max(1rem,var(--ui-safe-area-right)))] max-h-[calc(100dvh-max(1rem,var(--ui-safe-area-top))-max(1rem,var(--ui-safe-area-bottom)))] -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
className,
)}
{...props}
diff --git a/src/cmp/combobox.tsx b/src/cmp/combobox.tsx
index dddb01f..755cc5d 100644
--- a/src/cmp/combobox.tsx
+++ b/src/cmp/combobox.tsx
@@ -2,6 +2,7 @@ import * as React from "react";
import { Combobox as ComboboxPrimitive } from "@base-ui/react";
import { cn } from "../lib/utils";
+import { useSafeAreaCollisionPadding } from "../hooks/use-safe-area";
import { Button } from "./button";
import {
InputGroup,
@@ -89,12 +90,20 @@ function ComboboxContent({
align = "start",
alignOffset = 0,
anchor,
+ collisionPadding,
...props
}: ComboboxPrimitive.Popup.Props &
Pick<
ComboboxPrimitive.Positioner.Props,
- "side" | "align" | "sideOffset" | "alignOffset" | "anchor"
+ | "side"
+ | "align"
+ | "sideOffset"
+ | "alignOffset"
+ | "anchor"
+ | "collisionPadding"
>) {
+ const safeAreaCollisionPadding = useSafeAreaCollisionPadding();
+
return (
) {
+ const safeAreaCollisionPadding = useSafeAreaCollisionPadding();
+
return (
) {
+ const safeAreaCollisionPadding = useSafeAreaCollisionPadding();
+
return (
;
@@ -20,12 +21,15 @@ function HoverCardContent({
sideOffset = 4,
align = "center",
alignOffset = 4,
+ collisionPadding,
...props
}: PreviewCardPrimitive.Popup.Props &
Pick<
PreviewCardPrimitive.Positioner.Props,
- "align" | "alignOffset" | "side" | "sideOffset"
+ "align" | "alignOffset" | "side" | "sideOffset" | "collisionPadding"
>) {
+ const safeAreaCollisionPadding = useSafeAreaCollisionPadding();
+
return (
-