From a756a40572581c6becd9e526d7eb0e8f2a5c932d Mon Sep 17 00:00:00 2001 From: ilya Date: Sat, 22 Jun 2024 20:48:39 +0300 Subject: [PATCH] AAAA --- .eslintrc.cjs | 18 ++ .gitignore | 24 ++ .prettierrc.yml | 2 + README.md | 30 +++ bun.lockb | Bin 0 -> 113231 bytes components.json | 17 ++ index.html | 13 + package.json | 40 ++++ postcss.config.js | 6 + public/vite.svg | 1 + src/App.css | 3 + src/App.tsx | 87 +++++++ src/assets/doska.svg | 444 +++++++++++++++++++++++++++++++++++ src/components/ui/badge.tsx | 36 +++ src/components/ui/button.tsx | 56 +++++ src/components/ui/card.tsx | 79 +++++++ src/components/ui/input.tsx | 25 ++ src/components/ui/label.tsx | 24 ++ src/index.css | 76 ++++++ src/lib/utils.ts | 6 + src/main.tsx | 10 + src/vite-env.d.ts | 1 + tailwind.config.ts | 80 +++++++ tsconfig.app.json | 27 +++ tsconfig.json | 19 ++ tsconfig.node.json | 13 + vite.config.ts | 15 ++ 27 files changed, 1152 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .prettierrc.yml create mode 100644 README.md create mode 100644 bun.lockb create mode 100644 components.json create mode 100644 index.html create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/vite.svg create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/doska.svg create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/index.css create mode 100644 src/lib/utils.ts create mode 100644 src/main.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..b0ae380 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,2 @@ +semi: false +singleQuote: true \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d6babe --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..29ff9f8f0fd6e49330840c617c7c84a7ac8b8ee9 GIT binary patch literal 113231 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 aKn072GD3Ax; + + + + + + 1000 руб за мои страдания + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..90f2928 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "name": "darts", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "bunx --bun vite", + "build": "tsc -b && bunx --bun vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "bunx --bun vite preview" + }, + "dependencies": { + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-slot": "^1.1.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "immer": "^10.1.1", + "lucide-react": "^0.396.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "zustand": "^4.5.2" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.4", + "typescript": "^5.2.2", + "vite": "^5.3.1" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..7fb9343 --- /dev/null +++ b/src/App.css @@ -0,0 +1,3 @@ +html, body, #root { + @apply h-full w-full; +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..3057eb2 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,87 @@ +import { create } from 'zustand' +import './App.css' +import { produce } from 'immer' +import doska from './assets/doska.svg' +import { useState } from 'react' +import { Button } from './components/ui/button' +import { Input } from './components/ui/input' +import { Label } from './components/ui/label' + +interface Player { + points: number + throws: number +} + +interface Game { + players: Player[] + currentPlayerIdx: number + round: number + + started: boolean + startedAt: number + + start(nplayers: number): void +} + +const useGame = create((set) => ({ + players: [], + currentPlayerIdx: -1, + round: 0, + started: false, + startedAt: -1, + start(nplayers) { + set(state => produce(state, state => { + state.players = Array.from({ length: nplayers }, () => ({ + points: 0, + throws: 0 + })) + state.currentPlayerIdx = 0 + })) + } +})) + +export default function App() { + const [startedAt, started, round] = useGame(game => [game.startedAt, game.started, game.round]) + + return ( +
+ {/* Верхняя часть: доска */} +
+
+
+ +

{started ? `#${round}` : "Игра не начата"}

+

{started ? new Date(Date.now() - startedAt).toLocaleTimeString() : ""}

+
+ + +
+ {/* Нижняя часть: управление игрой */} + +
+ ) +} + +function Board() { + const [points, setPoints] = useState(0) + + return ( + {}} /> + ) +} + +function Control() { + const [started, round, start, players] = useGame(game => [game.started, game.round, game.start, game.players]) + const [nplayers, setNplayers] = useState(2) + + return ( +
+ + setNplayers(parseInt(ev.target.value))} type="number" value={nplayers} disabled={started} /> + + +
+ ) +} \ No newline at end of file diff --git a/src/assets/doska.svg b/src/assets/doska.svg new file mode 100644 index 0000000..54738fd --- /dev/null +++ b/src/assets/doska.svg @@ -0,0 +1,444 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + 1 + 18 + 4 + 13 + 6 + 10 + 15 + 2 + 17 + 3 + 19 + 7 + 16 + 8 + 11 + 14 + 9 + 12 + 5 + + + + \ No newline at end of file diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..f000e3e --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..0ba4277 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx new file mode 100644 index 0000000..afa13ec --- /dev/null +++ b/src/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..677d05f --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx new file mode 100644 index 0000000..683faa7 --- /dev/null +++ b/src/components/ui/label.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b0e6fff --- /dev/null +++ b/src/index.css @@ -0,0 +1,76 @@ +@tailwind base; + @tailwind components; + @tailwind utilities; + + @layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + } + + @layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } + } \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..d084cca --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..84287e8 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,80 @@ +import type { Config } from "tailwindcss" + +const config = { + darkMode: ["class"], + content: [ + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} satisfies Config + +export default config \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..d739292 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..22f9bf1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "files": [], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + }, + }, + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..3afdd6e --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..017b72d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' +// @ts-ignore +import path from 'path' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + // @ts-ignore + "@": path.resolve(__dirname, "./src"), + }, + }, +})