commit b5f2518eebeda1efe0d216c2c3cd5b4f78daf576 Author: clfreville2 Date: Thu Feb 8 08:28:22 2024 +0100 Initial commit diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..fc3f00e --- /dev/null +++ b/.drone.yml @@ -0,0 +1,10 @@ +kind: pipeline +name: default +type: docker + +steps: + - name: build + image: node:20-alpine + commands: + - yarn install + - yarn build diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..b5e28f6 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,23 @@ +module.exports = { + env: { + browser: true, + }, + root: true, + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + '@vue/typescript/recommended', + ], + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser', + sourceType: 'module' + }, + plugins: ['vue', '@typescript-eslint'], + rules: { + '@typescript-eslint/no-explicit-any': 'warn', + 'vue/html-self-closing': 'off', + 'vue/max-attributes-per-line': 'off' + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d239ce5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# 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/* +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Locks +package-lock.json +yarn.lock +pnpm-lock.yaml +bun.lockb diff --git a/README.md b/README.md new file mode 100644 index 0000000..29f7655 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Pixture diff --git a/index.html b/index.html new file mode 100644 index 0000000..28f8e4b --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + Pixture + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..cb60c30 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "pixture", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview", + "lint": "eslint \"src/**/*.vue\" \"src/**/*.ts\"" + }, + "dependencies": { + "vue": "^3.3.11" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@vitejs/plugin-vue": "^5.0.3", + "@vue/eslint-config-typescript": "^12.0.0", + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.21.1", + "typescript": "^5.2.2", + "vite": "^5.0.8", + "vue-tsc": "^1.8.25" + } +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..e336ede --- /dev/null +++ b/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/components/ImageEditor.vue b/src/components/ImageEditor.vue new file mode 100644 index 0000000..4634a43 --- /dev/null +++ b/src/components/ImageEditor.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..2425c0f --- /dev/null +++ b/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/src/processing/gray-scale.ts b/src/processing/gray-scale.ts new file mode 100644 index 0000000..c2ff4a9 --- /dev/null +++ b/src/processing/gray-scale.ts @@ -0,0 +1,9 @@ +export function grayScale(pixels: Uint8ClampedArray): void { + for (let i = 0; i < pixels.length; i += 4) { + // https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems + const lightness = (pixels[i] * .299 + pixels[i + 1] * .587 + pixels[i + 2] * .114) | 0; + pixels[i] = lightness; + pixels[i + 1] = lightness; + pixels[i + 2] = lightness; + } +} diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..bb131d6 --- /dev/null +++ b/src/style.css @@ -0,0 +1,79 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} 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/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9e03e60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..05c1740 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], +})