diff --git a/.changeset/true-peas-attack.md b/.changeset/true-peas-attack.md
new file mode 100644
index 0000000..9b8f508
--- /dev/null
+++ b/.changeset/true-peas-attack.md
@@ -0,0 +1,6 @@
+---
+'@lglab/react-qr-code': patch
+'reactqrcode.com': patch
+---
+
+chore(deps)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index f4311ca..761fa7c 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -10,3 +10,27 @@ updates:
target-branch: 'next'
schedule:
interval: 'daily'
+ groups:
+ react:
+ patterns:
+ - 'react*'
+ typescript:
+ patterns:
+ - '@types*'
+ - 'ts*'
+ - 'typescript*'
+ eslint:
+ patterns:
+ - 'eslint*'
+ - '@eslint*'
+ radix:
+ patterns:
+ - '@radix-ui*'
+ vite|vitest:
+ patterns:
+ - 'vite*'
+ - '@vite*'
+ tailwind:
+ patterns:
+ - 'tailwind*'
+ - '@tailwind*'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 70829d9..a3cb65d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,6 +7,11 @@ on:
concurrency: ${{ github.workflow }}-${{ github.ref }}
+permissions:
+ id-token: write
+ contents: write
+ pull-requests: write
+
jobs:
release:
name: Release
@@ -40,5 +45,3 @@ jobs:
publish: pnpm ci:publish --no-git-checks
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/apps/docs/eslint.config.mjs b/apps/docs/eslint.config.mjs
index 0238baa..57d84e3 100644
--- a/apps/docs/eslint.config.mjs
+++ b/apps/docs/eslint.config.mjs
@@ -1,23 +1,24 @@
-import { FlatCompat } from '@eslint/eslintrc'
-import { dirname } from 'path'
-import { fileURLToPath } from 'url'
+import { defineConfig, globalIgnores } from 'eslint/config';
+import nextVitals from 'eslint-config-next/core-web-vitals';
+import nextTs from 'eslint-config-next/typescript';
-const __filename = fileURLToPath(import.meta.url)
-const __dirname = dirname(__filename)
-
-const compat = new FlatCompat({
- baseDirectory: __dirname,
-})
-
-const eslintConfig = [
- ...compat.extends('next/core-web-vitals', 'next/typescript'),
+const eslintConfig = defineConfig([
+ ...nextVitals,
+ ...nextTs,
+ // Override default ignores of eslint-config-next.
+ globalIgnores([
+ // Default ignores of eslint-config-next:
+ '.next/**',
+ 'out/**',
+ 'build/**',
+ 'next-env.d.ts',
+ ]),
{
rules: {
'@typescript-eslint/consistent-type-imports': 'error',
'no-console': 'error',
},
- ignores: ['.next/*'],
},
-]
+]);
-export default eslintConfig
+export default eslintConfig;
diff --git a/apps/docs/next-env.d.ts b/apps/docs/next-env.d.ts
index 1b3be08..a3e4680 100644
--- a/apps/docs/next-env.d.ts
+++ b/apps/docs/next-env.d.ts
@@ -1,5 +1,6 @@
///
///
+import './.next/dev/types/routes.d.ts'
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/apps/docs/package.json b/apps/docs/package.json
index a743179..898d3c0 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -10,67 +10,66 @@
"lint": "next lint"
},
"dependencies": {
- "@hookform/resolvers": "^4.1.3",
+ "@hookform/resolvers": "^5.2.2",
"@lglab/react-qr-code": "workspace:*",
- "@radix-ui/react-accordion": "^1.2.7",
- "@radix-ui/react-alert-dialog": "^1.1.10",
- "@radix-ui/react-aspect-ratio": "^1.1.4",
- "@radix-ui/react-avatar": "^1.1.6",
- "@radix-ui/react-checkbox": "^1.1.5",
- "@radix-ui/react-collapsible": "^1.1.4",
- "@radix-ui/react-context-menu": "^2.2.10",
- "@radix-ui/react-dialog": "^1.1.10",
- "@radix-ui/react-dropdown-menu": "^2.1.7",
- "@radix-ui/react-hover-card": "^1.1.10",
- "@radix-ui/react-label": "^2.1.3",
- "@radix-ui/react-menubar": "^1.1.7",
- "@radix-ui/react-navigation-menu": "^1.2.9",
- "@radix-ui/react-popover": "^1.1.10",
- "@radix-ui/react-progress": "^1.1.4",
- "@radix-ui/react-radio-group": "^1.3.2",
- "@radix-ui/react-scroll-area": "^1.2.5",
- "@radix-ui/react-select": "^2.2.2",
- "@radix-ui/react-separator": "^1.1.3",
- "@radix-ui/react-slider": "^1.3.2",
- "@radix-ui/react-slot": "^1.2.0",
- "@radix-ui/react-switch": "^1.2.2",
- "@radix-ui/react-tabs": "^1.1.7",
- "@radix-ui/react-toast": "^1.2.7",
- "@radix-ui/react-toggle": "^1.1.3",
- "@radix-ui/react-toggle-group": "^1.1.6",
- "@radix-ui/react-tooltip": "^1.2.0",
- "@uiw/react-color": "^2.5.0",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-alert-dialog": "^1.1.15",
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-checkbox": "^1.3.3",
+ "@radix-ui/react-collapsible": "^1.1.12",
+ "@radix-ui/react-context-menu": "^2.2.16",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-hover-card": "^1.1.15",
+ "@radix-ui/react-label": "^2.1.8",
+ "@radix-ui/react-menubar": "^1.1.16",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
+ "@radix-ui/react-popover": "^1.1.15",
+ "@radix-ui/react-progress": "^1.1.8",
+ "@radix-ui/react-radio-group": "^1.3.8",
+ "@radix-ui/react-scroll-area": "^1.2.10",
+ "@radix-ui/react-select": "^2.2.6",
+ "@radix-ui/react-separator": "^1.1.8",
+ "@radix-ui/react-slider": "^1.3.6",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@radix-ui/react-switch": "^1.2.6",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@radix-ui/react-toast": "^1.2.15",
+ "@radix-ui/react-toggle": "^1.1.10",
+ "@radix-ui/react-toggle-group": "^1.1.11",
+ "@radix-ui/react-tooltip": "^1.2.8",
+ "@uiw/react-color": "^2.9.2",
"@vercel/analytics": "^1.5.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "1.1.1",
"date-fns": "^4.1.0",
"embla-carousel-react": "^8.6.0",
+ "eslint-config-next": "16.0.1",
"input-otp": "^1.4.2",
- "lucide-react": "^0.488.0",
- "next": "15.4.7",
+ "lucide-react": "^0.553.0",
+ "next": "16.0.1",
"next-themes": "^0.4.6",
"prism-react-renderer": "^2.4.1",
- "react": "^19.1.0",
- "react-dom": "^19.1.0",
- "react-hook-form": "^7.55.0",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-hook-form": "^7.66.0",
"react-icons": "^5.5.0",
- "react-resizable-panels": "^2.1.7",
- "recharts": "^2.15.3",
- "sonner": "^2.0.3",
- "tailwind-merge": "^3.2.0",
+ "react-resizable-panels": "^3.0.6",
+ "sonner": "^2.0.7",
+ "tailwind-merge": "^3.3.1",
"tailwindcss-animate": "^1.0.7",
- "vaul": "^1.1.2",
- "zod": "^3.24.3"
+ "vaul": "^1.1.2"
},
"devDependencies": {
- "@tailwindcss/postcss": "^4.1.4",
- "@trivago/prettier-plugin-sort-imports": "^5.2.2",
- "@types/node": "^22.14.1",
- "@types/react": "^19.1.2",
- "@types/react-dom": "^19.1.2",
- "postcss": "^8.5.3",
- "tailwindcss": "^4.1.4",
- "typescript": "^5.8.3"
+ "@tailwindcss/postcss": "^4.1.17",
+ "@trivago/prettier-plugin-sort-imports": "^6.0.0",
+ "@types/node": "^24.10.0",
+ "@types/react": "^19.2.2",
+ "@types/react-dom": "^19.2.2",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.1.17",
+ "typescript": "^5.9.3"
}
}
diff --git a/apps/docs/src/components/ui/chart.tsx b/apps/docs/src/components/ui/chart.tsx
deleted file mode 100644
index a1ecac9..0000000
--- a/apps/docs/src/components/ui/chart.tsx
+++ /dev/null
@@ -1,342 +0,0 @@
-'use client'
-
-import * as React from 'react'
-import * as RechartsPrimitive from 'recharts'
-
-import { cn } from '@/lib/utils'
-
-// Format: { THEME_NAME: CSS_SELECTOR }
-const THEMES = { light: '', dark: '.dark' } as const
-
-export type ChartConfig = {
- [k in string]: {
- label?: React.ReactNode
- icon?: React.ComponentType
- } & (
- | { color?: string; theme?: never }
- | { color?: never; theme: Record }
- )
-}
-
-type ChartContextProps = {
- config: ChartConfig
-}
-
-const ChartContext = React.createContext(null)
-
-function useChart() {
- const context = React.useContext(ChartContext)
-
- if (!context) {
- throw new Error('useChart must be used within a ')
- }
-
- return context
-}
-
-const ChartContainer = React.forwardRef<
- HTMLDivElement,
- React.ComponentProps<'div'> & {
- config: ChartConfig
- children: React.ComponentProps<
- typeof RechartsPrimitive.ResponsiveContainer
- >['children']
- }
->(({ id, className, children, config, ...props }, ref) => {
- const uniqueId = React.useId()
- const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`
-
- return (
-
-
-
-
- {children}
-
-
-
- )
-})
-ChartContainer.displayName = 'Chart'
-
-const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
- const colorConfig = Object.entries(config).filter(
- ([, config]) => config.theme || config.color,
- )
-
- if (!colorConfig.length) {
- return null
- }
-
- return (
-